1464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams/*
2464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * Copyright (C) 2014 The Android Open Source Project
3464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams *
4464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * you may not use this file except in compliance with the License.
6464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * You may obtain a copy of the License at
7464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams *
8464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams *
10464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * Unless required by applicable law or agreed to in writing, software
11464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * See the License for the specific language governing permissions and
14464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * limitations under the License.
15464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams */
16464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
17464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Samspackage android.renderscript;
18464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
19464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams/**
20464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams * Intrinsic for performing a resize of a 2D allocation.
21464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams */
22464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Samspublic final class ScriptIntrinsicResize extends ScriptIntrinsic {
23464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    private Allocation mInput;
24464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
25464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    private ScriptIntrinsicResize(long id, RenderScript rs) {
26464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        super(id, rs);
27464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    }
28464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
29464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    /**
30464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Supported elements types are {@link Element#U8}, {@link
31464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Element#U8_2}, {@link Element#U8_3}, {@link Element#U8_4}
328f3cc4582dba6beaf9630239d4ad861543964f93Miao Wang     * {@link Element#F32}, {@link Element#F32_2}, {@link
338f3cc4582dba6beaf9630239d4ad861543964f93Miao Wang     * Element#F32_3}, {@link Element#F32_4}
34464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     *
35464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * @param rs The RenderScript context
36464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     *
37464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * @return ScriptIntrinsicResize
38464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     */
39464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    public static ScriptIntrinsicResize create(RenderScript rs) {
40464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        long id = rs.nScriptIntrinsicCreate(12, 0);
41464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        ScriptIntrinsicResize si = new ScriptIntrinsicResize(id, rs);
42464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        return si;
43464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
44464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    }
45464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
46464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    /**
47464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Set the input of the resize.
48464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Must match the element type supplied during create.
49464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     *
50464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * @param ain The input allocation.
51464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     */
52464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    public void setInput(Allocation ain) {
53464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        Element e = ain.getElement();
54464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        if (!e.isCompatible(Element.U8(mRS)) &&
55464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams            !e.isCompatible(Element.U8_2(mRS)) &&
56464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams            !e.isCompatible(Element.U8_3(mRS)) &&
578f3cc4582dba6beaf9630239d4ad861543964f93Miao Wang            !e.isCompatible(Element.U8_4(mRS)) &&
588f3cc4582dba6beaf9630239d4ad861543964f93Miao Wang            !e.isCompatible(Element.F32(mRS)) &&
598f3cc4582dba6beaf9630239d4ad861543964f93Miao Wang            !e.isCompatible(Element.F32_2(mRS)) &&
608f3cc4582dba6beaf9630239d4ad861543964f93Miao Wang            !e.isCompatible(Element.F32_3(mRS)) &&
618f3cc4582dba6beaf9630239d4ad861543964f93Miao Wang            !e.isCompatible(Element.F32_4(mRS))) {
62464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams            throw new RSIllegalArgumentException("Unsuported element type.");
63464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        }
64464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
65464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        mInput = ain;
66464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        setVar(0, ain);
67464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    }
68464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
69464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    /**
70464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Get a FieldID for the input field of this intrinsic.
71464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     *
72464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * @return Script.FieldID The FieldID object.
73464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     */
74464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    public Script.FieldID getFieldID_Input() {
75464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        return createFieldID(0, null);
76464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    }
77464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
78464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
79464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    /**
80464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Resize copy the input allocation to the output specified. The
81464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Allocation is rescaled if necessary using bi-cubic
82464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * interpolation.
83464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     *
84464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * @param aout Output allocation. Element type must match
85464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     *             current input.  Must not be same as input.
86464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     */
87464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    public void forEach_bicubic(Allocation aout) {
88464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        if (aout == mInput) {
89464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams            throw new RSIllegalArgumentException("Output cannot be same as Input.");
90464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        }
91464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        forEach_bicubic(aout, null);
92464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    }
93464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
94464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    /**
95464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Resize copy the input allocation to the output specified. The
96464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Allocation is rescaled if necessary using bi-cubic
97464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * interpolation.
98464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     *
99464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * @param aout Output allocation. Element type must match
100464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     *             current input.
101464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * @param opt LaunchOptions for clipping
102464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     */
103464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    public void forEach_bicubic(Allocation aout, Script.LaunchOptions opt) {
104949610653fdf55dd2cb3c846047e6aa2c6d73f0dChris Wailes        forEach(0, (Allocation) null, aout, null, opt);
105464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    }
106464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
107464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    /**
108464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * Get a KernelID for this intrinsic kernel.
109464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     *
110464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     * @return Script.KernelID The KernelID object.
111464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams     */
112464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    public Script.KernelID getKernelID_bicubic() {
113464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams        return createKernelID(0, 2, null, null);
114464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams    }
115464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
116464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams
117464af41b28cfb1b56fdf4aeda117b4a4c5e99eb9Jason Sams}
118