mac-rom/Toolbox/FontMgr/OutlineMetrics.a

599 lines
24 KiB
Plaintext
Raw Normal View History

;
; File: OutlineMetrics.a
;
; Written by: Charlton E. Lui
;
; Copyright: <09> 1989-1993 by Apple Computer, Inc. All rights reserved.
;
; This file is used in these builds: ROM, disk
;
;
;
; Change History (most recent first):
;
; <SM5> 5/22/93 BT Add check to see if hasDoubleByte has already been defined.
; <SM4> 11/3/92 SWC Changed INCLUDEs to a LOAD of StandardEqu.d.
; <12> 3/25/92 DTY #1023489,<FM>: <20>BLT: There is a code patch in OutlineMetrics
; which leaves the contour entry bit set in the high byte of the
; offset into the glyph data array. This causes a bus error in 32
; bit mode because this offset is used in a pointer calculation.
; Change the branch to go to existing code which clears this bit.
; <11> 9/25/91 jlf Rolled in double-byte modifications to OutlineMetrics. Always
; define hasDoubleByte.
; <10> 6/12/91 LN added #include 'SysPrivateEqu.a'
; <9> 12/11/90 CL (RB) Saving off D2 before calling sb_retrieveglyph. D2 got
; trashed and was used. Using incorrect define for descent and
; ascent. Needed to use the cache.ascent and cache.descent.
; <8> 12/4/90 CL (MR) Fixing bitmap right of bitmap. Fix YMax and YMin for
; outline style. down by one pixel. Fixing this bug.
; <7> 11/29/90 CL (RB)YMax and YMin must be initialized to eachother.
; <6> 11/12/90 CL Accouting for algorithmic styles of bold, shadow, and outline in
; the bouding box, yMax, yMin, and lsb.
; <5> 10/30/90 CL (MR)Reviewed for 7.0<EFBFBD>2
; <4> 10/23/90 CL Need to check entryOffset instead of returned error since
; sbretrieve will return an error for the clipped out case.
; <3> 10/22/90 CL (BKR) Adding support for minimum memory mode to band and run in
; low cache conditions.
; <2> 10/21/90 gbm (with dba) Get rid of bra.s warnings by re-ordering a couple of
; Procs
; <9> 10/1/90 CL Fixing some confusing comments about error handling from sbretrieveglyph.
; <8> 9/4/90 CL Memory model changed a little for the cachehandle. The cacheHandle
; could change when a sbretrieveglyph call is made since it may place
; the block in another heap. So after call is made, re-init the cachehand
; via the splinekey.
; <7> 8/2/90 gbm add an END to make assembler happy
; <6> 6/22/90 CL Added ToolEqu.a include file
; <6> 6/22/90 CL Added ToolEqu.a include file
; <5> 5/29/90 CL Spline preferred no longer needs to set Lastspextra to minusone.
; Fixed outline metrics bug when filling out widths.
; <4> 4/11/90 CL Missing characters did not decrement.
; <3> 3/20/90 CL Bug fixes to Outline Metrics and a couple of speed enhancements
; <2> 2/27/90 CL Adding Right and Left Side bearing max. Changes made for
; DrText<78>s optimizations. Re-wrote a good portion of Outline
; Metrics.
; <1.4> 11/15/89 CEL Changed functions to better names for documentation.
; <1.3> 11/14/89 CEL SetLineHeight will only invalidate the width tables instead of
; the caches.
; <1.2> 9/15/89 CEL Updated calls to be pascal conventions.
; <1.1> 8/28/89 CEL Added in IsOutline call.
; <1.0> 8/14/89 CEL Checking file in for the first time<6D> Three Additional calls
; added to Bass.
;
; To Do:
;
IF (&TYPE('hasDoubleByte') = 'UNDEFINED') THEN
hasDoubleByte EQU 1
ENDIF
LOAD 'StandardEqu.d'
INCLUDE 'SplineDefines.a'
INCLUDE 'fontPrivate.a'
OutlineMetrics PROC EXPORT
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;
; Int OutlineMetrics( count, TextPtr, numer, denom, yMax, yMin,
; advanceWidthArray, lsbArray, boundsArray )
; int count; /* Number of chars to process */
; char *TextPtr; /* Points to the string of chars */
; Point numer, denom; /* Stretch values */
; short yMax, yMin;
; Fixed *advanceWidthArray; /* Advance width array to fill by count times */
; Fixed *lsbArray; /* LSB array to fill by count times */
; Rect *boundsArray; /* Bounds rects array to fill by count times */
;
; Given a string and non null pointers to arrays fill out the metrics.
;
; Registers Use:
; D0 = scratch A0 = scratch
; D1 = scratch A1 = TextPtr.l
; D2 = AddLeft & down shift A2 = awPtr.l
; D3 = scratch A3 = lsbptr.l
; D4 = glyphArrayPtr.l A4 = boundsPtr.l
; D5 = count A5 = glyphDataPtr.l
; D6 = cachePtr.l A6 = stack frame.l
; D7 = widTabPtr.l A7 = stack ptr.l
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
boundsPtr EQU 8 ;LONG, Ptr to bounds rect array
lsbPtr EQU boundsPtr+4 ;LONG, Ptr to lsb array
awPtr EQU lsbPtr+4 ;LONG, Ptr to Advance Width array
yMinPtr EQU awPtr+4 ;LONG, Ptr to a short
yMaxPtr EQU yMinPtr+4 ;LONG, Ptr to a short
denom EQU yMaxPtr+4 ;LONG, stretching var
numer EQU denom+4 ;LONG, stretching var
textPtr EQU numer+4 ;LONG, Ptr to ASCII
count EQU textPtr+4 ;WORD
intError EQU count+2 ;LONG, error code
ParamSize EQU intError-8 ;Size of parameters to pop off
;Do not include intError or return addr
INREC EQU -16 ;FMInput record
cacheHand EQU INREC-4 ;place for cache handle
encodingTable EQU cacheHand-4 ;(pointer) encoding table address.
lowByte EQU encodingTable-1 ;(byte) low-byte of double-byte character.
highByte EQU lowByte-1 ;(byte) true if invalid low byte followed high byte resulting in high byte remapping
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;sb_Retrieves input struct - Do not split this record up!!!
;###WARNING: If this changes, then change the same record in DrawText.a
bufStart EQU highByte-4 ;(long) _ \ start of bits buffer
srcAddr EQU bufStart-4 ;(long) | >- these 3 grouped: ptr to bits
srcRow EQU srcAddr-4 ;(long) |/ rowbytes of font bits
bitWidth EQU srcRow-2 ;(word) | for Width of char in bits
entryOffset EQU bitWidth-4 ;(long) | entry offset of glyph
fillBYTE EQU entryOffset-1 ;(Boolean) |
nextBand EQU fillBYTE-1 ;(Boolean) | Another character band?
nextTopBand EQU nextBand-2 ;(word) | next top character band
nextBotBand EQU nextTopBand-2 ;(word) | next bot character band
bandScan EQU nextBotBand-2 ;(word) | band size of char band
scan EQU bandScan-2 ;(word) | number of scan lines
devLSB EQU scan-2 ;(short) | Device for the LSB (short)
lsb EQU devLSB-4 ;(long) | for the LSB (fixed)
yMax EQU lsb-2 ;(word) | for the y min (short)
yMin EQU yMax-2 ;(word) | for the y max (short)
topClip EQU yMin-2 ;(word) | yMax Clipping
botClip EQU topClip-2 ;(word) | yMin Clipping
clipHorz EQU botClip-1 ;(Boolean) \ | Is it clipped horizontally
clipVert EQU clipHorz-1 ;(Boolean) / | Is it clipped vertically
destDepth EQU clipVert-2 ;(word) | depth of destination
ptSize EQU destDepth-2 ;(word) | pixels per em
glyphID EQU ptSize-2 ;(word) | glyph code
fontID EQU glyphID-2 ;(word) _ font id code
;End of Structure
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
addBitWidth EQU fontID-1 ;(byte) bold=1+outline=1+shadow=2+(1 if outline or shadow) = addBitWidth <6-CEL>
addBot EQU addBitWidth-1 ;(byte) outline=2+shadow=3 = addBot <6-CEL>
fontState EQU addBot-2 ;(word) flags for font state <6-CEL>
VARSIZE EQU fontState
LINK A6,#VARSIZE ;ALLOCATE LOCALS
MOVEM.L D3-D7/A2-A5,-(SP) ;SAVE REGS
CLR.W intError(A6) ;clear out the error field
ST clipVert(A6) ;Always clipping out character - no bits needed
if (hasDoubleByte) then
clr.l encodingTable(a6) ; assume no encoding table.
endif
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A4),A0 ;GET CURRENT GRAFPORT
;
; Call swapfont to set up width table and return numer,denom:
;
LEA INREC(A6),A1 ;POINT TO FMINPUT RECORD
MOVE TXFONT(A0),(A1)+ ;GET TXFONT FROM THEPORT
MOVE TXSIZE(A0),(A1)+ ;GET TXSIZE FROM THEPORT
MOVE.B TXFACE(A0),(A1)+ ;GET TXFACE FROM THEPORT
ST (A1)+ ;ALWAYS SET NEEDBITS TRUE
MOVE DEVICE(A0),(A1)+ ;GET DEVICE FROM THEPORT
MOVE.L numer(A6), (A1)+ ;INSTALL INPUT NUMER
MOVE.L denom(A6), (A1)+ ;INSTALL INPUT DENOM
CLR.L -(SP) ;ROOM FOR FCN RESULT
PEA INREC(A6) ;PUSH INPUT RECORD
_FMSwapFont ;CALL FMSwapFont trap
ADDQ #4, SP ;POP FMOUTPUT POINTER
MOVE.L WidthTabHandle,A1 ;handle to width tab
MOVE.L (A1),A1 ;Pointer to width tab
MOVE.L A1, D7 ;save widthTabPtr in reg
MOVE.L WidTabFont(A1), A0 ;get the font handle
_HGetState ;get the purge state
MOVE.B D0,fontState(A6) ;preserve it until the next change
_HNoPurge ;Make it non-purgeable
TST.B WidthIsSpline(A1) ;Is it a spline font
BEQ bitMapfontErr ;Its a bitmap so exit
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; calc extra for styles <6-CEL>
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MOVE.L fontPtr(A4), A4 ;Point to FmOutput record
CLR.B addBot(A6) ;clear off adds
MOVEQ #0, D2 ;ready for addLeft
MOVE.B fmOutBold(A4), addBitWidth(A6) ;Init boldness
;<8-CEL> MOVEQ #0, D1 ;ready for addLeft
;<8-CEL> MOVE.B fmOutBold(A4),D1 ;add boldness
MOVEQ #3,D0 ;restrict shadow in the range of 0 .. 3
CMP.B fmOutShadow(A4),D0 ;is it less or same?
BLE.S @pinShadow ;if so, pin at limit
MOVE.B fmOutShadow(A4),D0 ;otherwise, pass actual value
@pinShadow
TST.B D0 ;is there any?
BEQ.S @doneWithAdds ;skip the left extra add
MOVE.B #1, D2 ;add 1 for left extra
CMP.B #1, D0 ;outline only?
BNE.S @notOnlyOutline
ADD.B #2, addBitWidth(A6) ;Add outline extra to bitwidth <8-CEL>
MOVE.B #2, addBot(A6) ;2 for outline bottom
BRA.S @doneWithAdds
@notOnlyOutline
CMP.B #2, D0 ;shadow only?
BNE.S @notShadowOnly
ADD.B #3, addBitWidth(A6) ;Get shadow value <8-CEL>
MOVE.B #3, addBot(A6) ;2 for outline bottom
BRA.S @doneWithAdds
@notShadowOnly
ADD.B #4, addBitWidth(A6) ;MOVE both outline and shadow values <8-CEL>
MOVE.B #4, addBot(A6) ;2 for outline bottom
@doneWithAdds
;<8-CEL> MOVE.B D1, addBitWidth(A6) ;right side value
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; Make sure cache is around
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MOVE.L expandMem, A0 ; get low mem expand
MOVE.L ExpandMemRec.emSplineKey(A0), A0 ; Handle to splineKey
MOVE.L (A0), A0 ; pointer to splinekey
MOVE.L splineKeyRec.cacheHand(A0), D0 ; is there a cache
BEQ cacheErr
MOVE.L D0, A0 ; get Handle in addr reg
TST.L (A0) ; Is it purged
BEQ cacheErr ; bail since we have no cache
MOVE.L A0, cacheHand(A6) ;save on the stack
MOVE.L (A0), D6 ;cachePtr.l in reg
MOVE.L D6, A0 ;place in addr reg
if (hasDoubleByte) then
move.l cache.fEncodingTablePointer(a0),encodingTable(a6) ; load encoding table pointer.
endif
TST.L yMaxPtr(A6) ;Init if exists <7-CEL>
BEQ.S @noFill ;Nil so skip
MOVE.L yMaxPtr(A6), A1 ;Get ptr
MOVE.W cache.descent(A0), D0 ; <9-CEL>
NEG D0 ;
MOVE.W D0, (A1) ;Init to opposite
@noFill
TST.L yMinPtr(A6) ;Init if exists <7-CEL>
BEQ.S @noFill2 ;Nil so skip
MOVE.L yMinPtr(A6), A1 ;Get ptr
MOVE.W cache.ascent(A0), (A1) ;Init to opposite <9-CEL>
@noFill2
LEA cache.glyphArray(A0), A0 ;
MOVE.L A0, D4 ;Save array of glyphs into D4
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MOVE.W #-1, topClip(A6) ;do not need to render the glyph for contours
CLR.W botClip(A6) ;do not need to render the glyph for contours
MOVE.L textPtr(A6),A1 ;pointer to chars
MOVE.L awPtr(A6),A2 ;pointer to Advance widths
MOVE.L lsbPtr(A6),A3 ;pointer to left side bearings
MOVE.L boundsPtr(A6),A4 ;pointer to bound rects
MOVEQ #0, D5 ;Clear along for subq later
MOVE.W count(A6),D5 ;get the glyph count
SUBQ #1, D5 ;dec count for loop
BLT cleanUp ;nothing to do
BRA.S NEXTCH ;Start the loop
MISSING
TST.L lsbPtr(A6) ;Does left side bearings array exist
BEQ.S @noLSBArray ;no array to be filled
CLR.L (A3)+ ;pointer to left side bearings
@noLSBArray
TST.L boundsPtr(A6) ;Does bounds rect array exist
BEQ.S @noBounds ;no array to be filled
CLR.W left(A4) ;left set to zero
CLR.W right(A4) ;right set to bitwidth
CLR.W top(A4) ;bottom is yMax
CLR.W bottom(A4) ;top is yMin
ADD.L #8, A4 ;increment record
@noBounds
TST.L awPtr(A6) ;Does AW array exist
BEQ.S @noAWArray ;no array to be filled
MOVE.L D7,A0
ADD.W D3, D3
ADD.W D3, D3 ;D3*4
MOVE.L 0(A0,D3), (A2)+ ;fill out result
@noAWArray
SUBQ #1, D5 ;dec count for loop
BLT cleanUp ;nothing to do
NEXTCH
if (hasDoubleByte) then
clr.w d3 ; clear high byte of low word
move.b (a1)+,d3 ; load the high or single byte
move.b d3,highByte(a6) ; save the high byte in case we need to back up
clr.b lowByte(a6) ; clear the low byte for now
tst.l encodingTable(a6) ; is this a double byte font?
beq @normalFont ; no, skip low byte loading
move.l encodingTable(a6),a0 ; load the encoding table
tst.b 0(a0,d3.w) ; is this a double byte character?
beq @normalCharacter ; no, skip low byte loading
tst.w d5 ; more bytes left in text?
ble @remapCharacterToNull ; no, remap the high byte
subq.w #1,d5 ; decrement the character count
clr.w d0 ; clear high byte of low word
move.b (a1)+,d0 ; grab the low byte and bump the text pointer
adda.w #256,a0 ; offset to the low byte encoding table
tst.b 0(a0,d0.w) ; is this a valid low byte?
beq @remapCharacterToNull ; no, remap the high byte character
move.b d0,lowByte(a6) ; save the valid low byte for later use
bra @normalCharacter ; continue normally
@remapCharacterToNull
move.b #1,d3 ; remap the high byte character
move.b d3,highByte(a6) ; reset the highByte local
@normalCharacter
@normalFont
else
MOVEQ #0, D3 ;GET READY FOR BYTE
MOVE.B (A1)+,D3 ;get the glyph
endif
move.w d3,d0 ; copy the highbyte
cmp.b #32,d0 ; is it a space?
beq MISSING ; treat as if missing
ADD.W D0, D0
ADD.W D0, D0 ;D0*4
MOVE.L D4, A0 ;Get array of glyphs into A0
MOVE.L 0(A0,D0), D1 ; Place results in D1
if (hasDoubleByte) then
beq @renderGlyph ; high byte table or single byte glyph doesn't exist, go render the glyph
tst.b lowByte(a6) ; are we looking at a highbyte offset table?
beq @stripBits ; <12> no, go use the single byte glyph, but first, clear the contour entry bit
move.l d1,a0 ; grab the lowbyte table offset
add.l d6,a0 ; add the cache address to get the lowbyte table pointer
moveq #0,d1 ; initialize - can't use d0 (ack!)
move.b lowByte(a6),d1 ; grab the lowbyte
add.w d1,d1 ; convert to word offset
add.w d1,d1 ; convert to long offset
move.l 0(a0,d1.w),d1 ; grab the double byte glyph offset
endif
BGT @fillMetrics ; character exists, go use it
BTST.L #30, D1 ;Check if there is an error
BNE.S MISSING ;Got an error so skip character
@stripBits
AND.L #$3FFFFFFF, D1 ;Clear contour entry bit flag
BNE.S @fillMetrics ;Got the info
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
; calling _sbRetrieveGlyph
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@renderGlyph
MOVEM.L D0/D2/A1-A2,-(SP) ;Save off all registers before JSR <9-CEL>
SF nextBand(A6) ;init to no next char band
SUBQ #4,SP ;make room for result
MOVEQ #0, D1
MOVE.B -1(A1), D1 ;previous char
MOVE D1, glyphID(A6) ;put glyphID into sp_Glyph
if (hasDoubleByte) then
tst.l encodingTable(a6) ; is this a double byte font?
beq.s @singleByteFont ; no, skip loading low byte
move.b highByte(a6),glyphID(a6) ; save the high byte
move.b lowByte(a6),glyphID+1(a6) ; save the low byte
@singleByteFont
endif
MOVE.L WidthTabHandle, -(SP) ;2) Push the Width Table Handle onto the stack
PEA fontID(A6) ;1) Push the Glyph Rec Ptr
_sbRetrieveGlyph ;Call the routine via SplineDispatch
MOVE.L WidthTabHandle, A0 ;restore width table ptr
MOVE.L (A0), D7 ;got it
;The cacheHand may have change if we got
;Memory somewhere else
MOVE.L expandMem,A0 ; get low memory expand pointer.
MOVE.L ExpandMemRec.emSplineKey(A0),A0 ; get handle to splineKey globals.
MOVE.L (A0), A0 ; get pointer to splineKey globals.
MOVE.L splineKeyRec.cacheHand(A0),A0 ; Get the handle in case it changed.
MOVE.L A0, cacheHand(A6) ;restore cacheHand
MOVE.L (A0), D6 ;cachePtr.l in reg
MOVE.L D6, A0 ;place in addr reg
LEA cache.glyphArray(A0), A0 ;
MOVE.L A0, D4 ;restore glyphArray ptr
ADDQ #4, SP ;Ignore errors
MOVEM.L (SP)+, D0/D2/A1-A2 ;Restore all registers on return <9-CEL>
MOVE.L entryOffset(A6), D1
BEQ MISSING ;if zero then no info
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
@fillMetrics ; <11-jlf>
ADD.L D6, D1 ;Add in cacheOffset
MOVE.L D1, A5 ;put in addr reg
TST.L awPtr(A6) ;Does AW array exist
BEQ.S @noAWArray ;no array to be filled
MOVE.L D7,A0
MOVE.L 0(A0,D0), (A2)+ ;fill out result
@noAWArray
TST.L lsbPtr(A6) ;Does left side bearings array exist
BEQ.S @noLSBArray ;no array to be filled
MOVE.L glyph.lsb(A5),(A3) ;pointer to left side bearings
SUB.W D2, (A3) ;Add left extra value
ADDQ #4, A3 ;bump the ptr
@noLSBArray
TST.L boundsPtr(A6) ;Does bounds rect array exist
BEQ.S @noBounds ;no array to be filled
CLR.W left(A4) ;left set to zero
MOVE.W glyph.bitWidth(A5), D0 ;right set to bitwidth
ADD.B addBitWidth(A6), D0 ;add right extra value
MOVE.W D0, right(A4) ;save off right bitwidth
MOVE.B addBot(A6), D1 ;add right extra value
EXT.W D1 ;Make it a word
MOVE.W glyph.yMin(A5), D0 ;Ymin value is top
SUB.W D1, D0 ;Ymin value is top
ADD.W D2, D0 ;adjust down if outline or shadow
MOVE.W D0, top(A4) ;yMin is top
MOVE.W glyph.yMax(A5), bottom(A4) ;yMax is bottom
ADD.W D2, bottom(A4) ;adjust down if outline or shadow
ADD.L #8, A4 ;increment record
@noBounds
TST.L yMaxPtr(A6) ;
BEQ.S @noCompare ;Nil so skip
MOVE.L yMaxPtr(A6), A0 ;Get ptr
MOVE.W (A0), D0
MOVE.W glyph.yMax(A5), D1 ;yMax value in D1 <8-CEL>
ADD.W D2, D1 ;adjust up if outline or shadow <8-CEL>
CMP.W D1, D0 ;Init to max neg <8-CEL>
BGE.S @noCompare ;skip since not larger
MOVE.W D1, (A0) ;Change the yMax value <8-CEL>
@noCompare
TST.L yMinPtr(A6) ;
BEQ.S @noCompare2 ;Nil so skip
MOVE.L yMinPtr(A6), A0 ;Get ptr
MOVE.W glyph.yMin(A5), D1 ;Init to max pos
MOVE.B addBot(A6), D0 ;add bottom extra
EXT.W D0 ;make it a word
SUB.W D0, D1 ;Adjusted for style
ADD.W D2, D1 ;adjust down if outline or shadow <8-CEL>
MOVE.W (A0), D0
CMP.W D1, D0 ;Init to max pos
BLE.S @noCompare2 ;skip since not less than
MOVE.W D1, (A0) ;Update with the lesser value
@noCompare2
MORE DBRA D5,NEXTCH ;LOOP FOR count
cleanUp
TST.L yMaxPtr(A6) ;Get ptr <7-CEL>
BEQ.S @noFill ;Nil so skip
TST.L yMinPtr(A6) ;test ptr <7-CEL>
BEQ.S @noFill ;Nil so skip
MOVE.L yMaxPtr(A6), A0 ;Get ptr
MOVE.W (A0), D0
MOVE.L yMinPtr(A6), A1 ;Get ptr
CMP.W (A1), D0
BGE.S @noFill
CLR.W (A1) ;Set Ymin to baseline
CLR.W (A0) ;Set Ymax to baseline
@noFill
MOVE.L WidthTabHandle, A1 ;Get the Width Table
MOVE.L (A1), A1 ;Width Ptr
MOVE.L WidTabFont(A1), A0 ;Got the FontHandle
MOVE.B fontState(A6), D0 ;preserve it until the next change
_HSetState ;restore purgability of original strike
MOVEM.L (SP)+,D3-D7/A2-A5 ;RESTORE REGS
UNLK A6
MOVE.L (SP)+,A0 ;Get return address
ADD #PARAMSIZE,SP ;Pop the stack
JMP (A0) ;Lets return to the music
cacheErr
MOVE.W #NO_CACHE_ERROR, intError(A6) ;return bad font error
BRA cleanUp
bitMapFontErr
MOVE.W #BITFONT_ERR, intError(A6) ;return bad font error
BRA cleanUp
SetOutlinePreferred Proc Export
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;
; SetOutlinePreferred( outlinePreferred )
; Boolean outlinePreferred;
;
;
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MOVE.L (SP)+, A0 ;get the return address
TST.B (SP) ;Pop off true or false request
ADDQ #2, SP ;Pop off Boolean
BNE.S @yesSpline
BCLR #splinePreferred, HiliteMode ;Clear the low mem bit
BRA.S @donePreferred ;let<65>s get out of here
@yesSpline
BSET #splinePreferred, HiliteMode ;Set the low mem bit
@donePreferred
MOVE.L MinusOne,LastSpExtra ;note that widths are invalid
JMP (A0)
GetOutlinePreferred Proc Export
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;
; Boolean GetOutlinePreferred( )
;
;
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CLR.W 4(SP)
BTST #splinePreferred, HiliteMode ;Is it outline preferred???
SNE 4(SP) ;Give back function result on stack
RTS
IsOutline Proc Export
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;
; Boolean IsOutline(Point numer, Point denom)
;
; Specifies whether or not the current font loaded is of type outline.
;
;
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
denom EQU 8 ;LONG, stretching var
numer EQU denom+4 ;LONG, stretching var
isOutlineFlag EQU numer+4 ;BOOLEAN, flag of result
ParamSize EQU numer-4 ;Size of parameters to pop off
INREC EQU -16 ;FMInput record
VARSIZE EQU INREC
LINK A6,#VARSIZE ;ALLOCATE LOCALS
MOVEM.L D3-D6/A2-A4,-(SP) ;SAVE REGS
MOVE.L GRAFGLOBALS(A5),A4 ;POINT TO QUICKDRAW GLOBALS
MOVE.L THEPORT(A4),A0 ;GET CURRENT GRAFPORT
;
; Call swapfont to set up width table and return numer,denom:
;
LEA INREC(A6),A1 ;POINT TO FMINPUT RECORD
MOVE TXFONT(A0),(A1)+ ;GET TXFONT FROM THEPORT
MOVE TXSIZE(A0),(A1)+ ;GET TXSIZE FROM THEPORT
MOVE.B TXFACE(A0),(A1)+ ;GET TXFACE FROM THEPORT
ST (A1)+ ;ALWAYS SET NEEDBITS TRUE
MOVE DEVICE(A0),(A1)+ ;GET DEVICE FROM THEPORT
MOVE.L numer(A6), (A1)+ ;INSTALL INPUT NUMER
MOVE.L denom(A6), (A1)+ ;INSTALL INPUT DENOM
CLR.L -(SP) ;ROOM FOR FCN RESULT
PEA INREC(A6) ;PUSH INPUT RECORD
_FMSwapFont ;CALL FMSwapFont trap
MOVE.L (SP)+,A0 ;POP FMOUTPUT POINTER
CLR.W isOutlineFlag(A6)
MOVE.L WidthTabHandle, A0 ;Get the Width table handle
MOVE.L (A0), A0 ;WidthPtr
TST.B WidthIsSpline(A0) ;Test if spline
SNE isOutlineFlag(A6) ;Give back function result on stack
MOVEM.L (SP)+,D3-D6/A2-A4 ;RESTORE REGS
UNLK A6
MOVE.L (SP)+,A0 ;Get return address
ADD #PARAMSIZE,SP ;Pop the stack
JMP (A0) ;Lets return to the music
SetPreserveGlyph Proc Export
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;
; SetPreserveGlyph( Boolean : preserveGlyphs)
;
;
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
MOVE.L (SP)+, A0 ;Get return addr
TST.B (SP) ;Pop off true or false request
ADDQ #2, SP ;Pop off Boolean
BNE.S @preserveGlyph
BCLR #preserveGlyph, HiliteMode ;Clear the low mem bit
BRA.S @donePreferred ;let<65>s get out of here
@preserveGlyph
BSET #preserveGlyph, HiliteMode ;Set the low mem bit
@donePreferred
JMP (A0)
Endproc
GetPreserveGlyph Proc Export
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
;
; Boolean GetPreserveGlyph( )
;
;
;<3B><><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD><EFBFBD>
CLR.W 4(SP)
BTST #preserveGlyph, HiliteMode ;Is it glyph preservd???
SNE 4(SP) ;Give back function result on stack
RTS
ENDPROC
END