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?

21. 2. 2005 13:04

Krakora Jan (neregistrovaný)
Pratele, kdo by mel zajem, mam kus C kodu, z ktereho lze vycist jak na renderovane pismo v SVGALib s pouzitim FreeTypeII knihovny. Pouzil jsem to v jednom projektu a prijde mi skoda, aby to propadlo v zapomeni.
Lupa.cz: Proč firmy málo chrání data? Chovají se logicky

Proč firmy málo chrání data? Chovají se logicky

Měšec.cz: Zdravotní a sociální pojištění 2017: Připlatíte

Zdravotní a sociální pojištění 2017: Připlatíte

Podnikatel.cz: Přehledná titulka, průvodci, responzivita

Přehledná titulka, průvodci, responzivita

Vitalia.cz: Nestlé vyvinulo nový typ „netloustnoucího“ cukru

Nestlé vyvinulo nový typ „netloustnoucího“ cukru

Podnikatel.cz: EET: Totálně nezvládli metodologii projektu

EET: Totálně nezvládli metodologii projektu

Vitalia.cz: Taky věříte na pravidlo 5 sekund?

Taky věříte na pravidlo 5 sekund?

Podnikatel.cz: Udávání a účtenková loterie, hloupá komedie

Udávání a účtenková loterie, hloupá komedie

Vitalia.cz: Jmenuje se Janina a žije bez cukru

Jmenuje se Janina a žije bez cukru

120na80.cz: Co všechno ovlivňuje ženskou plodnost?

Co všechno ovlivňuje ženskou plodnost?

Lupa.cz: Teletext je „internetem hipsterů“

Teletext je „internetem hipsterů“

Měšec.cz: Kdy vám stát dá na stěhování 50 000 Kč?

Kdy vám stát dá na stěhování 50 000 Kč?

Lupa.cz: Propustili je z Avastu, už po nich sahá ESET

Propustili je z Avastu, už po nich sahá ESET

Podnikatel.cz: Chaos u EET pokračuje. Jsou tu další návrhy

Chaos u EET pokračuje. Jsou tu další návrhy

Vitalia.cz: Znáte „černý detox“? Ani to nezkoušejte

Znáte „černý detox“? Ani to nezkoušejte

Měšec.cz: Air Bank zruší TOP3 garanci a zdražuje kurzy

Air Bank zruší TOP3 garanci a zdražuje kurzy

Lupa.cz: Co se dá měřit přes Internet věcí

Co se dá měřit přes Internet věcí

Podnikatel.cz: Snížení DPH na 15 % se netýká všech

Snížení DPH na 15 % se netýká všech

Vitalia.cz: Spor o mortadelu: podle Lidlu falšovaná nebyla

Spor o mortadelu: podle Lidlu falšovaná nebyla

Vitalia.cz: Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

Láska na vozíku: Přitažliví jsme pro tzv. pečovatelky

120na80.cz: Pánové, pečujte o svoje přirození a prostatu

Pánové, pečujte o svoje přirození a prostatu