Amiga Dünyası sayı 20, sayfa 29

Bu sayfadaki yazılar

Sayfanın metni

Sayfa 29

}

load() /* Iff yükleme rutini */

{ info=read_iff(name,0); if(info==NULL) return(0); BltBitMapRastPort(&info->bitmap,0,0,rp,0,0,320,256,0xc0); free_planes(&info->bitmap); palettes(); return(l);

} open_all()

{ IntuitionBase=<struct IntuitionBase*)OpenLibrary ("intuition.library",0);

if(IntuitionBase==NULL) {

printf("Intuition error!\n"); return(0); } GfxBase=(struct GfxBase *) OpenLibrary("graphics.library",0); if(GfxBase==NULL) {

printf("graphics error!\n"); CloseLibrary(GfxBase); return(0); } scr=(struct Screen *) OpenScreen(&sc); if(scr==NULL) {

printf("screen error!\n"); CloseLibrary(GfxBase); CloseLibrary(IntuitionBase); return(0); } rp=&scr->RastPort; vp=&scr->ViewPort; bm=&scr->BitMap; return( 1);

} close_all()

{ CloseScreen(scr); CloseLibrary(GfxBase); • CloseLibrary(IntuitionBase);

} #include <jiff.h> satırında, Iff içerisinde kullanılan macrolar ve Iff structure yapısı tanımlanıyor. Bu yapı ILBMInfo değişkeni olarak kullanılıyor. Yapı içerisindeki değişkenler ise aşağıdaki gibi isimlendirilmiş:

struct BitMapHeader

{ UWORD w, h; UWORD x, y; UBYTE nPlanes; UBYTE masking; UBYTE compression; UBYTE padl; UWORD transparentColor; UBYTE xAspect, yAspect; WORD pageWidth, pageHeight;

};

struct ILBM_info

{ struct BitMapHeader header; UBYTE cmap[MAXCOL*3]; struct BitMap bitmap;

ILBM_info esas yapıyı oluşturuyor. BitMapHeader ise önceden tanımlanıyor ve içerisinde resmin bilgilerini saklıyor. ILBM_info içerisindeki 'cmap' değişkeninde ise resmin paleti RGB değerleri olarak WORD tipinde saklı. Daha sonra resim datalarının saklandığı bitmap adresleri, BitMap değişkeninde bulunuyor. Aynı zamanda BitMap, ekrana taşırken kullandığımız kaynak değişken özelliğini taşıyor. Main içerisindeki satırlarda ise, main()

{ printf("Gormek istediğiniz resmin ismini giriniz ?\n"); scanf("%s",name); Yüklemek istediğimiz resmin ismi soruluyor ve 'name' değişkenine atılıyor, 'name' değişkeni global olarak önceden tanımlanmıştı.

if(open_all()=0) {

printf("open error!\n"); return(0); } Open_all() bizim hazırladığımız bir rutin. Bu rutinde library'ler ve ekranımız hazırlanıyor. Eğer hazırlık sırasında bir hata oluşursa, open_all() rutini '0' değeri ile dönerek programdan çıkıyor. Biz de bu değeri kontrol ediyor ve '0' ise 'open error!' mesajı vererek ana programımızdan çıkıyoruz.

if(load()==0) { Move(rp,0,100); Text(rp,"Resim bulunamadi!",17); } Load() rutini de aynı şekilde önceden hazırlamış olduğumuz bir IFF yükleme rutini. Yükleme sırasında bir hata oluşursa yine hatayı kontrol ederek programdan çıkıyoruz. Ana program içerisinden load() rutinini de çağırdıktan ve resim yüklendikten sonra, sol tuşa basılmışsa programdan close_all() rutini ile çıkıyoruz. Alt rutinler ise şöyle çalışıyor; load() /* Iff yükleme rutini */

{ info=read_iff(name,0); if(info==NULL) return(0); BltBitMapRastPort(&info->bitmap,0,0,rp,0,0,320,256,0xc0); free_planes(&info->bitmap); palettes(); return(l);

} Burada, info=read_iff(name,0); satırında yükleme işlemi başlıyor. İşlem bittikten sonra hafızada bir BitMap açılıyor ve esas resim burada saklanıyor. Daha sonra bu resmi,

BltBitMapRastPort(&info->bitmap,0,0,rp,0,0,320,256,0xc0); blitter komutu ile ekranımıza taşıyoruz. Tabii ki sonradan otomatik olarak açılmış olan BitMap ekranımızı, free_planes(&info->bitmap); satırındaki free_planes() IFF komutu ile kapıyoruz. Ve böylece IFF yükleme işlemi burada sona eriyor. Daha sonra palettes() alt rutinimize dallanıyoruz,

palettes() /* resmin renk paleti */

{ int i,r,g,b;

for(i=0;i<=15;i++)

{

r=info->cmap[3*i]/16; g=info->cmap[(3*i)+1 ]/l 6; b=info->cmap[(3*i)+2]/l 6; SetRGB4(vp,i,r,g,b); } } Burada RGB değerleri 'info' değişkeni içerisindeki 'cmap' de- ğişkeninde sırası ile R,G,B ve WORD olarak saklanıyor. Bu de- ğerleri SetRGB4() fonksiyonu ile ekran'a atıyoruz. Ve böylece resmin tamamı orijinal özellikleri ile ekrana geliyor.

Ve bu ayki zorlu yolculuğumuz da böylece sona eriyor. Bu sayede artık siz de rahatlıkla resim show programları hazırlayabilirsiniz. Gelecek ay C'de sprite denemeleri üzerinde çalışacağız. Bir ay sonra buluşmak üzere hoşçakalın !...

Klavyeyle gezinmek için ← ve → tuşları.