GLUT (8): rozhraní pro vykreslování znaků

17. 6. 2003
Doba čtení: 5 minut

Sdílet

Jak již bylo napsáno v prvních dílech tohoto seriálu, v knihovně OpenGL neexistuje přímá možnost, jak vykreslovat znaky, protože jde o systémově závislou funkci. Na různých platformách a operačních systémech se používají rozdílné způsoby reprezentace a vykreslování znaků ve znakových sadách (bitmapové, vektorové, splajnové, úsekové apod.), různá kódování (EBCDIC, ASCII, Unicode) a způsoby výběru znakové sady. Knihovna GLUT poskytuje velmi jednoduché (jak z hlediska funkčnosti, tak z hlediska použití) funkční rozhraní pro vykreslování znaků.

Přímo v knihovně GLUT jsou uloženy znaky z několika znakových sad a dvou reprezentací (bitmapové a vektorové), které lze v aplikacích využívajících OpenGL a GLUT použít.

Vykreslování znaků

Programátora vytvářejícího lokalizované programy je nutné upozornit na to, že znaky v použitých znakových sadách neobsahují českou diakritiku. Některé fonty v knihovně GLUT obsahují pouze 96 znaků, protože je využito spodních sedm bitů ASCII kódování a obsaženy jsou znaky z ASCII kódem 32–127, tedy všechny zobrazitelné znaky bez znaků řídících a Del. Další fonty pak obsahují všech 256 znaků, ale pouze v kódování IBM.

V aplikaci lze použít dvou typů fontů – bitmapové a vektorové. U bitmapových fontů jsou jednotlivé znaky reprezentovány pomocí bitových map, tj. rastrových obrázků s bitovou hloubkou jeden bit na pixel. Výhodou bitmapových fontů je rychlost zobrazování a vizuální kvalita znaků, nevýhodou složité zvětšování a zmenšování písma. Znaky ve vektorových fontech jsou reprezentovány pomocí množiny krátkých úseček. Rychlost zobrazování je nižší než u bitmapových znaků, na druhou stranu lze vektorové znaky jednoduše zobrazit v různém zvětšení a náklonu.

Ukázkový příklad číslo 14

V tomto příkladu je ukázáno vykreslování bitmapových znaků z různých znakových sad. Jsou vykresleny znaky ze všech bitmapových znakových sad, které jsou v knihovně GLUT uloženy. Také je ukázána možnost vytvoření funkce, která vypíše obsah celého řetězce, což knihovna GLUT přímo neumožňuje.

Pro podporu vykreslování bitmapových znaků lze využít dvou funkcí: glutBitmapCha­racter(void *font, int character) a glutBitmapWid­th(void *font, int character). Funkce glutBitmapCha­racter() slouží pro vykreslení jednoho bitmapového znaku z vybraného fontu. Prvním parametrem této funkce je ukazatel na font, druhým parametrem ASCII kód vykreslovaného znaku. Podporovány jsou následující fonty (znakové sady):

GLUT_BITMAP8_BY13

neproporcionální font, kde každý znak je zobrazen v rastru 8×13 pixelů.
GLUT_BITMAP9_BY15 neproporcionální font, kde každý znak je zobrazen v rastru 9×15 pixelů.
GLUT_BITMAP_TI­MES_ROMAN10 proporcionální font z rodiny Times o velikosti deseti bodů.
GLUT_BITMAP_TI­MES_ROMAN24 proporcionální font z rodiny Times o velikosti 24 bodů.
GLUT_BITMAP_HEL­VETICA10 proporcionální font z rodiny Helvetica o velikosti deseti bodů.
GLUT_BITMAP_HEL­VETICA12 proporcionální font z rodiny Helvetica o velikosti dvanácti bodů.
GLUT_BITMAP_HEL­VETICA18 proporcionální font z rodiny Helvetica o velikosti osmnácti bodů.

Každý znak je vnitřně vykreslen voláním funkce z knihovny OpenGLglBitmap(), jedná se tedy o jednobarevnou bitmapu (nastavený bit reprezentuje barvu, vynulovaný bit reprezentuje „prázdno“, kde se nic nevykreslí). Pozice na obrazovce pro vykreslení znaku se nastaví funkcí glPosition2i(x, y). Funkcí glColor*() lze nastavit barvu vykreslovaných znaků. Po vykreslení každého znaku je automaticky proveden posun vykreslovací pozice o šířku daného znaku, takže je možné jednoduše vypisovat celé řetězce.

K dispozici je zdrojový kód čtrnáctého příkladu a zdrojový kód se zvýrazněnou syntaxí.

ukázka čtrnáctého příkladu

Ukázkový příklad číslo 15

Tento příklad demonstruje možnost zobrazení všech znaků z dané znakové sady. Po spuštění programu je možné pomocí kontextového pop-up menu vybrat některou znakovou sadu obsahující bitmapové znaky. Všechny tyto znaky jsou posléze zobrazeny. V neproporcio­nálních fontech je pro postupné zobrazení znaků za sebou nutné zjistit šířku znaků.

Pro získání šířky vykreslovaného znaku, která se v proporcionálních písmech mění, lze použít funkci glutBitmapWidth(), která má stejné parametry jako funkce glutBitmapCha­racter(). Tato funkce vrátí šířku zadaného znaku v pixelech. Výška znaku (resp. maximální výška mezi akcentem a dolní dotažnicí) se pro jednu znakovou sadu nemění, proto také neexistuje funkce pro její zjištění.

Při spuštění příkladu si lze všimnout, že ne všechny znakové sady obsahují celou sadu s kódy 0 až 255. Některé znakové sady dokonce obsahují pouze znaky sedmibitové ASCII, tj. ty, jež mají kód v rozmezí 0 až 127.

K dispozici je zdrojový kód patnáctého příkladu azdrojový kód se zvýrazněnou syntaxí.

ukázka patnáctého příkladu

Ukázkový příklad číslo 16

V tomto příkladu je ukázáno vykreslování vektorových znaků z různých znakových sad. Jsou vykresleny znaky ze všech vektorových znakových sad, které jsou v knihovně GLUT uloženy. Také je ukázána možnost vytvoření funkce (printStringU­singGlutVector­Font()), která vypíše obsah celého řetězce, což knihovna GLUT (podobně jako u bitmapových znakových sad) přímo neumožňuje.

Pro podporu vykreslování vektorových znaků lze využít dvou funkcí: glutStrokeCha­racter() a glutStrokeWidth(). FunkceglutStro­keCharacter(vo­id *font, int character) (podobně jako glutBitmapCha­racter()) slouží pro vykreslení jednoho vektorového znaku z vybraného fontu. Prvním parametrem font této funkce je ukazatel na font, druhým parametrem character je ASCII kód vykreslovaného znaku. Podporovány jsou pouze dvě následující znakové sady (fonty):

GLUT_STROKE_ROMAN

proporcionální vektorové písmo obsahující pouze znaky s ASCII hodnotou 32–127. Maximální výška těchto znaků je 119.05 bodů, dolní dotažnice má výšku 33.33 bodů.
GLUT_STROKE_MO­NO_ROMAN neproporcionální vektorové písmo obsahující pouze znaky s ASCII hodnotou 32–127. Maximální výška znaků je 119.05 bodů, dolní dotažnice má výšku 33.33 bodů. Všechny znaky mají stejnou šířku 104.76 bodů.

Ve funkci printStringUsin­gGlutVectorFon­t() je naznačeno, jakým způsobem lze nastavit počátek vykreslování znaků a velikost písma. Jelikož se vektorové písmo skládá z krátkých úseček vykreslovaných pomocí funkcí OpenGL, lze použít funkce pro změnu Modelview matice, tj. – glTranslatef(), glRotatef() a glScalef(). Tyto funkce potom ovlivňují umístění znaků a jejich velikost a orientaci.

K dispozici je zdrojový kód šestnáctého příkladu a zdrojový kód se zvýrazněnou syntaxí.

ukázka šestnáctého příkladu

Ukázkový příklad číslo 17

Tento příklad demonstruje možnost zobrazení všech znaků z dané znakové sady vektorového písma. Po spuštění programu je možné pomocí kontextového pop-up menu vybrat některou znakovou sadu obsahující vektorové znaky. Každou znakovou sadu lze zobrazit ve více velikostech. Všechny znaky vybrané znakové sady jsou posléze zobrazeny. V neproporcionálním písmu GLUT_STROKE_ROMAN je pro postupné zobrazení znaků za sebou nutné zjistit šířku znaků. To lze zajistit voláním funkce glutStrokeWidth(), která má stejné parametry jako funkce glutStrokeCha­racter().

Vlastní vykreslení znaků provádí funkce printAllChars(), ve které je pro přechod na nový řádek použito volání glTranslatef().

K dispozici je zdrojový kód sedmnáctého příkladu a zdrojový kód se zvýrazněnou syntaxí.

ict ve školství 24

ukázka sedmnáctého příkladu

V další části seriálu bude ukázána tvorba a vykreslení základních trojrozměrných těles, které můžeme vytvořit pomocí knihovny GLUT.

Autor článku

Vystudoval VUT FIT a v současné době pracuje na projektech vytvářených v jazycích Python a Go.