view src/indyvon/layer.clj @ 0:43e3358ca4d9

Initial.
author Mikhail Kryshen <mikhail@kryshen.net>
date Sun, 06 Jun 2010 06:03:38 +0400
parents
children
line source
1 (ns indyvon.layer
2 (:import (java.awt Component Graphics2D)))
4 (def ^{:private true} *graphics*)
5 (def ^{:private true} *rx* 0)
6 (def ^{:private true} *ry* 0)
8 (def *width*)
9 (def *height*)
11 (def *lag*)
13 (def *update-fn*)
15 (defprotocol Layer
16 (render! [this])
17 (size [this])
18 (anchor [this]))
20 (defn- translate [g x y w h clip]
21 (if clip
22 (.create g x y w h)
23 (doto (.create g)
24 (.translate x y))))
26 (defn render-layer!
27 "Render layer in a new graphics context."
28 ([layer]
29 (render-layer! layer 0 0 *width* *height*))
30 ([layer x y]
31 (render-layer! layer x y true))
32 ([layer x y clip]
33 (let [s (size layer)]
34 (render-layer! layer x y (.width s) (.height s) clip)))
35 ([layer x y w h]
36 (render-layer! layer x y w h true))
37 ([layer x y w h clip]
38 (binding [*graphics* (translate *graphics* x y w h clip)
39 *rx* (+ *rx* x)
40 *ry* (+ *ry* y)
41 *width* w
42 *height* h]
43 (render! layer))))
45 (defn- make-update-fn [component]
46 (fn [] (.repaint component)))
48 (defn make-component [layer]
49 (proxy [Component] []
50 (update [g] (.paint this g))
51 (paint [g]
52 (let [insets (.getInsets this)
53 top (.top insets)
54 left (.left insets)
55 bottom (.bottom insets)
56 right (.right insets)
57 size (.getSize this)
58 width (- (.width size) left right)
59 height (- (.height size) top bottom)]
60 (binding [*graphics* g
61 *update-fn* (make-update-fn this)]
62 (render-layer! layer top left width height false))))
63 (getPreferredSize []
64 (size layer))))