Mercurial > hg > indyvon
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)))))))