mac-rom/Toolbox/FontMgr/DoubleByteSupport.a
Elliot Nunn 4325cdcc78 Bring in CubeE sources
Resource forks are included only for .rsrc files. These are DeRezzed into their data fork. 'ckid' resources, from the Projector VCS, are not included.

The Tools directory, containing mostly junk, is also excluded.
2017-12-26 09:52:23 +08:00

292 lines
12 KiB
Plaintext

;
; File: DoubleByteSupport.a
;
; Contains: Assembly level support routines for drawing double byte characters in
; QuickDraw and caching double byte characters in TrueType.
;
; Written by: Joe Ternasky
;
; Copyright: © 1990-1992 by Apple Computer, Inc. All rights reserved.
;
; Change History (most recent first):
;
; <SM3> 11/5/92 SWC Changed INCLUDEs to a LOAD of StandardEqu.d.
; <2> 6/22/92 JH #1033107 <AMW>: Changed GetEncodingTable to return the real
; script ID rather than 0 when the script isn't a CJK script.
; <1> 1/20/90 JF Created file, relocated Joe's routines from ÒDrawText.aÓ,
; and slapped on standard routine headers.
;
LOAD 'StandardEqu.d'
; -------------------------------------------------------------------------------------
;
; Routine: GetEncodingMap
;
; Input: d0.w text font ID
;
; Output: d0.w script code
; a0.l encoding table pointer
;
; Purpose: GetEncodingMap expects the text font ID in register d0. It returns the
; script code in d0 and the encoding table pointer in a0. The encoding
; table is is indexed by a byte code and each entry is a boolean value
; true if this is a high byte in the given font's encoding, false if this
; is a single byte. If the encoding table pointer is zero, this is a single
; byte font.
;
; Warning: none
;
; Frame: none
;
; -------------------------------------------------------------------------------------
GetEncodingMap proc export
cmp.w #1,d0 ; special font ID number?
bhi.s @noFontRemapping ; greater, skip all this
blo.s @systemFontRemapping ; less, remap to system font
@applicationFontRemapping
move.w ApFontID,d0 ; remap to application font
bra.s @noFontRemapping ; all through here
@systemFontRemapping
move.w SysFontFam,d0 ; remap to system font
@noFontRemapping
sub.w #smFondStart,d0 ; in the Roman range?
bmi.s @defaultEncoding ; yes, return default encoding
lsr.w #8,d0 ; divide font number by 2^8
lsr.w #1,d0 ; divide font number by 2^1
add.w #1,d0 ; make it a real script code
lea sjisHighBytes,a0 ; assume the SJIS encoding
cmp.w #smJapanese,d0 ; really is japanese?
beq.s @returnToCaller ; yes, just return now
lea bigFiveHighBytes,a0 ; assume the Big Five encoding
cmp.w #smTradChinese,d0 ; really is taiwanese?
beq.s @returnToCaller ; yes, just return now
lea kisHighBytes,a0 ; assume the KIS encoding
cmp.w #smKorean,d0 ; really is korean?
beq.s @returnToCaller ; yes, just return now
lea sgbHighBytes,a0 ; assume the SGB encoding
cmp.w #smSimpChinese,d0 ; really is chinese?
beq @returnToCaller ; assume the SGB encoding
sub.l a0,a0 ; clear result
bra.s @returnToCaller ; but keep the script code in d0
@defaultEncoding
sub.l a0,a0 ; assume the generic encoding
clr.w d0 ; set script number to smRoman
@returnToCaller
rts ; return to the caller
sjisHighBytes
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $00 to $0F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $10 to $1F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $20 to $2F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $30 to $3F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $40 to $4F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $50 to $5F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $60 to $6F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $70 to $7F
dc.b 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $80 to $8F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $90 to $9F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $A0 to $AF
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $B0 to $BF
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $C0 to $CF
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $D0 to $DF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $E0 to $EF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ; $F0 to $FF
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $00 to $0F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $10 to $1F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $20 to $2F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $30 to $3F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $40 to $4F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $50 to $5F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $60 to $6F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; $70 to $7F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $80 to $8F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $90 to $9F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $A0 to $AF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $B0 to $BF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $C0 to $CF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $D0 to $DF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $E0 to $EF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ; $F0 to $FF
dc.b $40,$00 ; default low byte.
bigFiveHighBytes
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $00 to $0F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $10 to $1F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $20 to $2F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $30 to $3F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $40 to $4F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $50 to $5F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $60 to $6F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $70 to $7F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $80 to $8F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $90 to $9F
dc.b 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $A0 to $AF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $B0 to $BF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $C0 to $CF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $D0 to $DF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $E0 to $EF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ; $F0 to $FF
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $00 to $0F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $10 to $1F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $20 to $2F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $30 to $3F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $40 to $4F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $50 to $5F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $60 to $6F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; $70 to $7F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $80 to $8F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $90 to $9F
dc.b 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $A0 to $AF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $B0 to $BF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $C0 to $CF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $D0 to $DF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $E0 to $EF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; $F0 to $FF
dc.b $40,$00 ; default low byte.
kisHighBytes
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $00 to $0F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $10 to $1F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $20 to $2F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $30 to $3F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $40 to $4F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $50 to $5F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $60 to $6F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $70 to $7F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $80 to $8F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $90 to $9F
dc.b 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $A0 to $AF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $B0 to $BF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $C0 to $CF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $D0 to $DF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $E0 to $EF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; $F0 to $FF
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $00 to $0F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $10 to $1F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $20 to $2F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $30 to $3F
dc.b 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $40 to $4F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $50 to $5F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $60 to $6F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,0,0 ; $70 to $7F
dc.b 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $80 to $8F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $90 to $9F
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $A0 to $AF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $B0 to $BF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $C0 to $CF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $D0 to $DF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $E0 to $EF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; $F0 to $FF
dc.b $41,$00 ; default low byte.
sgbHighBytes
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $00 to $0F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $10 to $1F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $20 to $2F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $30 to $3F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $40 to $4F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $50 to $5F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $60 to $6F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $70 to $7F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $80 to $8F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $90 to $9F
dc.b 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $A0 to $AF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $B0 to $BF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $C0 to $CF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $D0 to $DF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $E0 to $EF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,0,0,0 ; $F0 to $FF
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $00 to $0F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $10 to $1F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $20 to $2F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $30 to $3F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $40 to $4F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $50 to $5F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $60 to $6F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $70 to $7F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $80 to $8F
dc.b 0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; $90 to $9F
dc.b 0,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $A0 to $AF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $B0 to $BF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $C0 to $CF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $D0 to $DF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1 ; $E0 to $EF
dc.b 1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,0 ; $F0 to $FF
dc.b $a1,$00 ; default low byte.
endproc
; -------------------------------------------------------------------------------------
;
; Routine: Function GetEncodingTable( fondID: Integer; VAR script: Integer ) : Ptr;
;
; Input: none
;
; Output: none
;
; Purpose: GetEncodingTable is a Pascal cover for the corresponding register based
; routine, GetEncodingMap. It expects the FOND ID number and a pointer to
; the script code storage on the stack and returns the encoding table pointer
; as the result and the proper script code in the storage. Only those few
; scripts that require the encoding table return one in the result; all other
; scripts return a nil pointer. The script code is always correct, but does
; not check with the Script Manager to make sure that the script system is
; really installed.
;
; Warning: none
;
; Frame:
GetEncodingTableFrame: Record {oldA6},decrement
result: ds.l 1
fondID: ds.w 1
scriptPtr: ds.l 1
returnAddress: ds.l 1
oldA6: ds.l 1
frameSize: equ *
EndR
;
; -------------------------------------------------------------------------------------
GetEncodingTable proc export
with GetEncodingTableFrame
link a6,#frameSize ; build the stack frame
move.w fondID(a6),d0 ; load the fond ID number
bsr GetEncodingMap ; get encoding table and script code
move.l a0,result(a6) ; save the encoding table pointer
move.l scriptPtr(a6),a0 ; load the script code storage pointer
move.w d0,(a0) ; save the script code
unlk a6 ; remove the stack frame
move.l (sp)+,a0 ; load the return address
add.l #6,sp ; remove the arguments
jmp (a0) ; return to the caller
endWith
endProc
end