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)]))))