diff --git a/fontland/fontland/font.rkt b/fontland/fontland/font.rkt index 24cde6c2..a9bfab87 100644 --- a/fontland/fontland/font.rkt +++ b/fontland/fontland/font.rkt @@ -19,7 +19,8 @@ sugar/unstable/js "ffi/harfbuzz.rkt" "glyph-position.rkt" - sugar/list) + sugar/list + racket/promise) (provide (all-defined-out)) #| @@ -45,7 +46,7 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js ;; (including CFF) ;; It supports TrueType, and PostScript glyphs, and several color glyph formats. -(define ft-library (FT_Init_FreeType)) +(define ft-library (delay (FT_Init_FreeType))) (define-subclass object% (TTFFont port [_src #f]) (when port (unless (input-port? port) @@ -57,9 +58,11 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js (field [_directoryPos (pos port)] [_tables (mhash)] ; holds decoded tables (loaded lazily) [_glyphs (mhash)] - [directory #f] - [ft-face (and _src (FT_New_Face ft-library _src))]) - (send this _decodeDirectory) + [_directory (delay (decode Directory port #:parent (mhash '_startOffset 0)))] + [_ft-face (delay (and _src (FT_New_Face (force ft-library) _src)))]) + + (define/public (directory) (force _directory)) + (define/public (ft-face) (force _ft-face)) (define/public (_getTable table-tag) (unless (has-table? this table-tag) @@ -79,15 +82,11 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js (define/public (_decodeTable table-tag) (define table-decoder (hash-ref table-codecs table-tag (λ () (raise-argument-error '_decodeTable "decodable table" table-tag)))) - (define offset (· (hash-ref (· directory tables) table-tag) offset)) - (define len (· (hash-ref (· directory tables) table-tag) length)) + (define offset (· (hash-ref (· this directory tables) table-tag) offset)) + (define len (· (hash-ref (· this directory tables) table-tag) length)) (pos port 0) (decode table-decoder (open-input-bytes (peek-bytes len offset port)) #:parent this)) - (define/public (_decodeDirectory) - (set! directory (decode Directory port #:parent (mhash '_startOffset 0))) - directory) - (as-methods postscriptName measure-string