1a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams/*
2a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Copyright (C) 2012 The Android Open Source Project
3a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams *
4a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * you may not use this file except in compliance with the License.
6a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * You may obtain a copy of the License at
7a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams *
8a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams *
10a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Unless required by applicable law or agreed to in writing, software
11a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * See the License for the specific language governing permissions and
14a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * limitations under the License.
15a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams */
16a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
17a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Samspackage android.support.v8.renderscript;
18a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
19a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Samsimport android.util.Log;
20a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
21a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams/**
22a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * Intrinsic for applying a color matrix to allocations.
23a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams *
24a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * This has the same effect as loading each element and
25a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * converting it to a {@link Element#F32_4}, multiplying the
26a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * result by the 4x4 color matrix as performed by
27a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * rsMatrixMultiply() and writing it to the output after
28a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams * conversion back to {@link Element#U8_4}.
29a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams **/
30baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murraypublic class ScriptIntrinsicColorMatrix extends ScriptIntrinsic {
31a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    private final Matrix4f mMatrix = new Matrix4f();
326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    private final Float4 mAdd = new Float4();
33a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    private Allocation mInput;
346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    // API level for the intrinsic
356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    private static final int INTRINSIC_API_LEVEL = 19;
36a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
37bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    protected ScriptIntrinsicColorMatrix(long id, RenderScript rs) {
38a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        super(id, rs);
39a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
40a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
41a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
42a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Create an intrinsic for applying a color matrix to an
43a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * allocation.
44a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
45a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Supported elements types are {@link Element#U8_4}
46a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
47032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * @param rs The RenderScript context
48a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param e Element type for intputs and outputs
49a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
50a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @return ScriptIntrinsicColorMatrix
51a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
52a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public static ScriptIntrinsicColorMatrix create(RenderScript rs, Element e) {
53baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        if (!e.isCompatible(Element.U8_4(rs))) {
544f44acb8ed103c292258bc1fbfb62efac0db5d9bStephen Hines            throw new RSIllegalArgumentException("Unsupported element type.");
55a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        }
566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long id;
576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        boolean mUseIncSupp = rs.isUseNative() &&
586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang                              android.os.Build.VERSION.SDK_INT < INTRINSIC_API_LEVEL;
596f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
606f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        id = rs.nScriptIntrinsicCreate(2, e.getID(rs), mUseIncSupp);
616f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
626f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        ScriptIntrinsicColorMatrix si = new ScriptIntrinsicColorMatrix(id, rs);
636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        si.setIncSupp(mUseIncSupp);
646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return si;
65a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
66a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
67a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
68a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    private void setMatrix() {
69a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        FieldPacker fp = new FieldPacker(16*4);
70a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        fp.addMatrix(mMatrix);
71a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        setVar(0, fp);
72a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
73a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
74a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
75a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Set the color matrix which will be applied to each cell of
76a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * the image.
77a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
78a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param m The 4x4 matrix to set.
79a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
80a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public void setColorMatrix(Matrix4f m) {
81a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.load(m);
82a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        setMatrix();
83a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
84a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
85a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
86a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Set the color matrix which will be applied to each cell of the image.
87a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * This will set the alpha channel to be a copy.
88a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
89a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param m The 3x3 matrix to set.
90a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
91a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public void setColorMatrix(Matrix3f m) {
92a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.load(m);
93a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        setMatrix();
94a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
95a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
96a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * Set the value to be added after the color matrix has been
986f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * applied. The default value is {0, 0, 0, 0}
996f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
1006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * @param f The float4 value to be added.
1016f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     */
1026f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    public void setAdd(Float4 f) {
1036f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mAdd.x = f.x;
1046f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mAdd.y = f.y;
1056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mAdd.z = f.z;
1066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mAdd.w = f.w;
1076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
1086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        FieldPacker fp = new FieldPacker(4*4);
1096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        fp.addF32(f.x);
1106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        fp.addF32(f.y);
1116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        fp.addF32(f.z);
1126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        fp.addF32(f.w);
1136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        setVar(1, fp);
1146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
1166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    /**
1176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * Set the value to be added after the color matrix has been
1186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * applied. The default value is {0, 0, 0, 0}
1196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
1206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * @param r The red add value.
1216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * @param g The green add value.
1226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * @param b The blue add value.
1236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * @param a The alpha add value.
1246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     */
1256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    public void setAdd(float r, float g, float b, float a) {
1266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mAdd.x = r;
1276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mAdd.y = g;
1286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mAdd.z = b;
1296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mAdd.w = a;
1306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
1316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        FieldPacker fp = new FieldPacker(4*4);
1326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        fp.addF32(mAdd.x);
1336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        fp.addF32(mAdd.y);
1346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        fp.addF32(mAdd.z);
1356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        fp.addF32(mAdd.w);
1366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        setVar(1, fp);
1376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
1386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
1396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    /**
140a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Set a color matrix to convert from RGB to luminance. The alpha channel
141a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * will be a copy.
142a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
143a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
144a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public void setGreyscale() {
145a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.loadIdentity();
146a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(0, 0, 0.299f);
147a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(1, 0, 0.587f);
148a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(2, 0, 0.114f);
149a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(0, 1, 0.299f);
150a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(1, 1, 0.587f);
151a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(2, 1, 0.114f);
152a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(0, 2, 0.299f);
153a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(1, 2, 0.587f);
154a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(2, 2, 0.114f);
155a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        setMatrix();
156a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
157a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
158a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
159a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Set the matrix to convert from YUV to RGB with a direct copy of the 4th
160a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * channel.
161a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
162a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
163a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public void setYUVtoRGB() {
164a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.loadIdentity();
165a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(0, 0, 1.f);
166a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(1, 0, 0.f);
167a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(2, 0, 1.13983f);
168a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(0, 1, 1.f);
169a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(1, 1, -0.39465f);
170a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(2, 1, -0.5806f);
171a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(0, 2, 1.f);
172a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(1, 2, 2.03211f);
173a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(2, 2, 0.f);
174a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        setMatrix();
175a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
176a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
177a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
178a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Set the matrix to convert from RGB to YUV with a direct copy of the 4th
179a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * channel.
180a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
181a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
182a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public void setRGBtoYUV() {
183a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.loadIdentity();
184a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(0, 0, 0.299f);
185a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(1, 0, 0.587f);
186a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(2, 0, 0.114f);
187a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(0, 1, -0.14713f);
188a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(1, 1, -0.28886f);
189a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(2, 1, 0.436f);
190a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(0, 2, 0.615f);
191a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(1, 2, -0.51499f);
192a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mMatrix.set(2, 2, -0.10001f);
193a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        setMatrix();
194a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
195a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
196a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
197a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
198a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Invoke the kernel and apply the matrix to each cell of ain and copy to
199a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * aout.
200a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
201a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param ain Input allocation
202a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param aout Output allocation
203a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
204a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public void forEach(Allocation ain, Allocation aout) {
205a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        forEach(0, ain, aout, null);
206a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
207a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
208a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
2096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * Invoke the kernel and apply the matrix to each cell of input
2106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * {@link Allocation} and copy to the output {@link Allocation}.
2116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
2126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * If the vector size of the input is less than four, the
2136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * remaining components are treated as zero for the matrix
2146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * multiply.
2156f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
2166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * If the output vector size is less than four, the unused
2176f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * vector components are discarded.
2186f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
2196f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
2206f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * @param ain Input allocation
2216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * @param aout Output allocation
2226f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * @param opt LaunchOptions for clipping
2236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     */
2246f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    public void forEach(Allocation ain, Allocation aout, Script.LaunchOptions opt) {
2256f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (!ain.getElement().isCompatible(Element.U8(mRS)) &&
2266f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !ain.getElement().isCompatible(Element.U8_2(mRS)) &&
2276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !ain.getElement().isCompatible(Element.U8_3(mRS)) &&
2286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !ain.getElement().isCompatible(Element.U8_4(mRS)) &&
2296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !ain.getElement().isCompatible(Element.F32(mRS)) &&
2306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !ain.getElement().isCompatible(Element.F32_2(mRS)) &&
2316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !ain.getElement().isCompatible(Element.F32_3(mRS)) &&
2326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !ain.getElement().isCompatible(Element.F32_4(mRS))) {
2336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
2344f44acb8ed103c292258bc1fbfb62efac0db5d9bStephen Hines            throw new RSIllegalArgumentException("Unsupported element type.");
2356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
2366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
2376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (!aout.getElement().isCompatible(Element.U8(mRS)) &&
2386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !aout.getElement().isCompatible(Element.U8_2(mRS)) &&
2396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !aout.getElement().isCompatible(Element.U8_3(mRS)) &&
2406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !aout.getElement().isCompatible(Element.U8_4(mRS)) &&
2416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !aout.getElement().isCompatible(Element.F32(mRS)) &&
2426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !aout.getElement().isCompatible(Element.F32_2(mRS)) &&
2436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !aout.getElement().isCompatible(Element.F32_3(mRS)) &&
2446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            !aout.getElement().isCompatible(Element.F32_4(mRS))) {
2456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
2464f44acb8ed103c292258bc1fbfb62efac0db5d9bStephen Hines            throw new RSIllegalArgumentException("Unsupported element type.");
2476f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
2486f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
2496f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        forEach(0, ain, aout, null, opt);
2506f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
2516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
2526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    /**
253a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Get a KernelID for this intrinsic kernel.
254a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
255a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @return Script.KernelID The KernelID object.
256a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
257a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public Script.KernelID getKernelID() {
258a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        return createKernelID(0, 3, null, null);
259a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
260a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
261a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams}
262a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
263