diff --git a/pitfall/pitfall/minimal-measured-font.rkt b/pitfall/pitfall/minimal-measured-font.rkt index 1b800ca4..091386cb 100644 --- a/pitfall/pitfall/minimal-measured-font.rkt +++ b/pitfall/pitfall/minimal-measured-font.rkt @@ -1,87 +1,94 @@ -#lang at-exp s-exp pitfall/render +#lang at-exp br +(require pitfall/render) -;; catalog object -(co-io 1 0 (co-catalog #:pages (co-io-ref 2 0))) +(render-args -;; pages -(co-io 2 0 (co-pages #:kids (list (co-io-ref 3 0)) - #:count 1)) -;; page -(co-io 3 0 (co-page #:parent (co-io-ref 2 0) - #:mediabox '(0 0 400 400) - #:resources (co-io-ref 4 0) - #:contents (co-io-ref 5 0) + ;; catalog object + (co-io 1 0 (co-catalog #:pages (co-io-ref 2 0))) + + ;; pages + (co-io 2 0 (co-pages #:kids (list (co-io-ref 3 0)) + #:count 1)) + ;; page + (co-io 3 0 (co-page #:parent (co-io-ref 2 0) + #:mediabox '(0 0 400 400) + #:resources (co-io-ref 4 0) + #:contents (co-io-ref 5 0) - ; the value of annots must be an array - #:annots (co-array (list (co-io-ref 7 0))) - )) -#;#:annots (co-io-ref 7 0) + ; the value of annots must be an array + #:annots (co-array (list (co-io-ref 7 0))) + )) + #;#:annots (co-io-ref 7 0) -;; resources -(co-io 4 0 - (make-co-dict - 'ProcSet (co-array '(PDF Text)) - 'Font (make-co-dict 'F1 (co-io-ref 6 0)))) + ;; resources + (co-io 4 0 + (make-co-dict + 'ProcSet (co-array '(PDF Text)) + 'Font (make-co-dict 'F1 (co-io-ref 6 0)))) -;; contents -(co-io 5 0 - (make-co-stream - #" + ;; contents + (co-io 5 0 + (make-co-stream + #" BT /F1 48 Tf - -(Hello) Tj - -(World) Tj +(Hello World 1-1!) Tj ET ")) -;; font -(co-io 6 0 - (make-co-dict - 'Type 'Font - 'Subtype 'Type1 - 'Name 'F1 - 'BaseFont 'FiraSansOTMedium - 'FontDescriptor (co-io-ref 9 0) - 'FirstChar 0 - 'LastChar 1150 - 'Widths (co-array (for/list ([i (in-range (add1 1150))]) - (define m (measure-char-idx "fira.otf" i)) - (displayln m) - m)) - 'Encoding 'MacRomanEncoding)) + ;; font + (let ([last-char 255]) + (co-io 6 0 + (make-co-dict + 'Type 'Font + 'Subtype 'Type1 + 'Name 'F1 + 'BaseFont 'Helvetica + 'FontDescriptor (co-io-ref 9 0) + 'FirstChar 0 + 'LastChar last-char + ;; widths can only hold 256 apparently? + 'Widths (report (co-array + (for/list ([i (in-range (add1 last-char))]) + ;; 29 is magic number: this is offset betwee + ;; ascii value and character index + ;; so A (ascii 65) lives at index 36 + (define ascii-index-offset 29) + (if (<= ascii-index-offset i) + (measure-char-idx "fira.otf" (- i ascii-index-offset)) + 200)))) + 'Encoding 'MacRomanEncoding))) -(co-io 7 0 - (make-co-dict 'Type 'Annot - 'Subtype 'Link - 'Rect (co-array '(100 100 150 125)) - 'A (co-io-ref 8 0))) + (co-io 7 0 + (make-co-dict 'Type 'Annot + 'Subtype 'Link + 'Rect (co-array '(100 100 150 125)) + 'A (co-io-ref 8 0))) -(co-io 8 0 - (make-co-dict 'Type 'Action - 'S 'URI - 'URI (co-string "http://practicaltypography.com"))) + (co-io 8 0 + (make-co-dict 'Type 'Action + 'S 'URI + 'URI (co-string "http://practicaltypography.com"))) -(co-io 9 0 - (make-co-dict - 'Type 'FontDescriptor - 'FontName 'FiraSansOTLight - 'FontFile3 (co-io-ref 10 0) - 'Flags 4 - 'FontBBox (co-array '(-177 -269 1123 866)) - 'MissingWidth 255 - 'StemV 105 - 'StemH 45 - 'CapHeight 660 - 'XHeight 394 - 'Ascent 720 - 'Descent -270 - 'Leading 83 - 'MaxWidth 1212 - 'AvgWidth 478 - 'ItalicAngle 0)) + (co-io 9 0 + (make-co-dict + 'Type 'FontDescriptor + 'FontName 'FiraSansOTMedium + 'FontFile3 (co-io-ref 10 0) + 'Flags 4 + 'FontBBox (co-array '(-177 -269 1123 866)) + 'MissingWidth 255 + 'StemV 105 + 'StemH 45 + 'CapHeight 660 + 'XHeight 394 + 'Ascent 720 + 'Descent -270 + 'Leading 83 + 'MaxWidth 1212 + 'AvgWidth 478 + 'ItalicAngle 0)) -(co-io 10 0 (make-font-co-stream "fira.otf")) + (co-io 10 0 (make-font-co-stream "fira.otf"))) diff --git a/pitfall/pitfall/render.rkt b/pitfall/pitfall/render.rkt index ebf0e4fe..256483a5 100644 --- a/pitfall/pitfall/render.rkt +++ b/pitfall/pitfall/render.rkt @@ -20,8 +20,10 @@ (~r #:min-width 10 #:pad-string "0" (cdr loc))) sep #:after-last sep)) })) - (define (render-args . args) + (render-list args)) + +(define (render-list args) (define-values (bstrs offset locs) (for/fold ([cobstrs null] [offset 0]