IT rekvalifikácia. Seniorní programátori zarábajú až 6 000 €/mesiac a rekvalifikácia je prvým krokom. Zisti, ako na to!

5. diel - SDĽ - Vykreslenie textu

V dnešnom diele sa pozrieme na vykresľovanie textu v SDL. Pretože vykresľovanie textu nie je zabudované v SDL, budeme musieť použiť opäť jedno z rozšírenia. Tentoraz to bude SDL_ttf. Stiahneme vývojársku verziu pre Visual Studio. Rovnako ako pre SDL a SDL_Image, pridáme zložky include a lib / x64 do "* Include Directories " a " Library Directories ". Pridáme knižnicu SDL_ttf.lib a nezabudne nakopírovať všetky dynamické knižnice (.dll súbory) do zložky Output. Teraz by sme mali byť schopní includovat súbor SDL2_ttf.h. Na začiatok súboru pridáme tentoraz TTF_Init a na koniec *TTF_Quit. Ak sme všetko urobili správne, projekt by mal ísť stále bez problémov spustiť. Dokumentácia na knižnici je dostupná tu.

Práca s fontami v rozšírení SDL_ttf

Aby sme mohli vyskúšať prácu s fontami, musíme mať font, na ktorom budeme aplikáciu testovať. Ja som zvolil Playfair font. V priečinku projektu vytvoríme novú zložku Fonts, do ktoré súbory nakopírujeme. Opäť v Pre-build Events nastavíme, aby sa nám zložka skopírovala do zložky výstupnej.

Na otvorenie súboru máme jednoduchú funkciu TTF_OpenFont. Tá otvorí súbor s fontom (podporuje TTF a OTF) a nastaví mu veľkosť zadanú druhým parametrom. Pozor, táto veľkosť neudáva výšku v pixeloch. Obdobnú funkciou je SDL_OpenFontIn­dex, ktorá otvorí súbor a v ňom face font, ktorý je zadaný posledným parametrom. Teraz sa už spravidla dávajú rôzne face fonty do samostatných súborov, preto funkciu moc nevyužijeme. K obom týmto funkciám sú ich ekvivalenty, ktoré pracujú s SDL_RWops štruktúrou. Ako sme si povedali, tá slúži ako abstrakcie operácií so súbormi. O týchto funkciách si povieme viac, až budeme túto abstrakciu poznať.

Rovnako ako všetky ostatné štruktúry v SDL. Aj TTF_Font musíme uvoľniť. Slúži na to funkcia TTF_CloseFont.

Vykreslenie textu

Pre vykresľovanie textu máme prakticky tri funkcie, každá má ale štyri rôzne variácie pre rôzne kódovanie. Funkcia rozlišujú klasický ASCII text, ďalej UNICODE a UTF8. Štvrtá variácie slúži pre vykreslenie jediného UNICODE znaku (Glyph).

Ony tri funkcie sú TTF_RenderTex­t_Solid, TTF_RenderTex­t_Shaded a TTF_RenderTex­t_Blended. Text môžeme vždy nahradiť jednou z vyššie zmienenú variácií, preto máme tiež napríklad TTF_RenderUTF8_Solid. Všetky funkcie nájdeme v dokumentácii. O rozdielu týchto troch funkcií najlepšie vypovedá nasledujúci obrázok.

rozdielne variácie - SDĽ

Solid je orientovaný na výkon, ale nevyzerá tak dobre. SDL, ako najrýchlejšie to dokáže, vykreslí text do SDL_Surface, ktorý vráti. Naproti tomu Blended využíva i transparentnosti (nie všetky pixely sú plne viditeľné) a tak sa zdá, že sú kraje lepšie zaoblené. Samozrejme zároveň s tým rastie čas, ktorý SDL potrebuje na vytvorenie SDL_Surface s textom. Posledný prípad je Shaded, ktorý je vlastne rovnaký ako Blended, iba mu ako posledná parameter pridáme farbu pozadia, ktorú vykreslí zároveň s textom. Táto aplikácia bude pribalená pod článkom.

Atribúty textu

Niektoré atribúty textu môžeme nastaviť, niektoré sú len na čítanie. Najprv spomenieme tie, ktoré nastaviť môžeme, pretože s tými budeme pracovať najčastejšie. Potom zmienim ostatné funkcie.

Medzi najdôležitejšie funkciu bude patriť nesporne TTF_SetFontStyle. Touto funkciou nastavujeme štýly ako TTF_STYLE_BOLD alebo TTF_STYLE_ITALIC - tučné písmo alebo kurzíva. Všetky možnosti sú uvedené v dokumentácii. Ďalšou funkciou, ktorú budeme potrebovať, je TTF_SetFontOu­tline. Ak nastavíme Outline na 0, bude sa písmo farbou vyplňovať. Akákoľvek iná kladná hodnota značí hrúbku čiary, ktorú bude písmo obtiahnuté. Na nasledujúcom obrázku vidíme efekt, kedy je Outline nastavená na 4.

Outline demo - SDĽ

Nastaviť môžeme i tzv. Hintingu. Hintingu predovšetkým "doostruje" písmo tým, že zlepší kontrast jeho okrajov. Hintingu je dôležitý predovšetkým pre displeje s nízkym rozlíšením. Väčšia rozbor tejto technológie je mimo obsah tohto seriálu, preto odkázať na Wikipédii. Ďalšia vec, ktorú môžeme nastaviť, je font kerning. Kerning je přesahování znaku znakom novým. Opäť Odkazy na Wikipédii.

Ďalej tu máme funkcie pre zisťovanie informácií o fontu. Môžeme získať počet font faces (TTF_FontFaces), či je šírka každého písmená rovnaká (TTF_FontFace­IsFixedWidth) - tzv. Monospaced písmo. Používa sa napríklad v príkazovom riadku alebo tu na sieti v ukážkach kódu. Ďalej môžeme zistiť, ako sa volá rodina jazykov (TTF_FontFace­FamilyName) a názov aktuálnej font face (TTF_FontFaces­StyleName). Môžeme vidieť, že sú to funkcie, ktoré často v aplikácii (v hre) využívať nebudeme. Posledné dve funkcie sú ale o niečo užitočnejšie. Prvá funkcia je TTF_GlyphIsPro­vided, ktorá vracia 0, ak zadaný znak font nedokáže vykresliť. Posledná funkcia je TTF_GlyphMetrics, ktorá vracia údaje o veľkosti zadaného znaku. Než vysvetľovať jednotlivé body, opäť presmerujem na dokumentáciu, kde je aj ukážkový obrázok, ktorý jednotlivé pojmy vysvetľuje. Tieto funkcie použijeme hlavne vo chvíli, keď chceme znak alebo reťazec umiestniť presne na určité miesto a rozhodujú pixely.

Posledná skupina funkcií, ktoré preberieme, je podobná tým vykreslovacím. Opäť je samostatná funkcia pre Text, UNICODE aj pre UTF8. Jedná sa o funkciu Size (TTF_SizeText), ktorá vracia veľkosť SDL_Surface, ktorá by bola potreba pre daný text. Žiadne vykresľovanie sa však nekoná, preto je funkcia efektívnejšia než keby sme písmo vykreslili a potom zisťovali veľkosť SDL_Surface. Ak nepotrebujeme text ďalej nikde vykresliť, ale iba zistiť miesto, ktoré zaberie, použijeme práve túto funkciu (napríklad pri plánovaní rozvrhnutie).

Pre dnešný diel je to všetko. V tom budúcom sa hlbšie ponoríme do práce s SDL_Surface a to vrátane priamej manipulácie s pixelmi.


 

Stiahnuť

Stiahnutím nasledujúceho súboru súhlasíš s licenčnými podmienkami

Stiahnuté 761x (9.55 MB)

 

Predchádzajúci článok
SDĽ - Práca s obrázkami
Všetky články v sekcii
SDĽ
Preskočiť článok
(neodporúčame)
SDĽ - Práca s 8bitovou grafikou
Článok pre vás napísal Patrik Valkovič
Avatar
Užívateľské hodnotenie:
Ešte nikto nehodnotil, buď prvý!
Věnuji se programování v C++ a C#. Kromě toho také programuji v PHP (Nette) a JavaScriptu (NodeJS).
Aktivity