ColorMatrix.java revision 33253a4baa6279f81a73425b49dfb6abe5f5416e
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 1954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project/** 20f2ef28d840647d2f16792313bdc22b2114a5df6aKatie McCormick * 4x5 matrix for transforming the color+alpha components of a Bitmap. 2154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * The matrix is stored in a single array, and its treated as follows: 2254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * [ a, b, c, d, e, 2354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * f, g, h, i, j, 2454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * k, l, m, n, o, 2554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * p, q, r, s, t ] 2654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 2754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * When applied to a color [r, g, b, a], the resulting color is computed as 2854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * (after clamping) 2954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * R' = a*R + b*G + c*B + d*A + e; 3054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * G' = f*R + g*G + h*B + i*A + j; 3154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * B' = k*R + l*G + m*B + n*A + o; 3254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * A' = p*R + q*G + r*B + s*A + t; 3354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 3454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Projectpublic class ColorMatrix { 3554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 3654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project private final float[] mArray = new float[20]; 3754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 3854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 3954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Create a new colormatrix initialized to identity (as if reset() had 4054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * been called). 4154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 4254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public ColorMatrix() { 4354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 4454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 4554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 4654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 4754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Create a new colormatrix initialized with the specified array of values. 4854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 4954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public ColorMatrix(float[] src) { 5054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(src, 0, mArray, 0, 20); 5154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 5254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 5354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 5454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Create a new colormatrix initialized with the specified colormatrix. 5554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 5654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public ColorMatrix(ColorMatrix src) { 5754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(src.mArray, 0, mArray, 0, 20); 5854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 5954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 6154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Return the array of floats representing this colormatrix. 6254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 6354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public final float[] getArray() { return mArray; } 6454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 6554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 6654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set this colormatrix to identity: 6754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * [ 1 0 0 0 0 - red vector 6854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 1 0 0 0 - green vector 6954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 0 1 0 0 - blue vector 7054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * 0 0 0 1 0 ] - alpha vector 7154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 7254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void reset() { 7354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float[] a = mArray; 7454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 7554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i = 19; i > 0; --i) { 7654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[i] = 0; 7754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 7854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[0] = a[6] = a[12] = a[18] = 1; 7954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 8054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 8254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Assign the src colormatrix into this matrix, copying all of its values. 8354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 8454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void set(ColorMatrix src) { 8554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(src.mArray, 0, mArray, 0, 20); 8654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 8754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 8854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 8954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Assign the array of floats into this matrix, copying all of its values. 9054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 9154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void set(float[] src) { 9254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(src, 0, mArray, 0, 20); 9354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 9454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 9554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 9654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set this colormatrix to scale by the specified values. 9754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 9854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setScale(float rScale, float gScale, float bScale, 9954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float aScale) { 10054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float[] a = mArray; 10154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 10254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i = 19; i > 0; --i) { 10354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[i] = 0; 10454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 10554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[0] = rScale; 10654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[6] = gScale; 10754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[12] = bScale; 10854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[18] = aScale; 10954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 11054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 11183387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet /** 11283387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet * Set the rotation on a color axis by the specified values. 11383387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet * axis=0 correspond to a rotation around the RED color 11483387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet * axis=1 correspond to a rotation around the GREEN color 11583387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet * axis=2 correspond to a rotation around the BLUE color 11683387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet */ 11754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setRotate(int axis, float degrees) { 11854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 11933253a4baa6279f81a73425b49dfb6abe5f5416eNeil Fuller double radians = degrees * Math.PI / 180d; 12033253a4baa6279f81a73425b49dfb6abe5f5416eNeil Fuller float cosine = (float) Math.cos(radians); 12133253a4baa6279f81a73425b49dfb6abe5f5416eNeil Fuller float sine = (float) Math.sin(radians); 12254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project switch (axis) { 12383387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet // Rotation around the red color 12454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 0: 12554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[6] = mArray[12] = cosine; 12654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[7] = sine; 12754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[11] = -sine; 12854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 12983387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet // Rotation around the green color 13054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 1: 13183387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet mArray[0] = mArray[12] = cosine; 13283387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet mArray[2] = -sine; 13383387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet mArray[10] = sine; 13454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 13583387a484c515e5234bd60f741578a6ac894bff5Olivier Goutet // Rotation around the blue color 13654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project case 2: 13754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[0] = mArray[6] = cosine; 13854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[1] = sine; 13954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project mArray[5] = -sine; 14054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project break; 14154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project default: 14254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project throw new RuntimeException(); 14354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 14454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 14554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 14654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 14754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set this colormatrix to the concatenation of the two specified 14854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * colormatrices, such that the resulting colormatrix has the same effect 14954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * as applying matB and then applying matA. It is legal for either matA or 15054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * matB to be the same colormatrix as this. 15154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 15254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setConcat(ColorMatrix matA, ColorMatrix matB) { 15354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float[] tmp = null; 15454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 15554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (matA == this || matB == this) { 15654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tmp = new float[20]; 15754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 15854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project else { 15954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tmp = mArray; 16054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 16154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 16254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float[] a = matA.mArray; 16354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float[] b = matB.mArray; 16454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project int index = 0; 16554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int j = 0; j < 20; j += 5) { 16654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project for (int i = 0; i < 4; i++) { 16754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tmp[index++] = a[j + 0] * b[i + 0] + a[j + 1] * b[i + 5] + 16854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[j + 2] * b[i + 10] + a[j + 3] * b[i + 15]; 16954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 17054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project tmp[index++] = a[j + 0] * b[4] + a[j + 1] * b[9] + 17154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[j + 2] * b[14] + a[j + 3] * b[19] + 17254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project a[j + 4]; 17354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 17454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 17554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project if (tmp != mArray) { 17654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project System.arraycopy(tmp, 0, mArray, 0, 20); 17754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 17854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 17954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 18154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Concat this colormatrix with the specified prematrix. This is logically 18254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the same as calling setConcat(this, prematrix); 18354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 18454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void preConcat(ColorMatrix prematrix) { 18554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setConcat(this, prematrix); 18654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 18754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 18854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 18954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Concat this colormatrix with the specified postmatrix. This is logically 19054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * the same as calling setConcat(postmatrix, this); 19154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 19254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void postConcat(ColorMatrix postmatrix) { 19354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project setConcat(postmatrix, this); 19454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 19554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /////////////////////////////////////////////////////////////////////////// 19754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 19854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 19954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set the matrix to affect the saturation of colors. A value of 0 maps the 20054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * color to gray-scale. 1 is identity. 20154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 20254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setSaturation(float sat) { 20354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 20454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float[] m = mArray; 20554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 20654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float invSat = 1 - sat; 20754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float R = 0.213f * invSat; 20854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float G = 0.715f * invSat; 20954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project final float B = 0.072f * invSat; 21054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 21154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[0] = R + sat; m[1] = G; m[2] = B; 21254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[5] = R; m[6] = G + sat; m[7] = B; 21354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[10] = R; m[11] = G; m[12] = B + sat; 21454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 21554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 21654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 21754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set the matrix to convert RGB to YUV 21854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 21954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setRGB2YUV() { 22054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 22154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float[] m = mArray; 22254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // these coefficients match those in libjpeg 22354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[0] = 0.299f; m[1] = 0.587f; m[2] = 0.114f; 22454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[5] = -0.16874f; m[6] = -0.33126f; m[7] = 0.5f; 22554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[10] = 0.5f; m[11] = -0.41869f; m[12] = -0.08131f; 22654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 22754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 22854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project /** 22954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project * Set the matrix to convert from YUV to RGB 23054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project */ 23154b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project public void setYUV2RGB() { 23254b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project reset(); 23354b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project float[] m = mArray; 23454b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project // these coefficients match those in libjpeg 23554b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[2] = 1.402f; 23654b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[5] = 1; m[6] = -0.34414f; m[7] = -0.71414f; 23754b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project m[10] = 1; m[11] = 1.772f; m[12] = 0; 23854b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project } 23954b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project} 24054b6cfa9a9e5b861a9930af873580d6dc20f773The Android Open Source Project 241