19066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/* 29066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Licensed to the Apache Software Foundation (ASF) under one or more 39066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * contributor license agreements. See the NOTICE file distributed with 49066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * this work for additional information regarding copyright ownership. 59066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ASF licenses this file to You under the Apache License, Version 2.0 69066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * (the "License"); you may not use this file except in compliance with 79066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the License. You may obtain a copy of the License at 89066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 99066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * See the License for the specific language governing permissions and 159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * limitations under the License. 169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @author Oleg V. Khaschansky 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$ 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @date: Oct 6, 2005 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage java.awt.image; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.Point2D; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.geom.Rectangle2D; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.*; 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.util.Arrays; 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.AwtImageBackdoorAccessor; 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.internal.nls.Messages; 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Class RescaleOp performs rescaling of the source image data by 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * multiplying the pixel values with a scale factor and then adding an offset. 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @since Android 1.0 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class RescaleOp implements BufferedImageOp, RasterOp { 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The scale factors. 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float scaleFactors[]; 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The offsets. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float offsets[]; 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The hints. 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private RenderingHints hints; 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project static { 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // System.loadLibrary("imageops"); 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Instantiates a new RescaleOp object with the specified scale factors and 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * offsets. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param scaleFactors 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the array of scale factor values. 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offsets 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the array of offset values. 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hints 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the RenderingHints or null. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RescaleOp(float[] scaleFactors, float[] offsets, RenderingHints hints) { 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numFactors = Math.min(scaleFactors.length, offsets.length); 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.scaleFactors = new float[numFactors]; 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.offsets = new float[numFactors]; 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(scaleFactors, 0, this.scaleFactors, 0, numFactors); 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(offsets, 0, this.offsets, 0, numFactors); 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.hints = hints; 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Instantiates a new RescaleOp object with the specified scale factor and 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * offset. 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param scaleFactor 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the scale factor. 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offset 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the offset. 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hints 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the RenderingHints or null. 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public RescaleOp(float scaleFactor, float offset, RenderingHints hints) { 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaleFactors = new float[1]; 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets = new float[1]; 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaleFactors[0] = scaleFactor; 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets[0] = offset; 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this.hints = hints; 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the number of scaling factors. 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the number of scaling factors. 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final int getNumFactors() { 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return scaleFactors.length; 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final RenderingHints getRenderingHints() { 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return hints; 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the scale factors of this RescaleOp. 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param scaleFactors 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the desired scale factors array will be copied to this array. 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the scale factors array. 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float[] getScaleFactors(float[] scaleFactors) { 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scaleFactors == null) { 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaleFactors = new float[this.scaleFactors.length]; 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minLength = Math.min(scaleFactors.length, this.scaleFactors.length); 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(this.scaleFactors, 0, scaleFactors, 0, minLength); 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return scaleFactors; 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the offsets array of this RescaleOp. 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param offsets 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the desired offsets array will be copied to this array. 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the offsets array of this RescaleOp. 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final float[] getOffsets(float[] offsets) { 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offsets == null) { 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets = new float[this.offsets.length]; 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minLength = Math.min(offsets.length, this.offsets.length); 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(this.offsets, 0, offsets, 0, minLength); 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return offsets; 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Point2D getPoint2D(Point2D srcPt, Point2D dstPt) { 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dstPt == null) { 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstPt = new Point2D.Float(); 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstPt.setLocation(srcPt); 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dstPt; 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Rectangle2D getBounds2D(Raster src) { 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return src.getBounds(); 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final Rectangle2D getBounds2D(BufferedImage src) { 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getBounds2D(src.getRaster()); 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WritableRaster createCompatibleDestRaster(Raster src) { 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return src.createCompatibleWritableRaster(); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public BufferedImage createCompatibleDestImage(BufferedImage src, ColorModel dstCM) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dstCM == null) { 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstCM = src.getColorModel(); 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dstCM instanceof IndexColorModel) { 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstCM = ColorModel.getRGBdefault(); 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project WritableRaster r = dstCM.isCompatibleSampleModel(src.getSampleModel()) ? src.getRaster() 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .createCompatibleWritableRaster(src.getWidth(), src.getHeight()) : dstCM 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .createCompatibleWritableRaster(src.getWidth(), src.getHeight()); 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new BufferedImage(dstCM, r, dstCM.isAlphaPremultiplied(), null); 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final WritableRaster filter(Raster src, WritableRaster dst) { 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dst == null) { 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst = createCompatibleDestRaster(src); 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src.getNumBands() != dst.getNumBands()) { 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.21D=Number of src bands ({0}) does not match number of 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // dst bands ({1}) 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.21D", //$NON-NLS-1$ 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project src.getNumBands(), dst.getNumBands())); 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (this.scaleFactors.length != 1 && this.scaleFactors.length != src.getNumBands()) { 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.21E=Number of scaling constants is not equal to the number of 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bands 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.21E")); //$NON-NLS-1$ 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if (ippFilter(src, dst, BufferedImage.TYPE_CUSTOM, false) != 0) 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (slowFilter(src, dst, false) != 0) { 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.21F=Unable to transform source 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ImagingOpException(Messages.getString("awt.21F")); //$NON-NLS-1$ 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return dst; 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Slow filter. 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the src. 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dst 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the dst. 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param skipAlpha 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the skip alpha. 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the int. 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int slowFilter(Raster src, WritableRaster dst, boolean skipAlpha) { 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SampleModel sm = src.getSampleModel(); 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numBands = src.getNumBands(); 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int srcHeight = src.getHeight(); 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int srcWidth = src.getWidth(); 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int srcMinX = src.getMinX(); 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int srcMinY = src.getMinY(); 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dstMinX = dst.getMinX(); 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int dstMinY = dst.getMinY(); 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] maxValues = new int[numBands]; 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] masks = new int[numBands]; 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] sampleSizes = sm.getSampleSize(); 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numBands; i++) { 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxValues[i] = (1 << sampleSizes[i]) - 1; 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project masks[i] = ~(maxValues[i]); 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Processing bounds 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] pixels = null; 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels = src.getPixels(srcMinX, srcMinY, srcWidth, srcHeight, pixels); 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Cycle over pixels to be calculated 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (skipAlpha) { // Always suppose that alpha channel is the last band 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scaleFactors.length > 1) { 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < pixels.length;) { 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int bandIdx = 0; bandIdx < numBands - 1; bandIdx++, i++) { 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = pixels[i] * scaleFactors[bandIdx] + offsets[bandIdx]; 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for overflow now 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (((int)pixels[i] & masks[bandIdx]) != 0) { 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pixels[i] < 0) { 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = 0; 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = maxValues[bandIdx]; 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < pixels.length;) { 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int bandIdx = 0; bandIdx < numBands - 1; bandIdx++, i++) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = pixels[i] * scaleFactors[0] + offsets[0]; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for overflow now 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (((int)pixels[i] & masks[bandIdx]) != 0) { 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pixels[i] < 0) { 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = 0; 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = maxValues[bandIdx]; 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project i++; 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scaleFactors.length > 1) { 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < pixels.length;) { 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int bandIdx = 0; bandIdx < numBands; bandIdx++, i++) { 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = pixels[i] * scaleFactors[bandIdx] + offsets[bandIdx]; 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for overflow now 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (((int)pixels[i] & masks[bandIdx]) != 0) { 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pixels[i] < 0) { 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = 0; 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = maxValues[bandIdx]; 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < pixels.length;) { 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int bandIdx = 0; bandIdx < numBands; bandIdx++, i++) { 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = pixels[i] * scaleFactors[0] + offsets[0]; 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check for overflow now 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (((int)pixels[i] & masks[bandIdx]) != 0) { 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (pixels[i] < 0) { 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = 0; 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project pixels[i] = maxValues[bandIdx]; 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst.setPixels(dstMinX, dstMinY, srcWidth, srcHeight, pixels); 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 0; 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public final BufferedImage filter(BufferedImage src, BufferedImage dst) { 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ColorModel srcCM = src.getColorModel(); 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (srcCM instanceof IndexColorModel) { 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.220=Source should not have IndexColorModel 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.220")); //$NON-NLS-1$ 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check if the number of scaling factors matches the number of bands 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int nComponents = srcCM.getNumComponents(); 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean skipAlpha; 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (srcCM.hasAlpha()) { 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scaleFactors.length == 1 || scaleFactors.length == nComponents - 1) { 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project skipAlpha = true; 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (scaleFactors.length == nComponents) { 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project skipAlpha = false; 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.21E=Number of scaling constants is not equal to the 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // number of bands 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.21E")); //$NON-NLS-1$ 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (scaleFactors.length == 1 || scaleFactors.length == nComponents) { 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project skipAlpha = false; 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.21E=Number of scaling constants is not equal to the number of 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // bands 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.21E")); //$NON-NLS-1$ 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project BufferedImage finalDst = null; 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dst == null) { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finalDst = dst; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst = createCompatibleDestImage(src, srcCM); 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (!srcCM.equals(dst.getColorModel())) { 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Treat BufferedImage.TYPE_INT_RGB and BufferedImage.TYPE_INT_ARGB 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // as same 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!((src.getType() == BufferedImage.TYPE_INT_RGB || src.getType() == BufferedImage.TYPE_INT_ARGB) && (dst 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getType() == BufferedImage.TYPE_INT_RGB || dst.getType() == BufferedImage.TYPE_INT_ARGB))) { 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finalDst = dst; 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dst = createCompatibleDestImage(src, srcCM); 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // if (ippFilter(src.getRaster(), dst.getRaster(), src.getType(), 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // skipAlpha) != 0) 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (slowFilter(src.getRaster(), dst.getRaster(), skipAlpha) != 0) { 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.21F=Unable to transform source 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new ImagingOpException(Messages.getString("awt.21F")); //$NON-NLS-1$ 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (finalDst != null) { 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Graphics2D g = finalDst.createGraphics(); 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g.setComposite(AlphaComposite.Src); 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project g.drawImage(dst, 0, 0, null); 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project finalDst = dst; 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return finalDst; 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Don't forget to pass allocated arrays for levels and values, size should 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // be numBands*4 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates the levels. 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param sm 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the sm. 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param numBands 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the num bands. 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param skipAlpha 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the skip alpha. 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param levels 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the levels. 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param values 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the values. 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param channelsOrder 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the channels order. 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final void createLevels(SampleModel sm, int numBands, boolean skipAlpha, int levels[], 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int values[], int channelsOrder[]) { 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Suppose same sample size for all channels, otherwise use slow filter 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int maxValue = (1 << sm.getSampleSize(0)) - 1; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // For simplicity introduce these arrays 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float extScaleFactors[] = new float[numBands]; 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float extOffsets[] = new float[numBands]; 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (scaleFactors.length != 1) { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(scaleFactors, 0, extScaleFactors, 0, scaleFactors.length); 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(offsets, 0, extOffsets, 0, scaleFactors.length); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numBands; i++) { 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project extScaleFactors[i] = scaleFactors[0]; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project extOffsets[i] = offsets[0]; 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (skipAlpha) { 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project extScaleFactors[numBands - 1] = 1; 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project extOffsets[numBands - 1] = 0; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Create a levels 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numBands; i++) { 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (extScaleFactors[i] == 0) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4] = 0; 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4 + 1] = 0; 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4 + 2] = maxValue + 1; 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4 + 3] = maxValue + 1; 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float minLevel = -extOffsets[i] / extScaleFactors[i]; 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float maxLevel = (maxValue - extOffsets[i]) / extScaleFactors[i]; 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (minLevel < 0) { 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project minLevel = 0; 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (minLevel > maxValue) { 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project minLevel = maxValue; 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (maxLevel < 0) { 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxLevel = 0; 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (maxLevel > maxValue) { 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxLevel = maxValue; 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4] = 0; 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (minLevel > maxLevel) { 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4 + 1] = (int)maxLevel; 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4 + 2] = (int)minLevel; 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4 + 1] = (int)minLevel; 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4 + 2] = (int)maxLevel; 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project levels[i * 4 + 3] = maxValue + 1; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Fill values 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int k = 0; k < 4; k++) { 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int idx = i * 4 + k; 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values[idx] = (int)(extScaleFactors[i] * levels[idx] + extOffsets[i]); 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (values[idx] < 0) { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values[idx] = 0; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (values[idx] > maxValue) { 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project values[idx] = maxValue; 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Reorder data if channels are stored in different order 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (channelsOrder != null) { 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int len = numBands * 4; 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int savedLevels[] = new int[len]; 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int savedValues[] = new int[len]; 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(levels, 0, savedLevels, 0, len); 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(values, 0, savedValues, 0, len); 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < channelsOrder.length; i++) { 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(savedLevels, i * 4, levels, channelsOrder[i] * 4, 4); 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project System.arraycopy(savedValues, i * 4, values, channelsOrder[i] * 4, 4); 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TODO remove when this method is used 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Ipp filter. 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param src 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the src. 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param dst 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the dst. 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param imageType 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the image type. 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param skipAlpha 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the skip alpha. 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the int. 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @SuppressWarnings("unused") 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private final int ippFilter(Raster src, WritableRaster dst, int imageType, boolean skipAlpha) { 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int res; 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int srcStride, dstStride; 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channels; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int offsets[] = null; 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int channelsOrder[] = null; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (imageType) { 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_INT_ARGB: 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_INT_ARGB_PRE: 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_INT_RGB: { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channels = 4; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcStride = src.getWidth() * 4; 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstStride = dst.getWidth() * 4; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channelsOrder = new int[] { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2, 1, 0, 3 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_4BYTE_ABGR: 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_4BYTE_ABGR_PRE: 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_INT_BGR: { 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channels = 4; 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcStride = src.getWidth() * 4; 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstStride = dst.getWidth() * 4; 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_BYTE_GRAY: { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channels = 1; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcStride = src.getWidth(); 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstStride = dst.getWidth(); 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_3BYTE_BGR: { 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channels = 3; 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcStride = src.getWidth() * 3; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstStride = dst.getWidth() * 3; 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channelsOrder = new int[] { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2, 1, 0 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project }; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_USHORT_GRAY: 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_USHORT_565_RGB: 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_USHORT_555_RGB: 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case BufferedImage.TYPE_BYTE_BINARY: { 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return slowFilter(src, dst, skipAlpha); 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: { 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SampleModel srcSM = src.getSampleModel(); 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SampleModel dstSM = dst.getSampleModel(); 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (srcSM instanceof PixelInterleavedSampleModel 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && dstSM instanceof PixelInterleavedSampleModel) { 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check PixelInterleavedSampleModel 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (srcSM.getDataType() != DataBuffer.TYPE_BYTE 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || dstSM.getDataType() != DataBuffer.TYPE_BYTE) { 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return slowFilter(src, dst, skipAlpha); 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channels = srcSM.getNumBands(); // Have IPP functions for 1, 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 3 and 4 channels 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(channels == 1 || channels == 3 || channels == 4)) { 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return slowFilter(src, dst, skipAlpha); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcStride = ((ComponentSampleModel)srcSM).getScanlineStride(); 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstStride = ((ComponentSampleModel)dstSM).getScanlineStride(); 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channelsOrder = ((ComponentSampleModel)srcSM).getBandOffsets(); 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (srcSM instanceof SinglePixelPackedSampleModel 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project && dstSM instanceof SinglePixelPackedSampleModel) { 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check SinglePixelPackedSampleModel 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SinglePixelPackedSampleModel sppsm1 = (SinglePixelPackedSampleModel)srcSM; 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SinglePixelPackedSampleModel sppsm2 = (SinglePixelPackedSampleModel)dstSM; 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channels = sppsm1.getNumBands(); 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // TYPE_INT_RGB, TYPE_INT_ARGB... 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sppsm1.getDataType() != DataBuffer.TYPE_INT 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || sppsm2.getDataType() != DataBuffer.TYPE_INT 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !(channels == 3 || channels == 4)) { 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return slowFilter(src, dst, skipAlpha); 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Check compatibility of sample models 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!Arrays.equals(sppsm1.getBitOffsets(), sppsm2.getBitOffsets()) 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || !Arrays.equals(sppsm1.getBitMasks(), sppsm2.getBitMasks())) { 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return slowFilter(src, dst, skipAlpha); 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < channels; i++) { 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sppsm1.getSampleSize(i) != 8) { 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return slowFilter(src, dst, skipAlpha); 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channelsOrder = new int[channels]; 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bitOffsets[] = sppsm1.getBitOffsets(); 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < channels; i++) { 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channelsOrder[i] = bitOffsets[i] / 8; 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (channels == 3) { // Don't skip channel now, could be 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // optimized 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project channels = 4; 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcStride = sppsm1.getScanlineStride() * 4; 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstStride = sppsm2.getScanlineStride() * 4; 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return slowFilter(src, dst, skipAlpha); 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Fill offsets if there's a child raster 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src.getParent() != null || dst.getParent() != null) { 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (src.getSampleModelTranslateX() != 0 || src.getSampleModelTranslateY() != 0 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || dst.getSampleModelTranslateX() != 0 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project || dst.getSampleModelTranslateY() != 0) { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets = new int[4]; 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets[0] = -src.getSampleModelTranslateX() + src.getMinX(); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets[1] = -src.getSampleModelTranslateY() + src.getMinY(); 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets[2] = -dst.getSampleModelTranslateX() + dst.getMinX(); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project offsets[3] = -dst.getSampleModelTranslateY() + dst.getMinY(); 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int levels[] = new int[4 * channels]; 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int values[] = new int[4 * channels]; 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project createLevels(src.getSampleModel(), channels, skipAlpha, levels, values, channelsOrder); 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object srcData, dstData; 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project AwtImageBackdoorAccessor dbAccess = AwtImageBackdoorAccessor.getInstance(); 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project try { 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project srcData = dbAccess.getData(src.getDataBuffer()); 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dstData = dbAccess.getData(dst.getDataBuffer()); 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } catch (IllegalArgumentException e) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return -1; // Unknown data buffer type 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project res = LookupOp.ippLUT(srcData, src.getWidth(), src.getHeight(), srcStride, dstData, dst 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project .getWidth(), dst.getHeight(), dstStride, levels, values, channels, offsets, true); 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return res; 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 660