Created
March 19, 2015 14:28
-
-
Save wilkerlucio/46585bcc2b0ab318b0fd to your computer and use it in GitHub Desktop.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| (defmulti render :type) | |
| (defn render-off-screen [f w h] | |
| (let [canvas (doto (.createElement js/document "canvas") | |
| (aset "width" w) (aset "height" h)) | |
| ctx (.getContext canvas "2d")] | |
| (f ctx) | |
| canvas)) | |
| (defn clear-canvas [canvas] | |
| (doto (.getContext canvas "2d") | |
| (.clearRect 0 0 (.-width canvas) (.-height canvas)))) | |
| (defn surface [data owner] | |
| (reify | |
| om/IDisplayName | |
| (display-name [_] "Surface") | |
| om/IWillUpdate | |
| (will-update [_ _ _] (.log js/console "updating canvas") (clear-canvas (om/get-node owner))) | |
| om/IRender | |
| (render [_] | |
| (apply dom/canvas #js {:width 300 :height 300} (map #(render (assoc % :surface owner)) data))))) | |
| (defn render-to-cache [owner render-fn w h] | |
| (om/set-state! owner :rendered (render-off-screen render-fn w h))) | |
| (defn render-cached [owner] | |
| (let [ctx (-> (om/get-props owner :surface) (om/get-node) (.getContext "2d"))] | |
| (.drawImage ctx (om/get-state owner :rendered) 0 0))) | |
| (defn surface-square [{:keys [width height x y] :as data} owner] | |
| (let [render (fn [ctx] (.fillRect ctx x y width height))] | |
| (reify | |
| om/IShouldUpdate (should-update [_ _ _] true) | |
| om/IDisplayName (display-name [_] "Square") | |
| om/IDidMount | |
| (did-mount [_] | |
| (render-to-cache owner render width height) | |
| (render-cached owner)) | |
| om/IDidUpdate | |
| (did-update [_ props _] | |
| (if (not= props data) (render-to-cache owner render width height)) | |
| (render-cached owner)) | |
| om/IRender | |
| (render [_] nil)))) | |
| (defmethod render :square [d] (om/build surface-square d)) | |
| (om/build surface | |
| [{:type :square :x 10 :y 10 :width 20 :height 20}]) |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment