|
|
#lang racket/base
|
|
|
(require (for-syntax)
|
|
|
sugar/unstable/dict
|
|
|
sugar/unstable/js
|
|
|
"unsafe/freetype.rkt"
|
|
|
"helper.rkt")
|
|
|
(provide (all-defined-out))
|
|
|
|
|
|
|
|
|
|
|
|
#|
|
|
|
approximates
|
|
|
https://github.com/mbutterick/fontkit/blob/master/src/glyph/Glyph.js
|
|
|
|#
|
|
|
|
|
|
; Glyph objects represent a glyph in the font. They have various properties for accessing metrics and
|
|
|
; the actual vector path the glyph represents, and methods for rendering the glyph to a graphics context.
|
|
|
;
|
|
|
; You do not create glyph objects directly. They are created by various methods on the font object.
|
|
|
; There are several subclasses of the base Glyph class internally that may be returned depending
|
|
|
; on the font format, but they all inherit from this class.
|
|
|
|
|
|
|
|
|
(struct glyph (id codepoints font is-mark? is-ligature? metrics) #:transparent #:mutable)
|
|
|
|
|
|
(define (+glyph id codepoints font
|
|
|
[is-mark? (andmap is-mark? codepoints)]
|
|
|
[is-ligature? (> (length codepoints) 1)]
|
|
|
[metrics #f]
|
|
|
#:constructor [constructor glyph])
|
|
|
(constructor id codepoints font is-mark? is-ligature? metrics))
|
|
|
|
|
|
#;(define-stub-stop _getPath)
|
|
|
#;(define-stub-stop _getCBox)
|
|
|
#;(define-stub-stop _getBBox)
|
|
|
#;(define-stub-stop _getTableMetrics)
|
|
|
|
|
|
(define (glyph-advance-width g)
|
|
|
(hash-ref (get-glyph-metrics g) 'advanceWidth))
|
|
|
|
|
|
(define (get-glyph-metrics g)
|
|
|
(unless (glyph-metrics g)
|
|
|
(define face (· (glyph-font g) ft-face))
|
|
|
(FT_Load_Glyph face (glyph-id g) FT_LOAD_NO_RECURSE)
|
|
|
(define glyph (FT_FaceRec-glyph face))
|
|
|
(define ft-glyph-metrics (FT_GlyphSlotRec-metrics glyph))
|
|
|
(set-glyph-metrics! g (mhash))
|
|
|
(hash-set*! (glyph-metrics g)
|
|
|
'advanceWidth (FT_Glyph_Metrics-horiAdvance ft-glyph-metrics)
|
|
|
'leftBearing (FT_Glyph_Metrics-horiBearingX ft-glyph-metrics)))
|
|
|
(glyph-metrics g))
|
|
|
|
|
|
|