executor/src/qGrafport.c

307 lines
8.2 KiB
C

/* Copyright 1986-1995 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_qGrafport[] =
"$Id: qGrafport.c 63 2004-12-24 18:19:43Z ctm $";
#endif
/* Forward declarations in QuickDraw.h (DO NOT DELETE THIS LINE) */
#include "rsys/common.h"
#include "QuickDraw.h"
#include "CQuickDraw.h"
#include "ToolboxEvent.h"
#include "MemoryMgr.h"
#include "WindowMgr.h"
#include "SysErr.h"
#include "rsys/mman.h"
#include "rsys/cquick.h"
#include "rsys/picture.h"
P1(PUBLIC pascal trap, void, InitGraf, Ptr, gp)
{
PixMapHandle main_gd_pixmap;
#if defined (BINCOMPAT)
(*(HIDDEN_Ptr *) (long) SYN68K_TO_US(a5)).p = RM (gp);
#endif /* BINCOMPAT */
main_gd_pixmap = GD_PMAP (MR (MainDevice));
/* screenBitsX flag bits must not be set */
screenBitsX.baseAddr = PIXMAP_BASEADDR_X (main_gd_pixmap);
screenBitsX.rowBytes = CW (PIXMAP_ROWBYTES (main_gd_pixmap) /
PIXMAP_PIXEL_SIZE (main_gd_pixmap));
screenBitsX.bounds = PIXMAP_BOUNDS (main_gd_pixmap);
#define patinit(d, s) (*(LONGINT *)d = CLC(s), *((LONGINT *)d+1) = CLC(s))
ZONE_SAVE_EXCURSION
(SysZone,
{
patinit(white, 0x00000000);
patinit(black, 0xffffffff);
patinit(gray, 0xaa55aa55);
patinit(ltGray, 0x88228822);
patinit(dkGray, 0x77dd77dd);
WMgrPort = RM ((WindowPtr) NewPtr (sizeof (GrafPort)));
OpenPort (MR (WMgrPort));
WMgrCPort = (CWindowPtr) RM (NewPtr (sizeof (CGrafPort)));
OpenCPort (MR (WMgrCPort));
thePortX = (GrafPtr) WMgrCPort;
ScrnBase = screenBitsX.baseAddr;
StuffHex((Ptr) arrowX.data,
(StringPtr) ("\100000040006000700078007c007e007f"
"007f807c006c0046000600030003000000"));
StuffHex((Ptr) arrowX.mask,
(StringPtr) ("\100c000e000f000f800fc00fe00ff00ff"
"80ffc0ffe0fe00ef00cf00878007800380"));
arrowX.hotSpot.h = arrowX.hotSpot.v = CWC(1);
CrsrState = 0;
RndSeed = CL (TickCount ());
ScrVRes = ScrHRes = CWC(72);
ScreenRow = screenBitsX.rowBytes;
randSeedX = CLC (1);
QDExist = EXIST_YES;
});
}
/*
* ROMlib_initport does everything except play with cliprgn and visrgn.
* It exists so that SysError can call it and maniuplate clip and
* vis without using the memory manager.
*/
A1(PUBLIC, void, ROMlib_initport, GrafPtr, p) /* INTERNAL */
{
/* this is a grafport, not a cgrafport, so the flag bits must not be
set. when we get here, it is likely they they contain garbage,
so initialize them before using any accesssor macros */
p->portBits.rowBytes = CWC (0);
PORT_DEVICE_X (p) = 0;
PORT_BITS (p) = screenBitsX;
PORT_RECT (p) = screenBitsX.bounds;
PATASSIGN (PORT_BK_PAT (p), white);
PATASSIGN (PORT_FILL_PAT (p), black);
PATASSIGN (PORT_PEN_PAT (p), black);
PORT_PEN_LOC (p).h = PORT_PEN_LOC (p).v = CWC (0);
PORT_PEN_SIZE (p).h = PORT_PEN_SIZE (p).v = CWC (1);
PORT_PEN_MODE_X (p) = CWC (patCopy);
PORT_PEN_VIS_X (p) = CWC (0);
PORT_TX_FONT_X (p) = CWC (0);
/* txFace is a Style (signed char); don't swap */
PORT_TX_FACE_X (p) = 0;
*((char *)&p->txFace + 1) = 0; /* Excel & tests show we need to do this. */
PORT_TX_MODE_X (p) = CWC (srcOr);
PORT_TX_SIZE_X (p) = CWC (0);
PORT_SP_EXTRA_X (p) = CWC (0);
PORT_FG_COLOR_X (p) = CLC (blackColor);
PORT_BK_COLOR_X (p) = CLC (whiteColor);
PORT_COLR_BIT_X (p) = CWC (0);
PORT_PAT_STRETCH_X (p) = CWC (0);
PORT_PIC_SAVE_X (p) = CLC (0);
PORT_REGION_SAVE_X (p) = CLC (0);
PORT_POLY_SAVE_X (p) = CLC (0);
PORT_GRAF_PROCS_X (p) = CLC (0);
}
P1(PUBLIC pascal trap, void, SetPort, GrafPtr, p)
{
if (p == NULL)
warning_unexpected ("SetPort(NULL_STRING)");
thePortX = RM(p);
}
P1(PUBLIC pascal trap, void, InitPort, GrafPtr, p)
{
ROMlib_initport(p);
SetEmptyRgn (PORT_VIS_REGION (p));
SetEmptyRgn (PORT_CLIP_REGION (p));
HxX (PORT_VIS_REGION (p), rgnBBox) = screenBitsX.bounds;
SetRect (&HxX (PORT_CLIP_REGION (p), rgnBBox), -32767, -32767, 32767, 32767);
SetPort (p);
}
P1(PUBLIC pascal trap, void, OpenPort, GrafPtr, p)
{
PORT_VIS_REGION_X (p) = RM (NewRgn ());
PORT_CLIP_REGION_X (p) = RM (NewRgn ());
InitPort (p);
}
/*
* "Five of a Kind" calls CloseWindow (x) followed by ClosePort (x).
* That used to kill us, but checking MemErr gets around that problem.
* I'm not sure how the Mac gets around it.
*/
P1(PUBLIC pascal trap, void, ClosePort, GrafPtr, p)
{
DisposeRgn (PORT_VIS_REGION (p));
if (MemErr == CWC (noErr))
{
DisposeRgn (PORT_CLIP_REGION (p));
if (MemErr == CWC (noErr))
{
if (CGrafPort_p (p))
{
DisposPixPat (CPORT_BK_PIXPAT (p));
DisposPixPat (CPORT_PEN_PIXPAT (p));
DisposPixPat (CPORT_FILL_PIXPAT (p));
DisposHandle ((Handle) CPORT_PIXMAP (p)); /* NOT DisposPixMap */
DisposHandle ((Handle) CPORT_GRAFVARS (p));
}
}
}
}
P1(PUBLIC pascal trap, void, GetPort, HIDDEN_GrafPtr *, pp)
{
(*pp).p = thePortX;
}
P1(PUBLIC pascal trap, void, GrafDevice, INTEGER, d)
{
PORT_DEVICE_X (thePort) = Cx (d);
}
P1(PUBLIC pascal trap, void, SetPortBits, BitMap *, bm)
{
if (! CGrafPort_p (thePort))
PORT_BITS (thePort) = *bm;
}
P2(PUBLIC pascal trap, void, PortSize, INTEGER, w, INTEGER, h)
{
PORT_RECT (thePort).bottom = CW (CW (PORT_RECT (thePort).top) + h);
PORT_RECT (thePort).right = CW (CW (PORT_RECT (thePort).left) + w);
}
P2 (PUBLIC pascal trap, void, MovePortTo, INTEGER, lg, INTEGER, tg)
{
GrafPtr current_port;
Rect *port_bounds, *port_rect;
int w, h;
current_port = thePort;
port_bounds = &PORT_BOUNDS (current_port);
port_rect = &PORT_RECT (current_port);
lg = CW (port_rect->left) - lg;
tg = CW (port_rect->top) - tg;
w = RECT_WIDTH (port_bounds);
h = RECT_HEIGHT (port_bounds);
SetRect (port_bounds, lg, tg, lg + w, tg + h);
}
P2 (PUBLIC pascal trap, void, SetOrigin, INTEGER, h, INTEGER, v)
{
int32 dh, dv;
dh = h - Cx (PORT_RECT (thePort).left);
dv = v - Cx (PORT_RECT (thePort).top);
PIC_SAVE_EXCURSION
({
int16 swappeddh;
int16 swappeddv;
PICOP (OP_Origin);
swappeddh = CW(dh);
PICWRITE (&swappeddh, sizeof swappeddh);
swappeddv = CW(dv);
PICWRITE (&swappeddv, sizeof swappeddv);
});
OffsetRect (&PORT_BOUNDS (thePort), dh, dv);
OffsetRect (&PORT_RECT (thePort), dh, dv);
OffsetRgn (PORT_VIS_REGION (thePort), dh, dv);
if (SaveVisRgn)
OffsetRgn (MR (SaveVisRgn), dh, dv);
}
P1(PUBLIC pascal trap, void, SetClip, RgnHandle, r)
{
CopyRgn (r, PORT_CLIP_REGION (thePort));
}
P1(PUBLIC pascal trap, void, GetClip, RgnHandle, r)
{
CopyRgn (PORT_CLIP_REGION (thePort), r);
}
P1(PUBLIC pascal trap, void, ClipRect, Rect *, r)
{
Rect r_copy;
/* We copy r to a local, in case it points to memory that might move
* during the RectRgn.
*/
r_copy = *r;
RectRgn (PORT_CLIP_REGION (thePort), &r_copy);
}
P1(PUBLIC pascal trap, void, BackPat, Pattern, pp)
{
if (CGrafPort_p (thePort))
{
PixPatHandle old_bk;
old_bk = CPORT_BK_PIXPAT (theCPort);
if (old_bk && PIXPAT_TYPE_X (old_bk) == pixpat_type_orig)
PATASSIGN (PIXPAT_1DATA (old_bk), pp);
else
{
PixPatHandle new_bk = NewPixPat ();
PIXPAT_TYPE_X (new_bk) = CWC (0);
PATASSIGN (PIXPAT_1DATA (new_bk), pp);
BackPixPat (new_bk);
}
/*
* On a Mac, PIXPAT_1DATA is *not* updated here, instead a new pixpat
* is created and the other fields are set up to point to this guy.
*/
/* #warning BackPat not currently implemented properly ... */
}
else
PATASSIGN (PORT_BK_PAT (thePort), pp);
}
A1 (PUBLIC, void, ROMlib_fill_pat, Pattern, pp) /* INTERNAL */
{
if (CGrafPort_p (thePort))
{
PixPatHandle old_fill;
old_fill = CPORT_FILL_PIXPAT (theCPort);
if (PIXPAT_TYPE_X (old_fill) == CWC (pixpat_type_orig))
PATASSIGN (PIXPAT_1DATA (old_fill), pp);
else
{
PixPatHandle new_fill = NewPixPat ();
PIXPAT_TYPE_X (new_fill) = CWC (0);
PATASSIGN (PIXPAT_1DATA (new_fill), pp);
ROMlib_fill_pixpat (new_fill);
}
/*
* It's not clear what we're supposed to be doing here.
*/
/* #warning ROMlib_fill_pat not currently implemented properly... */
}
else
PATASSIGN (PORT_FILL_PAT (thePort), pp);
}