[gui] [PATCH] Fix RGBImageFilter

David Jee djee@redhat.com
Wed May 12 23:42:00 GMT 2004


Hi,

I committed the following patch to the java-gui-branch.  It fixes a few things in java.awt.image.RGBImageFilter class.

-David Jee

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

	* java/awt/image/RGBImageFilter.java:
	Initialize origmodel as null.
	(makeColor): Fix pixel component order.
	(filterRGBPixels): Fix pixel iteration.
	(setPixels): Add extra checks for index color model. Convert pixels
	to default color model if necessary.
	(convertColorModelToDefault): New override method for byte pixels.
	(convertColorModelToDefault): For int pixels, fix pixel iteration.
	(makeColorbyDefaultCM): New override method for byte pixels.
	(makeColorbyDefaultCM): For int pixel, add color model as argument.
	(makeColor): Fix pixel component order.

-------------- next part --------------
Index: java/awt/image/RGBImageFilter.java
===================================================================
RCS file: /cvs/gcc/gcc/libjava/java/awt/image/RGBImageFilter.java,v
retrieving revision 1.2
diff -u -r1.2 RGBImageFilter.java
--- java/awt/image/RGBImageFilter.java	11 Oct 2003 17:19:46 -0000	1.2
+++ java/awt/image/RGBImageFilter.java	12 May 2004 17:43:41 -0000
@@ -46,7 +46,7 @@
  */
 public abstract class RGBImageFilter extends ImageFilter
 {
-    protected ColorModel origmodel = ColorModel.getRGBdefault();
+    protected ColorModel origmodel;
 
     protected ColorModel newmodel;
     
@@ -126,7 +126,7 @@
 
     private int makeColor( byte a, byte r, byte g, byte b )
     {
-	return ( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (b << 8) | 0xff & g ); 
+	return ( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (g << 8) | 0xff & b ); 
     }
 
     /**
@@ -149,11 +149,15 @@
 				int off,
 				int scansize)
     {
-	int xp, yp;
+	int xp, yp, i;
 
+	i = 0;
 	for( xp = x; xp < ( x + w); xp++ )
 	    for( yp = y; yp < (y + h); yp++ )
-		 pixels[ off + yp * scansize + xp ] = filterRGB( xp, yp, pixels[ off + yp * scansize + xp ] );
+	    {
+		pixels[i] = filterRGB( xp, yp, pixels[i] );
+		i++;
+	    }
     }
 
 
@@ -172,15 +176,19 @@
      * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
      */
     public void setPixels(int x, int y, int w, int h, 
-	   ColorModel model, byte[] pixels, int offset, int scansize)
+                          ColorModel model, byte[] pixels,
+                          int offset, int scansize)
     {
-	if( model == origmodel ) {
+	if(model == origmodel && (model instanceof IndexColorModel) && canFilterIndexColorModel)
+	{
 	    consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize);
-	} else {
-	    //FIXME
-	    //convert to proper CM
-	    int pixelsi[] = new int[ pixels.length / 4 ];
-	    filterRGBPixels( x, y, w, h, pixelsi, offset, scansize );
+	}
+	else
+	{
+	    int intPixels[] =
+		convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize );
+	    filterRGBPixels( x, y, w, h, intPixels, offset, scansize );
+	    consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), intPixels, offset, scansize);
 	}
     }
 
@@ -199,35 +207,53 @@
      * @param scansize the width to use in extracting pixels from the <code>pixels</code> array
      */
     public void setPixels(int x, int y, int w, int h, 
-           ColorModel model, int[] pixels, int offset, int scansize)
+                          ColorModel model, int[] pixels,
+                          int offset, int scansize)
     {
-	if( model == origmodel ) {
+	if(model == origmodel && (model instanceof IndexColorModel) && canFilterIndexColorModel)
+	{
 	    consumer.setPixels(x, y, w, h, newmodel, pixels, offset, scansize);
-	} else {
+	}
+	else
+	{
+	    //FIXME: Store the filtered pixels in a separate temporary buffer?
 	    convertColorModelToDefault( x, y, w, h, model, pixels, offset, scansize );
 	    filterRGBPixels( x, y, w, h, pixels, offset, scansize );
+	    consumer.setPixels(x, y, w, h, ColorModel.getRGBdefault(), pixels, offset, scansize);
 	}
     }
 
-    private void convertColorModelToDefault( int x, int y, int w, int h, 
-	    ColorModel model, int pixels[], int offset, int scansize)
-	{
-	int xp, yp;
+    private int[] convertColorModelToDefault(int x, int y, int w, int h, 
+                                            ColorModel model, byte pixels[],
+                                            int offset, int scansize)
+    {
+	int intPixels[] = new int[pixels.length];
+	for (int i = 0; i < pixels.length; i++)
+	    intPixels[i] = makeColorbyDefaultCM(model, pixels[i]);
+	return intPixels;
+    }
 
-	for( xp = x; xp < ( x + w); xp++ )
-	    for( yp = y; yp < (y + h); yp++ )
-		 pixels[ offset + yp * scansize + xp ] =  makeColorbyDefaultCM( pixels[ offset + yp * scansize + xp ] );
-	    
-	}
-    private int makeColorbyDefaultCM( int rgb ) 
-	{
-	    return makeColor( origmodel.getRed( rgb ), origmodel.getGreen( rgb ), origmodel.getGreen( rgb ), origmodel.getBlue( rgb ) );
-	}
+    private void convertColorModelToDefault(int x, int y, int w, int h, 
+                                            ColorModel model, int pixels[],
+                                            int offset, int scansize)
+    {
+	for (int i = 0; i < pixels.length; i++)
+	    pixels[i] = makeColorbyDefaultCM(model, pixels[i]);
+    }
 
+    private int makeColorbyDefaultCM(ColorModel model, byte rgb) 
+    {
+	return makeColor( model.getAlpha( rgb ) * 4, model.getRed( rgb ) * 4, model.getGreen( rgb ) * 4, model.getBlue( rgb ) * 4 );
+    }
+
+    private int makeColorbyDefaultCM(ColorModel model, int rgb) 
+    {
+	return makeColor( model.getAlpha( rgb ), model.getRed( rgb ), model.getGreen( rgb ), model.getBlue( rgb ) );
+    }
 
     private int makeColor( int a, int r, int g, int b )
     {
-	return (int)( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (b << 8) | 0xff & g ); 
+	return (int)( 0xff000000 & (a << 24) | 0xff0000 & (r << 16) | 0xff00 & (g << 8) | 0xff & b ); 
     }
 
 


More information about the Java-patches mailing list