16f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang/* 26f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Copyright (C) 2015 The Android Open Source Project 36f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 46f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Licensed under the Apache License, Version 2.0 (the "License"); 56f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * you may not use this file except in compliance with the License. 66f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * You may obtain a copy of the License at 76f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 86f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * http://www.apache.org/licenses/LICENSE-2.0 96f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Unless required by applicable law or agreed to in writing, software 116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * distributed under the License is distributed on an "AS IS" BASIS, 126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * See the License for the specific language governing permissions and 146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * limitations under the License. 156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang */ 166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangpackage android.support.v8.renderscript; 186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangimport android.util.Log; 206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang/** 226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Intrinsic for performing a resize of a 2D allocation. 236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang */ 246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wangpublic class ScriptIntrinsicResize extends ScriptIntrinsic { 256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang private Allocation mInput; 266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang // API level for the intrinsic 276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang private static final int INTRINSIC_API_LEVEL = 21; 286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang protected ScriptIntrinsicResize(long id, RenderScript rs) { 306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang super(id, rs); 316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang /** 346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Supported elements types are {@link Element#U8}, {@link 356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4} 366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * {@link Element#F32}, {@link Element#F32_2}, {@link 376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Element#F32_3}, {@link Element#F32_4} 386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * @param rs The RenderScript context 406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * @return ScriptIntrinsicResize 426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang */ 436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang public static ScriptIntrinsicResize create(RenderScript rs) { 446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang long id; 456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang boolean mUseIncSupp = rs.isUseNative() && 466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL; 476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang id = rs.nScriptIntrinsicCreate(12, 0, mUseIncSupp); 496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang ScriptIntrinsicResize si = new ScriptIntrinsicResize(id, rs); 516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang si.setIncSupp(mUseIncSupp); 526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang return si; 536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang /** 576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Set the input of the resize. 586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Must match the element type supplied during create. 596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * @param ain The input allocation. 616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang */ 626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang public void setInput(Allocation ain) { 636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang Element e = ain.getElement(); 646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang if (!e.isCompatible(Element.U8(mRS)) && 656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang !e.isCompatible(Element.U8_2(mRS)) && 666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang !e.isCompatible(Element.U8_3(mRS)) && 676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang !e.isCompatible(Element.U8_4(mRS)) && 686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang !e.isCompatible(Element.F32(mRS)) && 696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang !e.isCompatible(Element.F32_2(mRS)) && 706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang !e.isCompatible(Element.F32_3(mRS)) && 716f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang !e.isCompatible(Element.F32_4(mRS))) { 724f44acb8ed103c292258bc1fbfb62efac0db5d9bStephen Hines throw new RSIllegalArgumentException("Unsupported element type."); 736f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 746f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 756f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang mInput = ain; 766f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang setVar(0, ain); 776f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 786f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang /** 806f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Get a FieldID for the input field of this intrinsic. 816f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * @return Script.FieldID The FieldID object. 836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang */ 846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang public Script.FieldID getFieldID_Input() { 856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang return createFieldID(0, null); 866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 886f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 896f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang /** 906f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Resize copy the input allocation to the output specified. The 916f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Allocation is rescaled if necessary using bi-cubic 926f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * interpolation. 936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 946f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * @param aout Output allocation. Element type must match 956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * current input. Must not be same as input. 966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang */ 976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang public void forEach_bicubic(Allocation aout) { 986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang if (aout == mInput) { 996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang throw new RSIllegalArgumentException("Output cannot be same as Input."); 1006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 1016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang forEach_bicubic(aout, null); 1026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 1036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 1046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang /** 1056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Resize copy the input allocation to the output specified. The 1066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Allocation is rescaled if necessary using bi-cubic 1076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * interpolation. 1086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 1096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * @param aout Output allocation. Element type must match 1106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * current input. 1116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * @param opt LaunchOptions for clipping 1126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang */ 1136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang public void forEach_bicubic(Allocation aout, Script.LaunchOptions opt) { 1146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang forEach(0, (Allocation) null, aout, null, opt); 1156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 1166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 1176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang /** 1186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * Get a KernelID for this intrinsic kernel. 1196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * 1206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang * @return Script.KernelID The KernelID object. 1216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang */ 1226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang public Script.KernelID getKernelID_bicubic() { 1236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang return createKernelID(0, 2, null, null); 1246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang } 1256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 1266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang 1276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang} 128