home *** CD-ROM | disk | FTP | other *** search
- /* BigView.C - (c) 1987 DJH
-
- BigView will display any IFF picture independent of the physical
- display size. Default display size is 320 x 200 lo-res; HIRES or LACE
- attributes added if user width/height exceeds low resolution boundaries.
-
- Note that we do not actually call ScrollVPort, since we want to
- maintain Intuition compatability; the principle is the same, however.
- Note that not all screen widths/resolutions scroll equally smoothly;
- experiment! Also : the Rx/RyOffsets seem able to exceed the 1K RKM
- limitations; investigate.
- */
-
- #include "iff.h" /* ReadILBM.C defines */
-
- void *IntuitionBase,*GfxBase;
-
- main(argc,argv)
- int argc;
- char *argv[];
- {
- struct PicMap picmap;
- struct NewScreen newscreen;
- struct Screen *screen;
- int status,dwidth,dheight,i;
-
- switch(argc) {
- case 0: exit(0); break; /* arrgh! WorkBench! */
- case 2: dwidth=320; dheight=200; break;
- case 4: sscanf(argv[2],"%d",&dwidth);
- sscanf(argv[3],"%d",&dheight);
- break;
- default: puts("BigView file [width,height]"); exit(0);
- }
-
- IntuitionBase=OpenLibrary("intuition.library",0);
- GfxBase=OpenLibrary("graphics.library",0);
-
- if (ReadILBM(argv[1],0,&picmap)) exit(0);
-
- setmem(&newscreen,sizeof(newscreen),0);
-
- /* user dimensions can be smaller, but not larger than picture! */
-
- if (dwidth>picmap.BitMap.BytesPerRow*8) dwidth=picmap.BitMap.BytesPerRow*8;
- if (dheight>picmap.BitMap.Rows) dheight=picmap.BitMap.Rows;
-
- newscreen.Width=dwidth; newscreen.Height=dheight;
-
- newscreen.ViewModes=picmap.ViewModes & HAM; /* WE decide other bits */
-
- if (dwidth>LOWIDTH) newscreen.ViewModes|=HIRES;
- if (dheight>LOHEIGHT) newscreen.ViewModes|=LACE;
-
- newscreen.Type=CUSTOMSCREEN|CUSTOMBITMAP;
- newscreen.Depth=picmap.BitMap.Depth;
- newscreen.CustomBitMap=&picmap.BitMap;
- newscreen.DetailPen=0; newscreen.BlockPen=1;
-
- screen=OpenScreen(&newscreen);
- LoadRGB4(&screen->ViewPort,&picmap.colormap[0],1<<newscreen.Depth);
-
- Scroll_Around(screen,dwidth,dheight); Delay(200);
-
- CloseScreen(screen); FreeBitMap(&picmap.BitMap);
- }
-
- Scroll_Around(screen,dwidth,dheight)
- struct Screen *screen;
- int dwidth,dheight;
- {
- short i,
- xdelta=screen->BitMap.BytesPerRow*8-dwidth,
- ydelta=screen->BitMap.Rows-dheight;
-
- if (xdelta) /* any room to scroll right? */
- for (i=1;i<=xdelta;i++) {
- screen->ViewPort.RasInfo->RxOffset=i;
- MakeScreen(screen);
- RethinkDisplay();
- }
-
- if (ydelta) /* any room to scroll down? */
- for (i=1;i<=ydelta;i++) {
- screen->ViewPort.RasInfo->RyOffset=i;
- MakeScreen(screen);
- RethinkDisplay();
- }
-
- if (xdelta)
- for (i=xdelta;i;i--) {
- screen->ViewPort.RasInfo->RxOffset=i-1;
- MakeScreen(screen);
- RethinkDisplay();
- }
-
- if (ydelta)
- for (i=ydelta;i;i--) {
- screen->ViewPort.RasInfo->RyOffset=i-1;
- MakeScreen(screen);
- RethinkDisplay();
- }
- }
-