From a11126351360c5939e35a5a07014f9b1ee27156c Mon Sep 17 00:00:00 2001 From: Matthew Butterick Date: Mon, 26 Nov 2018 16:36:15 -0800 Subject: [PATCH] explore --- pitfall/pitfall/embedded.rkt | 48 ++++++++++++++++++----------------- pitfall/pitfall/text.rkt | 9 ++++--- pitfall/ptest/out.bin | Bin 4688 -> 7870 bytes pitfall/ptest/test0.pdf | 2 +- pitfall/ptest/test0c.pdf | Bin 693 -> 693 bytes pitfall/ptest/test18.pdf | Bin 11071 -> 11071 bytes pitfall/ptest/test18c.pdf | Bin 6986 -> 6986 bytes pitfall/ptest/test4crkt.pdf | Bin 2810 -> 0 bytes 8 files changed, 31 insertions(+), 28 deletions(-) diff --git a/pitfall/pitfall/embedded.rkt b/pitfall/pitfall/embedded.rkt index 1d2b1a75..4ba27a25 100644 --- a/pitfall/pitfall/embedded.rkt +++ b/pitfall/pitfall/embedded.rkt @@ -30,15 +30,17 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/font/embedded.coffee embed toUnicodeCmap)) -(define/contract (widthOfString this string size [features #f]) - ((string? number?) ((option/c list?)) . ->*m . number?) - (cond - [features ; #f disables features ; null enables default features ; list adds features - (define run (send (· this font) layout string features)) - (define width (· run advanceWidth)) - (define scale (/ size (+ (· this font unitsPerEm) 0.0))) - (* width scale)] - [else (send (· this font) measure-string string size)])) +(define width-cache (make-hash)) +(define (widthOfString this string size [features #f]) + ((string? number?) ((option/c (listof symbol?))) . ->*m . number?) + ; #f disables features ; null enables default features ; list adds features + (hash-ref! width-cache + (list string size (and features (sort features symbolm void?) @@ -104,7 +106,7 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/font/embedded.coffee ;; generate a random tag (6 uppercase letters. 65 is the char code for 'A') (when (test-mode) (random-seed 0)) (define tag (list->string (for/list ([i (in-range 6)]) - (integer->char (random 65 (+ 65 26)))))) + (integer->char (random 65 (+ 65 26)))))) (define name (string-append tag "+" (· this font postscriptName))) (define bbox (· this font bbox)) @@ -143,7 +145,7 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/font/embedded.coffee 'Supplement 0) 'FontDescriptor descriptor 'W (list 0 (for/list ([idx (in-range (length (hash-keys (· this widths))))]) - (hash-ref (· this widths) idx (λ () (error 'embed (format "hash key ~a not found" idx))))))))) + (hash-ref (· this widths) idx (λ () (error 'embed (format "hash key ~a not found" idx))))))))) (· descendantFont end) #;(report (· descendantFont toString) 'descendantFont) @@ -163,12 +165,12 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/font/embedded.coffee (define cmap (· this document ref)) (define entries (for/list ([idx (in-range (length (hash-keys (· this unicode))))]) - (define codePoints (hash-ref (· this unicode) idx)) - (define encoded ; encode codePoints to utf16 - ;; todo: full utf16 support. for now just utf8 - (for/list ([value (in-list codePoints)]) - (toHex value))) - (format "<~a>" (string-join encoded " ")))) + (define codePoints (hash-ref (· this unicode) idx)) + (define encoded ; encode codePoints to utf16 + ;; todo: full utf16 support. for now just utf8 + (for/list ([value (in-list codePoints)]) + (toHex value))) + (format "<~a>" (string-join encoded " ")))) (define unicode-cmap-str #<*m . string?) (string-append* (for/list ([code (in-list codePoints)]) - (~r code #:base 16 #:min-width 4 #:pad-string "0")))) + (~r code #:base 16 #:min-width 4 #:pad-string "0")))) (module+ test diff --git a/pitfall/pitfall/text.rkt b/pitfall/pitfall/text.rkt index 5bc724c3..967066a4 100644 --- a/pitfall/pitfall/text.rkt +++ b/pitfall/pitfall/text.rkt @@ -67,7 +67,7 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/mixins/text.coffee (error 'unimplemented-branch-of-_text)] ; todo [else ; render paragraphs as single lines (for ([line (in-list (string-split text "\n"))]) - (lineCallback line options))])) + (lineCallback line options))])) this) @@ -93,7 +93,7 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/mixins/text.coffee (when (· this _textOptions) (for ([(key val) (in-hash (· this _textOptions))] #:unless (equal? (key "continued"))) - (hash-ref! options key val))) + (hash-ref! options key val))) ;; Update the current position (when x (set-field! x this x)) @@ -117,8 +117,8 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/mixins/text.coffee ;; 180325 suppress the size tracking: we'll do our own line measurement ;; 181120 unsuppress the size tracking for now because it breaks test 04 (if (not wrapper) - (increment-field! x this (send this widthOfString text)) - (increment-field! y (+ (send this currentLineHeight #t) lineGap))) + (increment-field! x this (send this widthOfString text)) + (increment-field! y (+ (send this currentLineHeight #t) lineGap))) (void)) @@ -197,6 +197,7 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/mixins/text.coffee ;; since the normal Tw operator only works on character code 32, which isn't ;; used for embedded fonts. ;; 180321: the first call to this operation is very slow from Quad + ;; 181126: because `encode` calls `layout` (match-define (list encoded-char-strs positions) (if (not (zero? wordSpacing)) (error 'unimplemented-brach) ; todo diff --git a/pitfall/ptest/out.bin b/pitfall/ptest/out.bin index 20df75213d767c7ea2233525f3cb8991dfca9842..cedbe02c99ce7bc2fd41fdd6a03c81b24910be0f 100644 GIT binary patch delta 4044 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 delta 832 zcmXw%O-vI}5XWcUYj@j)BBkAJBor4Gc7+y8zfq`Euv94qQjo8TQW~fNMS^G`n$&pH zXw-O+7)^|cQ6up)#+aZNt{x0tOpFKb9+7ad_*nEEX7YcNH~G)+&8Nthnp@2yrMdLN zEa(S0mgLNZdHJ7KSzeo+8~PF@4hU#D~P3p<*7z;eaJY&Q2#f4IFg z;^3J`!WG!W4xGa^+yG=Z{M$C{BzKlfqj?IwTkGT{S%E#^f*>4@9ts9(cke0|%seMh zVnLv!vjib-L_#oSK*V$cD1{VjGzML=4B%^&U2;9^P-(Mrg53p@B-%ON5ehq4fUD2f6ZLj0pUH|Ab2azXE%y&f^T(&W=|=CqzNUjCZf~NoeX!NPx8^{d+^V|0 zg{Sd`rZ!DoWp05&7JzujD<}pLDxoEs-(QRdf}KFXU?heNhm>Lp5Qh>x8jbpp!_Xy3 z7K>CVIV;L7qQ$ONRhtBd3q*UBV)gs0|@~~}A zKodty88dQ51fGL5@IVbb&49t6+a1F$rxU=bIo0Ya_PV01TC7#9MMAj?MWuu={tSPJ znbqA&I&dXe!+t{l2UVfD86lH@d+F}Ow)02B$%Z#iOQzE|UX-3Lyh+sK^+oSK{1%&E zIs5GXiED}aBMq4u^NFE%k78X1CS!uRr>)Mz05fw8@NNd!1kPwVM;UTttHzdQD8cFs zWm%b(GI(fJtkiF_`LSj2$LR9&6bgk6RLuCK@EB9%9$X~NU?LmPOHM+Th``Z{;3hKL JUCnm4=r35Mqq6`2 diff --git a/pitfall/ptest/test0.pdf b/pitfall/ptest/test0.pdf index eaec4037..624d6d2e 100644 --- a/pitfall/ptest/test0.pdf +++ b/pitfall/ptest/test0.pdf @@ -27,7 +27,7 @@ endobj << /Producer (PDFKit) /Creator (PDFKit) -/CreationDate (D:20181120220342Z) +/CreationDate (D:20181126220022Z) >> endobj 2 0 obj diff --git a/pitfall/ptest/test0c.pdf b/pitfall/ptest/test0c.pdf index 2be69d7cd00a31275104f30f41693cb3b0cf7c8f..46b6aa1cbbdf0095ce2ff9cc30ea025920be59d3 100644 GIT binary patch delta 19 acmdnWx|MYU6C<0Mk&%Ic(Pj?DwTu8W^8~~I delta 19 acmdnWx|MYU6C;~}k&%J1$z~45wTu8W(gec* diff --git a/pitfall/ptest/test18.pdf b/pitfall/ptest/test18.pdf index ebaa46e651ef6c2a54888c06780e50f070e34550..c71736ed05a4794fb24058be80143028501c43ba 100644 GIT binary patch delta 54 zcmdlVwm)n`B`dp`k&%IssmbI9R!cU=&@gw$$jSRzZ$p`z7qBg6hOs@lz9|3z>bMcy delta 54 zcmdlVwm)n`B`dq3fw_U9iSgtHR!g=ZA7>xO;K}=0Z$p`z7qBg6hOs@lz9|3z=VKAG diff --git a/pitfall/ptest/test18c.pdf b/pitfall/ptest/test18c.pdf index 64adef12e21a64230ee08046ca0a104a50f49a00..df0b14246b6f0a7cea5b399989d93c6e5c4d46fa 100644 GIT binary patch delta 54 ycmX?QcFJsn1S7kdk&%Issrh7iMoYHvAWv5>&&hF&x1r3<_Dm*>Fm@&LMR5SB(GQ{k delta 54 ycmX?QcFJsn1S7klfw_U9iRol{MoTttFK4&#kjZh3x1r3<_Dm*>Fm@&LMR5S9cn_HX diff --git a/pitfall/ptest/test4crkt.pdf b/pitfall/ptest/test4crkt.pdf index 7f8afb7705779dfd2eadebb464e5f86312a2d705..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 100644 GIT binary patch literal 0 HcmV?d00001 literal 2810 zcmb_ee`p(39Cy@>c}x&d6o&f#SXr&ayLZVYxvZ3#q{q^BZERB~%}Tu_FY&tMZoPY{ zY5$P1igvEJvat?iOl62TC}Z7l4CiDZic^_mATq1dKZJq)(?4`$L+X1km-gD*ZLlDU7P z>hJ9+r>Rk+0@4Bjf=~n@SsdW_)aY&m_@r7u9C?~V1VARy+R7n4NA**UH6Dei1(Z;c z0ko-AA=W6bPVAu0XO5)?g99kiGVU+KOz2VH*{};@$v&vW-fhwhDmS z&JZA)t876)xapD{oKKoYwijWL=84MypF$N3_(X|V8MWUr`<)n|0=A{}xQmu*MT|_q zD@7HfILaD1;-OBY7x3#q3DyC-)BSy8KK3!{-hjpB?|q z8m;v0{c)uExdXwmzrLw-b#MCM%om4`%$&b|^O+OL^9v1A15>9a+P8`?ryslY6W%=e z;kWUfQw@{amMiP0JDQr$ZO~u++`h5TC%JnBVPv+3bg<~HN51y5_9op6R z=v)DO-Q4j=ME*B&F*eq@@9(cRZGZ2-u8G-e@3y|3Jaqc(y6K@m)*ndUg8SY-`sVoj zMEgJT@k{%!eD~YV{GK29?_c|Q=ApwwX2aNI=f>Mt_dI>)_8V(2tT}n`*=FiR+a}aJ3%j z21j1dbXygwd(*J8sEa41m5}92V6~`aJ#1lBwhAOYMoHDZIGioxfnw7;TFMwj5B0P= z)MbG)@*W(t*Q^GIhkDj9>(ajs6-N-(va0VsNmaMEs!2tw=KrJ40oUrUU!tSUs zl{6)z;ApDObm`D?7D%(fVcASVyhdu3&Lj@Oiiz@^07S@DuMYYIK}qsUAP;Oz6eZGw z*gyIbCJ=_@nBbR409Ig-&KxT+fhOE?42ofLF)YV~P?$Jk1r`pw^g+K{R)m5}76xUP z9WW4fommtF_dY1Q_QCL7_DSyZ39{@yi*Ofxvf$znf=+$dRJ9^9*_7I=jUgI0zQ-^y hpczBv#DtzV0Gkxp>}Fxr#4N<3A40CNv8`L-{s)@VP^$m{