Sekalaiset   Sivukartta
Kuvien lataaminen datatyypeillä
Ilkka Lehtoranta <ilkleht@isoveli.org>

AmigaOS:n datatypes.library on oliopainotteinen kirjasto, joka toteuttaa olio-ohjelmoinnin ideologiaa hyvin monipuolisesti. Järjestelmä koostuu muutamasta pääluokasta (ääni, kuva, animaatio ja teksti) ja alaluokista, jotka toteuttavat varsinaisen yhteensopivuuden eri tiedostoformaattien välillä. Datatyyppejä kannattaakin käyttää aina kun mahdollista. Ohjelma saa automaattisesti tuen kaikille mahdollisille tiedostoformaateille, ja toisaalta kooderin työmäärä vähenee. Yksi yleisimmistä datatyyppien käyttötarkoituksista on kuvien lataaminen.

alkuun
Toteutus
Lyhyellä koodinpätkällä kuvat voidaan ladata helposti niin että voimme käyttää myös graphics.libraryn kirjastofunktioita.

Koska kuvan piirtoon tarvitaan jonkin verran tietoa määrittelemme ensin oman apustruktuurin, johon talletetaan useimmin tarvittavat tiedot:
struct Kuva
{
   ULONG          width, height;
   struct BitMap  *myBitMap;
   PLANEPTR       *mask;
   Object         *dtobj;
};
Seuraavaksi kirjoitamme kuvalataajan, jonka prototyyppi näyttää seuraavalta:
struct Kuva *LataaKuva(char *tiedosto, struct Screen *screen)
{
   struct BitMapHeader  *bmh;
   struct Kuva *kuva;
   Object      *obj;

   Kuva   = AllocVec(sizeof(struct Kuva), MEMF_CLEAR);

   if ( kuva != NULL )
   {
      obj   = NewDTObj((APTR)tiedosto,
                  DTA_GroupID, GID_PICTURE,
                  PDTA_DestMode, PMODE_V43,
                  PDTA_Screen, screen,
               TAG_DONE

      if ( obj != NULL )
      {
         GetDTAttrs(obj, PDTA_BitMapHeader, &bmh, TAG_DONE);

         kuva->width    = bmh->bmh_Width;
         kuva->height   = bmh->bmh_Height;
         kuva->dtobj    = obj;

         /* Värien uudelleenkartoitus (remap) *(

         DoMethod(obj, DTM_PROCLAYOUT, NULL, 1);

         GetDTAttrs(obj,
               PDTA_DestBitMap, &kuva->myBitMap,
               PDTA_MaskPlane, &kuva->mask,
               TAG_DONE);
      }

      if (( obj == NULL ) || ( kuva->myBitMap == NULL ))
      {
         FreeVec(kuva);
         kuva = NULL;
      }
   }
   return( kuva );
}
NewDTObject() tekee varsinaisen työn eli lataa kuvatiedoston ja tunnistaa kuvaformaatin. Funktio palauttaa osoittimen kuvaobjektiin tai NULL, jos kuvaa ei voitu ladata (todennäköisesti muisti loppu tai tuntematon tiedostoformaatti). Mikäli kaikki onnistui, funktio LataaKuva() palauttaa osoittimen Kuva-struktuuriin. Kun kuvaa ei enää tarvita, voidaan se vapauttaa:
void PoistaKuva(struct Kuva *kuva)
{
   DisposeDTObject(kuva->dtobj);
   FreeVec(kuva);
}
Kaiken kaikkiaan kuvien käsitteleminen datatyyppien avulla on erittäin helppoa.
Sekalaiset   Sivun alkuun  Sivukartta