Hlavní navigace

SVGAlib (16)

Jakub Matys

V dnešním dílu si probereme další důležitou pasáž knihovny. Jedná se o práci s fonty - naučíme se měnit typy fontů, jejich barvu a nakonec je i tisknout.

První funkcí, kterou si dnes ukážeme, je gl_setfont. Její funkční prototyp je void gl_setfont(int fw, int fh, void *fp). Funkce použije font uložený na adrese, kam ukazuje fp, jako základní. Tento font musí být uložen jako bitmapová data se znaky o velikosti fw x fh. Pokud není nastaven bit FONT_COMPRESSED (viz níže), musíte font nejdříve dekomprimovat (protože fonty jsou ukládány s „kompresí“ bit-per-pixel).

Když už máme nastavený font, musíme mu také přiřadit barvu. To se provádí funkcí gl_setfontcolors. Jejími parametry jsou dvě celočíselné hodnoty, které udávají barvu pozadí a popředí komprimovaného fontu. Funkce vrací typ void.

Funkce void gl_expandfont(int fw, int fh, int c, void *sfp, void *dfp) konvertuje znaky uložené „bit-per-pixel“ na nekomprimovaný font. Data pro konverzi jsou brána z adresy sfp, přičemž musí obsahovat 256 znaků o velikosti fw x fh. Dekomprimovaný font je poté uložen na adresu dfp (jeho velikost je 256 * fw * fw * BYTEPERPIXEL). Všechny nenulové pixely jsou navíc nastaveny na barvuc.

Pro nastavení barvy textu nekomprimovaných fontů použijeme funkci void gl_colorfont(int fw, int fh, c, void fp). Ta nastaví všechny nenulové pixely na adrese fb na barvu c. fb obsahuje data s 256 znaky o velikosti fw x fh.

void gl_setwritemode(int m) slouží k nastavení konfiguračních příznaků písem. Parametrem je součet bitů z následujících dvou skupin:

WRITEMODE_MASKED
WRITEMODE_OVER­WRITE
(default)

  • Pokud je nastaven bit WRITEMODE_MASKED, jsou pro zapisovací operace použity pouze pixely v popředí – původní pozadí obrazovky není vymazáno.

FONT_COMPRESSED
FONT_EXPANDED
(default)

  • Pokud je nastaven bit FONT_COMPRESSED, text zapsaný na obrazovku bude používat komprimovaný „bit-per-pixel“ font, přičemž nekomprimovaný font může být rychlejší.

Funkce pro nastavení fontů by nám však nebyly k ničemu, kdybychom neměli k dispozici funkce pro zápis na obrazovku…

void gl_write(int x, int y, char *s);
void gl_writen(int x, int y, int n, char *s);

gl_write zapisuje řetězec s ukončený nulovým znakem na pozici x, y, přičemž používá aktuálně nastavený font.

gl_writen pracuje obdobně, ale vypíše maximálně n znaků, pokud nenarazí na ‚\n‘.

Způsob zapisování dat na obrazovku je nastaven funkcí gl_setwritemode. Před použitím funkcí musíte nastavit font, který hodláte používat. Např.:

gl_setfont(8, 8, font8x8);
gl_setwritemode(FONT_COMPRESSED + WRITEMODE_OVERWRITE);
gl_setfontcolors(0, vga_white());

Funkce int gl_printf(int x, int y, const char *fmt, …); pracuje obdobně jako printf(3), zapisuje fomátovaný řetězec na pozici x, y, přičemž používá aktuální font. Pokud je x nebo y (nebo oba údaje) negativní, je text tisknut na poslední pozici. Speciální znaky \b, \r, \n, \a, \t a \v mají běžný efekt. Pro používání funkce platí stejná pravidla jako výše.

extern unsigned char *gl_font8×8;: gl_font8×8 obsahuje zapakovaný font s 8×8 pixely na znak, který můžete použít pro vaše vgagl programy. Před použitím by se měl dekomprimovat funkcí gl_expandfont.

To by bylo pro dnešek vše, příště se naučíme pracovat s pix- a bitmapami.

Našli jste v článku chybu?