home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Club Amiga de Montreal - CAM
/
CAM_CD_1.iso
/
files
/
286.lha
/
PxlScope.c
< prev
next >
Wrap
C/C++ Source or Header
|
1989-08-21
|
6KB
|
234 lines
/*
* P x l S c o p e
*
* Opens a window in the workbench screen and shows a magnified view of
* the pixels at the mouse pointer location.
*
* May be freely distributed.
*
* Ed Karlo
* CIS 76657,1445
* November, 1986
*
*/
#include <stdio.h>
#include <stdlib.h>
#include "proto/exec.h"
#include "exec/types.h"
#include "exec/devices.h"
#include "proto/graphics.h"
#include "graphics/copper.h"
#include "graphics/gels.h"
#include "graphics/gfxbase.h"
#include "graphics/regions.h"
#include "hardware/blit.h"
#include "proto/intuition.h"
#include "intuition/intuition.h"
#include "devices/keymap.h"
struct IntuitionBase *IntuitionBase;
struct GfxBase *GfxBase;
#define BIGPIXW 8
#define BIGPIXH 7
struct NewWindow nw = {
324 , 10 , /* LeftEdge, TopEdge */
316 , 181 , /* Width, Height */
0 , 1 , /* DetailPen, BlockPen */
CLOSEWINDOW | /* IDCMPFlags */
NEWSIZE ,
WINDOWCLOSE | /* Flags */
WINDOWDRAG |
WINDOWDEPTH |
WINDOWSIZING |
SMART_REFRESH ,
NULL, /* *FirstGadget */
NULL, /* *CheckMark */
"PxlScope" , /* Title */
NULL , /* *Screen */
NULL , /* *BitMap */
121 , 28 , /* MinWidth, MinHeight */
640 , 200 , /* MaxWidth, MaxHeight */
WBENCHSCREEN /* Type */
};
struct Screen *S;
struct Window *W;
struct IntuiMessage *message;
ULONG class;
USHORT code;
int old_mx, old_my, /* save mouse pos */
wxmaxpix, wymaxpix, /* max big pixels that will fit in window */
/* (includes any partial ones at borders) */
forsx, forsy, /* for loop start x and y pos */
pen, /* hold pixel color */
locsx, locsy; /* local use start x and y locs */
char wkstr[15]; /* build text */
/* function prototypes */
void checkmsg(void);
void windowmax(void);
void splat(int, int);
void putrect(struct Window *, int, int, int, int, int);
void main(argc,argv)
int argc;
char **argv;
{
IntuitionBase = (struct IntuitionBase *)
OpenLibrary("intuition.library", 0);
if (IntuitionBase == NULL) exit (1);
GfxBase = (struct GfxBase *)
OpenLibrary("graphics.library", 0);
if (GfxBase == NULL) exit (2);
W = (struct Window *)OpenWindow(&nw);
if (W == NULL) exit (3);
S = W->WScreen;
SetDrMd(W->RPort, JAM2); /* draw mode */
SetBPen(W->RPort, 2); /* and backround for text */
windowmax();
splat(old_mx = S->MouseX, old_my = S->MouseY);
for (;;) {
checkmsg();
if ( (old_mx != S->MouseX || old_my != S->MouseY) )
splat(old_mx = S->MouseX, old_my = S->MouseY);
}
}
/*
* any messages ?
*/
void checkmsg()
{
while ( message = (struct IntuiMessage *)
GetMsg(W->UserPort) ) {
class = message->Class;
code = message->Code;
ReplyMsg(message);
if (class == CLOSEWINDOW) { /* bye */
CloseWindow (W);
CloseLibrary((struct Library *)IntuitionBase);
CloseLibrary((struct Library *)GfxBase);
exit (0);
}
if (class == NEWSIZE)
windowmax();
} /* while loop for window messages */
}
/*
* how many pixels can dance on the head of a pin ?
*/
void windowmax()
{
wxmaxpix = (W->Width - 4) / BIGPIXW;
if ( (W->Width - 4) % BIGPIXW ) wxmaxpix++;
wymaxpix = (W->Height - 20) / BIGPIXH;
if ( (W->Height - 20) % BIGPIXH ) wymaxpix++;
}
/*
* fills the window with big pixels
*/
void splat(mx, my)
int mx, my;
{
putrect(W, 2, 2, 10, W->Width - 3, 18);
sprintf(wkstr, "X=%4d Y=%4d", mx, my);
SetAPen(W->RPort, 1);
Move(W->RPort, 5, 17);
Text(W->RPort, wkstr, 14);
for (forsy=0; forsy<=wymaxpix; forsy++) {
for (forsx=0; forsx<=wxmaxpix; forsx++) {
checkmsg();
if ( (old_mx != S->MouseX || old_my != S->MouseY) )
return; /* still moving */
if ( mx+forsx > 639 || my+forsy > 199 ) { /* in the rough */
putrect(W, 3, 2 + (forsx*BIGPIXW), 19 + (forsy*BIGPIXH),
9 + (forsx*BIGPIXW), 25 + (forsy*BIGPIXH) );
} else { /* in the ball park */
/* draw big pixel and blank out right and bottom of it */
pen = ReadPixel(&S->RastPort, mx+forsx, my+forsy);
locsx = forsx * BIGPIXW;
locsy = forsy * BIGPIXH;
putrect( W, pen, 2 + locsx, 19 + locsy,
6 + locsx, 24 + locsy );
putrect( W, 0, 7 + locsx, 19 + locsy,
9 + locsx, 24 + locsy );
putrect( W, 0, 2 + locsx, 25 + locsy,
9 + locsx, 25 + locsy );
} /* drawing the big pixel */
} /* for x loop */
} /* for y loop */
}
/*
* draws a rectangle in window w in pen color penn taking care
* not to damage right and bottom border and size gadget
*/
void putrect(w, penn, sx, sy, ex, ey)
struct Window *w;
int penn, sx, sy, ex, ey;
{
int sgx, sgy; /* size gadget border pos */
if ( sx > w->Width - 3 || sy > w->Height - 2 ) /* out of sight */
return;
if ( ex > w->Width - 3 ) /* don't overwrite right border */
ex = (w->Width) - 3;
if ( ey > w->Height - 2 ) /* don't overwrite bottom border */
ey = w->Height - 2;
sgx = w->Width - 17; /* compute boundary of size gadget */
sgy = w->Height - 10;
if ( sx > sgx && sy > sgy ) /* entirely behind size gadget */
return;
SetAPen(w->RPort, penn);
if ( ex > sgx && ey > sgy ) { /* ends within size gadget */
if ( sx > sgx ) /* entirely above */
RectFill(w->RPort, sx, sy, ex, sgy);
else
if ( sy > sgy ) /* entirely beside */
RectFill(w->RPort, sx, sy, sgx, ey);
else { /* on the corner */
RectFill(w->RPort, sx, sy, ex, sgy);
RectFill(w->RPort, sx, sgy+1, sgx, ey);
}
} else
RectFill(w->RPort, sx, sy, ex, ey);
}