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, 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;
+    }
 }
 

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