mirror of
https://github.com/jrk/QuickDraw.git
synced 2025-03-22 05:29:25 +00:00
419 lines
13 KiB
OpenEdge ABL
Executable File
419 lines
13 KiB
OpenEdge ABL
Executable File
UNIT QuickDraw;
|
|
|
|
{ Copyright 1983 Apple Computer Inc. }
|
|
{ Written by Bill Atkinson }
|
|
|
|
INTERFACE
|
|
|
|
CONST srcCopy = 0; { the 16 transfer modes }
|
|
srcOr = 1;
|
|
srcXor = 2;
|
|
srcBic = 3;
|
|
notSrcCopy = 4;
|
|
notSrcOr = 5;
|
|
notSrcXor = 6;
|
|
notSrcBic = 7;
|
|
patCopy = 8;
|
|
patOr = 9;
|
|
patXor = 10;
|
|
patBic = 11;
|
|
notPatCopy = 12;
|
|
notPatOr = 13;
|
|
notPatXor = 14;
|
|
notPatBic = 15;
|
|
|
|
{ QuickDraw color separation constants }
|
|
|
|
normalBit = 0; { normal screen mapping }
|
|
inverseBit = 1; { inverse screen mapping }
|
|
redBit = 4; { RGB additive mapping }
|
|
greenBit = 3;
|
|
blueBit = 2;
|
|
cyanBit = 8; { CMYBk subtractive mapping }
|
|
magentaBit = 7;
|
|
yellowBit = 6;
|
|
blackBit = 5;
|
|
|
|
blackColor = 33; { colors expressed in these mappings }
|
|
whiteColor = 30;
|
|
redColor = 205;
|
|
greenColor = 341;
|
|
blueColor = 409;
|
|
cyanColor = 273;
|
|
magentaColor = 137;
|
|
yellowColor = 69;
|
|
|
|
picLParen = 0; { standard picture comments }
|
|
picRParen = 1;
|
|
|
|
|
|
TYPE QDByte = -128..127;
|
|
QDPtr = ^QDByte; { blind pointer }
|
|
QDHandle = ^QDPtr; { blind handle }
|
|
Str255 = String[255];
|
|
Pattern = PACKED ARRAY[0..7] OF 0..255;
|
|
Bits16 = ARRAY[0..15] OF INTEGER;
|
|
VHSelect = (v,h);
|
|
GrafVerb = (frame,paint,erase,invert,fill);
|
|
StyleItem = (bold,italic,underline,outline,shadow,condense,extend);
|
|
Style = SET OF StyleItem;
|
|
|
|
FontInfo = RECORD
|
|
ascent: INTEGER;
|
|
descent: INTEGER;
|
|
widMax: INTEGER;
|
|
leading: INTEGER;
|
|
END;
|
|
|
|
Point = RECORD CASE INTEGER OF
|
|
|
|
0: (v: INTEGER;
|
|
h: INTEGER);
|
|
|
|
1: (vh: ARRAY[VHSelect] OF INTEGER);
|
|
|
|
END;
|
|
|
|
|
|
Rect = RECORD CASE INTEGER OF
|
|
|
|
0: (top: INTEGER;
|
|
left: INTEGER;
|
|
bottom: INTEGER;
|
|
right: INTEGER);
|
|
|
|
1: (topLeft: Point;
|
|
botRight: Point);
|
|
END;
|
|
|
|
|
|
BitMap = RECORD
|
|
baseAddr: QDPtr;
|
|
rowBytes: INTEGER;
|
|
bounds: Rect;
|
|
END;
|
|
|
|
|
|
Cursor = RECORD
|
|
data: Bits16;
|
|
mask: Bits16;
|
|
hotSpot: Point;
|
|
END;
|
|
|
|
|
|
PenState = RECORD
|
|
pnLoc: Point;
|
|
pnSize: Point;
|
|
pnMode: INTEGER;
|
|
pnPat: Pattern;
|
|
END;
|
|
|
|
|
|
PolyHandle = ^PolyPtr;
|
|
PolyPtr = ^Polygon;
|
|
Polygon = RECORD
|
|
polySize: INTEGER;
|
|
polyBBox: Rect;
|
|
polyPoints: ARRAY[0..0] OF Point;
|
|
END;
|
|
|
|
|
|
RgnHandle = ^RgnPtr;
|
|
RgnPtr = ^Region;
|
|
Region = RECORD
|
|
rgnSize: INTEGER; { rgnSize = 10 for rectangular }
|
|
rgnBBox: Rect;
|
|
{ plus more data if not rectangular }
|
|
END;
|
|
|
|
|
|
PicHandle = ^PicPtr;
|
|
PicPtr = ^Picture;
|
|
Picture = RECORD
|
|
picSize: INTEGER;
|
|
picFrame: Rect;
|
|
{ plus byte codes for picture content }
|
|
END;
|
|
|
|
|
|
QDProcsPtr = ^QDProcs;
|
|
QDProcs = RECORD
|
|
textProc: QDPtr;
|
|
lineProc: QDPtr;
|
|
rectProc: QDPtr;
|
|
rRectProc: QDPtr;
|
|
ovalProc: QDPtr;
|
|
arcProc: QDPtr;
|
|
polyProc: QDPtr;
|
|
rgnProc: QDPtr;
|
|
bitsProc: QDPtr;
|
|
commentProc: QDPtr;
|
|
txMeasProc: QDPtr;
|
|
getPicProc: QDPtr;
|
|
putPicProc: QDPtr;
|
|
END;
|
|
|
|
|
|
GrafPtr = ^GrafPort;
|
|
GrafPort = RECORD
|
|
device: INTEGER;
|
|
portBits: BitMap;
|
|
portRect: Rect;
|
|
visRgn: RgnHandle;
|
|
clipRgn: RgnHandle;
|
|
bkPat: Pattern;
|
|
fillPat: Pattern;
|
|
pnLoc: Point;
|
|
pnSize: Point;
|
|
pnMode: INTEGER;
|
|
pnPat: Pattern;
|
|
pnVis: INTEGER;
|
|
txFont: INTEGER;
|
|
txFace: Style;
|
|
txMode: INTEGER;
|
|
txSize: INTEGER;
|
|
spExtra: LongInt;
|
|
fgColor: LongInt;
|
|
bkColor: LongInt;
|
|
colrBit: INTEGER;
|
|
patStretch: INTEGER;
|
|
picSave: QDHandle;
|
|
rgnSave: QDHandle;
|
|
polySave: QDHandle;
|
|
grafProcs: QDProcsPtr;
|
|
END;
|
|
|
|
|
|
|
|
VAR thePort: GrafPtr;
|
|
white: Pattern;
|
|
black: Pattern;
|
|
gray: Pattern;
|
|
ltGray: Pattern;
|
|
dkGray: Pattern;
|
|
arrow: Cursor;
|
|
screenBits: BitMap;
|
|
randSeed: LongInt;
|
|
|
|
|
|
{ GrafPort Routines }
|
|
|
|
PROCEDURE InitGraf (globalPtr: QDPtr);
|
|
PROCEDURE OpenPort (port: GrafPtr);
|
|
PROCEDURE InitPort (port: GrafPtr);
|
|
PROCEDURE ClosePort (port: GrafPtr);
|
|
PROCEDURE SetPort (port: GrafPtr);
|
|
PROCEDURE GetPort (VAR port: GrafPtr);
|
|
PROCEDURE GrafDevice (device: INTEGER);
|
|
PROCEDURE SetPortBits(bm: BitMap);
|
|
PROCEDURE PortSize (width,height: INTEGER);
|
|
PROCEDURE MovePortTo (leftGlobal,topGlobal: INTEGER);
|
|
PROCEDURE SetOrigin (h,v: INTEGER);
|
|
PROCEDURE SetClip (rgn: RgnHandle);
|
|
PROCEDURE GetClip (rgn: RgnHandle);
|
|
PROCEDURE ClipRect (r: Rect);
|
|
PROCEDURE BackPat (pat: Pattern);
|
|
|
|
|
|
{ Cursor Routines }
|
|
|
|
PROCEDURE InitCursor;
|
|
PROCEDURE SetCursor(crsr: Cursor);
|
|
PROCEDURE HideCursor;
|
|
PROCEDURE ShowCursor;
|
|
PROCEDURE ObscureCursor;
|
|
|
|
|
|
{ Line Routines }
|
|
|
|
PROCEDURE HidePen;
|
|
PROCEDURE ShowPen;
|
|
PROCEDURE GetPen (VAR pt: Point);
|
|
PROCEDURE GetPenState(VAR pnState: PenState);
|
|
PROCEDURE SetPenState(pnState: PenState);
|
|
PROCEDURE PenSize (width,height: INTEGER);
|
|
PROCEDURE PenMode (mode: INTEGER);
|
|
PROCEDURE PenPat (pat: Pattern);
|
|
PROCEDURE PenNormal;
|
|
PROCEDURE MoveTo (h,v: INTEGER);
|
|
PROCEDURE Move (dh,dv: INTEGER);
|
|
PROCEDURE LineTo (h,v: INTEGER);
|
|
PROCEDURE Line (dh,dv: INTEGER);
|
|
|
|
|
|
{ Text Routines }
|
|
|
|
PROCEDURE TextFont (font: INTEGER);
|
|
PROCEDURE TextFace (face: Style);
|
|
PROCEDURE TextMode (mode: INTEGER);
|
|
PROCEDURE TextSize (size: INTEGER);
|
|
PROCEDURE SpaceExtra (extra: LongInt);
|
|
PROCEDURE DrawChar (ch: char);
|
|
PROCEDURE DrawString (s: Str255);
|
|
PROCEDURE DrawText (textBuf: QDPtr; firstByte,byteCount: INTEGER);
|
|
FUNCTION CharWidth (ch: CHAR): INTEGER;
|
|
FUNCTION StringWidth (s: Str255): INTEGER;
|
|
FUNCTION TextWidth (textBuf: QDPtr; firstByte,byteCount: INTEGER): INTEGER;
|
|
PROCEDURE GetFontInfo (VAR info: FontInfo);
|
|
|
|
|
|
{ Point Calculations }
|
|
|
|
PROCEDURE AddPt (src: Point; VAR dst: Point);
|
|
PROCEDURE SubPt (src: Point; VAR dst: Point);
|
|
PROCEDURE SetPt (VAR pt: Point; h,v: INTEGER);
|
|
FUNCTION EqualPt (pt1,pt2: Point): BOOLEAN;
|
|
PROCEDURE ScalePt (VAR pt: Point; fromRect,toRect: Rect);
|
|
PROCEDURE MapPt (VAR pt: Point; fromRect,toRect: Rect);
|
|
PROCEDURE LocalToGlobal (VAR pt: Point);
|
|
PROCEDURE GlobalToLocal (VAR pt: Point);
|
|
|
|
|
|
{ Rectangle Calculations }
|
|
|
|
PROCEDURE SetRect (VAR r: Rect; left,top,right,bottom: INTEGER);
|
|
FUNCTION EqualRect (rect1,rect2: Rect): BOOLEAN;
|
|
FUNCTION EmptyRect (r: Rect): BOOLEAN;
|
|
PROCEDURE OffsetRect (VAR r: Rect; dh,dv: INTEGER);
|
|
PROCEDURE MapRect (VAR r: Rect; fromRect,toRect: Rect);
|
|
PROCEDURE InsetRect (VAR r: Rect; dh,dv: INTEGER);
|
|
FUNCTION SectRect (src1,src2: Rect; VAR dstRect: Rect): BOOLEAN;
|
|
PROCEDURE UnionRect (src1,src2: Rect; VAR dstRect: Rect);
|
|
FUNCTION PtInRect (pt: Point; r: Rect): BOOLEAN;
|
|
PROCEDURE Pt2Rect (pt1,pt2: Point; VAR dstRect: Rect);
|
|
|
|
|
|
{ Graphical Operations on Rectangles }
|
|
|
|
PROCEDURE FrameRect (r: Rect);
|
|
PROCEDURE PaintRect (r: Rect);
|
|
PROCEDURE EraseRect (r: Rect);
|
|
PROCEDURE InvertRect (r: Rect);
|
|
PROCEDURE FillRect (r: Rect; pat: Pattern);
|
|
|
|
|
|
{ RoundRect Routines }
|
|
|
|
PROCEDURE FrameRoundRect (r: Rect; ovWd,ovHt: INTEGER);
|
|
PROCEDURE PaintRoundRect (r: Rect; ovWd,ovHt: INTEGER);
|
|
PROCEDURE EraseRoundRect (r: Rect; ovWd,ovHt: INTEGER);
|
|
PROCEDURE InvertRoundRect (r: Rect; ovWd,ovHt: INTEGER);
|
|
PROCEDURE FillRoundRect (r: Rect; ovWd,ovHt: INTEGER; pat: Pattern);
|
|
|
|
|
|
{ Oval Routines }
|
|
|
|
PROCEDURE FrameOval (r: Rect);
|
|
PROCEDURE PaintOval (r: Rect);
|
|
PROCEDURE EraseOval (r: Rect);
|
|
PROCEDURE InvertOval (r: Rect);
|
|
PROCEDURE FillOval (r: Rect; pat: Pattern);
|
|
|
|
|
|
{ Arc Routines }
|
|
|
|
PROCEDURE FrameArc (r: Rect; startAngle,arcAngle: INTEGER);
|
|
PROCEDURE PaintArc (r: Rect; startAngle,arcAngle: INTEGER);
|
|
PROCEDURE EraseArc (r: Rect; startAngle,arcAngle: INTEGER);
|
|
PROCEDURE InvertArc (r: Rect; startAngle,arcAngle: INTEGER);
|
|
PROCEDURE FillArc (r: Rect; startAngle,arcAngle: INTEGER; pat: Pattern);
|
|
PROCEDURE PtToAngle (r: Rect; pt: Point; VAR angle: INTEGER);
|
|
|
|
|
|
{ Polygon Routines }
|
|
|
|
FUNCTION OpenPoly: PolyHandle;
|
|
PROCEDURE ClosePoly;
|
|
PROCEDURE KillPoly (poly: PolyHandle);
|
|
PROCEDURE OffsetPoly (poly: PolyHandle; dh,dv: INTEGER);
|
|
PROCEDURE MapPoly (poly: PolyHandle; fromRect,toRect: Rect);
|
|
PROCEDURE FramePoly (poly: PolyHandle);
|
|
PROCEDURE PaintPoly (poly: PolyHandle);
|
|
PROCEDURE ErasePoly (poly: PolyHandle);
|
|
PROCEDURE InvertPoly (poly: PolyHandle);
|
|
PROCEDURE FillPoly (poly: PolyHandle; pat: Pattern);
|
|
|
|
|
|
{ Region Calculations }
|
|
|
|
FUNCTION NewRgn: RgnHandle;
|
|
PROCEDURE DisposeRgn(rgn: RgnHandle);
|
|
PROCEDURE CopyRgn (srcRgn,dstRgn: RgnHandle);
|
|
PROCEDURE SetEmptyRgn(rgn: RgnHandle);
|
|
PROCEDURE SetRectRgn(rgn: RgnHandle; left,top,right,bottom: INTEGER);
|
|
PROCEDURE RectRgn (rgn: RgnHandle; r: Rect);
|
|
PROCEDURE OpenRgn;
|
|
PROCEDURE CloseRgn (dstRgn: RgnHandle);
|
|
PROCEDURE OffsetRgn (rgn: RgnHandle; dh,dv: INTEGER);
|
|
PROCEDURE MapRgn (rgn: RgnHandle; fromRect,toRect: Rect);
|
|
PROCEDURE InsetRgn (rgn: RgnHandle; dh,dv: INTEGER);
|
|
PROCEDURE SectRgn (srcRgnA,srcRgnB,dstRgn: RgnHandle);
|
|
PROCEDURE UnionRgn (srcRgnA,srcRgnB,dstRgn: RgnHandle);
|
|
PROCEDURE DiffRgn (srcRgnA,srcRgnB,dstRgn: RgnHandle);
|
|
PROCEDURE XorRgn (srcRgnA,srcRgnB,dstRgn: RgnHandle);
|
|
FUNCTION EqualRgn (rgnA,rgnB: RgnHandle): BOOLEAN;
|
|
FUNCTION EmptyRgn (rgn: RgnHandle): BOOLEAN;
|
|
FUNCTION PtInRgn (pt: Point; rgn: RgnHandle): BOOLEAN;
|
|
FUNCTION RectInRgn (r: Rect; rgn: RgnHandle): BOOLEAN;
|
|
|
|
|
|
{ Graphical Operations on Regions }
|
|
|
|
PROCEDURE FrameRgn (rgn: RgnHandle);
|
|
PROCEDURE PaintRgn (rgn: RgnHandle);
|
|
PROCEDURE EraseRgn (rgn: RgnHandle);
|
|
PROCEDURE InvertRgn (rgn: RgnHandle);
|
|
PROCEDURE FillRgn (rgn: RgnHandle; pat: Pattern);
|
|
|
|
|
|
{ Graphical Operations on BitMaps }
|
|
|
|
PROCEDURE ScrollRect(dstRect: Rect; dh,dv: INTEGER; updateRgn: rgnHandle);
|
|
PROCEDURE CopyBits (srcBits,dstBits: BitMap;
|
|
srcRect,dstRect: Rect;
|
|
mode: INTEGER;
|
|
maskRgn: RgnHandle);
|
|
|
|
{ Picture Routines }
|
|
|
|
FUNCTION OpenPicture(picFrame: Rect): PicHandle;
|
|
PROCEDURE ClosePicture;
|
|
PROCEDURE DrawPicture(myPicture: PicHandle; dstRect: Rect);
|
|
PROCEDURE PicComment(kind,dataSize: INTEGER; dataHandle: QDHandle);
|
|
PROCEDURE KillPicture(myPicture: PicHandle);
|
|
|
|
|
|
{ The Bottleneck Interface: }
|
|
|
|
PROCEDURE SetStdProcs(VAR procs: QDProcs);
|
|
PROCEDURE StdText (count: INTEGER; textAddr: QDPtr; numer,denom: Point);
|
|
PROCEDURE StdLine (newPt: Point);
|
|
PROCEDURE StdRect (verb: GrafVerb; r: Rect);
|
|
PROCEDURE StdRRect (verb: GrafVerb; r: Rect; ovWd,ovHt: INTEGER);
|
|
PROCEDURE StdOval (verb: GrafVerb; r: Rect);
|
|
PROCEDURE StdArc (verb: GrafVerb; r: Rect; startAngle,arcAngle: INTEGER);
|
|
PROCEDURE StdPoly (verb: GrafVerb; poly: PolyHandle);
|
|
PROCEDURE StdRgn (verb: GrafVerb; rgn: RgnHandle);
|
|
PROCEDURE StdBits (VAR srcBits: BitMap; VAR srcRect,dstRect: Rect;
|
|
mode: INTEGER; maskRgn: RgnHandle);
|
|
PROCEDURE StdComment (kind,dataSize: INTEGER; dataHandle: QDHandle);
|
|
FUNCTION StdTxMeas (count: INTEGER; textAddr: QDPtr;
|
|
VAR numer,denom: Point; VAR info: FontInfo): INTEGER;
|
|
PROCEDURE StdGetPic (dataPtr: QDPtr; byteCount: INTEGER);
|
|
PROCEDURE StdPutPic (dataPtr: QDPtr; byteCount: INTEGER);
|
|
|
|
|
|
{ Misc Utility Routines }
|
|
|
|
FUNCTION GetPixel (h,v: INTEGER): BOOLEAN;
|
|
FUNCTION Random: INTEGER;
|
|
PROCEDURE StuffHex (thingptr: QDPtr; s:Str255);
|
|
PROCEDURE ForeColor (color: LongInt);
|
|
PROCEDURE BackColor (color: LongInt);
|
|
PROCEDURE ColorBit (whichBit: INTEGER);
|
|
|
|
|
|
IMPLEMENTATION
|
|
|
|
{$I QuickDraw2.text }
|