sys7.1-doc-wip/Toolbox/FontMgr/Bass_Cache.h
2019-07-27 22:37:48 +08:00

458 lines
19 KiB
C
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

/*
File: Bass_Cache.h
Contains: This is the main define file for the Bass caching mechanism.
Written by: Charlton E. Lui
Date: May 8, 1988
Revision: 1.0
Copyright: © 1988-1992 by Apple Computer, Inc., all rights reserved.
Change History (most recent first):
<9> 8/28/92 DCL Fixed enums with commas before the closing brace. MPW now
complains.
<8> 5/4/92 DTY There really was a good reason for me to stick fondCache in the
middle of SplineKey, honest! But since I dont remember what it
is, Im moving it to the end of the structure to keep existing
offsets the same.
<7> 11/15/91 DTY Remember which resource map a font was loaded from.
<6> 10/11/91 DTY Building the candidate FOND list takes too long. Cache two lists
in SplineKey.
<5> 9/25/91 jlf Rolled in modifications from Pacific TrueType project:
Added prototypes for routines used by the partial font,
disk caching, and international support routines. Added
typedef for the memory manager purge procedure. Added
fSplineDirectory field to the WidthTable structure - the
spline directory of a TrueType font is now appended to it's
global width table for partial font support. Added
fEncodingTablePointer and fScriptNumber fields to the
sb_CacheHead structure for international support.
<4> 5/23/91 dba take out second copy of ZoneHandleOptions
<3> 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.
<2> 10/22/90 CL (BKR) Adding support for minimum memory mode to band and run in
low cache conditions.
<20> 10/9/90 CL Added support for preflight routine.
<19> 10/8/90 CL Adding loadSpline flag to the widthTable
<18> 10/1/90 CL Adding in memoryPatch vector for memory manager fix on the
growzone.
<17> 9/27/90 CL Made INITIAL_CHAR_COUNT start out smaller and increment cache
increases by a smaller amount.
<16> 9/24/90 CL Added FM data to the cacheheader.
<15> 9/20/90 CL Adding shrink options for the memory calls.
<14> 9/16/90 CL Cleaned up splinekeyRec… Got rid of disk cache defines.
Added in heap defines into splineKey. Added mfExists flag.
Took out old prototypes.
<13> 8/29/90 CL Added cachezone to splinekey
<12> 8/28/90 MR Add bitmapzone to splinekey
<11> 8/20/90 MR Change CacheListHandle to handle of CacheReference {Handle and
zone} and add fsWorkZone. Both changes record the zone a
multiheap object lives in.
<10> 8/1/90 gbm changes here to fix warnings in Bass_Cache.c
<9> 7/18/90 MR Conditionalize typedef of transformMatrix and remove
redeclaration of FMOutput
<8> 7/16/90 CL Adding a vector for after cleaning up the cache.
<7> 6/29/90 CL Doing work…
<7> 6/20/90 CL Added INCREASE_CACHE constant for the caching code.
<6> 5/29/90 CL Took out cache references from the width table.
<5> 5/3/90 CL Added new support for new memory area for scan converter.
and encryption.
<4> 4/10/90 CL Added in support for double byte codes. Work on disk caching.
Fixed retrieval masks.
<3> 3/20/90 CL Adding disk cache… Support for tag format
<2> 2/27/90 CL Added in lots of support for optimizations of DrText.
<1.7> 11/15/89 CEL Moved WidthTabTempHandle up.
<1.6> 11/14/89 CEL Added device metrics. Added squash capabilities.
<1.5> 9/25/89 CEL Added in boolean param for sb_FillWidthTab.
<1.4> 9/15/89 CEL Took out the tempAscent and tempDescent vars in splinekey.
<1.3> 8/28/89 CEL Using transform matrix in widthtable and splinekeyrec instead of
numer and denom.
<1.2> 8/14/89 CEL Added some vars for mfexists & machinetype. These are used for
mem checks. Added in extra handle for temp memory that is not in
system heap. Updated widthtable to include encryption var.
<1.1> 8/1/89 CEL Fixed EASEs “C” comment brackets. On check in they were wrong!
<1.0> 8/1/89 CEL Adding into Bass build for the first time…
<1.5> 6/12/89 CEL Re-Structured sp_Glyph data. Got rid of some unnecessary
constants.
<1.4> 6/12/89 CEL Needed extra check for sfnt state (face)…
<1.3> 5/26/89 CEL Integrated the new Font Scaler 1.0 into Spline Fonts
<1.2> 5/3/89 CEL Comment brackets were previously messed up from override
<•1.1> 5/3/89 CEL All kinks worked out, Blasting in bass files…
<1.0> 5/2/89 CEL Rolling in Bass for first time…
To Do:
*/
/*—————————————————————————————
Expandmem Define
*/
#define EXPAND_MEM_PTR (*(long *) 0x02B6)
#define SPLINE_KEY_HAND (*(sb_SplineKeyHdl **) ((char *)EXPAND_MEM_PTR + 0x0068))
/*—————————————————————————————
WidthListHandle
*/
#define FMOUTPUT_PTR (*(Ptr *) 0x0998)
#define WIDTH_LISTHANDLE (*(Handle **) 0x08E4)
#define WIDTH_TABNUM 12 /* Currently there are 12 width tables. If this should */
/* change then change this also */
#define LASTSPEXTRA 0x0B4C
#define HILITEMODE 0x0938
#define PRESERVE_GLYPH 0x10
/*—————————————————————————————
Resource Manager low mem
*/
#define TopMapHndl (*(long *) 0x0A50) /* topmost map in list [handle] */
#define SysMapHndl (*(long *) 0x0A54) /* system map [handle] */
#define SysMap (*(short *) 0x0A58) /* reference number of system map [word] */
#define CurMap (*(short *) 0x0A5A) /* reference number of current map [word] */
#define UPDATE_RESOURCE_COUNT 20 /* Write resource when number of new entries equal */
/*—————————————————————————————
CDEFS
*/
#ifndef int16
#define int16 short
#endif
#ifndef uint16
#define uint16 unsigned short
#endif
#ifndef int32
#define int32 int
#endif
#ifndef uint32
#define uint32 unsigned long
#endif
#ifndef Fixed
#define Fixed long
#endif
/*—————————————————————————————
MACROS
*/
#define MAKE_EVEN( n ) if ( n & 1 ) n++
#define GetByte( p ) *(((char *)p)++)
#define GetAlignedWord( p ) *(((short *)p)++)
/*—————————————————————————————
Transform struct
*/
#define OBLIQUE_BIT 2
#define OUTLINE_BIT 8
#define SHADOW_BIT 16
#define HEIGHT 3
#define WIDTH 3
#ifndef transformMatrix
typedef struct {
Fixed transform[HEIGHT][WIDTH];
} transformMatrix;
#endif
#define POINTSPERINCH 72
#define INITIAL_BITMAP_SIZE 256
#define MULTI_ZONE_FLAG 0xFFFFFFFF
/*—————————————————————————————
CACHE DEFINES
*/
#define MAX_PPEM_CACHED 127
#define CONTOUR_ENTRY_BIT 0x80000000
#define ERROR_ENTRY_BIT 0xC0000000
#define ENTRY_MASK 0x3FFFFFFF
/*—————————————————————————————
NEW CACHE
*/
#define INITIAL_CACHES 5 /* Amount of allowed caches at once */
#define GROW_CACHE_NUM 5 /* Amount of allowed caches at once */
#define INITIAL_CHAR_COUNT 10 /* Amount of initial characters to alloc for */
#define ADD_CHAR_NUM 10 /* Add the character numbers */
#define INCREASE_CACHE 256 /* Amount to increase cache */
#define GLYPH_COUNT 256 /* Number of possible entries into cache */
#define AVG_CONTOUR_SIZE 400 /* Say 600 bytes for average contour */
#define EMPTY 0 /* Empty cell */
#define ADD_ENTRY_COUNT 128 /* Number of entries to add to cache */
#define SKIP_ENTRY_COUNT 1 /* Number of entries to skip on collision */
#define FULL_ENTRY_PERCENT 60 /* Percentage of entries used in full table */
/*—————————————————————————————————————————————————————————————————————————————————————————
$$$ CHANGE ASSEMBLY IF BELOW IS MODIFIED $$$
For QuickDraw - DrawText.a
*/
typedef struct {
uint16 StrikeID; /* character to blit */
uint16 glyphID; /* Code of Glyph */
uint16 ptSize; /* Size of character */
uint16 destDepth; /* Depth of device */
Boolean clipVert; /* Vertical character clip flag */
Boolean clipHorz; /* Horizontal character clip flag */
int16 botClip; /* bottom clip off baseline */
int16 topClip; /* top clip off baseline */
int16 yMin; /* Y min off baseline */
int16 yMax; /* Y max off baseline */
Fixed lsb; /* Left side bearing */
short devLSB; /* Device Left side bearing */
int16 scan; /* # of scan lines */
int16 bandScan; /* size of band for next band */
int16 nextBotBand; /* next bot character band */
int16 nextTopBand; /* next top character band */
Boolean nextBand; /* Another character band? */
Boolean FILLBYTE; /* */
long entryOffset; /* entry offset */
uint16 bitWidth; /* glyph bit width */
uint32 byteWidth; /* row bytes of character */
uint32 *bitMapPtr; /* Points to the BitMap */
uint32 bufStart; /* Start of destination bits buffer */
} sb_Glyph;
/*—————————————————————————————
$$$ UPDATE THE ASSEMBLY WHEN CHANGING THIS $$$
BitMap Header
*/
typedef struct {
short yMin; /* Y min off baseline to place BitMap */
short yMax; /* Y max off baseline */
long lsb; /* Left side bearing */
short devLSB; /* Device left side bearing */
short adjustTop; /* Adjust this char from ascent */
short rError; /* Error in case of huge size || bad font */
short bitWidth; /* Width of char bits */
long byteWidth; /* number of byte width */
short xMin; /* Save xMin and also use to calc xMax */
short scan; /* # of scan lines */
short scanByteWidth; /* actual need byteWidth for scan converter */
uint16 glyphID; /* id of glyph */
/** DO NOT PLACE ANYTHING AT END, THIS IS DATA TERRITORY **/
long cacheData[]; /* Data starts here */
} sb_GlyphData;
#define GLYPH_HEAD_BYTES ((sizeof(sb_GlyphData) + 3) & ~3)
/*—————————————————————————————
$$$ UPDATE THE ASSEMBLY WHEN CHANGING THIS $$$
CACHE HEADER
*/
typedef struct {
/* Match the font with these */
short StrikeID; /* id of sfnt */
short ptSize; /* point size */
short face; /* style of request */
short newEntries; /* Number of new entries added */
long trans00; /* transform for x */
long trans11; /* transform for y */
long trans10; /* transform for skew */
Fixed ascent; /* Ascent of the font */
Fixed descent; /* Descent of the font */
Fixed widMax; /* Widmax of the Font */
Fixed leading; /* Leading of the Font */
Fixed lOverHMax; /* Left over hang max */
Fixed rOverHMax; /* Right over hang max */
Fixed yMax; /* YMax of the font */
Fixed yMin; /* YMin of the font */
short height; /* Height of the font */
short filler; /* */
Fixed rightItalicSlop; /* Right Italic slop */
Fixed leftItalicSlop; /* Left italic slop */
unsigned char fmAscent; /* FMOutput ascent */
unsigned char fmDescent; /* FMOutput descent */
unsigned char fmWidMax; /* FMOutput widmax */
char fmLeading; /* FMOutput leading */
long addEntryOffset; /* Offset to next spot to add */
char bitsCached; /* Set if bitmaps are cached */
char squashed; /* A squashed cached if true */
short familyID; /* Family id for international checks */
Ptr fEncodingTablePointer; /* pointer to double byte encoding table or nil for single byte scripts */
uint16 fScriptNumber; /* script associated with this cache */
uint16 fLongWordAlign; /* long word align */
uint32 glyphArray[]; /* Array of offsets starts here */
} sb_CacheHead, *sb_CacheHeadPtr, **sb_CacheHeadHdl;
/*—————————————————————————————————————————————————————————————————————————————————————
WIDTH TABLE
*/
typedef struct {
Fixed tabData[256];
Handle tabFont;
long sExtra;
Fixed style;
short fID;
short fSize;
short face;
short device;
Point inNumer;
Point inDenom;
short aFID;
Handle fHand;
unsigned char usedFam;
unsigned char aFace;
short vOutput;
short hOutput;
short vFactor;
short hFactor;
short aSize;
short NFNT;
short StrikeID;
short Hint;
short devRes;
Boolean IsSpline;
Boolean notFast; /* flag of whats cached */
short badFontFlag; /* If the preprogram is corrupt use the missing character */
Boolean loadSpline; /* set if loading splines */
Boolean FREEBYTE; /* */
long trans00; /* transform for x */
long trans11; /* transform for y */
long trans10; /* transform for skew */
short fKeepSplineOnDisk; /* non-zero means don't load the spline into memory */
short fSplineDirectory[]; /* copy of spline directory is appended here */
} widthTable, *widthTablePtr, **widthTableHdl;
/*——————————————————————————————————————————————————————————————————————————————————————————————————
Font Scaler Storage
*/
typedef struct {
long xOffset, yOffset, startPointOffset, endPointOffset, onCurveOffset;
long *workSpacePtr; /* workSpace that will work on */
short contours; /* number of contours */
} splineData;
typedef struct {
Handle cache;
THz zone;
} CacheReference;
typedef enum {
kNoOptions = 0,
kKeepContents = 1
} ZoneHandleOptions;
typedef enum {
noShrink = 0,
doShrink = 1
} ShrinkOptions;
typedef enum {
useApp = 0,
useSys = 1
} whichHeap;
typedef pascal void (*PurgeProcPtr)( Handle purgeableHandle );
/*——————————————————————————————
$$$ WARNING UPDATE. make parallel changes in fontPrivate.a $$$
Memory off Spline Low-Mem
*/
typedef struct {
long callDebug; /* Drop into debugger if set and error */
Ptr vFontCache; /* Dispatch table for QuickDraw caching */
Ptr vFontScaler; /* Dispatch table for Font scaling routines */
Handle bitmapHand; /* Bitmap Handle - Number 5 in Font Scaler */
THz bitmapZone; /* Zone the bitmapHand is allocated in */
CacheReference** cacheListHandle; /* List of Cache Handles */
sb_CacheHeadHdl cacheHand; /* Global cache hand */
THz cacheZone; /* zone for the current cache */
short cachePlace; /* spot where we got the cache */
short fontCount; /* Set to Zero on increment each time a new cache exists */
THz curAppZone; /* current application zone */
Boolean sysFull; /* System is full */
Boolean appFull; /* App is full */
char useHeap; /* which heap to use */
Boolean mfExists; /* flags whether multiFinder exists */
short glyphID; /* last glyph id */
Boolean is32Bit; /* Does 32bit QD exist */
Boolean squashed; /* Current font is squashed */
short StrikeID; /* check if still same sfnt */
short ptSize; /* Check Point Size the same */
short device; /* check Device resolution the same */
short face; /* check Face the same */
long trans00; /* transform for x */
long trans11; /* transform for y */
long trans10; /* transform for skew */
widthTableHdl tempWidthTabHand; /* Used temporarily to get printer widths */
Ptr vGrowZone; /* vector for growzone patch */
short safeCount; /* safe count in case of length overflow */
short EXTRAWORD;
/* ————FONT SCALER MEMORY———— */
Handle fsWorkHand; /* work area for spline data */
THz fsWorkZone; /* heap this guy lives in */
fs_GlyphInputType *inPtr; /* pointer to input struct */
fs_GlyphInfoType *outPtr; /* pointer to info struct */
long inputOffset; /* Constant memory */
long infoOffset; /* Constant memory */
long globalOffset0; /* Constant memory */
long globalOffset1; /* Constant memory */
long globalOffset2; /* Constant memory */
long sfntDataOffset3; /* Variable size memory */
long sfntDataOffset4; /* Variable size memory */
long rowArrayOffset6; /* Variable size memory */
long columnArrayOffset7; /* Variable size memory */
THz fPartialFontZone; /* Zone for partial font fragments */
FragmentTableCacheStructureHandle fFragmentTableCache; /* list of fragment tables */
short fLastSwapFontFamilyID; /* FMInput family ide passed in at last SwapFont call */
Handle fDiskCacheMap; /* handle to disk cache map */
PurgeProcPtr fResourceManagerPurgeProcedure; /* saved resource manager purge procedure */
Boolean fInPurgeProcedure; /* true if currently in purge procedure */
Boolean fFontCacheExists; /* true if the font cache exists */
short lastFontMap; /* Reference number of resource map last font was fetched from */
Handle fondCache[2]; /* Cache for candidate FOND list */
} sb_SplineKey, *sb_SplineKeyPtr, **sb_SplineKeyHdl;
/*——————————————————————————————————————————————————————————————————————————————————————————
Interfaces
*/
#define SB_KILLSOMECACHES 0x0002
#define SB_FILLPRINTER_WIDTHS 0x0003
#define SB_RETRIEVE_GLYPH 0x0004
#define SB_FILL_WIDTHTAB 0x0005
#define SB_SFNTMatchSIZE 0x000d
/*——————————————————————————————————————————————————————————————————————————————————————————
Outside system client calls
*/
/* Private calls */
extern pascal long FillPrinterWidths(Fixed *widthsArrayPtr, Handle sfntHand)
= {0x7000 + SB_FILLPRINTER_WIDTHS,0xA854};
extern pascal long KillSomeCaches( unsigned long startAddr, unsigned long endAddr )
= {0x7000 + SB_KILLSOMECACHES,0xA854};
extern pascal long sb__RetrieveGlyph( widthTableHdl widthTabHand, register sb_Glyph *glyphPtr )
= {0x303C,SB_RETRIEVE_GLYPH,0xA854};
extern pascal long sb__FillWidthTab(widthTableHdl widthTabHand, Boolean fractEnable, Boolean needWidths)
= {0x303C,SB_FILL_WIDTHTAB,0xA854};
extern pascal Boolean sb__SFNTMatchSize(Handle sfntHand, short matchSize)
= {0x303C,SB_SFNTMatchSIZE,0xA854};
long sb_ShrinkCacheToMin(sb_CacheHeadHdl cacheHand, long addEntryOffset);
Handle sb_SizeTheBlock(sb_SplineKeyHdl splineKey, Handle inputH, THz* inputZone, long inputSize, ZoneHandleOptions options, short cachePlace, ShrinkOptions shrinkTest);
void sb_DisposeZoneHandle(Handle h, THz zonePtr);
Handle sb_NewZoneHandle(sb_SplineKeyHdl splineKey, long size, THz* zone);
short IntrinsicStyle(widthTablePtr w);