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 Igor V. Stolyarov 199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @version $Revision$ 209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpackage java.awt.image; 239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport java.awt.color.ColorSpace; 259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.gl.color.LUTColorConverter; 279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectimport org.apache.harmony.awt.internal.nls.Messages; 289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project/** 309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The Class ComponentColorModel represents a color model that is defined in 319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * terms of its components. 329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @since Android 1.0 349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Projectpublic class ComponentColorModel extends ColorModel { 369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The signed. 399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean signed; // Pixel samples are signed. 419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Samples with TransferType DataBuffer.TYPE_BYTE, 439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DataBuffer.TYPE_USHORT, DataBuffer.TYPE_INT - 449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unsigned. Samples with others TransferType - 459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // signed. 469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The integral. 499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean integral; // Pixel samples are integral. 519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Samples with TransferType DataBuffer.TYPE_BYTE, 539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DataBuffer.TYPE_USHORT, DataBuffer.Short and 549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DataBuffer.TYPE_INT - integral. 559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The scale factors. 589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float scaleFactors[]; // Array of factors for reduction components 609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // values into the form scaled from 0 to 255 629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The donot support unnormalized. 659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean donotSupportUnnormalized; // This Color Model don't support 679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unnormolized form 699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The need alpha divide. 729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean needAlphaDivide; // hasAlpha && isAlphaPremultiplied 749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The calc value. 779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean calcValue; // Value was culculated 799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The need scale. 829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean needScale; // Normalized value need to scale 849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The min vals. 879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float minVals[]; // Array of Min normalized values 899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The ranges. 929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float ranges[]; // Array of range normalized values 949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The alpha lut. 979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private byte alphaLUT[]; // Lookup table for scale alpha value 999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The color lu ts. 1029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private byte colorLUTs[][]; // Lookup tables for scale color values 1049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The from_ linea r_ rg b_ lut. 1079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private byte from_LINEAR_RGB_LUT[]; // Lookup table for conversion from 1099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Linear RGB Color Space into sRGB 1119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The to_ linea r_8 rg b_ lut. 1149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private byte to_LINEAR_8RGB_LUT[]; // Lookup table for conversion from 1169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // sRGB Color Space into Linear RGB 1189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 8 bit 1199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The to_ linea r_16 rg b_ lut. 1229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private short to_LINEAR_16RGB_LUT[]; // Lookup table for conversion from 1249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // sRGB Color Space into Linear RGB 1269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // 16 bit 1279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The LINEA r_ rg b_ length. 1309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int LINEAR_RGB_Length; // Linear RGB bit length 1329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The factor. 1359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float fFactor; // Scale factor 1379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The is_s rgb. 1409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean is_sRGB; // ColorModel has sRGB ColorSpace 1429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * The is_ linea r_ rgb. 1459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private boolean is_LINEAR_RGB; // Color Model has Linear RGB Color 1479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Space 1499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 1519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Instantiates a new component color model. 1529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 1539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorSpace 1549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the color space. 1559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bits 1569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the array of component masks. 1579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hasAlpha 1589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether the color model has alpha. 1599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param isAlphaPremultiplied 1609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether the alpha is pre-multiplied. 1619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param transparency 1629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the transparency strategy, @see java.awt.Transparency. 1639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param transferType 1649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the transfer type (primitive java type to use for the 1659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * components). 1669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 1679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentColorModel(ColorSpace colorSpace, int bits[], boolean hasAlpha, 1689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isAlphaPremultiplied, int transparency, int transferType) { 1699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project super(createPixelBits(colorSpace, hasAlpha, transferType), validateBits(bits, colorSpace, 1709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project hasAlpha, transferType), colorSpace, hasAlpha, isAlphaPremultiplied, transparency, 1719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transferType); 1729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 1739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needScale = false; 1749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 1759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 1769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 1779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 1789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signed = false; 1799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project integral = true; 1809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project donotSupportUnnormalized = false; 1819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaleFactors = new float[numComponents]; 1829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numColorComponents; i++) { 1839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaleFactors[i] = 1.0f / maxValues[i]; 1849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cs.getMinValue(i) != 0.0f || cs.getMaxValue(i) != 1.0f) { 1859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project donotSupportUnnormalized = true; 1869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasAlpha) { 1899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxValues[numColorComponents] = (1 << bits[numColorComponents]) - 1; 1909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaleFactors[numColorComponents] = 1.0f / maxValues[numColorComponents]; 1919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 1929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 1939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_SHORT: 1949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signed = true; 1959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project integral = true; 1969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project donotSupportUnnormalized = true; 1979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaleFactors = new float[numComponents]; 1989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numComponents; i++) { 1999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project maxValues[i] = Short.MAX_VALUE; 2009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project scaleFactors[i] = 1.0f / maxValues[i]; 2019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cs.getMinValue(i) != 0.0f || cs.getMaxValue(i) != 1.0f) { 2029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needScale = true; 2039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needScale) { 2069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project minVals = new float[numColorComponents]; 2079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ranges = new float[numColorComponents]; 2089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numColorComponents; i++) { 2099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project minVals[i] = cs.getMinValue(i); 2109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ranges[i] = cs.getMaxValue(i) - minVals[i]; 2119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_FLOAT: 2159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_DOUBLE: 2169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project signed = true; 2179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project integral = false; 2189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project donotSupportUnnormalized = true; 2199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 2209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 2219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.215=transferType is not one of DataBuffer.TYPE_BYTE, 2229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DataBuffer.TYPE_USHORT, DataBuffer.TYPE_INT, 2239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DataBuffer.TYPE_SHORT, DataBuffer.TYPE_FLOAT, or 2249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DataBuffer.TYPE_DOUBLE 2259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.215")); //$NON-NLS-1$ 2269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project needAlphaDivide = hasAlpha && isAlphaPremultiplied; 2299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project initLUTs(); 2309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Instantiates a new component color model. 2349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorSpace 2369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the color space. 2379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hasAlpha 2389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether the color model has alpha. 2399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param isAlphaPremultiplied 2409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * whether the alpha is pre-multiplied. 2419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param transparency 2429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the transparency strategy, @see java.awt.Transparency. 2439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param transferType 2449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the transfer type (primitive java type to use for the 2459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * components). 2469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ComponentColorModel(ColorSpace colorSpace, boolean hasAlpha, 2489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project boolean isAlphaPremultiplied, int transparency, int transferType) { 2499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project this(colorSpace, createPixelBitsArray(colorSpace, hasAlpha, transferType), hasAlpha, 2519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project isAlphaPremultiplied, transparency, transferType); 2529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Validate bits. 2569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param bits 2589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the bits. 2599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorSpace 2609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the color space. 2619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hasAlpha 2629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the has alpha. 2639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param transferType 2649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the transfer type. 2659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the int[]. 2669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int[] validateBits(int bits[], ColorSpace colorSpace, boolean hasAlpha, 2689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transferType) { 2699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits != null) { 2709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bits; 2719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numComponents = colorSpace.getNumComponents(); 2749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasAlpha) { 2759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project numComponents++; 2769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bits = new int[numComponents]; 2789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int componentLength = DataBuffer.getDataTypeSize(transferType); 2809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numComponents; i++) { 2829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bits[i] = componentLength; 2839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bits; 2869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 2879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 2889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 2899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates the pixel bits. 2909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 2919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorSpace 2929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the color space. 2939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hasAlpha 2949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the has alpha. 2959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param transferType 2969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the transfer type. 2979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the int. 2989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 2999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int createPixelBits(ColorSpace colorSpace, boolean hasAlpha, int transferType) { 3009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numComponents = colorSpace.getNumComponents(); 3019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasAlpha) { 3029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project numComponents++; 3039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int componentLength = DataBuffer.getDataTypeSize(transferType); 3059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return numComponents * componentLength; 3069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 3099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Creates the pixel bits array. 3109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 3119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param colorSpace 3129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the color space. 3139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param hasAlpha 3149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the has alpha. 3159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param transferType 3169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the transfer type. 3179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the int[]. 3189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 3199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private static int[] createPixelBitsArray(ColorSpace colorSpace, boolean hasAlpha, 3209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int transferType) { 3219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int numComponents = colorSpace.getNumComponents(); 3239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasAlpha) { 3249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project numComponents++; 3259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bits[] = new int[numComponents]; 3289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numComponents; i++) { 3299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bits[i] = DataBuffer.getDataTypeSize(transferType); 3309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return bits; 3329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getDataElements(int components[], int offset, Object obj) { 3369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (donotSupportUnnormalized) { 3379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.213=This ComponentColorModel does not support the 3389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unnormalized form 3399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ 3409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (offset + numComponents > components.length) { 3439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.216=The components array is not large enough to hold all the 3449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // color and alpha components 3459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.216")); //$NON-NLS-1$ 3469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 3499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 3509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte ba[]; 3519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 3529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ba = new byte[numComponents]; 3539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ba = (byte[])obj; 3559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = offset; i < numComponents; i++, idx++) { 3579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ba[i] = (byte)components[idx]; 3589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ba; 3609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 3619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sa[]; 3629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 3639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = new short[numComponents]; 3649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = (short[])obj; 3669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = offset; i < numComponents; i++, idx++) { 3689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa[i] = (short)components[idx]; 3699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sa; 3719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 3729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ia[]; 3739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 3749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ia = new int[numComponents]; 3759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 3769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ia = (int[])obj; 3779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = offset; i < numComponents; i++, idx++) { 3799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ia[i] = components[idx]; 3809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ia; 3829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 3839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.217=The transfer type of this ComponentColorModel is not 3849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // one 3859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of the following transfer types: DataBuffer.TYPE_BYTE, 3869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT 3879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(Messages.getString("awt.217")); //$NON-NLS-1$ 3889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 3929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getDataElements(float normComponents[], int normOffset, Object obj) { 3939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needScale) { 3949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { 3959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents[idx] = (normComponents[idx] - minVals[i]) / ranges[i]; 3969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 3989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 3999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 4009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 4019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte ba[]; 4029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 4039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ba = new byte[numComponents]; 4049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ba = (byte[])obj; 4069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 4099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = normComponents[normOffset + numColorComponents]; 4109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numColorComponents; i++, idx++) { 4119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ba[i] = (byte)(normComponents[idx] * alpha * maxValues[i] + 0.5f); 4129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ba[numColorComponents] = (byte)(normComponents[normOffset + numColorComponents] 4149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * maxValues[numColorComponents] + 0.5f); 4159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 4179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ba[idx] = (byte)(normComponents[idx] * maxValues[i] + 0.5f); 4189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ba; 4219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 4239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short usa[]; 4249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 4259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usa = new short[numComponents]; 4269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usa = (short[])obj; 4289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 4319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = normComponents[normOffset + numColorComponents]; 4329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { 4339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usa[i] = (short)(normComponents[idx] * alpha * maxValues[i] + 0.5f); 4349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usa[numColorComponents] = (short)(alpha * maxValues[numColorComponents] + 0.5f); 4369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 4389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project usa[i] = (short)(normComponents[idx] * maxValues[i] + 0.5f); 4399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return usa; 4429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 4449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ia[]; 4459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 4469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ia = new int[numComponents]; 4479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ia = (int[])obj; 4499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 4529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = normComponents[normOffset + numColorComponents]; 4539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { 4549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ia[i] = (int)(normComponents[idx] * alpha * maxValues[i] + 0.5f); 4559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ia[numColorComponents] = (int)(alpha * maxValues[numColorComponents] + 0.5f); 4579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 4599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ia[i] = (int)(normComponents[idx] * maxValues[i] + 0.5f); 4609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ia; 4639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_SHORT: 4659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sa[]; 4669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 4679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = new short[numComponents]; 4689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa = (short[])obj; 4709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 4739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = normComponents[normOffset + numColorComponents]; 4749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { 4759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa[i] = (short)(normComponents[idx] * alpha * maxValues[i] + 0.5f); 4769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa[numColorComponents] = (short)(alpha * maxValues[numColorComponents] + 0.5f); 4789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 4809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa[i] = (short)(normComponents[idx] * maxValues[i] + 0.5f); 4819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sa; 4849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_FLOAT: 4869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fa[]; 4879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 4889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fa = new float[numComponents]; 4899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 4909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fa = (float[])obj; 4919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 4939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 4949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = normComponents[normOffset + numColorComponents]; 4959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { 4969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fa[i] = normComponents[idx] * alpha; 4979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 4989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fa[numColorComponents] = alpha; 4999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 5019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fa[i] = normComponents[idx]; 5029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return fa; 5059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_DOUBLE: 5079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double da[]; 5089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (obj == null) { 5099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project da = new double[numComponents]; 5109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project da = (double[])obj; 5129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 5159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double alpha = normComponents[normOffset + numColorComponents]; 5169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = 0; i < numColorComponents; i++, idx++) { 5179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project da[i] = normComponents[idx] * alpha; 5189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project da[numColorComponents] = alpha; 5209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 5229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project da[i] = normComponents[idx]; 5239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return da; 5269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 5289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.213=This ComponentColorModel does not support the 5299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unnormalized form 5309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ 5319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public Object getDataElements(int rgb, Object pixel) { 5369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float normComp[]; 5379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float comp[]; 5389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int red = (rgb >> 16) & 0xff; 5409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int green = (rgb >> 8) & 0xff; 5419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int blue = rgb & 0xff; 5429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha = (rgb >> 24) & 0xff; 5439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = new float[3]; 5459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is_sRGB || is_LINEAR_RGB) { 5469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is_LINEAR_RGB) { 5479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LINEAR_RGB_Length == 8) { 5489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project red = to_LINEAR_8RGB_LUT[red] & 0xff; 5499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project green = to_LINEAR_8RGB_LUT[green] & 0xff; 5509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project blue = to_LINEAR_8RGB_LUT[blue] & 0xff; 5519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project red = to_LINEAR_16RGB_LUT[red] & 0xffff; 5539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project green = to_LINEAR_16RGB_LUT[green] & 0xffff; 5549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project blue = to_LINEAR_16RGB_LUT[blue] & 0xffff; 5559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp[0] = red / fFactor; 5589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp[1] = green / fFactor; 5599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp[2] = blue / fFactor; 5609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!hasAlpha) { 5619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp = comp; 5629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float normAlpha = alpha / 255.0f; 5649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp = new float[numComponents]; 5659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numColorComponents; i++) { 5669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp[i] = comp[i]; 5679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp[numColorComponents] = normAlpha; 5699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp[0] = red / fFactor; 5729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp[1] = green / fFactor; 5739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp[2] = blue / fFactor; 5749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float[] defComp = cs.fromRGB(comp); 5759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!hasAlpha) { 5769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp = defComp; 5779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 5789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float normAlpha = alpha / 255.0f; 5799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp = new float[numComponents]; 5809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numColorComponents; i++) { 5819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp[i] = defComp[i]; 5829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp[numColorComponents] = normAlpha; 5849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasAlpha && isAlphaPremultiplied) { 5879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp[0] *= normComp[numColorComponents]; 5889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp[1] *= normComp[numColorComponents]; 5899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComp[2] *= normComp[numColorComponents]; 5909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getDataElements(normComp, 0, pixel); 5939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 5949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 5959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 5969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WritableRaster getAlphaRaster(WritableRaster raster) { 5979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!hasAlpha) { 5989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return null; 5999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int x = raster.getMinX(); 6029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int y = raster.getMinY(); 6039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bandList[] = new int[1]; 6049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bandList[0] = raster.getNumBands() - 1; 6059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return raster.createWritableChild(x, y, raster.getWidth(), raster.getHeight(), x, y, 6079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bandList); 6089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 6119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public ColorModel coerceData(WritableRaster raster, boolean isAlphaPremultiplied) { 6129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!hasAlpha || this.isAlphaPremultiplied == isAlphaPremultiplied) { 6139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return this; 6149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minX = raster.getMinX(); 6179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int minY = raster.getMinY(); 6189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int w = raster.getWidth(); 6199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int h = raster.getHeight(); 6209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (isAlphaPremultiplied) { 6229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 6239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 6249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 6259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 6269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alphaFactor = maxValues[numColorComponents]; 6279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iComponents[] = null; 6289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iTransparentComponents[] = new int[numComponents]; 6299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < h; i++, minY++) { 6309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0, x = minX; j < w; j++, x++) { 6319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iComponents = raster.getPixel(x, minY, iComponents); 6329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iComponents[numColorComponents] == 0) { 6339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, iTransparentComponents); 6349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = iComponents[numColorComponents] / alphaFactor; 6369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = 0; n < numColorComponents; n++) { 6379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iComponents[n] = (int)(alpha * iComponents[n] + 0.5f); 6389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, iComponents); 6409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_SHORT: 6479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float sAlphaFactor = maxValues[numColorComponents]; 6489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sComponents[] = null; 6499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sTransparentComponents[] = new short[numComponents]; 6509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < h; i++, minY++) { 6519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0, x = minX; j < w; j++, x++) { 6529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sComponents = (short[])raster.getDataElements(x, minY, sComponents); 6539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sComponents[numColorComponents] == 0) { 6549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setDataElements(x, minY, sTransparentComponents); 6559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = sComponents[numColorComponents] / sAlphaFactor; 6579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = 0; n < numColorComponents; n++) { 6589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sComponents[n] = (byte)(alpha * sComponents[n] + 0.5f); 6599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setDataElements(x, minY, sComponents); 6619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_FLOAT: 6689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fComponents[] = null; 6699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fTransparentComponents[] = new float[numComponents]; 6709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < h; i++, minY++) { 6719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0, x = minX; j < w; j++, x++) { 6729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fComponents = raster.getPixel(x, minY, fComponents); 6739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fComponents[numColorComponents] == 0.0f) { 6749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setDataElements(x, minY, fTransparentComponents); 6759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = fComponents[numColorComponents]; 6779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = 0; n < numColorComponents; n++) { 6789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fComponents[n] = fComponents[n] * alpha; 6799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, fComponents); 6819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 6859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 6869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 6879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_DOUBLE: 6889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double dComponents[] = null; 6899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double dTransparentComponents[] = new double[numComponents]; 6909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < h; i++, minY++) { 6919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0, x = minX; j < w; j++, x++) { 6929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dComponents = raster.getPixel(x, minY, dComponents); 6939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dComponents[numColorComponents] == 0.0) { 6949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, dTransparentComponents); 6959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 6969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double alpha = dComponents[numColorComponents]; 6979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = 0; n < numColorComponents; n++) { 6989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dComponents[n] = dComponents[n] * alpha; 6999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, dComponents); 7019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 7089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.219=This transferType is not supported by this color 7099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // model 7109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(Messages.getString("awt.219")); //$NON-NLS-1$ 7119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 7149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 7159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 7169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 7179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alphaFactor = maxValues[numColorComponents]; 7189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iComponents[] = null; 7199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int iTransparentComponents[] = new int[numComponents]; 7209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < h; i++, minY++) { 7219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0, x = minX; j < w; j++, x++) { 7229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iComponents = raster.getPixel(x, minY, iComponents); 7239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (iComponents[numColorComponents] == 0) { 7249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, iTransparentComponents); 7259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = iComponents[numColorComponents] / alphaFactor; 7279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = 0; n < numColorComponents; n++) { 7289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project iComponents[n] = (int)(iComponents[n] / alpha + 0.5f); 7299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, iComponents); 7319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_SHORT: 7389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float sAlphaFactor = maxValues[numColorComponents]; 7399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sComponents[] = null; 7409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sTransparentComponents[] = new short[numComponents]; 7419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < h; i++, minY++) { 7429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0, x = minX; j < w; j++, x++) { 7439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sComponents = (short[])raster.getDataElements(x, minY, sComponents); 7449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sComponents[numColorComponents] == 0) { 7459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setDataElements(x, minY, sTransparentComponents); 7469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = sComponents[numColorComponents] / sAlphaFactor; 7489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = 0; n < numColorComponents; n++) { 7499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sComponents[n] = (byte)(sComponents[n] / alpha + 0.5f); 7509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setDataElements(x, minY, sComponents); 7529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_FLOAT: 7599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fComponents[] = null; 7609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fTransparentComponents[] = new float[numComponents]; 7619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < h; i++, minY++) { 7629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0, x = minX; j < w; j++, x++) { 7639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fComponents = raster.getPixel(x, minY, fComponents); 7649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fComponents[numColorComponents] == 0.0f) { 7659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setDataElements(x, minY, fTransparentComponents); 7669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = fComponents[numColorComponents]; 7689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = 0; n < numColorComponents; n++) { 7699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fComponents[n] = fComponents[n] / alpha; 7709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, fComponents); 7729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_DOUBLE: 7799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double dComponents[] = null; 7809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double dTransparentComponents[] = new double[numComponents]; 7819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < h; i++, minY++) { 7829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0, x = minX; j < w; j++, x++) { 7839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dComponents = raster.getPixel(x, minY, dComponents); 7849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (dComponents[numColorComponents] == 0.0) { 7859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, dTransparentComponents); 7869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 7879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double alpha = dComponents[numColorComponents]; 7889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int n = 0; n < numColorComponents; n++) { 7899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project dComponents[n] = dComponents[n] / alpha; 7909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project raster.setPixel(x, minY, dComponents); 7929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 7959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 7969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 7979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 7989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.219=This transferType is not supported by this color 7999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // model 8009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(Messages.getString("awt.219")); //$NON-NLS-1$ 8019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!signed) { 8059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ComponentColorModel(cs, bits, hasAlpha, isAlphaPremultiplied, transparency, 8069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transferType); 8079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ComponentColorModel(cs, null, hasAlpha, isAlphaPremultiplied, transparency, 8109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project transferType); 8119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int[] getComponents(Object pixel, int[] components, int offset) { 8159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (donotSupportUnnormalized) { 8169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.213=This ComponentColorModel does not support the 8179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unnormalized form 8189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ 8199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (components == null) { 8229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project components = new int[offset + numComponents]; 8239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (offset + numComponents > components.length) { 8249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.218=The components array is not large enough to hold all the 8259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // color and alpha components 8269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.218")); //$NON-NLS-1$ 8279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 8309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 8319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte ba[] = (byte[])pixel; 8329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = offset; i < numComponents; i++, idx++) { 8349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project components[idx] = ba[i] & 0xff; 8359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return components; 8379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 8399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sa[] = (short[])pixel; 8409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = offset; i < numComponents; i++, idx++) { 8419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project components[idx] = sa[i] & 0xffff; 8429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return components; 8449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 8469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ia[] = (int[])pixel; 8479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = offset; i < numComponents; i++, idx++) { 8489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project components[idx] = ia[i]; 8499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return components; 8519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 8539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.217=The transfer type of this ComponentColorModel is not 8549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // one 8559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // of the following transfer types: DataBuffer.TYPE_BYTE, 8569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // DataBuffer.TYPE_USHORT, or DataBuffer.TYPE_INT 8579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(Messages.getString("awt.217")); //$NON-NLS-1$ 8589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 8639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float[] getNormalizedComponents(Object pixel, float normComponents[], int normOffset) { 8649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (normComponents == null) { 8669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents = new float[numComponents + normOffset]; 8679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 8709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 8719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte ba[] = (byte[])pixel; 8729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 8739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents[idx] = (ba[i] & 0xff) * scaleFactors[i]; 8749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 8789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short usa[] = (short[])pixel; 8799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 8809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents[idx] = (usa[i] & 0xffff) * scaleFactors[i]; 8819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 8859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ia[] = (int[])pixel; 8869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 8879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents[idx] = ia[i] * scaleFactors[i]; 8889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_SHORT: 8929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sa[] = (short[])pixel; 8939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 8949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents[idx] = sa[i] * scaleFactors[i]; 8959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 8969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 8979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 8989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_FLOAT: 8999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fa[] = (float[])pixel; 9009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 9019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents[idx] = fa[i]; 9029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_DOUBLE: 9069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double da[] = (double[])pixel; 9079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numComponents; i++, idx++) { 9089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents[idx] = (float)da[i]; 9099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 9119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 9139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.21A=This ComponentColorModel does not support this 9149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // transferType 9159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.21A")); //$NON-NLS-1$ 9169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 9199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = normComponents[normOffset + numColorComponents]; 9209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numColorComponents; i++, idx++) { 9219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents[idx] /= alpha; 9229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needScale) { 9269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0, idx = normOffset; i < numColorComponents; i++, idx++) { 9279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project normComponents[idx] = minVals[i] + ranges[i] * normComponents[idx]; 9289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return normComponents; 9319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean equals(Object obj) { 9359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(obj instanceof ComponentColorModel)) { 9369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 9379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.equals(obj); 9399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRed(Object inData) { 9439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getRGBComponent(inData, 0); 9449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRGB(Object inData) { 9489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha = getAlpha(inData); 9499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (cs.getType() == ColorSpace.TYPE_GRAY) { 9509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int gray = getRed(inData); 9519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (alpha << 24 | gray << 16 | gray << 8 | gray); 9529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (alpha << 24 | getRed(inData) << 16 | getGreen(inData) << 8 | getBlue(inData)); 9549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getGreen(Object inData) { 9589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getRGBComponent(inData, 1); 9599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getBlue(Object inData) { 9639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return getRGBComponent(inData, 2); 9649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 9679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getAlpha(Object inData) { 9689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!hasAlpha) { 9699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 255; 9709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha = 0; 9729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 9739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 9749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: { 9759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte ba[] = (byte[])inData; 9769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = ba[numColorComponents] & 0xff; 9779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits[numColorComponents] != 8) { 9789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alphaLUT[alpha] & 0xff; 9799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alpha; 9819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: { 9839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short usa[] = (short[])inData; 9849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = usa[numColorComponents] & 0xffff; 9859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits[numColorComponents] != 8) { 9869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alphaLUT[alpha] & 0xff; 9879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alpha; 9899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: { 9919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ia[] = (int[])inData; 9929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = ia[numColorComponents]; 9939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits[numColorComponents] != 8) { 9949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alphaLUT[alpha] & 0xff; 9959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alpha; 9979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 9989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_SHORT: { 9999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sa[] = (short[])inData; 10009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alpha = sa[numColorComponents]; 10019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits[numColorComponents] != 8) { 10029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alphaLUT[alpha] & 0xff; 10039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return alpha; 10059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_FLOAT: { 10079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fa[] = (float[])inData; 10089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int)(fa[numColorComponents] * 255.0f + 0.5f); 10099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_DOUBLE: { 10119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double da[] = (double[])inData; 10129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int)(da[numColorComponents] * 255.0 + 0.5); 10139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: { 10159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.214=This Color Model doesn't support this transferType 10169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(Messages.getString("awt.214")); //$NON-NLS-1$ 10179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public WritableRaster createCompatibleWritableRaster(int w, int h) { 10239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SampleModel sm = createCompatibleSampleModel(w, h); 10249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project DataBuffer db = sm.createDataBuffer(); 10259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return Raster.createWritableRaster(sm, db, null); 10269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isCompatibleSampleModel(SampleModel sm) { 10309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(sm instanceof ComponentSampleModel)) { 10319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numComponents != sm.getNumBands()) { 10349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (transferType != sm.getTransferType()) { 10379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 10409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public SampleModel createCompatibleSampleModel(int w, int h) { 10449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int bandOffsets[] = new int[numComponents]; 10459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numComponents; i++) { 10469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project bandOffsets[i] = i; 10479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 10509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 10519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 10529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new PixelInterleavedSampleModel(transferType, w, h, numComponents, w 10539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * numComponents, bandOffsets); 10549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 10569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return new ComponentSampleModel(transferType, w, h, numComponents, w 10579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * numComponents, bandOffsets); 10589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public boolean isCompatibleRaster(Raster raster) { 10639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project SampleModel sm = raster.getSampleModel(); 10649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!(sm instanceof ComponentSampleModel)) { 10659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (sm.getNumBands() != numComponents) { 10699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (raster.getTransferType() != transferType) { 10729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int sampleSizes[] = sm.getSampleSize(); 10769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numComponents; i++) { 10779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits[i] != sampleSizes[i]) { 10789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return false; 10799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return true; 10829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public float[] getNormalizedComponents(int components[], int offset, float normComponents[], 10869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int normOffset) { 10879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (donotSupportUnnormalized) { 10889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.213=This ComponentColorModel does not support the 10899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unnormalized form 10909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ 10919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getNormalizedComponents(components, offset, normComponents, normOffset); 10949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 10959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 10969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 10979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDataElement(int[] components, int offset) { 10989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numComponents > 1) { 10999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.212=There is more than one component in this ColorModel 11009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ 11019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (donotSupportUnnormalized) { 11039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.213=This ComponentColorModel does not support the 11049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unnormalized form 11059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ 11069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return components[offset]; 11089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int[] getUnnormalizedComponents(float[] normComponents, int normOffset, 11129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int[] components, int offset) { 11139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (donotSupportUnnormalized) { 11159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.213=This ComponentColorModel does not support the 11169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unnormalized form 11179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ 11189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (normComponents.length - normOffset < numComponents) { 11219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.21B=The length of normComponents minus normOffset is less 11229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // than numComponents 11239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.21B")); //$NON-NLS-1$ 11249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return super.getUnnormalizedComponents(normComponents, normOffset, components, offset); 11279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getDataElement(float normComponents[], int normOffset) { 11319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numComponents > 1) { 11329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.212=There is more than one component in this ColorModel 11339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ 11349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (signed) { 11369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.210=The component value for this ColorModel is signed 11379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.210")); //$NON-NLS-1$ 11389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object pixel = getDataElements(normComponents, normOffset, null); 11419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 11439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 11449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte ba[] = (byte[])pixel; 11459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ba[0] & 0xff; 11469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 11479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sa[] = (short[])pixel; 11489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return sa[0] & 0xffff; 11499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 11509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ia[] = (int[])pixel; 11519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return ia[0]; 11529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 11539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.211=Pixel values for this ColorModel are not conveniently 11549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // representable as a single int 11559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.211")); //$NON-NLS-1$ 11569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int[] getComponents(int pixel, int components[], int offset) { 11619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numComponents > 1) { 11629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.212=There is more than one component in this ColorModel 11639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ 11649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (donotSupportUnnormalized) { 11669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.213=This ComponentColorModel does not support the 11679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // unnormalized form 11689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.213")); //$NON-NLS-1$ 11699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (components == null) { 11729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project components = new int[offset + 1]; 11739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project components[offset] = pixel & maxValues[0]; 11769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return components; 11779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRed(int pixel) { 11819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float rgb[] = toRGB(pixel); 11829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int)(rgb[0] * 255.0f + 0.5f); 11839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getRGB(int pixel) { 11879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (getAlpha(pixel) << 24) | (getRed(pixel) << 16) | (getGreen(pixel) << 8) 11889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project | getBlue(pixel); 11899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getGreen(int pixel) { 11939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float rgb[] = toRGB(pixel); 11949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int)(rgb[1] * 255.0f + 0.5f); 11959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 11969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 11979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 11989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getBlue(int pixel) { 11999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float rgb[] = toRGB(pixel); 12009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int)(rgb[2] * 255.0f + 0.5f); 12019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project @Override 12049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project public int getAlpha(int pixel) { 12059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This method throw IllegalArgumentException according to 12079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Java API Spacification 12089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (signed) { 12099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.210=The component value for this ColorModel is signed 12109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.210")); //$NON-NLS-1$ 12119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numComponents > 1) { 12149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.212=There is more than one component in this ColorModel 12159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ 12169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return 255; 12199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Initialization of Lookup tables. 12239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 12249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private void initLUTs() { 12259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is_sRGB = cs.isCS_sRGB(); 12269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project is_LINEAR_RGB = (cs == LUTColorConverter.LINEAR_RGB_CS); 12279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (hasAlpha && bits[numColorComponents] != 8 && integral) { 12299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alphaLUT = new byte[maxValues[numColorComponents] + 1]; 12309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i <= maxValues[numColorComponents]; i++) { 12319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project alphaLUT[i] = (byte)(scaleFactors[numColorComponents] * i + 0.5f); 12329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is_LINEAR_RGB) { 12369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (maxBitLength > 8) { 12379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LINEAR_RGB_Length = 16; 12389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project from_LINEAR_RGB_LUT = LUTColorConverter.getFrom16lRGBtosRGB_LUT(); 12399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project to_LINEAR_16RGB_LUT = LUTColorConverter.getFromsRGBto16lRGB_LUT(); 12409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project LINEAR_RGB_Length = 8; 12429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project from_LINEAR_RGB_LUT = LUTColorConverter.getFrom8lRGBtosRGB_LUT(); 12439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project to_LINEAR_8RGB_LUT = LUTColorConverter.getFromsRGBto8lRGB_LUT(); 12449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fFactor = ((1 << LINEAR_RGB_Length) - 1); 12469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project fFactor = 255.0f; 12489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (!isAlphaPremultiplied && integral) { 12519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorLUTs = new byte[3][]; 12529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is_sRGB) { 12549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numColorComponents; i++) { 12559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits[i] != 8) { 12569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < i; j++) { 12579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits[i] == bits[j]) { 12589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorLUTs[i] = colorLUTs[j]; 12599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 12609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorLUTs[i] = new byte[maxValues[i] + 1]; 12639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j <= maxValues[0]; j++) { 12649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorLUTs[i][j] = (byte)(scaleFactors[i] * j + 0.5f); 12659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is_LINEAR_RGB) { 12719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int i = 0; i < numColorComponents; i++) { 12739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits[i] != LINEAR_RGB_Length) { 12749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j < i; j++) { 12759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (bits[i] == bits[j]) { 12769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorLUTs[i] = colorLUTs[j]; 12779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 12789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorLUTs[i] = new byte[maxValues[i] + 1]; 12819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project for (int j = 0; j <= maxValues[0]; j++) { 12829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int idx; 12839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (LINEAR_RGB_Length == 8) { 12849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project idx = (int)(scaleFactors[i] * j + 0.5f); 12859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 12869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project idx = (int)(scaleFactors[i] * j * 257.0f + 0.5f); 12879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project colorLUTs[i][j] = from_LINEAR_RGB_LUT[idx]; 12899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 12969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 12979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 12989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * To rgb. 12999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pixel 13019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the integer representation of the pixel. 13029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the array of normalized sRGB components. 13039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private float[] toRGB(int pixel) { 13059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // This method throw IllegalArgumentException according to 13079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // Java API Spacification 13089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (signed) { 13099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.210=The component value for this ColorModel is signed 13109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.210")); //$NON-NLS-1$ 13119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (numComponents > 1) { 13149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.212=There is more than one component in this ColorModel 13159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new IllegalArgumentException(Messages.getString("awt.212")); //$NON-NLS-1$ 13169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project Object obj = null; 13199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 13219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 13229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte ba[] = new byte[1]; 13239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ba[0] = (byte)pixel; 13249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obj = ba; 13259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 13269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 13289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sa[] = new short[1]; 13299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project sa[0] = (short)pixel; 13309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obj = sa; 13319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 13329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 13349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ia[] = new int[1]; 13359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project ia[0] = pixel; 13369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project obj = ia; 13379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project break; 13389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return cs.toRGB(getNormalizedComponents(obj, null, 0)); 13429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the RGB component. 13469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pixel 13489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the pixel. 13499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param idx 13509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the index of component. 13519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the RGB value from 0 to 255 pixel's component. 13529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getRGBComponent(Object pixel, int idx) { 13549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (is_sRGB) { 13559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int comp = getDefComponent(pixel, idx); 13569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (calcValue || bits[idx] == 8) { 13579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return comp; 13589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return colorLUTs[idx][comp] & 0xff; 13609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else if (is_LINEAR_RGB) { 13619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int comp = getDefComponent(pixel, idx); 13629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (calcValue || bits[idx] == LINEAR_RGB_Length) { 13639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return from_LINEAR_RGB_LUT[comp] & 0xff; 13649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return colorLUTs[idx][comp] & 0xff; 13669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float normComp[] = getNormalizedComponents(pixel, null, 0); 13699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float rgbComp[] = cs.toRGB(normComp); 13709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return (int)(rgbComp[idx] * 255.0f + 0.5f); 13719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project /** 13749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * Gets the def component. 13759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * 13769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param pixel 13779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the pixel. 13789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @param idx 13799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * the index of component. 13809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project * @return the tentative value of the pixel component. 13819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project */ 13829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project private int getDefComponent(Object pixel, int idx) { 13839066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int comp = 0; 13849066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project calcValue = false; 13859066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 13869066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project switch (transferType) { 13879066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_BYTE: 13889066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project byte ba[] = (byte[])pixel; 13899066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = ba[idx] & 0xff; 13909066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 13919066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha = ba[numColorComponents] & 0xff; 13929066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alpha == 0) { 13939066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = 0; 13949066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 13959066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float normAlpha = scaleFactors[numColorComponents] * alpha; 13969066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = (int)(comp * fFactor / normAlpha + 0.5f); 13979066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 13989066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project calcValue = true; 13999066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14009066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return comp; 14019066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14029066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_USHORT: 14039066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short usa[] = (short[])pixel; 14049066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = usa[idx] & 0xffff; 14059066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 14069066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha = usa[numColorComponents] & 0xffff; 14079066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alpha == 0) { 14089066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = 0; 14099066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14109066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float normAlpha = scaleFactors[numColorComponents] * alpha; 14119066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = (int)(comp * fFactor / normAlpha + 0.5f); 14129066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14139066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project calcValue = true; 14149066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14159066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return comp; 14169066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14179066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_INT: 14189066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int ia[] = (int[])pixel; 14199066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = ia[idx]; 14209066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 14219066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha = ia[numColorComponents]; 14229066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alpha == 0) { 14239066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = 0; 14249066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14259066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float normAlpha = scaleFactors[numColorComponents] * alpha; 14269066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = (int)(comp * fFactor / normAlpha + 0.5f); 14279066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14289066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project calcValue = true; 14299066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14309066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return comp; 14319066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14329066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_SHORT: 14339066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project short sa[] = (short[])pixel; 14349066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = sa[idx]; 14359066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 14369066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project int alpha = sa[numColorComponents]; 14379066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (alpha == 0) { 14389066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = 0; 14399066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14409066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float normAlpha = scaleFactors[numColorComponents] * alpha; 14419066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = (int)(comp * fFactor / normAlpha + 0.5f); 14429066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14439066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project calcValue = true; 14449066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14459066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return comp; 14469066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14479066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_FLOAT: 14489066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float fa[] = (float[])pixel; 14499066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 14509066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project float alpha = fa[numColorComponents]; 14519066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (fa[numColorComponents] == 0.0f) { 14529066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = 0; 14539066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14549066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = (int)(fa[idx] * fFactor / alpha + 0.5f); 14559066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14569066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14579066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = (int)(fa[idx] * fFactor + 0.5f); 14589066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14599066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project calcValue = true; 14609066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return comp; 14619066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14629066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project case DataBuffer.TYPE_DOUBLE: 14639066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project double da[] = (double[])pixel; 14649066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (needAlphaDivide) { 14659066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project if (da[numColorComponents] == 0.0) { 14669066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = 0; 14679066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14689066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = (int)(da[idx] * fFactor / da[numColorComponents] + 0.5); 14699066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14709066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } else { 14719066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project comp = (int)(da[idx] * fFactor + 0.5); 14729066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14739066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project calcValue = true; 14749066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project return comp; 14759066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14769066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project default: 14779066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project // awt.214=This Color Model doesn't support this transferType 14789066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project throw new UnsupportedOperationException(Messages.getString("awt.214")); //$NON-NLS-1$ 14799066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14809066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project } 14819066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project 14829066cfe9886ac131c34d59ed0e2d287b0e3c0087The Android Open Source Project} 1483