mac-rom/Toolbox/ControlMgr/ScrollBarCDEF.a

2117 lines
73 KiB
Plaintext
Raw Normal View History

;
; File: ScrollBarCDEF.a
;
; Contains: This file contains the control definition procedure
; that defines scrollBar-type dials.
;
; Written by: Andy Hertzfeld August, 1982; color interface by Chris Derossi
;
; Copyright: <09> 1982-1994 by Apple Computer, Inc., all rights reserved.
;
; This file is used in these builds: BigBang
;
; Change History (most recent first):
;
; <SM6> 2/1/94 SWC Changed the entry code for setting up the drawing environment to
; only do that for calls that will actually be doing some drawing.
; This is to prevent the situation where a <20>clut<75> resource is
; continuously being loaded (by GetCTable) and unloaded (by
; DisposeCTable) when all that's being done is hit testing, region
; calculations, etc. This fixes a problem when running Microsoft
; Excel 4.0 on a PowerBook: since the resource was always being
; purged, GetResource ended up doing a disk read, which registers
; as machine usage to the Power Manager, and thus the PowerBook
; never auto-sleeps. A beneficial side effect for desktop machines
; is that running thru this code will now be a bit faster. While I
; was at it, changed word branches to short branches, where
; appropriate.
; <SM5> 6/7/93 CSS Resupport drawthumboutline and make it do something different
; for ROM (render a rgn instead of a rect).
; <SM4> 4/30/93 CSS DragTheRgn now will drag a black outline instead of a yellow one
; when dragging the scroll bar thumb. So, take out <SM3>. Also,
; desupported the DrawThumbOutline Message which was for the hack
; on FrameRect which we no longer do.
; <SM3> 4/21/93 CSS Implement a custom dragging routine so that we can draw a black
; box instead of a yellow one (the standard dragging in
; dragcontrol uses dragthergn which uses xor and creates a nice
; yellow color in 256 colors). This routine will use hilite mode
; in color and notpatxor in black&white. This was implemented in
; 7.1 as a nice comefrompatch hack on _FrameRect (e.g. if we are
; dragging and if we came from _DragControl... you get the idea).
; <SM2> 11/19/92 RB Set ROMMapInsert to mapTrue to look for resources in ROM first
; when doing GetResource calls.
; <36> 5/30/91 DTY We look for things to make it go faster.
; <35> 4/11/91 gbm dba, ws#-dba041001: Stop trying to do fancy offscreen stuff to
; buffer screen drawing if we're not actually drawing to the
; screen!
; <34> 3/4/91 dba dty: get rid of SysVers conditionals
; <33> 3/1/91 VL DFH, #83253: Rolled out changes in <32> as the fix only obscures
; the crashing problem without solving it. The real problem which
; trashes D0 before SetupColors in @DrawShadedArrowBox is now
; fixed.
; <32> 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.
; <31> 2/5/91 stb gs: include MenuMgrPriv.a
; <30> 1/25/91 VL dho, #VL002: HitSBar should return 0 if the scroll bar is
; inactive (including the case when its hilite value is 254).
; <29> 1/14/91 VL (dba) Hilite 254 should draw in black instead of gray due to
; compatibility problems in List Manager and Finder/App interface.
; <28> 1/14/91 VL <dba> Put in Hilite 254 (which draws only the gray outline).
; Removed IsCtlDisabled since we don't need it to check for 254
; and 255.
; <27> 1/13/91 VL Removed a line accidentally put in for testing.
; <26> 1/13/91 VL <with dba> Add a new message to draw the outline of the thumb
; during dragging.
; <25> 12/12/90 VL (gbm) Don't switch to WMgrCPort when drawing a picture. This is
; done by checking picSave of the owner of the control.
; <24> 10/8/90 VL Do a PenNormal to WMgrCPort before drawing to it. Draw
; background of arrow in gray of darker shade when enabled.
; <23> 9/23/90 VL Ignore <14> and <21>. This fixed the HiliteControl(255) problem
; for good (I hope). It checks to see whether the control is
; inactive. If it is inactive (i.e. contrlHilite is 254 or 255), a
; gray box will be drawn. Otherwise, the whole scroll bar will be
; drawn.
; <22> 9/23/90 VL Draw everything even though the part code is inThumb. This is so
; because a lot of apps (including FileMaker and MORE) use
; SetCtlValue which only affects the thumb leaving the arrow boxes
; in an inconsistent state with the thumb.
; <21> 9/20/90 VL Reverted changes to Hilite255 in <14>. Use the variation code (>
; 1) for the Hilite255 (which draws a gray border around the
; erased scroll bar area).
; <20> 9/16/90 csd If the control is not being drawn to the screen, don<6F>t use
; DeviceLoop, and don<6F>t switch to the WMgrCPort.
; <19> 9/15/90 VL Switch to sysZone before FillRect so that the pixpat created
; will be persistent.
; <18> 9/15/90 VL Twitched the colors one more time for HI.
; <17> 9/5/90 VL Changed the thumb according to Paulien's design.
; <16> 8/31/90 VL Got rid of pixpat totally to avoid the unnecessary memory
; overhead.
; <15> 8/27/90 VL Got rid of NOP warning.
; <14> 8/24/90 VL Changed Foreground and Background color for copybits in
; transparent mode. Made Hilite255 draw a gray border around the
; erased scroll bar area. Removed unnecessary code for resolving
; the WMgrPort and WMgrCPort.
; <13> 8/22/90 VL Fixed patAlign problems with multiple screens by using SetOrigin
; on the WMgrCPort. Also fixed off-by-one error when called by
; List Manager.
; <12> 8/17/90 VL Fixed pixpat problem by disposing it after fillcrect. Draw
; offscreen to avoid flickering.
; <11> 8/9/90 VL Did some smart drawing to reduce flickering.
; <10> 8/7/90 DTY Tweaked the colors a bit so the scroll bars look more like
; Pauline<6E>s drawings.
; <9> 8/6/90 VL Another rewrite for color/shaded scroll bars
; (drawing to WMgrCPort, tinged symbols, pix pattern ....)
; <8> 7/20/90 gbm get rid of an Asm warning
; <7> 5/29/90 DDG NEEDED FOR SIXPACK: Added back the 32-bit clean messages to the
; system six portion of the file.
; <6> 5/29/90 DDG NEEDED FOR SIXPACK: Rolled over a bug fix from the old 6.0.5
; split off sources into the system six portion of the file. Also
; removed the new messages for the 32-bit clean control manager
; from the 6.x portion of the file. Finally, changed the version
; number of the system seven CDEF.
; <5> 4/19/90 csd initialize tempPixels(A6) to nil so that HUnlock doesn<73>t blow
; up; renumbered owned resources to be in the correct range.
; <4> 4/13/90 csd Disabled (temporarily) the color interface by requiring 33
; bits/pixel in CheckAvailableColors.
; <3> 4/12/90 HJR Fix undefined sysvers for rom builds.
; <2> 4/11/90 csd Major rewrite to support shaded scroll bars and _DeviceLoop.
; <1.3> 8/22/89 SES Removed references to nFiles. Updated equates accordingly.
; <1.2> 2/9/89 EMT added new messages for 32-bit clean Control Manager.
; <1.1> 11/11/88 CCH Fixed Header.
; <1.0> 11/9/88 CCH Adding to EASE.
; <<3C>1.1> 9/23/88 CCH Got rid of inc.sum.d and empty nFiles
; <1.0> 2/12/88 BBM Adding file for the first time into EASE<53>
; <C700> 1/26/87 DAF Universal defproc (Version 10)
; <C529> 12/14/86 DAF Fixed a trashed register
; <C203> 10/6/86 DAF Updated color support on nuMac to RGBColor
; 4/28/86 DAF Workshop->MPW, added color support for Reno
; 7/29/85 EHB converted back to porkshop
; 5/16/85 EHB Only return "254" if point in control!
; 4/18/85 EHB Eliminated useless framerects in DrawSBar
; 2/14/85 JTC named rsrc.
; 1/11/85 JTC convert to MDS
; 4/13/84 SC Replaced _EraseRgn with _FillRgn,white
; 12/27/83 AJH Made min=max act disabled; added "254" hiliting
; 11/11/83 AJH Made it redraw all if disabled
; 11/10/83 AJH Changed disabling -- don't fill with gray
; 10/8/83 AJH Changed rounding to fix "off by 1" bug
; 9/4/83 AJH Made it respond to message 8 (just a stub)
; 7/30/83 SC Variant 1 for microsoft - no grey or elevator (Yuck)
; 12/30/82 AJH Changed hystersis for thumbDrag to 24 pixels
; 12/28/82 AJH Put scrollBar definition proc in its own file
; 11/16/82 AJH Made branch tables offset based
; 11/14/82 AJH removed box in arrowBits
; 11/11/82 AJH fixed thumb scaling problem in CalcIBox (subtract min)
; 11/7/82 AJH Made wide scrollBars look better
; 10/17/82 AJH Made controlProcs preserve A1
; 10/10/82 AJH Converted for QuickDraw Trap Interface
; 10/3/82 AJH Fixed bug in scrollBar positioning -- wasn't ctl relative
; 9/19/82 AJH Re-arranged ScrollBar proc, removed DragThumb
; 8/31/82 AJH Added hysterisis to scrollBar, rounding to value calculations
; 8/29/82 AJH Added "255" hiliting, non-rectangular indicators to
; ScrollBarProc
;
; To Do:
;
STRING ASIS
LOAD 'StandardEqu.d'
INCLUDE 'colorEqu.a'
INCLUDE 'ControlPriv.a'
INCLUDE 'MenuMgrPriv.a'
CDEF1 PROC EXPORT
;
; FUNCTION ScrollBarProc( theControl: ControlHandle;
; message: INTEGER;
; param: LongInt): LongInt;
;
; ------------- RGBInfo record TYPE -------------
RGBInfoRec RECORD 0 ; RGBColor record type
red ds.w 1
green ds.w 1
blue ds.w 1
ENDR
; And a stack frame definition
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 ; <26>
CtlHndl ds.l 1 ; ControlHandle
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
SavePen ds.b psRec ; <24>
onScreen ds.b 1 ; are we rendering on the screen?
isColor ds.b 1 ; is this a color system?
IndicatorRect ds.w 4
AuxCtlHndl ds.l 1
AuxCtlPtr ds.l 1
SavFgCol ds RGBInfoRec ; saved WMgrCPort ForeColor (color only)
SavBkCol ds RGBInfoRec ; saved WMgrCPort BackColor (color only)
shaded ds.w 1 ; conditions right for shaded controls?
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
workCLUT ds.l 1 ; Colour table to attach to PixMap
tempPixels ds.l 1
controlRgn ds.l 1 ; region control occupies
isHoriz ds.w 1 ; 0 if vertical, 2 if horizontal
oldstylePort ds.l 1 ; temporary storage for the old-style port when drawing directly to WMgrCPort
wMgrCPortClipRgn ds.l 1 ; temporary storage for WMgrCPort clip region
wMgrCPortFgColor ds.w 3 ; temp storage for WMgrCPort RGBForeColor
wMgrCPortBkColor ds.w 3 ; temp storage for WMgrCPort RGBBackColor
wMgrCPortPenState ds.b psRec ; temp storage for WMgrCPort pen state <24>
globalOffset ds.l 1 ; offset of current port from the WMgrCPort
tempRgn ds.l 1 ; temp work region for figuring out clip region for WMgrCPort
LinkSize EQU * ; size of all the local variables
ENDR
cHThumbBitmap equ 8
cVThumbBitmap equ 9
kPixmapID equ -10208
kClutID equ -10208
; Resource IDs for scroll bar parts
kVerticalThumb equ -10208
kHorizontalThumb equ -10207
kSolidUpArrow equ -10206
kHollowUpArrow equ -10205
kSolidDownArrow equ -10204
kHollowDownArrow equ -10203
kSolidLeftArrow equ -10202
kHollowLeftArrow equ -10201
kSolidRightArrow equ -10200
kHollowRightArrow equ -10199
; index to cctb
cFillPatColor equ 4
cArrowsLight equ 5
cArrowsDark equ 6
cThumbLight equ 7
cThumbDark equ 8
wHiliteLight equ 9
wHiliteDark equ 10
wTitleBarLight equ 11
wTitleBarDark equ 12
wTingeLight equ 13
wTingeDark equ 14
; index to the shades
lowestShadeIndex equ 16
cArrowShade2 equ 16
wHiliteShade8 equ 17
wTitleBarShade1 equ 18
wTinge0 equ 19
wTinge4 equ 20
wTingeA equ 21
wTingeF equ 22
; index to table containing pixs info
; Each arrow has 3 pixs (one for the outline, one for the solid and one for the disabled outline).
; If one has the outline index, one can get the disabled outline by (outline index)/2+8.
cUpOutlineArrow equ 0
cUpSolidArrow equ 1
cUpDisabledArrow equ 8
cDnOutlineArrow equ 2
cDnSolidArrow equ 3
cDnDisabledArrow equ 9
cLtOutlineArrow equ 4
cLtSolidArrow equ 5
cLtDisabledArrow equ 10
cRtOutlineArrow equ 6
cRtSolidArrow equ 7
cRtDisabledArrow equ 11
cVThumbPat equ 12
cHThumbPat equ 13
; fakeDeviceFlags is used when we bypass DeviceLoop and draw the control directly, and we<77>re
; on a machine that doesn<73>t have Color QuickDraw.
fakeDeviceFlags equ $A801
; Hilite mode - this should be in an interface file somwhere
hilite equ 50
; Here is the dispatch table for the scrollBar definition procedure, which implements
; semi-Lisa style scrollBar type controls for the Mac toolBox. It shares a common
; dispatcher with the pushButton proc (see above)
with StackFrame
BRA.s @0
DC.w 1
DC.b 'CDEF'
DC.w 1
DC.w 11 ; version #
@0
LINK A6,#LinkSize ; set up a stack frame to address parameters
moveM.l D3-D6/A1-A4,-(SP) ; save work registers
; test if the message is in range
cmp.w #drawThumbOutlineMsg,message(A6) ; compare to highest value
bhi.s OORange ; We respond to 0-12 <1.2><SM6>
@MsgOK
; save the penState and set it our way
PEA SavePen(A6) ; push pointer to savePenState
_GetPenState ; remember current penState
_PenNormal ; set the pen the way we want it
; fetch the parameters into registers
lea 8(A6),A0 ; get ptr to first parameter
move.l (A0)+,D3 ; get param in D3
move.w (A0)+,D0 ; get message
move.l (A0)+,A3 ; get the control handle
move.w (A0)+,D6 ; get selection index
clr.l (A0) ; clear out function result
move.l (A3),A0 ; get control pointer in A0
; case out on the message number
add D0,D0 ; double for word index
lea GoScrollBar,A1 ; get table address
add 0(A1,D0),A1 ; compute dispatch address
JSR (A1) ; dispatch to appropriate routine
; restore original pen state
PEA SavePen(A6) ; push savePenState
_SetPenState ; restore original pen state
; we're done -- restore registers and return to caller
OORange ; 'Out Of Range, of course'
moveM.l (SP)+,D3-D6/A1-A4 ; restore work registers
UNLK A6 ; unlink stack frame
TenBytExit move.l (SP)+,A0 ; get return address
add #12,SP ; strip parameters
JMP (A0) ; return to caller
JustRTS clr.l ProcResult(a6) ; indicate we didn't handle this message
rts
GoScrollBar
DC.w DrawSBar-GoScrollBar ; draw is message 0
DC.w HitSBar-GoScrollBar ; hit test is message 1
DC.w CalcSBar-GoScrollBar ; calc regions is message 2
DC.w InitSBar-GoScrollBar ; allocate indicator region (3)
DC.w DispSBar-GoScrollBar ; de-allocate indicator region (4)
DC.w MoveSBar-GoScrollBar ; move indicator call (5)
DC.w ThumbSBar-GoScrollBar ; message 6 is thumb dragging
DC.w JustRTS-GoScrollBar ; message 7 is thumb dragging custom message
DC.w JustRTS-GoScrollBar ; message 8 is not supported
DC.w JustRTS-GoScrollBar ; message 9 is not supported
DC.w CalcWholeSBar-GoScrollBar; calc whole regions is message 10 <1.2>
DC.w CalcThumbSBar-GoScrollBar; calc thumb regions is message 11 <1.2>
DC.w DrawThumbOutline-GoScrollBar; <26>
; sets up the drawing environment for calls that do drawing
InitDrawingStuff ; <SM6>
; 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
BHI.s @BWSys ; no, this system has B&W QD
; save the current port's colors
move.l GrafGlobals(A5),A0 ; get pointer to grafGlobals <C407/16Nov86> DAF
move.l thePort(A0),A0 ; get pointer to thePort <C407/16Nov86> DAF
PEA SavFgCol(A6) ; save foreColor
_GetForeColor ;
PEA SavBkCol(A6) ; save backColor too
_GetBackColor ;
; get the CtlAuxRec for this guy and lock it's colortable <DAF 26Apr86>
CLR.l -(SP) ; return the handle here
CLR.b -(SP) ; space for boolean func return
move.l CtlHndl(A6),-(SP) ; push the control handle
PEA 6(SP) ; push a pointer to placeholder
_GetAuxCtl ; get its auxRec
addQ #2,SP ; don't need boolean result
move.l (SP)+,A0 ; get auxCtl handle
move.l (A0),A0 ; a pointer to the auxCtlRec
move.l acCTable(A0),A0 ; get colortable's handle <1.3>
move.l A0,AuxCtlHndl(A6) ; save the handle
_HLock ; lock the handle
move.l (A0),AuxCtlPtr(A6) ; save a pointer
; ------------- 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 ; <SM2> rb
_GetResource ; look in ROM first <SM2> rb
move.l (SP), workPixmap(A6) ; save it for later
move.w #kClutID,-(sp) ; ID of clut for pixmap
_GetCTable
move.l (sp)+,workCLUT(a6)
move.l workPixmap(a6),a0
move.l (a0),a0
move.l workCLUT(a6),pmTable(a0) ; Stash colour table into pmap handle
@BWSys
clr.l tempPixels(A6) ; init this to NIL
rts
; clean up color stuff <DAF 28Apr86>
RestoreDrawingStuff ; <SM6>
tst.b IsColor(A6) ;
beq.s @NoColor1 ; if on B&W, then skip
move.l AuxCtlHndl(A6),A0 ; unlock the CDEF
_HUnlock
PEA SavFgCol(A6) ;
_RGBForeColor ;
PEA SavBkCol(A6) ;
_RGBBackColor ;
move.l workCLUT(a6),-(sp)
_DisposCTable
@NoColor1 rts
CDefDrawFrame 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
; DrawSBar draws a scroll bar as specified by the controlHandle in A3. D3 has the
; desired "hilite" area code.
DrawSBar
bsr InitDrawingStuff ; initialize the drawing environment <SM6>
; if we are drawing to the screen, use _DeviceLoop to handle the case of
; multiple monitors. If we are not drawing to the screen, then _DeviceLoop
; could do the wrong thing--just draw the control directly.
move.l (A5), A0 ; point to QuickDraw<61>s globals
move.l thePort(A0), A1 ; get a pointer to the current port <35>
lea portBits(A1), A0 ; point to <20>bitmap<61> in the port <35>
tst.w rowBytes(A0) ; is this a color port?
bpl.s @bitmap
move.l baseAddr(A0), A0 ; pixmap handle
move.l (A0), A0 ; pixmap pointer
@bitmap
tst.l picSave(a1) ; are we drawing to a picture? <35>
bne.s @notOnScreen ; yes, so it is not a screen no matter what he says <35>
move.l ScrnBase, D0 ; get base address of screen
cmp.l baseAddr(A0), D0 ; is it the same as thePort<72>s ?
beq.s @drawToScreen ; if yes, then use DeviceLoop to draw to the screen
@notOnScreen
clr.b onScreen(a6) ; we are not drawing to the screen <35>
move.w #1, -(SP) ; 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.s @deviceAndFlagsOk ; of not, fake versions on stack are correct <SM6>
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.s CDefDrawControl ; draw the control <SM6>
bra.s RestoreDrawingStuff ; cleanup after doing drawing <SM6>
@drawToScreen
subq #4, SP ; room for RgnHandle
_NewRgn
move.l (SP), D0 ; get the region handle
move.l D0, controlRgn(A6) ; save it for disposal
move.l (A3), A0 ; point to control
pea contrlRect(A0) ; push control<6F>s rect
_RectRgn ; make a region of the control<6F>s rect
st.b onScreen(a6) ; we are drawing to the screen <35>
move.l controlRgn(A6), -(SP)
pea CDefDrawControl ; address of devloop drawing proc
move.l #-1, -(SP) ; flag that we<77>re drawing to the screen
clr.l -(SP) ; no unusual activities
_DeviceLoop
move.l controlRgn(A6), -(SP)
_DisposRgn
bra RestoreDrawingStuff ; cleanup after doing drawing <SM6>
CDefDrawControl
with CDefDrawFrame
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 and see whether
; we have an old-style grafport on color device
tst.l userData(SP) ; are we drawing to the screen?
bz.s @dontChangePorts ; if not, don<6F>t switch to the WMgrCPort
bsr SetupWMgrCPort ; see whether we need to use the WMgrCPort. If we
; do, set it up.
@dontChangePorts
moveq #cFrameColor, D0 ; Set up fore- and backcolors (as a safety precaution)
moveq #cBodyColor, D1
bsr SetupColors
; Figure out if the scroll bar is horizontal or vertical and handle each
; case separately. see if its more horizontal or vertical -- A0 points to the
; rect to be tested. D0 returns 0 to select vertical and two to select horizontal.
; After we know which axis, draw the arrows.
move.l (A3), A0 ; point to control
tst.b ContrlVis(A0) ; is it visible?
beq DrawControlExit ; if not, don't draw
;
; Setup the colour table for the gadget images with ramped values from the 'cctb'.
;
tst.b shaded(a6) ; Using colour?
bz.s @notColour
move.l workCLUT(a6),a0 ; Get handle to colour table
_HLock
move.l (a0),a4 ; Keep pointer to colour table
lea 16(a4),a4 ; Point to first tinge entry in colour table
lea TingeShades,a2 ; Get table of tinges
@tingeSetupLoop
tst.w (a2) ; End of tinge table?
bz.s @doneWithTingeSetup ; Yes, get out of here.
move.l a2,a0
bsr SetupRatioColor ; Get a ramped color
move.l tempRGB(a6),2(a4) ; Copy red and green components
move.w tempRGB+4(a6),6(a4) ; Copy blue component
add.w #16,a4 ; Next tinge entry in table
addq #6,a2 ; Next tinge entry in shade table
bra.s @tingeSetupLoop
@doneWithTingeSetup
subq #4,sp
_GetCTSeed ; Get a fresh seed
move.l workCLUT(a6),a0
move.l (a0),a4
move.l (sp)+,(a4) ; Put new seed in colour table
_HUnlock ; And let it float around
; if it was disabled, draw the whole thing
@notColour
move.l (a3),a0
move.b ContrlHilite(A0),D0 ; get the hilite parameter <28>
cmp.b #$FE,D0 ; <28>
beq DrawHilite254Ctl ; yes => just draw the frame <28>
cmp.b #$FE, D3 ; disabled part code? <28>
blo.s @0 ; if not, skip
moveq #0, D3 ; if so, draw all
@0
move.b ContrlHilite(A0),D4 ; get current hilite in register
bsr GetTCtlRect ; copy the control rect into tempRect
bsr TestHV ; get horizontal/vertical index in D0
move.w D0, isHoriz(A6) ; save orientation
; adjust for 1st arrow (if we're supposed to)
move.w top(A1, D0), D1 ; get vertical coordinate
add D2, D1 ; compute bottom
move.w D1, bottom(A1, D0) ; update bottom
moveq #inUpButton, D1 ; signal 1st arrow
movem D0/D2, -(SP) ; remember hv selector
bsr ShouldIDraw ; test hilite to see if we should draw
bne.s SkipUp
move.w #kHollowUpArrow,d0
bsr DrawArrowBox ; draw the arrow box
; now do the other arrow
SkipUp
bsr GetTCtlRect ; copy bounding rect into tempRect
movem (SP)+, D0/D2 ; restore hv selector
; adjust rect for 2nd arrow
move Bottom(A1,D0), D1 ; get bottom coordinate
sub D2, D1 ; compute top
move D1, top(A1,D0) ; adjust box top
moveq #inDownButton, D1 ; signal in 2nd arrow
bsr ShouldIDraw ; dont't draw if we done have to
BNE.s SkipDown
move.w #kHollowUpArrow,d0
bsr DrawArrowBox ; draw the arrow box
; paint the body of the scrollBar light gray
SkipDown
cmp #1,D6 ; flavor one has no grey
beq FrameCtl
move.w #inThumb,D1 ; get thumb part code
bsr ShouldIDraw ; draw it?
bne DrawControlExit ; don't need to frame scrollbar <EHB 4-18-85>
bsr GetTCtlRect ; get control bounding rectangle
move.l A1,A0 ; put in A0 for TestHV
bsr TestHV ; get h/v index
swap D2 ; get width in high part
move.w #1,D2 ; get 1 in low part
tst.w D0 ; which dimension?
beq.s @1 ; skip correction if vertical
swap D2
@1 move.l A1,-(SP) ; push a pointer to the rectangle
move.l D2,-(SP) ; push inset factor
_InsetRect ; inset it appropriately
bsr CalcIBox ; get the rect for thumb
bsr IsDisabled ; is it disabled?
bne.s @enabled ; if not, skip
tst.b shaded(A6) ; is it shaded?
beq.s @whiteOutScrollBar ; no => white it out
moveq #cFrameColor,D0 ; yes => set up the shaded color
moveq #wTitleBarShade1,D1 ;
bsr SetupColors ;
PEA TempRect ; push the rectangle
_EraseRect ; paint the shade on the scroll bar
bra.s DoIndicator ; done drawing background of scroll bar
@whiteOutScrollBar
PEA TempRect ; push the rectangle
move.l (A5),A0 ; get grafGlobals
pea White(A0) ; get address of white pattern
_FillRect ; white out the rect
bra.s DoIndicator ;
@enabled
lea TempRect,A0 ; get scroll bar rect in A0 for TestHV
bsr TestHV ; get the offset to rect in D0
move.l D0,D4 ; save off the values before they get trashed
move.l A0,A4 ;
move.w 4(A4,D4),-(SP) ; save the right(H)/bottom(V) of scroll bar rect
move.w IndicatorRect(A6,D4),4(A4,D4) ; put the left(H)/top(V) of thumb to scroll bar
; Color in the page up and down regions
bsr PlotLtGray
move.w (SP)+,4(A4,D4) ; restore the right(H)/bottom(V) of scroll bar rect
move.w IndicatorRect+4(A6,D4),(A4,D4) ; put the right(H)/bottom(V) of thumb to scroll bar
bsr PlotLtGray
; Check the hilite state. If the control is inactive (hilite = 255), don't draw
; the indicator at all.
DoIndicator
bsr IsDisabled ; is it disabled
bz.s FrameCtl ; yes => go frame the control <SM6>
move.l IndicatorRect(A6),TempRect
move.l IndicatorRect+4(A6),TempRect+4
tst.b shaded(a6) ; is it shaded
bnz.s @drawShadedThumb ; yes => handle shaded thumb <SM6>
move.l #$FFFF0000,d0 ; Inset height
tst.w isHoriz(a6) ; Horizontal thumb?
bnz.s @thumbIsHorizontal ; Yes
swap d0 ; Inset width
move.w #cVThumbBitmap,-(sp) ; Remember bitmap offset for vertical thumb
bra.s @insetThumbRect
@thumbIsHorizontal
move.w #cHThumbBitmap,-(sp) ; Remember bitmap offset for horizontal thumb
@insetThumbRect
pea TempRect
move.l d0,-(sp) ; Inset value
_InsetRect ; Inset the rectangle
move.w (sp)+,d0 ; Get bitmap offset
bra.s @thumbCommon
@drawShadedThumb
tst.w isHoriz(a6) ; Use horizontal thumb?
bz.s @useVerticalThumb ; Nope
move.w #kHorizontalThumb,d0
bra.s @thumbCommon
@useVerticalThumb
move.w #kVerticalThumb,d0
@thumbCommon
bsr SetUpColorPict ; Set up the right thumb image
bsr PlotSymbol ; Draw it
; Frame the scroll bar
FrameCtl
moveq #cFrameColor, D0 ; set up color to draw in black
moveq #cBodyColor,D1 ;
bsr SetupColors ;
bsr GetTCtlRect ; get the control rect
move.l A1,-(SP) ;
_FrameRect ; frame it
bra.s DrawControlExit
DrawHilite254Ctl
moveq #cFrameColor,D0 ; set the color to white
moveq #cBodyColor,D1 ;
bsr SetupColors ;
bsr GetTCtlRect ; get rect containing the scroll bar
pea TempRect ; get rect for _EraseRect
move.l (SP),-(SP) ; get rect for _InsetRect
move.l (SP),-(SP) ; get rect for _FrameRect
_FrameRect
move.l OneOne,-(SP) ; Inset by 1 to avoid flickering
_InsetRect
_EraseRect ; erase the rect
DrawControlExit
; all done drawing the scroll bar
tst.l userData(SP) ; are we drawing to the screen?
bz.s @dontRestorePort ; if not, we didn<64>t switch to the WMgrCPort
bsr RestoreOldPort
@dontRestorePort
move.l (SP)+, A0 ; return address
lea CDefDrawFrame.ParamSize(SP), SP ; pop params
jmp (A0)
endwith
; DrawArrowBox is a routine that clears and frames an arrow box and then blits
; across the appropriate arrow (looks at hilite state). On entry, TempRect has the
; box for the arrow, D0 has h/v selector, D1 has left/right selector,A1 points to the
; arrow bitMap, A3 has the control handle.
;
DrawArrowBox
move.w shaded(A6), -(SP) ; Save the shade flag.
tst.w isHoriz(a6) ; Horizontal?
bz.s @orientationOk
addq #4, D0 ; offset to horiz gadget numbers
@orientationOk
cmp.w #inDownButton, D1 ; do we want down/right arrows?
bne.s @directionOk
addq #2, D0 ; offset to opposite direction arrow
@directionOk
move.l (A3),A0 ; get the control pointer
cmp.b ContrlHilite(A0),D1 ; should it be hilited?
bne.s @notHighlighted ; if not, skip
subq #1, D0 ; offset to hilited version
tst.b shaded(a6) ; Color arrows?
bnz.s @drawArrow
move.w d0,d1
bra.s @bwScrollBar ; Go draw a hilighted arrow
@notHighlighted
move.w D0, D1 ; Save gadget resource ID
tst.b shaded(a6) ; If we<77>re drawing in black and white, then
bz.s @bwScrollBar ; it doesn<73>t matter if we<77>re disabled or not.
bsr.s IsDisabled ; If disabled & drawing in colour, <SM6>
bnz.s @notDisabled ; use black and white arrows to draw.
; Set up colours to match faint gray used in body of scroll bar
movem.l d0-d1,-(sp) ; Need to save registers across call to SetupColors
moveq #wHiliteShade8,D0
moveq #wTitleBarShade1,D1
bsr SetupColors
movem.l (sp)+,d0-d1
;
; If the arrows are disabled, use the black and white arrows, and change the
; fore and background colours to shades of gray. To get the right gadget,
; convert the resource ID into an index into the BitMap table.
;
@bwScrollBar
clr.w shaded(A6) ; pretend we don<6F>t have color
exg d0,d1 ; Save a branch by doing this exchange
move.w #kHollowRightArrow,d1
sub.w d0,d1 ; Change resource ID into bitmap index
@notDisabled
move.w d1,d0
@drawArrow
bsr SetupColorPict ; prepare the picture
move.w (SP)+,shaded(A6) ; restore <20>use color<6F> flag
bra PlotSymbol ; Go plot the arrow
; Utility ShouldIDraw -- to test when to skip drawing a part of the scrollBar.
; On entry, D3 has parameter indicating part that needs drawing while D1 holds
; the part we are about to draw. If D3 is zero, always draw it. Otherwise,
; draw only if it matches. Returning 0 in the Z-flag means you should draw
ShouldIDraw
tst D3 ; examine the parameter
beq.s StubSBar ; its zero so don't test further
cmp #inThumb,D3 ; if we need to draw the thumb, let's draw everything else <22>
beq.s StubSBar ; <22>
cmp D1,D3 ; the right part
StubSBar
rts ; the z-flag has the answer
; IsDisabled is a utility to check to see if a scrollBar is disabled or not.
; It returns with the z-flag set if it is disabled
IsDisabled
move.l (A3),A0 ; get sBar pointer
move.w ContrlMin(A0),D0 ; get the min
cmp.w ContrlMax(A0),D0 ; same as the max?
beq.s doneChecking ; <SM6>
move.b ContrlHilite(A0),D0 ; get the hilite parameter
addQ.b #1,D0 ; was it 255?
doneChecking
rts ; return to caller with z-flag result
; TestHV is a utility that determines if the rectangle pointed to by A0 is more horizontal
; or vertical. Return 0 in D0 if its more vertical and 2 if its more horizontal.
; This routine trashes D1. The result is also reflected in the condition code.
; It also returns the width/height of the minor dimension in D2.
TestHV
move Bottom(A0),D0
sub Top(A0),D0 ; get height
move Right(A0),D1
sub Left(A0),D1 ; get width
cmp D0,D1 ; compare width and height
BGT.s @1 ; branch it width is greater
move D1,D2 ; horizontal in D2
moveq #0,D0 ; signal its vertical
rts
@1 move D0,D2 ; vertical in D2
moveq #2,D0 ; signal its horizontal
rts
; CalcIBox is the crucial routine that computes the position of the top/left of the
; thumb by scaling the control's value according to its range and the screen area.
; Return the rectangle in IndicatorRect(A6). It expects that A3 will hold the
; control handle as usual
CalcIBox
move D3,-(SP) ; preserve D3
lea IndicatorRect(A6),A1 ; get address of indicator rectangle
bsr.s GetCtlRect ; first set it to control bounding rect
moveq #0,D1 ; clear out high part of D1
move.l (A3),A0 ; get pointer to control
lea ContrlRect(A0),A0 ; get pointer to the bounding rectangle
bsr.s TestHV ; get h/V selector index in D0
; ???? was .s
move D2,D3 ; keep minor dimension in D3
; compute control screen area in relevant dimension
move Bottom(A0,D0),D1 ; get logical "bottom"
sub Top(A0,D0),D1 ; compute "height"
sub D2,D1 ; discount arrow box
sub D2,D1 ; discount other one, too
sub D2,D1 ; and the indicator
; compute "screenSize times value"
move.l (A3),A0 ; get control pointer
move.w ContrlValue(A0),D2 ; get current value
sub.w ContrlMin(A0),D2 ; get delta from min
MULU D2,D1 ; compute value*screensize
; compute size of logical space
move ContrlMax(A0),D2 ; get max
sub ContrlMin(A0),D2 ; compute size of space
beq.s Scale0 ; dont divide by 0
; perform the scaling
DIVU D2,D1 ; compute where iBox should go
bsr RoundOff ; round off D1
add D3,D1 ; skip over arrow box
; update indicator rect to correct position
UpdateIRect
lea IndicatorRect(A6),A1 ; get pointer to rect
add Top(A1,D0),D1 ; compute the logical "top"
move D1,Top(A1,D0) ; update it
add D3,D1 ; bump to "bottom"
move D1,Bottom(A1,D0) ; update "bottom"
EOR #2,D0 ; flip to minor dimension
addQ #1,Top(A1,D0) ; inset logical "left"
subQ #1,Bottom(A1,D0) ; inset logical "right"
; set up the indicator region
move.l ContrlData(A0),-(SP) ; push indicator region handle
move.l A1,-(SP) ; push rect ptr
_RectRgn ; make a rectangular region
CalcIDone move (SP)+,D3 ; restore D3
rts
; if min = max, pin at top
Scale0 move D3,D1
BRA.s UpdateIRect
; GetCtlRect is a code saving utility that copies the bounding rectangle of the control
; whose handle is in A3 into the rectangle pointed to by A1. This routine blows
; A0 but preserves A1. GetTCtlRect is an alternative entry used to save code
GetTCtlRect lea TempRect,A1
GetCtlRect move.l (A3),A0 ; get pointer to control
lea ContrlRect(A0),A0 ; get pointer to bounding rect
move.l (A0),(A1) ; copy topLeft
move.l 4(A0),4(A1) ; copy botRight
NoSBarHit
rts
; HitSBar is the hit test routine for the scroll bar definition routine. It classifies
; the position of the mouse passed in D3
HitSBar
move.b ContrlHilite(A0),D4 ; get hilite state <EHB 16-May-85
cmp.b #254,D4 ; 254 hiliting? <EHB 16-May-85>
beq.s NoSBarHit ; => yes, return 0 <EHB 16-May-85> <30>
bsr IsDisabled ; otherwise disabled? <EHB 16-May-85>
beq.s NoSBarHit ; => yes, return with 0 <EHB 16-May-85>
lea ContrlRect(A0),A4 ; keep rect pointer in A4
CLR.w -(SP) ; make room for function result
move.l D3,-(SP) ; push the point
move.l A4,-(SP) ; push address of rect
_PtInRect ; in the rectangle?
tst.b (SP)+ ; examine result
beq.s NoSBarHit ; if not, we're done
; its in the rect, so classify if in upButton,downButton,pageUp,pageDown or thumb
bsr.s NormalizePt ; swap relevant coordinate into low part
; ; and set up D0,D2
; see if its in the top button
@1 move D3,D1 ; get copy of mousePoint
sub 0(A4,D0),D1 ; subtract rectangle top
cmp D2,D1 ; is it within width of the top?
BGT.s @2 ; it not, go check bottom
moveq #inUpButton,D0 ; classify it
BRA.s UpdateResult ; all done
; see if its in the bottom button
@2 move 4(A4,D0),D1 ; get bottom
sub D3,D1 ; get distance from bottom
cmp D2,D1 ; is it in it?
BGT.s CheckInd ; if not, go check indicator
moveq #inDownButton,D0
UpdateResult
move D0,22(A6) ; return result
rts
; its not in either button so it must be the thumb or one of the page areas. Check
; for the thumb first
CheckInd
cmp #1,D6 ; for flavor one don't test
beq.s NoSBarHit
bsr CalcIBox ; calculate the indicator rectangle
bsr.s NormalizePt ; restore back to normal point
CLR.w -(SP) ; make space for boolean result
move.l D3,-(SP) ; push the point
move.l (A3),A0
move.l ContrlData(A0),-(SP) ; push the indicator region
_PtInRgn ; is the mouse in the indicator?
tst.b (SP)+ ; (..the suspense builds...)
beq.s CheckPage ; branch if its not in the indicator
; its in the thumb so report that to the application
move #inThumb,D0 ; get result
BRA.s UpdateResult ; all done -- go update result
; it must be in one of the two page areas. Determine which one by looking at the
; midPoint of the indicator's bounding rectangle.
CheckPage
bsr.s NormalizePt ; normalize (get interesting low word)
move.l (A3),A0 ; get control pointer
move.l ContrlData(A0),A0 ; get region handle
move.l (A0),A0 ; get region pointer
lea RgnBBox(A0),A0 ; point to the region bounding box
; determine midpoint
move Bottom(A0,D0),D1 ; get logical bottom
sub Top(A0,D0),D1 ; get logical height
LSR #1,D1 ; divide by 2
add Top(A0,D0),D1 ; add to get the midpoint
; at this point, D1 has the midpoint in the important dimension. Compare with the
; mouse point to decide if its page up or down.
cmp D1,D3 ; compare mousePt with midPoint
BLT.s PageItUp ; if above its the logical "top"
moveq #inPageDown,D0 ; set result code
BRA.s UpdateResult ; all done -- go update result
PageItUp moveq #inPageUp,D0 ; set result code
BRA.s updateResult ; all done
; NormalizePt takes a rect pointer in A4 and a point in D3 and swaps the points
; coordinates according to the relevant dimensions
NormalizePt
move.l A4,A0 ; get rect pointer in A0
bsr TestHV ; get horizontal vertical offset
BNE.s @1 ; if horizontal, skip
swap D3 ; its vertical so get y in low part
@1 rts ; all done
; CalcSBar returns the bounding region of the scroll bar. D3 holds the region parameter.
; If the high bit of D3 is set, return the indicator region, other return the entire
; bounding region
CalcSBar
tst.l D3 ; indicator or body?
BPL.s GetWholeRgn ; if positive, go get body <V1.2>
AND.l #$00FFFFFF, D3 ; Negative, strip out high byte <V1.2>
; the indicator region was requested so copy the one in the dataHandle
GetIndRgn
bsr CalcIBox ; calculate indicator region
move.l (A3),A0 ; get pointer to control
move.l ContrlData(A0),-(SP) ; push indicator region
move.l D3,-(SP) ; push result region
_CopyRgn ; clone the region
; set the pattern for dragging
bsr.s GetOldStyleLtGray ; get pointer to light gray
move.l (A0),A0
move.l (A0)+,DragPattern ; update the drag pattern
move.l (A0),DragPattern+4 ; update the drag pattern
rts
; the whole region was requested
CalcWholeSBar
move.l #1, ProcResult(A6) ; return 1 to show that we respond <V1.2>
GetWholeRgn
move.l D3,-(SP) ; push the region handle
PEA ContrlRect(A0) ; push rectangle pointer
_RectRgn ; return a rectangular region
rts ; all done!
CalcThumbSBar
move.l #1, ProcResult(A6) ; return 1 to show that we respond <V1.2>
BRA.s GetIndRgn ; <V1.2>
PlotLtGray
move.l theZone,-(SP) ; save the current zone <19>
move.l sysZone,theZone ; going to create the pixpat in sysZone <19>
pea TempRect ; get rectangle to be filled
tst.b shaded(A6) ; is it shaded scroll bar (=> do we use pixpat?)
beq.s @useOldStyle ; no => fill using black on white
move.w #wHiliteShade8,D0 ; use a dark gray for dots in pattern
move.w #cArrowShade2,D1 ; use a light gray for the background
bra.s @plotPAT ; <SM6>
@useOldStyle
move.w #cFrameColor,D0 ; black foreground
move.w #cBodyColor,D1 ; white background
@plotPAT
bsr SetupColors ; set up the foreground and background colors
bsr.s GetOldStyleLtGray ; use common routine to get the PAT <SM6>
move.l (A0),-(SP) ; dereference to get PatPtr
_FillRect ; fill the rect
@doneGetLtGray
move.w #cFrameColor,D0 ; revert the color to normal
move.w #cBodyColor,D1
bsr SetupColors
move.l (SP)+,theZone ; restore the zone <19>
rts
GetOldStyleLtGray
subQ #4,SP
move.w #SBarPatID,-(SP) ; push resource ID
_GetPattern ; get the pattern
move.l (SP)+,A0 ; return PatHandle in A0
rts
; handle the "position yourself" message by calling figuring out the new value and
; calling SetCtlValue. D3 holds the amount to move by.
MoveSBar
move.l ContrlData(A0),A0 ; get handle of indicator region
move.l (A0),A0 ; get a pointer to it
lea RgnBBox(A0),A4 ; get pointer to the bounding rect
; figure out new position by adding topLeft of current position to offset
add Left(A4),D3 ; add the x coordinates
swap D3 ; get y in low word
add Top(A4),D3 ; add the y coordinates
; select the relevant dimension and get it into the low word of D3
move.l (A3),A0 ; get the control pointer
lea ContrlRect(A0),A0 ; get the bounding rectangle
bsr TestHV ; get h/v index
beq.s @1 ; if its y, we're cool
swap D3 ; get x into D3
; determine amount of screen area devoted to the scrollBar
@1 sub Top(A0,D0),D3 ; make size ctl-relative
sub D2,D3 ; subtract arrow offset
move Bottom(A0,D0),D1 ; get logical bottom
sub Top(A0,D0),D1 ; compute logical height
sub D2,D1 ; compute active area
sub D2,D1
sub D2,D1
move D1,D2 ; get answer in D2
; compute range of logical values: controlMax - controlMin
move.l (A3),A0 ; get control pointer
move ContrlMax(A0),D1 ; get max value
sub ContrlMin(A0),D1 ; compute range
; compute position*logical range/physical range
MULU D3,D1 ; D3 has current position
DIVU D2,D1 ; divide by physical range
bsr.s RoundOff ; round to nearest integer
; at this point D1 has the value so set it, after offsetting by the minimum
add.w ContrlMin(A0),D1 ; offset by minimum
move.l A3,-(SP) ; push control handle
move.w D1,-(SP) ; push the new value
_SetCtlValue ; go set the new value
rts ; all done!
; InitSBar gets called when the scroll bar is allocated. It allocates an empty region
; to use as the indicator region
InitSBar subQ #4,SP
_NewRgn ; get a new region on the stack top
move.l (A3),A0 ; get control pointer
move.l (SP)+,ContrlData(A0) ; remember new region in control data
rts
; DispSBar de-allocates the region used for the indicator
DispSBar move.l ContrlData(A0),A0 ; get handle of indicator region
_DisposHandle ; dispose of it
rts
; Utility RoundOff -- RoundOff the number in D1 to the nearest integer. The remainder
; from dividing by D2 is in the high part of the word.
RoundOff move.w D0,-(SP) ; preserve D0
move D2,D0 ; get old divisor
LSR #1,D0 ; divide by 2
swap D1 ; get remainder
cmp D0,D1 ; compare remainder with 1/2 divisor
BLE.s TruncateIt ; if smaller, we're done
swap D1 ; get normal D1 back
addQ #1,D1 ; round up
RoundDone
move.w (SP)+,D0 ; restore D0
rts
; no need to round up so just truncate it
TruncateIt
swap D1 ; restore quotient
BRA.s RoundDone ; all done with roundOff
; ThumbSBar receives the "drag thumb message for the scroll bar. On entry, D3 points
; to a structure that contains the starting point, it returns with pointers to
; the bounds and slopRect and the axis parameter
; Local Variable Equates
BRect EQU 0 ; boundsRect
SRect EQU 8 ; slopRect
TAxis EQU 16 ; axis
ThumbSBar
move.l D3,A4 ; keep pointer to parameter block
move.l (A4),D3 ; get the mouse point
lea BRect(A4),A2 ; get pointer to boundsRect
move.l A2,A1 ; get pointer in A1
bsr GetCtlRect ; copy control bounds rect
move.l A2,A0 ; point to boundsRect
bsr TestHV ; get h/v selector in D0
move D2,-(SP) ; preserve D2
swap D2
move.w #$FFE8,D2 ; get inset factor (24 pixels hyst)
move D0,D4 ; keep selector in D4
beq.s @1 ; if vertical, we're cool
swap D2 ; adjust inset factor
BRA.s @2
@1 swap D3 ; adjust mouse pt
@2 move.l A2,-(SP) ; push pointer to rectangle
move.l D2,-(SP) ; push inset factor
_InsetRect ; go inset it
; build the slopRect by insetting the boundsRect
lea SRect(A4),A0 ; get slopRect pointer
move.l (A4),(A0) ; copy boundsRect into slopRect
move.l 4(A4),4(A0) ; copy botRight, too
move.l #$FF800000,D0 ; get inset factor (assume vertical)
tst D4 ; which dimension
beq.s @3 ; if vertical, we're cool
swap D0
@3 move.l A0,-(SP) ; push slopRect pointer
move.l D0,-(SP) ; push inset factor
_InsetRect ; inset it
; now further adjust the boundsRect depending where the mousePt is relative to the
; indicator box.
move.l (A3),A0 ; get control pointer
move.l ContrlData(A0),A0 ; get region handle
move.l (A0),A0 ; get region pointer
sub RgnBBox(A0,D4),D3 ; subtract relevant coordinate
add D3,Top(A2,D4) ; offset logical top
; fix up logical bottom, too
move (SP)+,D2 ; get back D2
subQ #1,D2
sub D2,Bottom(A2,D4)
add D3,Bottom(A2,D4) ; subtract (15-number) from bottom
; now set up axis parameter
LSR #1,D4 ; divide by 2
EOR #1,D4 ; flip the sense
addQ #1,D4 ; add increment
move D4,TAxis(A4) ; to derive axis parameter
rts
;----------------------------------------------------------------------------
;
; These routines are the heart of the WDEF<45>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<77>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 #4, D0 ; must be 4 bits/pixel or better
sge shaded(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
lea HiliteShades, A2 ; point at shades we need
bsr.s CheckShadesAvailable ; see if all these shades are here
tst.b shaded(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 shaded(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 shaded(A6) ; did we fail to get the shades?
; bz.s @colorExit ; get out if so
@colorExit
move.l (SP)+, TheGDevice ; restore device
@exit
movem.l (SP)+, D3-D4/A2
rts
CheckShadesAvailable
move.w (A2), D3 ; get next <20>light<68> color
move.l #'csd ', D4 ; an unlikely pixel value
@rampLoop
cmp (A2), D3 ; get the next shade<64>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 <20>last<73> shade index
addq.l #6, A2 ; point to next shade
bra.s @rampLoop ; and test it
@failure
sf shaded(A6) ; use the old kind
@exit
rts
;
; SetupWMgrCPort
;
; Since the old-style grafport cannot handle color, we have to draw to the WMgrCPort
; directly to have the colored scroll bars.
; In order to draw correctly, we must find the offset of the old-style grafport from
; the WMgrCPort and store the clip region of the WMgrCPort. The fore and back colors
; of the WMgrCPort should be stored too.
;
SetupWMgrCPort
movem.l a2-a4/d4,-(SP)
tst.b shaded(A6) ; is it shaded?
beq.s @dontDrawToWMgrCPort ; no => don't draw to WMgrCPort
lea globalOffset(A6),A2
clr.l (A2)
move.l A2,-(SP)
_LocalToGlobal
; Get the intersection of the clipRgn and visRgn of the window to use as the
; clipping region for drawing the scroll bar.
subq.l #4,SP ; allocate a new region
_NewRgn ;
move.l (SP)+,tempRgn(A6) ;
move.l GrafGlobals(A5),A3 ; get the portRect of current port
move.l thePort(A3),A3 ;
move.l clipRgn(A3),-(sp) ; get clip region from old-style port
move.l visRgn(A3),-(sp) ; get visRgn from old-style port
move.l tempRgn(a6),-(sp) ;
_SectRgn ; Get intersection of portRect & visRgn
pea oldstylePort(A6) ; save the old-style port
_GetPort ;
move.l WMgrCPort,-(SP) ; from now on, use the WMgrCPort
_SetPort ;
pea wMgrCPortPenState(A6) ; Get the pen state <24>
_GetPenState
_PenNormal ; Draw normally <24>
neg.w globalOffset(A6)
neg.w globalOffset+2(A6)
move.l globalOffset(A6),-(SP)
_SetOrigin
pea wMgrCPortFgColor(A6) ; save the fore color of WMgrCPort
_GetForeColor ;
pea wMgrCPortBkColor(A6) ; save the back color of WMgrCPort
_GetBackColor ;
clr.l -(SP) ;
_NewRgn ; Allocate new region
move.l (SP),wMgrCPortClipRgn(A6)
_GetClip ; save WMgrPort<72>s clipRgn
move.l tempRgn(a6),-(sp) ; pea old-style clip region (for DisposRgn)
move.l (sp),-(sp) ; (for SetClip)
_SetClip ; Clip to the window<6F>s clipRgn
_DisposRgn ; Get rid of tempRgn
@dontDrawToWMgrCPort
movem.l (SP)+,a2-a4/d4
rts
;
; RestoreOldPort
;
; This is the counterpart of SetupWMgrCPort. It checks whether we are drawing directly to
; the WMgrCPort. If we are, it will restore the WMgrCPort clip region, forecolor and
; backcolor. And most important of all, it will restore the old-style grafport.
;
RestoreOldPort
tst.b shaded(A6) ; is it shaded?
beq.s @doneRestore ; no => we are not drawing to WMgrCPort
move.l wMgrCPortClipRgn(A6),-(SP) ; restore the WMgrCPort clipRgn
move.l (SP),-(SP) ;
_SetClip ;
_DisposRgn ; Get rid of saved region
pea wMgrCPortFgColor(A6) ; Restore the fore and back color
_RGBForeColor ;
pea wMgrCPortBkColor(A6) ;
_RGBBackColor ;
clr.l -(SP)
_SetOrigin
pea wMgrCPortPenState(A6) ; Restore pen state <24>
_SetPenState
move.l oldstylePort(A6),-(SP) ; Restore the old-style grafport
_SetPort
@doneRestore
rts
DefaultCCTB
;----------------------------------------------------------
; 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 $00, $FF, $00, $FF, $00, $FF, $00, $FF
dc.b $00, $FF, $00, $FF, $00, $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 MakeRatioRGB ; create a shade between the two <SM6>
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 shaded(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 AuxCtlPtr(A6), A0 ; get the color table pointer
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 @foundIt ; if equal, then done
subq.w #8, D1 ; try the previous one
bge.s @legalIndex ; loop while index positive
mulu #6, D0 ; (x6) index into rgb specs
move.l (SP)+, D1 ; pop the return address
lea DefaultCtlColors, A0 ; point at standard colors
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 DefaultCCTB, 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
move.l #blackColor, D0 ; get the old-style color
bra.s @classicExit ; get outa here
@simpleWhite
move.l #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
tst.b shaded(A6) ; are we using pictures?
bz.s @blackAndWhiteBits ; if not, use bits instead
subq.l #4, SP ; room for the PicHandle
move.l #'pixs', -(SP)
move.w d0, -(SP) ; push the resource ID
move.w #MapTrue,RomMapInsert ; <SM2> rb
_GetResource ; look in ROM first <SM2> rb
move.l (SP)+, A0 ; pixels handle
_HLock ; don<6F>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) ; Get size of pixmap
move.l 2(a2),pmBounds(a1) ; TopLeft of image
move.l 6(a2),pmBounds+4(a1) ; Bottom right
lea 10(a2),a0 ; Load base address
move.l A0, pmBaseAddr(A1) ; Stash base address
moveq #1, D2 ; indicate color solution
bra.s @exit
@blackAndWhiteBits
asl.w #1, D0 ; convert to index into words
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
;
; PlotSymbol
;
; D2 is non-zero for pixmap, zero for bitmap
; A2 points to bounds/rect/bits
; TempRect holds destination rect
PlotSymbol
tst.b D2 ; use picture or bits?
bz.s @1 ; if zero, use CopyBits
move.l workPixmap(A6), A0 ; get work pixmap
move.l (A0), A0 ;
move.l A0, -(SP) ;
bra.s @copyBitsPixCommon ;
@1
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
pea TempRect ; tempRect is the destination
clr.w -(sp) ; srcCopy
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
rts ; return to caller
;
; AdjustRect
;
; AdjustRect is a utility to adjust the boundary of a rect.
; The ptr to rectangle must be in A0. D0 will be added to
; the left and top of the rectangle while D1 will be added to
; the bottom of the rect.
;
AdjustRect
LEA TempRect,A0
ADD.W D0,left(A0)
ADD.W D0,top(A0)
ADD.W D1,right(A0)
ADD.W D1,bottom(A0)
RTS
; <26> The following routine is used to draw the outline of the thumb during dragging.
DrawThumbOutline
bsr InitDrawingStuff ; initialize the drawing environment <SM6>
IF NOT forROM THEN
subq.l #4,sp ; get a new rgn
_NewRgn
move.l (sp),-(sp) ; push rgn
move.l param(a6),-(sp) ; push rect
_RectRgn ; put rect in rgn
move.l (sp),-(sp) ; thumb rgn
ELSE
move.l param(a6),-(sp) ; push rgn handle
ENDIF
pea ThumbDrawRoutine ; draw routine
move.l param(a6),-(sp) ; rect
clr.l -(sp)
_DeviceLoop
IF NOT forROM THEN
_DisposRgn
ENDIF
ST ProcResult(a6)
bra RestoreDrawingStuff ; cleanup after doing drawing <SM6>
; <26> The following routine is for drawing of the outline of a dragged thumb.
; If the thumb is in a B&W scrollbar, we will use notPatXor to invert the thumb
; outline. If the thumb is in a color scrollbar, we will use hilite mode to
; draw the outline. The hilite mode switches the frame between the background
; and Hilite color of WMgrCPort. In this case, we can get the desired effect
; on a color scroll in an old-style grafport. Since the background color for
; hilite mode is hardwired to a specific shade of gray, this color may need to
; be modified if we ever decide to change the color of the background of scrollbar.
; Since this routine is called by DeviceLoop, the drawing of the thumb outline
; across monitors will be correct.
;
ThumbDrawFrame 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
ThumbDrawRoutine
with ThumbDrawFrame
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 and see whether
tst.b shaded(a6)
bne.s @colorWindow
PEA DragPattern ;XOR specified pattern
_PenPat
MOVE #notPatXor,-(SP) ;set pen mode to notPatXor
_PenMode
move.l userData(sp),-(sp) ; no => do the normal notPatXor framerect
IF forROM THEN
_PaintRgn
ELSE
_FrameRect
ENDIF
bra.s @doneDrawThumb ; <SM6>
@colorWindow ; yes => use the HiliteMode
bsr SetupWMgrCPort
move.w #hilite,-(sp) ; set HiliteMode
_PenMode
move.l WMgrCPort,a0 ; save Hilite color in WMgrCPort
move.l grafVars(a0),a0
move.l (a0),a0
move.w rgbHiliteColor+blue(a0),-(sp)
move.l rgbHiliteColor(a0),-(sp)
pea trueGray ; set BackColor to light gray
_RGBBackColor
pea RGBBlack ; set hilite color to black
_HiliteColor
move.l userData+6(sp),-(sp) ; get the thumb outline rect
IF forROM THEN
_PaintRgn
ELSE
_FrameRect ; frame it
ENDIF
move.l sp,-(sp) ; restore hilite color
_HiliteColor
addq.l #6,sp
bsr RestoreOldPort
@doneDrawThumb
move.l (sp)+,a0 ; get return address
add.l #12,sp ; pop params
jmp (a0)
trueGray
dc.w $DDDE,$DDDE,$DDDE
PixelRsrcIDs
;----------------------------------------------------------
; This is a table of resource IDs for the PICTs which are
; used to draw the small pieces of the System 7 scroll bars.
;----------------------------------------------------------
dc.w -10206 ; cUpOutlineArrow
dc.w -10205 ; cUpSolidArrow
dc.w -10204 ; cDnOutlineArrow
dc.w -10203 ; cDnSolidArrow
dc.w -10202 ; cLtOutlineArrow
dc.w -10201 ; cLtSolidArrow
dc.w -10200 ; cRtOutlineArrow
dc.w -10199 ; cRtSolidArrow
dc.w -10206 ; cUpDisabledArrow
dc.w -10204 ; cDnDisabledArrow
dc.w -10202 ; cLtDisabledArrow
dc.w -10200 ; cRtDisabledArrow
dc.w -10208 ; cVThumbPat
dc.w -10207 ; cHThumbPat
DefaultCtlColors
;-----------------------------------------------------------
; These are the RGB colors which are used to draw the shaded
; windows.
;-----------------------------------------------------------
dc.w $0000, $0000, $0000 ; cFrameColor 00
dc.w $FFFF, $FFFF, $FFFF ; cBodyColor FF
dc.w $0000, $0000, $0000 ; cTextColor (not used) 00
dc.w $FFFF, $FFFF, $FFFF ; cThumbColor (not used) FF
dc.w $5555, $5555, $5555 ; cFillPatColor 00
dc.w $FFFF, $FFFF, $FFFF ; cArrowsLight FF
dc.w $0000, $0000, $0000 ; cArrowsDark 00
dc.w $FFFF, $FFFF, $FFFF ; cThumbLight FF
dc.w $0000, $0000, $0000 ; cThumbDark 00
dc.w $FFFF, $FFFF, $FFFF ; wHiliteLight FF
dc.w $0000, $0000, $0000 ; wHiliteDark 00
dc.w $FFFF, $FFFF, $FFFF ; wTitleBarLight FF
dc.w $0000, $0000, $0000 ; wTitleBarDark 00
dc.w $CCCC, $CCCC, $FFFF ; wTingeLight FF
dc.w $3333, $3333, $6666 ; wTingeDark 00
ShadeTable
ArrowShades
dc.w cArrowsLight, cArrowsDark, $2 ; cArrowShade2
HiliteShades
dc.w wHiliteLight, wHiliteDark, $8 ; wHiliteShade8
TitleBarShades
dc.w wTitleBarLight, wTitleBarDark, $1 ; wTitleBarShade1
TingeShades
dc.w wTingeLight, wTingeDark, $0 ; wTinge0
dc.w wTingeLight, wTingeDark, $4 ; wTinge4
dc.w wTingeLight, wTingeDark, $A ; wTingeA
dc.w wTingeLight, wTingeDark, $F ; wTingeF
dc.w 0
BitmapOffsets
;----------------------------------------------------------
; This is a table of words which represent the offsets
; from WDEFBitmaps to the beginning of each bitmap
;----------------------------------------------------------
dc.w RightArrowBitmap-BitmapOffsets
dc.w RightArrowHilited-BitmapOffsets
dc.w LeftArrowBitmap-BitmapOffsets
dc.w LeftArrowHilited-BitmapOffsets
dc.w DownArrowBitmap-BitmapOffsets
dc.w DownArrowHilited-BitmapOffsets
dc.w UpArrowBitmap-BitmapOffsets
dc.w UpArrowHilited-BitmapOffsets
dc.w HThumbBitmap-BitmapOffsets
dc.w VThumbBitmap-BitmapOffsets
CDEFBitmaps
;----------------------------------------------------------
; These bitmaps are used when drawing on classic QD
; machines, or when the bit depth is too low to draw in
; color.
;----------------------------------------------------------
UpArrowBitmap
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8181 ; <20>......<2E><>......<2E>
dc.w $8241 ; <20>.....<2E>..<2E>.....<2E>
dc.w $8421 ; <20>....<2E>....<2E>....<2E>
dc.w $8811 ; <20>...<2E>......<2E>...<2E>
dc.w $9009 ; <20>..<2E>........<2E>..<2E>
dc.w $BC3D ; <20>.<2E><><EFBFBD><EFBFBD>....<2E><><EFBFBD><EFBFBD>.<2E>
dc.w $8421 ; <20>....<2E>....<2E>....<2E>
dc.w $8421 ; <20>....<2E>....<2E>....<2E>
dc.w $8421 ; <20>....<2E>....<2E>....<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
UpArrowHilited
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8181 ; <20>......<2E><>......<2E>
dc.w $83C1 ; <20>.....<2E><><EFBFBD><EFBFBD>.....<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $8FF1 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $9FF9 ; <20>..<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..<2E>
dc.w $BFFD ; <20>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DownArrowBitmap
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $8421 ; <20>....<2E>....<2E>....<2E>
dc.w $8421 ; <20>....<2E>....<2E>....<2E>
dc.w $8421 ; <20>....<2E>....<2E>....<2E>
dc.w $BC3D ; <20>.<2E><><EFBFBD><EFBFBD>....<2E><><EFBFBD><EFBFBD>.<2E>
dc.w $9009 ; <20>..<2E>........<2E>..<2E>
dc.w $8811 ; <20>...<2E>......<2E>...<2E>
dc.w $8421 ; <20>....<2E>....<2E>....<2E>
dc.w $8241 ; <20>.....<2E>..<2E>.....<2E>
dc.w $8181 ; <20>......<2E><>......<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
DownArrowHilited
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $BFFD ; <20>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E>
dc.w $9FF9 ; <20>..<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..<2E>
dc.w $8FF1 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $87E1 ; <20>....<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD>....<2E>
dc.w $83C1 ; <20>.....<2E><><EFBFBD><EFBFBD>.....<2E>
dc.w $8181 ; <20>......<2E><>......<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LeftArrowBitmap
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $8001 ; <20>..............<2E>
dc.w $8101 ; <20>......<2E>.......<2E>
dc.w $8301 ; <20>.....<2E><>.......<2E>
dc.w $8501 ; <20>....<2E>.<2E>.......<2E>
dc.w $89F1 ; <20>...<2E>..<2E><><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $9011 ; <20>..<2E>.......<2E>...<2E>
dc.w $A011 ; <20>.<2E>........<2E>...<2E>
dc.w $A011 ; <20>.<2E>........<2E>...<2E>
dc.w $9011 ; <20>..<2E>.......<2E>...<2E>
dc.w $89F1 ; <20>...<2E>..<2E><><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $8501 ; <20>....<2E>.<2E>.......<2E>
dc.w $8301 ; <20>.....<2E><>.......<2E>
dc.w $8101 ; <20>......<2E>.......<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
LeftArrowHilited
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $8001 ; <20>..............<2E>
dc.w $8101 ; <20>......<2E>.......<2E>
dc.w $8301 ; <20>.....<2E><>.......<2E>
dc.w $8701 ; <20>....<2E><><EFBFBD>.......<2E>
dc.w $8FF1 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $9FF1 ; <20>..<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $BFF1 ; <20>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $BFF1 ; <20>.<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $9FF1 ; <20>..<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $8FF1 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $8701 ; <20>....<2E><><EFBFBD>.......<2E>
dc.w $8301 ; <20>.....<2E><>.......<2E>
dc.w $8101 ; <20>......<2E>.......<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RightArrowBitmap
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $8001 ; <20>..............<2E>
dc.w $8081 ; <20>.......<2E>......<2E>
dc.w $80C1 ; <20>.......<2E><>.....<2E>
dc.w $80A1 ; <20>.......<2E>.<2E>....<2E>
dc.w $8F91 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD>..<2E>...<2E>
dc.w $8809 ; <20>...<2E>.......<2E>..<2E>
dc.w $8805 ; <20>...<2E>........<2E>.<2E>
dc.w $8805 ; <20>...<2E>........<2E>.<2E>
dc.w $8809 ; <20>...<2E>.......<2E>..<2E>
dc.w $8F91 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD>..<2E>...<2E>
dc.w $80A1 ; <20>.......<2E>.<2E>....<2E>
dc.w $80C1 ; <20>.......<2E><>.....<2E>
dc.w $8081 ; <20>.......<2E>......<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
RightArrowHilited
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $8001 ; <20>..............<2E>
dc.w $8081 ; <20>.......<2E>......<2E>
dc.w $80C1 ; <20>.......<2E><>.....<2E>
dc.w $80E1 ; <20>.......<2E><><EFBFBD>....<2E>
dc.w $8FF1 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $8FF9 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..<2E>
dc.w $8FFD ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E>
dc.w $8FFD ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>.<2E>
dc.w $8FF9 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>..<2E>
dc.w $8FF1 ; <20>...<2E><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>...<2E>
dc.w $80E1 ; <20>.......<2E><><EFBFBD>....<2E>
dc.w $80C1 ; <20>.......<2E><>.....<2E>
dc.w $8081 ; <20>.......<2E>......<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
VThumbBitmap
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $C003 ; <20><>............<2E><>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
HThumbBitmap
dc.w $0002 ; rowBytes
dc.w $0000, $0000, $0010, $0010 ; bounds
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $8001 ; <20>..............<2E>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
dc.w $FFFF ; <20><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
END