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