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?