dale@amiga.UUCP (06/29/87)
This was a feature that was added in 1.2, so make sure you are asking
for library version 33.
To show this feature we modified the 'dotty' program, you should compare
the 1.1 and 1.2 SIDEBYSIDE to see the difference. It is subtle.
Anyway,
Here's the source, I thought I was having trouble with our news posting
so I'm sorry if this got out there twice.
This last compiler under Greenhills, It should compile under aztec
of lattice, make sure you use the 'long int' options.
------CUT HERE------
#include <exec/types.h>
#include <exec/nodes.h>
#include <exec/lists.h>
#include <exec/ports.h>
#include <graphics/gfx.h>
#include <graphics/gfxbase.h>
#include <graphics/clip.h>
#include <graphics/view.h>
#include <graphics/rastport.h>
#include <graphics/layers.h>
#include <intuition/intuition.h>
struct IntuitionBase *IntuitionBase;
struct LayersBase *LayersBase;
struct GfxBase *GfxBase;
#define DEPTH 2
#define WIDTH 100
#define HEIGHT 50
#define CLIPPING
#define IS_PAL (((struct GfxBase *)GfxBase)->DisplayFlags & PAL)
#define NTSC_MAX_HEIGHT 200
#define PAL_MAX_HEIGHT 256
int waiting_for_message = FALSE;
char dotty[] = "Dotty Window";
int usable_width(w)
struct Window *w;
{
#ifdef CLIPPING
return (w->Width);
#else
return (w->Width - w->BorderLeft - w->BorderRight);
#endif
}
int usable_height(w)
struct Window *w;
{
#ifdef CLIPPING
return (w->Height);
#else
return(w->Height - w->BorderTop - w->BorderBottom);
#endif
}
struct Region *NewRegion(),*InstallClipRegion();
clip_for_me(window)
struct Window *window;
{
#ifdef CLIPPING
struct Rectangle Bounds;
struct Region *clipregion = NewRegion();
if(clipregion)
{
Bounds.MinX = window->BorderLeft;
Bounds.MinY = window->BorderTop;
Bounds.MaxX = window->Width - window->BorderRight;
Bounds.MaxY = window->Height - window->BorderBottom;
/* include only "positive" regions */
if((Bounds.MinX < Bounds.MaxX)&&(Bounds.MinY < Bounds.MaxY))
{
OrRectRegion(clipregion,&Bounds);
}
/* calculate the rectangle that holds that little piece */
/* above the size gadget */
{
USHORT target = SYSGADGET|SIZING;
struct Gadget *g;
for (g = window->FirstGadget; g ; g = g->NextGadget)
{
if ( (g->GadgetType & target) == target)
{
Bounds.MinX = Bounds.MaxX+1;
Bounds.MaxX =
window->Width-window->BorderLeft;
Bounds.MaxY =
window->Height - g->Height - 1;
/* include only "positive" regions */
if((Bounds.MinX < Bounds.MaxX)&&
(Bounds.MinY < Bounds.MaxY))
{
OrRectRegion(clipregion,&Bounds);
}
break;
}
}
}
/* swap new one in */
clipregion = InstallClipRegion(window->WLayer,clipregion);
if (clipregion) DisposeRegion(clipregion);
}
#endif
}
main()
{
struct RastPort *rp;
struct Window *window;
struct NewWindow nw;
int x,y,c;
int xoffset,yoffset;
int width,height;
struct IntuiMessage *message;
ULONG MessageClass;
if (!(GfxBase = (struct GfxBase *)OpenLibrary("graphics.library",33)))
{
#ifdef DEBUG
printf("no graphics library!!!\n");
#endif
exit(1);
}
if (!(LayersBase = (struct LayersBase *)OpenLibrary("layers.library",33)))
{
CloseLibrary(GfxBase);
#ifdef DEBUG
printf("no layers library!!!\n");
#endif
exit(1);
}
if (!(IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library",33)) )
{
CloseLibrary(GfxBase);
CloseLibrary(LayersBase);
#ifdef DEBUG
printf("no intuition here!!\n");
#endif
exit(1);
}
nw.LeftEdge = 50;
nw.TopEdge = 50;
nw.Width = WIDTH;
nw.Height = HEIGHT;
nw.DetailPen = -1;
nw.BlockPen = -1;
nw.IDCMPFlags = CLOSEWINDOW
| REFRESHWINDOW
| SIZEVERIFY
| NEWSIZE;
nw.Flags = WINDOWDEPTH
| WINDOWSIZING
| WINDOWDRAG
| WINDOWCLOSE
| SIMPLE_REFRESH;
nw.FirstGadget = NULL;
nw.CheckMark = NULL;
nw.Title = dotty;
nw.Screen = NULL;
nw.BitMap = NULL;
nw.MinHeight = 16;
nw.MinWidth = 80;
nw.MaxHeight = ~0; /* V32 and above */
nw.MaxWidth = ~0;
nw.Type = WBENCHSCREEN;
if (!(window = (struct Window *)OpenWindow(&nw) ))
{
#ifdef DEBUG
printf("could not open the window\n");
#endif
CloseLibrary(IntuitionBase);
CloseLibrary(LayersBase);
CloseLibrary(GfxBase);
exit(2);
}
/* bart - 11.13.85 */
SetWindowTitles(window,-1,dotty);
width = usable_width(window);
height = usable_height(window);
rp = window->RPort;
#ifdef CLIPPING
xoffset = 0;
yoffset = 0;
clip_for_me(window);
#else
xoffset = window->BorderLeft;
yoffset = window->BorderTop;
#endif
while (TRUE) /* do this forever, or until user gets bored */
{
while (!(message = (struct IntuiMessage *)GetMsg(window->UserPort)) )
{
if (waiting_for_message) Wait(1<<window->UserPort->mp_SigBit);
else
{
x = RangeRand(width);
y = RangeRand(height);
c = RangeRand(32);
SetAPen(rp,c);
if ( WritePixel(rp,xoffset+x,yoffset+y) == -1 )
{
/* be nice - bart 11.18.85 */
OwnBlitter();
DisownBlitter();
}
}
}
MessageClass = message->Class;
ReplyMsg(message);
switch (MessageClass)
{
case CLOSEWINDOW :
{
#ifdef CLIPPING
struct Region *r;
/* remove the ClipRegion before closewindow */
r = InstallClipRegion(window->WLayer,0);
if (r) DisposeRegion(r);
#endif
CloseWindow(window);
CloseLibrary(IntuitionBase);
CloseLibrary(LayersBase);
CloseLibrary(GfxBase);
exit(0);
}
case SIZEVERIFY : waiting_for_message = TRUE;
break;
case REFRESHWINDOW: BeginRefresh(window);
SetAPen(rp,0);
/* should not have to recalculate these */
width = usable_width(window);
height = usable_height(window);
#ifdef CLIPPING
SetRast(rp,0); /* let clipping do work */
#else
RectFill(rp,xoffset,yoffset,
xoffset+width-1,yoffset+height-1);
#endif
EndRefresh(window,TRUE);
break;
case NEWSIZE : waiting_for_message = FALSE;
width = usable_width(window);
height = usable_height(window);
#ifdef CLIPPING
clip_for_me(window);
#endif
break;
}
}
}
---- CUT HERE------