You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
typesetting/fontland/fontland/glyph.rkt

67 lines
2.4 KiB
Racket

This file contains invisible Unicode characters!

This file contains invisible Unicode characters that may be processed differently from what appears below. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to reveal hidden characters.

#lang debug racket/base
(require sugar/unstable/dict
"unsafe/freetype.rkt"
"table-stream.rkt"
"struct.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.
(define (is-mark? codepoint)
;; mark classes = Mn Me Mc
(regexp-match #px"\\p{Mn}|\\p{Me}|\\p{Mc}" (string (integer->char codepoint))))
(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 (glyph-advance-width g)
(hash-ref (get-glyph-metrics g) 'advanceWidth))
(define (get-glyph-metrics g)
(unless (glyph-metrics g)
(define face (ft-face (glyph-font g)))
(FT_Load_Glyph face (glyph-id g))
(define glyph (FT_FaceRec-glyph face))
(define ft-glyph-metrics (FT_GlyphSlotRec-metrics glyph))
(set-glyph-metrics! g (mhash))
;; todo: get vertical metrics
(hash-set*! (glyph-metrics g)
'advanceWidth (FT_Glyph_Metrics-horiAdvance ft-glyph-metrics)
'leftBearing (FT_Glyph_Metrics-horiBearingX ft-glyph-metrics)
'advanceHeight 'unfinished
'topBearing 'unfinished))
(glyph-metrics g))
(define (+ttf-glyph . args)
(apply +glyph #:constructor ttf-glyph args))
(define (+cff-glyph . args)
(apply +glyph #:constructor make-cff-glyph args))
#|
approximates
https://github.com/mbutterick/fontkit/blob/master/src/glyph/TTFFont.js
|#
;; Returns a glyph object for the given glyph id.
;; You can pass the array of code points this glyph represents for
;; your use later, and it will be stored in the glyph object.
(define (get-glyph font gid [codepoints null])
((if (has-table? font #"CFF_")
+cff-glyph
+ttf-glyph) gid codepoints font))