/* bug-e by Howard C. Anderson A program to demonstrate an Amiga bug involving an interaction between AreaEllipse, AreaMove, AreaDraw, and AreaEnd. Symptoms: AreaEllipse works fine until an AreaMove, AreaDraw, AreaEnd sequence is issued. After that, AreaEllipse produces strange results. Results shown here are only one type of strange result. We have seen many others. Makefile for Manx 3.6: bug-e: bug-e.o ln -g bug-e.o -lm32 -lc32 bug-e.o: bug-e.c cc -n +ff +L bug-e.c */ #include #include #include #include #include #include #include #include #include #include #include extern struct IntuitionBase *OpenLibrary(); extern struct Window *OpenWindow(); extern struct InitTmpRas *TmpRas(); #define INTUITION_REV 29 struct IntuitionBase *IntuitionBase; struct Window *NoBorder; struct GfxBase *GfxBase; struct RastPort *r; struct Border lines={0,0, 5,0, JAM1, 5, NULL, NULL}; struct NewWindow mywindow = {0,0,640,200,-1,-1,NULL, ACTIVATE|SMART_REFRESH|BORDERLESS, NULL,NULL,NULL,NULL, NULL,0,0,0,0,WBENCHSCREEN}; struct AreaInfo myareainfo; UBYTE *areabuffer; static int rastad[1]; static struct TmpRas TRas[6]; float x,y; int error; char ikey; int ievent,loop; main() { int i; IntuitionBase = (struct IntuitionBase *) OpenLibrary("intuition.library",29); if(IntuitionBase == NULL) exit(FALSE); GfxBase = (struct GfxBase *) OpenLibrary("graphics.library",29); if(GfxBase == NULL) exit(FALSE); NoBorder = (struct Window *) OpenWindow(&mywindow); r = NoBorder->RPort; areabuffer = AllocMem(10000,MEMF_CLEAR); InitArea(&myareainfo,areabuffer,1000); r->AreaInfo = &myareainfo; rastad[0] = AllocMem(32000,MEMF_CHIP); if(rastad[0] == 0){ printf("Can't allocate temporary raster space.\n"); exit(1); } InitTmpRas(&TRas[0],rastad[0], RASSIZE(200,200)); r->TmpRas = &TRas[0]; SetRGB4(r,2); for(i=0;i<100;i++){ SetAPen(r,i%4); drawstuff(); } CloseWindow(NoBorder); FreeMem(rastad[0],32000); FreeMem(areabuffer,10000); } drawstuff() { int j; AreaEllipse(r,50,60,30,40); AreaEnd(r); AreaMove(r,300,100); AreaDraw(r,300+20,100); AreaDraw(r,300+20,100+20); AreaDraw(r,300,100+20); AreaDraw(r,300,100); AreaEnd(r); /* The following two lines, when uncommented, fix the bug */ /* FreeMem(areabuffer,10000); areabuffer = AllocMem(10000,MEMF_CLEAR); */ AreaEllipse(r,580,60,30,40); AreaEnd(r); AreaEllipse(r,580,150,30,40); AreaEnd(r); AreaEllipse(r,50,150,30,40); AreaEnd(r); }