+-----------------------------------+ |Dnešní téma budou hrátky s paletou.| +-----------------------------------+ Co je to paleta? Nejprve se musíme vrátit na základní školu do hodiny fyziky. Probíráme zrovna optiku. Něco co se jmenuje skládání barev. Zjistíme, že jakoukoliv barvu můžeme získat smícháním tří základních barev: červené, zelené a modré. Podle toho kolik, které barvy přidáme, získáme barvu výslednou. Takže bílá, jsou všechny tři barvy naplno, šedá jsou všechny tři napůl. Zelená bude třeba zelená naplno a ostatní dvě vůbec. Fialová bude modrá a červená naplno, zelená vůbec, atd... Anglicky je červená - RED, zelená - GREEN a modrá je BLUE. Zkratka pro tento způsob kódování barvy je RGB. Jenomže představte si, že si mám pro každý bod pamatovat ty tři barevné složky, každou v rozsahu 0-255, to jsou tři bajty na bod. Bodů jak jsme si řekli minule je 64000, takže 64000*3=192000 bajtů, to je přes čtvrt mega, to se ještě dá, ale co vyšší rozlišení, nárok na paměť roste. Udělalo se to tedy jinak. Máme paletu 256 barev. Barvy jsou číslovány od 0 do 255. Pro každou barvu z této palety si můžeme nadefinovat RGB, tedy tři bajty, jeden pro R, druhý pro G a třetí pro B. Ve skutečnosti to není celý bajt. Je to vlastně 6 bitů. Intenzita pro každou ze základních barev je v rozsahu 0-63. Máme tedy pro každou základní barvu možnost nastavit 64 stupňů jasu. to nám dává celkem 64*64*64=262144 barev. Ovšem na obrazovce můžete mít pouze 256 z nich, které to budou záleží jen na vás. Pro každý bod si potom zapamatujeme, kterou barvu z palety používá. Stačí nám tedy pro každý bod bajt. Při kreslení bodu, který ma barvu 15 se potom v paletě najde pro barvu 15 její nastavení RGB. A touto barvou se bod vykreslí. Jestliže změníme RGB nastavení pro některou z barev. Změní se okamžitě i barva všech bodů, které tuto barvu používají. Toho se využívá při programování efektu, kterému se říká rotace palety. Můžete si také nastavit pro všechny barvy palety stejnou barvu, pak ať kreslíte jakoukoliv barvou, všechny body budou vypadat stejně, změníte-li nastavení jedné barvy, změní se pouze ty body, které danou barvu používají. Jak zjistit pro danou barvu její RGB nastavení? Vrazím na port 3C7h číslo barvy a z portu 3C9h si postupně přečtu uroveň pro R, G, B. V pascalu to vypadá takto: Procedure GetPal(ColorNo : Byte; Var R,G,B : Byte); Begin Port[3c7] := ColorNo; R := Port[3c9]; G := Port[3c9]; B := Port[3c9]; End; Jak nastavit RGB hodnoty pro danou barvu? Taky jednoduchá věc. Vrazím číslo barvy na port 3C8h a pak zapisuji na port 3C9h postupně hodnoty R, G, B. Opět ukázka v pascalu. Procedure Pal(ColorNo : Byte; R,G,B : Byte); Begin Port[3c8] := ColorNo; Port[3c9] := R; Port[3c9] := G; Port[3c9] := B; End; Po načtení, nebo uložení barvy do palety se automaticky zvyší vnitřní počítadlo, takže dalším čtením získáte RGB pro další barvu, nebo dalším zápisem další barvu nastavíte. Chcete-li si tedy uložit celou paletu do pole... type barva = record R, G, B : byte; end; Procedure NactiPal (var Pole : array of barva); var Citac : byte; begin Port[3C7] := 0; {Zacinam barvou cislo 0} for Citac := 0 to 255 do {Tolik je barev v palete} begin Pole[Citac].R := Port[3C9]; Pole[Citac].G := Port[3C9]; Pole[Citac].B := Port[3C9]; end; end; Takže na závěr si ukážeme efekt fadeout. Česky bych to nazval stmívání. Postupně pro každou barvu zjistím v paletě její RGB nastavení a o kousek ji stmavím. Procházím barvy pořád dokola, až jsou všechny nastaveny na černou. bílá má RGB 63,63,63. Víc to nejde, takže stačí maximálně 63 průchodů. Tady je Pascal Tady je Céčko Na různých počítačích bude tento efekt různě rychlý. Zpomalte si ho změnou parametru příkazu delay. Efektnější by bylo nejdříve načíst celou paletu, provést její analýzu a pak jednotlivé RGB složky stmavovat tak, aby všechny došly na nulu současně. Tedy některou barvu ztmavovat rychleji, některou pomaleji. Teď mě napadá, že analýza by nebyla nutná,stačí doplnit program o jednoduchý vzoreček. Neodečítat jedničku, ale různé číslo, které je dáno vzorcem. Já vím lenost.... Dobře napíšu to sem, takže zkuste to takto. if R > 1 then R := R - Trunc (R/(64-Citac)); if G > 1 then G := G - Trunc (G/(64-Citac)); if B > 1 then B := B - Trunc (B/(64-Citac)); Pokud se se mnou budete chtít spojit máte dvě možnosti: FIDO a internet. Moje fidonetí adresa je 2:421/59. A internetí je: SysOp@pizi.fido.cz Jó a taky mám vlastní WWW stránku, kde jsou všechny tyhle texty, které píšu i do VÝHNĚ. www.geocities.com\SiliconValley\Park\8209 Čaute příště PIŽI výheň