cache fonts

main
Matthew Butterick 6 years ago
parent ec7e74429b
commit 31d6cc7bf5

@ -17,6 +17,7 @@
sugar/unstable/contract
sugar/unstable/dict
sugar/unstable/js
racket/port
"ffi/harfbuzz.rkt"
"glyph-position.rkt"
sugar/list
@ -55,37 +56,37 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js
(raise 'probe-fail))
;; skip variationCoords
(field [_directoryPos (pos port)]
[_tables (mhash)] ; holds decoded tables (loaded lazily)
[_glyphs (mhash)]
[_directory (delay (decode Directory port #:parent (mhash '_startOffset 0)))]
[_ft-face (delay (and _src (FT_New_Face (force ft-library) _src)))])
(field [_decoded-tables (mhash)]
[_port (open-input-bytes (port->bytes port))]
[_directory (delay (decode Directory _port #:parent (mhash '_startOffset 0)))]
[_ft-face (delay (and _src (FT_New_Face (force ft-library) _src)))]
[_hb-font (delay (and _src (hb_ft_font_create (· this ft-face))))]
[_hb-buf (delay (hb_buffer_create))])
(define/public (directory) (force _directory))
(define/public (ft-face) (force _ft-face))
(define/public (ft-face) (or (force _ft-face) (error 'ft-face-not-available)))
(define/public (hb-font) (or (force _hb-font) (error 'hb-font-not-available)))
(define/public (hb-buf) (force _hb-buf))
(define/public (_getTable table-tag)
(unless (has-table? this table-tag)
(raise-argument-error '_getTable "table that exists in font" table-tag))
(dict-ref! _tables table-tag (λ () (_decodeTable table-tag)))) ; get table from cache, load if not there
(dict-ref! _decoded-tables table-tag (λ () (_decodeTable table-tag))))
(define-table-getters)
(define/public (_getTableStream tag)
(define table (dict-ref (· this directory tables) tag))
(cond
[table
(pos port (· table offset))
port]
[else #f]))
(define table (hash-ref (· this directory tables) tag))
(and table (pos _port (· table offset)) _port))
(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 (· 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))
(unless (hash-has-key? table-codecs table-tag)
(raise-argument-error '_decodeTable "decodable table" table-tag))
(pos _port 0)
(define table (hash-ref (· this directory tables) table-tag))
(define table-bytes (open-input-bytes (peek-bytes (· table length) (· table offset) _port)))
(define table-decoder (hash-ref table-codecs table-tag))
(decode table-decoder table-bytes #:parent this))
(as-methods
postscriptName
@ -213,12 +214,11 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js
;; Returns a Subset for this font.
(define/contract (createSubset this)
(->m (is-a?/c Subset))
(make-object
;; no CFF support
#;(if (· this has-cff-table?)
CFFSubset
TTFSubset)
TTFSubset this))
;; no CFF support
#;(make-object (if (· this has-cff-table?)
CFFSubset
TTFSubset) this)
(make-object TTFSubset this))
@ -254,12 +254,11 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js
(define (harfbuzz-glyphrun this string userFeatures script language)
#;(string? (listof symbol?) symbol? symbol? . ->m . GlyphRun?)
(define face (· this ft-face))
(define font (hb_ft_font_create face))
(define buf (hb_buffer_create))
(define buf (· this hb-buf))
(hb_buffer_reset buf)
(hb_buffer_add_codepoints buf (map char->integer (string->list string)))
(define chars (map hb_glyph_info_t-codepoint (hb_buffer_get_glyph_infos buf)))
(hb_shape font buf (map tag->hb-feature (or userFeatures null)))
(hb_shape (· this hb-font) buf (map tag->hb-feature (or userFeatures null)))
(define-values (gidxs clusters)
(for/lists (gs cs)
([gi (in-list (hb_buffer_get_glyph_infos buf))])
@ -270,10 +269,7 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js
(define positions (for/list ([gp (in-list (hb_buffer_get_glyph_positions buf))])
(match (hb_glyph_position_t->list gp)
[(list xad yad xoff yoff _) (+GlyphPosition xad yad xoff yoff)])))
(begin0
(+GlyphRun glyphs positions)
(hb_buffer_destroy buf)
(hb_font_destroy font)))
(+GlyphRun glyphs positions))
;; Returns a GlyphRun object, which includes an array of Glyphs and GlyphPositions for the given string.
(define/contract (layout this string [userFeatures #f] [script #f] [language #f])

Loading…
Cancel
Save