13a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams/* 23a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * Copyright (C) 2012 The Android Open Source Project 33a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 43a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 53a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * you may not use this file except in compliance with the License. 63a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * You may obtain a copy of the License at 73a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 83a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 93a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 103a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * Unless required by applicable law or agreed to in writing, software 113a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 123a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 133a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * See the License for the specific language governing permissions and 143a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * limitations under the License. 153a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams */ 163a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 173a5b8011765906c15b5474b2bc43d80f6746cb45Jason Samspackage android.renderscript; 183a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 193a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams/** 2080d819033d4687507907f787d47379b7b37eae19Jason Sams * Intrinsic for applying a 5x5 convolve to an allocation. 2180d819033d4687507907f787d47379b7b37eae19Jason Sams * 223a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams **/ 2380d819033d4687507907f787d47379b7b37eae19Jason Samspublic final class ScriptIntrinsicConvolve5x5 extends ScriptIntrinsic { 2480d819033d4687507907f787d47379b7b37eae19Jason Sams private final float[] mValues = new float[25]; 253a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams private Allocation mInput; 263a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 27460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray private ScriptIntrinsicConvolve5x5(long id, RenderScript rs) { 283a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams super(id, rs); 293a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 303a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 313a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams /** 32d93fdb77d84aa3f2c427034cf17e72941f3c3418Jason Sams * Supported elements types are {@link Element#U8}, {@link 33d93fdb77d84aa3f2c427034cf17e72941f3c3418Jason Sams * Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4}, 34d93fdb77d84aa3f2c427034cf17e72941f3c3418Jason Sams * {@link Element#F32}, {@link Element#F32_2}, {@link 35e58ed9b16d67a1c80888ffa6f6ed62d54ed12caeMiao Wang * Element#F32_3}, and {@link Element#F32_4}. 363a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 37e58ed9b16d67a1c80888ffa6f6ed62d54ed12caeMiao Wang * <p> The default coefficients are: 3880d819033d4687507907f787d47379b7b37eae19Jason Sams * <code> 3980d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 0, 0, 0, 0, 0 ] 4080d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 0, 0, 0, 0, 0 ] 4180d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 0, 0, 1, 0, 0 ] 4280d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 0, 0, 0, 0, 0 ] 4380d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 0, 0, 0, 0, 0 ] 4480d819033d4687507907f787d47379b7b37eae19Jason Sams * </code> 453a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 46c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * @param rs The RenderScript context 4780d819033d4687507907f787d47379b7b37eae19Jason Sams * @param e Element type for intputs and outputs 483a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * 493a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams * @return ScriptIntrinsicConvolve5x5 503a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams */ 513a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public static ScriptIntrinsicConvolve5x5 create(RenderScript rs, Element e) { 52048c978ae599ecc9e00d68040ae9fd8a9d46df64Jason Sams if (!e.isCompatible(Element.U8(rs)) && 53d93fdb77d84aa3f2c427034cf17e72941f3c3418Jason Sams !e.isCompatible(Element.U8_2(rs)) && 54d93fdb77d84aa3f2c427034cf17e72941f3c3418Jason Sams !e.isCompatible(Element.U8_3(rs)) && 55048c978ae599ecc9e00d68040ae9fd8a9d46df64Jason Sams !e.isCompatible(Element.U8_4(rs)) && 56048c978ae599ecc9e00d68040ae9fd8a9d46df64Jason Sams !e.isCompatible(Element.F32(rs)) && 57d93fdb77d84aa3f2c427034cf17e72941f3c3418Jason Sams !e.isCompatible(Element.F32_2(rs)) && 58d93fdb77d84aa3f2c427034cf17e72941f3c3418Jason Sams !e.isCompatible(Element.F32_3(rs)) && 59048c978ae599ecc9e00d68040ae9fd8a9d46df64Jason Sams !e.isCompatible(Element.F32_4(rs))) { 60ad57e330ba757139a61506861a41b8b5f71e3792Stephen Hines throw new RSIllegalArgumentException("Unsupported element type."); 61048c978ae599ecc9e00d68040ae9fd8a9d46df64Jason Sams } 62048c978ae599ecc9e00d68040ae9fd8a9d46df64Jason Sams 63460a04971c494fec39ffcb38e873bb8fdd82d113Tim Murray long id = rs.nScriptIntrinsicCreate(4, e.getID(rs)); 643a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams return new ScriptIntrinsicConvolve5x5(id, rs); 653a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 663a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 673a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 6880d819033d4687507907f787d47379b7b37eae19Jason Sams /** 69e58ed9b16d67a1c80888ffa6f6ed62d54ed12caeMiao Wang * Set the input of the 5x5 convolve. 7080d819033d4687507907f787d47379b7b37eae19Jason Sams * Must match the element type supplied during create. 7180d819033d4687507907f787d47379b7b37eae19Jason Sams * 7280d819033d4687507907f787d47379b7b37eae19Jason Sams * @param ain The input allocation. 7380d819033d4687507907f787d47379b7b37eae19Jason Sams */ 743a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setInput(Allocation ain) { 753a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mInput = ain; 76e6a7886674c167b4e17f6dc72d41d5b9c604cdd1Jason Sams setVar(1, ain); 773a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 783a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 7980d819033d4687507907f787d47379b7b37eae19Jason Sams /** 8080d819033d4687507907f787d47379b7b37eae19Jason Sams * Set the coefficients for the convolve. 8180d819033d4687507907f787d47379b7b37eae19Jason Sams * 82e58ed9b16d67a1c80888ffa6f6ed62d54ed12caeMiao Wang * <p> The convolve layout is: 8380d819033d4687507907f787d47379b7b37eae19Jason Sams * <code> 8480d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 0, 1, 2, 3, 4 ] 8580d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 5, 6, 7, 8, 9 ] 8680d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 10, 11, 12, 13, 14 ] 8780d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 15, 16, 17, 18, 19 ] 8880d819033d4687507907f787d47379b7b37eae19Jason Sams * <p> [ 20, 21, 22, 23, 24 ] 8980d819033d4687507907f787d47379b7b37eae19Jason Sams * </code> 9080d819033d4687507907f787d47379b7b37eae19Jason Sams * 9180d819033d4687507907f787d47379b7b37eae19Jason Sams * @param v The array of coefficients to set 9280d819033d4687507907f787d47379b7b37eae19Jason Sams */ 933a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void setCoefficients(float v[]) { 943a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams FieldPacker fp = new FieldPacker(25*4); 953a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams for (int ct=0; ct < mValues.length; ct++) { 963a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams mValues[ct] = v[ct]; 973a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams fp.addF32(mValues[ct]); 983a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 993a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams setVar(0, fp); 1003a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1013a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 10280d819033d4687507907f787d47379b7b37eae19Jason Sams /** 10380d819033d4687507907f787d47379b7b37eae19Jason Sams * Apply the filter to the input and save to the specified 10480d819033d4687507907f787d47379b7b37eae19Jason Sams * allocation. 10580d819033d4687507907f787d47379b7b37eae19Jason Sams * 10680d819033d4687507907f787d47379b7b37eae19Jason Sams * @param aout Output allocation. Must match creation element 10780d819033d4687507907f787d47379b7b37eae19Jason Sams * type. 10880d819033d4687507907f787d47379b7b37eae19Jason Sams */ 1093a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams public void forEach(Allocation aout) { 110949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes forEach(0, (Allocation) null, aout, null); 1113a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams } 1123a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams 11308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams /** 1146f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * Apply the filter to the input and save to the specified 1156f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * allocation. 1166f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * 1176f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * @param aout Output allocation. Must match creation element 1186f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * type. 1196f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray * @param opt LaunchOptions for clipping 1206f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray */ 1216f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray public void forEach(Allocation aout, Script.LaunchOptions opt) { 12248ba506dfa591d0bcd79a088457eb95a9bd4c575Stephen Hines forEach(0, (Allocation) null, aout, null, opt); 1236f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray } 1246f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray 1256f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray 1266f842ac8aa37dd855fbffdc09f5491bd85ab3c9aTim Murray /** 12708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * Get a KernelID for this intrinsic kernel. 12808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * 12908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * @return Script.KernelID The KernelID object. 13008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams */ 13108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams public Script.KernelID getKernelID() { 13208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams return createKernelID(0, 2, null, null); 13308a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams } 13408a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams 13508a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams /** 13608a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * Get a FieldID for the input field of this intrinsic. 13708a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * 13808a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams * @return Script.FieldID The FieldID object. 13908a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams */ 14008a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams public Script.FieldID getFieldID_Input() { 14108a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams return createFieldID(1, null); 14208a81583c18a849e442ceeb8d7baeca743fb3be8Jason Sams } 1433a5b8011765906c15b5474b2bc43d80f6746cb45Jason Sams} 144