package org.icepdf.core.pobjects.graphics.RasterOps; import org.icepdf.core.pobjects.graphics.DeviceRGB; import org.icepdf.core.pobjects.graphics.PColorSpace; import java.awt.*; import java.awt.geom.Point2D; import java.awt.geom.Rectangle2D; import java.awt.image.*; /** * Convert a rgb encoded raster to the specified colour space. * * @since 5.1 */ public class PColorSpaceRasterOp implements RasterOp { private RenderingHints hints = null; private PColorSpace colorSpace; public PColorSpaceRasterOp(PColorSpace colorSpace, RenderingHints hints) { this.hints = hints; this.colorSpace = colorSpace; } public WritableRaster filter(Raster src, WritableRaster dest) { if (dest == null) dest = src.createCompatibleWritableRaster(); // may have to add some instance of checks byte[] srcPixels = ((DataBufferByte) src.getDataBuffer()).getData(); int[] destPixels = ((DataBufferInt) dest.getDataBuffer()).getData(); // already RGB not much to do so we just build the colour if (colorSpace instanceof DeviceRGB) { int bands = src.getNumBands(); int[] rgbValues = new int[3]; for (int pixel = 0, intPixels = 0; pixel < srcPixels.length; pixel += bands, intPixels++) { rgbValues[0] = (srcPixels[pixel] & 0xff); rgbValues[1] = (srcPixels[pixel + 1] & 0xff); rgbValues[2] = (srcPixels[pixel + 2] & 0xff); // reverse after the normalization to avoid looking gray data as // array is trimmed above. destPixels[intPixels] = ((rgbValues[0] & 0xff) << 16) | ((rgbValues[1] & 0xff) << 8) | (rgbValues[2] & 0xff); } } else { int bands = src.getNumBands(); float[] values = new float[3]; for (int pixel = 0, intPixels = 0; pixel < srcPixels.length; pixel += bands, intPixels++) { for (int i = 0; i < bands; i++) { values[i] = (srcPixels[pixel + i] & 0xff) / 255.0f; } // color space caching should help with the number of colors // objects created. PColorSpace.reverseInPlace(values); destPixels[intPixels] = colorSpace.getColor(values).getRGB(); } } return dest; } public Rectangle2D getBounds2D(Raster src) { return null; } public WritableRaster createCompatibleDestRaster(Raster src) { return src.createCompatibleWritableRaster(); } public Point2D getPoint2D(Point2D srcPt, Point2D dstPt) { if (dstPt == null) { dstPt = (Point2D) srcPt.clone(); } else { dstPt.setLocation(srcPt); } return dstPt; } public RenderingHints getRenderingHints() { return hints; } }