changeset 119:91c341698f7e

Use FontRenderContext based on rendering hints when Graphics is not available. Obtain text rendering hints from desktop properties.
author Mikhail Kryshen <mikhail@kryshen.net>
date Tue, 03 Apr 2012 18:28:12 +0400
parents b6b83ca37318
children 87ebc46cc66d
files src/net/kryshen/indyvon/component.clj src/net/kryshen/indyvon/core.clj src/net/kryshen/indyvon/layers.clj
diffstat 3 files changed, 49 insertions(+), 32 deletions(-) [+]
line diff
     1.1 --- a/src/net/kryshen/indyvon/component.clj	Fri Mar 02 18:53:38 2012 +0400
     1.2 +++ b/src/net/kryshen/indyvon/component.clj	Tue Apr 03 18:28:12 2012 +0400
     1.3 @@ -26,9 +26,6 @@
     1.4     (java.awt.geom Rectangle2D$Double)
     1.5     (javax.swing JFrame JPanel JOptionPane)))
     1.6  
     1.7 -(defn font-context [^Component component]
     1.8 -  (.getFontRenderContext (.getFontMetrics component (.getFont component))))
     1.9 -
    1.10  (defn- paint-component [^Component c ^Graphics g scene]
    1.11    (let [size (.getSize c)]
    1.12      (.setColor g (:back-color *theme*))
    1.13 @@ -36,7 +33,7 @@
    1.14      (draw-scene! scene g (.width size) (.height size))))
    1.15  
    1.16  (defn- preferred-size [^Component c scene]
    1.17 -  (let [geom (scene-geometry scene (font-context c))]
    1.18 +  (let [geom (scene-geometry scene)]
    1.19      (Dimension. (width geom) (height geom))))
    1.20  
    1.21  (defn ^JPanel make-jpanel
    1.22 @@ -44,7 +41,10 @@
    1.23       (make-jpanel layer (root-event-dispatcher)))
    1.24    ([layer event-dispatcher]
    1.25       (let [panel (proxy [JPanel] [])
    1.26 -           scene (make-scene layer event-dispatcher panel)]
    1.27 +           scene (make-scene
    1.28 +                  layer event-dispatcher panel
    1.29 +                  (.getDesktopProperty (java.awt.Toolkit/getDefaultToolkit)
    1.30 +                                       "awt.font.desktophints"))]
    1.31         (update-proxy
    1.32          panel
    1.33          {"paintComponent" #(paint-component %1 %2 scene)
     2.1 --- a/src/net/kryshen/indyvon/core.clj	Fri Mar 02 18:53:38 2012 +0400
     2.2 +++ b/src/net/kryshen/indyvon/core.clj	Tue Apr 03 18:28:12 2012 +0400
     2.3 @@ -34,8 +34,6 @@
     2.4  
     2.5  (def ^:dynamic ^Graphics2D *graphics*)
     2.6  
     2.7 -(def ^:dynamic ^FontRenderContext *font-context*)
     2.8 -
     2.9  (def ^:dynamic *width*
    2.10    "Width of the rendering area.")
    2.11  
    2.12 @@ -269,6 +267,16 @@
    2.13  ;; Rendering
    2.14  ;;
    2.15  
    2.16 +(defn ^FontRenderContext font-context
    2.17 +  "Returns FontRenderContext for the current Layer context."
    2.18 +  []
    2.19 +  (if (bound? (var *graphics*))
    2.20 +    (.getFontRenderContext *graphics*)
    2.21 +    (let [scene *scene*]
    2.22 +      (if-let [^Component c (:component scene)]
    2.23 +        (.getFontRenderContext (.getFontMetrics c (.getFont c)))
    2.24 +        (:font-context scene)))))
    2.25 +
    2.26  (defn ^AffineTransform relative-transform
    2.27    "Returns AffineTransform: layer context -> AWT component."
    2.28    []
    2.29 @@ -392,8 +400,7 @@
    2.30            old (.getRenderingHints g)]
    2.31        (try
    2.32          (.addRenderingHints g hints)
    2.33 -        (binding [*font-context* (.getFontRenderContext g)]
    2.34 -          (apply f args))
    2.35 +        (apply f args)
    2.36          (finally
    2.37           (.setRenderingHints g old))))
    2.38      (apply f args)))
    2.39 @@ -412,8 +419,7 @@
    2.40           old-t# (.getTransform g#)]
    2.41       (try
    2.42         (.transform g# ~transform)
    2.43 -       (binding [*font-context* (.getFontRenderContext g#)]
    2.44 -         ~@body)
    2.45 +       ~@body
    2.46         (finally
    2.47          (.setTransform g# old-t#)))))
    2.48  
    2.49 @@ -664,15 +670,39 @@
    2.50  ;; Scene
    2.51  ;;
    2.52  
    2.53 -(defrecord Scene [layer event-dispatcher component next-state])
    2.54 +(defrecord Scene [layer
    2.55 +                  event-dispatcher
    2.56 +                  component
    2.57 +                  rendering-hints
    2.58 +                  font-context
    2.59 +                  next-state])
    2.60 +
    2.61 +;; Define rendering hints that affect font metrics to make sure that
    2.62 +;; Graphics and Scene FontRenderContexts are consistent.
    2.63 +(def ^:private default-rendering-hints
    2.64 +  {RenderingHints/KEY_TEXT_ANTIALIASING
    2.65 +   RenderingHints/VALUE_TEXT_ANTIALIAS_DEFAULT,
    2.66 +   RenderingHints/KEY_FRACTIONALMETRICS
    2.67 +   RenderingHints/VALUE_FRACTIONALMETRICS_DEFAULT})
    2.68  
    2.69  (defn make-scene
    2.70    ([layer]
    2.71       (make-scene layer dummy-event-dispatcher nil))
    2.72    ([layer event-dispatcher]
    2.73       (make-scene layer event-dispatcher nil))
    2.74 -  ([layer event-dispatcher component]
    2.75 -     (->Scene layer event-dispatcher component (atom nil))))
    2.76 +  ([layer event-dispatcher ^Component component]
    2.77 +     (make-scene layer event-dispatcher component nil))
    2.78 +  ([layer event-dispatcher ^Component component hints]
    2.79 +     (let [hints (merge default-rendering-hints hints)]
    2.80 +       (->Scene layer
    2.81 +                event-dispatcher
    2.82 +                component
    2.83 +                hints
    2.84 +                (FontRenderContext.
    2.85 +                 nil
    2.86 +                 (get hints RenderingHints/KEY_TEXT_ANTIALIASING)
    2.87 +                 (get hints RenderingHints/KEY_FRACTIONALMETRICS))
    2.88 +                (atom nil)))))
    2.89  
    2.90  (defn- get-and-set!
    2.91    "Atomically sets the value of atom to newval and returns the old
    2.92 @@ -685,22 +715,10 @@
    2.93  
    2.94  (defn draw-scene!
    2.95    [scene ^Graphics2D graphics width height]
    2.96 -  ;; (.setRenderingHint graphics
    2.97 -  ;;                    RenderingHints/KEY_INTERPOLATION
    2.98 -  ;;                    RenderingHints/VALUE_INTERPOLATION_BILINEAR)
    2.99 -  ;; (.setRenderingHint graphics
   2.100 -  ;;                    RenderingHints/KEY_ALPHA_INTERPOLATION
   2.101 -  ;;                    RenderingHints/VALUE_ALPHA_INTERPOLATION_QUALITY)
   2.102 -  ;; (.setRenderingHint graphics
   2.103 -  ;;                    RenderingHints/KEY_ANTIALIASING
   2.104 -  ;;                    RenderingHints/VALUE_ANTIALIAS_ON)
   2.105 -  ;; (.setRenderingHint graphics
   2.106 -  ;;                    RenderingHints/KEY_TEXT_ANTIALIASING
   2.107 -  ;;                    RenderingHints/VALUE_TEXT_ANTIALIAS_ON)
   2.108 +  (.addRenderingHints graphics (:rendering-hints scene))
   2.109    (binding [*states* (get-and-set! (:next-state scene) nil)
   2.110              *scene* scene
   2.111              *graphics* graphics
   2.112 -            *font-context* (.getFontRenderContext graphics)
   2.113              *initial-transform* (.getTransform graphics)
   2.114              *inverse-initial-transform* (-> graphics
   2.115                                              .getTransform
   2.116 @@ -722,9 +740,8 @@
   2.117           (remove-observers tmp-watcher)
   2.118           (commit (:event-dispatcher scene)))))))
   2.119    
   2.120 -(defn scene-geometry [scene font-context]
   2.121 -  (binding [*scene* scene
   2.122 -            *font-context* font-context]
   2.123 +(defn scene-geometry [scene]
   2.124 +  (binding [*scene* scene]
   2.125      (geometry (:layer scene))))
   2.126  
   2.127  (defn set-cursor! [^Cursor cursor]
     3.1 --- a/src/net/kryshen/indyvon/layers.clj	Fri Mar 02 18:53:38 2012 +0400
     3.2 +++ b/src/net/kryshen/indyvon/layers.clj	Tue Apr 03 18:28:12 2012 +0400
     3.3 @@ -213,7 +213,7 @@
     3.4            (let [w *width*
     3.5                  h *height*
     3.6                  font (.getFont *graphics*)
     3.7 -                layouts (layout-text lines font *font-context*)
     3.8 +                layouts (layout-text lines font (font-context))
     3.9                  y (align-y (text-height layouts) h v-align)]
    3.10              (loop [layouts layouts, y y]
    3.11                (when-first [^TextLayout layout layouts]
    3.12 @@ -223,7 +223,7 @@
    3.13                    (.draw layout *graphics* x (+ y ascent))
    3.14                    (recur (next layouts) (+ y lh)))))))
    3.15          (geometry [layer]
    3.16 -          (let [layouts (layout-text lines (:font *theme*) *font-context*)
    3.17 +          (let [layouts (layout-text lines (:font *theme*) (font-context))
    3.18                  w (text-width layouts)
    3.19                  h (text-height layouts)]
    3.20              (->Size w h)))))))