changeset 15:87bd822aa815

Text layer.
author Mikhail Kryshen <mikhail@kryshen.net>
date Tue, 15 Jun 2010 06:31:11 +0400
parents 0a2fafca72d8
children 0fda22fc53d2
files src/indyvon/component.clj src/indyvon/core.clj
diffstat 2 files changed, 58 insertions(+), 10 deletions(-) [+]
line diff
     1.1 --- a/src/indyvon/component.clj	Tue Jun 15 04:35:57 2010 +0400
     1.2 +++ b/src/indyvon/component.clj	Tue Jun 15 06:31:11 2010 +0400
     1.3 @@ -63,12 +63,15 @@
     1.4               (draw! context layer1b g 10 5)
     1.5               (draw! context layer1 g 55 5))
     1.6            (size [this context] [70 65])))
     1.7 +    (def layer3
     1.8 +         (border-layer (text-layer "Sample\ntext" :right :bottom)))
     1.9      (def layer
    1.10           (reify-layer
    1.11            (render! [this context g]
    1.12               (.drawLine g 0 0 (:width context) (:height context))
    1.13 -             (draw! context layer2 g 15 20))
    1.14 -          (size [this context] [100 100])))
    1.15 +             (draw! context layer2 g 15 20)
    1.16 +             (draw! context layer3 g 100 100 80 50))
    1.17 +          (size [this context] [300 400])))
    1.18      (doto frame
    1.19        (.addWindowListener
    1.20         (proxy [java.awt.event.WindowAdapter] []
     2.1 --- a/src/indyvon/core.clj	Tue Jun 15 04:35:57 2010 +0400
     2.2 +++ b/src/indyvon/core.clj	Tue Jun 15 06:31:11 2010 +0400
     2.3 @@ -5,7 +5,8 @@
     2.4  ;;
     2.5  
     2.6  (ns indyvon.core
     2.7 -  (:import (java.awt Color Font)))
     2.8 +  (:import (java.awt Color Font)
     2.9 +           (java.awt.font FontRenderContext TextLayout)))
    2.10  
    2.11  (defprotocol Layer
    2.12    (render! [this context graphics])
    2.13 @@ -68,7 +69,8 @@
    2.14       (draw! context layer graphics
    2.15                      x y w h true))
    2.16    ([context layer graphics x y w h clip]
    2.17 -     (let [graphics (make-graphics graphics x y w h clip)]
    2.18 +     (let [graphics (make-graphics graphics x y w h clip)
    2.19 +           graphics (apply-theme graphics (:theme context))]
    2.20         (try
    2.21           (render! layer
    2.22                    (assoc context
    2.23 @@ -120,9 +122,52 @@
    2.24               [(+ (a 0) offset)
    2.25                (+ (a 1) offset)]))))))
    2.26  
    2.27 -;; (defn text-layer
    2.28 -;;   ([text]
    2.29 -;;      (text :left :top))
    2.30 -;;   ([text h-align v-align]
    2.31 -;;      (let [newline #"\\r\\n|\\n|\\r|\\u0085|\\u2028|\\u2029"]
    2.32 -;;        (reify-layer))))
    2.33 \ No newline at end of file
    2.34 +(defn- re-split [re s]
    2.35 +  (seq (.split re s)))
    2.36 +
    2.37 +(defn- text-size [lines font font-context]
    2.38 +  (loop [lines lines
    2.39 +         width 0
    2.40 +         height 0]
    2.41 +    (if-let [line (first lines)]
    2.42 +      (let [layout (TextLayout. line font font-context)]
    2.43 +        (recur (next lines)
    2.44 +               (max width (.getAdvance layout))
    2.45 +               (+ height
    2.46 +                  (.getAscent layout)
    2.47 +                  (.getDescent layout)
    2.48 +                  (.getLeading layout))))
    2.49 +      [width height])))
    2.50 +
    2.51 +(defn text-layer
    2.52 +  "Creates a layer to display multiline text."
    2.53 +  ([text]
    2.54 +     (text-layer text :left :top))
    2.55 +  ([text h-align v-align]
    2.56 +     (let [lines (re-split #"\r\n|\n|\r|\u0085|\u2028|\u2029" text)]
    2.57 +       (reify-layer
    2.58 +        (render! [l c g]
    2.59 +           (let [w (:width c)
    2.60 +                 h (:height c)
    2.61 +                 font (.getFont g)
    2.62 +                 font-context (:font-context c)
    2.63 +                 y (case v-align
    2.64 +                     :top 0
    2.65 +                     :center (/ (- h ((text-size
    2.66 +                                       lines font font-context) 1))
    2.67 +                                2)
    2.68 +                     :bottom (- h ((text-size
    2.69 +                                    lines font font-context) 1)))]
    2.70 +             (loop [lines lines, y y]
    2.71 +               (when-first [line lines]
    2.72 +                 (let [layout (TextLayout. line font font-context)
    2.73 +                       ascent (.getAscent layout)
    2.74 +                       lh (+ ascent (.getDescent layout) (.getLeading layout))
    2.75 +                       x (case h-align
    2.76 +                           :left 0
    2.77 +                           :center (/ (- w (.getAdvance layout)) 2)
    2.78 +                           :right (- w (.getAdvance layout)))]
    2.79 +                   (.draw layout g x (+ y ascent))
    2.80 +                   (recur (next lines) (+ y lh)))))))
    2.81 +        (size [l c]
    2.82 +           (text-size lines (-> c :theme :font) (:font-context c)))))))