Hlavní navigace

SVGAlib: akcelerované kreslení grafiky

Jakub Matys

V dnešním dílu budeme mít na programu dvě oblasti - doděláme joysticky a začneme probírat "akcelerované kreslení grafiky". Ano, je tomu tak, ukážeme si funkce pro obsluhu grafického akcelerátoru.

Nejdříve se podíváme na poslední z funkcí použitelných pro joysticky.

char joystick_getaxis(int joydev, int a);
char joystick_getbutton(int joydev, int b);

Tyto funkce se dotazují na aktuální stav joysticku joydev. Nesmíte zapomenout, že můžete volat funkce až po aktualizaci interních funkcí joystick_update(). Jinak byste pracovali se stejnou hodnotou jako u předchozího volání funkce.

joystick_geta­xis(joydev, a) vrací aktuální stav dané osy (obvykle platí x – 0, y – 1, y – 2 …) v rozmezích –128..127.

joystick_getbut­ton(joydev, b) vrací stav tlačítek. 1 naznačuje stisknuté tlačítko, 0 pak uvolněné.

Pro zjednodušení práce jsou k dispozici také makra preprocesoru:

  • joystick_button1(i) pro joystick_getbut­ton(i, 0).
  • joystick_button2(i) pro joystick_getbut­ton(i, 1).
  • joystick_button3(i) pro joystick_getbut­ton(i, 2).
  • joystick_button4(i) pro joystick_getbut­ton(i, 3).
  • joystick_x(i) pro joystick_getaxis(i, 0).
  • joystick_y(i) pro joystick_getaxis(i, 1).
  • joystick_z(i) pro joystick_getaxis(i, 2).
  • joystick_getb1() pro joystick_getbut­ton(0, 0).
  • joystick_getb2() pro joystick_getbut­ton(0, 1).
  • joystick_getb3() pro joystick_getbut­ton(0, 2).
  • joystick_getb4() pro joystick_getbut­ton(0, 3).
  • joystick_getx() pro joystick_getaxis(0, 0).
  • joystick_gety() pro joystick_getaxis(0, 1).
  • joystick_getz() pro joystick_getaxis(0, 2).

A nyní se už pustíme do slíbeného akcelerátoru.

int vga_accel(unsigned oparation, ...);

Výše napsaná funkce je majoritní funkcí nového rozhraní akcelerátoru. Toto rozhraní bylo obsaženo už ve verzi 1.2.3, jako ústřední bylo však použito mnohem později.

Hlavním cílem je definovat funkce, které mohou být použity jako část složitějších grafických operací. Tyto funkce jsou základem vykreslování grafiky na počítači, umožňují vykreslovat např. čtverce, přímky… Nechoďme kolem horké kaše a podívejme se na některé „akcelerované“ příkazy.

Parametry vga_accel():

vga_accel(ACCEL_FILLBOX, int x, int y, int w, int h)

Příkaz vykreslí jednoduchý vyplněný čtverec na pozici x,y s šířkou w a výškou h v aktuálně vybrané barvě.

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

Kopíruje čtverec o velikosti w x h z pozice x1, y1 na x2, y2.

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

Monochromatické kopírování čtverce. Všechny pixely, které mají nastaveny všechny bity na 0 jsou nakresleny barvou pozadí. Všechny pixely s bity nastavenými na 1 jsou nakresleny barvou popředí. Kvůli podpoře mnoha odlišných architektur není tato rutina definována pro ostatní hodnoty pixelů.

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

Přímý transfer obrázku. Vyplní předávaný čtverec daty z paměti p.

vga_accel(ACCEL_DRAWLINE, int x1, int y1, int x2, int y2) 

Kreslí přímku z x1, y1 do x2, y2 v nastavené barvě.

vga_accel(ACCEL_SETFGCOLOR, int color)

Nastaví barvu popředí. Tato funkce je používána mnoha jinými funkcemi knihovny svgalib.

vga_accel(ACCEL_SETBGCOLOR, int color)

Nastaví barvu pozadí.

To by bylo pro dnešek vše, v příštím dílu budeme pokračovat v obsluze akcelerátoru.

Našli jste v článku chybu?