Mercurial > hg > indyvon
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)))))))