1059fede7f200350b6131fc131f76248085485722Miao Wang/*
2059fede7f200350b6131fc131f76248085485722Miao Wang * Copyright (C) 2015 The Android Open Source Project
3059fede7f200350b6131fc131f76248085485722Miao Wang *
4059fede7f200350b6131fc131f76248085485722Miao Wang * Licensed under the Apache License, Version 2.0 (the "License");
5059fede7f200350b6131fc131f76248085485722Miao Wang * you may not use this file except in compliance with the License.
6059fede7f200350b6131fc131f76248085485722Miao Wang * You may obtain a copy of the License at
7059fede7f200350b6131fc131f76248085485722Miao Wang *
8059fede7f200350b6131fc131f76248085485722Miao Wang *      http://www.apache.org/licenses/LICENSE-2.0
9059fede7f200350b6131fc131f76248085485722Miao Wang *
10059fede7f200350b6131fc131f76248085485722Miao Wang * Unless required by applicable law or agreed to in writing, software
11059fede7f200350b6131fc131f76248085485722Miao Wang * distributed under the License is distributed on an "AS IS" BASIS,
12059fede7f200350b6131fc131f76248085485722Miao Wang * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13059fede7f200350b6131fc131f76248085485722Miao Wang * See the License for the specific language governing permissions and
14059fede7f200350b6131fc131f76248085485722Miao Wang * limitations under the License.
15059fede7f200350b6131fc131f76248085485722Miao Wang */
16059fede7f200350b6131fc131f76248085485722Miao Wang
17059fede7f200350b6131fc131f76248085485722Miao Wangpackage android.support.v8.renderscript;
18059fede7f200350b6131fc131f76248085485722Miao Wang
19059fede7f200350b6131fc131f76248085485722Miao Wangimport android.util.Log;
20059fede7f200350b6131fc131f76248085485722Miao Wang
21059fede7f200350b6131fc131f76248085485722Miao Wang/**
22059fede7f200350b6131fc131f76248085485722Miao Wang * Intrinsic for performing a resize of a 2D allocation.
23059fede7f200350b6131fc131f76248085485722Miao Wang */
24059fede7f200350b6131fc131f76248085485722Miao Wangpublic class ScriptIntrinsicResize extends ScriptIntrinsic {
25059fede7f200350b6131fc131f76248085485722Miao Wang    private Allocation mInput;
26059fede7f200350b6131fc131f76248085485722Miao Wang    // API level for the intrinsic
27059fede7f200350b6131fc131f76248085485722Miao Wang    private static final int INTRINSIC_API_LEVEL = 21;
28059fede7f200350b6131fc131f76248085485722Miao Wang
29059fede7f200350b6131fc131f76248085485722Miao Wang    protected ScriptIntrinsicResize(long id, RenderScript rs) {
30059fede7f200350b6131fc131f76248085485722Miao Wang        super(id, rs);
31059fede7f200350b6131fc131f76248085485722Miao Wang    }
32059fede7f200350b6131fc131f76248085485722Miao Wang
33059fede7f200350b6131fc131f76248085485722Miao Wang    /**
34059fede7f200350b6131fc131f76248085485722Miao Wang     * Supported elements types are {@link Element#U8}, {@link
35059fede7f200350b6131fc131f76248085485722Miao Wang     * Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4}
36059fede7f200350b6131fc131f76248085485722Miao Wang     * {@link Element#F32}, {@link Element#F32_2}, {@link
37059fede7f200350b6131fc131f76248085485722Miao Wang     * Element#F32_3}, {@link Element#F32_4}
38059fede7f200350b6131fc131f76248085485722Miao Wang     *
39059fede7f200350b6131fc131f76248085485722Miao Wang     * @param rs The RenderScript context
40059fede7f200350b6131fc131f76248085485722Miao Wang     *
41059fede7f200350b6131fc131f76248085485722Miao Wang     * @return ScriptIntrinsicResize
42059fede7f200350b6131fc131f76248085485722Miao Wang     */
43059fede7f200350b6131fc131f76248085485722Miao Wang    public static ScriptIntrinsicResize create(RenderScript rs) {
44059fede7f200350b6131fc131f76248085485722Miao Wang        long id;
45059fede7f200350b6131fc131f76248085485722Miao Wang        boolean mUseIncSupp = rs.isUseNative() &&
46059fede7f200350b6131fc131f76248085485722Miao Wang                              android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
47059fede7f200350b6131fc131f76248085485722Miao Wang
48059fede7f200350b6131fc131f76248085485722Miao Wang        id = rs.nScriptIntrinsicCreate(12, 0, mUseIncSupp);
49059fede7f200350b6131fc131f76248085485722Miao Wang
50059fede7f200350b6131fc131f76248085485722Miao Wang        ScriptIntrinsicResize si = new ScriptIntrinsicResize(id, rs);
51059fede7f200350b6131fc131f76248085485722Miao Wang        si.setIncSupp(mUseIncSupp);
52059fede7f200350b6131fc131f76248085485722Miao Wang        return si;
53059fede7f200350b6131fc131f76248085485722Miao Wang
54059fede7f200350b6131fc131f76248085485722Miao Wang    }
55059fede7f200350b6131fc131f76248085485722Miao Wang
56059fede7f200350b6131fc131f76248085485722Miao Wang    /**
57059fede7f200350b6131fc131f76248085485722Miao Wang     * Set the input of the resize.
58059fede7f200350b6131fc131f76248085485722Miao Wang     * Must match the element type supplied during create.
59059fede7f200350b6131fc131f76248085485722Miao Wang     *
60059fede7f200350b6131fc131f76248085485722Miao Wang     * @param ain The input allocation.
61059fede7f200350b6131fc131f76248085485722Miao Wang     */
62059fede7f200350b6131fc131f76248085485722Miao Wang    public void setInput(Allocation ain) {
63059fede7f200350b6131fc131f76248085485722Miao Wang        Element e = ain.getElement();
64059fede7f200350b6131fc131f76248085485722Miao Wang        if (!e.isCompatible(Element.U8(mRS)) &&
65059fede7f200350b6131fc131f76248085485722Miao Wang            !e.isCompatible(Element.U8_2(mRS)) &&
66059fede7f200350b6131fc131f76248085485722Miao Wang            !e.isCompatible(Element.U8_3(mRS)) &&
67059fede7f200350b6131fc131f76248085485722Miao Wang            !e.isCompatible(Element.U8_4(mRS)) &&
68059fede7f200350b6131fc131f76248085485722Miao Wang            !e.isCompatible(Element.F32(mRS)) &&
69059fede7f200350b6131fc131f76248085485722Miao Wang            !e.isCompatible(Element.F32_2(mRS)) &&
70059fede7f200350b6131fc131f76248085485722Miao Wang            !e.isCompatible(Element.F32_3(mRS)) &&
71059fede7f200350b6131fc131f76248085485722Miao Wang            !e.isCompatible(Element.F32_4(mRS))) {
7283b686c5e4144b5e01ec25940f87e1955342f89bStephen Hines            throw new RSIllegalArgumentException("Unsupported element type.");
73059fede7f200350b6131fc131f76248085485722Miao Wang        }
74059fede7f200350b6131fc131f76248085485722Miao Wang
75059fede7f200350b6131fc131f76248085485722Miao Wang        mInput = ain;
76059fede7f200350b6131fc131f76248085485722Miao Wang        setVar(0, ain);
77059fede7f200350b6131fc131f76248085485722Miao Wang    }
78059fede7f200350b6131fc131f76248085485722Miao Wang
79059fede7f200350b6131fc131f76248085485722Miao Wang    /**
80059fede7f200350b6131fc131f76248085485722Miao Wang     * Get a FieldID for the input field of this intrinsic.
81059fede7f200350b6131fc131f76248085485722Miao Wang     *
82059fede7f200350b6131fc131f76248085485722Miao Wang     * @return Script.FieldID The FieldID object.
83059fede7f200350b6131fc131f76248085485722Miao Wang     */
84059fede7f200350b6131fc131f76248085485722Miao Wang    public Script.FieldID getFieldID_Input() {
85059fede7f200350b6131fc131f76248085485722Miao Wang        return createFieldID(0, null);
86059fede7f200350b6131fc131f76248085485722Miao Wang    }
87059fede7f200350b6131fc131f76248085485722Miao Wang
88059fede7f200350b6131fc131f76248085485722Miao Wang
89059fede7f200350b6131fc131f76248085485722Miao Wang    /**
90059fede7f200350b6131fc131f76248085485722Miao Wang     * Resize copy the input allocation to the output specified. The
91059fede7f200350b6131fc131f76248085485722Miao Wang     * Allocation is rescaled if necessary using bi-cubic
92059fede7f200350b6131fc131f76248085485722Miao Wang     * interpolation.
93059fede7f200350b6131fc131f76248085485722Miao Wang     *
94059fede7f200350b6131fc131f76248085485722Miao Wang     * @param aout Output allocation. Element type must match
95059fede7f200350b6131fc131f76248085485722Miao Wang     *             current input.  Must not be same as input.
96059fede7f200350b6131fc131f76248085485722Miao Wang     */
97059fede7f200350b6131fc131f76248085485722Miao Wang    public void forEach_bicubic(Allocation aout) {
98059fede7f200350b6131fc131f76248085485722Miao Wang        if (aout == mInput) {
99059fede7f200350b6131fc131f76248085485722Miao Wang            throw new RSIllegalArgumentException("Output cannot be same as Input.");
100059fede7f200350b6131fc131f76248085485722Miao Wang        }
101059fede7f200350b6131fc131f76248085485722Miao Wang        forEach_bicubic(aout, null);
102059fede7f200350b6131fc131f76248085485722Miao Wang    }
103059fede7f200350b6131fc131f76248085485722Miao Wang
104059fede7f200350b6131fc131f76248085485722Miao Wang    /**
105059fede7f200350b6131fc131f76248085485722Miao Wang     * Resize copy the input allocation to the output specified. The
106059fede7f200350b6131fc131f76248085485722Miao Wang     * Allocation is rescaled if necessary using bi-cubic
107059fede7f200350b6131fc131f76248085485722Miao Wang     * interpolation.
108059fede7f200350b6131fc131f76248085485722Miao Wang     *
109059fede7f200350b6131fc131f76248085485722Miao Wang     * @param aout Output allocation. Element type must match
110059fede7f200350b6131fc131f76248085485722Miao Wang     *             current input.
111059fede7f200350b6131fc131f76248085485722Miao Wang     * @param opt LaunchOptions for clipping
112059fede7f200350b6131fc131f76248085485722Miao Wang     */
113059fede7f200350b6131fc131f76248085485722Miao Wang    public void forEach_bicubic(Allocation aout, Script.LaunchOptions opt) {
114059fede7f200350b6131fc131f76248085485722Miao Wang        forEach(0, (Allocation) null, aout, null, opt);
115059fede7f200350b6131fc131f76248085485722Miao Wang    }
116059fede7f200350b6131fc131f76248085485722Miao Wang
117059fede7f200350b6131fc131f76248085485722Miao Wang    /**
118059fede7f200350b6131fc131f76248085485722Miao Wang     * Get a KernelID for this intrinsic kernel.
119059fede7f200350b6131fc131f76248085485722Miao Wang     *
120059fede7f200350b6131fc131f76248085485722Miao Wang     * @return Script.KernelID The KernelID object.
121059fede7f200350b6131fc131f76248085485722Miao Wang     */
122059fede7f200350b6131fc131f76248085485722Miao Wang    public Script.KernelID getKernelID_bicubic() {
123059fede7f200350b6131fc131f76248085485722Miao Wang        return createKernelID(0, 2, null, null);
124059fede7f200350b6131fc131f76248085485722Miao Wang    }
125059fede7f200350b6131fc131f76248085485722Miao Wang
126059fede7f200350b6131fc131f76248085485722Miao Wang
127059fede7f200350b6131fc131f76248085485722Miao Wang}
128