This is the mail archive of the
java-patches@gcc.gnu.org
mailing list for the Java project.
[gui] [PATCH] ReplicateScaleFilter, CropImageFilter, and otherfixes
- From: David Jee <djee at redhat dot com>
- To: java-patches at gcc dot gnu dot org
- Date: Wed, 05 May 2004 16:56:37 -0400
- Subject: [gui] [PATCH] ReplicateScaleFilter, CropImageFilter, and otherfixes
Hello,
I'm committing the following patch to the java-gui-branch. It
implements ReplicateScaleFilter and CropImageFilter, and it also fixes a
couple things related to image handling.
-David Jee
2004-05-05 David Jee <djee@redhat.com>
* gnu/java/awt/peer/gtk/GdkGraphics.java
(drawImage): When component is null, use SystemColor.window as
the default bgcolor.
* gnu/java/awt/peer/gtk/GtkImage.java
(setPixels): We can avoid iterating through the pixel rows only
when height is 1.
* java/awt/Image.java
(getScaledInstance): Partially implement.
* java/awt/image/CropImageFilter.java
(setProperties): Fix "filter" property.
(setPixels): Implement.
* java/awt/image/ReplicateScaleFilter.java
(setDimensions): Use scaled dimensions.
(setPixels): Implement.
(replicatePixels): New method.
Index: gnu/java/awt/peer/gtk/GdkGraphics.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GdkGraphics.java,v
retrieving revision 1.4.16.2
diff -u -r1.4.16.2 GdkGraphics.java
--- gnu/java/awt/peer/gtk/GdkGraphics.java 11 Mar 2004 00:53:23 -0000 1.4.16.2
+++ gnu/java/awt/peer/gtk/GdkGraphics.java 5 May 2004 20:52:20 -0000
@@ -46,6 +46,7 @@
import java.awt.Image;
import java.awt.Rectangle;
import java.awt.Shape;
+import java.awt.SystemColor;
import java.awt.image.ImageObserver;
import java.text.AttributedCharacterIterator;
@@ -149,7 +150,10 @@
return true;
}
- return drawImage (img, x, y, component.getBackground (), observer);
+ if (component != null)
+ return drawImage (img, x, y, component.getBackground (), observer);
+ else
+ return drawImage (img, x, y, SystemColor.window, observer);
}
public boolean drawImage (Image img, int x, int y, int width, int height,
@@ -168,8 +172,12 @@
public boolean drawImage (Image img, int x, int y, int width, int height,
ImageObserver observer)
{
- return drawImage (img, x, y, width, height, component.getBackground (),
- observer);
+ if (component != null)
+ return drawImage (img, x, y, width, height, component.getBackground (),
+ observer);
+ else
+ return drawImage (img, x, y, width, height, SystemColor.window,
+ observer);
}
public boolean drawImage (Image img, int dx1, int dy1, int dx2, int dy2,
@@ -191,8 +199,12 @@
int sx1, int sy1, int sx2, int sy2,
ImageObserver observer)
{
- return drawImage (img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2,
- component.getBackground (), observer);
+ if (component != null)
+ return drawImage (img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2,
+ component.getBackground (), observer);
+ else
+ return drawImage (img, dx1, dy1, dx2, dy2, sx1, sy1, sx2, sy2,
+ SystemColor.window, observer);
}
native public void drawLine (int x1, int y1, int x2, int y2);
Index: gnu/java/awt/peer/gtk/GtkImage.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/gnu/java/awt/peer/gtk/GtkImage.java,v
retrieving revision 1.4
diff -u -r1.4 GtkImage.java
--- gnu/java/awt/peer/gtk/GtkImage.java 1 Dec 2003 15:28:22 -0000 1.4
+++ gnu/java/awt/peer/gtk/GtkImage.java 5 May 2004 20:52:20 -0000
@@ -241,7 +241,7 @@
return;
}
- if (scansize == width)
+ if (scansize == width && height == 1)
{
System.arraycopy (pixels, offset,
pixelCache, y * this.width + x,
Index: java/awt/Image.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/Image.java,v
retrieving revision 1.6
diff -u -r1.6 Image.java
--- java/awt/Image.java 9 Aug 2002 04:26:14 -0000 1.6
+++ java/awt/Image.java 5 May 2004 20:52:20 -0000
@@ -39,6 +39,7 @@
package java.awt;
import java.awt.image.AreaAveragingScaleFilter;
+import java.awt.image.FilteredImageSource;
import java.awt.image.ImageObserver;
import java.awt.image.ImageProducer;
import java.awt.image.ReplicateScaleFilter;
@@ -179,7 +180,20 @@
*/
public Image getScaledInstance(int width, int height, int flags)
{
- throw new Error("not implemented");
+ switch (flags)
+ {
+ case SCALE_DEFAULT:
+ case SCALE_FAST:
+ case SCALE_REPLICATE:
+ ImageProducer producer =
+ new FilteredImageSource(this.getSource(),
+ new ReplicateScaleFilter(width, height));
+ return Toolkit.getDefaultToolkit().createImage(producer);
+ case SCALE_SMOOTH:
+ case SCALE_AREA_AVERAGING:
+ default:
+ throw new Error("not implemented");
+ }
}
/**
Index: java/awt/image/CropImageFilter.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/image/CropImageFilter.java,v
retrieving revision 1.1
diff -u -r1.1 CropImageFilter.java
--- java/awt/image/CropImageFilter.java 24 Jan 2002 01:05:12 -0000 1.1
+++ java/awt/image/CropImageFilter.java 5 May 2004 20:52:20 -0000
@@ -39,6 +39,7 @@
package java.awt.image;
import java.util.Hashtable;
+import java.awt.Rectangle;
/**
* <br>
@@ -92,7 +93,7 @@
*/
public void setProperties(Hashtable props)
{
-// props.put("filters", "ReplicateScaleFilter");
+ props.put("filters", "CropImageFilter");
consumer.setProperties(props);
}
@@ -133,7 +134,27 @@
public void setPixels(int x, int y, int w, int h,
ColorModel model, int[] 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);
+
+ int[] cropped = new int[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
diff -u -r1.1 ReplicateScaleFilter.java
--- java/awt/image/ReplicateScaleFilter.java 24 Jan 2002 01:05:12 -0000 1.1
+++ java/awt/image/ReplicateScaleFilter.java 5 May 2004 20:52:20 -0000
@@ -104,7 +104,27 @@
*/
public void setDimensions(int width, int height)
{
- consumer.setDimensions(width, height);
+ srcWidth = width;
+ srcHeight = height;
+
+ /* If either destHeight or destWidth is < 0, the image should
+ maintain its original aspect ratio. When both are < 0,
+ just maintain the original width and height. */
+ if (destWidth < 0 && destHeight < 0)
+ {
+ destWidth = width;
+ destHeight = height;
+ }
+ else if (destWidth < 0)
+ {
+ destWidth = (int) (width * ((double) destHeight / srcHeight));
+ }
+ else if (destHeight < 0)
+ {
+ destHeight = (int) (height * ((double) destWidth / srcWidth));
+ }
+
+ consumer.setDimensions(destWidth, destHeight);
}
/**
@@ -156,8 +176,38 @@
public void setPixels(int x, int y, int w, int h,
ColorModel model, int[] 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);
+
+ int[] 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);
}
+ protected int[] replicatePixels(int srcx, int srcy, int srcw, int srch,
+ ColorModel model, int[] srcPixels,
+ int srcOffset, int srcScansize,
+ double rx, double ry, int destScansize)
+ {
+ int[] destPixels =
+ new int[(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;
+ }
}