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_getdefaultmode(void); slouží k získání čísla výchozího módu, který je uložen v systémové proměnné SVGALIB_DEFAULT_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_getmodeinfo(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_getcurrentmode(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í.