______ ___ __
/\ _ \ /\_ \ /\_ \
\ \ \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ň