Mercurial > hg > indyvon
changeset 59:b68de6a43f29
Asynchronous drawing (incomplete).
author | Mikhail Kryshen <mikhail@kryshen.net> |
---|---|
date | Mon, 23 Aug 2010 14:06:13 +0400 |
parents | 64b67aa224f4 |
children | 7e456697924d |
files | src/net/kryshen/indyvon/demo.clj src/net/kryshen/indyvon/layers.clj |
diffstat | 2 files changed, 60 insertions(+), 4 deletions(-) [+] |
line diff
1.1 --- a/src/net/kryshen/indyvon/demo.clj Fri Aug 20 21:44:03 2010 +0400 1.2 +++ b/src/net/kryshen/indyvon/demo.clj Mon Aug 23 14:06:13 2010 +0400 1.3 @@ -38,7 +38,7 @@ 1.4 (.setColor Color/YELLOW) 1.5 (.fillRect 0 0 *width* *height*)) 1.6 (with-rotate 0.5 0 0 1.7 - (draw! layer1b 10 5)) 1.8 + (draw! layer1b 30 25)) 1.9 (draw! layer1 55 5)) 1.10 (layer-size [layer] (Size. 70 65)))) 1.11 1.12 @@ -71,7 +71,7 @@ 1.13 (reify 1.14 Layer 1.15 (render! [layer] 1.16 - ;;(*update*) 1.17 + (*update*) 1.18 (doto *graphics* 1.19 (.setColor (rand-nth [Color/BLACK Color/BLUE Color/RED])) 1.20 (.drawLine 0 0 *width* *height*))
2.1 --- a/src/net/kryshen/indyvon/layers.clj Fri Aug 20 21:44:03 2010 +0400 2.2 +++ b/src/net/kryshen/indyvon/layers.clj Mon Aug 23 14:06:13 2010 +0400 2.3 @@ -12,8 +12,11 @@ 2.4 (net.kryshen.indyvon.core Size Location) 2.5 (java.lang.ref SoftReference) 2.6 (java.awt Font Cursor Image Toolkit) 2.7 - (java.awt.image ImageObserver) 2.8 - (java.awt.font FontRenderContext TextLayout))) 2.9 + (java.awt.image ImageObserver BufferedImage) 2.10 + (java.awt.font FontRenderContext TextLayout) 2.11 + (java.util.concurrent ThreadPoolExecutor 2.12 + ThreadPoolExecutor$DiscardOldestPolicy 2.13 + ArrayBlockingQueue TimeUnit))) 2.14 2.15 ;; Define as macro to avoid unnecessary calculation of inner and outer 2.16 ;; sizes in the first case. 2.17 @@ -170,6 +173,59 @@ 2.18 height (if (pos? height) height 1)] 2.19 (Size. width height)))))) 2.20 2.21 +;; (defn- validate-buffer [^Image image restore-fn] 2.22 +;; (if (and image 2.23 +;; (>= (.getWidth image nil) *width*) 2.24 +;; (>= (.getHeight image nil) *height*)) 2.25 +;; image 2.26 +;; ;;(let [image (BufferedImage. *width* *height* BufferedImage/TYPE_INT_ARGB)] 2.27 +;; (let [image (.createImage *target* *width* *height*)] 2.28 +;; (restore-fn image) 2.29 +;; image))) 2.30 + 2.31 +(defn async-layer 2.32 + "Creates layer that draws the content asynchroniously in an 2.33 + offscreen buffer." 2.34 + [content width height] 2.35 + ;; TODO: dynamic size. 2.36 + (let [executor (ThreadPoolExecutor. 1 1 0 TimeUnit/SECONDS 2.37 + (ArrayBlockingQueue. 1) 2.38 + (ThreadPoolExecutor$DiscardOldestPolicy.)) 2.39 + buffers (ref 2.40 + [(BufferedImage. width height BufferedImage/TYPE_INT_ARGB) 2.41 + (BufferedImage. width height BufferedImage/TYPE_INT_ARGB)]) 2.42 + updated (ref false) 2.43 + draw-offscreen 2.44 + (fn [] 2.45 + (let [b (dosync (let [b (peek @buffers)] 2.46 + (alter buffers pop) 2.47 + b))] 2.48 + ;; TODO: set complete layer context. 2.49 + (binding [*graphics* (.getGraphics b) 2.50 + *width* width 2.51 + *height* height 2.52 + ;; !!! 2.53 + *update* #(.execute executor draw-offscreen)] 2.54 + (render! content)) 2.55 + (dosync 2.56 + (alter buffers conj b) 2.57 + (ref-set updated true))))] 2.58 + (reify 2.59 + Layer 2.60 + (render! [layer] 2.61 + (let [b (dosync 2.62 + (if @updated 2.63 + (do (peek @buffers) 2.64 + (alter buffers pop) 2.65 + (ref-set updated false)) 2.66 + (do (first @buffers) 2.67 + (alter buffers next))))] 2.68 + (.drawImage *graphics* b) 2.69 + (dosync 2.70 + (alter buffers #(cons b %))))) 2.71 + (layer-size [layer] 2.72 + (Size. width height))))) 2.73 + 2.74 (defn viewport 2.75 "Creates scrollable viewport layer." 2.76 ([content] (viewport content :left :top))