package org.icepdf.core.pobjects.graphics.RasterOps;
import java.awt.*;
import java.awt.geom.Point2D;
import java.awt.geom.Rectangle2D;
import java.awt.image.*;
/**
* Raster operation that convers the YCbCr to a RGB colour space.
*
* @since 5.1
*/
public class YCbCrRasterOp implements RasterOp {
private RenderingHints hints = null;
public YCbCrRasterOp(RenderingHints hints) {
this.hints = hints;
}
public WritableRaster filter(Raster src, WritableRaster dest) {
if (dest == null) dest = src.createCompatibleWritableRaster();
// my have to add some instance of checks
byte[] srcPixels = ((DataBufferByte) src.getDataBuffer()).getData();
int[] destPixels = ((DataBufferInt) dest.getDataBuffer()).getData();
int Y, Cb, Cr;
int lastY = -1, lastCb = -1, lastCr = -1;
int rVal = 0, gVal = 0, bVal = 0;
int bands = src.getNumBands();
for (int pixel = 0, intPixels = 0; pixel < srcPixels.length; pixel += bands, intPixels++) {
Y = srcPixels[pixel] & 0xff;
Cb = srcPixels[pixel + 1] & 0xff;
Cr = srcPixels[pixel + 2] & 0xff;
// no point recalculating if we are doing a band of colours.
if (!(lastY == Y && lastCb == Cb && lastCr == Cr)) {
// The Intel IPP color conversion functions specific for the JPEG codec
rVal = clamp((int) (Y + 1.402 * Cr - 179.456));
gVal = clamp((int) (Y - 0.34414 * Cb - 0.71414 * Cr + 135.45984));
bVal = clamp((int) (Y + 1.772 * Cb - 226.816));
}
lastY = Y;
lastCb = Cb;
lastCr = Cr;
destPixels[intPixels] = ((rVal & 0xff) << 16) | ((gVal & 0xff) << 8) | (bVal & 0xff);
}
return dest;
}
// clamp the input between 0 ... 255
private static int clamp(int x) {
return (x < 0) ? 0 : ((x > 255) ? 255 : x);
}
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;
}
}