Retired Document
Important: This sample code may not represent best practices for current development. The project may use deprecated symbols and illustrate technologies and techniques that are no longer recommended.
StandardWDEF.a
; |
; File: StandardWDEF.a |
; |
; Contains: This file contains the window definition procedure |
; "DocumentProc", the standard Mac window type. |
; It is a rectangular window with a title bar. |
; ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ |
; ¥¥¥¥¥¥¥¥¥¥¥¥¥>>>> IMPORTANT!!! <<<<<<<<¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ |
; ¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥¥ |
; THESE ARE NOT FINAL!!!! This is the WDEF for Beta 4 System 7. The |
; final WDEF may (will) be slightly or greatly different from this! |
; This is provided for your information only, to see how to write your |
; application's WDEFs to match System 7. |
; Copyright: © 1982-1991 by Apple Computer, Inc., all rights reserved. |
; |
STRING ASIS |
PRINT OFF |
PRINT ON |
; ================================================ |
; REGISTERS |
; ================================================ |
; registers being used and need to be preserved |
rectReg EQU A4 ; rectangleÕs address is kept in reg |
windowReg EQU A3 ; window pointer address is kept in reg |
titleHgtReg EQU D7 ; windowÕs title bar height in reg |
paramReg EQU D6 ; parameter passed in function call |
varCodeReg EQU D5 ; varCode passed in funciton call |
; ================================================ |
; CONSTANTS |
; ================================================ |
HiliteFlagGlobal EQU $B20 ; low memory with hiliting flag |
HiliteFlagBit EQU 0 ; bit 0 in HiliteFlagGlobal byte |
hasZoom EQU 3 ; bit 3 is zoom bit |
hasGrow EQU 2 ; bit 2 is grow bit |
IconSize EQU 20 ; width of small icon in title |
minTitleH EQU 19 ; minimum title bar height without SICN |
minTitleHIcon EQU 21 ; minimum title bar height with SICN |
dboxWithTitle EQU 5 ; proc ID of dBoxProc with title bar |
dBoxBorderSize EQU 7 ; dBoxProc border size |
proc5TopAdjust EQU 4 ; title and border share some area |
proc5HitZAdjust EQU 6 ; zoom box is more to the left |
scrollBarSize EQU 16 ; size of scroll bar area |
wHiliteLight EQU 5 |
wHiliteDark EQU 6 |
wTitleBarLight EQU 7 |
wTitleBarDark EQU 8 |
wDialogLight EQU 9 |
wDialogDark EQU 10 |
wTingeLight EQU 11 ; For color tinges in title bar & gadgets |
wTingeDark EQU 12 |
lowestShadeIndex EQU 16 |
wHiliteShade0 EQU 16 |
wHiliteShade7 EQU 17 |
wHiliteShade8 EQU 18 |
wHiliteShadeA EQU 19 |
wHiliteShadeD EQU 20 |
wTitleBarShade0 EQU 21 |
wTitleBarShade1 EQU 22 |
wTitleBarShade4 EQU 23 |
wDialogShade0w EQU 24 |
wDialogShade4w EQU 25 |
wDialogShade6w EQU 26 |
wDialogShadeBb EQU 27 |
wDialogShadeF EQU 28 |
wDialogShade0b EQU 30 |
wDialogShade4b EQU 31 |
wDialogShade6b EQU 32 |
wDialogShadeBw EQU 33 |
wLTinge0 EQU 34 |
wLTinge4 EQU 35 |
wDTingeF EQU 36 |
wZoomGadget EQU 0 |
wGoAwayGadget EQU 1 |
wZoomHilitedGadget EQU 2 |
wGoAwayHilitedGadget EQU 3 |
wGrowGadget EQU 4 |
kPixmapID EQU -14336 |
kHighlightPix EQU -14334 |
minWCTBDepth EQU 4 |
minColorDepth EQU 8 |
; fakeDeviceFlags is used when we bypass DeviceLoop and draw the grow icon directly, and weÕre |
; on a machine that doesnÕt have Color QuickDraw. |
fakeDeviceFlags equ $A801 |
; ================================================ |
; TYPES |
; ================================================ |
; There records are only types, they do not allocate space |
; ------------- FontInfo record TYPE ------------- |
WInfoRec RECORD 0 ; FontInfo record type |
WAscent ds.w 1 |
WDescent ds.w 1 |
WHeight ds.w 1 |
WBoxDelta ds.w 1 |
ENDR |
; ------------- RGBInfo record TYPE ------------- |
RGBInfoRec RECORD 0 ; RGBColor record type |
red ds.w 1 |
green ds.w 1 |
blue ds.w 1 |
ENDR |
WDefDrawFrame RECORD 0 ; stack frame for DeviceLoop draw proc |
retAddress ds.l 1 ; return address |
StartParams EQU * |
userData ds.l 1 ; long we passed to DeviceLoop |
devHandle ds.l 1 ; GDevice handle |
deviceFlags ds.w 1 ; flags for current device |
depth ds.w 1 ; bits/pixel for this call |
ParamSize EQU *-StartParams |
ENDR |
; ================================================ |
WDEF0 PROC EXPORT |
; ================================================ |
; FUNCTION MyWindow(varCode: INTEGER; window: WindowPtr; |
; message: INTEGER; param: LongInt): LongInt |
; Create a stack frame recode that matches the above function. |
; The parameters passed on the stack are between ParamBegin and ParamSize. |
; ParamSize the number of bytes to be removed (poped) off the stack after |
; the UNLINK instruction. Any local variables to be created are listed |
; between A6Link and LinkSize. LinkSize is the size of the entire stack |
; frame and it the number of bytes used in the LINK instruction. To add |
; more local variables, insert it between A6Link and LinkSize. |
StackFrame RECORD {A6Link},DECR ; build a stack frame record |
ProcResult ds.l 1 ; functionÕs result returned to caller |
ParamBegin EQU * ; start parameters after this point |
; parameters on stack |
varCode ds.w 1 ; variation code |
window ds.l 1 ; the window pointer |
message ds.w 1 ; operation to perform |
param ds.l 1 ; addition information based on message |
ParamSize EQU ParamBegin-* ; size of all the passed parameters |
RetAddr ds.l 1 ; place holder for return address |
A6Link ds.l 1 ; place holder for A6 link |
; local variables being allocated |
SavFgCol ds RGBInfoRec ; saved WMgrCPort ForeColor (color only) |
SavBkCol ds RGBInfoRec ; saved WMgrCPort BackColor (color only) |
WInfo ds WInfoRec ; record for font and other info |
OldPort ds.l 1 ; current port to be restored |
TempRgn ds.l 1 ; temporary region handle |
AuxCTab ds.l 1 ; handle to auxCTable (color only) |
AuxCPtr ds.l 1 ; pointer to auxCTable (color only) |
IsColor ds.b 1 ; have colorQD in toolbox? [boolean] |
IsTitleIcon ds.b 1 ; do we have an icon in the title bar? |
IsProcFive ds.b 1 ; dBox with title bar? [boolean] |
threeDWind ds.b 1 ; conditions right for System 7 windows? |
curDepth ds.l 1 ; current drawing depth for SetupColor |
startRGB ds.w 3 |
endRGB ds.w 3 |
tempRGB ds.w 3 |
workPixMap ds.l 1 |
gadgetHighlight ds.w 1 |
tempPixels ds.l 1 |
globalOffset ds.l 1 ; Amount to offset when drawing grow icon in WMgrPort |
curZone ds.l 1 ; temporary storage for theZone |
bogusCtab ds.l 1 ; handle to bogus color table |
LinkSize EQU * ; size of all the local variables |
ENDR |
; ================================================ |
; MAIN entry point in the WDEF. |
; ================================================ |
; Jump over the defined data and get to the code. |
DocProc bra.s WDEFStart ; and a way we go |
; Define in the code segment necessary data. The standard header |
; is first then additional data used in the WDEF. |
dc.w 0 ; flags word |
dc.b 'WDEF' ; resource type |
dc.w 0 ; resource ID |
dc.w 15 ; version number |
; ================================================ |
WDEFStart ; start of the WDEF code |
; ================================================ |
WITH StackFrame ; cover our local stack frame |
LINK A6,#LinkSize ; set stack frame to address params |
moveM.l D3-D7/A1-A4,-(SP) ; save work registers |
clr.l ProcResult(A6) ; initialize funtionÕs result |
; test if the message is in range |
cmp.w #wGIconMsg,message(A6) ; compare to highest value |
BGT WDEFEnd ; skip it, itÕs too high |
cmp.w #wDrawMsg,message(A6) ; compare to lowest value, too |
BMI WDEFEnd ; |
move.l (A5),A0 ; get pointer to QuickDraw globals |
move.l (A0),OldPort(A6) ; save current port |
; ------------- fetch the parameters ------------- |
move.l window(A6),windowReg ; get the window pointer |
lea TempRect,rectReg ; get TempRect address in a reg |
move.l param(A6),paramReg ; get the param in a reg |
move.w varCode(A6),varCodeReg ; get the selector integer |
AND.w #3,varCodeReg ; ignore "inGrow" variant |
; ------------- is the dBox with title? ------------- |
; determine if this is a dBoxProc using a title |
move.w varCode(A6),D0 ; get real selector |
AND.w #7,D0 ; AND off higher bits |
cmp.w #dboxWithTitle,D0 ; compare against new proc |
SEQ.b IsProcFive(A6) ; set if dBox with title |
; ------------- Determine type of system ------------- |
; We need to know if we have color QuickDraw and a color window manager port. |
cmp.w #$3FFF,ROM85 ; do we have color QD? |
SLS IsColor(A6) ; set boolean depending on color or B&W system |
BLS.s @ColorSys ; this system has color QD |
move.l WMgrPort,-(SP) ; B&W, set to window manager port |
_SetPort ; |
bra.s @CommonSys ; done for the B&W environment |
; ------------- doin it with color ------------- |
; when using the WMgrCPort, it is the defprocÕs responsibility to reconcile |
; the WMgrPort and the WMgrCPort. Also find the auxWinRec and lock it down |
; This compares the pertinent fields of the WMgrPort and the WMgrCPort, |
; updating the WMgrCPort as necessary to match the WMgrPort. |
@ColorSys move.l WMgrCPort,-(SP) ; make the WMgrCPort the current port |
_SetPort ; set it |
move.l WMgrPort,A0 ; get the WMgrPort addr |
move.l WMgrCPort,A1 ; and the WMgrCPort too |
pea bkPat(A0) ; push pointers to pattern for later |
pea pnPat(A0) ; |
; copy all fields from pnLoc to end of grafPort, |
; excluding pnPixPat and fillPixPat |
lea pnLoc(A0),A0 ; point at source |
lea pnLoc(A1),A1 ; point at dest |
move.l (A0)+,(A1)+ ; copy pnLoc |
move.l (A0)+,(A1)+ ; copy pnSize |
move.w (A0)+,(A1)+ ; copy pnMode |
addq #8,A0 ; skip pnPat (aka, pnPixPat,fillPixPat) |
addq #8,A1 ; |
move.w #((portRec-pnVis)/2)-1,D0 ; set up a counter (long sized) |
@1 move.w (A0)+,(A1)+ ; copy it |
Dbra D0,@1 ; loop |
; now set up the patterns in the WMgrCPort |
_PenPat ; (which is thePort) the parameters were |
_BackPat ; pushed before the copying loop above |
pea SavFgCol(A6) ; push a pointer to save area |
_GetForeColor ; get the current color |
pea SavBkCol(A6) ; |
_GetBackColor ; |
move.l #blackColor, -(SP) ; set default colors |
_ForeColor |
move.l #whiteColor, -(SP) |
_BackColor |
; ------------- get auxWinRec ------------- |
clr.l -(SP) ; hereÕs a space for the var handle |
clr.w -(SP) ; function return here |
move.l windowReg,-(SP) ; push window ptr |
pea 6(SP) ; a pointer to the space above |
_GetAuxWin ; find the auxrec |
addq #2,SP ; pitch the boolean (it doesnÕt matter) |
move.l (SP)+,A0 ; get the auxRecHandle |
move.l (A0),A0 ; handle -> ptr |
move.l awCTable(A0),A0 ; get the colortable handle |
move.l A0,AuxCTab(A6) ; save this handle |
_HLock ; lock the table down in memory |
move.l (A0),AuxCPtr(A6) ; and get a pointer too! |
; ------------- setup window info ------------- |
; Get the font info for this window. Put the height of the title bar in |
; titleHgtReg and wHeight(A6). Put distance of the top of the goaway box |
; from the top of the bar in WBoxDelta(A6). |
; |
@CommonSys pea WInfo(A6) ; push pointer to a FontInfoRec |
_GetFontInfo ; and get the fontÕs info |
move.w WInfo.wAscent(A6),titleHgtReg ; get font ascent |
add.w WInfo.wDescent(A6),titleHgtReg ; add descent |
addq.w #4,titleHgtReg ; get the height |
BSET #0,titleHgtReg ; make height odd for symmetry |
moveq #minTitleH,D1 ; get min title height for no icon |
cmp.w D1,titleHgtReg ; force height to minimum |
bge.s @3 ; => not a tiny font |
move.w D1,-(SP) ; save min title height on stack |
sub.w titleHgtReg,D1 ; how much less than minimum is it? |
LSR.w #1,D1 ; used for centering tiny fonts |
add.w D1,WInfo.wAscent(A6) ; make the ascent "bigger" |
move.w (SP)+,titleHgtReg ; pop min title height |
@3 move.w titleHgtReg,WInfo.wHeight(A6) ; WHeight=ascent+descent+2 |
move.w titleHgtReg,D0 ; get height |
sub.w #13,D0 ; subtract height of box |
LSR.w #1,D0 ; divide by 2 |
move.w D0,WInfo.wBoxDelta(A6) ; save delta to goAway box |
; ------------- create a temp region ------------- |
clr.l -(SP) ; create a temp region |
_NewRgn ; get a new region |
move.l (SP)+,TempRgn(A6) ; and save in our frame |
; ------------- get a pixmap for drawing the gadgets ------------ |
subq.l #4, SP ; room for a PixMapHandle |
move.l #'pmap', -(SP) ; the Pixmap resource type |
move.w #kPixmapID, -(SP) ; ID of working pixmap |
_GetResource |
move.l (SP)+, workPixmap(A6) ; save it for later |
move.l #16,D0 ; allocate a bogus ctab |
_NewHandle ,SYS,CLEAR ; in sys heap with 0 entries |
move.l A0, bogusCtab(A6) ; store the ctab so that we can dispose of it |
move.l workPixmap(A6),A0 ; get the pixmap |
move.l (A0),A0 ; get ptr to pixmap |
move.l bogusCtab(A6),pmTable(A0) ; put the bogus ctab in our pixmap |
clr.l tempPixels(A6) ; init this to NIL |
; ------------- go handle the message ------------- |
move.w message(A6),D0 ; get message |
ADD D0,D0 ; double for word index |
lea GoDocProc,A0 ; get jump table address |
add.w GoDocProc(D0),A0 ; compute dispatch address |
jsr (A0) |
; ------------- prepare to exit WDEF ------------- |
; Dispose of all data allocated and restore port |
move.l bogusCtab(A6),A0 ; Dispose the bogus Color table |
_DisposHandle ; |
move.l TempRgn(A6),-(SP) ; dispose of temp region |
_DisposRgn ; |
tst.b IsColor(A6) ; are we on a color system? |
beq.s @NoColor2 ; if on B&W, then skip |
; ------------- color clean up ------------- |
; unlock the color table and restore the fore- and backColors |
move.l AuxCTab(A6),A0 ; get the colortable handle |
_HUnlock ; release it |
pea SavBkCol(A6) ; pointer to RGBColor |
_RGBBackColor ; |
pea SavFgCol(A6) ; pointer to RGBColor |
_RGBForeColor ; |
@NoColor2 ; END OF A COLOR-ONLY SECTION |
move.l OldPort(A6),-(SP) ; restore previous port |
_SetPort |
; ------------- End of WDEF ------------- |
WDEFEnd ; ÔOut Of Range, of courseÕ |
moveM.l (SP)+,D3-D7/A1-A4 ; restore work registers |
UNLK A6 ; unlink stack frame |
move.l (SP)+,A0 ; get return address |
ADD #ParamSize,SP ; strip parameters |
jmp (A0) ; return to caller |
; ------------- WDEF message jump table ------------- |
; dispatch table -- entries must be long branches! |
GoDocProc dc.w DrawDoc-GoDocProc ; draw is message #0 |
dc.w HitDoc-GoDocProc ; hit test is message #1 |
dc.w CalcDoc-GoDocProc ; calc test is message #2 |
dc.w InitDoc-GoDocProc ; init is message #3 |
dc.w DisposeDoc-GoDocProc ; dispose is message #4 |
dc.w GrowDoc-GoDocProc ; grow message is #5 |
dc.w DrawGIcon-GoDocProc ; draw grow icon is #6 |
; ================================================ |
; wNew message |
; ================================================ |
; InitDoc is used to initialize our zoom size and title icon handle |
; Need to make sure the goAway is ignored if the application tried to |
; set this flag. Changing this here will change the window record. |
; The application could set the goAway flag after creating the window, |
; but that doesnÕt seem likely to happen. |
InitDoc |
tst.b IsProcFive(A6) ; dBoxProc with title bar? |
beq.s @KeepGoAway ; no, donÕt touch goAway flag |
clr.w wGoAway(windowReg) ; yes, then clear the flag out |
@KeepGoAway |
moveq #8+8,D0 ; space for 2 rects |
_NewHandle ,clear ; allocate the space |
move.l A0,wDataHandle(windowReg) ; save handle to data |
beq.s InitDone ; => not able to get space |
move.w varCode(A6),D0 |
Btst #hasZoom,D0 ; does it want a zoom box? |
beq.s InitDone ; no, then weÕre done |
; ------------- initialize userState and stdState ------------- |
; set default zoom data. Consists of 2 rects: SmallSize, BigSize |
; get the size of the zoomed out window in global coordinates. To do this, |
; pull the screen size from screenbits.bounds and indent a little. |
addq.b #1,wZoom(windowReg) ; set zoom flag to TRUE |
move.l (A0),A2 ; point to data |
addq.w #8,A2 ; point to bigSize |
move.l GrafGlobals(A5),A1 ; point to QuickDraw globals |
move.l screenBits+bounds(A1),(A2)+ ; get topLeft |
move.l screenBits+bounds+4(A1),(A2)+ ; get botRight |
moveq #3,D0 ; get indent |
; Zooming the dBoxProc with a title. Here I set the alternate size to be |
; further inset of the screen. This doesnÕt take into account the |
; normal zoomable windows have a shadow and this causes the proc=5 to be |
; zoomed out one pixel short on the right edge. Also, since proc=5 shares |
; a portion of the title area with the fancy border of the content this |
; makes the title bar zoom a few pixels lower than normal window. |
; Applications using this window are suppose to manually set the alternate |
; size anyway, so IÕm not too concerned about this. |
tst.b IsProcFive(A6) ; dBoxProc with title bar? |
beq.s @1 ; no, use normal sizing |
addq.w #dBoxBorderSize,D0 ; add fancy border to sizing |
; ------------- inset stdState based on indentation ------------- |
@1 |
sub.w D0,-(A2) ; indent right |
sub.w D0,-(A2) ; indent bottom |
add.w D0,-(A2) ; indent left |
add.w D0,-(A2) ; indent top |
move.w MBarHeight,D0 ; get menu bar height |
add.w D0,(A2) ; past menu bar height |
add.w titleHgtReg,(A2) ; and past window title |
move.l (A0),rectReg ; point at userState |
bsr GetRect ; convert rect to global |
InitDone rts |
; ================================================ |
; wDispose message |
; ================================================ |
; DisposeDoc is called when the window is being closed. All we need to do is |
; give back the handle we borrowed. |
DisposeDoc |
move.l wDataHandle(windowReg),D0 ; a data handle? |
beq.s DisposeDone ; no, then weÕre done |
move.l D0, A0 ; get data handle |
_DisposHandle ; release it, ignoring errors |
DisposeDone rts |
; ================================================ |
; wDraw message |
; ================================================ |
; DrawDoc -- draw the document window. The windowPtr is in windowReg |
; First test for a EORGoAway call and special case it |
; Put shadowing about into D4. |
DrawDoc tst.b wVisible(windowReg) ; is it visible? |
beq @exitDrawDoc ; if not, donÕt do anything |
; ------------- set up shadow ------------- |
_PenNormal ; we want the normal pen |
move.l OneOne,D4 ; get shadow factor, assume 1,1 |
tst.w varCodeReg ; documentProc? |
beq.s @1 ; if so, weÕre cool |
add.l D4,D4 ; double the shadow to 2,2 |
cmp.w #3,varCodeReg ; does it have shadow? |
beq.s @1 ; if so, weÕre cool |
moveq #0,D4 ; otherwise no shadow |
@1 |
move.l structRgn(windowReg), -(SP) |
pea WDefDrawWindow ; address of devloop drawing proc |
clr.l -(SP) ; no unusual activities |
clr.l -(SP) ; and no user data |
_DeviceLoop |
; DeviceLoop is a new call for System 7.0, that iterates through all the current gDevices and |
; sees if the region you passed is on a specific device. If it is, it calls the drawing proc |
; you passed. It does lots of other neat things for you also, see the Device Manager chapter |
; of Inside Mac VI for a full description of this call. |
cmp.w #wInGoAway,paramReg ; was it an XOR call? |
blt @exitDrawDoc ; if not, donÕt invert state bit |
eor.b #1<<HiliteFlagBit, HiliteFlagGlobal |
@exitDrawDoc |
rts |
WDefDrawWindow |
with WDefDrawFrame |
move.w depth(SP), curDepth(A6) ; save this for SetupColor magic |
move.l devHandle(SP), D1 ; pass this drawing device |
bsr CheckAvailableColors ; see if we have enough colors |
cmp.w #wInGoAway,paramReg ; is it a goAway call? |
bge EORStuff ; if so, go handle it |
bclr #HiliteFlagBit, HiliteFlagGlobal ; otherwise, init hilite flag |
; ------------- frame the windowÕs body ------------- |
tst.b wHilited(windowReg) ; Is window highlighted? |
bz.s @inactiveFrame ; donÕt draw shaded title bar |
moveq #wFrameColor,D0 ; get fore color |
bra.s @frameShadeCorrect |
@inactiveFrame |
moveq #wHiliteShadeA,D0 ; Get fore color |
@frameShadeCorrect |
moveq #wContentColor,D1 ; get back color |
bsr SetupColors ; set Õem up |
bsr StructInTemp ; get StrucRgn.rgnBBox in rectReg |
sub.l D4,botRight(rectReg) ; inset botRight to ignore shadow |
move.l rectReg,-(SP) ; push rect address |
_FrameRect ; frame the body |
cmp.l #0,D4 ; any drop shadow? |
beq.s NoDrop ; if not, skip |
; ------------- draw the drop shadow ------------- |
; paint the drop shadow, shadow amount in D4 |
moveq #wFrameColor,D0 ; Draw drop shadow with frame color always |
bsr SetupForeColor |
move.l D4,-(SP) ; push shadow factor |
_PenSize ; make penSize = shadow factor |
move.w right(rectReg),-(SP) ; push right |
move.w top(rectReg),-(SP) ; push top |
add.w D4,(SP) ; add shadow factor |
_MoveTo ; MoveTo(right,top+shadow) |
move.w right(rectReg),-(SP) ; push right |
move.w bottom(rectReg),-(SP) ; push bottom |
_LineTo ; LineTo(right,bottom) |
move.w left(rectReg),-(SP) ; push left |
add.w D4,(SP) ; add shadow factor |
move.w bottom(rectReg),-(SP) ; push bottom |
_LineTo ; LineTo(left+shadow,bottom) |
_PenNormal ; restore normal pen |
NoDrop cmp.w #1,varCodeReg ; dBoxProc? |
bne NotFancy ; if not, skip |
; ------------- draw fancy border ------------- |
; draw fancy for dialog box ( only for variant 1). The code is a little |
; difficult to follow, but it saved some bytes this way. New feature |
; for a dBoxProc thatÕs deactive is that it get a gray frame. Also, I |
; removed the flicker that used to happen when a dBoxProc went deactive. |
; In the case of the dBoxProc with title bar, the fancy border needs to |
; consider the title area, and that the bottom of the title area is shared |
; with the fancy border by a few pixels. |
tst.b IsProcFive(A6) ; dBoxProc with title? |
beq.s @1 ; no, then donÕt adjust framing |
add.w titleHgtReg,top(rectReg) ; TempRect still in rectReg |
subq.w #proc5TopAdjust,top(rectReg) ; tweak it |
@1 |
move.l rectReg,-(SP) ; push the windowÕs structure rect |
move.l OneOne,-(SP) ; |
_InsetRect ; inset TempRect |
lea borderShades,a2 ; Get shades for fancy border |
tst.b wHilited(windowReg) ; Is window highlighted? |
bnz.s @drawBorders ; Yes. Go draw the borders |
add.w #$10,a2 ; Use gray shades for inactive windows |
tst.b threeDWind(a6) ; Are we using System 7 windows? |
bnz.s @drawBorders ; Yes, start drawing |
move.l GrafGlobals(a5),a0 ; No. Use dithered gray |
pea gray(a0) |
_PenPat |
@drawBorders |
move.w (a2)+, -(SP) ; lower right shade |
move.w (a2)+, -(SP) ; upper left shade |
move.w (a2)+, -(SP) ; shade for corners |
bsr DrawShadedRect ; _FrameRect with shades |
move.l rectReg,-(SP) ; push the windowÕs structure rect |
move.l OneOne,-(SP) ; |
_InsetRect ; inset TempRect |
move.w (a2)+, D0 ; shade for rect |
bsr SetupForeColor |
move.l rectReg,-(SP) ; push the windowÕs structure rect |
_FrameRect |
move.l rectReg,-(SP) ; push the windowÕs structure rect |
move.l OneOne,-(SP) ; |
_InsetRect ; inset TempRect |
move.w (a2)+, -(SP) ; lower right shade |
move.w (a2)+, -(SP) ; upper left shade |
move.w (a2)+, -(SP) ; shade for corners |
bsr DrawShadedRect ; _FrameRect with shades |
move.l rectReg,-(SP) ; push the windowÕs structure rect |
move.l OneOne,-(SP) ; |
_InsetRect ; inset TempRect |
move.w (a2)+, D0 ; shade for rect |
bsr SetupForeColor |
move.l rectReg,-(SP) ; push the windowÕs structure rect |
_FrameRect |
move.l rectReg,-(SP) ; push the windowÕs structure rect |
move.l OneOne,-(SP) ; |
_InsetRect ; inset TempRect |
move.l #$00030003,-(SP) ; erase to edge of content rgn |
_PenSize ; get a thick pen |
move.l (A5), A2 ; get graphic globals |
pea white(A2) ; white for erasing |
_PenPat ; set pen pattern |
move.l rectReg,-(SP) ; push TempRect |
_FrameRect ; and frame TempRect |
_PenNormal ; back to normal pen |
NotFancy tst.b IsProcFive(A6) ; dBox with a title bar? |
bne.s DrawTitleBar ; yes, then draw it |
tst.w varCodeReg ; test for dialog windows |
bne WDefDrawDone ; yes, dialogs have no title bar |
; ------------- draw the title bar ------------- |
; Derive the titleBar rect from the structRgn and keep it in TempRect. Keep |
; rectReg preserved since it now points at TempRect. |
DrawTitleBar |
bsr BuildTBarRect ; title rect in TempRect and rectReg |
clr.b -(SP) ; room for Boolean |
move.l rectReg, -(SP) ; test the title bar rect for |
move.l (A5), A0 ; quickdraw globals |
move.l thePort(A0), A0 ; point at current (Wmgr) port |
move.l visRgn(A0), -(SP) ; intersection with the visRgn |
_RectInRgn |
tst.b (SP)+ ; test the result |
bz WDefDrawDone ; if not, skip all this work |
tst.b wHilited(windowReg) ; do we have a white background? |
bz.s @inactiveTitle ; donÕt draw shaded title bar |
moveq #wFrameColor,D0 ; get fore color |
moveq #wTitleBarShade1, D1 ; get back color |
bra.s @titleShadeCorrect |
@inactiveTitle |
moveq #wHiliteShadeA,D0 ; Get fore color |
moveq #wContentColor, D1 ; get back color |
@titleShadeCorrect |
bsr SetupColors ; set Õem up |
tst.b isProcFive(A6) ; dBoxProc with title? |
bnz.s @1 ; donÕt frame title if so |
move.l rectReg, -(SP) ; rect of title bar |
_FrameRect |
@1 |
move.l rectReg, -(SP) ; rect of title bar |
move.l (SP), -(SP) ; also for _EraseRect |
move.l OneOne, -(SP) ; inset factor of 1, 1 |
_InsetRect ; exclude the actual frame |
_EraseRect ; erase the contents |
tst.b wHilited(windowReg) ; do we have a white background? |
bz.s @doTitle ; donÕt draw 3-d title bar |
moveq #wLTinge0, D0 ; fore color |
bsr SetupForeColor ; do the right thing |
move.w left(rectReg), -(SP) ; left of tb interior |
move.w bottom(rectReg), -(SP) ; bottom of tb interior |
sub.w #1, (SP) ; pen falls to lower right |
_MoveTo |
clr.w -(SP) ; no horiz delta |
move.w bottom(rectReg), D0 ; vertical delta is bottom-top |
sub.w top(rectReg), D0 |
subq.w #1, D0 |
neg.w D0 ; going -v, not +v |
move.w D0, -(SP) |
_Line ; draw left hilite |
move.w right(rectReg), D0 ; horiz delta is right |
sub.w left(rectReg), D0 ; minus left |
subq.w #1, D0 |
move.w D0, -(SP) |
clr.w -(SP) ; no v delta |
_Line ; draw top hilite |
moveq #wLTinge4, D0 ; fore color |
bsr SetupForeColor ; do the right thing |
clr.w -(SP) ; no h delta |
move.w bottom(rectReg), D0 ; vertical delta is bottom-top |
sub.w top(rectReg), D0 |
subq.w #1, D0 |
move.w D0, -(SP) |
_Line ; draw left hilite |
move.w right(rectReg), D0 ; horiz delta is right |
sub.w left(rectReg), D0 ; minus left |
subq.w #1, D0 |
neg.w D0 ; going -h, not +h |
move.w D0, -(SP) |
clr.w -(SP) ; no v delta |
_Line ; draw top hilite |
@doTitle |
; ------------- DoTitleString ------------- |
; To prevent title flicker, DoTitleString leaves the left edge of the |
; title in D3 and the right edge in D4. If the title bar needs to be |
; highlighted, the highlighting is done in 2 sections, one on each side |
; of the title. DoTitleString draws the title centered in tempRect. |
; Warning -- it trashes D3 and D4. |
; compute indent factor based on GoAwayButton state |
move.w right(rectReg),D4 ; get right into D4 |
move.w D4,D3 ; |
sub.w left(rectReg),D3 ; compute width |
sub.w wTitleWidth(windowReg),D3 ; compute extra x |
asr.w #1,D3 ; divide by 2 |
; if the string is too long, position left edge |
moveq #2,D0 ; start title at x = 2 |
tst.b wGoAway(windowReg) ; is there a go away button |
beq.s @2 ; skip if thereÕs not |
moveq #32,D0 ; start title at x = 32 |
@2 cmp.w D0,D3 ; to left of x? |
bge.s @3 ; => no, D3 is ok |
move.w D0,D3 |
@3 |
move.w D3,D0 ; save left indent in D0 |
add.w left(rectReg),D3 ; compute x position |
move.w D4,-(SP) ; save right across clip |
tst.b wZoom(windowReg) ; zoom flag set? |
beq.s @4 ; => no, edge ok |
sub.w #32,D4 ; get default right edge |
bra.s @doneAdjustRight ; |
@4 ; set clip to d3..d4 |
sub.w D0,D4 ; adjust right to have the same indent as left |
@doneAdjustRight |
move.l TempRgn(A6),-(SP) ; get our temp region |
move.l (SP),-(SP) ; copy for SectRgn |
_GetClip ; and save for restore |
move.w D4,right(rectReg) ; set right for clipping |
move.l rectReg,-(SP) ; push tempRect |
_ClipRect ; set clipping to it |
move.l (A5),A0 ; get globals |
move.l (A0),A0 ; get port |
move.l clipRgn(A0),-(SP) ; and the rect region |
move.l (SP),-(SP) ; and use clip as dest |
_SectRgn ; get the intersection |
move.w (SP)+,right(rectReg); restore tempRect |
move.w D3,-(SP) ; push left for MoveTo |
; ------------- draw title string ------------- |
move.w top(rectReg),D0 ; get top |
add.w WInfo.wAscent(A6),D0 ; move down to baseline |
addq.w #1,D0 ; leave 2 pixels white space |
move.w D0,-(SP) ; push baseline |
_MoveTo |
tst.b wHilited(windowReg) ; Is it highlighted? |
beq.s @noHighlight ; No |
moveq #wTextColor,D0 ; get fore color for highlighted title |
bra.s @drawTitle |
@noHighlight |
moveq #wHiliteShade7,D0 ; Use a gray shade to dim title string if not highlighted. |
@drawTitle |
moveq #wTitleBarShade1,D1 ; get back color |
bsr SetupColors ; set Õem up |
move.w #srcOr,-(SP) ; set the mode to source OR |
_TextMode ; |
move.l wTitleHandle(windowReg),A0 ; get titleHandle |
_HLock ; lock the title down |
move.l (A0),-(SP) ; push title pointer |
_DrawString ; draw it |
move.l wTitleHandle(windowReg),A0 ; get the handle again |
_HUnlock ; release it |
move.l TempRgn(A6),-(SP) ; push the old clip |
_SetClip ; and restore it |
; ------------- calculate highlite rects ------------- |
; Now calculate the size of the clear area needed for the title |
; (only used if the window is highlighted). The two registers D3 and |
; D4 are used to supply the left and right edges of the gap in the title |
; area for occupied by the string. If no title is supplied, then there |
; isnÕt a gap. If there is a title, then there is an extra indentation |
; of a few pixels added. |
move.w D3,D1 ; left in D3, calc right in D1 |
add.w wTitleWidth(windowReg),D1 ; add in the length |
cmp.w D4,D1 ; was title longer than space? |
bge.s @5 ; => yes, use D4 |
move.w D1,D4 ; |
@5 |
tst.w wTitleWidth(windowReg) ; is there a title? |
beq.s @NoIndent ; no, then donÕt include indent |
addq.w #6,D4 ; indent on right |
subq #6,D3 ; indent to the left |
@NoIndent ; no indentation |
; Left in D3, right in D4 |
; ------------- draw title bar highliting ------------- |
tst.b wHilited(windowReg) ; is it hilited? |
bne.s DoHilite ; yes, then draw it |
bra.w WDefDrawDone ; no, done with all drawing |
DoHilite |
moveq #wHiliteShade8, D0 ; get fore color |
bsr SetupForeColor ; set Õem up |
move.l rectReg,-(SP) ; push the title rect |
move.w #1,-(SP) ; push dh |
move.w WInfo.wBoxDelta(A6),-(SP) ; push dv |
_InsetRect ; inset it some |
; The dBoxProc with title has a two pixel fancy border around the entire |
; window. When drawing the highlited pattern, I need to allow for this. |
tst.b IsProcFive(A6) ; dBoxProc with title? |
beq.s @NoAdjust ; no, then skip adjustment |
addq.w #1,left(rectReg) ; yes, adjust title bar left |
subq.w #1,right(rectReg) ; and right |
@NoAdjust |
; This WDEF tries to put at least 32 pixels on the left of the title if there is a go-away box. |
; However, if the title bar is less than 32 pixels wide, we will have a problem in which the |
; "racing" stripes will be drawn outside the title bar. |
; The following check is to make sure that the lines will be drawn within the title bar area. |
move.w right(rectReg),d0 ; get right |
cmp.w d0,d3 ; Does lines fit in the title bar? |
ble.s @linesFitOnRight ; yes => continue |
move.w d0,d3 ; no => use the right of rect instead of the calculated value |
@linesFitOnRight ; |
move.w right(rectReg),-(SP) ; save right of TempRect |
move.w D3,right(rectReg) ; new right = title left |
move.l topLeft(rectReg),D0 ; get topLeft |
and.l #$00070007,D0 ; only use mod 8 |
move.l (A5),A2 ; get globals, save in A2 |
move.l D0,patAlign(A2) ; set up patAlign |
move.l theZone,curZone(A6) ; save the current zone |
move.l sysZone,theZone ; going to create the pixpat in sysZone |
move.l rectReg,-(SP) ; fill this rect |
pea HilitePattern ; push the pattern address |
_FillRect ; fill left half with the pattern |
tst.b wZoom(windowReg) ; zoom flag set? |
beq.s @1 ; => no, use current d4 |
move.w (SP),D0 ; else get right edge of box |
sub.w #26,D0 ; how much room is there? |
cmp.w D4,D0 ; need at least 26 pixels |
bge.s @1 ; => got Õem, use current d4 |
move.w D0,D4 ; else use right-26 |
@1 move.w (SP)+,right(rectReg) ; restore right of title box |
; This WDEF tries to put at least 26 pixels on the right if there is a zoom box or matches the indent |
; from the left. This may cause a problem in which the "racing stripes" will be drawn outside the title |
; bar area if the title bar is too small. The following check makes sure that the lines will be drawn |
; within the title bar area. |
move.w left(rectReg),d0 ; get left of rect |
cmp.w d0,d4 ; Does lines fit in the title bar? |
bge.s @linesFitOnLeft ; yes => continue |
move.w d0,d4 ; no => use left instead of the calculated value |
@linesFitOnLeft ; |
move.w D4,left(rectReg) ; set new left of title box |
move.l rectReg,-(SP) ; fill this rect |
pea HilitePattern ; push the pattern address |
_FillRect |
move.l curZone(A6),theZone ; restore the zone |
clr.l patAlign(A2) |
; ------------- DoGoAway ------------- |
tst.b wGoAway(windowReg) ; is there a goaway button? |
beq.s DoZoom ; => if not, try for zoom |
moveq #wGoAwayGadget, D0 |
bsr SetupColorPict |
pea TingeGoAway ; Address of tinge routine |
bsr PlotGoAway |
; ------------- DoZoom ------------- |
DoZoom tst.b wZoom(windowReg) ; zoom flag set? |
beq.s WDefDrawDone ; no, then done drawing |
moveq #wZoomGadget, D0 |
bsr SetupColorPict |
pea TingeZoom ; Address of tinge routine |
bsr PlotZoom ; and plot the symbol |
bra.s WDefDrawDone ; done drawing |
; ------------- goAway and zoom box highliting ------------- |
; decide which icon needs hiliting |
EORStuff beq.s EORGoAway ; => itÕs the goAway |
tst.b wZoom(windowReg) ; zoom flag set? |
beq.s WDefDrawDone ; => no |
btst #HiliteFlagBit, HiliteFlagGlobal |
bz.s @drawHilitedZoom |
moveq #wZoomGadget, D0 |
pea TingeZoom |
bra.s @zoomCommon |
@drawHilitedZoom |
moveq #wZoomHilitedGadget, D0 |
clr.l -(sp) ; No tinge routine |
@zoomCommon |
bsr SetupColorPict |
bsr PlotZoom ; and plot the symbol |
bra.s WDefDrawDone |
EORGoAway ; hilites/unhilites the goAway |
btst #HiliteFlagBit, HiliteFlagGlobal |
bz.s @drawHilitedGoAway |
moveq #wGoAwayGadget, D0 |
pea TingeGoAway |
bra.s @goAwayCommon |
@drawHilitedGoAway |
moveq #wGoAwayHilitedGadget, D0 |
clr.l -(sp) ; Highlighted state needs no tinging |
@goAwayCommon |
bsr SetupColorPict |
bsr PlotGoAway |
WDefDrawDone |
move.l (SP)+, A0 ; return address |
lea WDefDrawFrame.ParamSize(SP), SP ; pop params |
jmp (A0) |
DrawShadedRect |
ShadedRectFrame RECORD 0 |
retAddr ds.l 1 |
StartParams EQU * |
cornerColor ds.w 1 |
ulColor ds.w 1 |
lrColor ds.w 1 |
ParamSize EQU *-StartParams |
ENDR |
with ShadedRectFrame |
move.w cornerColor(SP), D0 ; shade/color of corner |
bsr SetupForeColor ; make it the pen color |
move.w left(rectReg), -(SP) ; start at lower left |
move.w bottom(rectReg), -(SP) |
subq.w #1, (SP) |
_MoveTo |
move.l #$FFFF0000, -(SP) ; h=0, v=-1 |
_Line ; draw 1 pixel corner |
move.w ulColor(SP), D0 ; get shade for left and top |
bsr SetupForeColor ; make it the pen color |
move.l top(rectReg), -(SP) ; top AND left |
_LineTo ; draw line on left side |
move.w right(rectReg), -(SP) |
subq.w #1, (SP) |
move.w top(rectReg), -(SP) |
_LineTo ; draw line across top |
move.w cornerColor(SP), D0 ; need corner color again |
bsr SetupForeColor ; make it the pen color |
move.w right(rectReg), -(SP) ; start in upper right |
subq.w #1, (SP) |
move.w top(rectReg), -(SP) |
_MoveTo |
move.l #$00010000, -(SP) ; h = 0, v = 1 |
_Line ; draw one pixel corner |
move.w lrColor(SP), D0 ; get shade for right and bottom |
bsr SetupForeColor |
move.l bottom(rectReg), -(SP) ; bottom AND right |
subq.w #1, (SP) |
subq.w #1, 2(SP) |
_LineTo ; draw line on right |
move.w left(rectReg), -(SP) |
addq.w #1, (SP) |
move.w bottom(rectReg), -(SP) |
subq.w #1, (SP) |
_LineTo ; draw line across bottom |
move.l (SP)+, A0 |
addq.l #ShadedRectFrame.ParamSize, SP |
jmp (A0) |
endwith |
endwith |
; ================================================ |
; wHit message |
; ================================================ |
; The hit test is to look for a click in the windowÕs content region. |
; The problem with this is that the WDEF extends the windowÕs contect to |
; include areas such as the fancy border, title bar, and drop shadow. If |
; the user clicks in the fancy border or shadow it is outside of the content |
; but still within the window. The reason for the inContent result in the |
; first place was to let the application know the user clicked any where |
; within the window excluding the drag area. So, we check for a click |
; within the structRgnÕs rect but remove the title bar is it has one. |
; This solved a few problems that hitherto were unknown, or at least not |
; reported. ModalDialog no longers reports an error when clicking in the |
; dBoxProcÕs fancy border. Clicking in the drop shadow is a click in the |
; window. Since a dBoxProc with title bar allows switching in MultiFinder, |
; clicking in the fancy border *must* be considered a click in the window. |
; paramReg holds the mousePoint in global coordinates . |
; windowReg holds the window pointer |
HitDoc clr.w -(SP) ; make room for function result |
move.l paramReg,-(SP) ; push the mouse point |
bsr StructInTemp ; structRgn.rgnBBox in TempRect |
tst.w varCodeReg ; dialog window? |
beq.s @1 ; no, they have a title bar |
tst.b IsProcFive(A6) ; dBoxProc with title? |
beq.s @2 ; no, then no title bar |
@1 add.w titleHgtReg,top(rectReg) ; remove title bar area |
@2 move.l rectReg,-(SP) ; point at TempRect |
_PtInRect ; pt in window area less title bar? |
tst.b (SP)+ ; well, is it? |
beq.s NotInContent ; if not, go check out drag region |
; see if its in the grow icon area |
tst.w varCodeReg ; is it a dialogBox? |
bne.s JustContent ; if so, its only in the content |
; ------------- hit in grow? ------------- |
tst.b wHilited(windowReg) ; is it active? |
beq.s JustContent ; if not, it cant be in grow |
move.w varCode(A6),D0 |
Btst #hasGrow,D0 ; inGrow enabled? |
BGT.s JustContent ; if not, skip |
move.l contRgn(windowReg),A0 ; get region handle |
move.l (A0),A0 ; get region ptr |
move.l rgnBBox+botRight(A0),D0 ; get bottom left of content |
; first consider the x coordinate |
moveq #14,D4 ; keep 14 in a register to save code |
sub D4,D0 ; offset x by 14 |
cmp D0,paramReg ; if <, just in content |
BLT.s JustContent |
SWAP D0 ; its within range on x so try y |
sub D4,D0 ; check out y dimension |
SWAP paramReg |
cmp D0,paramReg ; compare y coordinates |
BLT.s JustContent |
moveq #wInGrow,D0 ; flag in grow Icon |
bra DoneHitDoc |
; the point is in the content region so return a Ô1Õ |
JustContent |
moveq #wInContent,D0 ; return in content |
bra DoneHitDoc ; go store function result and return |
; ------------- hit not in content ------------- |
; Not in the content. see if its in the dragRgn (content extended by |
; titleBar) dBoxProc may have tile higher above content than normal. |
NotInContent |
bsr BuildTBarRect ; title bar rect into rectReg |
clr.w -(SP) ; make room for function result |
move.l paramReg,-(SP) ; push the mouse point |
move.l rectReg,-(SP) ; and push the rect |
_PtInRect ; is the point in the title bar? |
tst.b (SP)+ ; examine result |
beq DoneHitDoc2 ; if not, return already = 0 |
tst.b wHilited(windowReg) ; is it hilited? |
beq.s ItsInDrag ; if not, canÕt be in GoAway |
; ------------- hit in goAway or Zoom? ------------- |
; test vertical first for goAway and Zoom since theyÕre the same |
move.l paramReg,D0 ; check vertical |
SWAP D0 ; which is high word of mousePoint |
move.l windowReg,A0 ; convert pointer if its a pixmap |
bsr PortToMap ; convert |
add.w bounds+top(A0),D0 ; convert to local |
sub.w portRect+top(windowReg),D0 ; compensate for origin |
; The vertical hit test assumes the zoom is offset from the portRect. |
; The dBoxProc with title has the title area sharing a portion of the fancy |
; border surrounding the content. So, an adjustment is needed to locate |
; the zoom boxÕs vertical position. |
tst.b IsProcFive(A6) ; dBoxProc with title bar? |
beq.s @OldVert ; no, use normal vertical test |
addq.w #proc5TopAdjust,D0 ; yes, then tweak it |
@OldVert ; continue with normal testing |
add.w WInfo.wBoxDelta(A6),D0 ; below box? |
bpl.s ItsInDrag ; => yes |
add.w #11,D0 ; in box? |
BMI.s ItsInDrag ; => no |
tst.b wGoAway(windowReg) ; is there a goAway button? |
beq.s HitZoom ; => no, hit-test zoom |
move.l paramReg,D0 ; get mousePt |
ADD bounds+left(A0),D0 ; convert to local (A0 still valid) |
sub portRect+left(windowReg),D0 ; compensate for origin |
cmp #18,D0 ; is it too far right? |
BGT.s HitZoom ; if so, its in drag |
subq.w #8,D0 ; it must be at least 7 |
BMI.s ItsInDrag |
moveq #wInGoAway,D0 ; its in the goAway button so signal it |
bra.s DoneHitDoc |
HitZoom tst.b wZoom(windowReg) ; zoom flag set? |
beq.s ItsInDrag ; => not in these here parts |
move.w paramReg,D0 ; get mousePt |
move.l windowReg,A0 ; convert pointer if its a pixmap |
bsr PortToMap ; convert |
add.w bounds+left(A0),D0 ; convert to local |
sub.w portRect+right(windowReg),D0 ; make right edge = 0 |
; The dBoxProc with title has moved the zoom box in towards the left due to |
; the fancy border. Need to adjust horizontal hit test for this case. |
tst.b IsProcFive(A6) ; dBoxProc with title? |
beq.s @OldZoomHit ; no, then normal position |
subq.w #proc5HitZAdjust,D0 ; tweak it |
@OldZoomHit ; continue with testing |
cmp.w #-19,D0 ; too far left? |
BLT.s ItsInDrag ; => if so, itÕs in drag |
cmp.w #-9,D0 ; too far right? |
BGT.s ItsInDrag ; => if so, itÕs in drag |
bsr IsItSmall ; is window big? |
beq.s @1 ; => oh boy, right again |
moveq #wInZoomOut,D0 ; say window small |
bra.s DoneHitDoc ; und scram-muller |
@1 moveq #wInZoomIn,D0 ; say window big |
bra.s DoneHitDoc ; and muller out of here |
ItsInDrag moveq #wInDrag,D0 ; flag in drag region |
DoneHitDoc move.l D0,ProcResult(A6) ; update function result |
DoneHitDoc2 rts |
; ================================================ |
; wCalcRgns message |
; ================================================ |
; CalcDoc -- calculate the structure and content regions for the window pointed |
; to by windowReg. First update size for zooming if necessary |
CalcDoc tst.b wZoom(windowReg) ; zoom flag set? |
beq.s @1 ; => no |
bsr IsItSmall ; update window size |
; ------------- calc ContRgn ------------- |
@1 |
bsr GetRect ; make a rectangular content region |
move.l contRgn(windowReg),-(SP) ; content region gets result |
move.l rectReg,-(SP) ; tempRect is the rectangle |
_RectRgn ; go make the region into content region |
; ------------- calc structRgn ------------- |
; now do the structure region. First correct the bounding rectangle (tempRect) for |
; structure instead of content |
move.l #$00020002,D4 ; get the shadow factor for DBox |
move.l structRgn(windowReg),-(SP) ; push the structRgn for later |
move.l rectReg,-(SP) ; tempRect is the rect in rectReg |
move.l rectReg,-(SP) ; make two copies |
move.l MinusOne,-(SP) ; make 1 pixel bigger, all around |
_InsetRect ; make it bigger |
tst.w varCodeReg ; is it dBox? |
bne.s DoDBoxCalc ; skip if it is |
move.w titleHgtReg,D0 ; move up to top of window |
subq.w #1,D0 ; tweak it |
sub.w D0,top(rectReg) ; and set top of struct region |
LSR.l #1,D4 ; adjust shadow factor |
bra.s CalcCommon ; use common code for the rest |
; ------------- calc structRgn for dialogs ------------- |
DoDBoxCalc |
cmp #1,varCodeReg ; is it variant 1? |
bne.s CalcCommon |
move.l rectReg,-(SP) ; tempRect is the rect in rectReg |
move.l #$FFF9FFF9,-(SP) ; push (-7,-7) |
_InsetRect ; inset it |
; The dBoxProc with title needs a larger structRgn. Also, a portion of this |
; title area is shared with the fancy border that surrounds the content. |
tst.b IsProcFive(A6) ; dBoxProc with title? |
beq.s CalcCommon ; skip if without title bar |
move.w titleHgtReg,D0 ; move up to top of window |
subq.w #proc5TopAdjust,D0 ; tweak it |
sub.w D0,top(rectReg) ; and set top of struct region |
CalcCommon ; create the structRgn for all windows. |
_RectRgn ; RectRgn(structRgn,tempRect) |
tst varCodeReg |
beq.s @1 ; if so, it has shadow |
cmp #3,varCodeReg ; is it variant 3? |
bne.s CalcDone ; if not, no shadow |
@1 |
; ------------- include drop shadow ------------- |
; now add in the 1 or 2 pixel drop shadow |
move.l TempRgn(A6),-(SP) ; get temp region |
move.l rectReg,-(SP) ; tempRect is the rect in rectReg |
move.l (SP),-(SP) ; save another copy |
move.l D4,-(SP) ; push shadow factor |
_OffsetRect ; offset it |
_RectRgn |
move.l structRgn(windowReg),-(SP) ; |
move.l TempRgn(A6),-(SP) ; get temp region |
move.l structRgn(windowReg),-(SP) ; structure gets the result |
_UnionRgn ; add it in |
CalcDone rts ; all done with CalcDocRgns |
; ================================================ |
; wGrow message |
; ================================================ |
; GrowDoc handles the grow message by drawing a grow outline based on |
; the rectangle held in paramReg. First make it one pixel bigger to |
; jibe with the structure then frame the entire window. |
GrowDoc move.l paramReg,-(SP) ; push the rect |
move.l MinusOne,-(SP) ; push (-1,-1) |
_InsetRect |
move.l paramReg,A3 ; get rect ptr |
move.l topLeft(A3),-(SP) ; save topleft for below |
move.w titleHgtReg,D0 ; adjust for title |
subq.w #1,D0 ; and tweak it |
sub.w D0,top(A3) ; and save it |
move.l paramReg,-(SP) ; push the rectangle |
_FrameRect ; frame it |
; ------------- draw the lower horizontal ------------- |
; line at the top of the horizontal scroll bar area |
move.w left(A3),-(SP) ; push left |
move.w bottom(A3),-(SP) ; push bottom |
sub #scrollBarSize,(SP) ; a few pixels above bottom |
move.l (SP),-(SP) ; make a copy of this point |
_MoveTo ; move to it |
move.w right(A3),2(SP) ; now go to the right edge |
_LineTo ; draw the horizontal line |
; ------------- draw the upper horizontal ------------- |
; line below the title bar area |
move.l (SP),topLeft(A3) ; restore topLeft, leave on stack |
move.l (SP),-(SP) ; make a copy of this point |
_MoveTo ; move to it |
move.w right(A3),2(SP) ; now go to the right edge |
_LineTo ; draw the horizontal line |
; ------------- draw the vertical line ------------- |
; line along left edge of the vertical scroll bar |
move.w right(A3),-(SP) ; push right |
sub #scrollBarSize,(SP) ; few pixels to the left |
move.w top(A3),-(SP) ; push top |
move.l (SP),-(SP) ; make a copy of this point |
_MoveTo ; and move to it |
move.w bottom(A3),(SP) ; now go to bottom edge |
_LineTo ; draw the vertical line |
; restore the rect back to |
; how it was when we got it |
move.l paramReg,-(SP) ; push the rect |
move.l OneOne,-(SP) ; push (1,1) |
_InsetRect |
GrowDone rts |
; ================================================ |
; wDrawGIcon message |
; ================================================ |
; Draw the grow icon. First make this window the current grafPort |
DrawGIcon |
move.l GrafGlobals(A5),A0 ; get the current port and save it |
move.l thePort(A0),-(SP) ; |
move.l windowReg,-(SP) ; push the windowÕs port |
_SetPort ; make that the port |
clr.l globalOffset(a6) ; No offset for BW systems. |
tst.b IsColor(A6) ; is this a color system? |
beq @NoColor8 ; Nope. Skip color stuff |
; ------------- do color window ------------- |
; The region passed to _DeviceLoop has to be offset into global coordinates on |
; color systems since weÕre drawing into the window manager port. |
move.l GrafGlobals(a5),a0 ; get the port |
move.l thePort(a0),a0 ; / / |
lea portBits(a0),a0 ; point to ÒbitmapÓ in the port / / |
tst.w rowBytes(a0) ; is this a color port? |
bpl.s @bitmap ; |
move.l baseAddr(a0),a0 ; pixmap handle |
move.l (a0),a0 ; pixmap ptr |
@bitmap ; |
move.l ScrnBase,d0 ; get base address of screen |
cmp.l baseAddr(a0),d0 ; is it the same as thePortÕs ? |
beq.s @drawToScreen ; yes => we are drawing to screen |
move.w #1, -(SP) ; no => assume old-port, depth equals 1 |
tst.w rowBytes(A0) ; is this an old-style port? |
bpl.s @depthOk ; yes. depth of 1 on stack is okay |
move.w pmPixelSize(A0),(SP) ; fix depth on stack |
@depthOk ; |
move.w #fakeDeviceFlags, -(SP) ; assume non-CQD case |
clr.l -(SP) ; NIL gDeviceHandle for non-CQD machines |
btst #6,ROM85 ; Color QuickDraw available? |
bnz @deviceAndFlagsOk ; of not, fake versions on stack are correct |
move.l theGDevice, A1 ; current device GDHandle |
move.l A1,(SP) ; fix gdHandle on stack |
move.l (A1), A1 ; point to the device |
move.w gdFlags(A1),4(SP) ; fix gdFlags on stack |
@deviceAndFlagsOk ; |
clr.l -(SP) ; flag clear (not drawing to screen) |
bsr WDefDrawGIcon ; |
bra @exitDrawGIcon ; |
@drawToScreen ; |
lea globalOffset(a6),a2 |
move.l portRect(windowReg),d4 |
move.l d4,(a2) |
move.l a2,-(sp) |
_LocalToGlobal ; Convert topLeft to global coordinates |
move.l d4,-(SP) ; push src point |
move.l a2,-(SP) ; push ptr to dest point |
_SubPt ; get local to global offset |
; save the foreground and background of the WMgr port & set new colors |
subq #6,SP ; make room for rgbColor on stack |
move.l SP,-(SP) ; push pointer to placeholder |
_GetForeColor ; get the window portÕs foreColor |
subq #6,SP ; make room for the backColor too |
move.l SP,-(SP) ; push pointer to placeholder |
_GetBackColor ; get the window portÕs backColor |
; Get the intersection of the clipRgn and visRgn of the window to use as the |
; clipping region for drawing the grow icon. |
move.l clipRgn(windowReg),-(sp) |
move.l visRgn(windowReg),-(sp) |
move.l tempRgn(a6),-(sp) |
_SectRgn ; Get intersection of portRect & visRgn |
move.l tempRgn(a6),-(sp) |
move.l (a2),-(sp) |
_OfsetRgn ; Move the clipRgn into global coordinates |
move.l WMgrCPort,-(sp) |
_SetPort ; Set port back to WMgrPort |
subq #4,sp ; |
_NewRgn ; Allocate new regionÉ |
move.l (sp),-(sp) ; |
_GetClip ; to save WMgrPortÕs clipRgn in. |
move.l tempRgn(A6),-(sp) |
move.l (SP), -(SP) ; once more for DeviceLoop |
_SetClip ; Clip to the windowÕs clipRgn |
bra.s @isColor ; Fill in the other _DeviceLoop parameters |
@NoColor8 ; END OF COLOR-ONLY SECTION |
move.l tempRgn(A6), -(SP) ; rgn handle |
move.l (SP), -(SP) ; once more for DeviceLoop |
pea portRect(windowReg) ; local coord rect |
_RectRgn |
@isColor |
pea WDefDrawGIcon ; address of devloop drawing proc |
clr.l -(SP) ; no unusual activities |
clr.l -(SP) ; and no user data |
_DeviceLoop |
tst.b IsColor(A6) ; is it a color system? |
beq.s @exitDrawGIcon ; no, so skip this restore |
move.l (sp),-(sp) |
_SetClip ; Restore WMgrPort clipRgn |
_DisposRgn ; Get rid of saved region |
move.l SP,-(SP) ; push ptr to rgbColor previously saved on top of stack |
_RGBBackColor ; |
addq #6,SP ; trash backcolor |
move.l SP,-(SP) ; |
_RGBForeColor ; |
addq #6,SP ; |
@exitDrawGIcon |
_SetPort ; restore the incoming port (saved above) |
rts |
WDefDrawGIcon |
with WDefDrawFrame |
move.w depth(SP), curDepth(A6) ; save this for SetupColor magic |
move.l devHandle(SP), D1 ; pass this drawing device |
bsr CheckAvailableColors |
moveq #wFrameColor,D0 ; get fore color |
moveq #wContentColor,D1 ; get back color |
bsr SetupColors ; set Õem up |
; ------------- plot grow icon ------------- |
; compute the grow icon rectangle in tempRect which is inside the lower |
; left corner of the scroll bar area. |
move.l globalOffset(a6),d4 ; Get offset amount |
move.l portRect+botRight(windowReg),(rectReg) ; botRight=topLeft |
move.l (rectReg),botRight(rectReg) ; copy into botRight, too |
add.l d4,(rectReg) ; Adjust for global case |
add.l d4,botRight(rectReg) ; Adjust for global case |
sub.w #scrollBarSize-2,top(rectReg) ; remove scroll area |
sub.w #scrollBarSize-2,left(rectReg) |
tst.b wHilited(windowReg) ; is it hilited? |
bne.s @1 ; yes, plot it |
move.l rectReg,-(SP) ; TempRect still in rectReg |
_EraseRect ; |
subi.l #$00010001,(rectReg) ; Move topLeft back out |
bra.s PlotBoundary ; |
@1 ; |
moveq #wGrowGadget, D0 |
bsr SetupColorPict ; Get the grow gadget |
beq.s @2 ; DonÕt to extra stuff for black and white gadget |
; On color systems, the grow gadget is on a gray background; do the gray. |
move.w d2,-(sp) ; PlotSymbol will need D2, so save it in case _EraseRect trashes it |
moveq #wTitleBarShade1, D0 ; Use title bar gray for gray of grow icon |
bsr SetupBackColor |
move.l rectReg, -(SP) |
_EraseRect ; Gray shade |
move.w (sp)+,d2 |
; The inside of the grow gadget it a darker gray. Set the rectangle to the area |
; to darken |
move.l #$00030003,d3 ; Save ourselves 6 bytes by using a register |
move.l #$00040004,d4 |
add.l d4,(rectReg) |
sub.l d3,botRight(rectReg) |
@2 |
subi.l #$00010001,(rectReg) ; We subtracted one pixel less to avoid some flickering, |
pea TingeGrow ; Tinging routine for grow gadget |
bsr PlotSymbol ; so we have to put those pixels back before |
; Set colors for plotting boundary |
moveq #wFrameColor, D0 ; get fore color |
moveq #wContentColor,D1 ; get back color |
bsr SetupColors ; set it up |
; ------------- plot the boundary lines ------------- |
; plot the left edge of the vertical scroll bar area and the top edge |
; of the horizontal scroll bar area. |
PlotBoundary |
move.w portRect+left(windowReg),-(SP) ; push portRect.left |
move.l globalOffset(a6),d4 |
add.w d4,(sp) ; Adjust for global case |
move.w top(rectReg),-(SP) ; push tempRect.top |
_MoveTo |
move.w portRect+right(windowReg),-(SP) ; push portRect.right |
add.w d4,(sp) ; Adjust for global case |
move.w top(rectReg),-(SP) ; push tempRect.top |
_LineTo ; draw the horizontal line |
swap d4 ; Get vertical offset into low word |
move.w left(rectReg),-(SP) ; push tempRect.left |
move.w (SP),-(SP) ; copy it again for later |
move.w portRect+top(windowReg),-(SP) ; push portRect.top |
add.w d4,(sp) ; Adjust for global case |
_MoveTo ; move to it |
move.w portRect+bottom(windowReg),-(SP) ; push portRect.bottom |
add.w d4,(sp) ; Adjust for global case |
_LineTo ; draw the vertical line |
; ------------- done with grow drawing ------------- |
; donÕt forget to take care of colors saved on stack |
DrawGrowDone |
move.l (SP)+, A0 ; return address |
lea WDefDrawFrame.ParamSize(SP), SP ; pop params |
jmp (A0) |
endwith |
; ================================================ |
; Plotters |
; ================================================ |
; common code to draw little things like the goAway, zoom, and grow boxes |
; A1 holds the symbol |
; rectReg is the rectangleÕs address |
; D2 the plotting mode |
; A2 points at bitmap or pixmap rect info |
; ------------- Apply color tinge to the zoom box ------------- |
TingeZoom |
move.l #$00040004,d3 |
sub.l d3,botRight(rectReg) |
move.l rectReg,-(sp) |
_FrameRect ; Draw little box in zoom box first |
add.l d3,botRight(rectReg) ; Restore full rectangle |
; ------------- Apply color tinge to the goAway box ------------- |
TingeGoAway |
move.l rectReg,-(sp) |
_FrameRect ; Draw upper part of shade |
move.l OneOne,d3 |
sub.l d3,botRight(rectReg) |
move.l rectReg,-(sp) |
_FrameRect ; Draw lower shade |
move.l rectReg,-(sp) |
move.l d3,-(sp) |
_OffsetRect ; Position rectangle for light shade |
moveq #wLTinge0, D0 |
bsr SetupForeColor ; Do light tinge |
move.l rectReg,-(sp) |
_FrameRect ; Draw light tinge |
sub.l d3,(rectReg) ; Restore rectangle |
rts |
; ------------- Apply color tinge to the grow box ------------- |
TingeGrow |
movem.l d3/d4,-(sp) ; Save these registers |
move.l #$00010001,d4 |
add.l d4,botRight(rectReg) |
bsr.s DrawGrowBoxPart ; Draw a section of the grow icon |
moveq #wDTingeF, D0 ; Reset tinge for smaller box |
bsr SetupForeColor |
move.l rectReg,-(sp) |
move.l #-1,-(sp) ; Move rectangle up and to the left |
_OffsetRect ; Set up position of smaller box |
sub.l #$00030003,botRight(rectReg) |
bsr.s DrawGrowBoxPart ; Draw smaller box |
move.l rectReg,-(sp) |
move.l d4,-(sp) |
_InsetRect |
add.l d4,(rectReg) |
moveq #wTitleBarShade4,d0 |
bsr SetupBackColor |
move.l rectReg,-(sp) |
_EraseRect ; Refresh the dark gray inside small box |
sub.l d4,(rectReg) |
asl.l #2,d4 |
add.l d4,botRight(rectReg) ; Restore rectangle |
movem.l (sp)+,d3/d4 ; Restore registers |
; The main body of the wDrawGIcon routine shifted the rectangle. Shift it back |
; to its original position here to save a check back in the mainstream. |
sub.l d4,(rectReg) |
add.l d3,botRight(rectReg) |
rts |
; The grow box is made of two boxes that look like this: |
; |
; @@@@@ |
; @oooo DrawGrowBoxPart will draw this part based on the rectangle |
; @o**@ in rectReg. If we REALLY want to save some code, call TingeGoAway |
; @o**@ instead of DrawGrowBoxPart. The resulting gadget looks a little |
; @o@@@ strange, but itÕs passable in a pinch. |
; |
DrawGrowBoxPart |
move.l rectReg,-(sp) |
_FrameRect ; Draw dark frame |
moveq #wLTinge0,D0 |
bsr SetupForeColor |
move.l (rectReg),d3 ; Get topLeft |
add.l OneOne,d3 |
move.w d3,-(sp) |
move.w bottom(rectReg),-(sp) |
sub.w #1,(sp) |
_MoveTo |
move.l d3,-(sp) |
_LineTo ; Draw one light line |
move.w right(rectReg),-(sp) |
sub.w #1,(sp) |
swap d3 |
move.w d3,-(sp) |
_LineTo |
rts |
; ------------- plot the goAway box ------------- |
PlotGoAway |
bsr BuildTBarRect ; build a title bar rect in rectReg |
moveq #9,D1 ; add margin to left |
bra.s PlotIt ; use common code to plot it |
; ------------- plot the zoom box ------------- |
PlotZoom |
bsr BuildTBarRect ; build a title bar rect in rectReg |
move right(rectReg),left(rectReg) ; left := right-22 |
moveq #-20,D1 ; |
; The dBoxProc with title has a fancy border around itÕs structure. |
; This has to be taken into consideration when plotting the zoom box. |
tst.b IsProcFive(A6) ; dBoxProc with title? |
beq.s @1 ; skip if standard title bar |
subq.w #1,D1 ; inset zoom to the left |
@1 ; donÕt tweak it |
; ------------- plot the little dude face ------------- |
; make Temprect into a 16x16 square for our little bitmap |
; dest rect top = rectReg.top + WInfo.wBoxDelta - 1 |
; dest rect bot = dest rect top + (A2).bottom - (A2).top |
; dest rect left = rectReg.left + D1 |
; dest rect right = dest rect left + (A2).right - (A2).left |
PlotIt |
move.w d2,-(sp) |
add.w D1,left(rectReg) ; add offset to left |
move.w WInfo.wBoxDelta(A6), D1 |
add.w D1, top(rectReg) ; add offset to top |
addq.w #1, top(rectReg) ; align bitmap |
move.l topLeft(rectReg),botRight(rectReg) ; topLeft = botRight |
move.w 2+bottom(A2), D0 |
sub.w 2+top(A2), D0 |
add.w D0, bottom(rectReg); |
move.w 2+right(A2), D0 |
sub.w 2+left(A2), D0 |
add.w D0, right(rectReg); |
move.l rectReg, -(SP) |
move.l #$FFFFFFFF, -(SP) |
_InsetRect |
moveq #wTitleBarShade1, D0 |
bsr SetupBackColor |
move.l rectReg, -(SP) |
_EraseRect |
move.l rectReg, -(SP) |
move.l OneOne, -(SP) |
_InsetRect |
move.w (sp)+,d2 |
; ------------- plot the little dudeÕs face ------------- |
; PlotSymbol -- A2 contains a PicHandle. rectReg holds the address of |
; the destination rectangle. |
; D2 is non-zero for pixmap, zero for bitmap |
; pixmap is not included in this example since the format and kind of |
; these resources is subject to change and private |
; A2 points to bounds/rect/bits |
; rectReg holds destination rect |
PlotSymbol |
move.w D2,-(sp) ; Save color/BW flag |
tst.b D2 ; use picture or bits? |
bz.s PlotBW ; if zero, use CopyBits |
tst.b gadgetHighlight(a6) |
bz.s @notHighlighted |
moveq #wTitleBarDark, D0 |
moveq #wTingeLight, D1 |
bra.s plotSetupCommon |
@notHighlighted |
moveq #wTitleBarLight, D0 |
moveq #wTitleBarDark, D1 |
plotSetupCommon |
bsr SetupColors |
move.l workPixmap(A6), A0 |
move.l (A0), A0 |
move.l A0, -(SP) |
bra.s copyBitsPixCommon |
PlotBW |
lea IconBitmap,A0 ; get pointer to source bitmap |
move.w (A2)+, rowBytes(A0) |
move.l (A2)+, bounds(A0) |
move.l (A2)+, bounds+4(A0) |
move.l A2, baseAddr(A0) |
pea IconBitmap ; push pointer source bitmap |
copyBitsPixCommon |
move.l (SP),A0 ; remember in A0, too |
move.l GrafGlobals(A5),A1 ; get lisaGraf global baseaddress |
move.l thePort(A1),A1 ; get thePort |
pea portBits(A1) ; thatÕs the destination bitmap |
pea bounds(A0) ; boundsRect of bitmap is source |
move.l rectReg,-(SP) ; tempRect is the destination |
clr.w -(SP) |
clr.l -(SP) ; no mask region |
; the colors should be OK here |
; transfer the bitMap (stretching as necessary...) |
_CopyBits ; stretch those bits |
move.l tempPixels(A6), A0 ; get the locked pixels (if any) |
_HUnlock ; and unlock them |
move.w (sp)+,D2 |
bz.s @noTingeRoutine ; DonÕt tinge for black & white case |
; All the tinge routines do the dark tinge first, so set it up for them |
moveq #wDTingeF, D0 |
bsr SetupForeColor |
move.l 4(sp),d0 ; Get address of tinging routine |
bz.s @noTingeRoutine ; No; get out of here. |
move.l (sp)+,(sp) ; Push down return address |
move.l d0,a0 |
jmp (a0) ; Tinge the gadget |
@noTingeRoutine |
move.l (sp)+,a0 ; Get return address |
addq #4,sp ; Remove tinge routine from stack |
jmp (a0) ; Return to caller |
; ================================================ |
BuildTBarRect |
; ================================================ |
; BuildTBarRect builds a rectangle enclosing the titleBar in TempRect |
; leave rectReg pointing at TempRect, which is nice. |
; WARNING -- Trashes D0,A0,A1,rectReg |
bsr.s StructInTemp ; structRgn.rgnBBox in rectReg |
; make bottom := top + WHeight |
move top(rectReg),D0 ; get top |
add.w titleHgtReg,D0 ; add precomputed height |
move D0,bottom(rectReg) ; update bottom |
; The dBoxProc with title has no shadow, donÕt subtract off right edge. |
tst.b IsProcFive(A6) ; dBoxProc with title? |
bne.s @NoInset ; no, then standard title bar |
subq #1,right(rectReg) ; inset right |
@NoInset ; needed another entry point |
rts ; return to caller |
; ================================================ |
StructInTemp |
; ================================================ |
; Get structRgn.rgnBBox into TempRect and keep TempRect address in rectReg |
; WARNING - trashes A0 |
move.l structRgn(windowReg),A0 ; get region handle |
move.l (A0),A0 ; get region ptr |
addq #rgnBBox,A0 ; point A0 at the bounding box |
move.l (A0)+,(rectReg) ; copy rgnBox to TempRect |
move.l (A0)+,botRight(rectReg) ; |
rts |
; ================================================ |
IsItSmall |
; ================================================ |
; IsItSmall returns NE if the window has been resized or moved (NE if window "small") |
; It updates smallsize if it has. (If tab, only move small window). |
; WARNING -- Trashes A0,A2 and TempRect |
bsr.s GetRect ; rectReg = curSize |
move.l wDataHandle(windowReg),A0 ; get data handle |
move.l (A0),A2 ; A2 = bigSize |
addq #8,A2 |
; the window is large if all corners |
; are within 7 of their default positions |
bsr.s ChkPoint ; compare topleft |
bne.s IsSmall ; => not close enough |
bsr.s ChkPoint ; compare botRight |
beq.s NotSmall ; => itÕs close enough |
IsSmall move.l wDataHandle(windowReg),A0 ; get data handle |
move.l (A0),rectReg ; save windowÕs current size |
bsr.s GetRect ; get current size into rectReg |
moveq #1,D0 ; return NE! |
NotSmall lea TempRect,rectReg ; restore rectReg |
rts ; weÕre done |
; ================================================ |
ChkPoint |
; ================================================ |
; This routine is called in sequence. First time it checks topLeft, |
; the next time is will check botRight. It compares the rect in |
; TempRect against the rect pointed at in A2. |
; WARNING - increments rectReg |
move.l (A2),-(SP) ; make point into a rect |
move.l (A2)+,-(SP) ; by pushing twice |
move.l SP,-(SP) ; and insetting by 7 |
move.l #$FFF9FFF9,-(SP) ; |
_InsetRect ; |
clr.w -(SP) ; is cursize within 7 of |
move.l (rectReg)+,-(SP) ; that point? |
pea 6(SP) ; |
_PtInRect ; |
subq.b #1,(SP) ; reverse sign of result |
move.b (SP)+,D0 ; |
addq #8,SP ; strip off the rect |
rts ; exit w/EQ if "Big" |
; ================================================ |
GetRect |
; ================================================ |
; Returns the rect in rectReg converted to global coordinates |
move.l portRect(windowReg),topLeft(rectReg) ; get locals |
move.l portRect+botRight(windowReg),botRight(rectReg) ; get locals |
move.l windowReg,A0 ; copy portPtr for PortToMap |
bsr PortToMap ; get the rect pointer |
move.l rectReg,-(SP) ; push address of rect |
move.l bounds(A0),-(SP) ; push offset locToGlob |
NEG.w (SP) ; make offset positive |
NEG.w 2(SP) |
_OffsetRect ; convert rect to global |
GetRectDone rts |
;---------------------------------------------------------------------------- |
; |
; These routines are the heart of the WDEFÕs ability to draw the right thing |
; on the right device based on the depth of the device. There are three kinds |
; of window color types we can draw: |
; |
; Black and White Drawn on non-CQD Macs, and on devices that have less |
; than 8 bits per pixel. 8 bits per pixel is a high, |
; arbitrary limit that we may be able to relax if we |
; can integrate use of the Palette Manager into the |
; WDEF. |
; Custom wctbs If there is a custom color table associated with |
; this window, then its colors are used. This may |
; change in the future if we find a way to customize |
; the colors of the System 7 three-d windows. |
; System 7.0 & later Our new default for color environments. |
;---------------------------------------------------------------------------- |
MakeRatioRGB |
movem.l D7/A2, -(SP) |
lea endRGB(A6), A0 |
lea startRGB(A6), A1 |
lea tempRGB(A6), A2 |
mulu #$1111, D2 |
move.w #2, D0 |
@nextChannel |
MOVEQ #0, D1 ; clear high word |
MOVE (A0)+, D1 ; background color component |
SUB (A1), D1 ; change from foreground |
SLO D7 ; remember if it was negated |
BHS.S @orderedOK |
NEG D1 ; flip if subtraction would overflow |
@orderedOK |
mulu D2, D1 ; multiply times scale factor |
SWAP D1 ; divide by 65K |
TST.B D7 |
BEQ.S @notFlipped |
NEG.L D1 ; flip it |
@notFlipped |
add.w (A1)+, D1 |
move.w D1, (A2)+ |
dbra D0, @nextChannel |
movem.l (SP)+, D7/A2 |
rts |
CheckAvailableColors |
;---------------------------------------------------------------------------- |
; This routine is called just as we enter the _DeviceLoop drawing proc, after |
; the current depth has been stored in curDepth(A6). If the depth is 8 bits |
; per pixel or greater, and the wctb for this window is the default, then |
; weÕre going to draw the System 7 three-d windows instead (threeDWind gets |
; set to TRUE). Otherwise, threeDWind gets set to FALSE. |
;---------------------------------------------------------------------------- |
movem.l D3-D4/A2, -(SP) ; these should be saved |
move.w curDepth(A6), D0 ; how deep is the current device? |
cmp.w #2, D0 ; must be 2 bits/pixel or better |
sge threeDWind(A6) ; set prelim answer |
blt.s @exit ; get out if already no good |
move.l TheGDevice, -(SP) ; save this |
move.l D1, TheGDevice ; set our device for color mapping |
tst.b varCodeReg ; what kind of window is this? |
bz.s @doCheckHilite |
tst.b IsProcFive(A6) ; is it moveable modal? |
bne.s @doneCheckHilite |
@doCheckHilite |
lea HiliteShades, A2 ; point at shades we need |
bsr.s CheckShadesAvailable ; see if all these shades are here |
tst.b threeDWind(A6) ; did we fail to get the shades? |
bz.s @colorExit ; get out if so |
lea TitleBarShades, A2 ; point at shades we need |
bsr.s CheckShadesAvailable ; see if all these shades are here |
tst.b threeDWind(A6) ; did we fail to get the shades? |
bz.s @colorExit ; get out if so |
lea TingeShades, A2 ; point at shades we need |
bsr.s CheckShadesAvailable ; see if all these shades are here |
tst.b threeDWind(A6) ; did we fail to get the shades? |
bz.s @colorExit ; get out if so |
@doneCheckHilite |
cmp.b #dBoxProc, varCodeReg ; do we need the thick dialog border? |
bne.s @colorExit ; if not, weÕre done checking |
lea DialogShades, A2 ; point at shades we need |
bsr.s CheckShadesAvailable ; see if all these shades are here |
@colorExit |
move.l (SP)+, TheGDevice ; restore device |
@exit |
movem.l (SP)+, D3-D4/A2 |
rts |
CheckShadesAvailable |
move.w (A2), D3 ; get next ÔlightÕ color |
move.l #'csd ', D4 ; an unlikely pixel value |
@rampLoop |
cmp (A2), D3 ; get the next shadeÕs light color |
bne.s @exit ; if new, reinit for new ramp |
move.l A2, A0 ; point to shade entry |
bsr SetupRatioColor ; get shade in tempRGB |
subq.l #4, SP ; room for pixel index |
pea tempRGB(A6) ; the shade RGB we want |
_Color2Index ; what does it map to? |
move.l (SP)+, D0 ; get the pixel index |
cmp.l D0, D4 ; is it the same as last time? |
beq.s @failure ; if so, not enough colors |
move.l D0, D4 ; update ÔlastÕ shade index |
addq.l #6, A2 ; point to next shade |
bra.s @rampLoop ; and test it |
@failure |
sf threeDWind(A6) ; use the old kind |
@exit |
rts |
DefaultWCTB |
;---------------------------------------------------------- |
; This table of bytes represents the colors in the default |
; wctb. It uses bytes because we know that the default |
; table only has black and white. |
;---------------------------------------------------------- |
dc.b $FF, $00, $00, $00, $FF, $00, $00, $FF |
dc.b $FF, $00, $00, $00, $00, $00, $00, $00 |
dc.b $00, $00, $00, $00, $00, $FF, $FF, $FF |
dc.b $FF, $FF, $FF, $00, $00, $00, $00, $00 |
dc.b $00, $FF, $FF, $FF, $FF |
align |
SetupRatioColor |
move.w 4(A0), -(SP) ; push shade percent |
move.w 2(A0), -(SP) ; push dark (to/fore) end of shade |
move.w (A0), D0 ; get light shade color number |
bsr.s SetUpColor ; get the color of the light (from/back) end |
move.l (SP)+, A0 ; get pointer to light color |
move.l (A0)+, startRGB(A6) ; copy red and green |
move.w (A0), startRGB+4(A6) ; copy blue |
move.w (SP)+, D0 ; get dark color number |
bsr.s SetUpColor ; get the color of the light end |
move.l (SP)+, A0 ; get pointer to light color |
move.l (A0)+, endRGB(A6) ; copy red and green |
move.w (A0), endRGB+4(A6) ; copy blue |
move.w (SP)+, D2 ; get shade percentage |
bsr.s MakeRatioRGB ; create a shade between the two |
rts |
; ================================================ |
SetupColors |
; ================================================ |
; Added this routine to help setup fore- and back color and save code. |
; SetUpColor takes a fore color in D0, and a back color in D1. |
; It then calls SetUpColor with both of them (which likes its |
; parameter in D0), and calls RGBForeColor and RGBBackColor |
; where appropriate. |
move.w D1,-(SP) ; save part identifier of back color |
bsr.s SetupForeColor |
move.w (SP)+,D0 ; get saved part |
bsr.s SetupBackColor |
rts ; all done |
; ================================================ |
SetupForeColor |
; ================================================ |
bsr.s SetUpColor ; D0 has forecolor part identifier |
bz.s @setClassicFore ; if non-CQD answer, branch |
_RGBForeColor |
bra.s @exit |
@setClassicFore |
_ForeColor |
@exit |
rts ; all done |
; ================================================ |
SetupBackColor |
; ================================================ |
bsr.s SetUpColor ; D0 has forecolor part identifier |
bz.s @setClassicBack ; if non-CQD answer, branch |
_RGBBackColor |
bra.s @exit |
@setClassicBack |
_BackColor |
@exit |
rts ; all done |
; ================================================ |
SetUpColor |
; ================================================ |
; SetUpColor takes a window part identifier in D0, finds the corresponding |
; part in the AuxWinTable (the part code is in the .value field) and returns |
; a pointer to its RGB on the stack. If the requested part is not found, |
; the old black and white color for that part is used. |
tst.b threeDWind(A6) ; can we use System 7 windows? |
bz.s @useBlackAndWhite ; nope? Try other cases |
cmp.w #lowestShadeIndex, D0 ; is this a shade color? |
blt.s @notShade ; not a shade color |
sub.w #lowestShadeIndex, D0 ; normalize to shade colors |
mulu #6, D0 ; x6 for table index |
lea ShadeTable, A0 ; point at table of shade colors |
add.w D0, A0 ; point to correct entry |
bsr.s SetupRatioColor ; get color in tempRGB |
move.l (SP)+, A0 ; pop the return address |
pea tempRGB(A6) ; point to rgb color |
moveq #1, D0 ; indicate color answer |
jmp (A0) ; get outa here |
@notShade |
move.l AuxCPtr(A6), A0 ; get the color table pointer |
bsr GoodColorTable ; does ctb contain the index (in D0)? |
beq.s @foundIt ; yes => go return corresponding color |
move.w D0,-(SP) ; save the index to color table on stack |
subq.l #4,SP ; leave space for results |
move.l #'wctb',-(SP) ; try to get the system wctb |
clr.w -(SP) ; |
_GetResource ; |
move.l (SP)+,A0 ; get the wctb resource |
move.w (SP)+,D0 ; retrieve the index |
cmp.l #0,A0 ; did we really get the wctb resource |
beq.s @useDefaultCTab ; no => go use the default ctab |
move.l (A0),A0 ; yes => deference to get ptr to wctb |
bsr GoodColorTable ; does wctb contain the index (in D0)? |
beq.s @foundIt ; yes => go return corresponding color |
@useDefaultCTab ; no => use the default ctab |
mulu #6,D0 ; (x6) index into rgb specs |
lea ThreeDColors, A0 ; point at standard colors |
@getCorrectColor ; |
move.l (SP)+,D1 ; get return address |
pea (A0, D0.w) ; point at correct color |
move.l D1, A0 ; get return address |
bra.s @exitColor |
@foundIt |
lea ctTable+rgb(A0, D1), A0 ; get the address of the color to use |
move.l A0, D0 ; weÕll need A0 in a second |
move.l (SP)+, A0 ; get the return address |
move.l D0, -(SP) ; push the rgb addr on the stack |
@exitColor |
moveq #1, D0 ; indicate color answer |
jmp (A0) ; return to caller |
@useBlackAndWhite |
lea DefaultWCTB, A0 ; point to cheesy color table |
move.b (A0, D0.w), D0 ; get white or black (as a byte) |
bnz.s @simpleWhite ; branch if we want white |
moveq #blackColor, D0 ; get the old-style color |
bra.s @classicExit ; get outa here |
@simpleWhite |
moveq #whiteColor, D0 ; get old-style white |
@classicExit |
move.l (SP)+, A0 ; return address |
move.l D0, -(SP) ; classic color |
moveq #0, D0 ; indicate classic answer |
jmp (A0) |
* ¥¥¥¥ NOTE: SetupColorPict is not included in this example. |
* SetupColorPict uses private, undocumented, and highly unstable |
* resources in the system file. |
* You really don't need them, since the bitmap and iconic |
* representations of the window gadgets is/are included at the end |
* of this file, and you can design your own PICT type resource to do the same |
* thing. |
SetupColorPict |
rts |
GoodColorTable |
move.w ctSize(A0), D1 ; get the color table size |
asl.w #3, D1 ; (x8) convert to color table index |
@legalIndex |
cmp.w ctTable+value(A0,D1), D0 ; is this the one? |
beq.s @done ; if equal, then done |
subq.w #8, D1 ; try the previous one |
bge.s @legalIndex ; loop while index positive |
@done |
rts |
; ================================================ |
PortToMap ; |
; ================================================ |
; Given a window pointer in A0, return the bitmap/pixmap pointer in A0 |
addq #portBits,A0 ;POINT TO BITMAP/PIXMAP HANDLE |
tst rowBytes(A0) ;BITMAP OR PIXMAP HANDLE? |
bpl.s GotBitMap ;=>JUST A BITMAP |
move.l baseAddr(A0),A0 ;ELSE GET PORTÕS PIXMAP HANDLE |
move.l (A0),A0 ;GET PIXMAP POINTER |
GotBitMap rts |
; ================================================ |
; CONSTANTS |
; ================================================ |
; some data used in the WDEF |
; ------------- HilitePattern used in the title bar ------------- |
HilitePattern |
dc.w $FF00,$FF00,$FF00,$FF00 |
PixelRsrcIDs |
;---------------------------------------------------------- |
; This is a table of resource IDs for the PICTs which are |
; used to draw the small pieces of the System 7 windows. |
;---------------------------------------------------------- |
dc.w -14335 ; wZoomGadget |
dc.w -14335 ; wGoAwayGadget |
dc.w -14334 ; wZoomGadgetHighlight |
dc.w -14334 ; wGoAwayGadgetHighlight |
dc.w -14335 ; wGrowGadget |
ThreeDColors |
;----------------------------------------------------------- |
; These are the RGB colors which are used to draw the shaded |
; windows. |
;----------------------------------------------------------- |
dc.w $FFFF, $FFFF, $FFFF ; wContentColor |
dc.w $0000, $0000, $0000 ; wFrameColor |
dc.w $0000, $0000, $0000 ; wTextColor |
dc.w $0000, $0000, $0000 ; wHiliteColor (not used) |
dc.w $FFFF, $FFFF, $FFFF ; wTitleBarColor (not used) |
dc.w $FFFF, $FFFF, $FFFF ; wHiliteLight |
dc.w $0000, $0000, $0000 ; wHiliteDark |
dc.w $FFFF, $FFFF, $FFFF ; wTitleBarLight |
dc.w $0000, $0000, $0000 ; wTitleBarDark |
dc.w $CCCC, $CCCC, $FFFF ; wDialogLight |
dc.w $0000, $0000, $0000 ; wDialogDark |
dc.w $CCCC, $CCCC, $FFFF ; wTingeLight |
dc.w $3333, $3333, $6666 ; wTingeDark |
ShadeTable |
HiliteShades |
dc.w wHiliteLight, wHiliteDark, $0 ; wHiliteShade0 |
dc.w wHiliteLight, wHiliteDark, $7 ; wHiliteShade7 |
dc.w wHiliteLight, wHiliteDark, $8 ; wHiliteShade8 |
dc.w wHiliteLight, wHiliteDark, $A ; wHiliteShadeA |
dc.w wHiliteLight, wHiliteDark, $D ; wHiliteShadeD |
TitleBarShades |
dc.w wTitleBarLight, wTitleBarDark, $0 ; wTitleBarShade0 |
dc.w wTitleBarLight, wTitleBarDark, $1 ; wTitleBarShade1 |
dc.w wTitleBarLight, wTitleBarDark, $4 ; wTitleBarShade4 |
DialogShades |
dc.w wDialogLight, wDialogDark, $0 ; wDialogShade0w |
dc.w wDialogLight, wDialogDark, $4 ; wDialogShade4w |
dc.w wDialogLight, wDialogDark, $6 ; wDialogShade6w |
dc.w wDialogLight, wDialogDark, $B ; wDialogShadeBb |
dc.w wDialogLight, wDialogDark, $F ; wDialogShadeF |
dc.w 0, 0, 0 ; stop checking shades |
dc.w wDialogLight, wDialogDark, $0 ; wDialogShade0b |
dc.w wDialogLight, wDialogDark, $4 ; wDialogShade4b |
dc.w wDialogLight, wDialogDark, $6 ; wDialogShade6b |
dc.w wDialogLight, wDialogDark, $B ; wDialogShadeBw |
TingeShades |
dc.w wTingeLight, wTitleBarDark, $0 ; wLTinge0 |
dc.w wTingeLight, wTingeDark, $4 ; wLTinge4 |
dc.w wTitleBarLight, wTingeDark, $F ; wDTingeF |
EndOfShades |
dc.w 0 |
BorderShades |
dc.w wDialogShade6w, wDialogShade0w ; Border colors for active windows |
dc.w wDialogShade6w, wTitleBarShade4 |
dc.w wDialogShade0b, wDialogShade6b |
dc.w wDialogShade6b, wDialogShadeF |
dc.w wTitleBarShade0, wTitleBarShade0 ; Border colors for inactive windows |
dc.w wTitleBarShade0, wTitleBarShade0 |
dc.w wHiliteShade8, wHiliteShade8 |
dc.w wHiliteShade8, wHiliteShade8 |
BitmapOffsets |
;---------------------------------------------------------- |
; This is a table of words which represent the offsets |
; from WDEFBitmaps to the beginning of each bitmap |
;---------------------------------------------------------- |
dc.w ZoomData-BitmapOffsets |
dc.w GoAwayData-BitmapOffsets |
dc.w ZoomHiliteData-BitmapOffsets |
dc.w GoAwayHiliteData-BitmapOffsets |
dc.w GrowBits-BitmapOffsets |
WDEFBitmaps |
;---------------------------------------------------------- |
; These bitmaps are used when drawing on classic QD |
; machines, or when the bit depth is too low to draw in |
; color. |
;---------------------------------------------------------- |
; ------------- ZoomData used in the zoom box ------------- |
ZoomData |
dc.w $0002 ; rowBytes |
dc.w $0000, $0000, $000B, $000B ; bounds |
dc.w $FFE0 ; ¥¥¥¥¥¥¥¥¥¥¥..... |
dc.w $8220 ; ¥.....¥...¥..... |
dc.w $8220 ; ¥.....¥...¥..... |
dc.w $8220 ; ¥.....¥...¥..... |
dc.w $8220 ; ¥.....¥...¥..... |
dc.w $8220 ; ¥.....¥...¥..... |
dc.w $FE20 ; ¥¥¥¥¥¥¥...¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $FFE0 ; ¥¥¥¥¥¥¥¥¥¥¥..... |
ZoomHiliteData |
GoAwayHiliteData |
dc.w $0002 ; rowBytes |
dc.w $0000, $0000, $000B, $000B ; bounds |
dc.w $FFE0 ; ¥¥¥¥¥¥¥¥¥¥¥..... |
dc.w $8420 ; ¥....¥....¥..... |
dc.w $A4A0 ; ¥.¥..¥..¥.¥..... |
dc.w $9520 ; ¥..¥.¥.¥..¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $F1E0 ; ¥¥¥¥...¥¥¥¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $9520 ; ¥..¥.¥.¥..¥..... |
dc.w $A4A0 ; ¥.¥..¥..¥.¥..... |
dc.w $8420 ; ¥....¥....¥..... |
dc.w $FFE0 ; ¥¥¥¥¥¥¥¥¥¥¥..... |
; ------------- BitMap for default GoAway button ------------- |
GoAwayData |
dc.w $0002 ; rowBytes |
dc.w $0000, $0000, $000B, $000B ; bounds |
dc.w $FFE0 ; ¥¥¥¥¥¥¥¥¥¥¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $8020 ; ¥.........¥..... |
dc.w $FFE0 ; ¥¥¥¥¥¥¥¥¥¥¥..... |
; ------------- BitMap for GrowIcon ------------- |
GrowBits |
dc.w $0002 ; rowBytes |
dc.w $0000, $0000, $000F, $000F ; bounds |
dc.w $0000 ; ................ |
dc.w $0000 ; ................ |
dc.w $0000 ; ................ |
dc.w $1FC0 ; ...¥¥¥¥¥¥¥...... |
dc.w $1040 ; ...¥.....¥...... |
dc.w $107C ; ...¥.....¥¥¥¥¥.. |
dc.w $1044 ; ...¥.....¥...¥.. |
dc.w $1044 ; ...¥.....¥...¥.. |
dc.w $1044 ; ...¥.....¥...¥.. |
dc.w $1FC4 ; ...¥¥¥¥¥¥¥...¥.. |
dc.w $0404 ; .....¥.......¥.. |
dc.w $0404 ; .....¥.......¥.. |
dc.w $0404 ; .....¥.......¥.. |
dc.w $07FC ; .....¥¥¥¥¥¥¥¥¥.. |
dc.w $0000 ; ................ |
END |
Copyright © 2003 Apple Computer, Inc. All Rights Reserved. Terms of Use | Privacy Policy | Updated: 2003-01-14