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 17 package android.renderscript; 18 19 /** 20 * Intrinsic for applying a 3x3 convolve to an allocation. 21 * 22 **/ 23 public final class ScriptIntrinsicConvolve3x3 extends ScriptIntrinsic { 24 private final float[] mValues = new float[9]; 25 private Allocation mInput; 26 ScriptIntrinsicConvolve3x3(long id, RenderScript rs)27 private ScriptIntrinsicConvolve3x3(long id, RenderScript rs) { 28 super(id, rs); 29 } 30 31 /** 32 * Supported elements types are {@link Element#U8}, {@link 33 * Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4}, 34 * {@link Element#F32}, {@link Element#F32_2}, {@link 35 * Element#F32_3}, and {@link Element#F32_4} 36 * 37 * The default coefficients are. 38 * 39 * <code> 40 * <p> [ 0, 0, 0 ] 41 * <p> [ 0, 1, 0 ] 42 * <p> [ 0, 0, 0 ] 43 * </code> 44 * 45 * @param rs The RenderScript context 46 * @param e Element type for intputs and outputs 47 * 48 * @return ScriptIntrinsicConvolve3x3 49 */ create(RenderScript rs, Element e)50 public static ScriptIntrinsicConvolve3x3 create(RenderScript rs, Element e) { 51 float f[] = { 0, 0, 0, 0, 1, 0, 0, 0, 0}; 52 if (!e.isCompatible(Element.U8(rs)) && 53 !e.isCompatible(Element.U8_2(rs)) && 54 !e.isCompatible(Element.U8_3(rs)) && 55 !e.isCompatible(Element.U8_4(rs)) && 56 !e.isCompatible(Element.F32(rs)) && 57 !e.isCompatible(Element.F32_2(rs)) && 58 !e.isCompatible(Element.F32_3(rs)) && 59 !e.isCompatible(Element.F32_4(rs))) { 60 throw new RSIllegalArgumentException("Unsuported element type."); 61 } 62 long id = rs.nScriptIntrinsicCreate(1, e.getID(rs)); 63 ScriptIntrinsicConvolve3x3 si = new ScriptIntrinsicConvolve3x3(id, rs); 64 si.setCoefficients(f); 65 return si; 66 67 } 68 69 /** 70 * Set the input of the blur. 71 * Must match the element type supplied during create. 72 * 73 * @param ain The input allocation. 74 */ setInput(Allocation ain)75 public void setInput(Allocation ain) { 76 mInput = ain; 77 setVar(1, ain); 78 } 79 80 /** 81 * Set the coefficients for the convolve. 82 * 83 * The convolve layout is 84 * <code> 85 * <p> [ 0, 1, 2 ] 86 * <p> [ 3, 4, 5 ] 87 * <p> [ 6, 7, 8 ] 88 * </code> 89 * 90 * @param v The array of coefficients to set 91 */ setCoefficients(float v[])92 public void setCoefficients(float v[]) { 93 FieldPacker fp = new FieldPacker(9*4); 94 for (int ct=0; ct < mValues.length; ct++) { 95 mValues[ct] = v[ct]; 96 fp.addF32(mValues[ct]); 97 } 98 setVar(0, fp); 99 } 100 101 /** 102 * Apply the filter to the input and save to the specified 103 * allocation. 104 * 105 * @param aout Output allocation. Must match creation element 106 * type. 107 */ forEach(Allocation aout)108 public void forEach(Allocation aout) { 109 forEach(0, (Allocation) null, aout, null); 110 } 111 112 /** 113 * Apply the filter to the input and save to the specified 114 * allocation. 115 * 116 * @param aout Output allocation. Must match creation element 117 * type. 118 * @param opt LaunchOptions for clipping 119 */ forEach(Allocation aout, Script.LaunchOptions opt)120 public void forEach(Allocation aout, Script.LaunchOptions opt) { 121 forEach(0, (Allocation) null, aout, null, opt); 122 } 123 124 /** 125 * Get a KernelID for this intrinsic kernel. 126 * 127 * @return Script.KernelID The KernelID object. 128 */ getKernelID()129 public Script.KernelID getKernelID() { 130 return createKernelID(0, 2, null, null); 131 } 132 133 /** 134 * Get a FieldID for the input field of this intrinsic. 135 * 136 * @return Script.FieldID The FieldID object. 137 */ getFieldID_Input()138 public Script.FieldID getFieldID_Input() { 139 return createFieldID(1, null); 140 } 141 142 } 143