ahc@sisd.kodak.com (Aleck CheMponda CUST) (08/23/90)
I'm having problems trying to access quickdraw globals from a code resource. I read that quickdraw globals can be accessed as a negative offset from the low-memory global CurrentA5. I would appreciate it if some kind sole could send me a the necessary code or a description of what's required. I'm using Think_C 4.0. Thanks in advance. ****************** -- ***************************************************************** Aleck Che-Mponda ahc@sisd.kodak.com Software Engineer amc4023@ma.rit.edu "A geek, 'and proud of it, man!' "
ccc_ldo@waikato.ac.nz (Lawrence D'Oliveiro, Waikato University) (08/24/90)
A valid QuickDraw context consists of a set of variables holding the standard White, Black, Gray, LtGray and DkGray patterns, the standard Arrow cursor, the ScreenBits bitmap, and RandSeed. These variables are always in a fixed relative order, but there is *no* standard offset for them from A5. Instead, the value at the longword pointed to directly by A5 is itself the address of this QuickDraw context. Thus, the only valid access to these globals (other than from the application which initialised the context in the first place) is indirectly via A5. Here are some useful routines which illustrate the idea. There are functions which return pointers to each of the QuickDraw globals, allowing you to do calls like FillOval(EyeRect, WhitePtr^) and so on. I've thrown in a few other goodies as well, such as my standard routines for saving/restoring the text settings in the current GrafPort. C programmers shouldn't have any trouble translating any of this code. After all, whatever these Pascal wimps can do... -------------------------------------------------------------------------------- Const { offsets for use with QuickDrawGlobal (below) } WhiteOffset = $FFFFFFF8; BlackOffset = $FFFFFFF0; GrayOffset = $FFFFFFE8; LtGrayOffset = $FFFFFFE0; DkGrayOffset = $FFFFFFD8; ArrowOffset = $FFFFFF94; ScreenBitsOffset = $FFFFFF86; RandSeedOffset = $FFFFFF82; Type LongIntPtr = ^LongInt; TextState = { for saving font selection in a GrafPort } Record txFont : Integer; txFace : Style; txMode : Integer; txSize : Integer End {Record}; Function QuickDrawGlobal ( Offset : LongInt ) : LongInt; { returns the address of a QuickDraw global, given its offset. } Inline $2015, {move.l (a5), d0} $D09F, {add.l (sp)+, d0} $2E80; {move.l d0, (sp)} Function WhitePtr : PatPtr; Begin WhitePtr := PatPtr(QuickDrawGlobal(WhiteOffset)) End {WhitePtr}; Function BlackPtr : PatPtr; Begin BlackPtr := PatPtr(QuickDrawGlobal(BlackOffset)) End {BlackPtr}; Function GrayPtr : PatPtr; Begin GrayPtr := PatPtr(QuickDrawGlobal(GrayOffset)) End {GrayPtr}; Function LtGrayPtr : PatPtr; Begin LtGrayPtr := PatPtr(QuickDrawGlobal(LtGrayOffset)) End {LtGrayPtr}; Function DkGrayPtr : PatPtr; Begin DkGrayPtr := PatPtr(QuickDrawGlobal(DkGrayOffset)) End {DkGrayPtr}; Function ArrowPtr : CursPtr; Begin ArrowPtr := CursPtr(QuickDrawGlobal(ArrowOffset)) End {ArrowPtr}; Function ScreenBitsPtr : BitmapPtr; Begin ScreenBitsPtr := BitmapPtr(QuickDrawGlobal(ScreenBitsOffset)) End {ScreenBitsPtr}; Function RandSeedPtr : LongIntPtr; Begin RandSeedPtr := LongIntPtr(QuickDrawGlobal(RandSeedOffset)) End {RandSeedPtr}; Function GetTheCPort : CGrafPtr; { returns the current GrafPort or CGrafPort. } Inline $2055, { move.l (a5), a0 } $2E90; { move.l (a0), (sp) } Procedure GetTextState ( var State : TextState ); { gets the current font selection from the current GrafPort. } Var CurPort : GrafPtr; Begin GetPort(CurPort); State.txFont := CurPort^.txFont; State.txFace := CurPort^.txFace; State.txMode := CurPort^.txMode; State.txSize := CurPort^.txSize End {GetTextState}; Procedure SetTextState ( State : TextState ); { sets the font selection for the current GrafPort. Note that it is not correct to poke the fields directly. } Begin TextFont(State.txFont); TextFace(State.txFace); TextMode(State.txMode); TextSize(State.txSize) End {SetTextState}; -------------------------------------------------------------------------------- Lawrence D'Oliveiro fone: +64-71-562-889 Computer Services Dept fax: +64-71-384-066 University of Waikato electric mail: ldo@waikato.ac.nz Hamilton, New Zealand 37^ 47' 26" S, 175^ 19' 7" E, GMT+12:00 To someone with a hammer and a screwdriver, every problem looks like a nail with threads.