Image
7.6.2016 0 Comments

ASSEMBLER pod Windows: Písmo (7. časť)

Späť na úvod >> Späť na programovanie >> Späť na seriál

ASM webové linky

V tomto pokračovaní si ukážeme, ako zobraziť ľubovoľný typ písma vo farbe zloženej zo zložiek RGB.

Typy písiem

Windows podporuje dve základné kategórie písiem: písma GDI a písma zariadení. Písma GDI sú uložené v súboroch na pevnom disku. Písma zariadení sú vlastné písma daného zariadenia (napr. tlačiareň obsahuje niekoľko písiem v pamäti ROM). Písma GDI rozdeľujeme na rastrové písma, čiarové písma a písma TrueType. Rastrové písma sa označujú ako bitmapové písma, pretože každý znak je definovaný ako bitová mapa. Každé rastrové písmo je určené pre konkrétnu rozlišovaciu schopnosť a veľkosť znakov. Z rastrového písma je možné jednoducho vytvoriť písmo zväčšené tým, že sa zduplikujú jeho riadky a stĺpce. Preto sa rastrové písmo označuje ako „nonscalable“ – písmo s nemennou veľkosťou. Nemožno ho zmenšiť alebo zväčšiť na ľubovoľnú veľkosť. Hlavnou výhodou rastrových písiem je dobrá čitateľnosť a rýchlosť vykresľovania. V systéme Windows existujú tieto rastrové písma: System (SYSTEM_FONT), FixedSys (SYSTEM_FIXED_FONT), Terminal (OEM_FIXED_FONT), Courier, MS Serif, MS Sans Serif (DEFAULT_GUI_FONT), Small Fonts.

Čiarové písmo je definované ako postupnosť čiarových úsekov. Čiarové písmo je možné plynulo zväčšovať, takže rovnaké písmo sa dá použiť na grafických výstupných zariadeniach s ľubovoľným rozlíšením. Písmo sa dá zväčšiť alebo zmenšiť na ľubovoľnú veľkosť. Pri malých rozmeroch klesá čitateľnosť. Čiarové písma sú veľmi výhodné pre plottery. Čiarové písma sa volajú Modern, Roman, Script. Pri rastrových aj čiarových písmach CGI sú Windows schopné syntetizovať tučnosť, kurzívu, podčiarknutie a preškrtnutie, pričom nie je potrebné pre jednotlivé parametre vytvárať samostatné písma. Napríklad pri kurzíve sa posunie horná polovica znaku doprava.

Jednotlivé znaky v písmach TrueType sú definované ako vyplnené oblasti ohraničené úsečkami a krivkami. TrueType fonty sú: Courier New, Courier New Bold, Courier New Italics, Courier New Bold Italics, Times New Roman, Times New Roman Bold, Times New Roman Italics, Times New Roman Bold Italics, Arial, Arial Bold, Arial Italics, Arial Bold Italics atď. Courier New je neproporcionálne písmo, ktoré bolo navrhnuté tak, aby napodobňovalo výstup z „historického“ hardvérového zariadenia, známeho ako písací stroj. Times New Roman pochádza z písma Times, pôvodne navrhnutého pre noviny Times of London. Pokladá sa za veľmi dobre čitateľné písmo. Písmo Arial je odvodené od písma Helvetica. Pri TrueType písmach si môžete všimnúť, že štýly Bold a Italics pri Courier, Times New Roman a Arial sú vlastne samostatné písma s vlastnými menami. V programoch sa väčšinou štýly ako Bold a Italics zobrazujú ako vlastnosti konkrétneho písma. V klasickej typografii sa písmo vyberá podľa mena rezu a veľkosti. Veľkosť sa vyjadruje v bodoch. V USA sa v tzv. monotypovom systéme používa základná jednotka pica = 4,233 mm. Pica má 12 bodov, jej bod 0,353 mm. Táto odlišnosť je spôsobená používaním inej mernej sústavy v Severnej Amerike; rozmer 6 pica zodpovedá 1 palcu (inch), 1 palec = 25,4 mm. V neprofesionálnej praxi si však netreba s týmto rozdielom zhruba 6 % medzi americkým a európskym bodom lámať hlavu.

Logické písmo

Logické písmo je objekt GDI, ktorého handle je uložený v premennej typu HFONT. Logické písmo je opis písma. Rovnako ako logické písmo alebo logický štetec je to abstraktný objekt, ktorý je funkčný až v okamihu, keď ho aplikácia vyberie do kontextu zariadenia volaním funkcie SelectObject. Pri logickom pere môžete napríklad nastaviť ľubovoľnú farbu. Treba si však uvedomiť, že ak pero vyberiete do kontextu zariadenia, Windows ho skonvertuje na niektorú z farieb, ktoré dané zariadenia poskytuje.

Logické písmo sa vytvára volaním funkcie CreateFont alebo CreateFontIndirect. Funkcia CreateFontIndirect pracuje s ukazovateľom na štruktúru LOGFONT, ktorá sa skladá zo 14 položiek. Funkcia CreateFont používa 14 parametrov, ktoré presne zodpovedajú položkám štruktúry LOGFONT.

Logické písmo môžete vytvoriť pomocou funkcie CreateFont, ktorá má 14 parametrov.

CreateFont

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

gdi32.lib

gdi32.inc

 

Funkcia CreateFont vytvára logický font so špecifickými charakteristikami. Logický font môže byť potom vybratý ako font pre ľubovoľné zariadenie. Funkcia sa obyčajne používa, pokiaľ má aplikácia vytvoriť len jeden font. V iných prípadoch je na použitie jednoduchšia funkcia CreateFontIndirect, pretože jej sú dáta dodané v štruktúre LOGFONT.

Syntax: HFONT CreateFont, int  nHeight, int  nWidth, int  nEscapement, int  nOrientation, int  fnWeight, DWORD  fdwItalic, DWORD  fdwUnderline, DWORD  fdwStrikeOut, DWORD  fdwCharSet, DWORD  fdwOutputPrecision, DWORD  fdwClipPrecision, DWORD  fdwQuality, DWORD  fdwPitchAndFamily, LPCTSTR  lpszFace

nHeight int: Špecifikuje výšku znaku v logických jednotkách. Ak nastavíte nHeight na kladnú hodnotu, znamená to, že požadujete písmo vhodné na riadkovanie s rozstupom nHeight. Ak je nHeight menšie ako nula, potom jeho absolútna hodnota udáva výšku znaku. V prípade, že nHeight je nula, použije sa implicitná výška. Pre zobrazovací mód MM_TEXT môžete použiť nasledujúci predpis na špecifikovanie výšky pre font s danou veľkosťou písma nHeight = -MulDiv(PointSize, GetDeviceCaps (hDC, LOGPIXELSY), 72).

nWidth int: Špecifikuje šírku znaku v logických jednotkách. Nastavením tejto hodnoty na nulu dosiahnete, že Windows zvolí písmo podľa výšky. Použitie nenulovej hodnoty nefunguje dobre pri rastrových písmach, pri písmach TrueType môžete dostať písmo, ktoré bude širšie alebo užšie než zvyčajne.

Nasledujúce dve položky vyjadrujú smer toku a sklon textu. nEscapement umožňuje vypisovať reťazec znakov pod uhlom a položka nOrientation umožňuje nakláňať jednotlivé znaky. Tieto dva parametre nikdy nepracovali tak, ako bolo dokumentované, a ani dnes tak nepracujú s jedinou výnimkou: keď používate písmo TrueType, WindowNT a najprv musíte zavolať funkciu SetGraphicsMode s príznakom GM_ADVANCED. Vo Windows 98 táto hodnota nastavuje tak smer toku, ako aj sklon znakov. Vo Windows NT sa týmto parametrom tiež nastavujú obidve hodnoty, pokiaľ však nenastavíte funkciou SetGraphicsMode parameter GM_ADVANCED. V takomto prípade parameter funguje tak, ako je dokumentované.

nEscapement int: Uhol medzi vektorom prednej steny a osou x zariadenia v desatinách stupňa. Tento vektor je rovnobežný so základnou líniou riadkov textu (pozri tab. 1).

Hodnota

Umiestnenie znakov

0

Zľava doprava

900

Smerom hore

1800

Sprava doľava

2700

Smerom dole

Tab. 1

nOrientation int: Uhol medzi základnou líniou každého znaku a osou x zariadenia v desatinách stupňa (pozri tab. 2). Tento údaj nemá žiadny význam mimo Windows NT v režime GM_ADVANCED, keď funguje tak, ako je dokumentované.

Hodnota

Vzhľad znaku

0

Normálny

900

Položený na ľavý bok

1800

Hore nohami

2700

Položený na pravý bok

Tab. 2

fnWeight int: Požadovaná váha fontu. V prípade, že je nula, použije sa implicitná hodnota. Tento parameter môže nadobúdať jednu z hodnôt z tabuľky 3. Realita je taká, že tabuľka je oveľa ambicióznejšia než akákoľvek existujúca implementácia. Zatiaľ môžete používať hodnoty 0 alebo 400 pre normálne písmo a 700 pre písmo typu Bold.

 

Váha

Identifikátor

0

FW_DONTCARE

100

FW_THIN

200

FW_EXTRALIGHT alebo FW_ULTRALIGHT

300

FW_LIGHT

400

FW_NORMAL alebo FW_REGULAR

500

FW_MEDIUM

600

FW_SEMIBOLD alebo FW_DEMIBOLD

700

FW_BOLD

800

FW_EXTRABOLD alebo FW_ULTRABOLD

900

FW_HEAVY alebo FW_BLACK

Tab. 3

fdwItalic DWORD: Pri použití kurzívy nastavte na TRUE. Windows sú schopné syntetizovať kurzívu pre rastrové písma. Znamená to, že Windows jednoducho posunú niekoľko horných riadkov znaku doprava. Pri písme TrueType sa použije skutočný definičný súbor s rezom kurzívy.

fdwUnderline DWORD: Pri použití podčiarknutia nastavte na TRUE. Pri písmach GDI sa vždy syntetizuje. To znamená, že GDI pod každý znak vrátane medzery jednoducho dokreslí čiaru.

fdwStrikeOut DWORD: Pri použití preškrtnutia nastavte na TRUE podobne ako pri fdwUnderline.

fdwCharSet DWORD: Požadovaná znaková sada. OEM znaková sada je závislá od operačného systému. Tento parameter je dôležitý v procese mapovania fontov. Sú preddefinované tieto hodnoty: ANSI_CHARSET, DEFAULT_CHARSET, SYMBOL_CHARSET, SHIFTJIS_CHARSET, GB2312_CHARSET, HANGEUL_CHARSET, CHINESEBIG5_CHARSET, OEM_CHARSET. Pre Windows 95: JOHAB_CHARSET, HEBREW_CHARSET, ARABIC_CHARSET, GREEK_CHARSET TURKISH_CHARSET, THAI_CHARSET, EASTEUROPE_CHARSET, RUSSIAN_CHARSET, MAC_CHARSET, BALTIC_CHARSET.

fdwOutputPrecision DWORD: Požadovaná výstupná presnosť. Výstupná presnosť vyjadruje, ako musí zodpovedať výstup s požadovanou výškou fontu, šírkou, orientáciou, sklonom a rozstupom. V prípade, že systém obsahuje viac fontov rovnakého mena, aplikácia môže zvoliť, ktorý sa použije, zadaním hodnoty OUT_DEVICE_PRECIS, OUT_RASTER_PRECIS alebo OUT_TT_PRECIS. fdwOutputPrecision môže nadobúdať tieto hodnoty: OUT_CHARACTER_PRECIS, OUT_DEFAULT_PRECIS, OUT_DEVICE_PRECIS, OUT_OUTLINE_PRECIS, OUT_RASTER_PRECIS, OUT_STRING_PRECIS, OUT_STROKE_PRECIS, OUT_TT_ONLY_PRECIS, OUT_TT_PRECIS.

fdwClipPrecision DWORD: Požadovaná presnosť orezania. Tento parameter určuje spôsob orezania znakov, ktoré sú čiastočne mimo vybranej oblasti. Aby sa použil vstavaný font iba na čítanie, musí aplikácia zadať hodnotu CLIP_EMBEDDED. fdwClipPrecision môže nadobúdať tieto hodnoty: CLIP_DEFAULT_PRECIS, CLIP_CHARACTER_PRECIS, CLIP_STROKE_PRECIS, CLIP_MASK, CLIP_EMBEDDED, CLIP_LH_ANGLES   , CLIP_TT_ALWAYS.

fdwQuality DWORD: Požadovaná kvalita výstupu. Výstupná kvalita určuje, ako sa GDI snažia priblížiť atribútom logického fontu. fdwQuality môže nadobúdať hodnoty z tabuľky 4. Väčšinou sa používa hodnota DEFAUT_QUALITY.

Hodnota

Význam

DEFAULT_QUALITY

Vzhľad písma nie je podstatný.

DRAFT_QUALITY

Vzhľad písma je menej dôležitý než pri použití hodnoty PROOF_QUALITY. Pre rastrové fonty GDI sa používa prispôsobenie mierky.

PROOF_QUALITY

Kvalita znakov je dôležitejšia než presná zhoda s atribútmi logického fontu. Pre rastrové fonty GDI sa nepoužíva prispôsobenie mierky a je vybraný font najbližšej veľkosti.

Tab. 4

fdwPitchAndFamily DWORD: Rozstup a rodina písma. Na určenieu rozstupu písma použite jednu z nasledujúcich hodnôt: DEFAULT_PITCH, FIXED_PITCH, VARIABLE_PITCH. Táto hodnota sa kombinuje binárnym operátorom OR s jednou z hodnôt uvedených v tabuľke 5, ktoré určujú rodinu písma.

Hodnota

Identifikátor

Opis

0x00

FF_DECORATIVE

Ozdobné písmo, napr. Old English.

0x10

FF_DONTCARE

Nie je dôležité.

0x20

FF_MODERN

Písmo s konštantnou šírkou úderu, s pätkou alebo bez nej, napr. Pica, Elite a Courier New.

0x30

FF_ROMAN

Písmo s premenlivou šírkou úderu a s pätkou, napr. MS Serif.

0x40

FF_SCRIPT

Písmo navrhnuté tak, aby vyzeralo ako písané rukou, napr. Script a Cursive.

0x50

FF_SWISS

Písmo s premenlivou šírkou úderu a bez pätky, napr. MS Sans Serif.

Tab. 5

lpszFace LPCTSTR: Ukazovateľ na reťazec zakončený nulou, dĺžky max. 32 znakov. Tento reťazec udáva meno písma. Ak je lpszFace NULL, GDI použije implicitný typ písma. Pokiaľ chcete použiť písmo TrueType tučné alebo kurzívu, môžete to spraviť hneď dvoma spôsobmi: buď môžete ako údaj lpszFace zadať úplné meno písma (napr. Arial Italics), alebo môžete zadať základné meno  (Arial) a nastaviť príznak fdwItalics.

Výsledok funkcie: HFONT: Po úspešnom vykonaní funkcie sa vráti handle logického fontu. V ostatných prípadoch NULL.

CreateFontIndirect

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

gdi32.lib

gdi32.inc

Funkcia CreateFontIndirect vytvára logický font so špecifickými charakteristikami danými štruktúrou LOGFONT. Aplikácia môže toto písmo použiť tak, že ho vyberie ako font pre nejaké zariadenie.

Syntax: HFONT CreateFontIndirect, CONST LOGFONT *lplf

lplf CONST LOGFONT *: Ukazovateľ na štruktúru LOGFONT, ktorá určuje charakteristické vlastnosti fontu. Štruktúra LOGFONT je definovaná takto:

typedef struct tagLOGFONT { // lf 

   LONG lfHeight;

   LONG lfWidth;

   LONG lfEscapement;

   LONG lfOrientation;

   LONG lfWeight;

   BYTE lfItalic;

   BYTE lfUnderline;

   BYTE lfStrikeOut;

   BYTE lfCharSet;

   BYTE lfOutPrecision;

   BYTE lfClipPrecision;

   BYTE lfQuality;

   BYTE lfPitchAndFamily;

   TCHAR lfFaceName[LF_FACESIZE];

} LOGFONT;

Prvky tejto štruktúry zodpovedajú prvkom funkcie CreateFont.

Výsledok funkcie: HFONT: Po úspešnom vykonaní funkcie sa vráti handle logického fontu. V ostatných prípadoch NULL.

Systémové farby Windows

Systémové farby Windows sú založené na hodnotách RGB, R = red (červená), G = green (zelená), B = Blue (modrá) (pozri obrázok 3). Všimnite si, že najvýznamnejších 8 bitov je nula, a teda každá základná farba je určená 8-bitovou hodnotou. Teoreticky môže 32-bitová štruktúra RGB definovať 224, teda 16 miliónov farieb.

RGB_value struct

    unused  db 0

    blue    db ?

    green   db ?

    red     db ?

RGB_value ends

Pri programovaní v Assembleri môžete pri zadávaní farby použiť nasledujúce makro. Použitie makra v kóde je veľmi jednoduché, napr. RGB 255,255,255 – biela, RGB 0,0,0 – čierna farba a pod. Výstupom makra je 32-bitová hodnota požadovanej farby v registri eax.

RGB macro red,green,blue

          xor eax,eax

          mov ah,blue

          shl eax,8

          mov ah,green

          mov al,red

          endm

V prípade, že ste zarytí programátori, môžete použiť aj binárny zápis pri definovaní farby.

mov eax,00000000000000000000000011111111b ;červená farba

Pre nastavenie farby textu a pozadia sa používajú funkcie SetTextColor a SetBkColor.

SelectObject

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

gdi32.lib

gdi32.inc

Funkcia SelectObject vyberie objekt do špecifikovaného kontextu zariadenia. Nový objekt nahrádza predchádzajúci objekt toho istého typu.

Syntax: HGDIOBJ SelectObject, HDC hdc, HGDIOBJ hgdiobj

hdc HDC: Požadovaný kontext zariadenia.

hgdiobj HGDIOBJ: Identifikuje objekt, ktorý sa má vybrať. Špecifikovaný objekt musí byť vytvorený funkciou z tabuľky 6.

Objekt

Funkcie

Bitmap

CreateBitmap, CreateBitmapIndirect, CreateCompatibleBitmap, CreateDIBitmap, CreateDIBSection

Brush

CreateBrushIndirect, CreateDIBPatternBrush, CreateDIBPatternBrushPt, CreateHatchBrush, CreatePatternBrush, CreateSolidBrush

Font

CreateFont, CreateFontIndirect

Pen

CreatePen, CreatePenIndirect

Region

CombineRgn, CreateEllipticRgn, CreateEllipticRgnIndirect, CreatePolygonRgn, CreateRectRgn, CreateRectRgnIndirect

Tab. 6

Výsledok funkcie: Pokiaľ zvolený objekt nie je oblasť a funkcia sa skončila úspešne, vráti handle nahradzovaného objektu. Ak zvolený objekt je oblasť a funkcia sa skončila úspešne, vráti jednu z nasledujúcich hodnôt: SIMPLEREGION – oblasť sa skladá z jedného pravouholníka, COMPLEXREGION – oblasť sa skladá z viac než jedného pravouholníka, NULLREGION – oblasť je prázdna. Pokiaľ dôjde k chybe a vybraný objekt nie je oblasť, vráti hodnotu NULL, inak vráti GDI_ERROR. Táto funkcia vráti skôr zvolený objekt špecifikovaného typu. Aplikácia by mala vždy nahradiť nový objekt pôvodným, implicitným objektom po tom, čo skončila s kreslením nového objektu. Aplikácia nemôže zvoliť bitmapu do viac než jedného kontextu zariadenia súčasne.

SetTextColor

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

gdi32.lib

gdi32.inc

 

Funkcia SetTextColor nastavuje farbu textu pre špecifikovaný kontext zariadenia na zadanú farbu. Implicitná farba textu pre kontext zariadenia je čierna. Funkcia dovoľuje nastaviť ako farbu textového výstupu ľubovoľnú farbu RGB. Zvolená farba zostáva v platnosti dovtedy, kým nie je kontext zariadenia uvoľnený alebo kým nie je nastavená iná farba textu.

Syntax: COLORREF SetTextColor, HDC hdc, COLORREF crColor

hdc HDC: Požadovaný kontext zariadenia.

crColor COLORREF: Farba textu. Makro RGB vráti hodnotu COLORREF.

Výsledok funkcie: Po úspešnom vykonaní funkcie sa vráti referencia predchádzajúcej farby textu. V ostatných prípadoch sa vráti hodnota CLR_INVALID. Na získanie rozširujúcich chybových informácií použite funkciu GetLastError.

SetBkColor

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

gdi32.lib

gdi32.inc

Funkcia SetBkColor sa používa na nastavenie farby pozadia. Táto funkcia sa používa pri výpisoch textov, prevodoch bitových máp z farebných na čiernobiele a ako farba medzier pier.

Syntax: COLORREF SetBkColor, HDC hdc, COLORREF crColor

hdc HDC: Požadovaný kontext zariadenia.

crColor COLORREF: Nová farba pozadia. Makro RGB vráti hodnotu COLORREF. Ak zariadenie nemôže farbu reprezentovať priamo, použije sa najbližšia.

Výsledok funkcie: Po úspešnom vykonaní funkcie sa vráti predchádzajúca farba pozadia.

 

SetBkMode

Windows NT

Win 95

Win32s

Lib

Include

Áno

Áno

Áno

gdi32.lib

gdi32.inc

Funkcia SetBkMode nastavuje súčasný režim pozadia. Režim pozadia udáva spôsob, ktorý Windows používa na kreslenie pozadia textov, medzier v čiarach a prevodu farebných bitových máp na monochromatické.

Syntax: int SetBkMode, HDC hdc, int nMode

hdc HDC: Požadovaný kontext zariadenia.

nMode int: Určuje režim pozadia. Môžu nastať dva stavy: buď OPAQUE, alebo TRANSPARENT (nepriehľadný alebo priehľadný).

Výsledok funkcie: Po úspešnom vykonaní funkcie vráti predchádzajúci režim pozadia.

Listing k tejto časti seriálu nájdete opäť na našej webovej stránke www.pcrevue.sk.

Slovník skratiek

GDI (Graphic Device Interface) – rozhranie grafického zariadenia.


Nechajte si posielať prehľad najdôležitejších správ emailom

Mohlo by Vás zaujímať

Ako na to

Ako zbaviť fotky hmly

08.12.2016 11:59

Hmla alebo dym sú často veľmi kreatívne nástroje. No všetkého veľa škodí. Fotka potom stráca kontrast a v podstate na nej nič nevidieť. Hmlu môžete neraz následnými úpravami odstrániť alebo zredukovať ...

Ako na to

Užitočné SW nástroje

08.12.2016 11:53

AllDup v4.0.3 Určenie: program na vyhľadávanie a odstraňovanie duplicitných súborov Vlastnosti: duplicitné súbory sa vyhľadávajú len na zvolených diskových jednotkách alebo len v rámci vybraných ...

Ako na to

Fotografovanie s bleskom

08.12.2016 11:47

Ak máte moderný fotoaparát so vstavaným alebo externým bleskom, zdá sa vám téma článku triviálna. Jednoducho nastavíte vhodný režim, vyberiete najlepšiu kompozíciu záberu, exponujete a o zvyšok sa už ...

Žiadne komentáre

Vyhľadávanie

Kyocera - prve-zariadenia-formatu-a4-s-vykonom-a3

Najnovšie videá