Oops, made a slight mistake in the last patch; I assumed that KEY_TEXT_ANTIALIASING used the VALUE_ANTIALIAS_ON/OFF values, when in fact it has its own VALUE_TEXT_ANTIALIAS_ON/OFF values.

This patch fixes it.

Cheers,
Francis


2006-12-15  Francis Kung  <[EMAIL PROTECTED]>

        * gnu/java/awt/peer/gtk/CairoGraphics2D.java:
        (draw): Pass boolean to setAntialias.
        (drawGlyphVector): Likewise.
        (drawString): Likewise.
        (fill): Likewise.
        (setAntialias): Change signature to accept boolean.


Francis Kung wrote:
Hi,

This patch adds support for the KEY_ANTIALIASING and KEY_TEXT_ANTIALIASING rendering hints.

antialiasing currently defaults to OFF (since this is what Sun does), but I'd like to consider defaulting to ON in classpath. Cairo's anti-aliasing does cost us very much performance, but is visibly better.

text_antialiasing defaults to on.

Cheers,
Francis


2006-12-15  Francis Kung  <[EMAIL PROTECTED]>

    * gnu/java/awt/peer/gtk/CairoGraphics2D.java
    (antialias): New private field.
    (ignoreAA): New private field.
    (cairoSetAntialias): New native method.
    (draw): Check anti-alias setting.
    (drawGlyphVector): Likewise.
    (drawString): Likewise.
    (fill): Likewise.
    (setAntialias): New private method.
    (setup): Set default antialias value.
    * include/gnu_java_awt_peer_gtk_CairoGraphics2D.h: Regenerated.
    * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c:
    (gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetAntialias): New method.


------------------------------------------------------------------------

Index: include/gnu_java_awt_peer_gtk_CairoGraphics2D.h
===================================================================
RCS file: 
/cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_CairoGraphics2D.h,v
retrieving revision 1.14
diff -u -r1.14 gnu_java_awt_peer_gtk_CairoGraphics2D.h
--- include/gnu_java_awt_peer_gtk_CairoGraphics2D.h     21 Nov 2006 16:34:04 
-0000      1.14
+++ include/gnu_java_awt_peer_gtk_CairoGraphics2D.h     15 Dec 2006 21:12:30 
-0000
@@ -44,6 +44,7 @@
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawLine (JNIEnv *env, jobject, 
jlong, jdouble, jdouble, jdouble, jdouble);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoDrawRect (JNIEnv *env, jobject, 
jlong, jdouble, jdouble, jdouble, jdouble);
 JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFillRect (JNIEnv *env, jobject, 
jlong, jdouble, jdouble, jdouble, jdouble);
+JNIEXPORT void JNICALL 
Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetAntialias (JNIEnv *env, 
jobject, jlong, jboolean);
 #undef gnu_java_awt_peer_gtk_CairoGraphics2D_INTERPOLATION_NEAREST
 #define gnu_java_awt_peer_gtk_CairoGraphics2D_INTERPOLATION_NEAREST 0L
 #undef gnu_java_awt_peer_gtk_CairoGraphics2D_INTERPOLATION_BILINEAR
Index: gnu/java/awt/peer/gtk/CairoGraphics2D.java
===================================================================
RCS file: 
/cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java,v
retrieving revision 1.57
diff -u -r1.57 CairoGraphics2D.java
--- gnu/java/awt/peer/gtk/CairoGraphics2D.java  5 Dec 2006 11:11:16 -0000       
1.57
+++ gnu/java/awt/peer/gtk/CairoGraphics2D.java  15 Dec 2006 21:12:30 -0000
@@ -172,6 +172,12 @@
    * Rendering hint map.
    */
   private RenderingHints hints;
+ + /**
+   * Status of the anti-alias flag in cairo.
+   */
+  private boolean antialias = false;
+  private boolean ignoreAA = false;
/**
    * Some operations (drawing rather than filling) require that their
@@ -228,6 +234,7 @@
     setPaint(Color.black);
     setStroke(new BasicStroke());
     setTransform(new AffineTransform());
+    cairoSetAntialias(nativePointer, antialias);
   }
/**
@@ -472,6 +479,11 @@
    * Save clip
    */
   private native void cairoResetClip(long pointer);
+ + /**
+   * Set antialias.
+   */
+  private native void cairoSetAntialias(long pointer, boolean aa);
/**
    * Draws a line from (x1,y1) to (x2,y2).
@@ -1121,7 +1133,8 @@
         Rectangle r = findStrokedBounds(s);
         setCustomPaint(r);
       }
- +
+    setAntialias(hints.get(RenderingHints.KEY_ANTIALIASING));
     createPath(s, true);
     cairoStroke(nativePointer);
   }
@@ -1132,7 +1145,8 @@
if (customPaint)
       setCustomPaint(s.getBounds());
- +
+    setAntialias(hints.get(RenderingHints.KEY_ANTIALIASING));
     double alpha = 1.0;
     if (comp instanceof AlphaComposite)
       alpha = ((AlphaComposite) comp).getAlpha();
@@ -1428,6 +1442,25 @@
     // Do bilinear interpolation as default
     return INTERPOLATION_BILINEAR;
   }
+ + /**
+   * Set antialias if needed.  If the ignoreAA flag is set, this method will
+   * return without doing anything.
+ * + * @param value RenderingHints.VALUE_ANTIALIAS_ON or RenderingHints.VALUE_ANTIALIAS_OFF
+   */
+  private void setAntialias(Object value)
+  {
+    if (ignoreAA)
+      return;
+ + boolean needAA = ! (value.equals(RenderingHints.VALUE_ANTIALIAS_OFF)); + if (needAA != antialias)
+      {
+        antialias = !antialias;
+        cairoSetAntialias(nativePointer, antialias);
+      }
+  }
///////////////////////// IMAGE. METHODS /////////////////////////////////// @@ -1647,7 +1680,14 @@
         tl = new TextLayout( str, getFont(), getFontRenderContext() );
         fontPeer.textLayoutCache.put(str, tl);
       }
+ + // Set antialias to text_antialiasing, and set the ignoreAA flag so that
+    // the setting doesn't get overridden in a draw() or fill() call.
+    setAntialias(hints.get(RenderingHints.KEY_TEXT_ANTIALIASING));
+    ignoreAA = true;
+ tl.draw(this, x, y);
+    ignoreAA = false;
   }
public void drawString(String str, int x, int y)
@@ -1672,6 +1712,10 @@
if (comp instanceof AlphaComposite)
       alpha = ((AlphaComposite) comp).getAlpha();
+ + setAntialias(hints.get(RenderingHints.KEY_TEXT_ANTIALIASING));
+    ignoreAA = true;
+ if (gv instanceof FreetypeGlyphVector && alpha == 1.0)
       {
         int n = gv.getNumGlyphs ();
@@ -1692,6 +1736,8 @@
         fill(gv.getOutline());
         translate(-x, -y);
       }
+ + ignoreAA = false;
   }
public void drawString(AttributedCharacterIterator ci, float x, float y)
Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c
===================================================================
RCS file: 
/cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c,v
retrieving revision 1.19
diff -u -r1.19 gnu_java_awt_peer_gtk_CairoGraphics2D.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 21 Nov 2006 
16:34:04 -0000      1.19
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 15 Dec 2006 
21:12:30 -0000
@@ -777,6 +777,20 @@
   cairo_fill(gr->cr);
 }
+JNIEXPORT void JNICALL
+Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetAntialias
+(JNIEnv *env __attribute__ ((unused)), jobject obj __attribute__ ((unused)),
+ jlong pointer, jboolean aa)
+{
+  struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer);
+  g_assert (gr != NULL);
+
+  if (aa)
+    cairo_set_antialias(gr->cr, CAIRO_ANTIALIAS_GRAY);
+  else
+    cairo_set_antialias(gr->cr, CAIRO_ANTIALIAS_NONE);
+}
+
static void update_pattern_transform (struct cairographics2d *gr)
 {
Index: gnu/java/awt/peer/gtk/CairoGraphics2D.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java,v
retrieving revision 1.58
diff -u -r1.58 CairoGraphics2D.java
--- gnu/java/awt/peer/gtk/CairoGraphics2D.java	15 Dec 2006 21:21:03 -0000	1.58
+++ gnu/java/awt/peer/gtk/CairoGraphics2D.java	15 Dec 2006 21:41:04 -0000
@@ -1134,7 +1134,8 @@
         setCustomPaint(r);
       }
 
-    setAntialias(hints.get(RenderingHints.KEY_ANTIALIASING));
+    setAntialias(!hints.get(RenderingHints.KEY_ANTIALIASING)
+                       .equals(RenderingHints.VALUE_ANTIALIAS_OFF));
     createPath(s, true);
     cairoStroke(nativePointer);
   }
@@ -1146,7 +1147,8 @@
     if (customPaint)
       setCustomPaint(s.getBounds());
 
-    setAntialias(hints.get(RenderingHints.KEY_ANTIALIASING));
+    setAntialias(!hints.get(RenderingHints.KEY_ANTIALIASING)
+                       .equals(RenderingHints.VALUE_ANTIALIAS_OFF));
     double alpha = 1.0;
     if (comp instanceof AlphaComposite)
       alpha = ((AlphaComposite) comp).getAlpha();
@@ -1449,12 +1451,11 @@
    * 
    * @param value RenderingHints.VALUE_ANTIALIAS_ON or RenderingHints.VALUE_ANTIALIAS_OFF
    */
-  private void setAntialias(Object value)
+  private void setAntialias(boolean needAA)
   {
     if (ignoreAA)
       return;
     
-    boolean needAA = ! (value.equals(RenderingHints.VALUE_ANTIALIAS_OFF)); 
     if (needAA != antialias)
       {
         antialias = !antialias;
@@ -1683,7 +1684,8 @@
     
     // Set antialias to text_antialiasing, and set the ignoreAA flag so that
     // the setting doesn't get overridden in a draw() or fill() call.
-    setAntialias(hints.get(RenderingHints.KEY_TEXT_ANTIALIASING));
+    setAntialias(!hints.get(RenderingHints.KEY_TEXT_ANTIALIASING)
+                       .equals(RenderingHints.VALUE_TEXT_ANTIALIAS_OFF));
     ignoreAA = true;
     
     tl.draw(this, x, y);
@@ -1713,7 +1715,8 @@
     if (comp instanceof AlphaComposite)
       alpha = ((AlphaComposite) comp).getAlpha();
     
-    setAntialias(hints.get(RenderingHints.KEY_TEXT_ANTIALIASING));
+    setAntialias(!hints.get(RenderingHints.KEY_TEXT_ANTIALIASING)
+                       .equals(RenderingHints.VALUE_TEXT_ANTIALIAS_OFF));
     ignoreAA = true;
     
     if (gv instanceof FreetypeGlyphVector && alpha == 1.0)

Reply via email to