/* Lupe.c - vergrößert die Pixel unter dem Mousepointer */

#include <dos/dos.h>
#include <intuition/intuitionbase.h>
#include <intuition/intuition.h>
#include <graphics/gfxmacros.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/graphics_protos.h>
#include <clib/intuition_protos.h>
#include <stdlib.h>

extern struct IntuitionBase *IntuitionBase;

#define ACTIVE_SCREEN ((struct Screen *)(IntuitionBase->ActiveScreen))

ULONG GetMessage(struct Window *win, USHORT *code)
{/* MsgPort auslesen; liefert CLASS und ggf. CODE */
    struct IntuiMessage *msg;
    ULONG class=0;

    if(msg=(struct IntuiMessage *)GetMsg(win->UserPort))
	{
	class=msg->Class;
	if(code) *code=msg->Code;
	ReplyMsg((struct Message *)msg);
	}
    else if(code) *code=0;
    return(class);
}

#define RP_S (&ACTIVE_SCREEN->RastPort)
#define XPos (ACTIVE_SCREEN->MouseX)
#define YPos (ACTIVE_SCREEN->MouseY)

int _main(void)
{
    struct Window *win;
    register struct RastPort *RP_W;
    ULONG class=0;
    short x0,y0,x1,y1,width=11,height=11,plusminus=4,key;
    register COUNT i,j;

    if(!(win=OpenWindowTags(NULL, WA_GimmeZeroZero,TRUE,
		       WA_InnerWidth,(2*plusminus+1)*width+1,
		       WA_InnerHeight,(2*plusminus+1)*height+1,
		       WA_IDCMP,IDCMP_CLOSEWINDOW|IDCMP_NEWSIZE| \
				IDCMP_MOUSEMOVE|IDCMP_VANILLAKEY,
		       WA_ReportMouse,TRUE, WA_DragBar,TRUE,
		       WA_DepthGadget,TRUE, WA_SizeGadget,TRUE,
		       WA_SizeBBottom,TRUE, WA_CloseGadget,TRUE,
		       WA_Activate,TRUE, WA_Title,"Gummi-Lupe",
		       WA_RMBTrap,TRUE, WA_MinWidth,0, WA_MinHeight,0,
		       WA_MaxWidth,~0, WA_MaxHeight,~0, WA_AutoAdjust,TRUE,
		       WA_MouseQueue,2, TAG_DONE)))
	{
	Printf("kann Window nicht öffnen !\n");
	return(RETURN_ERROR);
	}
    RP_W=win->RPort;
    SetDrMd(RP_W, JAM1);
    SetOPen(RP_W, 3);
    while(class!=IDCMP_CLOSEWINDOW)
	{
	WaitPort(win->UserPort);
	class=GetMessage(win,&key);
	switch(class)
	    {
	    case IDCMP_VANILLAKEY:
		switch(key)
		    {
		    case 27:	goto ende;  /* break; */
		    case 'p':   case 'P':   case '+':
			++plusminus;
			goto redim;
			/* break; */
		    case 'm':   case 'M':   case '-':
			if(plusminus>1)
			    {
			    --plusminus;
			    goto redim;
			    }
			/* break; */
		    }
		break;
	    case IDCMP_NEWSIZE:
redim:		width=(win->GZZWidth)/(2*plusminus+1);
		height=(win->GZZHeight)/(2*plusminus+1);
		if(width<3 || height<3) { --plusminus; goto redim; }
		SetRast(RP_W,0);
	    case MOUSEMOVE:
		x0=XPos;    y0=YPos;
		for(i=-plusminus; i<=plusminus; ++i)
		    for(j=-plusminus; j<=plusminus; ++j)
			{
			SetAPen(RP_W, ReadPixel(RP_S, x0+j, y0+i));
			x1=(j+plusminus)*width;
			y1=(i+plusminus)*height;
			RectFill(RP_W, x1,y1,x1+width,y1+height);
			}
		while((class=GetMessage(win,NULL))==MOUSEMOVE);
		break;
	    }
	}

ende:
    CloseWindow(win);
    return(RETURN_OK);
}

extern void _waitwbmsg(void);
void routing_that_is_never_called(void) { _waitwbmsg(); }

