From ffd82456709117e06f218b45d1f5f739dcf9809e Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Sat, 1 Dec 2018 12:12:59 -0800 Subject: [PATCH] crush --- fontland/fontland/font.rkt | 50 ++++++++++++++++++-------------------- 1 file changed, 23 insertions(+), 27 deletions(-) diff --git a/fontland/fontland/font.rkt b/fontland/fontland/font.rkt index 9a73877e..20534e2a 100644 --- a/fontland/fontland/font.rkt +++ b/fontland/fontland/font.rkt @@ -49,15 +49,16 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js (define ft-library (delay (FT_Init_FreeType))) -(define-subclass object% (TTFFont port [_src #f]) - (when port (unless (input-port? port) - (raise-argument-error 'TTFFont "input port" port))) +(define-subclass object% (TTFFont port) + (unless (input-port? port) + (raise-argument-error 'TTFFont "input port" port)) (unless (member (peek-bytes 4 0 port) (list #"true" #"OTTO" (bytes 0 1 0 0))) (raise 'probe-fail)) ;; skip variationCoords (field [_decoded-tables (mhash)] [_port (open-input-bytes (port->bytes port))] + [_src (path->string (object-name 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))))] @@ -264,10 +265,10 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js (values (hb_glyph_info_t-codepoint gi) (hb_glyph_info_t-cluster gi)))) (define glyphs (for/list ([gidx (in-list gidxs)] [char-cluster (in-list (break-at chars clusters))]) - (send this getGlyph gidx char-cluster))) + (send this getGlyph gidx char-cluster))) (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)]))) + (match (hb_glyph_position_t->list gp) + [(list xad yad xoff yoff _) (+GlyphPosition xad yad xoff yoff)]))) (+GlyphRun glyphs positions)) ;; Returns a GlyphRun object, which includes an array of Glyphs and GlyphPositions for the given string. @@ -284,7 +285,7 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js [(current-layout-caching) (define substrs (for/list ([substr (in-list (regexp-match* " " string #:gap-select? #t))] #:when (positive? (string-length substr))) - substr)) + substr)) (apply append-glyphruns (map get-layout substrs))] [else (get-layout string)])) @@ -300,7 +301,7 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js ;; for now, just use UTF-8 (define codepoints (map char->integer (string->list string))) (for/list ([cp (in-list codepoints)]) - (send this glyphForCodePoint cp))) + (send this glyphForCodePoint cp))) ;; Maps a single unicode code point to a Glyph object. @@ -323,7 +324,7 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js (string? number? . ->m . number?) (/ (* size (for/sum ([c (in-string str)]) - (measure-char-width this c))) (· this unitsPerEm))) + (measure-char-width this c))) (· this unitsPerEm))) #| @@ -332,7 +333,7 @@ https://github.com/mbutterick/fontkit/blob/master/src/index.js |# ;; Register font formats -(define formats (list TTFFont)) +(define font-formats (list TTFFont)) ;;fontkit.registerFormat(WOFFFont); ;; todo ;;fontkit.registerFormat(WOFF2Font); ;; todo ;;fontkit.registerFormat(TrueTypeCollection); ;; todo @@ -344,27 +345,22 @@ approximates https://github.com/mbutterick/fontkit/blob/master/src/base.js |# -(define/contract (openSync str-or-path [postscriptName #f]) - (((or/c path? string?)) ((option/c string?)) . ->* . TTFFont?) +(define/contract (openSync str-or-path) + ((or/c path? string?) . -> . TTFFont?) (define filename (if (path? str-or-path) (path->string str-or-path) str-or-path)) - (define buffer (file->bytes filename)) - (create buffer filename postscriptName)) + (create (open-input-file filename))) +(define (probe-failed? x) (eq? x 'probe-fail)) - -(define/contract (create buffer [filename #f] [postscriptName #f]) - ((bytes?) ((option/c path-string?) (option/c string?)) . ->* . TTFFont?) +(define/contract (create port) + (input-port? . -> . TTFFont?) (or - (for*/first ([format (in-list formats)] - ;; rather than use a `probe` function, - ;; just try making a font with each format and see what happens - [font (in-value (with-handlers ([(λ (x) (eq? x 'probe-fail)) (λ (exn) #f)]) - (make-object format (open-input-bytes buffer) filename)))] - #:when font) - (if postscriptName - (send font getFont postscriptName) ; used to select from collection files like TTC - font)) - (error 'fontkit:create "unknown font format"))) + ;; rather than use a `probe` function, + ;; just try making a font with each format and see what happens + (for/first ([font-format (in-list font-formats)]) + (with-handlers ([probe-failed? (λ (exn) #f)]) + (make-object font-format port))) + (error 'fontland:create "unknown font format"))) (test-module