Rev 805 | Blame | Compare with Previous | Last modification | View Log | Download
универсальная палитра (atmuni16.act до замены на телесные, skin16.act после, soft16.act с мягкими цветами вместо чистых+3,2,2 вместо M):R,G,Bосновные цвета, чтобы можно было сконвертить всё (можно оставить только 0RGBW + 3 телесных цвета? hue c,m,y будут только с помощью засветок):0,0,00,0,3 B (1,1,2 мягче)3,0,0 R (2,1,1 мягче)3,0,3 M (2,1,2 мягче) (3,2,1 для 34n1) - заменить на телесный 3,2,1? (для мягких 3,2,2)0,3,0 G (1,2,1 мягче)0,3,3 C (1,2,2 мягче) - заменить на телесный 3,2,2?3,3,0 Y (2,2,1 мягче) - заменить на телесный 2,1,1?3,3,3серые:2,2,21,1,1 (new)коррекция теней:0,0,1 (new)0,1,0 (new)1,0,0 (new)коррекция засветок:3,3,2 (new)3,2,3 (new)2,3,3 (new)палитру см. в scratch/kulerкак конвертировать в неё?нужна таблица RGB->colorindex и таблица colorindex->RGB (по ней будет делаться floyd-steinberg)а как делать diamond? надо как-то находить RGB->4xcolorindex, а потом между этими 4 цветами текстуритьа как делать hires? надо как-то находить 4 лучших цвета для каждой зоны и чередовать их через строчку? будут проблемы с зонами, где есть чёрный и яркие цвета, надо будет иметь 2 чёрныхкакой формат хранения картинки в DOM? 24bit жирно! 16bit? или 8bit без диферинга с универсальной палитройкакая универсальная палитра 256?а) RRRGGGBB?б) YYYYYUUVV?в) разбить по насыщенностям (на ATM видно 3), на ATM видно 18/12/6 оттенков (сделаем 36, но как округлять и до 18, и до 12?), 7 яркостей (включая 0,W)saturation2 (на ATM 18 hue): 36 hue * 5 volume (реально видно 5)saturation1 (на ATM 6 hue): 12 hue * 5 volume (реально видно 1)saturation0 (на ATM 1 hue): 1 hue * 5 volume (реально видно 2)0W=247 梥⮢проблема с округлением hue при отображении в ATM без диферингачтобы иметь точки точных цветов и при этом уметь округлять одни и те же hue до 18 и до 12, надо иметь нечётные группы, но они не могут иметь соотношение 2:3! реальнее 3:4.5:храним 54 hueкак округлять до 18 hue:0!,1),(2,3!,4),(5,6!,7),(8,9!,10),...как округлять до 12 hue:0!,1,2),(3,4(,)5,6),(7,8,9!,10,11),...чтобы округлять одни и те же hue до 12 и до 6, надо соотношение 1:2, реальнее 3:6храним 36 hueкак округлять до 12 hue:0!,1),(2,3!,4),(5,6!,7),(8,9!,10),...как округлять до 6 hue:0!,1,2),(3,4,5,6!,7,8),(9,10,11,...храним 18 hueкак округлять до 12 hue:0!),(1,2),(3!),(4,5),(6!),(7,8),(9!),(10,...г) разбить по насыщенностям и яркостям (большие и малые яркости имеют меньше hue), volume 0 и 6 отдельнонасыщенностей особо много не надо? добавить только ещё одну малонасыщенную? но как её отображать без диферинга? как нулевую (переход в серый обычно не страшен) или как соседнюю? или лучше 2 малонасыщенных/*saturation4, volume5 (на ATM 6 hue): 36 huesaturation4, volume4 (на ATM 12 hue): 54 huesaturation4, volume3 (на ATM 18 hue): 54 huesaturation4, volume2 (на ATM 12 hue): 54 huesaturation4, volume1 (на ATM 6 hue): 36 hue^^^^^^^^^ это уже 234!saturation3, volume5 (на ATM 6 hue): 6 huesaturation3, volume4 (на ATM 6 hue): 6 huesaturation3, volume3 (на ATM 6 hue): 6 huesaturation3, volume2 (на ATM 6 hue): 6 huesaturation3, volume1 (на ATM 6 hue): 6 huesaturation2, volume5 (на ATM ? hue): 6 huesaturation2, volume4 (на ATM ? hue): 6 huesaturation2, volume3 (на ATM ? hue): 6 huesaturation2, volume2 (на ATM ? hue): 6 huesaturation2, volume1 (на ATM ? hue): 6 huesaturation1, volume5 (на ATM ? hue): 6 huesaturation1, volume4!(на ATM ? hue): 6 huesaturation1, volume3 (на ATM ? hue): 6 huesaturation1, volume2!(на ATM ? hue): 6 huesaturation1, volume1 (на ATM ? hue): 6 hue^^^^^^^^^^ это ещё 108!saturation0, volume5 (на ATM 1 hue): 1 huesaturation0, volume4!(на ATM 1 hue): 1 huesaturation0, volume3 (на ATM 1 hue): 1 huesaturation0, volume2!(на ATM 1 hue): 1 huesaturation0, volume1 (на ATM 1 hue): 1 hue*//*saturation2, volume5 (на ATM 6 hue): 6 hue?saturation2, volume4 (на ATM 12 hue): 18 huesaturation2, volume3 (на ATM 18 hue): 54 huesaturation2, volume2 (на ATM 12 hue): 18 huesaturation2, volume1 (на ATM 6 hue): 18 hue^^^^^^^^^^^^ это уже 114saturation2-, volume5 (на ATM 6 hue): 6 huesaturation2-, volume4 (на ATM 12 hue): 18 huesaturation2-, volume3 (на ATM 18 hue): 18 huesaturation2-, volume2 (на ATM 12 hue): 18 huesaturation2-, volume1 (на ATM 6 hue): 6 hue^^^^^^^^^^ это ещё 66saturation1, volume5 (на ATM 1 hue): 6 hue?saturation1, volume4 (на ATM 1 hue): 6 huesaturation1, volume3 (на ATM 1 hue): 6 huesaturation1, volume2 (на ATM 6 hue): 18 huesaturation1, volume1 (на ATM 1 hue): 6 hue^^^^^^^^^^ это ещё 42 (итого уже 222)saturation0+, volume5 (на ATM 1 hue): 1 hue?saturation0+, volume4!(на ATM 1 hue): 6 huesaturation0+, volume3 (на ATM 1 hue): 6 huesaturation0+, volume2!(на ATM 1 hue): 6 huesaturation0+, volume1 (на ATM 1 hue): 6 huesaturation0, volume4+(на ATM 1 hue): 1 huesaturation0, volume4!(на ATM 1 hue): 1 huesaturation0, volume4-(на ATM 1 hue): 1 huesaturation0, volume2+(на ATM 1 hue): 1 huesaturation0, volume2!(на ATM 1 hue): 1 huesaturation0, volume2-(на ATM 1 hue): 1 hue0W=255 цветов, но цветов больше всего надо не при максимальной насыщенности, а при промежуточной*/цветов больше всего надо не при максимальной насыщенности, а при промежуточной (но отображаем её как максимальную, т.к. в saturation1 только 6 hue)зона saturation1 должна быть широкая, чтобы в неё попадало побольше пикселей (т.е. как бы присутствует saturation 1-, а то и 1+ той же ширины?)saturation2, volume5 (на ATM 6 hue): 6 huesaturation2, volume4 (на ATM 12 hue): 12 huesaturation2, volume3 (на ATM 18 hue): 18 huesaturation2, volume2 (на ATM 12 hue): 12 huesaturation2, volume1 (на ATM 6 hue): 6 hue^^^^^^^^^^^^ это уже 54saturation2-, volume5 (на ATM 6 hue): 6 huesaturation2-, volume4 (на ATM 12 hue): 12 huesaturation2-, volume3 (на ATM 18 hue): 54 hue (*3)saturation2-, volume2 (на ATM 12 hue): 18 huesaturation2-, volume1 (на ATM 6 hue): 6 hue^^^^^^^^^^ это ещё 96saturation1, volume5 (на ATM 1 hue): 6 huesaturation1, volume4 (на ATM 1 hue): 6 huesaturation1, volume3 (на ATM 1 hue): 18 huesaturation1, volume2 (на ATM 6 hue): 30 hue? (*5)saturation1, volume1 (на ATM 1 hue): 6 hue^^^^^^^^^^ это ещё 66saturation0+, volume4+(на ATM 1 hue): 1 huesaturation0+, volume4!(на ATM 1 hue): 6 huesaturation0+, volume4-(на ATM 1 hue): 6 huesaturation0+, volume2+(на ATM 1 hue): 6 huesaturation0+, volume2!(на ATM 1 hue): 6 huesaturation0+, volume2-(на ATM 1 hue): 6 huesaturation0, volume4+(на ATM 1 hue): 1 huesaturation0, volume4!(на ATM 1 hue): 1 huesaturation0, volume4-(на ATM 1 hue): 1 huesaturation0, volume2+(на ATM 1 hue): 1 huesaturation0, volume2!(на ATM 1 hue): 1 huesaturation0, volume2-(на ATM 1 hue): 1 hue0 (volume0)W (volume6)=255 梥⮢Можно уточнять только вокруг реально используемых 16 цветов, а остальные цвета - просто RRGGBBно уточнение - это 26 дополнительных цветов (куб 3x3x3)! (кроме тех, которые на поверхности, а на поверхности 56 из 64 цветов, 14 из 16)для стандартной палитры:в углу 8 цветов - их уточняют по 4 цвета (итого 32)на ребре 6 цветов - их уточняют по 12 цветов (итого 96)на поверхности грани 0 цветоввнутри 2 цвета - их уточняют по 26 цветов (итого 52)64+32+96+52 = 244для стандартной палитры со смягчёнными чистыми цветами (+3,2,2 вместо M):в углу 2 цвета - их уточняют по 4 цвета (итого 8)на ребре 6 цветов - их уточняют по 12 цветов (итого 96)на поверхности грани 1 цвет - его уточняют 17 цветов (итого 17)внутри 7 цветов - их уточняют по 26 цветов (итого 182)8+96+18+182 = 303 невозможно! надо перенести 5 внутренних цветов на граниsoftb16.act:0,0,0 01,1,2 b2,1,1 r3,2,2 R телесный1,2,0 g травяной2,2,3 B? (2,3,1 G softc16.act) (3,2,1 O softd16.act для рубашек на картине)2,2,1 y3,3,3 Wсерые:2,2,2 S1,1,1 sкоррекция теней:0,0,1 b00,1,0 g01,0,0 r0коррекция засветок:3,3,2 YW3,2,3 MW (3,3,1 Y softe16.act для лампы у джедая)2,3,3 CWв углу 2 цвета (0,W) - их уточняют по 4 цвета (итого 8)на ребре 6 цветов (b0,r0,g0,YW,CW,Y) - их уточняют по 12 цветов (итого 96)на поверхности грани 3 цвета (R,g,O) - их уточняют по 17 цветов (итого 51)внутри 5 цветов (s,S,b,r,y) - их уточняют по 26 цветов (итого 130)8+96+51+130 = 285 невозможно! можно убрать уточнение для g? (т.к. он оторван) будет 259можно вместо этого убрать уточнения с поверхности фигуры, т.к. их невозможно никак отрисоватьили оставить только точки внутри фигуры (or 64 стандартных цвета), получается 263какие 7 уточняющих цветов убрать? окрестность Y (3) и окрестность псевдоточки r0+gx=g(0..9), y=b(9..0)R=9:1001001001 ;W000000001100000001111001001111 ;YW000000111100000011001001001101 ;Y (окрестность убрана)000000000000000000001001001001R=8:0000000001000000001100000001110000001111000001111100000111100000011110000000000000000000000000000000R=7:0000000001000000011100000011110000011110000001111000001111000000111100000000000000000000000000000000R=6:1001001001 ;CW000000011000000011101001011101000001110000001110001001111001000000000000000000001001001001R=5:0000000000000000110000000111000000111110000011110000011111000001111000001111100000000000000000000000R=4:0000000000000000000000000100000000110000000111100000011110000011111100001111100001111110000000000000R=3:1001001001000000000000000000001001001001000100000000111000001011101001011111000001101100001101011001 ;окрестность r0+g убранаR=2:0000000000000000000000000000000000000000001000000000110000000111000000011110000011111000001110110000 ;окрестность r0+g убранаR=1:0000000000000000000000000000000000000000000000000001000000000110000000111100000011110000001111100000R=0:1001001001000000000000000000001001001001000000000000000000001001001001110000000011100000001111001001палитру256 см. в scratch/kulerтелесные цвета с фотографий вроде бы вписываются в основное пятно цветов, но точность представления недостаточная!Нужна таблица R5G5B5 -> index256 (займёт 32K), можно R5G5B4? (16K)для diamond выгодно уточнять не в 3 раза, а в 4телесный цветопереходна портрете незнакомки: 001 101 111 211 212 312 322 422 423 533 (534щека) 633 644 744 754(плохо) 854 864(плохо) 865 875(плохо) 975 976 986(плохо)не хватает (7.5 4.5 4) (8 5.5 4.5) (8.5 6.5 5) (9 7.5 6.5??? Photoshop не находит)на джедае: ... 432 532 542(плохо) 643 743 753 853 (863(плохо)) 960(ужасно, надо 963, но на картинке реально с яркостью уменьшается значение B - или так совпали пятна шума)не хватает (5.5 3.5 2.5) (8.5 5.5 3)диферинг из индексных цветов в экранные (буфер картинки EGA):где хранить ошибку для следующей строки? буфер на ширину строки картинки?диферинг только по горизонтали?init. r,g,b = 00.r,g,b += pal256[pixline[x]]1.найти цвет c16 самый близкий к r,g,b2.scrline[x]=c163.r,g,b -= rgb[c16] //знаковый результат4.x++;hl=pixline;??=scrline;?=pixline low;???=pixline step;bc=rgb (он же адрес таблицы c16[rgb]) = %11RRRRRGGGGGBBBB, где RRRRR,GGGGG = 3..12 в норме (макс. ошибка = +-3??? к тому же, 10 значений недостаточно для телесных) (по уму ошибка не должна превышать +-6 по каждой оси, диапазон значений надо -6..+15, таблица 21x21x21 без телесных=9261, с телесными можно уточнить только одну ось или две с заходом в нижнюю память) (реально может быть вылет за углы без палитровых цветов? тогда ошибка больше?);de=pal256;окна: 1=scrline, 2=pixline, 3=c16[rgb];или лучше промежуточный буфер для масштабирования строки и хранения ошибок? окна: 1=scrline, 2,3=c16[rgb]/*абсолютный минимум:ld e,(hl)inc hl ;TODO ходить с масштабомld d,pal256/256ld a,(de)add a,cld c,a ;inc dld a,(de)adc a,bld b,a ;bc=rgbinc dld a,(bc) ;c16ld (..),a ;scrline[x]=c16 ;TODO сразу класть 2 пикселяld e,a ;mrgb[c16]ld a,(de)add a,cld c,a ;inc dld a,(de)adc a,bld b,a ;bc=drgb ;знаковый!*/масштабирование и вычисление rgb (сгенерированный код, рисует справа налево):add/adc hl,bc ;bc<0, CY=1ld e,(hl) ;de=pal256+0/+256ld a,(de)ld (..l/h),ainc/dec dld a,(de)ld (..h/l),a:64t/pix (каждый второй проход можно 62t через push af)диферинг:/*pop deadd hl,de ;hl=rgbset 7,h ;TODO как избежать переполнения по R?ld a,(hl) ;c16ld (..),a ;scrline[x]=c16 ;TODO сразу класть 2 пикселя;ld (),a ;c16 чётное;ld de,();add hl,de ;13+20+11=34ld d,mrgbc16/256ld e,a ;de=mrgb[c16]ld a,(de)add a,lld l,ainc dld a,(de)adc a,hld h,a ;bc=drgb ;знаковый! ;7+4+7+4+4+4+7+4+4=45*/pop deadd hl,de ;hl=rgbld a,(hl) ;c16 (left)ld (),a ;c16 чётноеld de,() ;de=mrgb[c16]add hl,depop deadd hl,de ;hl=rgbld e,a ;c16 (left)ld a,(hl) ;c16 (right)ld (),a ;c16 чётноеld d,a ;d=right,e=left ;de = %001rrrr0 001LLLL0ld a,(de) ;%rlrrrlllld de,() ;de=mrgb[c16]add hl,deld (bc),a ;scrline[x]=%rlrrrlll ;сразу кладём 2 пикселяinc bc:172t/2pix = 86t/pixвывод картинки на экран (EGA):надо брать байты через 4 (или через 2 распихивать в 2 блока памяти)выводим по произвольному адресу и можем не на всю ширину картинки!/*Распихиваем через один байт в 2 блока памяти (di!):pop afld (hl),ainc hlpop afld (de),ainc de;проблема с прерыванием! второй раз не прочитаем!!! читать из стека можно только через de*//*Распихиваем через один байт в 2 блока памяти (ei):pop deld (hl),einc hlpop deld a,eld (bc),ainc bc:50t/2byte = 25t/byte = 12.5t/pix*/Распихиваем в 4 блока памяти (di! т.к. после exx уже неактуальное de):pop deld (hl),einc hlld a,dexxld (bc),ainc bcpop deld (hl),einc hlld a,dexxld (bc),ainc bc:88t/4byte = 22t/byte = 11t/pixможно иметь 32 копии процедуры (с разными начальными x), тогда большинство inc rp можно заменить на inc rвывод картинки в мультиколор, сначала два слоя пикселей (а потом так же - атрибуты):pop deld (hl),eset 5,hld (hl),dinc hlpop deld (hl),dres 5,hld (hl),einc hl:38t/2byte = 19t/byte;3b/b, т.е. вся строка пикселей (она же строка атрибутов) = 3*80 = 240 bв конце в нужном месте поставить jp (ix) сразу после ld (hl) - это нужно только один раз на всю картинку+вход с разных мест - для разного начального положения картинки на экране/*по вертикали (если картинка разложена по вертикали):pop deld (hl),eadd hl,bcld (hl),dadd hl,bc:46t/2byte = 23t/byte = 11.5t/pix*/Как делать диферинг в хайрез?Нужно найти 2 набора по 2 цвета (для чётных и нечётных строк) и конвертить в эти палитры с распространением ошибки вправо и вниз!большинство знакомест имеют чёрный или белый фон? (достаточно найти один чёрный пиксель для paper=0 или один белый пиксель для ink=1) (а как найти второй цвет? должно отличаться для чётных и нечётных строк)из остальных большинство цветопереходы? как найти для них 2 цвета? должно отличаться для чётных и нечётных строк?по идее надо найти 2 самых дальних друг от друга цвета?если просто искать minR,maxR и т.п. по каждой составляющей, то непонятно, какую диагональ братьнадо поэтому по каждой оси искать минимум, максимум и соответствующие им цветапотом взять ось с самым большим расстоянием и цвета из неёдля этого надо только уметь быстро считать R,G,B от пикселяошибка при этом может быть очень большая! может ли накапливаться при продвижении (тогда нужно усечение)? ошибка должна размываться по всему нижеследующему знакоместу или не влиять на него (тогда надо другую логику для поиска палитры нечётных строк)?Как конвертить rgb в 2 заданных цвета? палитр может быть очень много, страничек не хватит под таблицы bit[curpal,rgb]!!!тогда надо искать расстояние от rgb до заданного цвета, надо 16 страничек под таблицы dist[color16,rgb]!!!переключение страничек - это долго, можно попробовать sum(distr,distg,distb), где distX = abs[r[rgb]-colorr], но три таблицы от rgb - жирно, придётся вручную выделять биты из rgb!это значит, что диапазон цветовой составляющей должен быть 0..15 (необходимо ручное усечение) или 0..31или отказаться от флойда-стейнберга, придумать быстрый алгоритм для diamond? bit = f(curpal,rgb,xyphase)для знакомест с чёрным или белым фоном можно перед конверсией нормировать цвета в уровни 0(чёрный или цвет)..1(белый или цвет)для знакомест с двумя цветами можно перед конверсией нормировать цвета в уровни 0(цвет1)..1(цвет2)тогда диферинг тривиален, хоть флойд, хоть diamondкак нормировать? 2 цвета нельзя нормировать по яркостиа проекция на линию - жирновыбрать одну цветовую составляющую (где самая большая разница) и по ней нормировать? (ту же, по которой искали 2 самых далёких цвета)пусть это оказалась R:R = R(pixel) ;округлено так же, как Rmin,Rmax!inklevel = (R-Rmin)/maxdistbit = (inklevel > chunklevel[x%4][y%4])деление .5/.5 (отрицательные приводим к 0? или не будет вне 0..1, т.к. берём Rmin и Rmax)Надо перед конверсией строки (или строки знакоместа) копировать её (в нужном масштабе) в нижнюю память в виде R(+0),G(+8),B(+16), иначе проблемы с окнами памяти и лишними конверсиями?Это можно сделать в 3 прохода (с разными таблицами R(rgb)) или лучше делать таблицы R(index256)macro DITHERMC ch0,ch1,ch2,ch3;поиск 2 цветов (запоминаем положения рекордных цветов, чтобы потом их прочитать):ld hl,chrbuf_=(chrbuf+8)&0xffld de,_*257ld c,(hl) ;Rminld b,c ;Rmax_=_+1dup 7inc lld a,(hl) ;R(pixel)cp c ;Rminjr nc,$+2+1+2ld c,a ;Rminld e,_ ;Rmincolor = положение текущего цветаcp b ;Rmaxjr c,$+2+1+2ld b,a ;Rmaxld d,_ ;Rmaxcolor = положение текущего цвета_=_+1eduppush de ;ld (Rminmaxcolor),deld a,bsub cpush afinc l ;ld hl,chrbuf+8_=(chrbuf+8)&0xffld de,_*257ld c,(hl) ;Gminld b,c ;Gmax_=_+1dup 7inc lld a,(hl) ;G(pixel)cp c ;Gminjr nc,$+2+1+2ld c,a ;Gminld e,_ ;Gmincolor = положение текущего цветаcp b ;Gmaxjr c,$+2+1+2ld b,a ;Gmaxld d,_ ;Gmaxcolor = положение текущего цвета_=_+1eduppush de ;ld (Gminmaxcolor),deld a,bsub cpush afinc l ;ld hl,chrbuf+16_=(chrbuf+8)&0xffld de,_*257ld c,(hl) ;Bminld b,c ;Bmax_=_+1dup 7inc lld a,(hl) ;B(pixel)cp c ;Bminjr nc,$+2+1+2ld c,a ;Bminld e,_ ;Bmincolor = положение текущего цветаcp b ;Bmaxjr c,$+2+1+2ld b,a ;Bmaxld d,_ ;Bmaxcolor = положение текущего цвета_=_+1edup;ld (Bminmaxcolor),deld a,bsub c;выбираем лучшую ось и её minmaxcolor:ld c,a ;maxdistpop af ;Gmax-Gminpop hl ;Gminmaxcolorcp c ;>=maxdist?jr c,$+2+1+1ld c,a ;maxdistex de,hlpop af ;Rmax-Rminpop hl ;Rminmaxcolorcp c ;>=maxdist?jr c,$+2+1ex de,hl;d=maxcolor;e=mincolor;берём рекордные цвета (в виде color16):;чтобы получить color16, надо сначала color64(=BBGGRR), потом по таблице из негоld h,chrbuf/256ld l,d ;maxcolor;округлять вверх! +32 (найдено подбором)ld a,(hl) ;Gadd a,32jr nc,$+3sbc a,ald c,ares 3,lld a,(hl) ;Radd a,32jr nc,$+3sbc a,ald b,aset 4,lld a,(hl) ;Badd a,32jr nc,$+3sbc a,arlcarlcarl crlarl c ;grlarl brlarl b ;rrla ;BBGGRRand 0x3fld l,a;ld h,t64to16ink/256ld d,(hl) ;d=maxcolor16=inkld l,e ;mincolor;ld h,chrbuf/256;округлять вниз! -32 (найдено подбором)ld a,(hl) ;Gsub 64jr nc,$+3xor ald c,ares 3,lld a,(hl) ;Rsub 64jr nc,$+3xor ald b,aset 4,lld a,(hl) ;Bsub 64jr nc,$+3xor arlcarlcarl crlarl c ;grlarl brlarl b ;rrla ;BBGGRRor 0xc0ld l,a;ld h,t64to16paper/256ld a,(hl) ;a=mincolor16=paperor d;a=attrexxld (hl),a ;записать attrinc hlexx;по реальным атрибутам заново пересчитать maxaxis, min, maxdist! (проверено, что без этого получается пятнистость):ld l,ald h,tmaxaxis/256ld d,(hl) ;maxdistdivinc hld b,(hl) ;mininc hld l,(hl) ;maxaxis*3ld h,chrbuf/256;b=R/G/Bmin;hl на начале буфера R/G/B;d=maxdistdiv;в диферинге ходим только по одной составляющей, остальные не читаем:ld a,(hl) ;R(pixel)inc lsub b ;Rminrra ;на случай отрицательныхld e,a ;d=maxdistdivld a,(de) ;inklevelcp ch0 ;chunklevel[x%4][y%4]rl c ;bitsld a,(hl) ;R(pixel)inc lsub b ;Rminrra ;на случай отрицательныхld e,a ;d=maxdistdivld a,(de) ;inklevelcp ch1 ;chunklevel[x%4][y%4]rl c ;bitsld a,(hl) ;R(pixel)inc lsub b ;Rminrra ;на случай отрицательныхld e,a ;d=maxdistdivld a,(de) ;inklevelcp ch2 ;chunklevel[x%4][y%4]rl c ;bitsld a,(hl) ;R(pixel)inc lsub b ;Rminrra ;на случай отрицательныхld e,a ;d=maxdistdivld a,(de) ;inklevelcp ch3 ;chunklevel[x%4][y%4]rl c ;bitsld a,(hl) ;R(pixel)inc lsub b ;Rminrra ;на случай отрицательныхld e,a ;d=maxdistdivld a,(de) ;inklevelcp ch0 ;chunklevel[x%4][y%4]rl c ;bitsld a,(hl) ;R(pixel)inc lsub b ;Rminrra ;на случай отрицательныхld e,a ;d=maxdistdivld a,(de) ;inklevelcp ch1 ;chunklevel[x%4][y%4]rl c ;bitsld a,(hl) ;R(pixel)inc lsub b ;Rminrra ;на случай отрицательныхld e,a ;d=maxdistdivld a,(de) ;inklevelcp ch2 ;chunklevel[x%4][y%4]rl c ;bitsld a,(hl) ;R(pixel)inc lsub b ;Rminrra ;на случай отрицательныхld e,a ;d=maxdistdivld a,(de) ;inklevelcp ch3 ;chunklevel[x%4][y%4]ld a,crla ;bitsexxld (de),a ;записать bitsinc deexxendm;таких 4 шт (для разных фаз y);0 бессмысленно (всегда NC), поэтому все значения увеличены на 1:dithermcy0DITHERMC 0x1, 0xd, 0x3, 0xfretdithermcy1DITHERMC 0x9, 0x5, 0xb, 0x7retdithermcy2DITHERMC 0x4, 0x10, 0x2, 0xeretdithermcy3DITHERMC 0xc, 0x8, 0xa, 0x6rettmaxdistdiv:h=maxdist/4=0..63l=R-Rmin=0..255out: 0..16 = (R-Rmin)/maxdistкоманды cp будет в диапазоне 1..16, все могут выдать C/NCкуда записывать attr и c?все окна свободны! (можно одно окно = tmaxdistdiv)можно класть подряд: attreven, bitseven, attrodd, bitsoddтогда вывод на экран будет как в 16ца можно разделить на блок атрибутов и блок битовтогда вывод на экран такой:pop deld (hl),eset 5,hld (hl),dinc hlpop deld (hl),dres 5,hld (hl),einc hl:38t/2byte = 19t/byte = 9.5t/pixalign 256t64to16inkdup 64;%00003210 => %.3...210_3=$&8_210=$&7nop ;db (_3*0x08) + (_210*0x01) ;надо генерировать из заданной палитрыedupchrbufds 8 ;Rds 8 ;Gds 8 ;Bds 256-64-24-64t64to16paperdup 64;%00003210 => %3.210..._3=$&8_210=$&7nop ;db (_3*0x10) + (_210*0x08) ;надо генерировать из заданной палитрыedupКартинка выглядит лучше, если чётные строчки округляют макс. цвета вверх на +32, а нечётные округляют мин. цвета вниз на -32Дилемма:если выбирать мин и макс с запасом, то простые надписи получаются на фоне шумаа если выбирать без запаса, то плохо на цветопереходахв jpeg RTAB,GTAB,BTAB не используются?TODO в jpeg строки >1024, для этого рендерить блоки строк в один поток длиной несколько страниц с чередованием цветовых составляющих (Y,U,V -> после пересчёта становится R,G,B)можно просто не рендерить каждую вторую строку, но тогда нельзя будет увеличитьgirl.jpg 23.02.2019 71680t = 71.82 s (JPEG v0.50 ч/б = 39 s, RGB = 83.79 s)TODO показ картинок в EGA, т.к. diamond смотрится плохо даже в hiresперевести весь интерфейс в EGA?TODO при конверсии gif свопиться, а то может не хватать памяти на коегоне даже при захвате рамдиска (gif использует буфер текущей картинки в RGB (не index!) для реализации прозрачности)TODO в gif попробовать:add a,acall z,readbyteadc hl,hl ;resultTODO key_esc во время конверсии gif (хотя бы после кадра)и во время конверсии jpeg (хотя бы после блока строк)