<<>> <> <> <> <> DIRECTORY ImagerDeviceVector USING [ScaledVec], ImagerFont USING [Font, CorrectionType, XChar], ImagerManhattan USING [Polygon], ImagerSample USING [SampleMap], Prop USING [PropList], SF USING [Box, BoxAction, maxBox, Vec, zeroVec]; ImagerMaskCache: CEDAR DEFINITIONS ~ BEGIN XChar: TYPE ~ ImagerFont.XChar; <> Run: TYPE ~ MACHINE DEPENDENT RECORD [fMin: CARD16, lastRun: BOOL, fSize: NAT15]; <> ScaledVec: TYPE ~ ImagerDeviceVector.ScaledVec; CharFlags: TYPE ~ MACHINE DEPENDENT --PACKED-- RECORD [ amplified: BOOL, correction: ImagerFont.CorrectionType, missing: BOOL -- this character was missing from the font ]; CharMask: TYPE ~ REF CharMaskRep; CharMaskRep: TYPE ~ RECORD [ font: ImagerFont.Font, -- font and char together provide a unique identifier for this mask char: ImagerFont.XChar, escapement: ScaledVec, box: SF.Box, flags: CharFlags, data: SELECT rep: * FROM raster => [bits: SEQUENCE length: CARDINAL -- sSize*Ceiling[REAL[fSize]/BITS[WORD]] -- OF WORD], runs => [run: SEQUENCE nRuns: CARDINAL OF Run], culled, maskNotCacheable => [], ENDCASE ]; BitmapFromCharMask: PROC [charMask: CharMask] RETURNS [ImagerSample.SampleMap]; <<>> BoxesFromCharMask: PROC [charMask: CharMask, boxAction: SF.BoxAction, delta: SF.Vec ¬ SF.zeroVec, clip: SF.Box ¬ SF.maxBox]; <<>> RasterCharMaskFromSampleMap: PROC [map: ImagerSample.SampleMap] RETURNS [REF CharMaskRep.raster]; <> RasterCharMaskFromManhattan: PROC [p: ImagerManhattan.Polygon, bb: SF.Box] RETURNS [REF CharMaskRep.raster]; <> RunsCharMaskFromManhattan: PROC [p: ImagerManhattan.Polygon, bb: SF.Box, nRuns: INT] RETURNS [REF CharMaskRep.runs]; <> CountRuns: PROC [p: ImagerManhattan.Polygon] RETURNS [INT]; <> <<>> <> MakeCharMaskProc: TYPE ~ PROC [parameters: Parameters, font: ImagerFont.Font, char: ImagerFont.XChar] RETURNS [CharMask]; CostParameters: TYPE ~ RECORD [slope: REAL, offset: REAL]; <> <<>> Parameters: TYPE ~ REF ParametersRep; <> ParametersRep: TYPE ~ RECORD [ <> sizeLimit: NAT ¬ 4000, <> makeCharMask: MakeCharMaskProc ¬ NIL, -- For font-tuning hooks <> rasterCost: CostParameters ¬ [slope: 1, offset: 0], runsCost: CostParameters ¬ [slope: 1, offset: 0], uncacheableCost: CostParameters ¬ [slope: 0, offset: 2000], <> spotSize: REAL ¬ 1.0, <> sThicken: REAL ¬ 0.0, fThicken: REAL ¬ 0.0, sMinThickness: REAL ¬ 0.0, fMinThickness: REAL ¬ 0.0, sHalfbit: BOOL ¬ FALSE, fHalfbit: BOOL ¬ FALSE, <> propList: Prop.PropList ]; MaskCache: TYPE ~ REF MaskCacheRep; MaskCacheRep: TYPE; Create: PROC [param: ParametersRep ¬ []] RETURNS [MaskCache]; <> Size: PROC [x: MaskCache] RETURNS [NAT]; <> Fetch: PROC [x: MaskCache, font: REF, char: XChar] RETURNS [CharMask]; <> GetParameters: PROC [x: MaskCache] RETURNS [Parameters]; <> UpdateParameters: PROC [x: MaskCache, action: PROC [Parameters]]; <> <> Store: PROC [x: MaskCache, charMask: CharMask]; <> Flush: PROC [x: MaskCache]; <> Launder: PROC [x: MaskCache, keep: PROC [CharMask] RETURNS [BOOL]]; <> GetList: PROC [x: MaskCache] RETURNS [LIST OF CharMask]; <> GetNamedCache: PROC [atom: ATOM] RETURNS [MaskCache]; <> SetNamedCacheParameters: PROC [atom: ATOM, p: ParametersRep]; <> FlushAll: PROC; <> smallCacheSize: NAT ~ 256; SmallCache: TYPE = REF ARRAY [0..smallCacheSize) OF REF CharMaskRep.raster; ObtainSmallCache: PROC [x: MaskCache] RETURNS [SmallCache]; -- might return NIL. ReleaseSmallCache: PROC [x: MaskCache, s: SmallCache]; <> END.