int21h

Výstup textu pomocí VenomGFX

Nedávno jsem vám představoval grafickou jednotku pro Freepascal VenomGFX. Jestli jste tento článek nečetli, tak si ho, prosím, přečtěte teď, protože budu navazovat.
Jednotka VenomGFX sama o sobě má pouze rudimentální funkce pro textový výstup. Pro tenro účel budete potřebovat nástavbovou jednotku FNfont2. Autorem této jednotky jsem já, a proto si ji můžete stáhnout z mých stránek. Samostatný archív jsem na internet nenahrál. Místo toho stáhněte balík Wokna32, který v sobě zahrnuje i FNfont2 i VenomGFX.
Dále v tomto článku uvedu pět příkladů, které si stáhněte v tomto archívu. Jsou tam i všechny použité fonty a obrázky.
Takže.
Tohle je minimální program, který dokáže něco vypsat na obrazovku:
uses VenomGFX,FNfont2;
begin
SetRequestedFrequency(BEST_FQ or 70);
Init_Graph(Find_Mode(800,600));

Print_FN(320,300,'Ahoj svete!',fn_vga16);
readln;
Kill_Graph;
end.  
V klauzuli uses volám kromě VenomGFX také FNfont2. Psaní se děje příkazem Print_FN. První tři parametry jsou jasné a na čtvrtý se podíváme za chvíli.
Čtenáři, co opravdu četli úvodní článek o VenomGFX poznali, že tento prográmek běží v LFB režimu. Uděláme ale vstřícný krok k uživatelům XP a dále budeme používat kód, který může fungovat i v bankovém režimu.
Tedy:
uses VenomGFX,FNfont2;
var v:virtualwindow;
begin
SetRequestedFrequency(BEST_FQ or 70);
Init_Graph(Find_Mode(800,600));
Init_VW(v,800,600,true);

NastavVystup(v);
Print_FN(320,300,'Ahoj svete!',fn_vga16);

Flip_SVGA(v);
readln;
Kill_Graph;
end.  
Tento program je nachlup stejný, akorát že může pacovat v bankovém režimu. Pojďme dál.
uses VenomGFX,FNfont2;

var v:virtualwindow;

Procedure NakresliPozadi;
var i:longint;
begin
for i:=0 to 79 do
    LineVert(v,i*10,0,599,8452);
end;

var y,i:longint;
begin
SetRequestedFrequency(BEST_FQ or 70);
Init_Graph(Find_Mode(800,600));
Init_VW(v,800,600,true);
NakresliPozadi;
NastavVystup(v);

LineHorz(v,0,799,300,20);

FN_Color:=64000;
y:=300;
Print_FN(320,y,'Ahoj svete!',fn_vga16);

FN_Color:=1234;
inc(y,Vyska_FN(fn_vga16_u));
Print_FN(320,y,'Ahoj Cesko',fn_vga16_u);

FN_pozadi:=63000;
inc(y,Vyska_FN(fn_vga14));
Print_FN(320,y,'Ahoj Polsko',fn_vga14);

FN_pozadi:=FN_PRUHLEDNE;
FN_color:=24586;
inc(y,Vyska_FN(fn_vga8));
Print_FN(320,y,'Ahoj Slovensko',fn_vga8);
i:=Sirka_FN('Ahoj Slovensko',fn_vga8);
LineHorz(v,320,320+i-1,y,5598);

Flip_SVGA(v);
readln;
Kill_Graph;
end.  

V této ukázce vidíte používání různých fontů. Čtvrtý parametr procedury Print_FN tedy specifikuje font. Jednotka FNfont2 poskytuje čtyři základní fonty. Jde o písma stažená ze znakového generátoru VGA karty. Dlužno říci, že VGA fonty jsou nepraporcionální, tedy všechna písmena jsou stejně široká, ale FNfont2 provádí konverzi na proporcionální. Pouze font 8x16 ponechává v obou variantách. Ze zdrojáku jistě poznáte, co je co.
Dále si povšimněte, že Y souřadnice neoznačuje horní okraj písmen, ale linku, na které písmenka sedí.
Tudíž zápis jako Print_FN(0,0,...) je hloupost.
Podívejte se ještě na funkce Vyska_FN a Sirka_FN které umožňují vyměřování textu.
Kromě těchto čtyřech základních písem je možné používat ještě fonty ve formátu FN, což jsou TTF fonty převedené do bitmapy nebo CH fonty, což jsou VGA fonty uložené na disk. A také UFN fonty - ty jsou v kódování unicode.
uses VenomGFX,FNfont2;

var v:virtualwindow;
    f,g:fn;
begin
SetRequestedFrequency(BEST_FQ or 70);
Init_Graph(Find_Mode(800,600));
Init_VW(v,800,600,true);
NastavVystup(v);
FN_color:=65535;

Nacti_FN('banffn49.fn',f);
LineHorz(v,0,799,70,20);
Print_FN(0,70,'PŘkně velkě font :-)',f);

Nacti_FN('unismall.ufn',g);
Print_FN(0,200,'VĹ.ichni lidĂC se rodĂ­ rovnĂ˝mi a svobodnĂ˝mi co to dĹŻstojnosti a prĂ.v. Jsou nadĂ.ni rozumem'+#13#10+
               'a svÄ>domĂ­m a majĂ­ spolu jednat v duchu bratrstvĂ­.'
                  +#13#10#13#10+
               'Đ'Ń?Đ? Đ>ŃRди Ń?ĐžĐ?Đ´Đ°ŃRŃ,Ń?Ń? Ń?вОĐ?ОднŃ<Си и Ń?авнŃ<Си в Ń?вОĐ?С Đ´ĐžŃ?Ń,ОинŃ?Ń,вĐ? и ĐżŃ?аваŃ..'+#13#10+
               'ени надĐ?Đ>Đ?Đ˝Ń< Ń?Đ°Đ.Ń?СОС и Ń?ОвĐ?Ń?Ń,Ń|ŃR и Đ´ĐžĐ>Đ?Đ˝Ń< пОŃ?Ń,Ń?паŃ,Ń| в ĐžŃ,нОŃ?Đ?нии'+
               'Đ´Ń?Ń?Đł Đ´Ń?Ń?га в Đ´Ń?Ń.Đ?'+#13#10+
               'Đ?Ń?Đ°Ń,Ń?Ń,ва.',g);

Flip_SVGA(v);
readln;
Kill_Graph;
end.

Možná, že tento zdroják se ve webovém prohlížeči nezobrazí zcela správně, ovšem právě proto jsem uvedl odkaz na archív všech uvedených příkladů
Ať tak či tak, na zdrojáku vidíte, že když použijete unicode font, tak píšete text v kódování unicode UTF-8. V textovém režimu to bude obtížně čitelné, protože jeden znak může zabírat 1 až 3 bajty, ale vše se v grafice vykreslí tak jak má. Tento zdroják vypíše první článek všeobecné deklarace lidských práv v češtině a ruštině. Můžete tedy libovolně míchat azbuku s latinkou, arabštinou apod.

Zatím jsme se věnovali jenom té méně zajímavé části jednotky FNfont2 - ručnímu režimu. Ale tato unitka zná ještě automatický režim, který se zapíná FN_ignore:=true;
V tomto režimu je podstatné, že se zcela ignoruje čtvrtý parametr procedury Print_FN. Ignoruje se tedy specifikace fontu. Fonty se místo toho přepínají pomocí tagů podobných značkám HTML.
uses VenomGFX,FNfont2;

var v:virtualwindow;
    f,g:fn;
begin
SetRequestedFrequency(BEST_FQ or 70);
Init_Graph(Find_Mode(800,600));
Init_VW(v,800,600,true);
NastavVystup(v);
FN_color:=65535;

FN_ignore:=true;

Print_FN(0,200,'Ted si <FONT=times14.fn; BARVA=64080>ukazujeme<SB> zmenu'+
            '<FONT=banffn49.fn>fontu<SF;SF> za <POZADI=666>letu<SP>',fn_vga16);
Print_FN(0,230,'znak << musis zapsat jako <<<<'+#13#10+
              'Je mozne vkladat i obrazky: <IMG=krizak.gif>'
              ,fn_vga16);

Flip_SVGA(v);
readln;
Kill_Graph;
end.  
Takhle to tedy vypadá. Tagy se zapisují mezi znaky větší a menší - stejně jako v HTML. Nabízí se tedíž otázka, jak zapsat znak < a >
< se zapíše jako <<
> se zapíše stejně - tedy >
Přehled všech použitelných tagů najdete v části interface jednotky FNfont2
Stejně jako jednotka umí automatické řízení fontů a barev, tak umí i automatické řízení řádkování. To je ovšem dosti složité a na základní seznámení se to nehodí. Navíc takovéto finty patrně nebudete využívat přímo, ale prostřednictvím další jednotky, a to Wokna32. O tom ale zase jindy.

DOS-u-akbar!
2006-12-15 | Laaca
Reklamy: