Mercurial > hg > indyvon
changeset 1:a93cfcf60f27
Layers.
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Mon, 07 Jun 2010 04:42:52 +0400 |
parents | 43e3358ca4d9 |
children | 0f2a98f71a9c |
files | src/indyvon/core.clj src/indyvon/layer.clj |
diffstat | 2 files changed, 105 insertions(+), 65 deletions(-) [+] |
line diff
1.1 --- a/src/indyvon/core.clj Sun Jun 06 06:03:38 2010 +0400 1.2 +++ b/src/indyvon/core.clj Mon Jun 07 04:42:52 2010 +0400 1.3 @@ -1,1 +1,105 @@ 1.4 -(ns indyvon.core) 1.5 +(ns indyvon.core 1.6 + (:import (java.awt Dimension Point Component Graphics2D))) 1.7 + 1.8 +(def ^{:private true} *graphics*) 1.9 +(def ^{:private true} *rx* 0) 1.10 +(def ^{:private true} *ry* 0) 1.11 + 1.12 +(def *width*) 1.13 +(def *height*) 1.14 + 1.15 +(def *lag*) 1.16 + 1.17 +(def *update-fn*) 1.18 + 1.19 +(defprotocol Layer 1.20 + (render! [this]) 1.21 + (size [this]) 1.22 + (anchor [this])) 1.23 + 1.24 +;; (defmacro make-layer [& fns] 1.25 +;; (let [fn-map 1.26 +;; (apply hash-map 1.27 +;; (reduce #(conj %1 (first %2) (next %2)) [] 1.28 +;; fns))] 1.29 +;; ;; TODO 1.30 +;; fn-map)) 1.31 + 1.32 +(defn- translate [g x y w h clip] 1.33 + (if clip 1.34 + (.create g x y w h) 1.35 + (doto (.create g) 1.36 + (.translate x y)))) 1.37 + 1.38 +(defn render-layer! 1.39 + "Render layer in a new graphics context." 1.40 + ([layer] 1.41 + (render-layer! layer 0 0 *width* *height*)) 1.42 + ([layer x y] 1.43 + (render-layer! layer x y true)) 1.44 + ([layer x y clip] 1.45 + (let [s (size layer)] 1.46 + (render-layer! layer x y (.width s) (.height s) clip))) 1.47 + ([layer x y w h] 1.48 + (render-layer! layer x y w h true)) 1.49 + ([layer x y w h clip] 1.50 + (binding [*graphics* (translate *graphics* x y w h clip) 1.51 + *rx* (+ *rx* x) 1.52 + *ry* (+ *ry* y) 1.53 + *width* w 1.54 + *height* h] 1.55 + (render! layer)))) 1.56 + 1.57 +(defn- make-update-fn [component] 1.58 + (fn [] (.repaint component))) 1.59 + 1.60 +;; (defn make-component [layer] 1.61 +;; (proxy [Component] [] 1.62 +;; (update [g] (.paint this g)) 1.63 +;; (paint [g] 1.64 +;; (let [insets (.getInsets this) 1.65 +;; top (.top insets) 1.66 +;; left (.left insets) 1.67 +;; bottom (.bottom insets) 1.68 +;; right (.right insets) 1.69 +;; size (.getSize this) 1.70 +;; width (- (.width size) left right) 1.71 +;; height (- (.height size) top bottom)] 1.72 +;; (binding [*graphics* g 1.73 +;; *update-fn* (make-update-fn this)] 1.74 +;; (render-layer! layer top left width height false)))) 1.75 +;; (getPreferredSize [] 1.76 +;; (size layer)))) 1.77 + 1.78 +(defn make-component [layer] 1.79 + (proxy [Component] [] 1.80 + (update [g] (.paint this g)) 1.81 + (paint [g] 1.82 + (let [size (.getSize this) 1.83 + width (.width size) 1.84 + height (.height size)] 1.85 + (binding [*graphics* g 1.86 + *update-fn* (make-update-fn this)] 1.87 + (render-layer! layer 0 0 width height false)))) 1.88 + (getPreferredSize [] 1.89 + (let [s (size layer)] 1.90 + (Dimension. (s 0) (s 1)))))) 1.91 + 1.92 +(comment 1.93 + (do 1.94 + (def frame (java.awt.Frame. "Test")) 1.95 + (def layer 1.96 + (reify Layer 1.97 + (render! [this] 1.98 + (.fillRect *graphics* 10 10 40 40)) 1.99 + (size [this] [100 100]) 1.100 + (anchor [this] [0 0]))) 1.101 + (doto frame 1.102 + (.addWindowListener 1.103 + (proxy [java.awt.event.WindowAdapter] [] 1.104 + (windowClosing [event] (.dispose frame)))) 1.105 + (.add (make-component layer)) 1.106 + (.pack) 1.107 + (.setVisible true)) 1.108 + ) 1.109 + ) 1.110 \ No newline at end of file
2.1 --- a/src/indyvon/layer.clj Sun Jun 06 06:03:38 2010 +0400 2.2 +++ /dev/null Thu Jan 01 00:00:00 1970 +0000 2.3 @@ -1,64 +0,0 @@ 2.4 -(ns indyvon.layer 2.5 - (:import (java.awt Component Graphics2D))) 2.6 - 2.7 -(def ^{:private true} *graphics*) 2.8 -(def ^{:private true} *rx* 0) 2.9 -(def ^{:private true} *ry* 0) 2.10 - 2.11 -(def *width*) 2.12 -(def *height*) 2.13 - 2.14 -(def *lag*) 2.15 - 2.16 -(def *update-fn*) 2.17 - 2.18 -(defprotocol Layer 2.19 - (render! [this]) 2.20 - (size [this]) 2.21 - (anchor [this])) 2.22 - 2.23 -(defn- translate [g x y w h clip] 2.24 - (if clip 2.25 - (.create g x y w h) 2.26 - (doto (.create g) 2.27 - (.translate x y)))) 2.28 - 2.29 -(defn render-layer! 2.30 - "Render layer in a new graphics context." 2.31 - ([layer] 2.32 - (render-layer! layer 0 0 *width* *height*)) 2.33 - ([layer x y] 2.34 - (render-layer! layer x y true)) 2.35 - ([layer x y clip] 2.36 - (let [s (size layer)] 2.37 - (render-layer! layer x y (.width s) (.height s) clip))) 2.38 - ([layer x y w h] 2.39 - (render-layer! layer x y w h true)) 2.40 - ([layer x y w h clip] 2.41 - (binding [*graphics* (translate *graphics* x y w h clip) 2.42 - *rx* (+ *rx* x) 2.43 - *ry* (+ *ry* y) 2.44 - *width* w 2.45 - *height* h] 2.46 - (render! layer)))) 2.47 - 2.48 -(defn- make-update-fn [component] 2.49 - (fn [] (.repaint component))) 2.50 - 2.51 -(defn make-component [layer] 2.52 - (proxy [Component] [] 2.53 - (update [g] (.paint this g)) 2.54 - (paint [g] 2.55 - (let [insets (.getInsets this) 2.56 - top (.top insets) 2.57 - left (.left insets) 2.58 - bottom (.bottom insets) 2.59 - right (.right insets) 2.60 - size (.getSize this) 2.61 - width (- (.width size) left right) 2.62 - height (- (.height size) top bottom)] 2.63 - (binding [*graphics* g 2.64 - *update-fn* (make-update-fn this)] 2.65 - (render-layer! layer top left width height false)))) 2.66 - (getPreferredSize [] 2.67 - (size layer))))