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