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