Hi,
This patch (committed) implements support for custom paint classes in
the GTK/Cairo peers.
Cheers,
Francis
2006-09-12 Francis Kung <[EMAIL PROTECTED]>
PR 27940
* gnu/java/awt/java2d/TexturePaintContext.java
(constructor): Fixed typo, getMinY instead of getMaxX.
* gnu/java/awt/peer/gtk/CairoGraphics2D.java
(setPaint): Implemented support for custom Paint classes.
(setPaintPixels): Renamed from setTexturePixels, added repeat
parameter.
(setTexturePixels): Renamed to setPaintPixels, added repeat parameter.
* include/gnu_java_awt_peer_gtk_CairoGraphics2D.h: Renamed
setTexturePixels
to setPaintPixels, and added repeat parameter.
* native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c:
Renamed setTexturePixels to setPaintPixels, and added repeat
parameter.
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.8
diff -u -r1.8 gnu_java_awt_peer_gtk_CairoGraphics2D.h
--- include/gnu_java_awt_peer_gtk_CairoGraphics2D.h 12 Jul 2006 20:28:43 -0000 1.8
+++ include/gnu_java_awt_peer_gtk_CairoGraphics2D.h 12 Sep 2006 19:02:58 -0000
@@ -14,7 +14,7 @@
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, 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_setPaintPixels (JNIEnv *env, jobject, jlong, jintArray, jint, jint, jint, jboolean);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetMatrix (JNIEnv *env, jobject, jlong, jdoubleArray);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoScale (JNIEnv *env, jobject, jlong, jdouble, jdouble);
JNIEXPORT void JNICALL Java_gnu_java_awt_peer_gtk_CairoGraphics2D_cairoSetOperator (JNIEnv *env, jobject, jlong, jint);
Index: gnu/java/awt/peer/gtk/CairoGraphics2D.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/peer/gtk/CairoGraphics2D.java,v
retrieving revision 1.37
diff -u -r1.37 CairoGraphics2D.java
--- gnu/java/awt/peer/gtk/CairoGraphics2D.java 8 Aug 2006 22:30:52 -0000 1.37
+++ gnu/java/awt/peer/gtk/CairoGraphics2D.java 12 Sep 2006 19:02:58 -0000
@@ -53,6 +53,8 @@
import java.awt.GraphicsConfiguration;
import java.awt.Image;
import java.awt.Paint;
+import java.awt.PaintContext;
+import java.awt.Point;
import java.awt.Polygon;
import java.awt.Rectangle;
import java.awt.RenderingHints;
@@ -316,8 +318,8 @@
int r1, int g1, int b1, int a1, int r2,
int g2, int b2, int a2, boolean cyclic);
- private native void setTexturePixels(long pointer, int[] pixels, int w,
- int h, int stride);
+ private native void setPaintPixels(long pointer, int[] pixels, int w,
+ int h, int stride, boolean repeat);
/**
* Set the current transform matrix
@@ -690,7 +692,7 @@
AffineTransformOp op = new AffineTransformOp(at, getRenderingHints());
BufferedImage texture = op.filter(img, null);
int[] pixels = texture.getRGB(0, 0, width, height, null, 0, width);
- setTexturePixels(nativePointer, pixels, width, height, width);
+ setPaintPixels(nativePointer, pixels, width, height, width, true);
}
else if (paint instanceof GradientPaint)
{
@@ -705,7 +707,52 @@
gp.isCyclic());
}
else
- throw new java.lang.UnsupportedOperationException();
+ {
+ // Get bounds in device space
+ int minX = 0;
+ int minY = 0;
+ int width = (int)getRealBounds().getWidth();
+ int height = (int)getRealBounds().getHeight();
+
+ Point2D origin = transform.transform(new Point2D.Double(minX, minY),
+ null);
+ Point2D extreme = transform.transform(new Point2D.Double(width + minX,
+ height + minY),
+ null);
+ minX = (int)origin.getX();
+ minY = (int)origin.getY();
+ width = (int)extreme.getX() - minX;
+ height = (int)extreme.getY() - minY;
+
+ // Get raster of the paint background
+ PaintContext pc = paint.createContext(ColorModel.getRGBdefault(),
+ new Rectangle(minX, minY,
+ width, height),
+ getRealBounds(),
+ transform, hints);
+
+ Raster raster = pc.getRaster(minX, minY, width, height);
+
+ // Work around colorspace issues, and force use of the
+ // BufferedImage.getRGB method... this can be improved upon.
+ WritableRaster wr = Raster.createWritableRaster(raster.getSampleModel(),
+ new Point(raster.getMinX(),
+ raster.getMinY()));
+ wr.setRect(raster);
+
+ BufferedImage img2 = new BufferedImage(pc.getColorModel(), wr,
+ pc.getColorModel().isAlphaPremultiplied(),
+ null);
+
+ // Set pixels in cairo
+ setPaintPixels(nativePointer,
+ img2.getRGB(0, 0, width, height, null, 0, width),
+ width, height, width, false);
+ // setPaintPixels(nativePointer,
+ // raster.getPixels(0, 0, width, height, (int[])null),
+ // width, height, width, false);
+ // doesn't work... but would be much more efficient!
+ }
}
public Stroke getStroke()
Index: gnu/java/awt/java2d/TexturePaintContext.java
===================================================================
RCS file: /cvsroot/classpath/classpath/gnu/java/awt/java2d/TexturePaintContext.java,v
retrieving revision 1.1
diff -u -r1.1 TexturePaintContext.java
--- gnu/java/awt/java2d/TexturePaintContext.java 30 May 2006 19:08:44 -0000 1.1
+++ gnu/java/awt/java2d/TexturePaintContext.java 12 Sep 2006 19:02:58 -0000
@@ -104,7 +104,7 @@
double scaleY = anchor.getHeight() / image.getHeight();
transform = (AffineTransform) xform.clone();
transform.scale(scaleX, scaleY);
- transform.translate(-anchor.getMinX(), -anchor.getMaxX());
+ transform.translate(-anchor.getMinX(), -anchor.getMinY());
transform = transform.createInverse();
}
catch (NoninvertibleTransformException ex)
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.14
diff -u -r1.14 gnu_java_awt_peer_gtk_CairoGraphics2D.c
--- native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 6 Aug 2006 21:00:54 -0000 1.14
+++ native/jni/gtk-peer/gnu_java_awt_peer_gtk_CairoGraphics2D.c 12 Sep 2006 19:02:58 -0000
@@ -143,9 +143,9 @@
}
JNIEXPORT void JNICALL
-Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setTexturePixels
+Java_gnu_java_awt_peer_gtk_CairoGraphics2D_setPaintPixels
(JNIEnv *env __attribute__((unused)), jobject obj __attribute__((unused)),
- jlong pointer, jintArray jarr, jint w, jint h, jint stride)
+ jlong pointer, jintArray jarr, jint w, jint h, jint stride, jboolean repeat)
{
struct cairographics2d *gr = NULL;
jint *jpixels = NULL;
@@ -180,7 +180,12 @@
g_assert (gr->pattern_surface != NULL);
gr->pattern = cairo_pattern_create_for_surface (gr->pattern_surface);
g_assert (gr->pattern != NULL);
- cairo_pattern_set_extend (gr->pattern, CAIRO_EXTEND_REPEAT);
+
+ if (repeat)
+ cairo_pattern_set_extend (gr->pattern, CAIRO_EXTEND_REPEAT);
+ else
+ cairo_pattern_set_extend (gr->pattern, CAIRO_EXTEND_NONE);
+
cairo_set_source (gr->cr, gr->pattern);
}