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.content.Context; 20ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsimport android.content.res.Resources; 21ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Samsimport android.util.Log; 22ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 23ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams/** 24ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Intrinsic Gausian blur filter. Applies a gaussian blur of the 25ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * specified radius to all elements of an allocation. 26ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 27ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 28ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams **/ 29ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murraypublic class ScriptIntrinsicBlur extends ScriptIntrinsic { 30ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private final float[] mValues = new float[9]; 31ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams private Allocation mInput; 32059fede7f200350b6131fc131f76248085485722Miao Wang // API level for the intrinsic 33059fede7f200350b6131fc131f76248085485722Miao Wang private static final int INTRINSIC_API_LEVEL = 19; 34ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 353d9b60c9ae71c4c09df0b4e59c825a5d631e1254Miao Wang protected ScriptIntrinsicBlur(long id, RenderScript rs) { 36ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams super(id, rs); 37ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 38ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 39ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 40ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Create an intrinsic for applying a blur to an allocation. The 41ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * default radius is 5.0. 42ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 43b139bfeb57c3bb2b2042da201e5314c3f6fcd13fMiao Wang * Supported elements types are {@link Element#U8}, 44b139bfeb57c3bb2b2042da201e5314c3f6fcd13fMiao Wang * {@link Element#U8_4}. 45ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 467d435ae5ba100be5710b685653cc351cab159c11Stephen Hines * @param rs The RenderScript context 47ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param e Element type for inputs and outputs 48ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 49ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @return ScriptIntrinsicBlur 50ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 51ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public static ScriptIntrinsicBlur create(RenderScript rs, Element e) { 527d435ae5ba100be5710b685653cc351cab159c11Stephen Hines if ((!e.isCompatible(Element.U8_4(rs))) && (!e.isCompatible(Element.U8(rs)))) { 53ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSIllegalArgumentException("Unsuported element type."); 54ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 55059fede7f200350b6131fc131f76248085485722Miao Wang long id; 56059fede7f200350b6131fc131f76248085485722Miao Wang boolean mUseIncSupp = rs.isUseNative() && 57059fede7f200350b6131fc131f76248085485722Miao Wang android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL; 58059fede7f200350b6131fc131f76248085485722Miao Wang 59059fede7f200350b6131fc131f76248085485722Miao Wang id = rs.nScriptIntrinsicCreate(5, e.getID(rs), mUseIncSupp); 60059fede7f200350b6131fc131f76248085485722Miao Wang 61059fede7f200350b6131fc131f76248085485722Miao Wang ScriptIntrinsicBlur si = new ScriptIntrinsicBlur(id, rs); 62059fede7f200350b6131fc131f76248085485722Miao Wang si.setIncSupp(mUseIncSupp); 63059fede7f200350b6131fc131f76248085485722Miao Wang si.setRadius(5.f); 64059fede7f200350b6131fc131f76248085485722Miao Wang 65059fede7f200350b6131fc131f76248085485722Miao Wang return si; 66ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 67ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 68ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 69ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set the input of the blur. 70ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Must match the element type supplied during create. 71ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 72ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param ain The input allocation 73ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 74ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setInput(Allocation ain) { 75ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams mInput = ain; 761b370e358d16cc3b50b169511d6b387db09f972dJason Sams setVar(1, ain); 77ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 78ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams 79ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams /** 80ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Set the radius of the Blur. 81ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 82ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * Supported range 0 < radius <= 25 83ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * 84ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams * @param radius The radius of the blur 85ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams */ 86ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams public void setRadius(float radius) { 87ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams if (radius <= 0 || radius > 25) { 88ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams throw new RSIllegalArgumentException("Radius out of range (0 < r <= 25)."); 89ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams } 90ca29b8caf56fa4866752f9cea4ec02b2a271dceeJason Sams setVar(0, radius); 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) { 1013cf9bc14128f46345ba95294c30873ae52e89aecMiao Wang forEach(0, (Allocation) 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 123