Hlavní navigace

SVGAlib: funkce pro kreslení bodů a přímek

Jakub Matys

Dnes nás už konečně čekají funkce, které dělají grafickým knihovnám jméno. Budou to základní funkce pro kreslení bodů a přímek.

int vga_getxdim(void);
int vga_getydim(void);
int vga_getcolors(vo­id);

Tyto funkce nedělají nic jiného, než že uloží aktuální rozlišení obrazovky, resp. počet zobrazených barev.

int vga_white(void);

V high-color módech je vždy jasné, jakou má bílá hodnotu, v ostatních módech to však nemusí platit. Funkce vga_white tedy vrací hodnotu bílé, ta může být nastavena pomocí vga_setclolor nebo přímo zapsána na obrazovku. Funkce však pracuje pouze s defaultní paletou, pokud používáte nějakou „uživatelskou“ paletu, neporadí si s ní.

A nyní se už podíváme na funkce, které mají co dočinění s kreslením.

int vga_clear(void);

Čistí obrazovku a nastaví všechny viditelné pixely na 0. Pokud voláte funkci vga_setmode, je tato operace provedena automaticky. Funkce vždy vrací 0.

void vga_setcolor(int color);

Jak samotný název napovídá, tato funkce nastavuje aktuální barvu na color. Tuto funkci můžete použít pouze u módů s 256 a méně barvami. Pro jiné módy je lepší použít jednu z následujících dvou funkcí. Tato a obě následující funkce jsou používány funkcemi vga_drawpixel a vga_drawline.

void vga_setrgbcolor(int r, int g, int b);

Nastaví barvu v paletě RGB. Proměnné r, g, b musejí být v rozsahu 0–255. Funkce nebude fungovat v módech s 256 a méně barvami.

void vga_setegacolor(int color);

Tato funkce se snaží nastavit barvy, které se podobají barvám z EGA palety, a pracuje bez ohledu na hloubku daného módu. Platné hodnoty pro barvy:

  • 0 – černá
  • 1 – modrá
  • 2 – zelená
  • 3 – zelenomodrá(cyan)
  • 4 – červená
  • 5 – fialová
  • 6 – hnědá
  • 7 – šedá
  • 8 – temně šedá (světle černá)
  • 9 – světle modrá
  • 10 – světle zelená
  • 11 – světle modrozelená
  • 12 – světle červená
  • 13 – světle fialová
  • 14 – žlutá (světle hnědá)
  • 15 – bílá (světle šedivá)

int vga_drawpixel(int x, int y);

Funkce zobrazí na obrazovce barevný bod(pixel). Barvu musíte nastavit před voláním funkce jednou ze tří předchozích funkcí. Pro „rozlehlejší malování“ se tato funkce nehodí, použitelnější jsou následující tři.

int vga_drawscanli­ne(int line, unsigned char *color);

Nakreslí horizontální přímku přes celou obrazovku na řádek, který se specifikuje parametrem line. Pokud například funkci předáte hodnotu 60, bude napočítán 60. pixel od vrchu obrazovky a na tomto řádku bude nakreslena přímka. Barvy použité při kreslení jsou brány z color[0] až color[length-1].

int vga_drawscanseg­ment(unsigned char *colors, int x, int y, int length);

Tato funkce také nakreslí horizontální přímku, ta však není ohraničena okraji obrazovky. Levý okraj je udán souřadnicemi [x,y], pravý pak délkou přímky length od levého okraje. V high/true-color módech musí být length zadáno v bytech a ne v pixelech. Barvy jsou vybírány viz výše.

int vga_drawline(int x1, int y1, int x2, int y2);

Na rozdíl od výše popsaných funkcí tato nekreslí vodorovné přímky, ale přímky libovolně „posazené“ v rovině. Okraje přímky jsou udávány souřadnicemi [x1,y1] a [x2,y2]. Barva přímky se nastavuje pomocí funkcí vga_setcolor a vga_setrgbcolor. Tato funkce vždy vrací 0.

int vga_getpixel(int x, int y);

Přečte hodnotu jednoho pixelu z obrazovky. Tato funkce není příliš účinná, pokud chcete přečíst více pixelů ležících na řádku za sebou. Pro tyto účely je vhodnější funkce vga_getscansegment.

int vga_getscanseg­ment(unsigned char *colors, int x, int y, int length);

Tato funkce pracuje opačně než vga_drawscanseg­ment. Uloží hodnoty pixelů v řádku ohraničeném souřadnicemi [x,y] a [x, y + length] do pole o velikosti length – 1. A stejně jako u sesterské funkce musí být v high/true-color módech length udáno v bytech.

Tak už tedy umíte „něco“ nakreslit. To, co jsme doposud probrali, jsou jen základy, se kterými však lze vytvářet fungující programy. Příště se si povíme něco keyboard I/O a práci se stránkami.

Našli jste v článku chybu?
10. 9. 2004 18:41
BLEK. (neregistrovaný)

Vypada to tak, ze budes mit pres celou obrazovku pouze to, co si sam nakreslis. Zadne okraje okna, zadne titulni listy, zadny kurzor mysi (ten si musis taky ve svem programu nakreslit).