1ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams/* 2ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Copyright (C) 2012 The Android Open Source Project 3ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 4ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 5ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * you may not use this file except in compliance with the License. 6ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * You may obtain a copy of the License at 7ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 8ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * http://www.apache.org/licenses/LICENSE-2.0 9ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 10ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Unless required by applicable law or agreed to in writing, software 11ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 12ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * See the License for the specific language governing permissions and 14ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * limitations under the License. 15ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 16ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 17ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samspackage android.support.v8.renderscript; 18ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 19ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsimport android.util.Log; 20ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 21ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams/** 22ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Intrinsic for applying a color matrix to allocations. 23ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 24ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * This has the same effect as loading each element and 25ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * converting it to a {@link Element#F32_4}, multiplying the 26ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * result by the 4x4 color matrix as performed by 27ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * rsMatrixMultiply() and writing it to the output after 28ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * conversion back to {@link Element#U8_4}. 29ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams **/ 30ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murraypublic class ScriptIntrinsicColorMatrix extends ScriptIntrinsic { 31ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private final Matrix4f mMatrix = new Matrix4f(); 32ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private Allocation mInput; 33ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 34ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray protected ScriptIntrinsicColorMatrix(int id, RenderScript rs) { 35ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams super(id, rs); 36ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 37ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 38ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 39ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Create an intrinsic for applying a color matrix to an 40ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * allocation. 41ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 42ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Supported elements types are {@link Element#U8_4} 43ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 447d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * @param rs The RenderScript context 45ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param e Element type for intputs and outputs 46ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 47ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @return ScriptIntrinsicColorMatrix 48ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 49ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public static ScriptIntrinsicColorMatrix create(RenderScript rs, Element e) { 50ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (rs.isNative) { 51ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray RenderScriptThunker rst = (RenderScriptThunker) rs; 52ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray return ScriptIntrinsicColorMatrixThunker.create(rs, e); 53ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray } 54ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray 55ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray if (!e.isCompatible(Element.U8_4(rs))) { 56ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSIllegalArgumentException("Unsuported element type."); 57ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 58ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams int id = rs.nScriptIntrinsicCreate(2, e.getID(rs)); 59ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams return new ScriptIntrinsicColorMatrix(id, rs); 60ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 61ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 62ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 63ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private void setMatrix() { 64ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams FieldPacker fp = new FieldPacker(16*4); 65ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams fp.addMatrix(mMatrix); 66ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams setVar(0, fp); 67ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 68ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 69ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 70ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set the color matrix which will be applied to each cell of 71ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * the image. 72ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 73ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param m The 4x4 matrix to set. 74ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 75ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setColorMatrix(Matrix4f m) { 76ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.load(m); 77ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams setMatrix(); 78ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 79ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 80ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 81ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set the color matrix which will be applied to each cell of the image. 82ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * This will set the alpha channel to be a copy. 83ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 84ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param m The 3x3 matrix to set. 85ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 86ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setColorMatrix(Matrix3f m) { 87ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.load(m); 88ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams setMatrix(); 89ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 90ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 91ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 92ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set a color matrix to convert from RGB to luminance. The alpha channel 93ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * will be a copy. 94ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 95ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 96ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setGreyscale() { 97ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.loadIdentity(); 98ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(0, 0, 0.299f); 99ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(1, 0, 0.587f); 100ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(2, 0, 0.114f); 101ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(0, 1, 0.299f); 102ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(1, 1, 0.587f); 103ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(2, 1, 0.114f); 104ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(0, 2, 0.299f); 105ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(1, 2, 0.587f); 106ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(2, 2, 0.114f); 107ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams setMatrix(); 108ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 109ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 110ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 111ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set the matrix to convert from YUV to RGB with a direct copy of the 4th 112ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * channel. 113ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 114ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 115ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setYUVtoRGB() { 116ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.loadIdentity(); 117ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(0, 0, 1.f); 118ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(1, 0, 0.f); 119ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(2, 0, 1.13983f); 120ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(0, 1, 1.f); 121ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(1, 1, -0.39465f); 122ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(2, 1, -0.5806f); 123ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(0, 2, 1.f); 124ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(1, 2, 2.03211f); 125ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(2, 2, 0.f); 126ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams setMatrix(); 127ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 128ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 129ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 130ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set the matrix to convert from RGB to YUV with a direct copy of the 4th 131ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * channel. 132ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 133ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 134ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setRGBtoYUV() { 135ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.loadIdentity(); 136ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(0, 0, 0.299f); 137ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(1, 0, 0.587f); 138ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(2, 0, 0.114f); 139ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(0, 1, -0.14713f); 140ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(1, 1, -0.28886f); 141ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(2, 1, 0.436f); 142ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(0, 2, 0.615f); 143ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(1, 2, -0.51499f); 144ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mMatrix.set(2, 2, -0.10001f); 145ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams setMatrix(); 146ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 147ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 148ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 149ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 150ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Invoke the kernel and apply the matrix to each cell of ain and copy to 151ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * aout. 152ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 153ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param ain Input allocation 154ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param aout Output allocation 155ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 156ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void forEach(Allocation ain, Allocation aout) { 157ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams forEach(0, ain, aout, null); 158ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 159ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 160ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 161ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Get a KernelID for this intrinsic kernel. 162ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 163ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @return Script.KernelID The KernelID object. 164ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 165ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public Script.KernelID getKernelID() { 166ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams return createKernelID(0, 3, null, null); 167ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 168ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 169ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams} 170ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 171