respect underline position & thickness

main
Matthew Butterick 4 years ago
parent 01d9500f1b
commit ec99ed25e9

@ -38,6 +38,8 @@
id
ascender
descender
underline-position
underline-thickness
line-gap
bbox
ref

@ -48,13 +48,13 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/font/embedded.coffee
(define widths (mhasheq 0 (glyph-advance-width (get-glyph font 0))))
(define name (font-postscript-name font))
(define scale (/ 1000.0 (font-units-per-em font)))
(define ascender (exactify (* (font-ascent font) scale)))
(define descender (exactify (* (font-descent font) scale)))
(match-define (list ascender descender underline-position underline-thickness line-gap)
(for/list ([proc (in-list (list font-ascent font-descent font-underline-position font-underline-thickness font-linegap))])
(exactify (* (proc font) scale))))
(define bbox (font-bbox font))
(define line-gap (exactify (* (font-linegap font) scale)))
(define encoding-cache (make-hash)) ; needs to be per font, not in top level of module
(efont
name id ascender descender line-gap bbox #f #f efont-embedded efont-encode efont-measure-string
name id ascender descender underline-position underline-thickness line-gap bbox #f #f efont-embedded efont-encode efont-measure-string
font subset unicode widths scale encoding-cache))
(define (efont-encode ef str [features-in null])

@ -24,11 +24,13 @@
(define kern-pairs (make-hash kps))
(define ascender (string->number (hash-ref attributes 'Ascender "0")))
(define descender (string->number (hash-ref attributes 'Descender "0")))
(define underline-position (string->number (hash-ref attributes 'UnderlinePosition "-100")))
(define underline-thickness (string->number (hash-ref attributes 'UnderlineThickness "50")))
(define bbox (for/list ([attr (in-list (string-split (hash-ref attributes 'FontBBox)))])
(or (string->number attr) 0)))
(define line-gap (- (third bbox) (first bbox) ascender descender))
(sfont
name id ascender descender line-gap bbox #f #f sfont-embed sfont-encode sfont-measure-string
name id ascender descender underline-position underline-thickness line-gap bbox #f #f sfont-embed sfont-encode sfont-measure-string
attributes glyph-widths kern-pairs))
(define (sfont-embed sf)

@ -21,17 +21,28 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/mixins/text.coffee
|#
(define (do-horiz-line doc x y width [underline? #f])
(define (scale-to-em x) (* (pdf-current-font-size doc) (/ x 1000.0)))
(save doc)
(when underline?
(apply stroke-color doc (pdf-current-fill-color doc)))
(define new-line-width (max 0.5 (floor (/ (pdf-current-font-size doc) 10))))
(line-width doc new-line-width)
(define stroke-width
(cond
[(or (not underline?) (test-mode)) (max 0.5 (floor (/ (pdf-current-font-size doc) 10)))]
[else
(scale-to-em (pdf-font-underline-thickness (pdf-current-font doc)))]))
(line-width doc stroke-width)
(define vert-em-adjustment (if underline? 1 0.6))
(define vert-line-pos (+ y
(define vert-line-adj
(+ y
(* (current-line-height doc) vert-em-adjustment)
(- (if underline? new-line-width 0))))
(move-to doc x vert-line-pos)
(line-to doc (+ x width) vert-line-pos)
(- (cond
[(test-mode) stroke-width]
[underline?
;; underline-position field is negative, by convention, so we change the sign
(scale-to-em (- (pdf-font-underline-position (pdf-current-font doc))))]
[else 0]))))
(move-to doc x vert-line-adj)
(line-to doc (+ x width) vert-line-adj)
(stroke doc)
(restore doc))
@ -108,8 +119,6 @@ https://github.com/mbutterick/pdfkit/blob/master/lib/mixins/text.coffee
(define x (pdf-x doc))
(define y (pdf-y doc))
;; 180109: character spacing works in pdf, but quad doesn't account for it yet
(define character-tracking (or character-tracking-arg 0))
;; calculate the actual rendered width of the string after word and character spacing
(define rendered-width

Loading…
Cancel
Save