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.