154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/* 254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Copyright (C) 2007 The Android Open Source Project 354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License"); 554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * you may not use this file except in compliance with the License. 654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * You may obtain a copy of the License at 754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * http://www.apache.org/licenses/LICENSE-2.0 954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 1054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Unless required by applicable law or agreed to in writing, software 1154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS, 1254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * See the License for the specific language governing permissions and 1454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * limitations under the License. 1554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 1654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpackage android.graphics; 1854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 1913656743cc21bac43676568314366497346713eeRomain Guyimport java.util.Arrays; 2013656743cc21bac43676568314366497346713eeRomain Guy 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/** 22db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 4x5 matrix for transforming the color and alpha components of a Bitmap. 23db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * The matrix can be passed as single array, and is treated as follows: 24db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 2513656743cc21bac43676568314366497346713eeRomain Guy * <pre> 2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * [ a, b, c, d, e, 2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * f, g, h, i, j, 2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * k, l, m, n, o, 29db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * p, q, r, s, t ]</pre> 30db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 31db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * <p> 32db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * When applied to a color <code>[R, G, B, A]</code>, the resulting color 33db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * is computed as: 34db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * </p> 35db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 36db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * <pre> 37db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * R’ = a*R + b*G + c*B + d*A + e; 38db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * G’ = f*R + g*G + h*B + i*A + j; 39db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * B’ = k*R + l*G + m*B + n*A + o; 40db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * A’ = p*R + q*G + r*B + s*A + t;</pre> 41db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 42db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * <p> 43db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * That resulting color <code>[R’, G’, B’, A’]</code> 44db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * then has each channel clamped to the <code>0</code> to <code>255</code> 45db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * range. 46db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * </p> 47db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 48db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * <p> 49db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * The sample ColorMatrix below inverts incoming colors by scaling each 50db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * channel by <code>-1</code>, and then shifting the result up by 51db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * <code>255</code> to remain in the standard color space. 52db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * </p> 5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 5413656743cc21bac43676568314366497346713eeRomain Guy * <pre> 55db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * [ -1, 0, 0, 0, 255, 56db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 0, -1, 0, 0, 255, 57db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 0, 0, -1, 0, 255, 58db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 0, 0, 0, 1, 0 ]</pre> 5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 6013656743cc21bac43676568314366497346713eeRomain Guy@SuppressWarnings({ "MismatchedReadAndWriteOfArray", "PointlessArithmeticExpression" }) 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic class ColorMatrix { 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private final float[] mArray = new float[20]; 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Create a new colormatrix initialized to identity (as if reset() had 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * been called). 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public ColorMatrix() { 6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 73db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * Create a new colormatrix initialized with the specified array of values. 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public ColorMatrix(float[] src) { 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(src, 0, mArray, 0, 20); 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 78db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Create a new colormatrix initialized with the specified colormatrix. 8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public ColorMatrix(ColorMatrix src) { 8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(src.mArray, 0, mArray, 0, 20); 8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 85db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the array of floats representing this colormatrix. 8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final float[] getArray() { return mArray; } 90db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set this colormatrix to identity: 9313656743cc21bac43676568314366497346713eeRomain Guy * <pre> 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * [ 1 0 0 0 0 - red vector 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 1 0 0 0 - green vector 9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 0 1 0 0 - blue vector 9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 0 0 1 0 ] - alpha vector 9813656743cc21bac43676568314366497346713eeRomain Guy * </pre> 9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void reset() { 10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float[] a = mArray; 10213656743cc21bac43676568314366497346713eeRomain Guy Arrays.fill(a, 0); 10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[0] = a[6] = a[12] = a[18] = 1; 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 105db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Assign the src colormatrix into this matrix, copying all of its values. 10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void set(ColorMatrix src) { 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(src.mArray, 0, mArray, 0, 20); 11154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 11254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 11454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Assign the array of floats into this matrix, copying all of its values. 11554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 11654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void set(float[] src) { 11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(src, 0, mArray, 0, 20); 11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 119db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 12054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 12154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set this colormatrix to scale by the specified values. 12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 12354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setScale(float rScale, float gScale, float bScale, 12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float aScale) { 12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float[] a = mArray; 12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i = 19; i > 0; --i) { 12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[i] = 0; 12954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[0] = rScale; 13154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[6] = gScale; 13254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[12] = bScale; 13354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[18] = aScale; 13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 135db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 13683387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet /** 13783387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet * Set the rotation on a color axis by the specified values. 138db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * <p> 13913656743cc21bac43676568314366497346713eeRomain Guy * <code>axis=0</code> correspond to a rotation around the RED color 14013656743cc21bac43676568314366497346713eeRomain Guy * <code>axis=1</code> correspond to a rotation around the GREEN color 14113656743cc21bac43676568314366497346713eeRomain Guy * <code>axis=2</code> correspond to a rotation around the BLUE color 142db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * </p> 14383387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet */ 14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setRotate(int axis, float degrees) { 14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 14633253a4baa6279f81a73425b49dfb6abe5f5416eNeil Fuller double radians = degrees * Math.PI / 180d; 14733253a4baa6279f81a73425b49dfb6abe5f5416eNeil Fuller float cosine = (float) Math.cos(radians); 14833253a4baa6279f81a73425b49dfb6abe5f5416eNeil Fuller float sine = (float) Math.sin(radians); 14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project switch (axis) { 15083387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet // Rotation around the red color 15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 0: 15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[6] = mArray[12] = cosine; 15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[7] = sine; 15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[11] = -sine; 15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 15683387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet // Rotation around the green color 15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1: 15883387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet mArray[0] = mArray[12] = cosine; 15983387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet mArray[2] = -sine; 16083387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet mArray[10] = sine; 16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 16283387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet // Rotation around the blue color 16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 2: 16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[0] = mArray[6] = cosine; 16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[1] = sine; 16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[5] = -sine; 16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project default: 16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project throw new RuntimeException(); 17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 17213656743cc21bac43676568314366497346713eeRomain Guy 17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set this colormatrix to the concatenation of the two specified 17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * colormatrices, such that the resulting colormatrix has the same effect 176db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * as applying matB and then applying matA. 177db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * <p> 178db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * It is legal for either matA or matB to be the same colormatrix as this. 179db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * </p> 18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setConcat(ColorMatrix matA, ColorMatrix matB) { 18213656743cc21bac43676568314366497346713eeRomain Guy float[] tmp; 18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (matA == this || matB == this) { 18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tmp = new float[20]; 18513656743cc21bac43676568314366497346713eeRomain Guy } else { 18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tmp = mArray; 18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 188db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 18954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float[] a = matA.mArray; 19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float[] b = matB.mArray; 19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int index = 0; 19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int j = 0; j < 20; j += 5) { 19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i = 0; i < 4; i++) { 19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tmp[index++] = a[j + 0] * b[i + 0] + a[j + 1] * b[i + 5] + 19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[j + 2] * b[i + 10] + a[j + 3] * b[i + 15]; 19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tmp[index++] = a[j + 0] * b[4] + a[j + 1] * b[9] + 19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[j + 2] * b[14] + a[j + 3] * b[19] + 19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[j + 4]; 20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 201db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (tmp != mArray) { 20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(tmp, 0, mArray, 0, 20); 20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 20613656743cc21bac43676568314366497346713eeRomain Guy 20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 208db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * Concat this colormatrix with the specified prematrix. 209db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * <p> 210db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * This is logically the same as calling setConcat(this, prematrix); 211db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * </p> 21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void preConcat(ColorMatrix prematrix) { 21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setConcat(this, prematrix); 21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 21613656743cc21bac43676568314366497346713eeRomain Guy 21754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 218db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * Concat this colormatrix with the specified postmatrix. 219db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * <p> 220db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * This is logically the same as calling setConcat(postmatrix, this); 221db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * </p> 22254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 22354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void postConcat(ColorMatrix postmatrix) { 22454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setConcat(postmatrix, this); 22554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 22613656743cc21bac43676568314366497346713eeRomain Guy 22754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /////////////////////////////////////////////////////////////////////////// 228db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 22954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 230db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * Set the matrix to affect the saturation of colors. 231db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * 232db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik * @param sat A value of 0 maps the color to gray-scale. 1 is identity. 23354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 23454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setSaturation(float sat) { 23554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 23654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float[] m = mArray; 237db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 23854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float invSat = 1 - sat; 23954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float R = 0.213f * invSat; 24054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float G = 0.715f * invSat; 24154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float B = 0.072f * invSat; 24254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 24354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[0] = R + sat; m[1] = G; m[2] = B; 24454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[5] = R; m[6] = G + sat; m[7] = B; 24554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[10] = R; m[11] = G; m[12] = B + sat; 24654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 247db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 24854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 24954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set the matrix to convert RGB to YUV 25054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 25154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setRGB2YUV() { 25254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 25354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float[] m = mArray; 25454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // these coefficients match those in libjpeg 25554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[0] = 0.299f; m[1] = 0.587f; m[2] = 0.114f; 25654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[5] = -0.16874f; m[6] = -0.33126f; m[7] = 0.5f; 25754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[10] = 0.5f; m[11] = -0.41869f; m[12] = -0.08131f; 25854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 259db7cc60eb29c215e65081211dfe65ba4d017691cChris Craik 26054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 26154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set the matrix to convert from YUV to RGB 26254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 26354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setYUV2RGB() { 26454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 26554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float[] m = mArray; 26654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // these coefficients match those in libjpeg 26754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[2] = 1.402f; 26854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[5] = 1; m[6] = -0.34414f; m[7] = -0.71414f; 26954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[10] = 1; m[11] = 1.772f; m[12] = 0; 27054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 27154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 272