______ ___ __ /\ _ \ /\_ \ /\_ \ \ \ \L\ \\//\ \ \//\ \ __ __ _ __ ___ \ \ __ \ \ \ \ \ \ \ /'__'\ /'_ '\/\''__\/ __'\ \ \ \/\ \ \_\ \_ \_\ \_/\ __//\ \L\ \ \ \//\ \L\ \ \ \_\ \_\/\____\/\____\ \____\ \____ \ \_\\ \____/ \/_/\/_/\/____/\/____/\/____/\/___L\ \/_/ \/___/ /\____/ \_/__/ Opravdoví programátoři používají: COPY CON PROGRAM.EXE Asi všichni, co kdy programovali v Borlandím 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 úžasně pomalá, nešikovná 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 většinou celken nešikovné a pomalé a tak většina lidí dojde k závěru, že jediná správná cesta je udělat si všechno sám. Postupem čsdu 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 zvukovek a síť... Ovladače k SVGA módům ale nejsou už tak jednoduché - je monoho cest jak je inicializovat apod... a tak cesta, kdy si člověk udělá všechno sám je dost pomalá a člověk tak stratí fůra č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 zdrojáky 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. Přesto se hodně lidí bojí je používat, aby je snad někdo nenazval lamery... 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 Borlandem. 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 http://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 z 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..), 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ě "zametl". Potom 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: 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 těchto driverů. 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 umí se pověsit na časovač a synchronizovat ovladač s refreshem a scroolovat tak "na pozadí". Tahle feature ale bohužel nechodí pod Win95, kde emulace časovače je příliš spatná na to, aby to fungovalo. Jde tím ale docílit pěkná plynulá animace. Allegro umi i split screeny. Demátka 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. 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, proste kreslíte na bitmapu jménem screen. Memory bitmap - to je bitmapa v paměti Sub bitmap - to je už zmíněné bitmapy, co 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. Kreslení, a psaní a práce s bitmapama Když máte bitmapu, můžete do ní kreslit. Allegro má hodně funkcí od kreslení bodu, přes čáru, polygon, elypsu 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é. Hotové bitmapy pak jde zobrazovat pomocí funkce blit, ale má i chytřejší 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 clipání. Allegro má i sadu funkcí pro psaní textu - umí nahrávat (i proporcionální) fonty a potom je zobrazovat. Navíc všechny tyto funkce fungují i s atributama - 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 barve a 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í. Paleta Allegro má i normální funkce pro práci s paletou, čekání na retrace, fade out/in, interpolaci paletek, 332 paletu apod. Časovač Allegro má vlastní kód pro prácí s interrupty, který pak používá většina dalších částí. 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 z vysokofrekvenčníma časovačema, tyto rutinky 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) Klávesnice Allegro má kompletní 32 bitový ovladač od klávesnice. To je důležité, protože realmode interupty vždycky žerou hodně času, zhoršujou 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 normalní 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 takové fajnovosti, jako nastavování ledek, nebo simulace stisku klávesy. Myš 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í. Joystick Allegro podporuje asi 6 různých joysticků. Na rozdíl od myši a klávesnice se neupdatuje 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. Práce se soubory Jsou tu funkce pro čtení/zápis bitmap, lbm, iff, pcx a tga (gify nejsou 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 pomoci 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í techto fajlů. 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. 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 aeembleru 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 Gui funkce vznikly proto, aby Shawn mohl udělat některé utilitky k allegru. Je to celkem normální event handled GUI, co 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. 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 (taky ve vývoji). Existuje ale verze mikallegro, což je skříženina mikmodu a allegra, která už tyto věci umí. Není ale udělána nejelegantnejc. 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... 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ě. 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. výheň