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