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