gay@elde.epfl.ch (David Gay) (03/04/89)
I've found a bug in the layers.library: If InstallClipRegion is called with a NULL pointer as a region between a BeginRefresh/EndRefresh pair, the layers get trashed. The following program exemplifies the problem: /* To show bug: compile (with lc -L lbug) click on window to back gadget resize window so that it overlaps another (is behind) click on window to front admire the result close the window for even more fun The above procedure is easiest with an interlaced WB, and a CLI window in the second half of the screen. */ #include <exec/types.h> #include <intuition/intuition.h> #include <stdio.h> #include <proto/exec.h> #include <proto/intuition.h> #include <proto/layers.h> #include <proto/graphics.h> extern struct GfxBase *GfxBase; extern struct IntuitionBase *IntuitionBase; struct LayersBase *LayersBase; static struct NewWindow graph_win = { 0, 0, 640, 200, -1, -1, REFRESHWINDOW | CLOSEWINDOW, WINDOWSIZING | WINDOWDRAG | WINDOWDEPTH | WINDOWCLOSE | SIMPLE_REFRESH, NULL, NULL, "Graph", NULL, NULL, 80, 40, 640, -1, WBENCHSCREEN }; struct Window *win; void generate_bug(void) { struct Rectangle rect; struct Region *r, *oldRegion; r = NewRegion(); rect.MinX = 10; rect.MaxX = win->Width - 10; rect.MinY = 10; rect.MaxY = win->Height - 10; OrRectRegion(r, &rect); oldRegion = InstallClipRegion(win->WLayer, r); #ifdef CURE_BUG if (oldRegion == NULL) oldRegion = win->WLayer->DamageList; /* something mor e or less innocuous */ #endif printf("oldRegion = %lx\n", oldRegion); InstallClipRegion(win->WLayer, oldRegion); DisposeRegion(r); } void main(int argc, char **argv) { struct IntuiMessage *msg; int quit; ULONG class; GfxBase = (struct GfxBase *)OpenLibrary("graphics.library", 0); IntuitionBase = (struct IntuitionBase *)OpenLibrary("intuition.library", 33) ; LayersBase = (struct LayersBase *)OpenLibrary("layers.library", 33); win = OpenWindow(&graph_win); quit = FALSE; while (!quit) { WaitPort(win->UserPort); while (!quit && (msg = (struct IntuiMessage *)GetMsg(win->UserPort))) { class = msg->Class; ReplyMsg((struct Message *)msg); quit = class == CLOSEWINDOW; if (class == REFRESHWINDOW) { BeginRefresh(win); generate_bug(); EndRefresh(win, TRUE); } } } CloseWindow(win); if (IntuitionBase) CloseLibrary((struct Library *)IntuitionBase); if (LayersBase) CloseLibrary((struct Library *)LayersBase); if (GfxBase) CloseLibrary((struct Library *)GfxBase); } This was the cause for all my problems with clipping ... ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ David Gay 6 x 9 = 42 GAY@ELDE.EPFL.CH, or GAY%ELDE.EPFL.CH@CLSEPF51.bitnet ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~