Hlavní navigace

SVGAlib (14) - vgagl

4. 2. 2005
Doba čtení: 3 minuty

Sdílet

Po delší pauze se znovu shledáváme u seriálu o SVGALIB. Dnešním dílem začneme probírat další součást svgalib, která je s ní standardně dodávána. Jedná se o knihovnu vgagl. Jak název napovídá, vgagl spojuje "přednosti" OpenGL a VGAlib.

Knihovna vgagl je použitelná pro módy truecolor, hicolor a mód s 256 barvami. Knihovna používá omezený počet funkcí z svgagl, které zajišťují low-level komunikaci s hardwarem.

Svgalib mapuje VGA framebuffer o velikosti 64 k a vgagl tento framebuffer přímo adresuje. Pro SVGA módy, které používají buffery s více než 64 k pro virtuální obrazovku, je při zapisování do fyzické paměti požádováno SVGA stránkování. Tato operace je však prováděna automaticky.

Je možné také používat více virtuálních stránek, ty poté můžete libovolně kopírovat na fyzickou obrazovku. Pro vícebarevné módy (hi, true) je zahrnuta podpora čtyř bytů na pixel (a konverze do tříbytového kontextu).

Jednoduché 256barevné módy (dostupné na všech VGA kartách) mohou být použity s virtuálními obrazovkami, které jsou kopírovány do fyzické paměti (s optimálním page-flippingem). Samozřejmostí je také podpora grafických akcelerátorů (pokud náhodou nevlastníte archaickou videokartu).

Co se týče grafického kontextu, zatím stačí vědět, že to je určitá datová struktura zahrnující informace o velikosti asociované grafické obrazovky, o její organizaci, oříznutí atd. Grafický kontext se definuje funkcí setcontextvir­tual(), kterou můžete vidět na konci článku.

Použití vgagl se neliší od používání jiných knihoven. Na začátek zdrojového souboru musíme zadat příkaz #include <vgagl>. Při překladu je nutné ještě zadat přepínače -lvgagl -lvga (to kvůli slinkování s knihovnou – pro ty, kdo to vidí poprvé:-).

Všechny funkce, které jsou definovány v knihovně, mají předponu gl_. Než však začnete pracovat s knihovnou, musíte mít nastavený grafický kontext, např.:

vga_setmode(G320x200x256);
gl_setcontextvga(G320x200x256);

Po provedení těchto příkazů je kontext nastaven na velikost fyzické obrazovky. Funkce gl_setcontextvga musí být volána až po vga_setmode. Protože knihovna vgagl pracuje pod svgalib, musí se inicializovat až po ní. Parametrem funkce je integer, který označuje mód obrazovky, makra módů jsou definována ve vga.h.

Grafický kontext může být také uložen do proměnné (uloží se samozřejmě typ obrazovky a ne její obsah):

GraphicsContext physicalscreen;
gl_getcontext(&physicalscreen);

Uložení kontextu je realizováno zkopírováním kontextových dat z globální proměnné currentcontext, která je definována ve vgagl.h. Pracovat s proměnnou currnetcontext přímo není doporučeno a mělo by se využívat knihovních maker a funkcí. Definici virtuální obrazovky provedete takto:

gl_setcontextvgavirtual(G320x200x256);

Příkaz alokuje místo pro obrazovku totožnou s 320×200×256 módem a vytvoří pro ní grafický kontext. Virtuální obrazovku můžete nyní zkopírovat na fyzickou obrazovku:

gl_copyscreen(&physicalscreen);

Další funkcí pracující s kontextem je void gl_setcontext(Grap­hicsContext *gc). Tato funkce má, jak sám název napovídá, za úkol nastavit dříve uložený kontext do proměnné currentcontext.

Funkce uvolňující kontext z paměti se nazívá gl_freecontext. Jejím parametrem je ukazatel na odstraňovaný kontext. Funkce vrací typ void.

Pokud potřebujete nastavit velikost kontextu explicitně, např. potřebujete pracovat jen s výřezem obrazovky, můžete použít funkce gl_setcontextwid­th a gl_setcontexthe­ight. Obě funkce vracejí void a jejich parametry jsou integery rozměrů, které požadujete. Rozměry se udávají od levého horního rohu obrazovky (w, h).

CS24_early

Funkce void gl_setcontextvir­tual(int w, int h, int bpp, int bitspp, void *vbuf) definuje aktuální grafický kontext s šířkou w, výškou h, bpp byty na pixel, bitspp významnými barevnými bity na pixel (8, 15, 16, 24) a s ukazatelem na framebuffervbuf. Je tedy možné například nastavit kontext se čtyřmi byty a 24 bity na pixel.

V příštím dílu začneme už pomocí vgagl kreslit jednoduché obrazce. Máte se tedy na co těšit.

Seriál: SVGAlib

Byl pro vás článek přínosný?

Autor článku