Mercurial > hg > indyvon
changeset 68:9b511fe09867
Code cleanup, docstrings.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Sun, 29 Aug 2010 03:59:10 +0400 |
parents | a19cf5007d14 |
children | 01b4187c19e4 |
files | project.clj src/net/kryshen/indyvon/async.clj src/net/kryshen/indyvon/core.clj src/net/kryshen/indyvon/layers.clj |
diffstat | 4 files changed, 64 insertions(+), 67 deletions(-) [+] |
line diff
1.1 --- a/project.clj Sat Aug 28 02:37:30 2010 +0400 1.2 +++ b/project.clj Sun Aug 29 03:59:10 2010 +0400 1.3 @@ -1,5 +1,6 @@ 1.4 (defproject indyvon "1.0.0-SNAPSHOT" 1.5 :description "INteractive DYnamic VisualizatiON library" 1.6 + ;;:warn-on-reflection true 1.7 :dependencies [[org.clojure/clojure "1.2.0"] 1.8 [org.clojure/clojure-contrib "1.2.0"]] 1.9 :dev-dependencies [[swank-clojure/swank-clojure "1.2.1"]]
2.1 --- a/src/net/kryshen/indyvon/async.clj Sat Aug 28 02:37:30 2010 +0400 2.2 +++ b/src/net/kryshen/indyvon/async.clj Sun Aug 29 03:59:10 2010 +0400 2.3 @@ -28,21 +28,22 @@ 2.4 ;; not in use 2.5 2.6 (defn- create-image [async-layer] 2.7 + ;; TODO: support different image types. 2.8 (BufferedImage. (:width async-layer) (:height async-layer) 2.9 - BufferedImage/TYPE_INT_ARGB)) 2.10 + BufferedImage/TYPE_INT_ARGB_PRE)) 2.11 2.12 -(defn- create-buffer [async-layer id] 2.13 - (Buffer. id (create-image async-layer) 0 :free)) 2.14 +(defn- create-buffer [async-layer] 2.15 + (Buffer. (Object.) (create-image async-layer) 0 :free)) 2.16 2.17 -(defn- find-buffer [buffers & states] 2.18 +(defn- find-buffer 2.19 "Find a buffer with the one of the specified states given 2.20 in the order of preference." 2.21 + [buffers & states] 2.22 (some identity 2.23 (for [state states] 2.24 (some #(if (= (:state %) state) % nil) buffers)))) 2.25 2.26 -(defn- replace-buffer 2.27 - [buffers buffer] 2.28 +(defn- replace-buffer [buffers buffer] 2.29 (conj (remove #(= (:id %) (:id buffer)) buffers) 2.30 buffer)) 2.31 2.32 @@ -62,31 +63,28 @@ 2.33 (alter (:buffers al) replace-buffer b) 2.34 b))) 2.35 2.36 -(defn- release-buffer 2.37 - [al buffer] 2.38 +(defn- release-buffer [al buffer] 2.39 (dosync 2.40 - (let [buffers @(:buffers al) 2.41 - state (:state buffer) 2.42 + (let [state (:state buffer) 2.43 readers (if (= state :front) 2.44 (dec (:readers buffer)) 2.45 (:readers buffer)) 2.46 state (cond 2.47 (pos? readers) :front 2.48 (= :back (:state buffer)) :fresh 2.49 - :default :free) 2.50 - buffers 2.51 - (if (= state :fresh) 2.52 - ;; Change state of all the other buffers from :fresh to :free. 2.53 - (reduce replace-buffer buffers 2.54 - (for [b buffers :when (= (:state b) :fresh)] 2.55 - (assoc b :state :free))) 2.56 - buffers) 2.57 - buffers (replace-buffer buffers (assoc buffer 2.58 + :default :free)] 2.59 + (when (= state :fresh) 2.60 + ;; Change state of the prefiously fresh buffer to :free. 2.61 + (when-let [fresh (find-buffer @(:buffers al) :fresh)] 2.62 + (alter (:buffers al) replace-buffer (assoc fresh 2.63 + :state :free)))) 2.64 + (alter (:buffers al) replace-buffer (assoc buffer 2.65 :state state 2.66 - :readers readers))] 2.67 - (ref-set (:buffers al) buffers)))) 2.68 - 2.69 -(defmacro with-buffer [al type [name] & body] 2.70 + :readers readers))))) 2.71 + 2.72 +(defmacro with-buffer 2.73 + {:private true} 2.74 + [al type [name] & body] 2.75 `(let [al# ~al 2.76 ~name (take-buffer al# ~type)] 2.77 (try 2.78 @@ -98,7 +96,7 @@ 2.79 ;;(Thread/sleep 1000) 2.80 (with-buffer async-layer :back [b] 2.81 (draw-root! (:content async-layer) 2.82 - (.getGraphics (:image b)) 2.83 + (.getGraphics ^Image (:image b)) 2.84 (:width async-layer) 2.85 (:height async-layer) 2.86 dummy-event-dispatcher)) 2.87 @@ -115,8 +113,7 @@ 2.88 (add-context-observer content (fn [_] (draw-offscreen-async layer))) 2.89 (when-not @buffers 2.90 ;; TODO: dynamic size, recreate buffers when size increases. 2.91 - (let [new-buffers (list (create-buffer layer 1) 2.92 - (create-buffer layer 2))] 2.93 + (let [new-buffers (repeatedly 2 (partial create-buffer layer))] 2.94 (dosync 2.95 (ref-set buffers new-buffers))) 2.96 (draw-offscreen-async layer)) 2.97 @@ -126,7 +123,7 @@ 2.98 (Size. width height))) 2.99 2.100 (defn async-layer 2.101 - "Creates layer that draws the content asynchronously in an 2.102 + "Creates layer that draws the content asynchronously using 2.103 offscreen buffer." 2.104 [content width height] 2.105 (AsyncLayer. content width height
3.1 --- a/src/net/kryshen/indyvon/core.clj Sat Aug 28 02:37:30 2010 +0400 3.2 +++ b/src/net/kryshen/indyvon/core.clj Sun Aug 29 03:59:10 2010 +0400 3.3 @@ -23,9 +23,11 @@ 3.4 :doc "Target AWT component, may be nil if drawing off-screen."} 3.5 *target*) 3.6 3.7 -(def *width*) 3.8 +(def ^{:doc "Width of the rendering area."} 3.9 + *width*) 3.10 3.11 -(def *height*) 3.12 +(def ^{:doc "Height of the rendering area."} 3.13 + *height*) 3.14 3.15 (def ^Shape *clip*) 3.16 3.17 @@ -34,19 +36,19 @@ 3.18 (def *event-dispatcher*) 3.19 3.20 (def ^{:tag AffineTransform 3.21 - :doc "Initial transform associated with the graphics context"} 3.22 + :doc "Initial transform associated with the graphics context."} 3.23 *initial-transform*) 3.24 3.25 (def ^{:tag AffineTransform 3.26 :doc "Inversion of the initial transform associated with 3.27 - the graphics context"} 3.28 + the graphics context."} 3.29 *inverse-initial-transform*) 3.30 3.31 (defrecord Theme [fore-color back-color alt-back-color border-color font]) 3.32 3.33 ;; REMIND: use system colors, see java.awt.SystemColor. 3.34 (defn default-theme [] 3.35 - (Theme. Color/BLACK Color/LIGHT_GRAY Color/WHITE 3.36 + (Theme. Color/BLACK Color/WHITE Color/LIGHT_GRAY 3.37 Color/BLUE (Font. "Sans" Font/PLAIN 12))) 3.38 3.39 (def *theme* (default-theme)) 3.40 @@ -83,23 +85,26 @@ 3.41 "Anchor point: [x y], h-align could be :left, :center or :right, 3.42 v-align is :top, :center or :bottom")) 3.43 3.44 +(defn default-anchor [layer h-align v-align] 3.45 + (if (and (= h-align :left) 3.46 + (= v-align :top)) 3.47 + (Location. 0 0) 3.48 + (let [size (layer-size layer)] 3.49 + (Location. 3.50 + (case h-align 3.51 + :top 0 3.52 + :center (/ (:width size) 2) 3.53 + :right (:width size)) 3.54 + (case v-align 3.55 + :left 0 3.56 + :center (/ (:height size) 2) 3.57 + :bottom (:height size)))))) 3.58 + 3.59 ;; Default implementation of Anchored for any Layer. 3.60 (extend-protocol Anchored 3.61 net.kryshen.indyvon.core.Layer 3.62 (anchor [this h-align v-align] 3.63 - (if (and (= h-align :left) 3.64 - (= v-align :top)) 3.65 - (Location. 0 0) 3.66 - (let [size (layer-size this)] 3.67 - (Location. 3.68 - (case h-align 3.69 - :top 0 3.70 - :center (/ (:width size) 2) 3.71 - :right (:width size)) 3.72 - (case v-align 3.73 - :left 0 3.74 - :center (/ (:height size) 2) 3.75 - :bottom (:height size))))))) 3.76 + (default-anchor this h-align v-align))) 3.77 3.78 (defn- assoc-cons [m key val] 3.79 (->> (get m key) (cons val) (assoc m key))) 3.80 @@ -114,7 +119,7 @@ 3.81 (def observers (atom nil)) 3.82 3.83 ;; TODO: groups should be weakly referenced. 3.84 -;; Need persistent analog to java.util.WeakHashMap. 3.85 +;; Need persistent analog of java.util.WeakHashMap. 3.86 (defn add-observer 3.87 "Add observer fn for the target to the specified group." 3.88 [group target f] 3.89 @@ -143,11 +148,6 @@ 3.90 (doseq [f (reduce #(concat %1 (get %2 target)) nil (vals @observers))] 3.91 (apply f target args))) 3.92 3.93 -(defn repaint 3.94 - "Repaint the current scene." 3.95 - [] 3.96 - (update *root*)) 3.97 - 3.98 (defn add-context-observer 3.99 "Observer registered with this function will be automatically 3.100 removed after the next frame rendering is complete." 3.101 @@ -162,6 +162,11 @@ 3.102 (if (not= root target) 3.103 (add-observer root target (fn [_] (update root)))))) 3.104 3.105 +(defn repaint 3.106 + "Repaint the current scene." 3.107 + [] 3.108 + (update *root*)) 3.109 + 3.110 ;; 3.111 ;; Rendering 3.112 ;; 3.113 @@ -262,13 +267,10 @@ 3.114 (finally 3.115 (.setColor *graphics* color#))))) 3.116 3.117 -;; TODO: 3.118 -;; 3.119 -;; (with-transform 3.120 -;; (rotate ...) 3.121 -;; (draw ...) 3.122 -;; (scale ...) 3.123 -;; (draw ...)) 3.124 +;; TODO: constructor for AffineTransform. 3.125 +;; (transform :scale 0.3 0.5 3.126 +;; :translate 5 10 3.127 +;; :rotate (/ Math/PI 2)) 3.128 3.129 (defmacro with-transform [transform & body] 3.130 `(let [old-t# (.getTransform *graphics*)] 3.131 @@ -282,11 +284,6 @@ 3.132 `(let [transform# (AffineTransform/getRotateInstance ~theta ~ax ~ay)] 3.133 (with-transform transform# ~@body))) 3.134 3.135 -(defn- geometry-vec [geometry] 3.136 - (if (vector? geometry) 3.137 - geometry 3.138 - [(:x geometry) (:y geometry) (:width geometry) (:height geometry)])) 3.139 - 3.140 (defn draw! 3.141 "Draws layer." 3.142 ([layer]
4.1 --- a/src/net/kryshen/indyvon/layers.clj Sat Aug 28 02:37:30 2010 +0400 4.2 +++ b/src/net/kryshen/indyvon/layers.clj Sun Aug 29 03:59:10 2010 +0400 4.3 @@ -111,9 +111,10 @@ 4.4 (reduce (fn [w ^TextLayout tl] (max w (.getAdvance tl))) 0 layouts)) 4.5 4.6 (defn- text-height [layouts] 4.7 - (reduce (fn [w ^TextLayout tl] (+ w (.getAscent tl) 4.8 - (.getDescent tl) 4.9 - (.getLeading tl))) 4.10 + (reduce (fn [w ^TextLayout tl] 4.11 + (+ w (.getAscent tl) 4.12 + (.getDescent tl) 4.13 + (.getLeading tl))) 4.14 0 layouts)) 4.15 4.16 (defn text-layer 4.17 @@ -226,7 +227,8 @@ 4.18 (ref-set fix-x (:x-on-screen e)) 4.19 (ref-set fix-y (:y-on-screen e))) 4.20 (update layer)))) 4.21 - (layer-size [layer] (layer-size content)))))) 4.22 + (layer-size [layer] 4.23 + (layer-size content)))))) 4.24 4.25 ;; 4.26 ;; Layer context decorators.