Shaos wrote:
Или линейно усредняя по RGB составляющим:

Что выглядит терпимее:

Однако 736 пикселов в ширину при таком подходе не влезает (что есть максимум в моих "запредельных" режимах) - только 720 (усреднённые в 480 экранных пикселов), что наверное не так уж и страшно...
Вот примерился прям на девайсике
SpiritRetroHandheld-prototype.jpg
Алгоритм превращения 720 16-цветных пикселов по горизонтали в 480 256-цветных (пока реализовано софтово) - берём каждые 3 пиксела (P1,P2,P3) и превращаем их в 2 примешивая средний пиксел половинчато:
NEW1 = (P1 + 0.5*P2)/1.5
NEW2 = (0.5*P2 + P3)/1.5
Тут конечно же речь идёт об усреднении каждой цветовой составляющей:
NEWCOLOR1 = (COLOR1 + COLOR1 + COLOR2)/3 (для каждой цветовой составляющей R,G и B)
NEWCOLOR2 = (COLOR2 + COLOR3 + COLOR3)/3 (для каждой цветовой составляющей R,G и B)
И это можно сделать вообще без деления воспользовашись фиксированной точкой (сдвинутой влево на 8 бит):
NEWCOLOR1 = (((COLOR1 + COLOR1 + COLOR2)<<8)*85)>>16
NEWCOLOR2 = (((COLOR2 + COLOR3 + COLOR3)<<8)*85)>>16
Тут 85 это 0.333 в формате фиксированной точки 16.8
Но делать эти расчёты надо не над каждый пикселом, а в самом начале один раз и над палитрой

Берём первоначальную 16-цветную палитру и создаём из неё новую 256-цветную, примешивая цвета по вышестоящей формуле - для каждой пары этих 16 цветов беря первый с весом 2 и второй с весом 1 - далее при выводе изображения в такой палитре с сужением в 1.5 раза надо просто вместо трёх пикселов с номерами цветов C1,C2,C3 из старой 16-цветной палитры нарисовать 2 пиксела их новой большой палитры получив номера таким образом:
NEWCOLOR1 = (C1<<8)|C2
NEWCOLOR2 = (C3<<8)|C2
Вобщем как-то так и оно как видно даже работает
P.S. Вот как это на телеке по HDMI выглядит:
SpiritRetroHandheld-prototype-HDMI.jpg
P.P.S. Заодно пофиксил багу в родной прошивке бейджа, из-за которой строчки пикселов из фреймбуфера выводились через DMA не все, а как будто только нечётные и дважды...
You do not have the required permissions to view the files attached to this post.