+-----------------------------------+
|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ň