changeset 127:911228da1bc8

Revised handling of FontRenderContexts.
author Mikhail Kryshen <mikhail@kryshen.net>
date Thu, 12 Apr 2012 23:13:20 +0400
parents 24c7935a8f06
children d37d6c5b3b08
files src/net/kryshen/indyvon/core.clj
diffstat 1 files changed, 25 insertions(+), 13 deletions(-) [+]
line diff
     1.1 --- a/src/net/kryshen/indyvon/core.clj	Thu Apr 12 19:55:52 2012 +0400
     1.2 +++ b/src/net/kryshen/indyvon/core.clj	Thu Apr 12 23:13:20 2012 +0400
     1.3 @@ -34,6 +34,9 @@
     1.4  
     1.5  (def ^:dynamic ^Graphics2D *graphics*)
     1.6  
     1.7 +(def ^:dynamic ^:private ^FontRenderContext *font-context*
     1.8 +  "FontRenderContext to use when Graphics2D is not available.")
     1.9 +
    1.10  (def ^:dynamic *width*
    1.11    "Width of the rendering area.")
    1.12  
    1.13 @@ -302,10 +305,7 @@
    1.14    []
    1.15    (if (bound? (var *graphics*))
    1.16      (.getFontRenderContext *graphics*)
    1.17 -    (let [scene *scene*]
    1.18 -      (if-let [^Component c (:component scene)]
    1.19 -        (.getFontRenderContext (.getFontMetrics c (.getFont c)))
    1.20 -        (:font-context scene)))))
    1.21 +    *font-context*))
    1.22  
    1.23  (defn ^AffineTransform relative-transform
    1.24    "Returns AffineTransform: layer context -> AWT component."
    1.25 @@ -590,10 +590,13 @@
    1.26  (defn- make-node [handle handlers]
    1.27    (let [clip (if *input-clip*
    1.28                 (clip *input-clip*)
    1.29 -               *clip*)]
    1.30 +               *clip*)
    1.31 +        bindings (-> (get-thread-bindings)
    1.32 +                     (dissoc (var *graphics*))
    1.33 +                     (assoc (var *font-context*) (font-context)))]
    1.34      (DispatcherNode. handle handlers *event-dispatcher* clip
    1.35                       (inverse-relative-transform)
    1.36 -                     (get-thread-bindings))))
    1.37 +                     bindings)))
    1.38  
    1.39  (defn- add-node [tree node]
    1.40    (assoc-cons tree (:parent node) node))
    1.41 @@ -723,7 +726,6 @@
    1.42                    event-dispatcher
    1.43                    component
    1.44                    rendering-hints
    1.45 -                  font-context
    1.46                    next-state])
    1.47  
    1.48  ;; Define rendering hints that affect font metrics to make sure that
    1.49 @@ -747,10 +749,6 @@
    1.50                  event-dispatcher
    1.51                  component
    1.52                  hints
    1.53 -                (FontRenderContext.
    1.54 -                 nil
    1.55 -                 (get hints RenderingHints/KEY_TEXT_ANTIALIASING)
    1.56 -                 (get hints RenderingHints/KEY_FRACTIONALMETRICS))
    1.57                  (atom nil)))))
    1.58  
    1.59  (defn- get-and-set!
    1.60 @@ -789,9 +787,23 @@
    1.61          (finally
    1.62           (remove-observers tmp-watcher)
    1.63           (commit (:event-dispatcher scene)))))))
    1.64 -  
    1.65 +
    1.66 +(defn- scene-font-context [scene]
    1.67 +  (let [hints (:rendering-hints scene)
    1.68 +        ^Component c (:component scene)
    1.69 +        t (if c (->> c
    1.70 +                     .getFont
    1.71 +                     (.getFontMetrics c)
    1.72 +                     .getFontRenderContext
    1.73 +                     .getTransform))]
    1.74 +    (FontRenderContext.
    1.75 +     t
    1.76 +     (get hints RenderingHints/KEY_TEXT_ANTIALIASING)
    1.77 +     (get hints RenderingHints/KEY_FRACTIONALMETRICS))))      
    1.78 +
    1.79  (defn scene-geometry [scene]
    1.80 -  (binding [*scene* scene]
    1.81 +  (binding [*scene* scene
    1.82 +            *font-context* (scene-font-context scene)]
    1.83      (geometry (:layer scene))))
    1.84  
    1.85  (defn set-cursor! [^Cursor cursor]