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