Logo GNU
Kodovani Předchozí Následující Obsah

7. Allegro - grafická knihovna pro DJGPP

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_init, 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:

7.1 Grafika

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.

7.2 Bitmapy

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:

Screen bitmap

to je obrazovka. Když chcete kreslit na obrazovku, prostě uvedete jako bitmapu proměnou screen.

Memory bitmap

to je bitmapa v paměti

Sub bitmap

to jsou už zmíněné bitmapy, které sdíli paměť s jinou větší.

Bitmapa vzniká pomocí 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.

7.3 Kreslení, a psaní a práce s bitmapou

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í.

7.4 Paleta

Allegro má i normální funkce pro práci s paletou, čekání na retrace, fade out/in, interpolaci paletek, 332 paletu apod.

7.5 Časovač

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)

7.6 Klávesnice

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.

7.7 Myš

Po instalaci ovladače Allegro samo udržuje proměné mouse_x, mouse_ymouse_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í.

7.8 Joystick

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.

7.9 Práce se soubory

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.

7.10 3d grafika

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.

7.11 Fixedpoint a 3d matematika

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.

7.12 GUI

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.

7.13 Zvuk

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ě.

7.14 Ostatní

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.


Předchozí Následující Obsah

Dotazy a připomínky ohledně stránky posílejte na hubicka@paru.cas.cz