CVSROOT: /cvsroot/classpath Module name: classpath Changes by: Roman Kennke <rabbit78> 06/06/12 10:32:45
Modified files: native/jni/gtk-peer: gnu_java_awt_peer_gtk_CairoSurface.c gnu_java_awt_peer_gtk_CairoGraphics2D.c include : gnu_java_awt_peer_gtk_CairoSurface.h gnu_java_awt_peer_gtk_CairoGraphics2D.h gnu/java/awt/peer/gtk: CairoGraphics2D.java CairoSurface.java . : ChangeLog Log message: 2006-06-12 Roman Kennke <[EMAIL PROTECTED]> * gnu/java/awt/peer/gtk/CairoGraphics2D.java (drawPixels): Include alpha in parameter list. (cairoFill): Include alpha in parameter list. (setComposite): Don't modify the color. (draw(Shape))): Use fill when the current composite has an alpha of != 1.0, so that the stroked shaped will be composited. (fill(Shape)): Call cairoFill() with alpha. (drawImage): Call drawPixels or drawSurface with alpha. (drawGlyphVector): When composite alpha is != 1.0, render the outline using fill() to enable compositing for text. (drawRaster): Call drawPixels with alpha. * gnu/java/awt/peer/gtk/CairoGraphics2D.java (nativeDrawSurface): Include alpha in parameter list. (drawSurface): Include alpha in parameter list. Pass it to nativeDrawSurface(). * include/gnu_java_awt_peer_gtk_CairoGraphics2D.h * include/gnu_java_awt_peer_gtk_CairoSurface.h: Regenerated. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c (drawPixels): Handle possible alpha for compositing. (cairoFill): Likewise. * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c (nativeDrawSurface): Handle possible alpha for compositing. CVSWeb URLs: http://cvs.savannah.gnu.org/viewcvs/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c?cvsroot=classpath&r1=1.18&r2=1.19 http://cvs.savannah.gnu.org/viewcvs/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c?cvsroot=classpath&r1=1.9&r2=1.10 http://cvs.savannah.gnu.org/viewcvs/classpath/include/gnu_java_awt_peer_gtk_CairoSurface.h?cvsroot=classpath&r1=1.5&r2=1.6 http://cvs.savannah.gnu.org/viewcvs/classpath/include/gnu_java_awt_peer_gtk_CairoGraphics2D.h?cvsroot=classpath&r1=1.5&r2=1.6 http://cvs.savannah.gnu.org/viewcvs/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java?cvsroot=classpath&r1=1.19&r2=1.20 http://cvs.savannah.gnu.org/viewcvs/classpath/gnu/java/awt/peer/gtk/CairoSurface.java?cvsroot=classpath&r1=1.8&r2=1.9 http://cvs.savannah.gnu.org/viewcvs/classpath/ChangeLog?cvsroot=classpath&r1=1.7778&r2=1.7779 Patches: Index: native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c =================================================================== RCS file: /cvsroot/classpath/classpath/native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c,v retrieving revision 1.18 retrieving revision 1.19 diff -u -b -r1.18 -r1.19 --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c 10 Jun 2006 14:16:09 -0000 1.18 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c 12 Jun 2006 10:32:44 -0000 1.19 @@ -181,7 +181,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_nativeDrawSurface (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)), - jlong surfacePointer, jlong context, jdoubleArray java_matrix) + jlong surfacePointer, jlong context, jdoubleArray java_matrix, double alpha) { struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, context); cairo_t *cr = gr->cr; @@ -207,7 +207,11 @@ cairo_pattern_set_matrix (p, &mat); cairo_set_source(cr, p); + if (alpha == 1.0) cairo_paint(cr); + else + cairo_paint_with_alpha(cr, alpha); + cairo_pattern_destroy(p); } 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.9 retrieving revision 1.10 diff -u -b -r1.9 -r1.10 --- native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 10 Jun 2006 14:16:09 -0000 1.9 +++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 12 Jun 2006 10:32:44 -0000 1.10 @@ -188,7 +188,7 @@ Java_gnu_java_awt_peer_gtk_CairoGraphics2D_drawPixels (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)), jlong pointer, jintArray java_pixels, - jint w, jint h, jint stride, jdoubleArray java_matrix) + jint w, jint h, jint stride, jdoubleArray java_matrix, jdouble alpha) { jint *native_pixels = NULL; jdouble *native_matrix = NULL; @@ -218,7 +218,11 @@ if (gr->pattern) cairo_pattern_set_filter (p, cairo_pattern_get_filter (gr->pattern)); cairo_set_source (gr->cr, p); + if (alpha == 1.) cairo_paint (gr->cr); + else + cairo_paint_with_alpha(gr->cr, alpha); + cairo_pattern_destroy (p); cairo_surface_destroy (surf); } @@ -581,12 +585,20 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill (JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)), - jlong pointer) + jlong pointer, jdouble alpha) { struct cairographics2d *gr = JLONG_TO_PTR(struct cairographics2d, pointer); g_assert (gr != NULL); + if (alpha == 1.0) cairo_fill (gr->cr); + else + { + cairo_save(gr->cr); + cairo_clip(gr->cr); + cairo_paint_with_alpha(gr->cr, alpha); + cairo_restore(gr->cr); + } } JNIEXPORT void JNICALL @@ -653,6 +665,7 @@ } } + /************************** FONT STUFF ****************************/ static void install_font_peer(cairo_t *cr, @@ -703,4 +716,3 @@ cairo_pattern_set_matrix (gr->pattern, &mat); } - Index: include/gnu_java_awt_peer_gtk_CairoSurface.h =================================================================== RCS file: /cvsroot/classpath/classpath/include/gnu_java_awt_peer_gtk_CairoSurface.h,v retrieving revision 1.5 retrieving revision 1.6 diff -u -b -r1.5 -r1.6 --- include/gnu_java_awt_peer_gtk_CairoSurface.h 10 Jun 2006 14:16:10 -0000 1.5 +++ include/gnu_java_awt_peer_gtk_CairoSurface.h 12 Jun 2006 10:32:44 -0000 1.6 @@ -14,7 +14,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_destroy (JNIEnv *env, jobject, jlong, jlong); JNIEXPORT jint JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_nativeGetElem (JNIEnv *env, jobject, jlong, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_nativeSetElem (JNIEnv *env, jobject, jlong, jint, jint); -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_nativeDrawSurface (JNIEnv *env, jobject, jlong, jlong, jdoubleArray); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_nativeDrawSurface (JNIEnv *env, jobject, jlong, jlong, jdoubleArray, jdouble); JNIEXPORT jintArray JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_nativeGetPixels (JNIEnv *env, jobject, jlong, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_nativeSetPixels (JNIEnv *env, jobject, jlong, jintArray); JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_gtk_CairoSurface_getFlippedBuffer (JNIEnv *env, jobject, jlong, jint); 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.5 retrieving revision 1.6 diff -u -b -r1.5 -r1.6 --- include/gnu_java_awt_peer_gtk_CairoGraphics2D.h 10 Jun 2006 14:16:10 -0000 1.5 +++ include/gnu_java_awt_peer_gtk_CairoGraphics2D.h 12 Jun 2006 10:32:44 -0000 1.6 @@ -12,7 +12,7 @@ JNIEXPORT jlong JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_init (JNIEnv *env, jobject, jlong); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_disposeNative (JNIEnv *env, jobject, jlong); -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_drawPixels (JNIEnv *env, jobject, jlong, jintArray, jint, jint, jint, jdoubleArray); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_drawPixels (JNIEnv *env, jobject, jlong, jintArray, jint, jint, jint, jdoubleArray, jdouble); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setGradient (JNIEnv *env, jobject, jlong, jdouble, jdouble, jdouble, jdouble, jint, jint, jint, jint, jint, jint, jint, jint, jboolean); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setTexturePixels (JNIEnv *env, jobject, jlong, jintArray, jint, jint, jint); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetMatrix (JNIEnv *env, jobject, jlong, jdoubleArray); @@ -32,7 +32,7 @@ JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoRelLineTo (JNIEnv *env, jobject, jlong, jdouble, jdouble); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoCurveTo (JNIEnv *env, jobject, jlong, jdouble, jdouble, jdouble, jdouble, jdouble, jdouble); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoStroke (JNIEnv *env, jobject, jlong); -JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill (JNIEnv *env, jobject, jlong); +JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoFill (JNIEnv *env, jobject, jlong, jdouble); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoClip (JNIEnv *env, jobject, jlong); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoPreserveClip (JNIEnv *env, jobject, jlong); JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoResetClip (JNIEnv *env, jobject, jlong); Index: gnu/java/awt/peer/gtk/CairoGraphics2D.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java,v retrieving revision 1.19 retrieving revision 1.20 diff -u -b -r1.19 -r1.20 --- gnu/java/awt/peer/gtk/CairoGraphics2D.java 11 Jun 2006 11:21:52 -0000 1.19 +++ gnu/java/awt/peer/gtk/CairoGraphics2D.java 12 Jun 2006 10:32:44 -0000 1.20 @@ -65,6 +65,7 @@ import java.awt.geom.AffineTransform; import java.awt.geom.Arc2D; import java.awt.geom.Area; +import java.awt.geom.GeneralPath; import java.awt.geom.Line2D; import java.awt.geom.NoninvertibleTransformException; import java.awt.geom.PathIterator; @@ -309,7 +310,7 @@ * @param i2u - affine transform array */ private native void drawPixels(long pointer, int[] pixels, int w, int h, - int stride, double[] i2u); + int stride, double[] i2u, double alpha); private native void setGradient(long pointer, double x1, double y1, double x2, double y2, @@ -406,7 +407,7 @@ /** * Fill current path */ - private native void cairoFill(long pointer); + private native void cairoFill(long pointer, double alpha); /** * Clip current path @@ -802,9 +803,6 @@ { AlphaComposite a = (AlphaComposite) comp; cairoSetOperator(nativePointer, a.getRule()); - Color c = getColor(); - setColor(new Color(c.getRed(), c.getGreen(), c.getBlue(), - (int) (a.getAlpha() * ((float) c.getAlpha())))); } else { @@ -817,8 +815,21 @@ public void draw(Shape s) { - if (stroke != null && ! (stroke instanceof BasicStroke)) + if ((stroke != null && ! (stroke instanceof BasicStroke)) + || (comp instanceof AlphaComposite + && ((AlphaComposite) comp).getAlpha() != 1.0)) + { + // FIXME: This is a hack to work around BasicStrokes's current + // limitations wrt cubic curves. + // See CubicSegment.getDisplacedSegments(). + if (stroke instanceof BasicStroke) { + PathIterator flatten = s.getPathIterator(new AffineTransform(), + 1.0); + GeneralPath p = new GeneralPath(); + p.append(flatten, false); + s = p; + } fill(stroke.createStrokedShape(s)); return; } @@ -849,7 +860,10 @@ else walkPath(s.getPathIterator(null), false); - cairoFill(nativePointer); + double alpha = 1.0; + if (comp instanceof AlphaComposite) + alpha = ((AlphaComposite) comp).getAlpha(); + cairoFill(nativePointer, alpha); } /** @@ -1125,9 +1139,13 @@ invertedXform.getMatrix(i2u); + double alpha = 1.0; + if (comp instanceof AlphaComposite) + alpha = ((AlphaComposite) comp).getAlpha(); + if(db instanceof CairoSurface) { - ((CairoSurface)db).drawSurface(nativePointer, i2u); + ((CairoSurface)db).drawSurface(nativePointer, i2u, alpha); return true; } @@ -1163,7 +1181,7 @@ null, 0, width); } - drawPixels(nativePointer, pixels, width, height, width, i2u); + drawPixels(nativePointer, pixels, width, height, width, i2u, alpha); // Cairo seems to lose the current color which must be restored. updateColor(); @@ -1295,7 +1313,10 @@ public void drawGlyphVector(GlyphVector gv, float x, float y) { - if (gv instanceof FreetypeGlyphVector) + double alpha = 1.0; + if (comp instanceof AlphaComposite) + alpha = ((AlphaComposite) comp).getAlpha(); + if (gv instanceof FreetypeGlyphVector && alpha == 1.0) { int n = gv.getNumGlyphs (); int[] codes = gv.getGlyphCodes (0, n, null); @@ -1463,8 +1484,11 @@ for (int i = 0; i < pixels.length; i++) pixels[i] |= 0xFF000000; + double alpha = 1.0; + if (comp instanceof AlphaComposite) + alpha = ((AlphaComposite) comp).getAlpha(); drawPixels(nativePointer, pixels, r.getWidth(), r.getHeight(), - r.getWidth(), i2u); + r.getWidth(), i2u, alpha); // Cairo seems to lose the current color which must be restored. updateColor(); Index: gnu/java/awt/peer/gtk/CairoSurface.java =================================================================== RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/CairoSurface.java,v retrieving revision 1.8 retrieving revision 1.9 diff -u -b -r1.8 -r1.9 --- gnu/java/awt/peer/gtk/CairoSurface.java 10 Jun 2006 10:33:18 -0000 1.8 +++ gnu/java/awt/peer/gtk/CairoSurface.java 12 Jun 2006 10:32:44 -0000 1.9 @@ -112,11 +112,11 @@ * with an affine transform given by i2u. */ public native void nativeDrawSurface(long surfacePointer, long contextPointer, - double[] i2u); + double[] i2u, double alpha); - public void drawSurface(long contextPointer, double[] i2u) + public void drawSurface(long contextPointer, double[] i2u, double alpha) { - nativeDrawSurface(surfacePointer, contextPointer, i2u); + nativeDrawSurface(surfacePointer, contextPointer, i2u, alpha); } /** Index: ChangeLog =================================================================== RCS file: /cvsroot/classpath/classpath/ChangeLog,v retrieving revision 1.7778 retrieving revision 1.7779 diff -u -b -r1.7778 -r1.7779 --- ChangeLog 12 Jun 2006 08:51:15 -0000 1.7778 +++ ChangeLog 12 Jun 2006 10:32:44 -0000 1.7779 @@ -1,3 +1,29 @@ +2006-06-12 Roman Kennke <[EMAIL PROTECTED]> + + * gnu/java/awt/peer/gtk/CairoGraphics2D.java + (drawPixels): Include alpha in parameter list. + (cairoFill): Include alpha in parameter list. + (setComposite): Don't modify the color. + (draw(Shape))): Use fill when the current composite has an alpha + of != 1.0, so that the stroked shaped will be composited. + (fill(Shape)): Call cairoFill() with alpha. + (drawImage): Call drawPixels or drawSurface with alpha. + (drawGlyphVector): When composite alpha is != 1.0, render the + outline using fill() to enable compositing for text. + (drawRaster): Call drawPixels with alpha. + * gnu/java/awt/peer/gtk/CairoGraphics2D.java + (nativeDrawSurface): Include alpha in parameter list. + (drawSurface): Include alpha in parameter list. Pass it to + nativeDrawSurface(). + * include/gnu_java_awt_peer_gtk_CairoGraphics2D.h + * include/gnu_java_awt_peer_gtk_CairoSurface.h: + Regenerated. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c + (drawPixels): Handle possible alpha for compositing. + (cairoFill): Likewise. + * native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoSurface.c + (nativeDrawSurface): Handle possible alpha for compositing. + 2006-06-12 Mark Wielaard <[EMAIL PROTECTED]> * gnu/java/awt/peer/gtk/GdkPixbufDecoder.java (streamImage):