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