Hlavní navigace

SVGAlib (15)

Jakub Matys

V dnešním dílu povídání o knihovně svgalib, resp. vgagl, se budeme věnovat základním kreslícím funkcím. Než na ně však "hupsneme", povíme si ještě něco, co jsme nestihli v minulém dílu.

Ještě než se pustíme do samotného kreslení, řekněme si něco málo o dalších funkcích pro nastavení grafického výstupu.

První funkcí je gl_setscreenof­fset. Návratovým typem je void a funkce přebírá jeden argument typu int. Funkce nastaví offset video paměti v pixelech. Offset využívají funkce copyscreen(3), copyboxcontext(3) a copyboxgromcon­text(3). Při použití page-flippingu je nezbytné podle potřeby offset nastavit. Po zavolání funkce copyscreen je offset vrácen na 0.

Další funkcí je gl_setdisplays­tart. Funkce vrací typ vga a přebírá dva argumenty typu int. Tyto argumenty zadávají pozici (x, y), kde bude začínat virtuální obrazovka programu. Tato funkce může být použita ve shodě s hardwarovým rolováním obrazu nebo page-floppingem. Před použitím této funkce se ubezpečte, že šířka zadávaného řádku je menší než šířka fyzické obrazovky nebo stejná.

Když už jsme u page-flippingu, funkce, která jej aktivuje, se jmenuje gl_enablepage­flipping. Vrací int a argumentem je ukazatel na typ GraphicalContext. Funkce tedy povoluje page-flipping, zároveň také umožňuje trojité bufferování ve funkci gl_copyscreen (pokud to však umožňuje grafický kontext). Funkce vrací 3, pokud bylo použito trojité bufferování, 2 pro page-flipping a 0, pokud neuspěla.

Kreslení

A konečně můžeme začít malovat!

První funkce se nám bude určitě velice hodit, vyplní totiž obrazovku zvolenou barvou. Přebírá jeden argument typu int – to je ta barva;o). Jmenuje se gl_clearscreen.

Funkce gl_rgbcolor vrací hodnotu pixelu (typ int), který obsahuje barvu. Barva je funkci předána pomocí třech argumentů typu int v pořadí r, g, b. Hodnota pixelu vrácená funkcí se liší kontext od kontextu. Tuto funkci používá gl_setpixelrgb.

Jednoduchou funkcí pro nastavení barvy pixelu je gl_setpixel. Funkce vrací typ void a přebírá tři argumenty int. První dva udávají umístění pixelu(x,y) a třetí obsahuje barvu pixelu. Barvy nastavené funkcí jsou korektní pouze u módů s méně než 8bitovými barvami.

Další „barvící“ funkcí je gl_setpixelrgb. Funkce přebírá pět argumentů typu int. První dva udávají umístění pixelu (x, y), další pak RGB kombinaci (každá proměnná smí nabývat hodnot v rozmezí 0–255). Pokud používáte 256 barevný mód, má tato funkce smysl, pouze pokud máte nastavenu nějakou RGB paletu (funkce gl_setpalette – man 3).

Občas je nutné zjistit barvu určitého pixelu, tento problém vyřeší funkce gl_getpixel. Argumentem jsou souřadnice zkoumaného pixelu, vrácenou hodnotou pak je int. Vrácená barva je ve formátu použitelném pro aktuální kontext. Funkce vrací -1, pokud souřadnice ukazují mimo ohraničené pole okna.

A jak už bývá zvykem další funkce bude pracovat s barvou v kódování RGB – void gl_getpixelrgb(int x, int y, int *r, int *g, int *b). Tato funkce naplní ukazatele r, g a b hodnotami 0 až 255.

Pokud chcete kreslit přímku, která leží „vodorovně“ s osou x, můžete využít funkce gl_hline. Funkce je typu void a přebírá čtyři parametry (všechny jsou typu int). První udává počáteční bod na ose x, druhý „výšku čáry“, tedy vzdálenost na osey, třetí konečný bod na ose x a konečně čtvrtý barvu, ve které se přímka zobrazí. Nezapomeňte, že hodnota prvního argumentu nesmí být větší než hodnota třetího, jinak funkce neudělá nic.

Přímku ležící „šejdrem“ nakreslíte funkcí gl_line. Ta přebírá pět argumentů typu int. První dvě dvojice obsahují souřadnice krajních bodů, poslední argument udává barvu přímky. Může se stát, že při výměně souřadnicových dvojic nebude dodržena stejná trajektorie přímky.

Pro kreslení kruhu použijte funkci void gl_circle(int x, int y, int r, int c). x a y jsou souřadnice středu kruhu, r je poloměr a c je barva kruhu.

Poslední dnešní funkcí je gl_fillbox. Ta přebírá pět argumentů. První dva jsou souřadnicí počátku kresleného čtyřúhelníku, další dva udávají šířku a výšku a poslední barvu, kterou se čtyřúhelník vyplní.

To by bylo pro dnešek vše, příště se podíváme na použití písem v knihovně.

Našli jste v článku chybu?