/* Super.c - superbitmap scrolling and printing demo - Requires 1.2 */ /* phillip lindsay / carolyn scheppner */ /* CBM 06/30/86 */ #include "exec/types.h" #include "exec/execbase.h" #include "exec/exec.h" #include "graphics/gfxbase.h" #include "graphics/rastport.h" #include "graphics/layers.h" #include "intuition/intuition.h" #include "devices/printer.h" /* constants */ #define SBWIDTH 800 #define SBHEIGHT 400 #define WIDTH 640 #define HEIGHT 200 #define MAXWIDTH WIDTH #define MAXHEIGHT HEIGHT #define MINWIDTH (MAXWIDTH/16) #define MINHEIGHT (MAXHEIGHT/8) #define DEPTH 2 /* bitplanes */ #define COLORS 4 /* COLORS = pow(DEPTH,2); */ #define NORMAL -1 /* value used for normal Abort() */ /* functions we want to declare */ long OpenLibrary(); struct IntuiMessage *GetMsg(); struct Window *OpenWindow(); /* external I want to see */ extern long SysBase; /* working base pointers - pre-initialized for simplified aborting */ struct GfxBase *GfxBase = 0; struct IntuitionBase *IntuitionBase = 0; /* our window structures...*/ struct NewWindow mynuwindow = { 0,0,WIDTH,HEIGHT, 0,1, CLOSEWINDOW | VANILLAKEY, GIMMEZEROZERO | SUPER_BITMAP | WINDOWDEPTH | WINDOWCLOSE | WINDOWSIZING | WINDOWDRAG | ACTIVATE, NULL,NULL, "1.2 SuperBitMap Demo - SPACE=Draw/Pause UDLR=Scroll P=Print Q=Quit", NULL, NULL, MINWIDTH,MINHEIGHT, MAXWIDTH,MAXHEIGHT, WBENCHSCREEN }; /* Window related structures */ struct Window *mywindow; struct ViewPort *vp; struct RastPort *rp; struct BitMap bitmap; /* Intuition IDCMP stuff */ struct IntuiMessage *msg; ULONG class; USHORT code; /* Layer stuff */ ULONG LayersBase; struct Layer *l; struct Layer_Info *li; /**************************************************************************/ main() { long count, /* misc. loop var. */ gapX, gapY, /* holds current val for the line gap */ cycle, /* this is the current color register being used */ x,y; /* current line dest. coor. */ UBYTE do_close; /* this flag is TRUE for window close gadget selected */ UBYTE freeze; /* flag to freeze display */ int error; /* for return value of superDump() */ int deltaX, deltaY; /* scroll deltas */ int k; /* Initialize PLANEPTR's to ZERO for simple deallocating */ for(k=0; kRPort; vp = (struct ViewPort *) ViewPortAddress(mywindow); l = rp->Layer; li = l->LayerInfo; deltaX = 4; deltaY = 2; SetDrMd(rp,JAM1); /* Initialize flags to defaults */ do_close=0x00; freeze = FALSE; /* Loop until close gadget hit */ while(!do_close) { if(!freeze) { x = RangeRand(SBWIDTH); y = RangeRand(SBHEIGHT); gapX = RangeRand(4)+2; gapY = RangeRand(4)+2; cycle = RangeRand(4); SetAPen(rp,cycle); for (; ((x < SBWIDTH)&&(y > 0)); x += gapX, y -= gapY) { Move(rp,0,y); Draw(rp,x,0); Move(rp,SBWIDTH-1-x,0); Draw(rp,SBWIDTH-1,y); Move(rp,SBWIDTH-1,SBHEIGHT-1-y); Draw(rp,SBWIDTH-1-x,SBHEIGHT-1); Move(rp,x,SBHEIGHT-1); Draw(rp,0,SBHEIGHT-1-y); } } while(msg=(struct IntuiMessage *)GetMsg(mywindow->UserPort)) { class = msg->Class; code = msg->Code; ReplyMsg(msg); switch(class) { case CLOSEWINDOW: do_close = TRUE; break; case VANILLAKEY: switch(code) { case 'u': if((l->Scroll_Y + deltaY) < maxYScroll(mywindow) ) ScrollLayer(li,l,0,deltaY); break; case 'd': if((l->Scroll_Y - deltaY) > 0 ) ScrollLayer(li,l,0,-deltaY); break; case 'l': if((l->Scroll_X + deltaX) < maxXScroll(mywindow) ) ScrollLayer(li,l,deltaX,0); break; case 'r': if((l->Scroll_X-deltaX) > 0 ) ScrollLayer(li,l,-deltaX,0); break; case ' ': freeze = (freeze == TRUE) ? FALSE : TRUE; break; case 'p': /* ScreenDump of SuperBitMap */ error = superDump(rp,vp); if (error) printf("DumpRPort error = %ld\n",error); break; case 'q': do_close = TRUE; break; } } } } Abort(NORMAL,"\nGoodbye.."); } /* Abort - an easy going exit routine - if val <= 0 a clean-up and exit will */ /* take place...val == 0 implies ERROR...val == -1 implies normal exit */ /* and val >= 1 implies no exit or error */ Abort(val,str) long val; UBYTE *str; { long count; if(val < 1) { puts(str); if(mywindow) msgflush(),CloseWindow(mywindow); if(bitmap.Planes[0] != NULL) for(count=0;(bitmap.Planes[count] != NULL) && (count < 8);count++) FreeRaster(bitmap.Planes[count],SBWIDTH,SBHEIGHT); if(GfxBase) CloseLibrary(GfxBase); if(IntuitionBase) CloseLibrary(IntuitionBase); if(LayersBase) CloseLibrary(LayersBase); exit(val == 0 ? 1 : 0); } } /* msgflush - get/reply to all messages */ msgflush() { while((msg = GetMsg(mywindow->UserPort))) ReplyMsg(msg); } int maxXScroll(w) struct Window *w; { return(SBWIDTH - (w->Width - w->BorderLeft - w->BorderRight)); } int maxYScroll(w) struct Window *w; { return(SBHEIGHT - (w->Height - w->BorderTop - w->BorderBottom)); } /***************************/ /* SuperBitmap Screen Dump */ /***************************/ superDump(rp,vp) struct RastPort *rp; struct ViewPort *vp; { /* printer stuff */ union printerIO { struct IOStdReq ios; struct IODRPReq iodrp; struct IOPrtCmdReq iopc; }; union printerIO *request; extern struct IORequest *CreateExtIO(); extern struct MsgPort *CreatePort(); struct MsgPort *printerPort; struct RastPort dRastPort; /* Dummy RastPort */ int error; /* Lock the Layer */ /* Update the SuperBitmap */ /* Copy window's Rastport structure to dummy */ /* Insert ptr to our SuperBitmap */ /* NULL the Layer pointer */ /* Unlock the Layer */ LockLayerRom(rp->Layer); SyncSBitMap(rp->Layer); dRastPort = *rp; dRastPort.BitMap = rp->Layer->SuperBitMap; dRastPort.Layer = NULL; UnlockLayerRom(rp->Layer); printerPort = CreatePort("my.print.port",0); request = (union printerIO *)CreateExtIO(printerPort, sizeof(union printerIO)); error = OpenDevice("printer.device",0,request,0); if(error != 0) goto cleanup2; request->iodrp.io_Command = PRD_DUMPRPORT; request->iodrp.io_RastPort = &dRastPort; request->iodrp.io_ColorMap = vp->ColorMap; request->iodrp.io_Modes = (ULONG)vp->Modes; /* request->iodrp.io_SrcX = 0; MEMF_CLEAR zeroed this */ /* request->iodrp.io_SrcY = 0; MEMF_CLEAR zeroed this */ request->iodrp.io_SrcWidth = SBWIDTH; request->iodrp.io_SrcHeight = SBHEIGHT; request->iodrp.io_DestCols = SBWIDTH; /* request->iodrp.io_DestRows = 0; MEMF_CLEAR zeroed this */ request->iodrp.io_Special = SPECIAL_ASPECT; error = DoIO(request); CloseDevice(request); cleanup2: DeleteExtIO(request, sizeof(union printerIO)); DeletePort(printerPort); cleanup1: cleanup0: return(error); } /* end of demo screen dump */ /* EOF */