Protože DOS se dnes asi nejčastěji používá na hry a jiné grafické aplikace, rozhodl jsem se napsat o knihovně Allegro. Je to opravdu dobrá grafická knihovna pro DJGPP . Není přímo GNU program, dokonce se nedistribuuje pod GPL. Její licence je ale podobná s GPL - jsou dostupné zdrojové kódy a není nutné platit za její použití.
Asi všichni, kteří kdy programovali v Borland C nebo Pascalu (asi většina programátorů na PC), a snažili se tam udělat nějakou rozumnou grafiku časem zahodili standardní knihovnu - BGI. Proč? Asi každý, kdo v ní dělal to ví - je pomalá a neumí pořádně ani 320x200 256 barev - nejoblíbenější to grafický mód vůbec. Podobná situace je i u jiných překladačů a problémů - standardní knihovny jsou často nešikovné a pomalé a tak hodně lidí dojde k závěru, že jediná správná cesta je udělat si všechno sám.
Postupem času se ale programování stále komplikuje (není to smutné?) a každý dnes po programu chce SVGA módy, výstup na 15 různých zvukových karet a síť. Ovladače k SVGA módům ale nejsou už tak jednoduché - je mnoho cest jak grafiku inicializovat apod. a tak cesta, kdy si člověk udělá všechno sám je dost pomalá a člověk tak ztratí hodně času, který by mohl strávit něčím užitečnějším (je sice zajímavé udělat ovladač od nějaké té karty, aby se člověk dozvěděl, jak funguje, ale dělat ovladač k 10. kartě už tak velká zábava není.)
U free softwaru je situace u knihoven jiná - většinou ji začne vyvíjet nějaký nadšenec a ten to někdy udělá celkem dobře. Navíc, protože jsou zdrojové kódy k dispozici, každý, kdo používá knihovnu a myslí, že je špatná ji může vylepšit. A tak některé free knihovny jsou opravdu dobré a jejich používání ušetří hodně práce.
Jako příklad takové celkem hezké a užitečné knihovny jsem si vybral allegro. Proč? No protože to je (nejen) grafická knihovna a snad každý, kdo programoval má nějaké zkušenosti s grafikou... Já jsem ji použil v XaoSovi a musím říct, že funguje celkem dobře.
Allegro začal programovat Shawn Heargreaves v roce 1994. Verze 1.0 fungovala pod Borland C. Verze 2.0 vyšla až v roce 1996 (brzo po tom co, vyšla první verze DJGPPv2) a už celá fungovala pod DJGPP. V jeho Changelogu se píše:
Dropped all the Borland code. A couple of months ago I ran out
of disk space, and it was with great satisfaction the I executed the
command deltree /y c:\bc4
. It was a horrible compiler, and I'm
glad it's dead.
Všechny pozdější verze už fungují pouze pod DJGPP. Poslední
verze je 2.2 ale pracuje se na verzi 3.0 (i já jsem přispěl svoji
troškou do mlýna) a tak se tato recenze vstahuje k ní. Domácí
stranku allegra (i se zdrojáky samozřejmě) najdete na adrese
www.talula.demon.co.uk
Shawn profesionálně pracuje pro nějakou firmu vyrábějící herní konzole. (tuším že Nitendo) a tak měl vždycky ke hrám blízko. I svoji knihovnu navrhnul tak, aby se v ní hry dobře psaly - umí vše důležité, má funkce pro práci s klávesnicí, myší, časovačem, joystickem, grafikou, počítání ve fixedpointu a zvukem. Je velmi rychlá a umí různé fígle na animaci. Navíc ale má i jednoduché GUI, podobné tomu na Atari, detekci OS (DOS, Windows, OS/2 apod.), CPU a další.
Allegro se inicializuje pomocí funkce allegro_ini
t, ta toho moc
nedělá - jenom nastaví některé proměné (jako os_type
, apod.) a
zařídí, aby se zavolala funkce allegro_exit
před skončením programu
a tak program po sobě vrátil textový mód apod. Allegro obsahuje sadu funkcí
pro čtení konfiguračního souboru (od zvuku apod.), které ale jdou
použít i pro jiné učely.
Potom, co je Allegro inicializováno je možné použít libovolnou z jeho služeb:
Jako vždy se napřed grafika musí inicializovat. Allegro
podporuje 256 barevné módy a od verze 3.0 i 15bit, 16bit, 24bit a
32bit. To se nastavuje pomocí funkce set_color_depth
. Potom už
můžete zavolat samotné set_gfx_mode
. Tomu předáte velikost módu,
který chcete nažhavit (třeba 320x200), virtuální obrazovky (třeba
320x400) a driver, který chcete použít. To může být
GFX_AUTODETECT
pro autodetekci, GFX_VGA
pro VGA
, GFX_TEXT
pro návrat do textového
módu, nebo jeden z 15 driverů pro různé SVGA karty.
Allegro podporuje i velmi divoké módy třeba 256x200, 320x100 apod., takže pokud máte něco proti svémů monitoru, můžete mu dát pořádně zabrat.
Na práci s virtuální obrazovkou jsou tu funkce jako
scroll_screen
. Protože ale v módech X volání scrollu způsobuje
sněžení, je nutné přepínat jenom, když je refresh. Čekání na refresh
ale zdržuje a tak allegro se umí pověsit na časovač a synchronizovat
ovladač s refreshem a scroolovat tak na pozadí. Tahle vymoženost ale
bohužel nechodí pod Win95, kde emulace časovače je příliš pomalá na
to, aby to fungovalo. Jde tím ale docílit pěkná plynulá animace.
Allegro umi i split screen.
Demo programy od allegra mají většinou hned několik cest, jak dělat plynulou animaci - dirty rectangles (animace se kreslí do bitmapy a pak se na obrazovky vykreslí jenom ty části co se změnily), doublebuffering (s čekáním na retrace i s retrace simulátorem) a triplebuffering. Všechny tyto metody jdou v Allegru udělat celkem snadno.
Další důležitá sada funkcí jsou funkce na práci s bitmapou. V Allegru je bitmapa struktura obsahující obrázek určité velikosti. Paměť pro bitmapu je určená polem ukazatelů na začátky jednotlivých řádek (ne na začátek paměti), to umožňuje, dělat třeba podbitmapy, které jsou částí jiné bitmapy, nebo bitmapy složené s více jiných bitmap, vlnit s obrazovkou a pod. Allegro podporuje tři typy bitmap:
to je obrazovka. Když chcete kreslit na obrazovku,
prostě uvedete jako bitmapu proměnou screen
.
to je bitmapa v paměti
to jsou už zmíněné bitmapy, které sdíli paměť s jinou větší.
create_bitmap
a zaniká pomocí
destroy_bitmap
. Navíc jde bitmapě nastavit průhledná barva (tak
může fungovat jako sprite), nebo čtverec na clipání. Bitmapy také
obsahují některé další informace, jako jestli jsou lineární,
planární apod.
Když máte bitmapu, můžete do ní kreslit. Allegro má hodně funkcí
od kreslení bodu, přes čáru, polygon, elipsu až po spline a
foodfill. Přesto, že to u DJGPP považuju za zbytečnost, velká část
funkcí Allegra je psána v assembleru a tak jsou opravdu rychlé.
,P>
Hotové bitmapy pak jde zobrazovat pomocí funkce blit
, ale
jsou i
chytřejší funkce pro zvětšování/zmenšování, kreslení spritů, rotování,
kreslení částečně průhledných bitmap (s alfa kanálem a to i pod
8bpp) apod. Allegro umí i sprity pakovat pomocí RLE. To zvýší
rychlost u děravých spritů, protože se nemusí kontrolovat, jestli
ten který pixel se kreslí, nebo ne a prostě se ví, že následujícíh x
pixelů se (ne)kreslí. Když i to je málo, muže se použít compiled
sprite. To jsou bitmapy, které se přeloží do assembleru (pomocí
funkce get_compiled_sprite
), tedy do sekvence mov instrukcí a proto
jsou úplně nejrychlejší na kreslení, ale nefunguje clipping.
Allegro má i sadu funkcí pro psaní textu - umí nahrávat fonty (i proporcionální) a potom je zobrazovat.
Navíc všechny tyto funkce fungují i s atributem - tedy v modu,
kdy se na pixel aplikuje nějaká zábavna funkce, místo toho, aby se
prostě obarvil (jako xor) a průhledné kreslení - u 256 barevných
módů si allegro předpočte transformační tabulku a potom kreslí
průhledně. Poslední možností je používání patternů. Umí
COPY_PATTERN
- to je barevný, SOLID_PATTERN - jednobarevný a MASKED_PATTERN -
částečně průhledný. Pro počítání tabulek jsem napsal modifikaci
foodfila tak, že výpočet je opravdů rychlý a tak netrvá tak dlouho
jako u programů, co tabulku počítají barvu po barvě a proto není nutné
ukládat předpočítané tabulky. Většina funkcí je psána zvlášť pro
jednotlivé kombinace attributů a tak to nepřináší nějaké větši
zpomalení.
Allegro má i normální funkce pro práci s paletou, čekání na retrace, fade out/in, interpolaci paletek, 332 paletu apod.
Allegro používá vlastní kód pro prácí s interrupty.
Má i sadu funkcí pro časovač a tak se už
nemusíte starat o instalaci handleru, přečasování apod. Prostě
zavoláte install_timer()
a je to. Některé další části (jako myš)
vyžadují, aby časovač byl nainstalován.
Protože Win95 mají potíže s časovašem na vysoké frekvenci, tyto
funkce tam mají určité potíže. Pokud chcete, aby program fungoval i
tam, je nutné nastavit proměnou i_love_bill
na 1
. Časovač pak běží
pomaleji. Váš vlastní časovač potom jednoduše nainstalujete pomocí
install_timer
, kde řeknete frekvenci a o víc se nestaráte.
Samozřejmě, že můžete nainstalovat víc takových časovačů na různých
frekvencích a allegro se samo stará o jejích správné volání a
přečasovávání časovače. Handlery se odinstalují pomoci remove_timer.
Navíc je tu podpora pro emulaci retacu a funkce rest
, která
funguje stejně jako delay, ale při čekání se volá nějaká funkce
(tedy něco jako dosovské odpočívadlo)
Allegro obsahuje kompletní 32 bitový ovladač od klávesnice. To je
důležité, protože realmode interupty v protected modu jsou pomalé,
zhoršují interrupt latenci a tak biosová klávesnice není nejlepší
nápad. Allegro samo zařizuje převod scancodů do ascii a jejich
bufferování. Aplikace pak může používat normální funkce jako
keypressed
, readkey
(která pro zajímavost v horních 16ti bytech
vrací i scancode), nebo se dívat, jestli je klávesa zmáčknutá pomocí
pole key
.
Jsou tu ale i další věci, jako nastavování ledek, nebo simulace stisku klávesy.
Po instalaci ovladače Allegro samo udržuje proměné
mouse_x
,
mouse_y
a mouse_b
. Cursor jde kreslit na libovolnou bitmapu (tedy i
na obrazovku), jde nastavovat pozici myše, rychlost, kam až má
jezdit, tvar cursoru, číst přímo mickeye a nechat si volat vlastní
obsluhu myšího přerušení.
Allegro podporuje asi 6 různých joysticků. Na rozdíl od myši a
klávesnice se neobnovuje pozice joysticku automaticky a musíte volat
poll_joystick
. Ta nastavuje proměné jako
joy_left
, joy_right
, joy_b1
,
joy2_left
, joy_x
apod..
Allegro má i funkce na kalibraci joysticku a uložení těchto informací do souboru.
Jsou tu funkce pro čtení a zápis bitmap, lbm, iff, pcx a tga (gify
nejsou podporovány kvůli potížím s copyrightem) souborů. Můžete si ale
zaregistrovat i další formáty. Tyto funkce automaticky provádí
konverzi z truecoloru do 8bpp a pod. To jde zapnout pomocí
set_color_conversion
. Jde přehrávat FLIC soubory (z paměti i
souboru).
Navíc allegro umí pracovat s datovým souborem, který je zabalený pomoci LZW (funkce pro kompresi jde použít i samostatně) a obsahuje libovolné další sobory. K tomu existuje i GUI program pro vytváření těchto souborů. Je možné je přidat na konec .exe souboru.
Je tu i pár věcí pro 3d grafiku. Quake v tom asi nenapíšete, ale
na něco by to mohlo stačit. Jsou tu dvě funkce:
polygon3d
a
triangle3d
. Obě umí flat, gouraud, rgb gouraud (tady se
neinterpoluje index ale rgb), afiní a perspektivní mapování
normálních, děravých a osvětlovaných textur. Tyto funkce zatím
podporují jen 256ti barevné módy. Do budoucí verze se plánuje
zbuffer.
Fixedpoint funkce funkce umí násobit, dělit a používat tabulky pro sinus, cosinus a další. Jsou psány jako Inline funkce v rozšířeném asembleru GCC a tak jsou rychlé. V C++ můžete použít i třídu, která přetíží operátory. Další sada funkcí je pro práci s vektorama a maticema pro 3d grafiku. Jsou tu funkce na skládání matic, generování transoframčních, rotačních a dalších matic, generování matice pro danou kameru, aplikování vzniklé matice na vektor, normalizaci vektorů apod. Všechno ve fixedpoint i floatingpoint verzi.
Gui funkce vznikly proto, aby Shawn mohl udělat některé utility k allegru. Je to celkem normální event handled GUI, které umí vytvářet menu, dialogy, buttony, checkboxy apod. Vypadá podobně jako to na atari. Existuje i nějaká C++ nadstavba, co dodělá vystínovaná tlačítka. Je tu hotových pár užitečných dialogů jako výběr rozlišení nebo file selector.
Podpora zvuku je podle mého názoru nejslabší část allegra. To hlavně proto, že stále není hotový driver pro GUSe. Allegro zatím podporuje soundblastery (včetně AVE32) a na GUSOvi se stále jenom pracuje. Navíc allegro zatím neumí přehrávat mody (také ve vývoji). Existuje ale verze mikallegro, což je spojení mikmodu a Allegra, která už tyto věci umí. Není ale udělána nejelegantneji.
Standardní funkce allegra umí nahrávat a mixovat samply (wav, nebo voc), nastavovat hlasitost a frekvenci samplům, loopovat, přehrávat obráceně apod. Podporuje i některé efekty jako vibrato, paning atd.
Přehrávání midi funguje buď přes FM syntézu, wavetable awe32 nebo digmid driver, co umí použít GOSové patche a tak i na SB MIDI zní rozumě.
Je tu i několik dalších užitečných věcí - přímý přístup do VRAM, podpora pro debugování, zmenšování velikosti exe souboru, zamykání funkcí a dat apod, ale myslím že už nemá smysl to tu rozvádět.
Tak to by byl stručný výčet funkcí allegra. Myslím že to je opravdu rychlá, chytrá a celkem pěkně napsaná knihovna. Její hlavní nevýhodou podle mě je velikost vzniklého kódu. Celá zkompilovaná knihovna má asi 400KB, což na počet funkcí není moc, ale je dost uvnitř provázaná a tak i hloupý program, co vypíše hello word v grafice má 200KB. A to už hodně je. Je sice několik cest jak tuto velikost zmenšit, ale nejsou nejjednodušší. Mně se podařilo velikost stáhnout na 40KB a to už jde přežít.
Allegro také zatím funguje jenom pro DOS, ale už se rozběhla i první verze pro Linux a portu do DirectX.
Dotazy a připomínky ohledně stránky posílejte na hubicka@paru.cas.cz