1 /* Copyright (C) 2005-2011 Fabio Riccardi */ 2 3 package com.lightcrafts.jai.opimage; 4 5 import com.lightcrafts.mediax.jai.PointOpImage; 6 import com.lightcrafts.mediax.jai.ImageLayout; 7 import com.lightcrafts.mediax.jai.RasterAccessor; 8 import com.lightcrafts.mediax.jai.RasterFormatTag; 9 10 import java.awt.image.RenderedImage; 11 import java.awt.image.Raster; 12 import java.awt.image.WritableRaster; 13 import java.awt.*; 14 import java.util.Map; 15 16 public class HighlightRecoveryOpImage extends PointOpImage { 17 private final float[] preMul; 18 private final float[][] csMatrix; 19 HighlightRecoveryOpImage(RenderedImage source, float[] preMul, float[][] csMatrix, Map config)20 public HighlightRecoveryOpImage(RenderedImage source, float[] preMul, float[][] csMatrix, Map config) { 21 super(source, new ImageLayout(source), config, true); 22 permitInPlaceOperation(); 23 this.preMul = preMul; 24 this.csMatrix = csMatrix; 25 } 26 computeRect(Raster[] sources, WritableRaster dest, Rectangle destRect)27 protected void computeRect(Raster[] sources, 28 WritableRaster dest, 29 Rectangle destRect) { 30 // Retrieve format tags. 31 RasterFormatTag[] formatTags = getFormatTags(); 32 33 Raster source = sources[0]; 34 Rectangle srcRect = mapDestRect(destRect, 0); 35 36 RasterAccessor srcAccessor = 37 new RasterAccessor(source, srcRect, formatTags[0], 38 getSourceImage(0).getColorModel()); 39 RasterAccessor dstAccessor = 40 new RasterAccessor(dest, destRect, formatTags[1], 41 this.getColorModel()); 42 43 ushortLoop(srcAccessor, dstAccessor); 44 } 45 floatNativeUshortLoop(short dstData[], short srcData[], int dstBandOffsets[], int srcBandOffsets[], int dstLineStride, int srcLineStride, int dstPixelStride, int srcPixelStride, int width, int height, float preMul[], float[] csMatrix)46 native private void floatNativeUshortLoop(short dstData[], short srcData[], 47 int dstBandOffsets[], int srcBandOffsets[], 48 int dstLineStride, int srcLineStride, 49 int dstPixelStride, int srcPixelStride, 50 int width, int height, 51 float preMul[], float[] csMatrix); 52 ushortLoop(RasterAccessor src, RasterAccessor dst)53 protected void ushortLoop(RasterAccessor src, RasterAccessor dst) { 54 int width = src.getWidth(); 55 int height = src.getHeight(); 56 57 short dstDataArrays[][] = dst.getShortDataArrays(); 58 short dstData[] = dstDataArrays[0]; 59 int dstBandOffsets[] = dst.getBandOffsets(); 60 int dstLineStride = dst.getScanlineStride(); 61 int dstPixelStride = dst.getPixelStride(); 62 63 short srcDataArrays[][] = src.getShortDataArrays(); 64 short srcData[] = srcDataArrays[0]; 65 int srcBandOffsets[] = src.getBandOffsets(); 66 int srcLineStride = src.getScanlineStride(); 67 int srcPixelStride = src.getPixelStride(); 68 69 float csArray[] = new float[9]; 70 71 for (int i = 0; i < 3; i++) 72 System.arraycopy(csMatrix[i], 0, csArray, 3*i, 3); 73 74 floatNativeUshortLoop(srcData, dstData, 75 dstBandOffsets, srcBandOffsets, 76 dstLineStride, srcLineStride, 77 dstPixelStride, srcPixelStride, 78 width, height, 79 preMul, csArray); 80 } 81 } 82