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_OpenFontIndex, 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_RenderText_Solid,
TTF_RenderText_Shaded a TTF_RenderText_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.
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_SetFontOutline. 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.
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_FontFaceIsFixedWidth) - 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_FontFaceFamilyName) a názov aktuálnej font face (TTF_FontFacesStyleName). 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_GlyphIsProvided, 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 podmienkamiStiahnuté 761x (9.55 MB)