307 lines
8.2 KiB
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);
|
|
}
|