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