OldComp.cz

Komunitní diskuzní fórum pro fanoušky historických počítačů

Tlsk Mln 2019

Právě je 12 pro 2019, 17:44

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]




Odeslat nové téma Odpovědět na téma  [ Příspěvků: 9 ] 
Autor Zpráva
PříspěvekNapsal: 25 črc 2018, 19:22 
Offline
Radil

Registrován: 21 říj 2013, 09:25
Příspěvky: 287
Has thanked: 127 times
Been thanked: 100 times
Abych uplně nevypad z programování v C už zapomínám :), napsal jsem si datatyp pro zobrazování obrazovek ".SCR" z ZX Spectra. Pak jsem si přidal podporu ULAplus, která používá RGB332. Kde ale s výsledným zobrazením v RGB888 nejsem spokojen. Když jsem pokukoval po internetu, na nějaký jednoduchý ale účinný převodník jsem nenarazil. Nakonec jsem použil tabulku 332->565 a 565 ještě vynásobím R*8 G*4 B*8. Výsledek je mnohem lepší, ale zajímá mě zda je nějaký rozumný převod z 332–>888?


Nahoru
 Profil  
 
PříspěvekNapsal: 25 črc 2018, 20:19 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18 čer 2013, 20:26
Příspěvky: 2553
Has thanked: 105 times
Been thanked: 372 times
Snad nepíšu nějakou blbost, ale podle mě uděláš z těch 3, resp. 2 bitů nejvyšší bity těch osmibitových čísel a nižší bity vyplníš nulami, ne? Tedy rovnou vynásobíš R*32, G*32 a B*64, řekl bych. Ten obrázek se tím samozřejmě nestane hezčím, ale ani horším - měl by prostě vypadat stejně.

_________________
"Je lepší rozsvítit byť jen malou svíčku, než jen proklínat temnotu." (Konfucius)

www.zxsparrow.com


Nahoru
 Profil  
 
PříspěvekNapsal: 25 črc 2018, 20:23 
Offline
Profík
Uživatelský avatar

Registrován: 24 kvě 2018, 22:32
Příspěvky: 645
Bydliště: Most, Praha
Has thanked: 183 times
Been thanked: 162 times
Složky nestačí jen vynásobit mocninou 2, je nutné použít nelineární převod. Pokud by se 3 bity převedly na 8 bitů vynásobením 32 (rotací o 5 bitů vlevo), vznikla by z max. hodnoty 7 hodnota 224 (spodní bity se vyplní nulami), tj. barvy by nedosahovaly plného jasu a obraz by byl tmavý. Je nutné takhle převést:

Kód:
// inline funkce
inline BYTE Col2To8(int val) { return (BYTE)(val*85); } // conversion from 2 bits to 8 bits (*255/3)
inline BYTE Col3To8(int val) { return (BYTE)((val*255+3)/7); } // conversion from 3 bits to 8 bits (*255/7)

// prevod 1 pixelu s=R3G3B2 na d=R8G8B8
d = Col2To8(s & 0x3) | (Col3To8((k >> 2) & 0x7) << 8) | (Col3To8(k >> 5) << 16);

Použití funkcí a dělení nevadí - překladač to zoptimalizuje na inline instrukce a na celočíselné násobení převrácenou hodnotou. Vzhledem ke cachování instrukcí je to rychlejší než použít tabulku. (teď koukám že ten převod na BYTE je tam zbytečný, stačí int, to je tam jen protože jsem to používal i jinde)


Nahoru
 Profil  
 
PříspěvekNapsal: 25 črc 2018, 20:35 
Offline
Pan Generální
Uživatelský avatar

Registrován: 18 čer 2013, 20:26
Příspěvky: 2553
Has thanked: 105 times
Been thanked: 372 times
Máš pravdu... Že to bude tmavé mě napadlo asi 2 vteřiny poté, co jsem to odeslal... 8-)

_________________
"Je lepší rozsvítit byť jen malou svíčku, než jen proklínat temnotu." (Konfucius)

www.zxsparrow.com


Nahoru
 Profil  
 
PříspěvekNapsal: 26 črc 2018, 00:10 
Offline
Kecálek

Registrován: 10 črc 2014, 01:57
Příspěvky: 76
Has thanked: 5 times
Been thanked: 71 times
trochu iny pohlad na mozne riesenie (s naznakom na zovseobecnenie ulohy)...

Kód:
000000xy

xy000000   = xy * 01000000 = xy << 6  = xy * 64
00xy0000   = xy * 00010000 = xy << 4  = xy * 16
0000xy00   = xy * 00000100 = xy << 2  = xy *  4
000000xy   = xy * 00000001 = xy << 0  = xy *  1
------------------------------------------------
xyxyxyxy                              = xy * 85

=====================================================================

00000xyz

xyz00000   = xyz * 00100000   = xyz << 5  = xyz * 32 = (xyz * 64) / 2
000xyz00   = xyz * 00000100   = xyz << 2  = xyz * 4  = (xyz *  8) / 2
000000xy.z = xyz *        0.1 = xyz >> 1  = xyz / 2  = (xyz *  1) / 2
-----------------------------------------------------------------------
xyzxyzxy.z                                           = (xyz * 73) / 2



a tie "<<" a ">>" hodnoty by sa lahko ratali aj na 8bite ;]


Nahoru
 Profil  
 
PříspěvekNapsal: 03 zář 2018, 15:26 
Offline
Radil
Uživatelský avatar

Registrován: 12 kvě 2013, 20:32
Příspěvky: 390
Bydliště: Kladno
Has thanked: 38 times
Been thanked: 83 times
Už to tedy neni úplně aktuální téma, ale třeba to ještě někomu pomůže (dostal jsem se k tomuto téma až nyní). Já jsem tenhle převod řešil v mém emulátoru (ULA+ emulace). Narazil jsem při tom na problém, že při použití nelinearního převodu nebylo možné dosáhnout na neutrální šedé barvy, kdy by všechny kanály měli stejnou hodnotu. Vždy to táhlo do nějakého zabarvení. U linearního zase nebylo možné dosáhnout čisté bílé. Vyřešil jsem to jednoduchým řešením, stejně bych to řešil na nějakém HW (tam by to byla otázka jednoho jediného drátu). Všechny barvy převedu na 8 bitové, bity 7 6 5 + ostatní nula. U modré jen 7 6 ostatní nula. Poté duplikuju u modré složky bit 7 na bit 5 (ten tam oproti ostatním barvám schází), s tím že rozsah jasu je 0- 224 (pro potřeby emulace všechny 3 barevné složky pak vynásobím koofecientem 1.13839285714286f a dostanu tím rozsah 0- 255). A mám krásný šedý a krásnou bílou... ;)

_________________
>> Amiga 1200, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Naposledy upravil Lanex dne 03 zář 2018, 16:54, celkově upraveno 2

Nahoru
 Profil  
 
PříspěvekNapsal: 03 zář 2018, 16:05 
Offline
Kecálek

Registrován: 18 říj 2014, 23:10
Příspěvky: 208
Has thanked: 12 times
Been thanked: 47 times
Lanex píše:
Všechny barvy převedu na 8 bitové, bity 7 6 5 + ostatní nula. U modré jen 7 6 ostatní nula.
To sedí,
Lanex píše:
Poté duplikuju u modré složky bit 7 na bit 5 (ten tam oproti ostatním barvám schází)
ale týmto práve pokazíš tie šede.
Jednoducho vo všetkých zložkách zduplikovať bity do podoby 76576576.
Modrá zložka nemôže mať max. hodnotu 255 ako R a G, keď tam oproti ostatným zložkám chýba jeden bit.

Ešte by sa dalo uprednostniť šedé odtiene a bit B5 vypočítať nasledovne:
Ak R7=G7=B7 a R6=G6=B6 a R5=G5 tak B5=R5 inak B5=0.


Nahoru
 Profil  
 
PříspěvekNapsal: 03 zář 2018, 16:45 
Offline
Radil
Uživatelský avatar

Registrován: 12 kvě 2013, 20:32
Příspěvky: 390
Bydliště: Kladno
Has thanked: 38 times
Been thanked: 83 times
Antony/DTA píše:
Modrá zložka nemôže mať max. hodnotu 255 ako R a G, keď tam oproti ostatným zložkám chýba jeden bit.

Modrá složka musí mít max hodnotu také 255, jinak neexistuje čistá bílá.

Když vemeš mou metodu (kopírovat v modré bit 7 do 5), a že R / G je v hodnotách 0-7, B je 0- 3, jsou šedé takto:

R/G/B
0/0/0 - černá
2/2/1 - tmavě šedá (RGB cca 72/72/72)
5/5/2 - světle šedá (shodou okolností odpovídá bílé barvě + Bright 0 na ZX Spectrum) - (RGB cca 160/160/160)
7/7/3 - bílá (odpovídá bíle barvě + Bright 1 na ZX Spectrum) - (RGB 255/255/255)

K vyzkoušení v mém emulátoru, Tools/Ula Plus color editor (verze 1.6.9b, ve starších to funguje trochu jinak)

_________________
>> Amiga 1200, ZX Spectrum+, Didaktik Gama, LnxSpectrum, LnxTracker, LnxAmigaImageConvertor, https://www.ilnx.cz <<


Nahoru
 Profil  
 
PříspěvekNapsal: 03 zář 2018, 20:31 
Offline
Kecálek

Registrován: 18 říj 2014, 23:10
Příspěvky: 208
Has thanked: 12 times
Been thanked: 47 times
Už rozumiem, ja som bol v tom, že v rgb332 sú použité najvyššie bity s rovnakou váhou, ale ono je to trochu inak. Zo zvedavosti som si pozrel v PPainte takúto paletu a tam je maximum pre každú zložku 252 s krokom 252/7 pre zložky R a G a s krokom 252/3 pre zložku B.
Takže tie šedé niesu čisté, pre 5/5/2 tam je RGB 180/180/168.


Nahoru
 Profil  
 
Zobrazit příspěvky za předchozí:  Seřadit podle  
Odeslat nové téma Odpovědět na téma  [ Příspěvků: 9 ] 

Všechny časy jsou v UTC + 1 hodina [ Letní čas ]


Kdo je online

Uživatelé procházející toto fórum: Žádní registrovaní uživatelé a 1 návštěvník


Nemůžete zakládat nová témata v tomto fóru
Nemůžete odpovídat v tomto fóru
Nemůžete upravovat své příspěvky v tomto fóru
Nemůžete mazat své příspěvky v tomto fóru
Nemůžete přikládat soubory v tomto fóru

Hledat:
Přejít na:  
Založeno na phpBB® Forum Software © phpBB Group
Český překlad – phpBB.cz