From e321c3a5a27f234bb6ca46cadc34d6ced6ba6227 Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Tue, 4 Dec 2018 20:00:11 -0800 Subject: [PATCH] not so fast --- fontland/fontland/db.rkt | 35 ++++++++++++++++++ fontland/fontland/font.rkt | 23 ++++++++---- fontland/fontland/fontland.sqlite | Bin 0 -> 20480 bytes fontland/fontland/glyph.rkt | 2 +- .../fontland/{ffi => unsafe}/freetype.rkt | 0 .../{ffi => unsafe}/harfbuzz-helper.rkt | 0 .../fontland/{ffi => unsafe}/harfbuzz.rkt | 0 7 files changed, 51 insertions(+), 9 deletions(-) create mode 100644 fontland/fontland/db.rkt create mode 100644 fontland/fontland/fontland.sqlite rename fontland/fontland/{ffi => unsafe}/freetype.rkt (100%) rename fontland/fontland/{ffi => unsafe}/harfbuzz-helper.rkt (100%) rename fontland/fontland/{ffi => unsafe}/harfbuzz.rkt (100%) diff --git a/fontland/fontland/db.rkt b/fontland/fontland/db.rkt new file mode 100644 index 00000000..d93491c0 --- /dev/null +++ b/fontland/fontland/db.rkt @@ -0,0 +1,35 @@ +#lang debug racket +(require sugar/debug sugar/cache racket/class racket/match + db racket/logging racket/draw openssl/sha1 racket/runtime-path) +(provide (all-defined-out)) + +(define-runtime-path db-file "fontland.sqlite") +(define current-query-debug (make-parameter #f)) +(define current-dbc (make-parameter (sqlite3-connect #:database db-file #:mode 'create))) + +(define-logger db) + +(define (log-query q) (when (current-query-debug) (log-db-info q))) + +(define-syntax-rule (query-exec-logging q arg ...) + (begin (log-query q) (query-exec (current-dbc) q arg ...))) + +(define-syntax-rule (query-rows-logging q arg ...) + (begin (log-query q) (query-rows (current-dbc) q arg ...))) + +(define (add-record! rec) + (define recstring (format "(~a, '~a')" (car rec) (bytes->hex-string (cdr rec)))) + (query-exec-logging (format "insert or replace into layouts (crc, layout) values ~a" recstring))) + +(define/caching (get-layout-from-db which) + (match (query-rows-logging (format "select layout from layouts where crc==~a" which)) + [(list (vector val)) (hex-string->bytes val)] + [_ #false])) + +(define (init-db) + (query-exec-logging "create table if not exists layouts (crc INTEGER, layout TEXT, PRIMARY KEY (crc))")) + +(module+ main + (init-db) + (add-record! (cons 42 #"01234")) + (get-layout-from-db 42)) \ No newline at end of file diff --git a/fontland/fontland/font.rkt b/fontland/fontland/font.rkt index 136b4aa4..ff042888 100644 --- a/fontland/fontland/font.rkt +++ b/fontland/fontland/font.rkt @@ -1,12 +1,13 @@ #lang debug racket/base (require (for-syntax racket/base) "helper.rkt" - "ffi/freetype.rkt" + "unsafe/freetype.rkt" "subset.rkt" "glyph.rkt" "bbox.rkt" "glyphrun.rkt" "directory.rkt" + "db.rkt" xenomorph "tables.rkt" racket/contract @@ -18,7 +19,7 @@ sugar/unstable/dict sugar/unstable/js racket/port - "ffi/harfbuzz.rkt" + "unsafe/harfbuzz.rkt" "glyph-position.rkt" sugar/list racket/promise @@ -266,8 +267,8 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js (define (hb-layout->glyphrun this hbr) (match hbr [(hash-table ('hb-gids gidxs) - ('hb-clusters clusters) - ('hb-positions posns)) + ('hb-clusters clusters) + ('hb-positions posns)) (define glyphs (for/list ([gidx (in-list gidxs)] [cluster (in-list clusters)]) (send this getGlyph gidx cluster))) @@ -311,8 +312,15 @@ https://github.com/mbutterick/fontkit/blob/master/src/TTFFont.js (define (get-layout string) (define codepoints (map char->integer (string->list string))) (define args (list codepoints (if userFeatures (sort userFeatures symbolglyphrun this lo)) (map get-layout substrs)))] [else (if debug (get-layout string) (hb-layout->glyphrun this (get-layout string)))])) @@ -410,4 +418,3 @@ https://github.com/mbutterick/fontkit/blob/master/src/base.js (and (equal? (hash-ref h 'hb-gids) '(227 480 732 412)) (equal? (hash-ref h 'hb-clusters) '((82) (105) (102 108) (101))) (equal? (hash-ref h 'hb-positions) '((601 0 0 0 0) (279 0 0 0 0) (580 0 0 0 0) (547 0 0 0 0))))))) - \ No newline at end of file diff --git a/fontland/fontland/fontland.sqlite b/fontland/fontland/fontland.sqlite new file mode 100644 index 0000000000000000000000000000000000000000..1155b8fac777787417e0ffb81a268c08d4749dc8 GIT binary patch literal 20480 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 literal 0 HcmV?d00001 diff --git a/fontland/fontland/glyph.rkt b/fontland/fontland/glyph.rkt index a6a428b1..de5df2d7 100644 --- a/fontland/fontland/glyph.rkt +++ b/fontland/fontland/glyph.rkt @@ -9,7 +9,7 @@ sugar/unstable/dict sugar/unstable/js sugar/unstable/stub - "ffi/freetype.rkt" + "unsafe/freetype.rkt" "helper.rkt") (provide (all-defined-out)) (module+ test (require rackunit)) diff --git a/fontland/fontland/ffi/freetype.rkt b/fontland/fontland/unsafe/freetype.rkt similarity index 100% rename from fontland/fontland/ffi/freetype.rkt rename to fontland/fontland/unsafe/freetype.rkt diff --git a/fontland/fontland/ffi/harfbuzz-helper.rkt b/fontland/fontland/unsafe/harfbuzz-helper.rkt similarity index 100% rename from fontland/fontland/ffi/harfbuzz-helper.rkt rename to fontland/fontland/unsafe/harfbuzz-helper.rkt diff --git a/fontland/fontland/ffi/harfbuzz.rkt b/fontland/fontland/unsafe/harfbuzz.rkt similarity index 100% rename from fontland/fontland/ffi/harfbuzz.rkt rename to fontland/fontland/unsafe/harfbuzz.rkt