Hlavní navigace

SVGAlib (11)

Jakub Matys

V minulém dílu jsme začali celkem zajímavé téma, jedná se o obsluhu akcelerátorů. V dnešním a několika dalších dílech se budeme této problematice dále věnovat. Zatímco v minulém dílu jsme se naučili kreslit čtverce a přímky, dnes se naučíme kreslit mnohoúhelníky.

vga_accel(ACCEL_PUTBITMAP, int x, int y, int w, int h, void *p) 

Pracuje podobně jako ACCEL_PUTIMAGE, ale bitmapa *p je jednobitová. Každý pixel v *p, který má nastavený bit, je nakreslen v barvě popředí, ostatní pixely jsou nakresleny v barvě pozadí.

Každý byte v *p obsahuje osm pixelů. Nejnižší bit každého bytu je na obrazovce umístěn nejvíce vlevo (což je opačné od tradičního VGA) a nerespektuje se příznakový bit. Data jsou uložena v segmentech po 32 bitech.

vga_accel(ACCEL_SCREENCOPYBITMAP, int x1, int y1, int x2, int y2, w, h) 

Pracuje podobně jako ACCEL_PUTBITMAP, ale bitmapa leží na pozici x1, y1 a cíl na x2, y2.

Velikosti pixelů v obou bitmapách se však mohou odlišovat. Bitmapa *p musí mít formát shodující se s ACCEL_PUTBITMAP, ale v paměti musí začínat tam, kde by měl být pixel x1, y1.

V módech, kde pixel nebude začínat na okraji bytu (typicky módy s méně než 256 barvami), musí pixel x1, y1 začínat na počátku bytu.

vga_accel(ACCEL_DRAWHLINELIST, int y, int n, int *x1, int *x2) 

Tato funkce umožňuje nakreslit v podstatě libovolné 2D těleso pomocí horizontálních přímek. Pole *x1 a *x2 obsahují n uspořádaných dvojic. Tyto dvojice představují x-ové souřadnice kreslených přímek. Přímka začíná na pozici *x1, y a končí na*x2, y. Hodnota y se neustále zvyšuje až do y + n. Tato operace je obvykle velmi rychlá a je užitečná pro kreslení libovolných mnohoúhelníků.

vga_accel(ACCEL_POLYNE, int flag, int n unsigned short *coords) 

Kreslí nepřetržitou přímku přes n bodů uvedených v*coords. *coords obsahuje n párů „krátkých integerů“. První z páru je orientovaný na osu x, druhý pak na y.

Normálně by měl flag nabývat hodnoty ACEEL_START | ACCEL_END. Pokud je např. vyhodnocení bodů výpočetně náročné, můžete střídat výpočty a kreslení. První volání funkce vga_accel(ACCEL_PO­LYNE, …) musí mít nastaveno ACCEL_START. Tento příkaz zinicializuje akcelerátor. Pokud nenastavíte příznak ACCEL_END, můžete (resp. musíte) volat funkci dále a předávat jí další body pro spojení. Je důležité, aby žádné operace (ani pro nastavení barev) nepracovaly s grafikou mezi volánímiACCEL_START a jedním z odpovídajících ACCEL_END. Ze zmíněného důvodu je také důležité zamykat konzoli pomocí vga_lockvc(3) a vga_unlockvc(3), protože operace nemůže být přerušena přepnutím konzole.

Jestliže voláte vga_accel(ACCLE_PO­LYNE, …) jako poslední funkci (pro nynější kreslený objekt), nemusíte uvádětACCEL_END. Akcelerátor bude automaticky deinicializován, až zavoláte jinou kreslící funkci.

Není známo, co se stane, pokud nastavíte jiné hodnoty proměnné flag nebo pokud váš polynom bude obsahovat jenom jeden bod. Jednotlivé „řádkové segmenty“ musí mít větší velikost než nula.

To by bylo pro dnešek vše. Jak jsem slíbil, v příštím dílu se budeme nadále věnovat akcelerátorům.

Našli jste v článku chybu?