Hlavní navigace

SVGAlib (12)

Jakub Matys

V dnešním dílu se podíváme na funkci ACCEL_POLYHLINE, která kombinuje vlastnosti funkcí ACCEL_POLYNE a ACCEL_DRAWHLINELIST, a na funkci ACCEL_POLYFILLMODE, která mám zase umožňuje hardwarové vykreslování obrazců.

vga_accel(ACCEL_POLYHLINE, int flag, int y, int n, unsigned short *xcoords) 

Tato funkce je kombinací funkcí ACCEL_POLYNE a ACCEL_DRAWHLI­NELIST. Kreslení začíná na řádce y a jednotlivé řádky (přímky) jsou kresleny shora dolů. Pole *xcoordsbude pro každou řádku obsahovat dvě souřadnice s osou x (uspořádání je zleva doprava). Pokud při kreslení vyčerpáte všechny hodnoty pole *xcoords, operace pokračuje dál, přičemž souřadnice jsou brány opět z tohoto pole (indexy 0,1,2…).

Procedura se ukončí po n řádcích.

Parametr flag pracuje podobně jako u ACCEL_POLYNE. Vaše první volání musí obsahovat bit ACCEL_START. Parametr y je ignorován, pokud není předán ACCEL_START.

Je však důsledně požadováno nastavení bitu ACCEL_END při posledním volání.

Funkce je navržena pro kreslení zcela vyplněných mnohoúhelníků používajících horizontální řádky. Pomocí malých a rychlých volání funkce pouze pro několik řádek je možné kombinovat kreslení a výpočty.

Operace ACCEL_POLYHLINE je nefunkční, pokud xové souřadnice nejsou seřazeny zleva doprava nebo jsou použity nulové vzdálenosti jednotlivých řádek anebo pokud je n nebo jedno z m nulové.

vga_accel(ACCEL_POLYFILLMODE, onoff)

Přepíná mód naplnění polygonu na ON (onoff nenulový) nebo OFF.

Pokud budete mít zapnutý „naplněný“ mód a pomocí ACCEL_DRAWLINEnebo ACCEL_POLYLINE budete kreslit pouze krajní body mnohoúhelníků, bude ACCEL_SCREENCO­PYMONO horizontálně načítat zdrojovou plochu a začne kreslení v barvě popředí, jestliže nalezne nastavený pixel. Pokud bude druhý pixel nastaven na 0, bude v kreslení této barvy pokračovat, dokud nenarazí na druhý okraj obrazce.

Díky tomuto mechanismu můžete vyplňovat polygony s hardwarovou podporou:

  1. Povolte mód vyplňování mnohoúhelníků.
  2. Naplňte pravoúhlou oblast mimo viditelnou obrazovku barvou se všemi bity nastavenými na 0 (obvykle černá).
  3. Nakreslete obrys mnohoúhelníku (většinou uzavřený) v „neviditelné“ černé oblasti v barvě se všemi bity nastavenými na 1 (bílá). Pro získání vhodně nastavených bitů je doporučeno použít ROP_XOR (u ACCEL_POLYNE). Jestliže pracujete v tomto módu, musíte mít nastaveny startovací i ukončovací souřadnice, aby byly správně propojeny rohy obrazce. V tomto případě je však lepší použít ACCEL_DRAWWINE místo ACCEL_POLYNE. Je možné, že by zbytečné horizontální přímky mohly zmást ACCEL_SCREENCO­PYMONO, proto je radši přeskočte.
  4. Nastavte barvu popředí a pozadí, operace rastru a bitmapovou průhlednost, kterou chcete pro svůj obrazec použít.
  5. Použijte ACCEL_SCREENCO­PYMONO pro kopírování obrazce z „neviditelné“ do „viditelné“ obrazovky.

Jelikož kreslení mnohoúhelníků tímto způsobem používá více operací pro čtení/zápis, je s největší pravděpodobností pomalejší než použití ACCEL_DRAWHLINELIST nebo ACCEL_POLYNE. Avšak je jednoduší na použití a bude zpravidla pracovat bez zásahu CPU, která může provádět jiné operace.

vga_accel(ACCEL_SETMODE, mode)

Nastavuje, jestli se bude čekat na operace akcelerátoru. Můžete si vybrat ze dvou voleb; BLITS_SYNC, neboBLITS_IN_BAC­KGROUND. Při první volbě se vga_accel vrací pouze v případě, že akcelerátor ukončil svoji činnost. Druhá umožňuje okamžité vrácení z funkce, tj. CPU a akcelerátor pracují paralelně. Následné operace akcelerátoru budou čekat na každou další (a blokovat, pokud je to nutné).

vga_accel(ACCEL_SYNC)

Čeká na ukončení práce akcelerátoru (pokud je nastaven mód BLITS_IN_BACKGRO­UND).

vga_accel(ACCEL_SETOFFSET, int address)

Nastaví offset obrazovky jako funkce vga_setdispla­ystart(3). Pro funkci platí omezení, která jsou zapsána ve struktuře vrácené vga_getmodeinfo(3).

Offset akcelerátoru se bude řídit offsetem obrazovky, kdykoliv ten bude modifikován. Můžete však pomocí vga_accel(ACCEL_SE­TOFFSET) offset nastavit kdykoliv později.

To by bylo pro dnešek vše, příště budeme pokračovat v používání akcelerátoru.

Našli jste v článku chybu?