; ; File: fontPrivate.a ; ; Contains: All particular spline definitions needed for the spline package. ; ; Written by: Charlton E. Lui ; ; Copyright: © 1989-1992 by Apple Computer, Inc., all rights reserved. ; ; Change History (most recent first): ; ; <29> 9/2/92 DTY Convert those damned incremental labels into records. ; <28> 7/9/92 DTY This file got corrupted somehow. Fix it back up from version ; <26> and redo last change. ; <27> 7/9/92 DTY #1035445: Increased partial zone size to 10K. ; <26> 7/4/92 DTY #1034875 : Define 5K size of base system’s partial font ; zone here. ; <25> 5/4/92 DTY There really was a good reason for me to stick fondCache in the ; middle of SplineKey, honest! But since I don’t remember what it ; is, I’m moving it to the end of the structure to keep existing ; offsets the same. ; <24> 3/9/92 DTY Add macros for new selectors for InitializePartialFonts and ; InitializeDiskCache. ; <23> 1/22/92 DTY Take the synFOND field out of the synthetic strike table ; structure. We’re gauranteeing unique font IDs, so this extra ; differentiation won’t be necessary. ; <22> 11/15/91 DTY Remember which resource map a font was loaded from. Added the ; synFOND field to the synEntry record. (If it turns out the ; developers are looking at these records, this information will ; probably have to be moved.) ; <21> 10/11/91 DTY Building the candidate FOND list takes too long. Cache two lists ; in SplineKey. ; <20> 9/25/91 jlf Added fSplineDirectory to widthTable definition. Replaced ; glyphCount and glyphLimit with fEncodingTablePointer, ; fScriptNumber, and fLongPad in the sb_CacheHead definition. ; Added spline key globals for partial font, disk caching, ; and doublebyte support. Added KeepSplineOnDisk field to ; width table structure. ; <19> 8/22/91 JSM Clean up header. ; <18> 1/30/91 gbm sab, #38: Change the ‘already including this file’ variable to ; all uppercase (for security reasons) ; <17> 1/9/91 RB (CEL/PKE/GM/DA) Added in safeCount variable to splineKey globals ; to fix the long string bug caused in stdtxmeas overflow. ; <16> 12/18/90 MR [ph] Add IsSpline macro for BassPatches.a ; <15> 10/30/90 CL (MR)Adding fs_LowestPPEM macro. ; <14> 10/22/90 CL (BKR)Adding support for minimum memory mode to band and run in ; low memory cache conditions. ; <12> 10/10/90 CL Adding sb_PreFlightFontMem selector. ; <11> 10/8/90 CL Adding loadSpline flag to the widthTable. ; <10> 10/8/90 CL Fixing up the splinekey vGrowZone variable. This accidently got ; placed over the tempWidthHand. ; <9> 10/1/90 CL Adding in memoryPatch vector for memory manager fix on the ; growzone. ; <8> 9/24/90 CL Adding the fmAscent, fmDescent, fmWidmax, fmLeading fields to ; the cache. ; <7> 9/13/90 CL Taking out unused variables in the caching records. ; Cleaned up splinekeyRec… Added in heap defines into splineKey. ; <6> 8/29/90 CL Added the cache zone to splinekey. Added mfExists flag. ; <5> 8/28/90 MR Add bitmapzone to splinekey ; <4> 8/20/90 MR Add fsWorkZone to record which zone the work handle is allocated ; in. ; <3> 7/20/90 gbm Stopped redefining all of the width table, so the assembler ; won't complain ; <2> 7/16/90 CL Adding glyph data structure. Added clean up vector in splinekey. ; <1> 6/22/90 CL first checked in ; <6+> 6/20/90 CL Used to be SplineDefines.a. ; <6> 5/29/90 CL Took out width table references to the cache handles. ; <5> 5/3/90 CL Got rid of old comments. may have added support for extra memory ; area. ; <4> 4/10/90 CL Added support for double byte codes. Worked on disk caching. ; <3> 3/20/90 CL support for tag format ; <2> 2/27/90 CL suppport for DrText’s optimizations ; <1.9> 11/14/89 CEL Adding Device left side bearing. ; <1.8> 9/15/89 CEL Added flag to turn on debugging from macsbug. ; <1.7> 8/28/89 CEL Updated splinekey to match c defines. ; <1.6> 8/14/89 CEL Added memory macros. Added in encrytion var in width table. ; Added splineKeyRec. ; <1.5> 8/1/89 CEL Conditionalized the Debug Macro. Used assembly records for ; structures that are passed between Drtext and buffer code. Added ; NewTempHandle, NewTempBuffer, NewDisposeHandle macros. ; <1.4> 6/10/89 CEL Moved Private.a QuickDraw Equates into proper QuickDraw private ; file (colorequ.a), got rid of QuickDraw nFiles dependencies and ; fixed up necessary files… ; <1.3> 6/2/89 CEL Changed translate24To32 trap address so we can worked with ; 32-bit QD once more ; <1.2> 5/26/89 CEL Integrated the new Font Scaler 1.0 into Spline Fonts ; <•1.1> 5/3/89 CEL All kinks worked out, Blasting in bass files… ; <1.0> 5/2/89 CEL Rolling in bass for the first time… ; ;—————————————————————————————————————————————————————————————————————————————————————————— BLANKS ON STRING PASCAL ;—————————————————————————————————————————————————————————————————————————————————————————— ; Spline Data Structures ;—————————————————————————————————————————————————————————————————————————————————————————— splinePreferred EQU 5 preserveGlyph EQU 4 kMinimalPartialFontZoneSize equ 10 * 1024 ; <26> A minimal partial font zone for the base system ;————————————————————— ; SplineKey Struct ;————————————————————— ; IF CHANGE in c-def ; Update this definition ; ; splineKeyRec RECORD 0 callDebug DS.L 1 ; Set if debugging is on vFontCache DS.L 1 ; Dispatch table for QuickDraw caching vFontScaler DS.L 1 ; Dispatch table for QuickDraw caching bitmapHand DS.L 1 ; Bitmap Handle - Number 5 in Font Scaler bitmapZone DS.L 1 ; Zone the bitmapHand is allocated in <5> cacheListHandle DS.L 1 ; List of Cache Handles cacheHand DS.L 1 ; Handle to cache hand cacheZone DS.L 1 ; zone the cache lives in cachePlace DS.W 1 ; zone the cache lives in fontCount DS.W 1 ; Set to Zero on increment each time a new cache exists curAppZone DS.L 1 ; current application zone sysFull DS.B 1 ; system is full appFull DS.B 1 ; app is full useHeap DS.B 1 ; which heap to use mfExists DS.B 1 ; flags whether multiFinder exists glyphID DS.W 1 ; last glyph id is32Bit DS.B 1 ; does 32bit QD exist squashed DS.B 1 ; are we squashing the cache strikeID DS.W 1 ; check if still same sfnt ptSize DS.W 1 ; Check Point Size the same device DS.W 1 ; check Device resolution the same face DS.W 1 ; check Face the same trans00 DS.L 1 ; x trans trans11 DS.L 1 ; y trans trans10 DS.L 1 ; skew tempWidthHand DS.L 1 ; Used temporarily to get printer widths vGrowZone DS.L 1 ; vector for growzone patch safeCount DS.W 1 ; safe count in case of length overflow EXTRAWORD DS.W 1 ; *******FONT SCALER MEMORY******* fsWorkHand DS.L 1 ; work area for spline data fsWorkZone DS.L 1 ; zone for the work handle <4> inPtr DS.L 1 ; pointer to input struct outPtr DS.L 1 ; pointer to info struct inputOffset DS.L 1 ; Constant memory infoOffset DS.L 1 ; Constant memory globalOffset0 DS.L 1 ; Constant memory globalOffset1 DS.L 1 ; Constant memory globalOffset2 DS.L 1 ; Constant memory sfntDataOffset3 DS.L 1 ; Variable size memory sfntDataOffset4 DS.L 1 ; Variable size memory rowArrayOffset6 DS.L 1 ; Variable size memory columnArrayOffset7 DS.L 1 ; Variable size memory fPartialFontzone DS.L 1 ; zone for partial font fragments fFragmentTableCache DS.L 1 ; list of fragment tables fLastSwapFontFamilyID DS.W 1 ; FMInput family id passed in at last SwapFont call fDiskCacheMap DS.L 1 ; Handle to the disk cache fResourceManagerPurgeProcedure DS.L 1 ; address of resource manager purge procedure fInPurgeProcedure DS.B 1 ; true if currently in our purge procedure fFontCacheExists DS.B 1 ; true if font cache exists. lastFontMap ds.w 1 ; Resource map last font was loaded from fondCache ds.l 2 ; Cache for candidate FOND list splineKeySize equ * ; size for this version ENDR ;————————————————————— ;————————————————————— ; GlyphData Struct ;————————————————————— ; IF CHANGE in c-def ; Update this definition ; glyph RECORD 0 yMin DS.W 1 ; Y min off baseline yMax DS.W 1 ; Y max off baseline lsb DS.L 1 ; Left side bearing Fixed devLSB DS.W 1 ; Device Left side bearing adjustTop DS.W 1 ; Adjust this char from ascent rError DS.W 1 ; set if Render error occurs bitWidth DS.W 1 ; glyph bit width byteWidth DS.L 1 ; row bytes of character xMin DS.W 1 ; Save xMin and also use to calc xMax scan DS.W 1 ; # of scan lines wasteBytes DS.W 1 ; not needed for bitmap but needed for scan converter glyphID DS.W 1 ; id of glyph cacheData DS.L 1 ; Start of destination bits buffer ENDR ;————————————————————— ;————————————————————— ; sb_CacheHead ;————————————————————— ; IF CHANGE in c-def ; Update this definition ; cache RECORD 0 StrikeID DS.W 1 ; id of sfnt ptSize DS.W 1 ; point size face DS.W 1 ; style of request newEntries DS.W 1 ; Number of new entries added trans00 DS.L 1 ; x trans trans11 DS.L 1 ; y trans trans10 DS.L 1 ; skew ascent DS.L 1 ;(fixed) Ascent of Font descent DS.L 1 ;(fixed) Descent of Font widMax DS.L 1 ;(fixed) Maximum Width leading DS.L 1 ;(fixed) Leading of Font lOverHMax DS.L 1 ;(fixed) Left Over Hang Max rOverHMax DS.L 1 ;(fixed) Right Over Hang Max yMax DS.L 1 ;(fixed) YMax yMin DS.L 1 ;(fixed) YMin height DS.W 1 ;(word) Height filler DS.W 1 ;(word) Height rightItalic DS.L 1 ;(fixed width italic slope) leftItalic DS.L 1 ;(fixed width italic slope) fmAscent DS.B 1 ; FMOutput ascent fmDescent DS.B 1 ; FMOutput descent fmWidmax DS.B 1 ; FMOutput widmax fmLeading DS.B 1 ; FMOutput leading addEntryOffset DS.L 1 ; Offset to next spot to add bitsCached DS.B 1 ; Set if bitmaps are cached squashed DS.B 1 ; set if the cache is squashed familyID DS.W 1 ; Family id for international checks fEncodingTablePointer DS.L 1 ; pointer to double byte encoding table or nil for single byte scripts fScriptNumber DS.W 1 ; script associated with this cache fLongPad DS.W 1 ; long align fields glyphArray DS.L 1 ; Array of offsets starts here ENDR ;————————————————————— ;—————————————————————————————————————————————————————————————————————————————————————————— ; ERROR CODES ;—————————————————————————————————————————————————————————————————————————————————————————— BITFONT_ERR EQU $8099 NO_CACHE_ERROR EQU $00C0 ;—————————————————————————————————————————————————————————————————————————————————————————— ; SELECTOR MACROS ;—————————————————————————————————————————————————————————————————————————————————————————— ; TRAP chummings ;————————————————————— _SplineMgr OPWORD $A854 ;————————————————————— ; Selectors ;————————————————————— sbIsOutline EQU $0000 sbKillSomeCaches EQU $0002 sbRetrieveGlyph EQU $0004 sbFillWidthTab EQU $0005 sbSearchForCache EQU $0006 sbPreFlightFontMem EQU $0007 sbFlushFonts EQU $000C fsLowestPPEM EQU $000e selectInitializePartialFonts equ $000F ; <24> selectInitializediskCache equ $0010 ; <24> ;————————————————————— ; Macros ;————————————————————— MACRO _sbIsOutline IMPORT SplineMgr MOVEQ #sbIsOutline,D0 _SplineMgr ENDM MACRO _sbRetrieveGlyph IMPORT SplineMgr MOVEQ #sbRetrieveGlyph,D0 _SplineMgr ENDM MACRO _sbKillSomeCaches IMPORT SplineMgr MOVEQ #sbKillSomeCaches,D0 _SplineMgr ENDM MACRO _sbFillWidthTab IMPORT SplineMgr MOVEQ #sbFillWidthTab,D0 _SplineMgr ENDM MACRO _sbResetWorkSpace IMPORT SplineMgr MOVEQ #sbResetWorkSpace,D0 _SplineMgr ENDM MACRO _sbInitMemory IMPORT SplineMgr MOVEQ #sbInitMemory,D0 _SplineMgr ENDM MACRO _sbSetFontState IMPORT SplineMgr MOVEQ #sbSetFontState,D0 _SplineMgr ENDM MACRO _sbSearchForCache IMPORT SplineMgr MOVEQ #sbSearchForCache,D0 _SplineMgr ENDM MACRO _sbPreFlightFontMem IMPORT SplineMgr MOVEQ #sbPreFlightFontMem,D0 _SplineMgr ENDM MACRO _fsLowestPPEM IMPORT SplineMgr MOVEQ #fsLowestPPEM,D0 _SplineMgr ENDM MACRO _GetStyleBufHand IMPORT GetStyleBufHand JSR GetStyleBufHand ENDM MACRO _sbFlushFonts IMPORT SplineMgr MOVEQ #sbFlushFonts,D0 _SplineMgr ENDM Macro ; <24> _InitializePartialFonts ; <24> moveq #selectInitializePartialFonts,d0 ; <24> _SplineMgr ; <24> EndM ; <24> Macro ; <24> _InitializeDiskCache ; <24> moveq #selectInitializeDiskCache,d0 ; <24> _SplineMgr ; <24> EndM ; <24> ;—————————————————————————————————————————————————————————————————————————————————————————— ; SPLINE WIDTH TABLE ;—————————————————————————————————————————————————————————————————————————————————————————— ;WidTabData EQU 0 ;256 fixed point widths ;WidTabFont EQU 1024 ;(long) font handle used to generate this width table ;WidthSExtra EQU WidTabFont+4 ;(long) fixed point space extra used for this table ;WidthStyle EQU WidthSExtra+4 ;(long) fixed point extra due to style, used for this table ;WidthFID EQU WidthStyle+4 ;(word) font family ID for this table ;WidthFSize EQU WidthFID+2 ;(word) font size request that generated this table ;WidthFace EQU WidthFSize+2 ;(word) face request that generated this table ;WidthDevice EQU WidthFace+2 ;(word) device requested WidthScales EQU 1044 ; WidthDevice+2 ;(8 bytes) scale factors requested on input ;WidthAFID EQU WidthScales+8 ;(word) actual font family ID for this table ;WidthFHand EQU WidthAFID+2 ;(long) font family handle for this table ;WidthUsedFam EQU WidthFHand+4 ;(boolean) whether we used fixed point family widths ;WidthAFace EQU WidthUsedFam+1 ;(byte) actual face produced (may differ for styled fonts) ;WidthVOutput EQU WidthAFace+1 ;(word) vertical scale output value ;WidthHOutput EQU WidthVOutput+2 ;(word) horizontal scale output value ;WidthVFactor EQU WidthHOutput+2 ;(word) vertical scale output value ;WidthHFactor EQU WidthVFactor+2 ;(word) horizontal scale output value ;WidthASize EQU WidthHFactor+2 ;(word) actual size of font strike used WidthNFNT EQU 1070 ; WidthASize+2 ;(word) high bit set if strike used is NFNT WidthStrikeID EQU WidthNFNT+2 ;(word) FONT, NFNT or SFNT resource ID WidthHint EQU WidthStrikeID+2 ;(word) index to last used entry in color strike table (unimplemented) WidthDevRes EQU WidthHint+2 ;(word) Output Device Resolution WidthIsSpline EQU WidthDevRes+2 ;(Boolean) non zero means spline exists WidthNotFast EQU WidthIsSpline+1 ;(Boolean) set for the not fast case WidthBadFont EQU WidthNotFast+1 ;(Boolean) Corrupted font flag WidthLoadSpline EQU WidthBadFont+1 ;(Boolean) load a spline? WidthFREEBYTE EQU WidthLoadSpline+1 ;(Boolean) WidthTrans00 EQU WidthFREEBYTE+2 ; x trans WidthTrans11 EQU WidthTrans00+4 ; y trans WidthTrans10 EQU WidthTrans11+4 ; skew KeepSplineOnDisk EQU WidthTrans10+4 ; (word) non-zero means don't load the spline into memory. WidTabSize EQU KeepSplineOnDisk+2 ;total size of a width table. fSplineDirectory EQU WidTabSize ;copy of sfnt directory is appended to end of widthtable ;—————————————————————————————————————————————————————————————————————————————————————————— ;—————————————————————————————————————————————————————————————————————————————————————————— FoutCurStyle EQU $9A9 ;post the current style used here. NumTables EQU 12 FMSwapTrap EQU $101 ;the FMSwapFont trap number for _GetTrapAddr WidListSize EQU NumTables*4 ; FOND format definition FontFamilyRecord Record 0 FONDFlags ds.w 1 ; Flags word for family FONDFamID ds.w 1 ; Family ID number FONDFirst ds.w 1 ; First character in font FONDLast ds.w 1 ; Last character in font FONDAscent ds.w 1 ; Maximum ascent expressed for 1 pt. FONDDescent ds.w 1 ; Maximum descent expressed for 1 pt. FONDLeading ds.w 1 ; Maximum leading expressed for 1 pt. FONDWidMax ds.w 1 ; Maximum width expressed for 1 pt. FONDWTabOff ds.l 1 ; Offset to width table FONDKernOff ds.l 1 ; Offset to kerning table FONDStylOff ds.l 1 ; Offset to style mapping table FONDProperty ds.w 12 ; Style property information FONDAssoc equ * ; Start of font association table EndR FAssocSiz EQU 6 ;size of a font association table entry. ; Synthetic strike table structure ; for each entry: SyntheticStrikeTable Record 0 synStrike ds.l 1 ; Handle to sythesized strike synNFNT ds.w 1 ; High bit set if strike is 'NFNT' synID ds.w 1 ; Resource ID of base 'NFNT' or 'FONT' synFGColor ds.b 6 ; User requested foreground color synBKColor ds.b 6 ; User requested background color synEntry equ * ; Size of synthetic strike table entry EndR