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