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