Hlavní navigace

SVGAlib

Jakub Matys

Vítám vás u nového seriálu, který se bude zabývat grafickou knihovnou svgalib. V následujících několika článcích společně probereme řadu funkcí, které nám knihovna nabízí. V dnešním dílu se podíváme i na to, jak knihovnu inicializovat a nastavit grafický mód...

Svgalib je nízkoúrovňová grafická knihovna pro Linux. Je určena pro programátory vyvíjející programy v textovém módu, kteří potřebují pracovat s grafickými prvky s určitým komfortem (příkladem mohou být hry).

Knihovna vychází z VGAlib, která podporovala mnoho standardních VGA módů. Svgalib přebrala podporu těchto módů a přidala podporu některých grafických čipsetů. Díky těmto ovladačům je možné pracovat i ve vyšších rozlišeních (např. SVGA ;)). Také byly opraveny chyby v knihovně VGAlib, některé byly např. způsobeny zpracováváním signálů SIGEGV, SIGFPE, SIGILL a dalších.

Knihovna interně používá signálů SIGUSR1 a SIGUSR2 k přepínání konzole, pokud potřebujete signály používat k jiné činnosti, můžete editovat hlavičkový soubor libvga.h a poté knihovnu znovu přeložit. Veškerá instalační nastavení se přepisují v souboru Makefile.cfg a samotná kompilace a instalace se spustí příkazem make install. Další informace ohledně nastavení naleznete v instalační dokumentaci.

Jako u každého programu v C je nutné uvést na začátek kódu příslušný hlavičkový soubor. Pro svgalib je to #include <vga.h>, pokud nebudete používat myš a nebufferovanou klávesnici. Před započetím práce s knihovnou je nutné nejprve provést inicializaci. O to se postará funkce vga_init() (pozn.: všechny funkce z balíku svgalib mají předponu vga_), která provede detekci čipsetu a nastaví práva superuživatele. Deklarace funkce je:

int vga_init(void);

Vrací –1, pokud nemůže alokovat grafický subsystém, nebo 0, pokud je vše v pořádku. Chcete-li se vyhnout autodetekci, musíte před inicializací nastavit čipset sami. K tomuto účelu slouží fukce void vga_setchipset(int chipset);. Místo čísla čipsetu můžete použít symbolickou konstantu – ty jsou definovány ve vga.h. Podrobnější informace k čipsetům získáte v manuálových stránkách a v dokumentaci.

Po inicializaci je ještě nutné nastavit správný video mód. Mód může být textový (tj. 25×80 znaků), nebo grafický. U grafického módu můžete nastavit rozlišení a barevnou hloubku. Názvy grafických módů začínají písmenem G, následuje rozlišení (např. 640×480) a barevná hloubka. Takže nám vychází třeba G640×480×256. Než se naučíme mód nastavovat, ukažme si několik funkcí k zjištění módu (ať už aktuálního, či nějakého jiného).

int vga_getdefaultmo­de(void); slouží k získání čísla výchozího módu, který je uložen v systémové proměnné SVGALIB_DEFAUL­T_MODE. Není-li tato proměnná definována, vrátí funkce –1.

Následující dvě funkce mají za úkol převádět čísla módů na jejich jména a naopak.

char *vga_getmodename(int mode);
int vga_getmodenumber(char *name);

Další z funkcí zjišťujících informace je vga_modeinfo *vga_getmodein­fo(int mode);. Tato funkce zapisuje informace o módu do struktury vga_modeinfo. Jednotlivé položky struktury:

typedef struct {
 int width;
 int height;
 int bytesperpixel;
 int colors;
 int linewidth;
 int maxlogicalwidth;
 int startaddressrange;
 int maxpixels;
 int haveblit;
 int flags;
/* Extended fields, not always available: */
 int chiptype;
 int memory;
 int linewidth_unit;
 char *linear_aperture;
 int aperture_size;
 void (*set_aperture_page) (int page);
 void *extensions;
} vga_modeinfo;

Více informací o struktuře získáte v manuálových stránkách funkce. Pokud je číslo módu větší než rozsah, vga_getmodeinfo() vrací NULL.

int vga_getcurren­tmode(void); vrací číslo aktivního módu.

A konečně funkce, která vám umožní nastavit video mód – int vga_setmode(int mode);. Pokud se jedná o grafický mód, nejen že ho nastaví, ale dokonce obrazovku vyčistí (clears the screen). Nastavení módu by mělo být první akcí po inicializaci knihovny. Funkce vrací 0 při úspěšném nastavení módu, jinak –1.

Tyto funkce by měly představovat základ. Příště se podíváme na jiné funkce, které nám umožní další a další nastavení.

Našli jste v článku chybu?