doc@pucc-j.UUCP (07/14/86)
Return-Path: ihnp4!cbmvax!carolyn@ecn Reply-To: ihnp4!cbmvax!carolyn@ecn (Carolyn Scheppner) Here is the source for an example written by myself and phil lindsay. It is a fairly simple SuperBitMap drawing-scrolling-printing demo. It shows how to use ScrollLayer, how to sync (update) the SuperBitMap prior to printing (would also be needed before saving), and how to create a dummy rastport for dumping the SuperBitMap. Note that this demo must be run under 1.2 to work properly. If run under 1.1, when the SuperBitMap is scrolled to a position other than the origin, the lines drawn offscreen will be lost. * Moderators note: Carolyn means that it won't run under 1.1 Workbench, not the compiler. This program can be compiled under 1.1 and run under 1.2. It is also very neat! =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= Carolyn Scheppner -- CBM >>Amiga Technical Support<< UUCP ...{allegra,caip,ihnp4,seismo}!cbmvax!carolyn PHONE 215-431-9180 =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= -------------------------------------------------------------------------- /* 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; k<DEPTH; k++) bitmap.Planes[k] = NULL; GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",0); Abort(GfxBase,"Can't open Graphics library"); IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",0); Abort(IntuitionBase,"Can't open Intuition library"); LayersBase = OpenLibrary("layers.library",0); Abort(LayersBase,"Can't open Layers library"); /* let's get our bitplanes */ InitBitMap(&bitmap,DEPTH,SBWIDTH,SBHEIGHT); for(count=0;count < DEPTH;count++) if((bitmap.Planes[count] = (PLANEPTR) AllocRaster(SBWIDTH,SBHEIGHT)) == NULL) Abort(NULL,"No memory for bitplanes."); else BltClear(bitmap.Planes[count],RASSIZE(SBWIDTH,SBHEIGHT),NULL); mynuwindow.BitMap = &bitmap; /* tell mynuwindow where our bitmap is */ Abort((mywindow = OpenWindow(&mynuwindow)),"Can't open window"); rp = mywindow->RPort; 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 */