This is the mail archive of the java-patches@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[gui] [PATCH] ReplicateScaleFilter and CropImageFilterimplementations for byte pixels


Hello,

I'm committing the following patch to the java-gui-branch. It implements
the setPixels() method for byte pixels in ReplicateScaleFilter and
CropImageFilter.

-David Jee

2004-05-06  David Jee  <djee@redhat.com>

        * java/awt/image/CropImageFilter.java
        (setPixels): Implement for byte array pixels.
        * java/awt/image/ReplicateScaleFilter.java
        (setPixels): Implement for byte array pixels.
        (replicatePixels): Overload for byte array pixels.

Index: java/awt/image/CropImageFilter.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/image/CropImageFilter.java,v
retrieving revision 1.1.84.1
diff -u -r1.1.84.1 CropImageFilter.java
--- java/awt/image/CropImageFilter.java	5 May 2004 20:57:14 -0000	1.1.84.1
+++ java/awt/image/CropImageFilter.java	6 May 2004 16:49:38 -0000
@@ -114,7 +114,27 @@
     public void setPixels(int x, int y, int w, int h, 
 	   ColorModel model, byte[] pixels, int offset, int scansize)
     {
-	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+	Rectangle filterBounds = new Rectangle(this.x, this.y,
+	                                       this.width, this.height);
+	Rectangle pixelBounds = new Rectangle(x, y, w, h);
+
+	if (filterBounds.intersects(pixelBounds))
+	{
+	    Rectangle bounds = filterBounds.intersection(pixelBounds);
+
+	    byte[] cropped = new byte[bounds.width * bounds.height];
+	    for (int i = 0; i < bounds.height; i++)
+	    {
+		int start = (bounds.y - pixelBounds.y + i) * scansize + offset;
+
+		for (int j = 0; j < bounds.width; j++)
+		    cropped[i * bounds.width + j] = pixels[start + bounds.x + j];
+	    }
+	    
+	    consumer.setPixels(bounds.x, bounds.y,
+	                       bounds.width, bounds.height,
+	                       model, cropped, 0, bounds.width);
+	}
     }
 
     /**
Index: java/awt/image/ReplicateScaleFilter.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/image/ReplicateScaleFilter.java,v
retrieving revision 1.1.84.1
diff -u -r1.1.84.1 ReplicateScaleFilter.java
--- java/awt/image/ReplicateScaleFilter.java	5 May 2004 20:57:14 -0000	1.1.84.1
+++ java/awt/image/ReplicateScaleFilter.java	6 May 2004 16:49:38 -0000
@@ -156,7 +156,18 @@
     public void setPixels(int x, int y, int w, int h, 
 	   ColorModel model, byte[] pixels, int offset, int scansize)
     {
-	consumer.setPixels(x, y, w, h, model, pixels, offset, scansize);
+	double rx = ((double) srcWidth) / destWidth;
+	double ry = ((double) srcHeight) / destHeight;
+
+	int destScansize = (int) Math.round(scansize / rx);
+
+	byte[] destPixels = replicatePixels(x, y, w, h,
+                                           model, pixels, offset, scansize,
+	                                   rx, ry, destScansize);
+
+	consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
+                           (int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
+                           model, destPixels, 0, destScansize);
     }
 
     /**
@@ -188,6 +199,26 @@
 	consumer.setPixels((int) Math.floor(x/rx), (int) Math.floor(y/ry),
                            (int) Math.ceil(w/rx), (int) Math.ceil(h/ry),
                            model, destPixels, 0, destScansize);
+    }
+
+    protected byte[] replicatePixels(int srcx, int srcy, int srcw, int srch,
+                                    ColorModel model, byte[] srcPixels,
+                                    int srcOffset, int srcScansize,
+                                    double rx, double ry, int destScansize)
+    {
+	byte[] destPixels =
+	  new byte[(int) Math.ceil(srcw/rx) * (int) Math.ceil(srch/ry)];
+
+	int a, b;
+	for (int i = 0; i < destPixels.length; i++)
+	{
+	    a = (int) ((int) ( ((double) i) / destScansize) * ry) * srcScansize;
+	    b = (int) ((i % destScansize) * rx);
+	    if ((a + b + srcOffset) < srcPixels.length)
+		destPixels[i] = srcPixels[a + b + srcOffset];
+	}
+
+	return destPixels;
     }
 
     protected int[] replicatePixels(int srcx, int srcy, int srcw, int srch,

Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]