15729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams/* 25729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * Copyright (C) 2012 The Android Open Source Project 35729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * 45729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 55729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * you may not use this file except in compliance with the License. 65729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * You may obtain a copy of the License at 75729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * 85729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * http://www.apache.org/licenses/LICENSE-2.0 95729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * 105729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * Unless required by applicable law or agreed to in writing, software 115729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 125729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 135729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * See the License for the specific language governing permissions and 145729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * limitations under the License. 155729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams */ 165729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 175729fcdf950eb909b0ab90a49af58731ed8f92cdJason Samspackage android.renderscript; 185729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 195729fcdf950eb909b0ab90a49af58731ed8f92cdJason Samsimport android.content.Context; 205729fcdf950eb909b0ab90a49af58731ed8f92cdJason Samsimport android.content.res.Resources; 215729fcdf950eb909b0ab90a49af58731ed8f92cdJason Samsimport android.util.Log; 225729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 235729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams/** 2480d819033d4687507907f787d47379b7b37eae19Jason Sams * Intrinsic for applying a color matrix to allocations. 2580d819033d4687507907f787d47379b7b37eae19Jason Sams * 2680d819033d4687507907f787d47379b7b37eae19Jason Sams * This has the same effect as loading each element and 2780d819033d4687507907f787d47379b7b37eae19Jason Sams * converting it to a {@link Element#F32_4}, multiplying the 2880d819033d4687507907f787d47379b7b37eae19Jason Sams * result by the 4x4 color matrix as performed by 2980d819033d4687507907f787d47379b7b37eae19Jason Sams * rsMatrixMultiply() and writing it to the output after 3080d819033d4687507907f787d47379b7b37eae19Jason Sams * conversion back to {@link Element#U8_4}. 315729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams **/ 3280d819033d4687507907f787d47379b7b37eae19Jason Samspublic final class ScriptIntrinsicColorMatrix extends ScriptIntrinsic { 3380d819033d4687507907f787d47379b7b37eae19Jason Sams private final Matrix4f mMatrix = new Matrix4f(); 345729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams private Allocation mInput; 355729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 3680d819033d4687507907f787d47379b7b37eae19Jason Sams private ScriptIntrinsicColorMatrix(int id, RenderScript rs) { 375729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams super(id, rs); 385729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams } 395729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 405729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams /** 4180d819033d4687507907f787d47379b7b37eae19Jason Sams * Create an intrinsic for applying a color matrix to an 4280d819033d4687507907f787d47379b7b37eae19Jason Sams * allocation. 435729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * 4480d819033d4687507907f787d47379b7b37eae19Jason Sams * Supported elements types are {@link Element#U8_4} 4580d819033d4687507907f787d47379b7b37eae19Jason Sams * 4680d819033d4687507907f787d47379b7b37eae19Jason Sams * @param rs The Renderscript context 4780d819033d4687507907f787d47379b7b37eae19Jason Sams * @param e Element type for intputs and outputs 485729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * 495729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams * @return ScriptIntrinsicColorMatrix 505729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams */ 515729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams public static ScriptIntrinsicColorMatrix create(RenderScript rs, Element e) { 5280d819033d4687507907f787d47379b7b37eae19Jason Sams if (e != Element.U8_4(rs)) { 5380d819033d4687507907f787d47379b7b37eae19Jason Sams throw new RSIllegalArgumentException("Unsuported element type."); 5480d819033d4687507907f787d47379b7b37eae19Jason Sams } 555729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams int id = rs.nScriptIntrinsicCreate(2, e.getID(rs)); 565729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams return new ScriptIntrinsicColorMatrix(id, rs); 575729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 585729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams } 595729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 608fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams private void setMatrix() { 615729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams FieldPacker fp = new FieldPacker(16*4); 628fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams fp.addMatrix(mMatrix); 635729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams setVar(0, fp); 645729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams } 655729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 668fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams /** 6780d819033d4687507907f787d47379b7b37eae19Jason Sams * Set the color matrix which will be applied to each cell of 6880d819033d4687507907f787d47379b7b37eae19Jason Sams * the image. 698fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * 708fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * @param m The 4x4 matrix to set. 718fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams */ 728fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams public void setColorMatrix(Matrix4f m) { 738fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.load(m); 748fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams setMatrix(); 758fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 768fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams 778fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams /** 788fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * Set the color matrix which will be applied to each cell of the image. 798fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * This will set the alpha channel to be a copy. 808fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * 818fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * @param m The 3x3 matrix to set. 828fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams */ 838fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams public void setColorMatrix(Matrix3f m) { 848fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.load(m); 858fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams setMatrix(); 868fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 878fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams 888fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams /** 8917fec32bba9da8df2062b52e414435574652ad50Jason Sams * Set a color matrix to convert from RGB to luminance. The alpha channel 908fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * will be a copy. 918fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * 928fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams */ 938fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams public void setGreyscale() { 948fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.loadIdentity(); 958fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(0, 0, 0.299f); 968fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(1, 0, 0.587f); 978fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(2, 0, 0.114f); 988fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(0, 1, 0.299f); 998fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(1, 1, 0.587f); 1008fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(2, 1, 0.114f); 1018fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(0, 2, 0.299f); 1028fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(1, 2, 0.587f); 1038fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(2, 2, 0.114f); 1048fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams setMatrix(); 1058fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1068fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams 1078fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams /** 1088fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * Set the matrix to convert from YUV to RGB with a direct copy of the 4th 1098fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * channel. 1108fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * 1118fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams */ 1128fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams public void setYUVtoRGB() { 1138fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.loadIdentity(); 1148fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(0, 0, 1.f); 1158fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(1, 0, 0.f); 1168fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(2, 0, 1.13983f); 1178fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(0, 1, 1.f); 1188fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(1, 1, -0.39465f); 1198fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(2, 1, -0.5806f); 1208fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(0, 2, 1.f); 1218fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(1, 2, 2.03211f); 1228fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(2, 2, 0.f); 1238fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams setMatrix(); 1248fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1258fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams 1268fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams /** 1278fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * Set the matrix to convert from RGB to YUV with a direct copy of the 4th 1288fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * channel. 1298fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * 1308fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams */ 1318fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams public void setRGBtoYUV() { 1328fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.loadIdentity(); 1338fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(0, 0, 0.299f); 1348fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(1, 0, 0.587f); 1358fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(2, 0, 0.114f); 1368fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(0, 1, -0.14713f); 1378fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(1, 1, -0.28886f); 1388fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(2, 1, 0.436f); 1398fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(0, 2, 0.615f); 1408fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(1, 2, -0.51499f); 1418fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams mMatrix.set(2, 2, -0.10001f); 1428fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams setMatrix(); 1438fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams } 1448fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams 1458fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams 1468fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams /** 1478fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * Invoke the kernel and apply the matrix to each cell of ain and copy to 1488fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * aout. 1498fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * 1508fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * @param ain Input allocation 1518fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams * @param aout Output allocation 1528fd5853c1c07c2fd3954b3c5e64702d70af31144Jason Sams */ 1535729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams public void forEach(Allocation ain, Allocation aout) { 1545729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams forEach(0, ain, aout, null); 1555729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams } 1565729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 15708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams /** 15808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * Get a KernelID for this intrinsic kernel. 15908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * 16008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * @return Script.KernelID The KernelID object. 16108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams */ 16208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams public Script.KernelID getKernelID() { 16308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams return createKernelID(0, 3, null, null); 16408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams } 16508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams 1665729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams} 1675729fcdf950eb909b0ab90a49af58731ed8f92cdJason Sams 168