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