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);
 }
 

Reply via email to