ref: 63f6a9277db89582f0a247e55e781f8c64871ed0
parent: 604208afc7b6996bbd76a254859ab384319aa1b6
author: Sigrid Solveig Haflínudóttir <sigrid@ftrv.se>
date: Thu Jun 20 16:03:44 EDT 2024
clean up the macro mess
--- a/otf.rkt
+++ b/otf.rkt
@@ -356,28 +356,31 @@
(~a (if (> sh 24) cast "") b "[" index off "]" tail))
(f index bits)))
+(define-for-syntax typenames '())
+
(define-syntax (mktype stx)
(syntax-parse stx
- [(_ typ:id bits c:id verb:string)
- #'(begin
- (define parse (autoparse bits `c))
- (mktype typ bits c verb parse))]
+ [(_ typ:id bits c:id verb:string) #'(mktype typ bits c verb (autoparse bits `c))]
[(_ typ:id bits c:id verb:string parse:expr)
#:declare bits (expr/c #'size-in-bits/c #:name "size in bits")
- #'(begin
- (define typ (make-type `typ bits.c `c verb parse))
- (set! types (append types (list typ))))]))
+ (begin
+ (set! typenames (cons (syntax-e #`typ) typenames))
+ #'(begin
+ (define typ (make-type `typ bits.c `c verb parse))
+ (set! types (append types (list typ)))))]))
(define-syntax (mkcmplx stx)
(syntax-parse stx
- [(_ typ:id fields:expr (~optional (~seq #:tag tag)) (~optional (~seq #:extra extra:expr)))
+ [(_ typ:id fields:expr ...+ (~optional (~seq #:tag tag)) (~optional (~seq #:extra extra:expr)))
#:declare tag (expr/c #'tag/c #:name "table tag")
- #'(begin
- (define tag- (~? (~@ tag.c) #f))
- (define typ (make-cmplx `typ fields tag- (~? (~@ extra) empty)))
- (set! cmplxs (append cmplxs (list typ)))
- (when tag-
- (set! tagged (append tagged (list typ)))))]))
+ (begin
+ (set! typenames (cons (syntax-e #`typ) typenames))
+ #'(begin
+ (define tag- (~? (~@ tag.c) #f))
+ (define typ (make-cmplx `typ (mkfields [~@ fields] ...) tag- (~? (~@ extra) empty)))
+ (set! cmplxs (append cmplxs (list typ)))
+ (when tag-
+ (set! tagged (append tagged (list typ))))))]))
(mktype uint8 8 u8int "%ud")
(mktype int8 8 s8int "%d")
@@ -425,61 +428,62 @@
(define-for-syntax fields '())
(define-syntax (mkattr stx)
+ (define-syntax-class compop
+ #:description "comparison operator"
+ (pattern op:id
+ #:when (member (syntax-e #'op) '(== != < > <= >=))))
+
+ (define-syntax-class arithop
+ #:description "arithmetical operator"
+ (pattern op:id
+ #:when (member (syntax-e #'op) '(+ - / *))))
+
+ (define-syntax-class ref
+ #:description "field reference"
+ (pattern ref:id
+ #:fail-when (not (assoc (syntax-e #'ref) fields)) "no such field"
+ #:with type (cadr (assoc (syntax-e #'ref) fields))))
+
(syntax-parse stx
- [(_ _ ({~literal at} ref:id))- (let ([rf (assoc (syntax->datum #`ref) fields)])
- (begin
- (when (not rf)
- (raise-syntax-error #f "no such field" stx #'ref))
- (when (not (type-offset? (cadr rf)))
- (raise-syntax-error #f (~a (cadr rf) " can't be used as an offset") stx #'ref))
- #''(at ref)))]
- [(_ _ (n:number)) #''(count n)]
+ [(_ _ ({~literal at} ref:ref))+ #:fail-when (not (type-offset? (syntax-e #'ref.type))) "can't be used as an offset"
+ #''(at ref)]
[(_ type {~literal hex})- (begin
- (when (not (type-number? (syntax->datum #`type)))
- (raise-syntax-error #f "not a number type" stx #'type))
- #''(verb "%#ux"))]
- [(_ type (p:expr vs:number ...+))
- (begin
- (when (not (type-comparable? (syntax->datum #`type)))
- (raise-syntax-error #f "type can't be used in a comparison" stx #'type))
- #''(test p vs ...))]
- [(_ _ (p:expr ref:id vs:number ...+))
- (begin
- (when (not (assoc (syntax->datum #`ref) fields))
- (raise-syntax-error #f "no such field" stx #'ref))
- #''(cond
- p
- ref
- vs ...))]
- [(_ _ ({~literal count} n:id))- (begin
- (define counter (assoc (syntax->datum #`n) fields))
- (cond
- [(pair? counter)
- (if (type-index? (cadr counter))
- #''(count n)
- (raise-syntax-error #f
- (~a "type " (cadr counter) " can't be used as index to the array")
- stx
- #'n))]
- [else (raise-syntax-error #f "no such field" stx #'n)]))]
- [(_ _ ({~literal count} e:expr)) #''(count e)] ; FIXME - check fields and ops/numbers- [(_ _ {~literal unused}) #''(unused #t)]))+ #:fail-when (not (type-number? (syntax-e #'type))) "not a number type"
+ #''(verb "%#ux")]
+ [(_ type (p:compop vs:number ...+))
+ #:fail-when (not (type-comparable? (syntax-e #'type))) "type can't be used in a comparison"
+ #''(test p vs ...)]
+ [(_ _ (p:compop ref:ref vs:number ...+))
+ #''(cond
+ p
+ ref
+ vs ...)]
+ [(_ _ {~literal unused}) #''(unused #t)]+ [(_ _ (ref:ref))
+ #:fail-when (not (type-index? (syntax-e #'ref.type))) "can't be used as index to an array"
+ #''(count ref)]
+ [(_ _ (n:number)) #''(count n)]
+ [(_ _ (p:arithop e:expr ...+)) #''(count (p e ...))])) ; FIXME - check fields and ops/numbers
(define-syntax (mkfield stx)
+ (define-syntax-class name
+ #:description "field name"
+ (pattern name:id
+ #:fail-when (assoc (syntax-e #'name) fields) "duplicate field name"))
+
+ (define-syntax-class type
+ #:description "field type"
+ (pattern type:id
+ #:fail-when (not (member (syntax-e #'type) typenames)) "unknown field type"))
+
(syntax-parse stx
- [(_ type:id name:id attrs ...)
+ [(_ type:type name:name attrs ...)
(begin
- (let ([f #'(field type
- `name
- (list (mkattr type [~@ attrs]) ...))])
- (begin
- (when (assoc (syntax->datum #`name) fields)
- (raise-syntax-error #f "duplicate field" stx #'name))
- (set! fields (cons (syntax->datum #'(name type)) fields))
- f)))]))
+ (set! fields (cons (syntax->datum #'(name type)) fields))
+ #'(field type
+ `name
+ (list (mkattr type [~@ attrs]) ...)))]))
(define-syntax (mkfields stx)
(syntax-parse stx
@@ -488,590 +492,580 @@
(set! fields '())
#'(list (mkfield [~@ . x]) ...))]))
-(mkcmplx SubHeader
- (mkfields {uint16 firstCode} {uint16 entryCode} {int16 idDelta} {uint16 idRangeOffset}))+(mkcmplx SubHeader {uint16 firstCode} {uint16 entryCode} {int16 idDelta} {uint16 idRangeOffset}); same type for Sequential and Constant
-(mkcmplx MapGroup (mkfields {uint32 startCharCode} {uint32 endCharCode} {uint32 startGlyphID}))+(mkcmplx MapGroup {uint32 startCharCode} {uint32 endCharCode} {uint32 startGlyphID})-(mkcmplx SubtableCmap0 (mkfields {uint16 length} {uint16 language} {uint8 glyphIdArray [256]}))+(mkcmplx SubtableCmap0 {uint16 length} {uint16 language} {uint8 glyphIdArray [256]}); FIXME
-(mkcmplx SubtableCmap2 (mkfields {uint16 length} {uint16 language} {uint16 subHeaderKeys [256]}))-#| {SubHeader subHeaders (count ?)}- {uint16 glyphIdArray (count ?)}))|#+(mkcmplx SubtableCmap2 {uint16 length} {uint16 language} {uint16 subHeaderKeys [256]})+#| {SubHeader subHeaders[?]}+ {uint16 glyphIdArray[?]}))|#; FIXME
(mkcmplx SubtableCmap4
- (mkfields {uint16 length}- {uint16 language}- {uint16 segCountX2}- {uint16 searchRange}- {uint16 entrySelector}- {uint16 rangeShift}- {uint16 endCode (count (/ segCountX2 2))}- {uint16 reservedPad unused}- {uint16 startCode (count (/ segCountX2 2))}- {int16 idDelta (count (/ segCountX2 2))}- {int16 idRangeOffset (count (/ segCountX2 2))}- #;{uint16 glyphIdArray (count ?)}))+ {uint16 length}+ {uint16 language}+ {uint16 segCountX2}+ {uint16 searchRange}+ {uint16 entrySelector}+ {uint16 rangeShift}+ {uint16 endCode [/ segCountX2 2]}+ {uint16 reservedPad unused}+ {uint16 startCode [/ segCountX2 2]}+ {int16 idDelta [/ segCountX2 2]}+ {int16 idRangeOffset [/ segCountX2 2]}+ #;{uint16 glyphIdArray [?]})(mkcmplx SubtableCmap6
- (mkfields {uint16 length}- {uint16 language}- {uint16 firstCode}- {uint16 entryCount}- {uint16 glyphIdArray (count entryCount)}))+ {uint16 length}+ {uint16 language}+ {uint16 firstCode}+ {uint16 entryCount}+ {uint16 glyphIdArray [entryCount]})(mkcmplx SubtableCmap8
- (mkfields {uint16 length}- {uint16 language}- {uint8 is32 [8192]}- {uint32 numGroups}- {MapGroup groups (count numGroups)}))+ {uint16 length}+ {uint16 language}+ {uint8 is32 [8192]}+ {uint32 numGroups}+ {MapGroup groups [numGroups]}); FIXME
(mkcmplx SubtableCmap10
- (mkfields {uint16 reserved}- {uint32 length}- {uint32 language}- {uint32 startCharCode}- {uint32 numChars}- #;{uint16 glyphIdArray (count ?)}))+ {uint16 reserved}+ {uint32 length}+ {uint32 language}+ {uint32 startCharCode}+ {uint32 numChars}+ #;{uint16 glyphIdArray [?]})(mkcmplx SubtableCmap12or13
- (mkfields {uint16 reserved}- {uint32 length}- {uint32 language}- {uint32 numGroups}- {MapGroup groups (count numGroups)}))+ {uint16 reserved}+ {uint32 length}+ {uint32 language}+ {uint32 numGroups}+ {MapGroup groups [numGroups]})-(mkcmplx UnicodeRange (mkfields {uint24 startUnicodeValue} {uint8 additionalCount}))+(mkcmplx UnicodeRange {uint24 startUnicodeValue} {uint8 additionalCount})-(mkcmplx DefaultUVS
- (mkfields {uint32 numUnicodeValueRanges}- {UnicodeRange ranges (count numUnicodeValueRanges)}))+(mkcmplx DefaultUVS {uint32 numUnicodeValueRanges} {UnicodeRange ranges [numUnicodeValueRanges]})-(mkcmplx UVSMapping (mkfields {uint24 unicodeValue} {uint16 glyphID}))+(mkcmplx UVSMapping {uint24 unicodeValue} {uint16 glyphID})-(mkcmplx NonDefaultUVS
- (mkfields {uint32 numUVSMappings} {UVSMapping uvsMappings (count numUVSMappings)}))+(mkcmplx NonDefaultUVS {uint32 numUVSMappings} {UVSMapping uvsMappings [numUVSMappings]})(mkcmplx VariationSelector
- (mkfields {uint24 varSelector}- {Offset32 defaultUVSOffset}- {Offset32 nonDefaultUVSOffset}- {DefaultUVS defaultUVS (at defaultUVSOffset)}- {NonDefaultUVS nonDefaultUVS (at nonDefaultUVSOffset)}))+ {uint24 varSelector}+ {Offset32 defaultUVSOffset}+ {Offset32 nonDefaultUVSOffset}+ {DefaultUVS defaultUVS (at defaultUVSOffset)}+ {NonDefaultUVS nonDefaultUVS (at nonDefaultUVSOffset)})(mkcmplx SubtableCmap14
- (mkfields {uint32 length}- {uint32 numVarSelectorRecords}- {VariationSelector varSelector (count numVarSelectorRecords)}))+ {uint32 length}+ {uint32 numVarSelectorRecords}+ {VariationSelector varSelector [numVarSelectorRecords]})(mkcmplx SubtableCmap
- (mkfields {uint16 format (== 0 2 4 6 8 10 12 13 14)}- ; FIXME these fields should be put into a union automatically
- {SubtableCmap0 sub0 (== format 0)}- {SubtableCmap2 sub2 (== format 2)}- {SubtableCmap4 sub4 (== format 4)}- {SubtableCmap6 sub6 (== format 6)}- {SubtableCmap8 sub8 (== format 8)}- {SubtableCmap10 sub10 (== format 10)}- {SubtableCmap12or13 sub12or13 (== format 12 13)}- {SubtableCmap14 sub14 (== format 14)}))+ {uint16 format (== 0 2 4 6 8 10 12 13 14)}+ ; FIXME these fields should be put into a union automatically
+ {SubtableCmap0 sub0 (== format 0)}+ {SubtableCmap2 sub2 (== format 2)}+ {SubtableCmap4 sub4 (== format 4)}+ {SubtableCmap6 sub6 (== format 6)}+ {SubtableCmap8 sub8 (== format 8)}+ {SubtableCmap10 sub10 (== format 10)}+ {SubtableCmap12or13 sub12or13 (== format 12 13)}+ {SubtableCmap14 sub14 (== format 14)})(mkcmplx EncodingRecord
- (mkfields {uint16 platformID (<= 4)}- {uint16 encodingID}- {Offset32 subtableOffset}- {SubtableCmap subtable (at subtableOffset)}))+ {uint16 platformID (<= 4)}+ {uint16 encodingID}+ {Offset32 subtableOffset}+ {SubtableCmap subtable (at subtableOffset)})(mkcmplx TableCmap
- (mkfields {uint16 version unused (== 0)}- {uint16 numTables}- {EncodingRecord encodingRecords (count numTables)})+ {uint16 version unused (== 0)}+ {uint16 numTables}+ {EncodingRecord encodingRecords [numTables]}#:tag "cmap")
(mkcmplx TableHead
- (mkfields {uint16 majorVersion unused (== 1)}- {uint16 minorVersion unused (== 0)}- {Fixed fontRevision unused}- {uint32 checksumAdjustment unused}- {uint32 magicNumber unused (== #x5f0f3cf5)}- {uint16 flags}- {uint16 unitsPerEm (>= 16) (<= 16384)}- {LONGDATETIME created}- {LONGDATETIME modified}- {int16 xMin}- {int16 yMin}- {int16 xMax}- {int16 yMax}- {uint16 macStyle}- {uint16 lowestRecPPEM}- {int16 fontDirectionHint unused (>= -2) (<= 2)}- {int16 indexToLocFormat (<= 1)}- {int16 glyphDataFormat unused (== 0)})+ {uint16 majorVersion unused (== 1)}+ {uint16 minorVersion unused (== 0)}+ {Fixed fontRevision unused}+ {uint32 checksumAdjustment unused}+ {uint32 magicNumber unused (== #x5f0f3cf5)}+ {uint16 flags}+ {uint16 unitsPerEm (>= 16) (<= 16384)}+ {LONGDATETIME created}+ {LONGDATETIME modified}+ {int16 xMin}+ {int16 yMin}+ {int16 xMax}+ {int16 yMax}+ {uint16 macStyle}+ {uint16 lowestRecPPEM}+ {int16 fontDirectionHint unused (>= -2) (<= 2)}+ {int16 indexToLocFormat (<= 1)}+ {int16 glyphDataFormat unused (== 0)}#:tag "head")
(mkcmplx TableHhea
- (mkfields {uint16 majorVersion (== 1)}- {uint16 minorVersion (== 0)}- {FWORD ascender}- {FWORD descender}- {FWORD lineGap}- {UFWORD advanceWidthMax}- {FWORD minLeftSideBearing}- {FWORD minRightSideBearing}- {FWORD xMaxExtent}- {int16 caretSlopeRise}- {int16 caretSlopeRun}- {int16 caretOffset}- {int16 reserved [4] unused}- {int16 metricDataFormat (== 0)}- {uint16 numberOfHMetrics})+ {uint16 majorVersion (== 1)}+ {uint16 minorVersion (== 0)}+ {FWORD ascender}+ {FWORD descender}+ {FWORD lineGap}+ {UFWORD advanceWidthMax}+ {FWORD minLeftSideBearing}+ {FWORD minRightSideBearing}+ {FWORD xMaxExtent}+ {int16 caretSlopeRise}+ {int16 caretSlopeRun}+ {int16 caretOffset}+ {int16 reserved [4] unused}+ {int16 metricDataFormat (== 0)}+ {uint16 numberOfHMetrics}#:tag "hhea")
-(mkcmplx LongHorMetric (mkfields {UFWORD advanceWidth} {FWORD lsb}))+(mkcmplx LongHorMetric {UFWORD advanceWidth} {FWORD lsb})#|
FIXME what. WHAT.
(mkcmplx TableHmtx
- (mkfields {LongHorMetric hMetrics (count (TableHhea numberOfHMetrics))}- {FWORD leftSideBearings (count (- (TableMaxp numGlyphs) (TableHhea numberOfHMetrics)))}))+ {LongHorMetric hMetrics[TableHhea numberOfHMetrics]}+ {FWORD leftSideBearings[- (TableMaxp numGlyphs) (TableHhea numberOfHMetrics)]})|#
(mkcmplx TableMaxp
- (mkfields {Version16Dot16 version (== #x05000 #x10000) unused}- {uint16 numGlyphs}- ; a bunch of fields ignored here
- )
+ {Version16Dot16 version (== #x05000 #x10000) unused}+ {uint16 numGlyphs}+ ; a bunch of fields ignored here
#:tag "maxp")
(mkcmplx TablePost
- (mkfields {Version16Dot16 version (== #x10000 #x20000 #x25000 #x30000) unused}- {Fixed italicAngle}- {FWORD underlinePosition}- {FWORD underlineThickness}- {uint32 isFixedPitch}- ; a bunch of fields ignored here
- )
+ {Version16Dot16 version (== #x10000 #x20000 #x25000 #x30000) unused}+ {Fixed italicAngle}+ {FWORD underlinePosition}+ {FWORD underlineThickness}+ {uint32 isFixedPitch}+ ; a bunch of fields ignored here
#:tag "post")
(mkcmplx NameRecord
- (mkfields {uint16 platformID}- {uint16 encodingID}- {uint16 languageID}- {uint16 nameID}- {uint16 length}- {Offset16 stringOffset}))+ {uint16 platformID}+ {uint16 encodingID}+ {uint16 languageID}+ {uint16 nameID}+ {uint16 length}+ {Offset16 stringOffset})-(mkcmplx LangTagRecord (mkfields {uint16 length} {Offset16 langTagOffset}))+(mkcmplx LangTagRecord {uint16 length} {Offset16 langTagOffset})(mkcmplx TableName
- (mkfields {uint16 version (== 0 1)}- {uint16 count}- {Offset16 storageOffset}- {NameRecord nameRecord (count count)}- {uint16 langTagCount (>= version 1)}- {LangTagRecord langTagRecord (count langTagCount) (>= version 1)})+ {uint16 version (== 0 1)}+ {uint16 count}+ {Offset16 storageOffset}+ {NameRecord nameRecord [count]}+ {uint16 langTagCount (>= version 1)}+ {LangTagRecord langTagRecord [langTagCount] (>= version 1)}#:tag "name")
(mkcmplx BigGlyphMetrics
- (mkfields {uint8 height}- {uint8 width}- {int8 horiBearingX}- {int8 horiBearingY}- {uint8 horiAdvance}- {int8 vertBearingX}- {int8 vertBearingY}- {uint8 vertAdvance}))+ {uint8 height}+ {uint8 width}+ {int8 horiBearingX}+ {int8 horiBearingY}+ {uint8 horiAdvance}+ {int8 vertBearingX}+ {int8 vertBearingY}+ {uint8 vertAdvance})(mkcmplx SmallGlyphMetrics
- (mkfields {uint8 height} {uint8 width} {int8 bearingX} {int8 bearingY} {uint8 advance}))+ {uint8 height}+ {uint8 width}+ {int8 bearingX}+ {int8 bearingY}+ {uint8 advance})(mkcmplx SbitLineMetrics
- (mkfields {int8 ascender}- {int8 descender}- {uint8 widthMax}- {int8 caretSlopeNumerator}- {int8 caretSlopeDenumerator}- {int8 caretOffset}- {int8 minOriginSB}- {int8 minAdvanceSB}- {int8 maxBeforeBL}- {int8 minAfterBL}- {int8 pad [2] unused}))+ {int8 ascender}+ {int8 descender}+ {uint8 widthMax}+ {int8 caretSlopeNumerator}+ {int8 caretSlopeDenumerator}+ {int8 caretOffset}+ {int8 minOriginSB}+ {int8 minAdvanceSB}+ {int8 maxBeforeBL}+ {int8 minAfterBL}+ {int8 pad [2] unused})-(mkcmplx IndexSubtable1
- (mkfields {Offset32 sbitOffsets} #;(count (+ (- lastGlyphIndex firstGlyphIndex) 2))))+(mkcmplx IndexSubtable1 {Offset32 sbitOffsets} #;[+ (- lastGlyphIndex firstGlyphIndex) 2])-(mkcmplx IndexSubtable2 (mkfields {uint32 imageSize} {BigGlyphMetrics bigMetrics}))+(mkcmplx IndexSubtable2 {uint32 imageSize} {BigGlyphMetrics bigMetrics}); FIXME
-(mkcmplx IndexSubtable3
- (mkfields {Offset16 sbitOffsets} #;(count (+ (- lastGlyphIndex firstGlyphIndex) 2))))+(mkcmplx IndexSubtable3 {Offset16 sbitOffsets} #;[+ (- lastGlyphIndex firstGlyphIndex) 2])-(mkcmplx GlyphIdOffsetPair (mkfields {uint16 glyphID} {Offset16 sbitOffset}))+(mkcmplx GlyphIdOffsetPair {uint16 glyphID} {Offset16 sbitOffset})-(mkcmplx IndexSubtable4
- (mkfields {uint32 numGlyphs} {GlyphIdOffsetPair glyphArray (count (+ numGlyphs 1))}))+(mkcmplx IndexSubtable4 {uint32 numGlyphs} {GlyphIdOffsetPair glyphArray [+ numGlyphs 1]})(mkcmplx IndexSubtable5
- (mkfields {uint32 imageSize}- {BigGlyphMetrics bigMetrics}- {uint32 numGlyphs}- {uint16 glyphIdArray (count numGlyphs)}))+ {uint32 imageSize}+ {BigGlyphMetrics bigMetrics}+ {uint32 numGlyphs}+ {uint16 glyphIdArray [numGlyphs]})(mkcmplx IndexSubtable
- (mkfields {uint16 indexFormat (>= 1) (<= 5)}- {uint16 imageFormat}- {Offset32 imageDataOffset}- {IndexSubtable1 sub1 (== indexFormat 1)}- {IndexSubtable2 sub2 (== indexFormat 2)}- {IndexSubtable3 sub3 (== indexFormat 3)}- {IndexSubtable4 sub4 (== indexFormat 4)}- {IndexSubtable5 sub5 (== indexFormat 5)}))+ {uint16 indexFormat (>= 1) (<= 5)}+ {uint16 imageFormat}+ {Offset32 imageDataOffset}+ {IndexSubtable1 sub1 (== indexFormat 1)}+ {IndexSubtable2 sub2 (== indexFormat 2)}+ {IndexSubtable3 sub3 (== indexFormat 3)}+ {IndexSubtable4 sub4 (== indexFormat 4)}+ {IndexSubtable5 sub5 (== indexFormat 5)})(mkcmplx IndexSubtableRecord
- (mkfields {uint16 firstGlyphIndex}- {uint16 lastGlyphIndex}- {Offset32 indexSubtableOffset}- {IndexSubtable indexSubtable (at indexSubtableOffset)}))+ {uint16 firstGlyphIndex}+ {uint16 lastGlyphIndex}+ {Offset32 indexSubtableOffset}+ {IndexSubtable indexSubtable (at indexSubtableOffset)})-(mkcmplx BitmapSize
- (mkfields {Offset32 indexSubtableListOffset}- {uint32 indexSubtableListSize}- {uint32 numberOfIndexSubtables}- {uint32 colorRef unused}- {SbitLineMetrics hori}- {SbitLineMetrics vert}- {uint16 startGlyphIndex}- {uint16 endGlyphIndex}- {uint8 ppemX}- {uint8 ppemY}- {uint8 bitDepth}- {int8 flags}- {IndexSubtableRecord- indexSubtableList
- (count numberOfIndexSubtables)
- (at indexSubtableListOffset)}))
+(mkcmplx
+ BitmapSize
+ {Offset32 indexSubtableListOffset}+ {uint32 indexSubtableListSize}+ {uint32 numberOfIndexSubtables}+ {uint32 colorRef unused}+ {SbitLineMetrics hori}+ {SbitLineMetrics vert}+ {uint16 startGlyphIndex}+ {uint16 endGlyphIndex}+ {uint8 ppemX}+ {uint8 ppemY}+ {uint8 bitDepth}+ {int8 flags}+ {IndexSubtableRecord indexSubtableList [numberOfIndexSubtables] (at indexSubtableListOffset)})-(mkcmplx TableEBDT
- (mkfields {uint16 majorVersion (== 2)} {uint16 minorVersion (== 0) unused})- #:tag "EBDT")
+(mkcmplx TableEBDT {uint16 majorVersion (== 2)} {uint16 minorVersion (== 0) unused} #:tag "EBDT")(mkcmplx TableEBLC
- (mkfields {uint16 majorVersion (== 2) unused}- {uint16 minorVersion (== 0) unused}- {uint32 numSizes}- {BitmapSize bitmapSizes (count numSizes)})+ {uint16 majorVersion (== 2) unused}+ {uint16 minorVersion (== 0) unused}+ {uint32 numSizes}+ {BitmapSize bitmapSizes [numSizes]}#:tag "EBLC")
(mkcmplx AttachList
- (mkfields {Offset16 coverageOffset}- {uint16 glyphCount}- {Offset16 attachPointOffsets (count glyphCount)}))+ {Offset16 coverageOffset}+ {uint16 glyphCount}+ {Offset16 attachPointOffsets [glyphCount]})-(mkcmplx AttachPoint (mkfields {uint16 pointCount} {uint16 pointIndices (count pointCount)}))+(mkcmplx AttachPoint {uint16 pointCount} {uint16 pointIndices [pointCount]})(mkcmplx LigCaretList
- (mkfields {Offset16 coverageOffset}- {uint16 ligGlyphCount}- {Offset16 ligGlyphOffsets (count ligGlyphCount)}))+ {Offset16 coverageOffset}+ {uint16 ligGlyphCount}+ {Offset16 ligGlyphOffsets [ligGlyphCount]})-(mkcmplx LigGlyph (mkfields {uint16 caretCount} {Offset16 caretValueOffsets (count caretCount)}))+(mkcmplx LigGlyph {uint16 caretCount} {Offset16 caretValueOffsets [caretCount]})(mkcmplx CaretValue
- (mkfields {uint16 format (>= 1) (<= 3)}- {int16 coordinate (== format 1 3)}- {uint16 caretValuePointIndex (== format 2)}- {Offset16 deviceOffset (== format 3)}))+ {uint16 format (>= 1) (<= 3)}+ {int16 coordinate (== format 1 3)}+ {uint16 caretValuePointIndex (== format 2)}+ {Offset16 deviceOffset (== format 3)})(mkcmplx ValueRecord
- (mkfields {int16 xPlacement}- {int16 yPlacement}- {int16 xAdvance}- {int16 yAdvance}- {Offset16 xPlaDeviceOffset}- {Offset16 yPlaDeviceOffset}- {Offset16 xAdvDeviceOffset}- {Offset16 yAdvDeviceOffset}))+ {int16 xPlacement}+ {int16 yPlacement}+ {int16 xAdvance}+ {int16 yAdvance}+ {Offset16 xPlaDeviceOffset}+ {Offset16 yPlaDeviceOffset}+ {Offset16 xAdvDeviceOffset}+ {Offset16 yAdvDeviceOffset})(mkcmplx SinglePos
- (mkfields {uint16 format (== 1 2)}- {Offset16 coverageOffset}- {uint16 valueFormat}- {ValueRecord valueRecord (== format 1)}- {uint16 valueCount (== format 2)}- {ValueRecord valueRecords (== format 2) (count valueCount)}))+ {uint16 format (== 1 2)}+ {Offset16 coverageOffset}+ {uint16 valueFormat}+ {ValueRecord valueRecord (== format 1)}+ {uint16 valueCount (== format 2)}+ {ValueRecord valueRecords [valueCount] (== format 2)})(mkcmplx TableGDEF
- (mkfields {uint16 majorVersion (== 1) unused}- {uint16 minorVersion (== 0 2 3)}- {Offset16 glyphClassDefOffset}- {Offset16 attachListOffset}- {Offset16 ligCaretListOffset}- {Offset16 markAttachClassDefOffset}- {Offset16 markGlyphSetsDefOffset (>= minorVersion 2)}- {Offset32 itemVarStoreOffset (>= minorVersion 3)})+ {uint16 majorVersion (== 1) unused}+ {uint16 minorVersion (== 0 2 3)}+ {Offset16 glyphClassDefOffset}+ {Offset16 attachListOffset}+ {Offset16 ligCaretListOffset}+ {Offset16 markAttachClassDefOffset}+ {Offset16 markGlyphSetsDefOffset (>= minorVersion 2)}+ {Offset32 itemVarStoreOffset (>= minorVersion 3)}#:tag "GDEF")
(mkcmplx LangSys
- (mkfields {Offset16 lookupOrderOffset unused}- {uint16 requiredFeatureIndex}- {uint16 featureIndexCount}- {uint16 featureIndices (count featureIndexCount)}))+ {Offset16 lookupOrderOffset unused}+ {uint16 requiredFeatureIndex}+ {uint16 featureIndexCount}+ {uint16 featureIndices [featureIndexCount]})-(mkcmplx LangSysRecord
- (mkfields {Tag langSysTag} {Offset16 langSysOffset} {LangSys langSys (at langSysOffset)}))+(mkcmplx LangSysRecord {Tag langSysTag} {Offset16 langSysOffset} {LangSys langSys (at langSysOffset)})(mkcmplx Script
- (mkfields {Offset16 defaultLangSysOffset}- {uint16 langSysCount}- {LangSysRecord langSysRecords (count langSysCount)}- {LangSys defaultLangSys (at defaultLangSysOffset)}))+ {Offset16 defaultLangSysOffset}+ {uint16 langSysCount}+ {LangSysRecord langSysRecords [langSysCount]}+ {LangSys defaultLangSys (at defaultLangSysOffset)})-(mkcmplx ScriptRecord
- (mkfields {Tag scriptTag} {Offset16 scriptOffset} {Script script (at scriptOffset)}))+(mkcmplx ScriptRecord {Tag scriptTag} {Offset16 scriptOffset} {Script script (at scriptOffset)})-(mkcmplx ScriptList (mkfields {uint16 scriptCount} {ScriptRecord scriptRecords (count scriptCount)}))+(mkcmplx ScriptList {uint16 scriptCount} {ScriptRecord scriptRecords [scriptCount]})(mkcmplx Feature
- (mkfields {Offset16 featureParamsOffset}- {uint16 lookupIndexCount}- {uint16 lookupListIndices (count lookupIndexCount)}))+ {Offset16 featureParamsOffset}+ {uint16 lookupIndexCount}+ {uint16 lookupListIndices [lookupIndexCount]})-(mkcmplx FeatureRecord
- (mkfields {Tag featureTag} {Offset16 featureOffset} {Feature feature (at featureOffset)}))+(mkcmplx FeatureRecord {Tag featureTag} {Offset16 featureOffset} {Feature feature (at featureOffset)})-(mkcmplx FeatureList
- (mkfields {uint16 featureCount} {FeatureRecord featureRecords (count featureCount)}))+(mkcmplx FeatureList {uint16 featureCount} {FeatureRecord featureRecords [featureCount]})(mkcmplx Lookup
- (mkfields {uint16 lookupType}- {uint16 lookupFlag}- {uint16 subTableCount}- {Offset16 subtableOffsets (count subTableCount)}- {uint16 markFilteringSet}))+ {uint16 lookupType}+ {uint16 lookupFlag}+ {uint16 subTableCount}+ {Offset16 subtableOffsets [subTableCount]}+ {uint16 markFilteringSet})-(mkcmplx LookupList (mkfields {uint16 lookupCount} {Offset16 lookupOffsets (count lookupCount)}))+(mkcmplx LookupList {uint16 lookupCount} {Offset16 lookupOffsets [lookupCount]})(mkcmplx TableGPOS
- (mkfields {uint16 majorVersion (== 1) unused}- {uint16 minorVersion (<= 1)}- {Offset16 scriptListOffset}- {Offset16 featureListOffset}- {Offset16 lookupListOffset}- {Offset32 featureVariationsOffset (== minorVersion 1)}- {ScriptList scriptList (at scriptListOffset)}- {FeatureList featureList (at featureListOffset)}- {LookupList lookupList (at lookupListOffset)})+ {uint16 majorVersion (== 1) unused}+ {uint16 minorVersion (<= 1)}+ {Offset16 scriptListOffset}+ {Offset16 featureListOffset}+ {Offset16 lookupListOffset}+ {Offset32 featureVariationsOffset (== minorVersion 1)}+ {ScriptList scriptList (at scriptListOffset)}+ {FeatureList featureList (at featureListOffset)}+ {LookupList lookupList (at lookupListOffset)}#:tag "GPOS")
(mkcmplx TableGSUB
- (mkfields {uint16 majorVersion (== 1) unused}- {uint16 minorVersion (<= 1)}- {Offset16 scriptListOffset}- {Offset16 featureListOffset}- {Offset16 lookupListOffset}- {Offset32 featureVariationsOffset (== minorVersion 1)}- {ScriptList scriptList (at scriptListOffset)}- {FeatureList featureList (at featureListOffset)})+ {uint16 majorVersion (== 1) unused}+ {uint16 minorVersion (<= 1)}+ {Offset16 scriptListOffset}+ {Offset16 featureListOffset}+ {Offset16 lookupListOffset}+ {Offset32 featureVariationsOffset (== minorVersion 1)}+ {ScriptList scriptList (at scriptListOffset)}+ {FeatureList featureList (at featureListOffset)}#:tag "GSUB")
-(mkcmplx MathValueRecord (mkfields {FWORD value} {Offset16 deviceOffset}))+(mkcmplx MathValueRecord {FWORD value} {Offset16 deviceOffset})(mkcmplx MathConstants
- (mkfields {int16 scriptPercentScaleDown}- {int16 scriptScriptPercentScaleDown}- {UFWORD delimitedSubFormulaMinHeight}- {UFWORD displayOperatorMinHeight}- {MathValueRecord mathLeading}- {MathValueRecord axisHeight}- {MathValueRecord accentBaseHeight}- {MathValueRecord flattenedAccentBaseHeight}- {MathValueRecord subscriptShiftDown}- {MathValueRecord subscriptTopMax}- {MathValueRecord subscriptBaselineDropMin}- {MathValueRecord superscriptShiftUp}- {MathValueRecord superscriptShiftUpCramped}- {MathValueRecord superscriptBottomMin}- {MathValueRecord superscriptBaselineDropMax}- {MathValueRecord subSuperscriptGapMin}- {MathValueRecord superscriptBottomMaxWithSubscript}- {MathValueRecord spaceAfterScript}- {MathValueRecord upperLimitGapMin}- {MathValueRecord upperLimitBaselineRiseMin}- {MathValueRecord lowerLimitGapMin}- {MathValueRecord lowerLimitBaselineDropMin}- {MathValueRecord stackTopShiftUp}- {MathValueRecord stackTopDisplayStyleShiftUp}- {MathValueRecord stackBottomShiftDown}- {MathValueRecord stackBottomDisplayStyleShiftDown}- {MathValueRecord stackGapMin}- {MathValueRecord stackDisplayStyleGapMin}- {MathValueRecord stretchStackTopShiftUp}- {MathValueRecord stretchStackBottomShiftDown}- {MathValueRecord stretchStackGapAboveMin}- {MathValueRecord stretchStackGapBelowMin}- {MathValueRecord fractionNumeratorShiftUp}- {MathValueRecord fractionNumeratorDisplayStyleShiftUp}- {MathValueRecord fractionDenominatorShiftDown}- {MathValueRecord fractionDenominatorDisplayStyleShiftDown}- {MathValueRecord fractionNumeratorGapMin}- {MathValueRecord fractionNumDisplayStyleGapMin}- {MathValueRecord fractionRuleThickness}- {MathValueRecord fractionDenominatorGapMin}- {MathValueRecord fractionDenomDisplayStyleGapMin}- {MathValueRecord skewedFractionHorizontalGap}- {MathValueRecord skewedFractionVerticalGap}- {MathValueRecord overbarVerticalGap}- {MathValueRecord overbarRuleThickness}- {MathValueRecord overbarExtraAscender}- {MathValueRecord underbarVerticalGap}- {MathValueRecord underbarRuleThickness}- {MathValueRecord underbarExtraDescender}- {MathValueRecord radicalVerticalGap}- {MathValueRecord radicalDisplayStyleVerticalGap}- {MathValueRecord radicalRuleThickness}- {MathValueRecord radicalExtraAscender}- {MathValueRecord radicalKernBeforeDegree}- {MathValueRecord radicalKernAfterDegree}- {int16 radicalDegreeBottomRaisePercent}))+ {int16 scriptPercentScaleDown}+ {int16 scriptScriptPercentScaleDown}+ {UFWORD delimitedSubFormulaMinHeight}+ {UFWORD displayOperatorMinHeight}+ {MathValueRecord mathLeading}+ {MathValueRecord axisHeight}+ {MathValueRecord accentBaseHeight}+ {MathValueRecord flattenedAccentBaseHeight}+ {MathValueRecord subscriptShiftDown}+ {MathValueRecord subscriptTopMax}+ {MathValueRecord subscriptBaselineDropMin}+ {MathValueRecord superscriptShiftUp}+ {MathValueRecord superscriptShiftUpCramped}+ {MathValueRecord superscriptBottomMin}+ {MathValueRecord superscriptBaselineDropMax}+ {MathValueRecord subSuperscriptGapMin}+ {MathValueRecord superscriptBottomMaxWithSubscript}+ {MathValueRecord spaceAfterScript}+ {MathValueRecord upperLimitGapMin}+ {MathValueRecord upperLimitBaselineRiseMin}+ {MathValueRecord lowerLimitGapMin}+ {MathValueRecord lowerLimitBaselineDropMin}+ {MathValueRecord stackTopShiftUp}+ {MathValueRecord stackTopDisplayStyleShiftUp}+ {MathValueRecord stackBottomShiftDown}+ {MathValueRecord stackBottomDisplayStyleShiftDown}+ {MathValueRecord stackGapMin}+ {MathValueRecord stackDisplayStyleGapMin}+ {MathValueRecord stretchStackTopShiftUp}+ {MathValueRecord stretchStackBottomShiftDown}+ {MathValueRecord stretchStackGapAboveMin}+ {MathValueRecord stretchStackGapBelowMin}+ {MathValueRecord fractionNumeratorShiftUp}+ {MathValueRecord fractionNumeratorDisplayStyleShiftUp}+ {MathValueRecord fractionDenominatorShiftDown}+ {MathValueRecord fractionDenominatorDisplayStyleShiftDown}+ {MathValueRecord fractionNumeratorGapMin}+ {MathValueRecord fractionNumDisplayStyleGapMin}+ {MathValueRecord fractionRuleThickness}+ {MathValueRecord fractionDenominatorGapMin}+ {MathValueRecord fractionDenomDisplayStyleGapMin}+ {MathValueRecord skewedFractionHorizontalGap}+ {MathValueRecord skewedFractionVerticalGap}+ {MathValueRecord overbarVerticalGap}+ {MathValueRecord overbarRuleThickness}+ {MathValueRecord overbarExtraAscender}+ {MathValueRecord underbarVerticalGap}+ {MathValueRecord underbarRuleThickness}+ {MathValueRecord underbarExtraDescender}+ {MathValueRecord radicalVerticalGap}+ {MathValueRecord radicalDisplayStyleVerticalGap}+ {MathValueRecord radicalRuleThickness}+ {MathValueRecord radicalExtraAscender}+ {MathValueRecord radicalKernBeforeDegree}+ {MathValueRecord radicalKernAfterDegree}+ {int16 radicalDegreeBottomRaisePercent})(mkcmplx MathItalicsCorrectionInfo
- (mkfields {Offset16 italicsCorrectionCoverageOffset}- {uint16 italicsCorrectionCount}- {MathValueRecord italicsCorrection (count italicsCorrectionCount)}))+ {Offset16 italicsCorrectionCoverageOffset}+ {uint16 italicsCorrectionCount}+ {MathValueRecord italicsCorrection [italicsCorrectionCount]})(mkcmplx MathTopAccentAttachment
- (mkfields {Offset16 topAccentCoverageOffset}- {uint16 topAccentAttachmentCount}- {MathValueRecord topAccentAttachment (count topAccentAttachmentCount)}))+ {Offset16 topAccentCoverageOffset}+ {uint16 topAccentAttachmentCount}+ {MathValueRecord topAccentAttachment [topAccentAttachmentCount]})(mkcmplx MathKernInfoRecord
- (mkfields {Offset16 topRightMathKernOffset}- {Offset16 topLeftMathKernOffset}- {Offset16 bottomRightMathKernOffset}- {Offset16 bottomLeftMathKernOffset}))+ {Offset16 topRightMathKernOffset}+ {Offset16 topLeftMathKernOffset}+ {Offset16 bottomRightMathKernOffset}+ {Offset16 bottomLeftMathKernOffset})(mkcmplx MathKernInfo
- (mkfields {Offset16 mathKernCoverageOffset}- {uint16 mathKernCount}- {MathKernInfoRecord mathKernInfoRecords (count mathKernCount)}))+ {Offset16 mathKernCoverageOffset}+ {uint16 mathKernCount}+ {MathKernInfoRecord mathKernInfoRecords [mathKernCount]})(mkcmplx MathKern
- (mkfields {uint16 heightCount}- {MathValueRecord correctionHeight (count heightCount)}- {MathValueRecord kernValues (count heightCount)}))+ {uint16 heightCount}+ {MathValueRecord correctionHeight [heightCount]}+ {MathValueRecord kernValues [heightCount]})-(mkcmplx Coverage1 (mkfields {uint16 glyphCount} {uint16 glyphArray (count glyphCount)}))+(mkcmplx Coverage1 {uint16 glyphCount} {uint16 glyphArray [glyphCount]})-(mkcmplx RangeRecord (mkfields {uint16 startGlyphID} {uint16 endGlyphID} {uint16 startCoverageIndex}))+(mkcmplx RangeRecord {uint16 startGlyphID} {uint16 endGlyphID} {uint16 startCoverageIndex})-(mkcmplx Coverage2 (mkfields {uint16 rangeCount} {RangeRecord rangeRecords (count rangeCount)}))+(mkcmplx Coverage2 {uint16 rangeCount} {RangeRecord rangeRecords [rangeCount]})-(mkcmplx
- Coverage
- (mkfields {uint16 format (== 1 2)} {Coverage1 cov1 (== format 1)} {Coverage2 cov2 (== format 2)}))+(mkcmplx Coverage
+ {uint16 format (== 1 2)}+ {Coverage1 cov1 (== format 1)}+ {Coverage2 cov2 (== format 2)})(mkcmplx MathVariants
- (mkfields {UFWORD minConnectorOverlap}- {Offset16 vertGlyphCoverageOffset}- {Offset16 horizGlyphCoverageOffset}- {uint16 vertGlyphCount}- {uint16 horizGlyphCount}- {Offset16 vertGlyphConstructionOffsets (count vertGlyphCount)}- {Offset16 horizGlyphConstructionOffsets (count horizGlyphCount)}- {Coverage vertGlyphCoverage (at vertGlyphCoverageOffset)}- {Coverage horizGlyphCoverage (at horizGlyphCoverageOffset)}))+ {UFWORD minConnectorOverlap}+ {Offset16 vertGlyphCoverageOffset}+ {Offset16 horizGlyphCoverageOffset}+ {uint16 vertGlyphCount}+ {uint16 horizGlyphCount}+ {Offset16 vertGlyphConstructionOffsets [vertGlyphCount]}+ {Offset16 horizGlyphConstructionOffsets [horizGlyphCount]}+ {Coverage vertGlyphCoverage (at vertGlyphCoverageOffset)}+ {Coverage horizGlyphCoverage (at horizGlyphCoverageOffset)})(mkcmplx MathGlyphInfo
- (mkfields
- {Offset16 mathItalicsCorrectionInfoOffset}- {Offset16 mathTopAccentAttachmentOffset}- {Offset16 extendedShapeCoverageOffset} ; FIXME WHERE is this shit defined???- {Offset16 mathKernInfoOffset}- {MathItalicsCorrectionInfo mathItalicsCorrectionInfo (at mathItalicsCorrectionInfoOffset)}- {MathTopAccentAttachment mathTopAccentAttachment (at mathTopAccentAttachmentOffset)}- {MathKernInfo mathKernInfo (at mathKernInfoOffset)}))+ {Offset16 mathItalicsCorrectionInfoOffset}+ {Offset16 mathTopAccentAttachmentOffset}+ {Offset16 extendedShapeCoverageOffset} ; FIXME WHERE is this shit defined???+ {Offset16 mathKernInfoOffset}+ {MathItalicsCorrectionInfo mathItalicsCorrectionInfo (at mathItalicsCorrectionInfoOffset)}+ {MathTopAccentAttachment mathTopAccentAttachment (at mathTopAccentAttachmentOffset)}+ {MathKernInfo mathKernInfo (at mathKernInfoOffset)})-(mkcmplx MathGlyphVariantRecord (mkfields {uint16 variantGlyph} {UFWORD advanceMeasurement}))+(mkcmplx MathGlyphVariantRecord {uint16 variantGlyph} {UFWORD advanceMeasurement})(mkcmplx GlyphPart
- (mkfields {uint16 glyphID}- {UFWORD startConnectorLength}- {UFWORD endConnectorLength}- {UFWORD fullAdvance}- {uint16 partFlags}))+ {uint16 glyphID}+ {UFWORD startConnectorLength}+ {UFWORD endConnectorLength}+ {UFWORD fullAdvance}+ {uint16 partFlags})(mkcmplx GlyphAssembly
- (mkfields {MathValueRecord italicsCorrection}- {uint16 partCount}- {GlyphPart partRecords (count partCount)}))+ {MathValueRecord italicsCorrection}+ {uint16 partCount}+ {GlyphPart partRecords [partCount]})(mkcmplx MathGlyphConstruction
- (mkfields {Offset16 glyphAssemblyOffset}- {uint16 variantCount}- {MathGlyphVariantRecord mathGlyphVariantRecords (count variantCount)}- {GlyphAssembly glyphAssembly (at glyphAssemblyOffset)}))+ {Offset16 glyphAssemblyOffset}+ {uint16 variantCount}+ {MathGlyphVariantRecord mathGlyphVariantRecords [variantCount]}+ {GlyphAssembly glyphAssembly (at glyphAssemblyOffset)})(mkcmplx TableMATH
- (mkfields {uint16 majorVersion (== 1) unused}- {uint16 minorVersion (== 0) unused}- {Offset16 mathConstantsOffset}- {Offset16 mathGlyphInfoOffset}- {Offset16 mathVariantsOffset}- {MathConstants mathConstants (at mathConstantsOffset)}- {MathGlyphInfo mathGlyphInfo (at mathGlyphInfoOffset)}- {MathVariants mathVariants (at mathVariantsOffset)})+ {uint16 majorVersion (== 1) unused}+ {uint16 minorVersion (== 0) unused}+ {Offset16 mathConstantsOffset}+ {Offset16 mathGlyphInfoOffset}+ {Offset16 mathVariantsOffset}+ {MathConstants mathConstants (at mathConstantsOffset)}+ {MathGlyphInfo mathGlyphInfo (at mathGlyphInfoOffset)}+ {MathVariants mathVariants (at mathVariantsOffset)}#:tag "MATH")
(mkcmplx TableOS∕2
- (mkfields {uint16 version (<= 5)}- {FWORD xAvgCharWidth}- {uint16 usWeightClass}- {uint16 usWidthClass}- {uint16 fsType}- {FWORD ySubscriptXSize}- {FWORD ySubscriptYSize}- {FWORD ySubscriptXOffset}- {FWORD ySubscriptYOffset}- {FWORD ySuperscriptXSize}- {FWORD ySuperscriptYSize}- {FWORD ySuperscriptXOffset}- {FWORD ySuperscriptYOffset}- {FWORD yStrikeoutSize}- {FWORD yStrikeoutPosition}- {int16 sFamilyClass}- {uint8 panose [10]}- {uint32 ulUnicodeRange1 hex}- {uint32 ulUnicodeRange2 hex}- {uint32 ulUnicodeRange3 hex}- {uint32 ulUnicodeRange4 hex}- {Tag achVendID}- {uint16 fsSelection}- {uint16 usFirstCharIndex}- {uint16 usLastCharIndex}- {FWORD sTypoAscender}- {FWORD sTypoDescender}- {FWORD sTypoLineGap}- {UFWORD usWinAscent}- {UFWORD usWinDescent}- {uint32 ulCodePageRange1 (>= version 1) hex}- {uint32 ulCodePageRange2 (>= version 1) hex}- {FWORD sxHeight (>= version 2)}- {FWORD sCapHeight (>= version 2)}- {uint16 usDefaultChar (>= version 2) hex}- {uint16 usBreakChar (>= version 2) hex}- {uint16 usMaxContext (>= version 2)}- {uint16 usLowerOpticalPointSize (>= version 5)}- {uint16 usUpperOpticalPointSize (>= version 5)})+ {uint16 version (<= 5)}+ {FWORD xAvgCharWidth}+ {uint16 usWeightClass}+ {uint16 usWidthClass}+ {uint16 fsType}+ {FWORD ySubscriptXSize}+ {FWORD ySubscriptYSize}+ {FWORD ySubscriptXOffset}+ {FWORD ySubscriptYOffset}+ {FWORD ySuperscriptXSize}+ {FWORD ySuperscriptYSize}+ {FWORD ySuperscriptXOffset}+ {FWORD ySuperscriptYOffset}+ {FWORD yStrikeoutSize}+ {FWORD yStrikeoutPosition}+ {int16 sFamilyClass}+ {uint8 panose [10]}+ {uint32 ulUnicodeRange1 hex}+ {uint32 ulUnicodeRange2 hex}+ {uint32 ulUnicodeRange3 hex}+ {uint32 ulUnicodeRange4 hex}+ {Tag achVendID}+ {uint16 fsSelection}+ {uint16 usFirstCharIndex}+ {uint16 usLastCharIndex}+ {FWORD sTypoAscender}+ {FWORD sTypoDescender}+ {FWORD sTypoLineGap}+ {UFWORD usWinAscent}+ {UFWORD usWinDescent}+ {uint32 ulCodePageRange1 (>= version 1) hex}+ {uint32 ulCodePageRange2 (>= version 1) hex}+ {FWORD sxHeight (>= version 2)}+ {FWORD sCapHeight (>= version 2)}+ {uint16 usDefaultChar (>= version 2) hex}+ {uint16 usBreakChar (>= version 2) hex}+ {uint16 usMaxContext (>= version 2)}+ {uint16 usLowerOpticalPointSize (>= version 5)}+ {uint16 usUpperOpticalPointSize (>= version 5)}#:tag "OS/2")
(mkcmplx TableRecord
- (mkfields {Tag tableTag} {uint32 checksum unused hex} {Offset32 offset} {uint32 length})+ {Tag tableTag}+ {uint32 checksum unused hex}+ {Offset32 offset}+ {uint32 length}#:extra (list (cons 'field
(list (~a "void *parsed;")
(~a "void (*print)(Biobuf *f, int indent, void *parsed);")))
@@ -1115,12 +1109,12 @@
(~a "}")))))
(mkcmplx TableDirectory
- (mkfields {uint32 sfntVersion (== #x00010000 #x4f54544f) hex}- {uint16 numTables}- {uint16 searchRange}- {uint16 entrySelector}- {uint16 rangeShift}- {TableRecord tableRecords (count numTables)})+ {uint32 sfntVersion (== #x00010000 #x4f54544f) hex}+ {uint16 numTables}+ {uint16 searchRange}+ {uint16 entrySelector}+ {uint16 rangeShift}+ {TableRecord tableRecords [numTables]}#:extra (tagged-tables-fields tagged))
(define (out path f)
--
⑨