[comp.sys.amiga.tech] Bug in layers.library

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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~