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))