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)
 {

Reply via email to