view src/indyvon/core.clj @ 13:c6009a144727

Layer decorator macro.
author Mikhail Kryshen <mikhail@kryshen.net>
date Mon, 14 Jun 2010 06:26:07 +0400
parents ea6fc44f19c8
children 0a2fafca72d8
line source
1 ;;
2 ;; Copyright (C) 2010 Mikhail Kryshen <mikhail@kryshen.net>
3 ;;
4 ;; This file is part of Indyvon.
5 ;;
7 (ns indyvon.core)
9 (defprotocol Layer
10 (render! [this context graphics])
11 (size [this context])
12 (anchor [this context]))
14 (defrecord LayerContext [layer parent x y width height update-fn dispatcher])
16 (defn default-context []
17 (LayerContext. nil nil 0 0 0 0 nil nil))
19 (defn- spec-map
20 ([specs]
21 (spec-map {} specs))
22 ([mm specs]
23 (if-let [form (first specs)]
24 (recur (conj mm [(first form) (next form)])
25 (next specs))
26 mm)))
28 (defn- merge-specs [s1 s2]
29 (for [spec (spec-map (spec-map s1) s2)]
30 (cons (first spec) (second spec))))
32 (defmacro reify-layer [& specs]
33 `(reify Layer ~@(merge-specs
34 '((size [_ _] [0 0])
35 (anchor [_ _] [0 0]))
36 specs)))
38 (defn- make-graphics [g x y w h clip]
39 (if clip
40 (.create g x y w h)
41 (doto (.create g)
42 (.translate x y))))
44 (defn draw!
45 "Render layer in a new graphics context."
46 ([context layer graphics]
47 (draw! context layer graphics
48 0 0 (:width context) (:height context)))
49 ([context layer graphics x y]
50 (draw! context layer graphics x y true))
51 ([context layer graphics x y clip]
52 (let [s (size layer context)]
53 (draw! context layer graphics
54 x y (s 0) (s 1) clip)))
55 ([context layer graphics x y w h]
56 (draw! context layer graphics
57 x y w h true))
58 ([context layer graphics x y w h clip]
59 (let [graphics (make-graphics graphics x y w h clip)]
60 (try
61 (render! layer
62 (assoc context
63 :layer layer
64 :parent context
65 :x (+ (:x context) x)
66 :y (+ (:y context) y)
67 :width w
68 :height h)
69 graphics)
70 (finally
71 (.dispose graphics))))))
73 (defmacro decorate-layer [layer & specs]
74 `(let [layer# ~layer]
75 (reify Layer ~@(merge-specs
76 `((~'render! [l# c# g#] (draw! c# layer# g#))
77 (~'size [l# c#] (size layer# c#))
78 (~'anchor [l# c#] (anchor layer# c#)))
79 specs))))