executor/src/qMisc.c

258 lines
6.7 KiB
C

/* Copyright 1986-1995 by Abacus Research and
* Development, Inc. All rights reserved.
*/
#if !defined (OMIT_RCSID_STRINGS)
char ROMlib_rcsid_qMisc[] =
"$Id: qMisc.c 87 2005-05-25 01:57:33Z 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 "ToolboxUtil.h"
#include "rsys/quick.h"
#include "rsys/cquick.h"
#include "rsys/glue.h"
#include "rsys/region.h"
A2(PRIVATE, BOOLEAN, EquivRect, Rect *, rp1, Rect *, rp2)
{
return Cx(rp1->bottom) - Cx(rp1->top) == Cx(rp2->bottom) - Cx(rp2->top) &&
Cx(rp1->right) - Cx(rp1->left) == Cx(rp2->right) - Cx(rp2->left);
}
#define RANDSEED ((ULONGINT) randSeed)
P0(PUBLIC pascal trap, INTEGER, Random)
{
INTEGER retval;
RndSeed = Cx(TickCount()); /* what better? */
if (RANDSEED >= 0x80000000)
randSeedX = CL((RANDSEED & 0x7FFFFFFF) + 1);
randSeedX = CL((RANDSEED * 16807 +
(
(((RANDSEED >> 14) * 16807) +
(((RANDSEED & ((1<<14)-1)) * 16807) >> 14))
>> 17)
) & 0x7FFFFFFF);
if (RANDSEED == 0x7FFFFFFF)
randSeedX = 0;
retval = randSeed;
return retval == -32768 ? 0 : retval;
}
P2 (PUBLIC pascal trap, BOOLEAN, GetPixel, INTEGER, h, INTEGER, v)
{
BitMap temp_bm;
unsigned char temp_fbuf[4];
Rect src_rect, dst_rect;
gui_assert (! CGrafPort_p (thePort));
temp_bm.baseAddr = RM ((Ptr) temp_fbuf);
temp_bm.bounds.top = CWC (0);
temp_bm.bounds.bottom = CWC (1);
temp_bm.bounds.left = CWC (0);
temp_bm.bounds.right = CWC (1);
temp_bm.rowBytes = CWC (4);
src_rect.top = CW (v);
src_rect.bottom = CW (v + 1);
src_rect.left = CW (h);
src_rect.right = CW (h + 1);
dst_rect = temp_bm.bounds;
CopyBits (PORT_BITS_FOR_COPY (thePort), &temp_bm,
&src_rect, &dst_rect, srcCopy, NULL);
return (*temp_fbuf & 0x80) != 0;
}
/* fromhex: converts from '0'-'9' to 0-9, 'a-z' and 'A-Z' similarly */
A1(PRIVATE, INTEGER, fromhex, char, c)
{
if (c >= '0' && c <= '9')
return(c - '0');
else if (c >= 'A' && c <= 'Z')
return(c - 'A' + 10);
else
return(c - 'a' + 10);
}
P2 (PUBLIC pascal trap, void, StuffHex, Ptr, p, StringPtr, s)
{
char *sp, *ep;
unsigned len;
len = s[0];
sp = (char *) s + 1;
ep = sp + (len & ~1);
for (; sp != ep; sp += 2)
*p ++ = (fromhex (*sp) << 4) | fromhex (sp[1]);
if (len & 1)
*p = (*p & 0xF) | (fromhex (*sp) << 4);
}
P3(PUBLIC pascal trap, void, ScalePt, Point *, pt, Rect *, srcr, Rect *, dstr)
{
register INTEGER srcdh, srcdv, dstdh, dstdv;
if (pt->h || pt->v) {
srcdh = Cx(srcr->right) - Cx(srcr->left);
srcdv = Cx(srcr->bottom) - Cx(srcr->top);
dstdh = Cx(dstr->right) - Cx(dstr->left);
dstdv = Cx(dstr->bottom) - Cx(dstr->top);
pt->h = CW(((((LONGINT) CW(pt->h) * dstdh) << 1) / srcdh + 1) >> 1);
pt->v = CW(((((LONGINT) CW(pt->v) * dstdv) << 1) / srcdv + 1) >> 1);
if (CW(pt->v) < 1)
pt->v = CWC(1);
if (CW(pt->h) < 1)
pt->h = CWC(1);
}
}
P3(PUBLIC pascal trap, void, MapPt, Point *, pt, Rect *, srcr, Rect *, dstr)
{
register INTEGER srcdh, srcdv, dstdh, dstdv;
srcdh = Cx(srcr->right) - Cx(srcr->left);
srcdv = Cx(srcr->bottom) - Cx(srcr->top);
dstdh = Cx(dstr->right) - Cx(dstr->left);
dstdv = Cx(dstr->bottom) - Cx(dstr->top);
pt->h = CW(CW(pt->h) - (Cx(srcr->left)));
pt->v = CW(CW(pt->v) - (Cx(srcr->top)));
pt->h = CW((LONGINT) CW(pt->h) * dstdh / srcdh);
pt->v = CW((LONGINT) CW(pt->v) * dstdv / srcdv);
pt->h = CW(CW(pt->h) + (Cx(dstr->left)));
pt->v = CW(CW(pt->v) + (Cx(dstr->top)));
}
P3(PUBLIC pascal trap, void, MapRect, Rect *, r, Rect *, srcr, Rect *, dstr)
{
MapPt((Point *) &r->top, srcr, dstr);
MapPt((Point *) &r->bottom, srcr, dstr);
}
#define IMPOSSIBLE -1
#define MAPH(x) (x = UNFIX((x - xoff1) * xcoff) + xoff2)
#define MAPV(y) (y = UNFIX((y - yoff1) * ycoff) + yoff2)
#define UNFIX(x) ((x) >> 16)
P3(PUBLIC pascal trap, void, MapRgn, RgnHandle, rh, Rect *, srcr, Rect *, dstr)
{
INTEGER *ip, *op, oldv, newv, *tempp, srcdh, dstdh, srcdv, dstdv;
INTEGER xoff1, xoff2, yoff1, yoff2, *saveop, x1, x2;
Fixed xcoff, ycoff;
INTEGER buf1[1000], buf2[1000], *mergebuf, *freebuf, *ipe;
LONGINT hold;
BOOLEAN done;
if (EquivRect(srcr, dstr))
OffsetRgn(rh, Cx(dstr->left) - Cx(srcr->left),
Cx(dstr->top) - Cx(srcr->top));
else {
if (RGN_SMALL_P (rh))
MapRect(&HxX(rh, rgnBBox), srcr, dstr);
else {
srcdh = CW(srcr->right) - (xoff1 = CW(srcr->left));
dstdh = CW(dstr->right) - (xoff2 = CW(dstr->left));
srcdv = CW(srcr->bottom) - (yoff1 = CW(srcr->top) );
dstdv = CW(dstr->bottom) - (yoff2 = CW(dstr->top) );
xcoff = FixRatio(dstdh, srcdh);
ycoff = FixRatio(dstdv, srcdv);
ip = op = (INTEGER *) STARH(rh) + 5;
oldv = -32768;
buf1[0] = 32767;
mergebuf = buf1;
freebuf = buf2;
do {
done = (newv = CW(*ip++)) == 32767;
MAPV(newv);
if (newv != oldv || done) {
if (mergebuf[0] != 32767) {
*op++ = CW(oldv);
saveop = op;
hold = IMPOSSIBLE;
for (tempp = mergebuf; (x1 = *tempp++) != 32767;) {
MAPH(x1);
if (hold == IMPOSSIBLE)
hold = (unsigned short) x1;
else if (hold == x1)
hold = IMPOSSIBLE;
else {
*op++ = CW(hold);
hold = (unsigned short) x1;
}
}
if (hold != IMPOSSIBLE)
*op++ = CW(hold);
gui_assert(!((op - saveop)&1));
if (op == saveop)
--op;
else
*op++ = CWC(32767);
}
gui_assert(op < ip);
mergebuf[0] = 32767;
oldv = newv;
}
if (!done) {
for (tempp = freebuf, ipe = mergebuf,
x1 = CW(*ip++), x2 = *ipe++;;) {
if (x1 < x2) {
*tempp++ = x1;
x1 = CW(*ip++);
} else if (x1 > x2) {
*tempp++ = x2;
x2 = *ipe++;
} else {
if (x1 == 32767)
/*-->*/ break;
x1 = CW(*ip++);
x2 = *ipe++;
}
}
gui_assert(!((tempp-freebuf)&1));
*tempp++ = 32767;
tempp = freebuf;
freebuf = mergebuf;
mergebuf = tempp;
}
} while (!done);
*op++ = CWC(32767);
ROMlib_sizergn(rh, FALSE);
}
}
}
P3(PUBLIC pascal trap, void, MapPoly, PolyHandle, poly, Rect *, srcr,
Rect *, dstr)
{
Point *ip, *ep;
if (EquivRect(srcr, dstr))
OffsetPoly(poly, Cx(dstr->left) - Cx(srcr->left),
Cx(dstr->top) - Cx(srcr->top));
else {
MapPt((Point *) &HxX(poly, polyBBox.top), srcr, dstr);
MapPt((Point *) &HxX(poly, polyBBox.bottom), srcr, dstr);
for (ip = HxX(poly, polyPoints),
ep = ip + (Hx(poly, polySize) - SMALLPOLY)/sizeof(Point);
ip != ep;)
MapPt(ip++, srcr, dstr);
}
}