diff --git a/fontland/fontland/table/cff/cff-dict.rkt b/fontland/fontland/table/cff/cff-dict.rkt index 4ddeb96c..83ab79de 100644 --- a/fontland/fontland/table/cff/cff-dict.rkt +++ b/fontland/fontland/table/cff/cff-dict.rkt @@ -1,5 +1,5 @@ #lang debug racket/base -(require racket/class xenomorph sugar/unstable/dict) + (require racket/class xenomorph sugar/unstable/dict) (provide CFFDict) #| diff --git a/fontland/fontland/table/cff/cff-private-dict.rkt b/fontland/fontland/table/cff/cff-private-dict.rkt new file mode 100644 index 00000000..02d38fe8 --- /dev/null +++ b/fontland/fontland/table/cff/cff-private-dict.rkt @@ -0,0 +1,45 @@ +#lang debug racket/base +(require racket/class racket/match xenomorph sugar/unstable/dict + "cff-dict.rkt" + "cff-index.rkt" + "cff-pointer.rkt") +(provide CFFPrivateDict) + +#| +approximates +https://github.com/mbutterick/fontkit/blob/master/src/cff/CFFPrivateDict.js +|# + +(define CFFBlendOp + (class xenobase% + (define/augment (:decode stream parent operands) + (match (reverse operands) + [(cons numBlends operands) + ;; TODO: actually blend. For now just consume the deltas + ;; since we don't use any of the values anyway. + (let loop ([operands operands]) + (when (> (length operands) numBlends) + (loop (cdr operands))))])))) + +(define CFFPrivateDict + ;; key name type default + `((6 BlueValues delta #false) + (7 OtherBlues delta #false) + (8 FamilyBlues delta #false) + (9 FamilyOtherBlues delta #false) + ((12 9) BlueScale number 0.039625) + ((12 10) BlueShift number 7) + ((12 11) BlueFuzz number 1) + (10 StdHW number #false) + (11 StdVW number #false) + ((12 12) StemSnapH delta #false) + ((12 13) StemSnapV delta #false) + ((12 14) ForceBold boolean #false) + ((12 17) LanguageGroup number 0) + ((12 18) ExpansionFactor number 0.06) + ((12 19) initialRandomSeed number 0) + (20 defaultWidthX number 0) + (21 nominalWidthX number 0) + (22 vsindex number 0) + (23 blend ,CFFBlendOp #false) + (19 Subrs ,(CFFPointer CFFIndex #:type 'local) #false))) \ No newline at end of file diff --git a/fontland/fontland/table/cff/cff-top.rkt b/fontland/fontland/table/cff/cff-top.rkt index 4ccd6940..6cb21527 100644 --- a/fontland/fontland/table/cff/cff-top.rkt +++ b/fontland/fontland/table/cff/cff-top.rkt @@ -3,7 +3,8 @@ "cff-index.rkt" "cff-dict.rkt" "cff-charsets.rkt" - "cff-pointer.rkt") + "cff-pointer.rkt" + "cff-encodings.rkt") (provide CFFTop) #| @@ -27,6 +28,23 @@ https://github.com/mbutterick/fontkit/blob/master/src/cff/CFFTop.js 'first uint16be 'nLeft uint16be)) +(define CFFEncodingVersion + (x:int #:size 1 + #:signed #false + #:post-decode (λ (res) (bitwise-and res #x7f)))) + +(define CFFCustomEncoding + (x:versioned-struct + CFFEncodingVersion + (dictify + 0 (dictify 'nCodes uint8 + 'codes (x:array uint8 'nCodes)) + 1 (dictify 'nRanges uint8 + 'ranges (x:array Range1 'nRanges))))) + +(define CFFEncoding (PredefinedOp (list StandardEncoding ExpertEncoding) + (CFFPointer CFFCustomEncoding #:lazy #true))) + ;; Decodes an array of ranges until the total ;; length is equal to the provided length. @@ -43,7 +61,6 @@ https://github.com/mbutterick/fontkit/blob/master/src/cff/CFFTop.js (define range (decode @type stream parent)) (hash-set! range 'offset count) (values (cons range res) (+ count (hash-ref range 'nLeft) 1)))))) - (define CFFCustomCharset (let ([tproc (λ (t) (sub1 (length (hash-ref (hash-ref t 'parent) 'CharStrings))))]) @@ -58,6 +75,8 @@ https://github.com/mbutterick/fontkit/blob/master/src/cff/CFFTop.js (list ISOAdobeCharset ExpertCharset ExpertSubsetCharset) (CFFPointer CFFCustomCharset #:lazy #true))) +(define ptr (CFFPointer CFFPrivateDict)) + (define CFFTopDict (CFFDict ;; key name type(s) default