; ; 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. ; ; Written by: Andy Hertzfeld Aug 4, 1982; color interface by Chris Derossi ; ; Copyright: © 1982-1993 by Apple Computer, Inc., all rights reserved. ; ; Change History (most recent first): ; ; 5/27/93 SAM Rereintroduced the change made in <34>. Now after all these ; years, Paul W. can finally sleep at night. ; 12/16/92 HI Removed the the instruction which sets ROMMapInsert to mapTrue before ; GetResource() for 'wctb'. 'wctb' resource is modified by ; programs such as Color CDEV and the StandardWDEF should read ; the modified 'wctb' instead of the unmodifiable one from the ; ROM. Previously, this prevented changing the window colors. ; (Hoon Im) ; 11/19/92 RB Set ROMMapInsert to mapTrue before doing GetResource calls to ; look in ROM first. ; 10/22/92 CSS Changed some short branches to regular branches as ROM direct ; trap calling expanded code. ; <37> 10/6/91 DTY #1005945: Put <34> back into the WDEF, conditionalized for ; TheFuture. ; <36> 3/26/91 KSM jdr+vl,#84033: To check for zoom flag, you MUST: (1) Decide that ; this variant is a zooming variant, and (2) Insure that the spare ; flag (showing handle allocated) is non-zero. ; <35> 3/19/91 VL Rolled out <34> as GO5 said it's post-7.0. Now the file is the ; same as <33>. ; <34> 3/18/91 VL dty, Bug.Guide/#85080: The top line of the growicon was drawn ; one pixel too low when the window is off the screen. Fixed the ; problem by converting certain arithmetics operations from .l to ; .w to avoid overflowing in the low word. ; <33> 3/4/91 dba dty: get rid of SysVers conditionals and roll out the title bar ; icon code that was accidentally left in ; <32> 3/1/91 VL DFH, #83253 rollback: Rolled out changes in <30> as the fix only ; obsures the crashing problem without solving it. The file should ; be the same as <28>. ; <31> 3/1/91 VL KSM, #KSM-004 rollback: Rolled out change <29> per Gang Of Five ; but kept change <30>. ; <30> 2/28/91 DFH VL,#83253: Made sure to use long word operations to calculate ; addresses from offsets. Was using word-sized, which caused ; intermittent crashes, since result was incorrect. ; <29> 2/27/91 KSM vl,#KSM-004: BTST.B #0 the wZoom flag rather than TST.B to keep ; from conflicting with people who call modal dialog on ; non-dBoxProc variants (like ClarisÕ MacWrite IIv1.1 spell check) ; <28> 2/21/91 VL dba, #82019: Fixed the problem of the racing stripes are drawn ; over the window frame. ; <27> 2/19/91 VL csd, #83215: Do not draw to WMgrCPort and use DeviceLoop when ; drawing offscreen grow icon. ; <26> 1/14/91 VL (dba) DrawGIcon should draw a black box when inactive due to ; incompatibility with Finder and applications interface. ; <25> 1/2/91 VL (ngk) Fixed the bug of not restoring clipRgn correctly in ; DrawGIcon. ; <24> 11/9/90 VL (dc) Titles should be drawn in black in non-color windows (undo ; the changes in <21>). ; <23> 10/30/90 VL (dc) Fixed the off-by-one error in DrawGIcon by using SubPt ; instead of sub.l for the global offset. ; <22> 11/19/91 VL (dc) Title should be drawn in TrueGray or Dithered Gray when ; window is inactive. Also, System wctb should be used when an ; old-style wctb is encountered in an app. Only when the system ; wctb is not available should the default wctb in the code be ; used. ; <21> 10/8/90 VL (dc) Create a bogus color table for pmap when we do copybits. This is ; necessary since QuickDraw expects it when we are copying to a ; picture. Changed the offset to pixmap data since one more field ; (or word) is added to store the number of bits per pixel (this ; field is actually not used in this WDEF yet. But for the sake of ; consistency with CDEF, the field is added). ; <20> 10/4/90 VL Changed the color definition for WLTinge4. ; <19> 9/26/90 SAM Commented out wZoom redefinition. ; <18> 9/20/90 VL Lightened the title string gray because no one except Dean and ; Tantek likes the dark gray. (Refer to <12> for history). ; <17> 9/15/90 VL Switch to sysZone before FillRect so that the pixpat created ; will be persistent. ; <16> 9/14/90 csd Removed the local definition of _DeviceLoop. ; <15> 8/29/90 VL Fixed "long title not truncated properly" bug by adjusting the ; right indent into the title. ; <14> 8/7/90 DTY Changed forecolor in PlotSymbol so the close and zoom boxes ; highlight in gray, not color. ; <13> 8/7/90 DTY Tweaked the dark tinge color to make windows look more like ; PaulienÕs drawings. ; <12> 8/6/90 DTY Darkened the title string gray again because Tantek didnÕt like ; the light gray. ; <11> 8/4/90 DTY Changed gray of inactive title string to match that generated by ; DrawGrayishText. ; <10> 8/4/90 DTY Fix some glitches in the drawing that I missed because I was ; hallucinating or something. Changed some Ņ'ÓÕs to ŅÕÓÕs for the ; hell of it. ; <9> 8/4/90 DTY Mutilated drawing code to implement the new color scheme. Added ; code to dim windows to gray when deactive. ; <8> 7/13/90 DVB Turned on the color code. ; <7> 5/24/90 csd Turn the code back on to always allocate a data handle. ; MultiFinder is overloading spareFlag, causing our tests to think ; thereÕs a valid data handle. ; <6> 5/17/90 csd init pen to white background and black foreground; donÕt ; allocate data handle if thereÕs no zoom box. ; <5> 4/13/90 csd Disabled (temporarily) the color interface by requiring 33 ; bits/pixel in CheckAvailableColors. ; <4> 4/12/90 HJR Fix undefined sysvers for rom builds. ; <3> 4/11/90 csd Major rewrite to support shaded windows and _DeviceLoop. Also ; includes movable-modal (variant 5) windows. ; <1+> 2/6/90 JRM allow popup drawn to right of title, try out title icon in place ; of close box ; ; To Do: ; ;EASE$$$ READ ONLY COPY of file ŅStandardWDEF.aÓ ; 1.8 JSM 11/27/1989 Support icon in title bar for 7.0 only. ; 1.7 JSM 11/04/1989 and FJS. Added one pixel to the top and bottom of title ; bars with small icons. ; 1.6 JJJ 08/29/1989 Fixed parameter setup before DisposHandle after label DisposeDoc. ; 1.5 SES 08/22/1989 Removed references to nFiles. Updated equates accordingly. ; 1.4 JRM 08/07/1989 added support for optional icon in title bar ; 1.3 DAF 07/16/1989 Updated WDEF=0's version number. ; 1.2 DAF 07/14/1989 FOR AURORA BUILD - but affects all system builds also. ; Reinstated true drop shadow on document windows on all machines. ; 1.1 CCH 11/11/1988 Fixed Header. ; 1.0 CCH 11/ 9/1988 Adding to EASE. ; OLD REVISIONS BELOW ;„1.1 CCH 9/23/1988 Got rid of inc.sum.d and empty nFiles ; 1.0 BBM 2/12/88 Adding file for the first time into EASEÉ ; END EASE MODIFICATION HISTORY ; ; Modification History: ; ; 21-Aug-82 AJH Made DocumentProc support rectangular windows only ; 30-Aug-82 AJH Added growIcon hit detection, fixed hit to exclude perimeter drag ; 07-Sep-82 AJH Added handler for grow message ; 12-Sep-82 AJH Made it so proc doesn't have to calcRgns when not visible ; 20-Sep-82 AJH Added go-away button drawing and hit-testing ; 25-Sep-82 AJH Added cheap dialogBox window definition proc ; 28-Sep-82 AJH New GoAway button; restructured goAway drawing ; 05-Oct-82 AJH Removed Init message to save code ; 06-Oct-82 AJH Fixed dialogBox dragRgn bug ; 10-Oct-82 AJH Converted to QuickDraw trap interface ; 16-Oct-82 AJH Fixed GoAway hit-test origin bug ; 17-OCt-82 AJH Made both windowProcs preserve A1 ; 07-Nov-82 AJH Changed DocumentProc hiliting to Lisa way ; 14-Nov-82 AJH Improved shape of Grow outline ala Lisa ; 16-Nov-82 AJH Made branch table offset-based to save space ; 16-Nov-82 AJH Special-cased hiliting of small windows ; 20-Dec-82 AJH Changed title bar to 20 pixels tall ; 24-Dec-82 AJH Made wProcAsm a separate assembly ; 17-Mar-83 AJH Added third variant -- shadowless dBoxProc ; 27-Apr-83 AJH only plot, hit-test goAway if window is active ; 25-Jul-83 SC Fixed third variant -- frame was incorrect, see DrawDBox ; 06-Aug-83 AJH changed hiliting to use pattern ; 09-Aug-83 AJH added draw grow icon message receiver ; 20-Aug-83 AJH made it only hit-test or draws goAway if window is active ; 29-Oct-83 AJH new dBox border ; 10-Nov-83 AJH added variant 4 -- just like variant 0, but no inGrow ; 24-Dec-83 AJH fixed structRgn calc bug in variant 1 ; 24-Feb-84 AJH fixed hit-testing of go-away -- was off by 2 ; 09-Jan-85 JTC modified for MDS assembly: label DocumentProc changed ; to DocProc to avoid collision. ; 15-Jan-85 EHB fixed erase of 3 pixels of content rgn in DrawFrame; ; prevented erase of top line in DoTitleString. ; 15-Jan-85 EHB eliminated title flicker in CheckHilite; gnrl cleanup ; 30-Jan-85 EHB fixed boundary testing of GoAwayBox ; 14-Feb-85 JTC named rsrc. ; 16-May-85 EHB For GrowBox hitTesting, changed D4=16 to D4=14 ;v3 16-May-85 EHB Check left of window title when no grow box too ; 29-Jul-85 EHB converted back to porkshop ;v4 5-Aug-85 EHB Allow variable size titles ;v5 29-Aug-85 EHB Variant 8 knows how to zoom ; 18-Sep-85 EHB Added routine ChkPoint to allow slop on large zoom size ; 09-Oct-85 EHB Added designer zoom icon, restored old close mask ; 18-Oct-85 EHB New Zoom positioning (avoid lawsuits). Needs title fixes too ; Add tempRgn to frame to save clip, to calc window's region ; 18-Oct-85 EHB Only allow zooming on new ROMs (just in case) ; 21-Oct-85 EHB In HitDoc, use BuildTBarRect to hit-test title bar. The old ; way didn't work with null content regions. ; 03-Nov-85 EHB Zoom was one pixel too far left (fix draw and hit) ; ;-Reno World------------------------------------------------------------------ ; ; DAF Added color support on nuMac. Dropped Krispee stuff ; DAF Updated defproc to use RGBForeColor/RGBBackColor ; DAF Updated SetUpColor to look up window part color rather ; than assume part from position. Changed textMode to ; srcOr for titleString. Made window rgn square ; conditionally. ; DAF Changed SquareWindows conditional to be true on nuMac only. ; DAF Changed textMode to srcCopy, per Cary's recommendation ; DAF Added portToMap to correct problems in cWindows. ; DAF Locked titleString handle before drawing (OLD BUG!) ; DAF Universal defproc (version 10). With the exception of ; Square window flag, this defproc no longer has conditional ; build sections (all system determination is dynamic) ; DAF Square windows now supported dynamically ; ;- Aurora and System 6.0.4 --------------------------------------------------- ; ; <1.2> DAF Removed square document windows due to popular demand. ; Two changes (one in draw, one in calc). Search for ; ';!!!' ; <1.3> DAF Upped version number by one. ; ;- 7.0 --------------------------------------------------- ; <1.4> JRM optional small icon drawn to left of window title ; icon handle stored in bigger wDataHandle (now two zoom rects and icon handle) ; re-rolled in S369 (rederef region to avoid heap scramble bug) STRING ASIS PRINT OFF LOAD 'StandardEqu.d' INCLUDE 'colorEqu.a' PRINT ON hasTitleBarIcon: EQU 0 ; ================================================ ; 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 zoomBit EQU 3 ; bit 3 is zoom bit growBit 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 ; <27> 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 <17> bogusCtab ds.l 1 ; handle to bogus color table <21> hasZoom ds.b 1 ; TRUE if this window has a zoom box align 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 DAF BGT WDEFEnd ; skip it, itÕs too high DAF cmp.w #wDrawMsg,message(A6) ; compare to lowest value, too DAF 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 IsThereZoom BTST #zoomBit,varCodeReg ; zooming variant <36> BEQ.S IsNoZoom ; => no <36> TST.B wZoom(A3) ; did we get the handle? <36> IsNoZoom sne.b hasZoom(a6) ; Set true only if both <36> 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 @CommonSys ; done for the B&W environment CSS ; ------------- 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 move.w #MapTrue,RomMapInsert ; rb _GetResource ; look in ROM first rb move.l (SP)+, workPixmap(A6) ; save it for later move.l #16,D0 ; allocate a bogus ctab <21> _NewHandle ,SYS,CLEAR ; in sys heap with 0 entries <21> move.l A0, bogusCtab(A6) ; store the ctab so that we can dispose of it <21> move.l workPixmap(A6),A0 ; get the pixmap <21> move.l (A0),A0 ; get ptr to pixmap <21> move.l bogusCtab(A6),pmTable(A0) ; put the bogus ctab in our pixmap <21> 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 <21> _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 DAF 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 #zoomBit,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 cmp.w #wInGoAway,paramReg ; was it an XOR call? blt @exitDrawDoc ; if not, donÕt invert state bit eor.b #1< no, D3 is ok move.w D0,D3 @3 move.w D3,D0 ; save left indent in D0 <15> add.w left(rectReg),D3 ; compute x position move.w D4,-(SP) ; save right across clip tst.b hasZoom(a6) ; zoom flag set? <36> beq.s @4 ; => no, edge ok sub.w #32,D4 ; get default right edge bra.s @doneAdjustRight ; <15> @4 ; set clip to d3..d4 sub.w D0,D4 ; adjust right to have the same indent as left <15> @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. <18> @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 <28> cmp.w d0,d3 ; Does lines fit in the title bar? <28> ble.s @linesFitOnRight ; yes => continue <28> move.w d0,d3 ; no => use the right of rect instead of the calculated value <28> @linesFitOnRight ; <28> 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 <17> move.l sysZone,theZone ; going to create the pixpat in sysZone <17> move.l rectReg,-(SP) ; fill this rect pea HilitePattern ; push the pattern address _FillRect ; fill left half with the pattern tst.b hasZoom(a6) ; zoom flag set? <36> 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 <28> cmp.w d0,d4 ; Does lines fit in the title bar? <28> bge.s @linesFitOnLeft ; yes => continue <28> move.w d0,d4 ; no => use left instead of the calculated value <28> @linesFitOnLeft ; <28> 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 <17> 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 hasZoom(a6) ; zoom flag set? <36> 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 hasZoom(a6) ; zoom flag set? <36> 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? 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) DAF 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 hasZoom(a6) ; zoom flag set? <36> 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 DAF 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 hasZoom(a6) ; zoom flag set? <36> 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 DAF move.l thePort(A0),-(SP) ; DAF 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 <27> ; ------------- 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 <27> move.l thePort(a0),a0 ; <27> lea portBits(a0),a0 ; point to ŅbitmapÓ in the port <27> tst.w rowBytes(a0) ; is this a color port? <27> bpl.s @bitmap ; <27> move.l baseAddr(a0),a0 ; pixmap handle <27> move.l (a0),a0 ; pixmap ptr <27> @bitmap ; <27> move.l ScrnBase,d0 ; get base address of screen <27> cmp.l baseAddr(a0),d0 ; is it the same as thePortÕs ? <27> beq.s @drawToScreen ; yes => we are drawing to screen <27> move.w #1, -(SP) ; no => assume old-port, depth equals 1 <27> tst.w rowBytes(A0) ; is this an old-style port? <27> bpl.s @depthOk ; yes. depth of 1 on stack is okay <27> move.w pmPixelSize(A0),(SP) ; fix depth on stack <27> @depthOk ; <27> move.w #fakeDeviceFlags, -(SP) ; assume non-CQD case <27> clr.l -(SP) ; NIL gDeviceHandle for non-CQD machines <27> btst #6,ROM85 ; Color QuickDraw available? <27> bnz @deviceAndFlagsOk ; of not, fake versions on stack are correct <27> move.l theGDevice, A1 ; current device GDHandle <27> move.l A1,(SP) ; fix gdHandle on stack <27> move.l (A1), A1 ; point to the device <27> move.w gdFlags(A1),4(SP) ; fix gdFlags on stack <27> @deviceAndFlagsOk ; <27> clr.l -(SP) ; flag clear (not drawing to screen) <27> bsr WDefDrawGIcon ; <27> bra @exitDrawGIcon ; <27> @drawToScreen ; <27> 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 <23> move.l a2,-(SP) ; push ptr to dest point <23> _SubPt ; get local to global offset <23> ; save the foreground and background of the WMgr port & set new colors subq #6,SP ; make room for rgbColor on stack DAF move.l SP,-(SP) ; push pointer to placeholder DAF _GetForeColor ; get the window portÕs foreColor DAF subq #6,SP ; make room for the backColor too DAF move.l SP,-(SP) ; push pointer to placeholder DAF _GetBackColor ; get the window portÕs backColor DAF ; 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 ; <25> _NewRgn ; Allocate new regionÉ <25> move.l (sp),-(sp) ; <25> _GetClip ; to save WMgrPortÕs clipRgn in. <25> 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 DAF _RGBBackColor ; DAF addq #6,SP ; trash backcolor DAF move.l SP,-(SP) ; DAF _RGBForeColor ; DAF addq #6,SP ; DAF @exitDrawGIcon _SetPort ; restore the incoming port (saved above) DAF 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.w d4,left(rectReg) ; reintroduced from <34> add.w d4,right(rectReg) ; swap d4 ; add.w d4,top(rectReg) ; add.w d4,bottom(rectReg) ; 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 ; 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 ; let Bill 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)? <22> beq.s @foundIt ; yes => go return corresponding color <22> move.w D0,-(SP) ; save the index to color table on stack<22> subq.l #4,SP ; leave space for results <22> move.l #'wctb',-(SP) ; try to get the system wctb <22> clr.w -(SP) ; <22> _GetResource ; look in ROM first <22> rb move.l (SP)+,A0 ; get the wctb resource <22> move.w (SP)+,D0 ; retrieve the index <22> cmp.l #0,A0 ; did we really get the wctb resource <22> beq.s @useDefaultCTab ; no => go use the default ctab <22> move.l (A0),A0 ; yes => deference to get ptr to wctb <22> bsr GoodColorTable ; does wctb contain the index (in D0)? <22> beq.s @foundIt ; yes => go return corresponding color <22> @useDefaultCTab ; no => use the default ctab <22> mulu #6,D0 ; (x6) index into rgb specs lea ThreeDColors, A0 ; point at standard colors @getCorrectColor ; <22> move.l (SP)+,D1 ; get return address <22> 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) SetupColorPict add.w d0, D0 ; (x2) index into words tst.b threeDWind(A6) ; are we using pictures? bz.s @blackAndWhiteBits ; if not, use bits instead lea PixelRsrcIDs, A2 ; point to pixel IDs subq.l #4, SP ; room for the PicHandle move.l #'pixs', -(SP) move.w (A2, D0.w), -(SP) ; push the resource ID cmpi.w #kHighlightPix,(sp) seq gadgetHighlight(a6) ; Set if weÕre highlighting move.w #MapTrue,RomMapInsert ; rb _GetResource ; look in ROM first rb move.l (SP)+, A0 ; pixels handle _HLock ; donÕt want it to move move.l A0, tempPixels(A6) ; save for dispose move.l (A0), A2 ; point to pixels info move.l workPixmap(A6), A1 ; get pixmap handle move.l (A1), A1 ; point to pixmap move.w (A2), pmRowBytes(A1) ; copy rowbytes for this image move.l 2(A2), pmBounds(A1) ; copy top/left move.l 6(A2), pmBounds+4(A1) ; copy bottom/right lea 12(A2), A0 ; <21> move.l A0, pmBaseAddr(A1) moveq #1, D2 ; indicate color solution bra.s @exit @blackAndWhiteBits lea BitmapOffsets, A2 ; point to offset table adda.w (A2, D0.w), A2 ; add offset to correct bitmap moveq #0, D2 ; indicate b&w bits @exit 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 ; DAF ; ================================================ ; 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 <20> 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