glのフォントを表示する機能をprocessing-likeなAPIで包んでみました。
http://processing.org/reference/text_.html
に書いてあるチュートリアルと同様の結果になるようにしてみました。
でも、まだ透明度とz座標による表示順序を考慮していないです。
あと、glのpixelsのままでtextureではないのでrotateなどが効かないとおもいます。(たぶん)
Example 1
(text content x y)は(x,y)座標に渡した文字列を表示します。色を変えるのはfillです。これはprocessingに倣いました。
(use gl.processing) (define draw (draw-once$ (lambda () (text "word" 15 30) (fill 0 102 153) (text "word" 15 60) (fill 0 102 153 51) (text "word" 15 90)) :save "foo.png")) (define main (setup$ (lambda () (window 100 100 "glc Tutorial" 0 0) (text-font! (load-font "Utopia")))
Example2
(text content x y width height)は、幅と高さを指定して折り返しをしながら表示します。
(use gl.processing) (define draw (draw-once$ (lambda () (fill 255 255 255) (let1 s "The quick brown fox jumped over the lazy dog."; (text s 15 20 80 70)) :save "foo2.png"))) (define main (setup$ (lambda () (window 100 100 "glc Tutorial" 0 0) (text-font! (load-font "Utopia" 12))) :draw draw))
ちなみに、(text content x y width height)の定義はかなり複雑になってしまいました。
これ、後で読めなそう…かもしれません。
(define (%text5 content x y width height) (define (%add-offset width) (+ width (quotient *font-scale* 2))) (define (divide-string width letter-size) (define (loop xs acc tmp i) (match xs [() (reverse (cons (reverse tmp) acc))] [(x . xs*) (let1 len (* letter-size (string-length x)) (cond [(> len width) (let1 n (quotient width letter-size) (let ((x* (substring x n -1)) (acc* (cons (reverse (cons (substring x 0 n) tmp)) acc))) (if (string=? x* "") (loop xs* acc* '() 0) (loop (cons x* xs*) acc* '() 0))))] [(> (+ len i) width) (loop xs* (cons (reverse tmp) acc) (list x) (+ letter-size len))] [else (loop xs* acc (cons x tmp) (+ i letter-size len))]))])) (match-let1 (x . xs) (string-split content " ") (let1 len (* letter-size (string-length x)) (cond [(> len width) (let1 n (quotient width letter-size) (let ((xs* (cons (substring x n -1) xs)) (x* (substring x 0 n))) (loop xs* `((,x*)) '() 0)))] [else (loop xs '() `(,x) len)]))))