diff options
Diffstat (limited to 'libjava/java/awt/image')
| -rw-r--r-- | libjava/java/awt/image/CropImageFilter.java | 47 | ||||
| -rw-r--r-- | libjava/java/awt/image/MemoryImageSource.java | 34 | ||||
| -rw-r--r-- | libjava/java/awt/image/RGBImageFilter.java | 82 | ||||
| -rw-r--r-- | libjava/java/awt/image/ReplicateScaleFilter.java | 87 |
4 files changed, 210 insertions, 40 deletions
diff --git a/libjava/java/awt/image/CropImageFilter.java b/libjava/java/awt/image/CropImageFilter.java index 8ffc148b22b..c9a170b9b3b 100644 --- a/libjava/java/awt/image/CropImageFilter.java +++ b/libjava/java/awt/image/CropImageFilter.java @@ -39,6 +39,7 @@ exception statement from your version. */ package java.awt.image; import java.util.Hashtable; +import java.awt.Rectangle; /** * <br> @@ -92,7 +93,7 @@ public class CropImageFilter extends ImageFilter */ public void setProperties(Hashtable props) { -// props.put("filters", "ReplicateScaleFilter"); + props.put("filters", "CropImageFilter"); consumer.setProperties(props); } @@ -113,7 +114,27 @@ public class CropImageFilter extends ImageFilter 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); + } } /** @@ -133,7 +154,27 @@ public class CropImageFilter extends ImageFilter 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); + } } } diff --git a/libjava/java/awt/image/MemoryImageSource.java b/libjava/java/awt/image/MemoryImageSource.java index 5006afe79e5..d86119993ec 100644 --- a/libjava/java/awt/image/MemoryImageSource.java +++ b/libjava/java/awt/image/MemoryImageSource.java @@ -257,9 +257,15 @@ public class MemoryImageSource implements ImageProducer ic.setProperties( props ); } if( pixeli != null ) { - ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize ); + int[] pixelbuf = new int[w * h]; + for (int row = y; row < h; row++) + System.arraycopy(pixeli, row * scansize + x + offset, pixelbuf, row * w, w); + ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); } else { - ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize ); + byte[] pixelbuf = new byte[w * h]; + for (int row = y; row < h; row++) + System.arraycopy(pixelb, row * scansize + x + offset, pixelbuf, row * w, w); + ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); } ic.imageComplete( ImageConsumer.SINGLEFRAME ); } @@ -296,9 +302,15 @@ public class MemoryImageSource implements ImageProducer ic.setProperties( props ); } if( pixeli != null ) { - ic.setPixels( 0, 0, width, height, cm, pixeli, offset, scansize ); + int[] pixelbuf = new int[w * h]; + for (int row = y; row < h; row++) + System.arraycopy(pixeli, row * scansize + x + offset, pixelbuf, row * w, w); + ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); } else { - ic.setPixels( 0, 0, width, height, cm, pixelb, offset, scansize ); + byte[] pixelbuf = new byte[w * h]; + for (int row = y; row < h; row++) + System.arraycopy(pixelb, row * scansize + x + offset, pixelbuf, row * w, w); + ic.setPixels( x, y, w, h, cm, pixelbuf, 0, w ); } if( framenotify == true ) ic.imageComplete( ImageConsumer.SINGLEFRAME ); @@ -313,9 +325,14 @@ public class MemoryImageSource implements ImageProducer int scansize) { + pixeli = null; + pixelb = newpix; + cm = newmodel; + this.offset = offset; + this.scansize = scansize; if( animated == true ) { - //FIXME + newPixels(); } } @@ -325,9 +342,14 @@ public class MemoryImageSource implements ImageProducer int scansize) { + pixelb = null; + pixeli = newpix; + cm = newmodel; + this.offset = offset; + this.scansize = scansize; if( animated == true ) { - //FIXME + newPixels(); } } diff --git a/libjava/java/awt/image/RGBImageFilter.java b/libjava/java/awt/image/RGBImageFilter.java index b15fe25d0e7..5718024e761 100644 --- a/libjava/java/awt/image/RGBImageFilter.java +++ b/libjava/java/awt/image/RGBImageFilter.java @@ -46,7 +46,7 @@ package java.awt.image; */ public abstract class RGBImageFilter extends ImageFilter { - protected ColorModel origmodel = ColorModel.getRGBdefault(); + protected ColorModel origmodel; protected ColorModel newmodel; @@ -126,7 +126,7 @@ public abstract class RGBImageFilter extends ImageFilter 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 @@ public abstract class RGBImageFilter extends ImageFilter 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 @@ public abstract class RGBImageFilter extends ImageFilter * @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 @@ public abstract class RGBImageFilter extends ImageFilter * @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 ); } diff --git a/libjava/java/awt/image/ReplicateScaleFilter.java b/libjava/java/awt/image/ReplicateScaleFilter.java index 97992e8f2a2..a572da7c3bd 100644 --- a/libjava/java/awt/image/ReplicateScaleFilter.java +++ b/libjava/java/awt/image/ReplicateScaleFilter.java @@ -104,7 +104,27 @@ public class ReplicateScaleFilter extends ImageFilter */ 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); } /** @@ -136,7 +156,18 @@ public class ReplicateScaleFilter extends ImageFilter 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); } /** @@ -156,8 +187,58 @@ public class ReplicateScaleFilter extends ImageFilter 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 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, + 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; + } } |

