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