diff options
-rw-r--r-- | chickadee/render/font.scm | 30 |
1 files changed, 30 insertions, 0 deletions
diff --git a/chickadee/render/font.scm b/chickadee/render/font.scm index c2c1bea..97a680b 100644 --- a/chickadee/render/font.scm +++ b/chickadee/render/font.scm @@ -36,6 +36,7 @@ #:use-module (chickadee render sprite) #:use-module (chickadee render texture) #:export (load-font + load-tile-font font? font-face font-line-height @@ -71,6 +72,35 @@ (set-record-type-printer! <font> display-font) +(define* (load-tile-font file tile-width tile-height characters #:key + (face "untitled") (margin 0) (spacing 0)) + "Load the font named FACE from FILE, a bitmap image containing the +characters in the string CHARACTERS that are TILE-WIDTH by TILE-HEIGHT +pixels in size. The characters in the image *must* appear in the +order that they are specified in the character set or text will not +render properly. Optionally, each tile may have SPACING pixels of +horizontal and vertical space between surrounding tiles and the entire +image may have MARGIN pixels of empty space around its border." + (let* ((atlas (split-texture (load-image file) tile-width tile-height + #:margin margin + #:spacing spacing)) + (chars + (let ((table (make-hash-table))) + (string-for-each-index + (lambda (i) + (hash-set! table (string-ref characters i) + (make-font-char (string-ref characters i) + (texture-atlas-ref atlas i) + (vec2 0.0 0.0) + (vec2 tile-width tile-height) + (vec2 tile-width 0.0)))) + characters) + table)) + ;; These fonts are by definition monospace fonts, so no + ;; kerning. + (kernings (make-hash-table))) + (make-font face #f #f tile-height chars kernings))) + (define (load-font file) "Load the Angel Code XML formatted font within FILE." (define directory (dirname file)) |