145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/*
245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Copyright (C) 2012 The Android Open Source Project
345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * you may not use this file except in compliance with the License.
645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * You may obtain a copy of the License at
745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
1045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Unless required by applicable law or agreed to in writing, software
1145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * See the License for the specific language governing permissions and
1445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * limitations under the License.
1545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */
1645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspackage android.support.v8.renderscript;
1845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Samsimport android.util.SparseArray;
20a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
2145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/**
22032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * The parent class for all executable scripts. This should not be used by
23032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * applications.
2445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/
2545d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class Script extends BaseObj {
26a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
276f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * Determine if Incremental Intrinsic Support is needed
286f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
296f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     */
306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    private boolean mUseIncSupp;
316f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    protected void setIncSupp(boolean useInc) {
326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mUseIncSupp = useInc;
336f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
346f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    protected boolean isIncSupp() {
356f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return mUseIncSupp;
366f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
376f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    /**
386f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * An allocation for the compat context will be created when needed
396f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     * e.g. foreach(ain, aout), setVar(ain);
406f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     *
416f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang     */
428919a441f977cb787d244aa42cc2d4dda1cbfa11Miao Wang    long getDummyAlloc(Allocation ain) {
436f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long dInElement = 0;
446f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long dInType = 0;
456f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long dummyAlloc = 0;
466f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (ain != null) {
4794ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang            Type inType = ain.getType();
4894ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang            dInElement = inType.getElement().getDummyElement(mRS);
4994ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang            dInType = inType.getDummyType(mRS, dInElement);
5094ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang            int xBytesSize = inType.getX() * inType.getElement().getBytesSize();
5194ded3567e0f2a567887e5d8ab896634da855a2eMiao Wang            dummyAlloc = mRS.nIncAllocationCreateTyped(ain.getID(mRS), dInType, xBytesSize);
526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            ain.setIncAllocID(dummyAlloc);
536f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
546f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
556f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        return dummyAlloc;
566f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    }
576f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang    /**
58a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * KernelID is an identifier for a Script + root function pair. It is used
59a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * as an identifier for ScriptGroup creation.
60a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
61a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * This class should not be directly created. Instead use the method in the
62a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * reflected or intrinsic code "getKernelID_funcname()".
63a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
64a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
65a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public static final class KernelID extends BaseObj {
66baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        android.renderscript.Script.KernelID mN;
67a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        Script mScript;
68a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        int mSlot;
69a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        int mSig;
70bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        KernelID(long id, RenderScript rs, Script s, int slot, int sig) {
71a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            super(id, rs);
72a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            mScript = s;
73a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            mSlot = slot;
74a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            mSig = sig;
75a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        }
76a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
77a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
78a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    private final SparseArray<KernelID> mKIDs = new SparseArray<KernelID>();
79a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
80a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Only to be used by generated reflected classes.
81a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
82a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
83a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param slot
84a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param sig
85a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param ein
86a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param eout
87a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
88a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @return KernelID
89a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
90a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    protected KernelID createKernelID(int slot, int sig, Element ein, Element eout) {
91a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        KernelID k = mKIDs.get(slot);
92a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        if (k != null) {
93a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            return k;
94a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        }
956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
966f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long id = mRS.nScriptKernelIDCreate(getID(mRS), slot, sig, mUseIncSupp);
97a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        if (id == 0) {
98a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            throw new RSDriverException("Failed to create KernelID");
99a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        }
100a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
101a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        k = new KernelID(id, mRS, this, slot, sig);
102baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray
103a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mKIDs.put(slot, k);
104a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        return k;
105a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
106a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
107a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
108086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni     * InvokeID is an identifier for a invoke function. It is used
109086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni     * as an identifier for ScriptGroup creation.
110086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni     *
111086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni     * This class should not be directly created. Instead use the method in the
112086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni     * reflected or intrinsic code "getInvokeID_funcname()".
113086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni     *
114086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni     */
115086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    public static final class InvokeID extends BaseObj {
116086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        Script mScript;
117086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        int mSlot;
118086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        InvokeID(long id, RenderScript rs, Script s, int slot) {
119086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            super(id, rs);
120086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            mScript = s;
121086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            mSlot = slot;
122086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        }
123086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    }
124086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
125086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    private final SparseArray<InvokeID> mIIDs = new SparseArray<InvokeID>();
126086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    /**
127086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni     * Only to be used by generated reflected classes.
128086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni     */
129086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    protected InvokeID createInvokeID(int slot) {
130086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        InvokeID i = mIIDs.get(slot);
131086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        if (i != null) {
132086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            return i;
133086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        }
134086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
135086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        long id = mRS.nScriptInvokeIDCreate(getID(mRS), slot);
136086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        if (id == 0) {
137086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni            throw new RSDriverException("Failed to create KernelID");
138086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        }
139086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
140086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        i = new InvokeID(id, mRS, this, slot);
141086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        mIIDs.put(slot, i);
142086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni        return i;
143086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    }
144086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni
145086010500c28e2bca57ea583d3f38da9a2f2f414Yang Ni    /**
146a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * FieldID is an identifier for a Script + exported field pair. It is used
147a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * as an identifier for ScriptGroup creation.
148a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
149a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * This class should not be directly created. Instead use the method in the
150a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * reflected or intrinsic code "getFieldID_funcname()".
151a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
152a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
153a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    public static final class FieldID extends BaseObj {
154baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        android.renderscript.Script.FieldID mN;
155a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        Script mScript;
156a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        int mSlot;
157bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        FieldID(long id, RenderScript rs, Script s, int slot) {
158a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            super(id, rs);
159a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            mScript = s;
160a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            mSlot = slot;
161a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        }
162a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
163a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
164a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    private final SparseArray<FieldID> mFIDs = new SparseArray();
165a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    /**
166a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * Only to be used by generated reflected classes.
167a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
168a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param slot
169a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @param e
170a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     *
171a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     * @return FieldID
172a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams     */
173a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    protected FieldID createFieldID(int slot, Element e) {
174a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        FieldID f = mFIDs.get(slot);
175a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        if (f != null) {
176a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            return f;
177a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        }
178a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
1796f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long id = mRS.nScriptFieldIDCreate(getID(mRS), slot, mUseIncSupp);
180a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        if (id == 0) {
181a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams            throw new RSDriverException("Failed to create FieldID");
182a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        }
183a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
184a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        f = new FieldID(id, mRS, this, slot);
185a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        mFIDs.put(slot, f);
186a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams        return f;
187a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams    }
188a5e8cafe9173abee2b47e7c927210a22934a30e5Jason Sams
18945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
19045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
19145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
19245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param slot
19345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
19445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    protected void invoke(int slot) {
1956f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mRS.nScriptInvoke(getID(mRS), slot, mUseIncSupp);
19645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
19745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
19845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
19945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
20045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
20145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param slot
20245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param v
20345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
20445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    protected void invoke(int slot, FieldPacker v) {
20545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (v != null) {
2066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptInvokeV(getID(mRS), slot, v.getData(), mUseIncSupp);
20745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        } else {
2086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptInvoke(getID(mRS), slot, mUseIncSupp);
20945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
21045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
21145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
21245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
21345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
21445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
215baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray     * @param va
216baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray     * @param slot
217baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray     */
218baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    public void bindAllocation(Allocation va, int slot) {
219baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        mRS.validate();
220baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        if (va != null) {
2216f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptBindAllocation(getID(mRS), va.getID(mRS), slot, mUseIncSupp);
222baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        } else {
2236f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptBindAllocation(getID(mRS), 0, slot, mUseIncSupp);
224baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        }
225baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    }
226baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray
227baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    public void setTimeZone(String timeZone) {
228baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        mRS.validate();
229baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        try {
2306f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptSetTimeZone(getID(mRS), timeZone.getBytes("UTF-8"), mUseIncSupp);
231baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        } catch (java.io.UnsupportedEncodingException e) {
232baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            throw new RuntimeException(e);
233baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        }
234baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    }
235baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray
236baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray
237baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray    /**
238baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray     * Only intended for use by generated reflected code.
239baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray     *
24045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param slot
24145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param ain
24245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param aout
24345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param v
24445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
24545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v) {
24645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (ain == null && aout == null) {
24745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSIllegalArgumentException(
24845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                "At least one of ain or aout is required to be non-null.");
24945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
250bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        long in_id = 0;
2516f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long out_id = 0;
25245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (ain != null) {
25345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            in_id = ain.getID(mRS);
25445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
25545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (aout != null) {
25645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            out_id = aout.getID(mRS);
25745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
2586f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
25945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        byte[] params = null;
26045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (v != null) {
26145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            params = v.getData();
26245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
2636f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
2646f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseIncSupp) {
2656f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            long ainInc = getDummyAlloc(ain);
2666f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            long aoutInc = getDummyAlloc(aout);
2676f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptForEach(getID(mRS), slot, ainInc, aoutInc, params, mUseIncSupp);
2686f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        } else {
2696f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptForEach(getID(mRS), slot, in_id, out_id, params, mUseIncSupp);
2706f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
27145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
27245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
273032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    /**
274032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Only intended for use by generated reflected code.
275032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     *
276032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * @param slot
277032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * @param ain
278032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * @param aout
279032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * @param v
280032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * @param sc
281032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     */
282e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray    protected void forEach(int slot, Allocation ain, Allocation aout, FieldPacker v, LaunchOptions sc) {
283e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        if (ain == null && aout == null) {
284dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines            throw new RSIllegalArgumentException(
285dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines                "At least one of ain or aout is required to be non-null.");
286dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        }
287dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines
288dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines        if (sc == null) {
289dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines            forEach(slot, ain, aout, v);
290dfe51945d97812921083af3693deaa4bde6ab11fStephen Hines            return;
291e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
292bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang        long in_id = 0;
2936f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        long out_id = 0;
294e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        if (ain != null) {
295e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            in_id = ain.getID(mRS);
296e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
297e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        if (aout != null) {
298e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            out_id = aout.getID(mRS);
299e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
3006f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang
301e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        byte[] params = null;
302e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        if (v != null) {
303e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            params = v.getData();
304e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
3056f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseIncSupp) {
3066f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            long ainInc = getDummyAlloc(ain);
3076f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            long aoutInc = getDummyAlloc(aout);
3086f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptForEachClipped(getID(mRS), slot, ainInc, aoutInc, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend, mUseIncSupp);
3096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        } else {
3106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptForEachClipped(getID(mRS), slot, in_id, out_id, params, sc.xstart, sc.xend, sc.ystart, sc.yend, sc.zstart, sc.zend, mUseIncSupp);
3116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
312e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray    }
313e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
314bec39b6de685a7dddb1925c7e9f83fae20388de3Miao Wang    Script(long id, RenderScript rs) {
31545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        super(id, rs);
3166f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mUseIncSupp = false;
31745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
31845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
31945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
32045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
32145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
32289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang     * @hide
32389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang     */
32489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    protected void forEach(int slot, Allocation[] ains, Allocation aout,
32589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                           FieldPacker v) {
32689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        forEach(slot, ains, aout, v, null);
32789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
32889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
32989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    /**
33089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang     * Only intended for use by generated reflected code.
33189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang     *
33289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang     * @hide
33389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang     */
33489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    protected void forEach(int slot, Allocation[] ains, Allocation aout,
33589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                           FieldPacker v, LaunchOptions sc) {
33689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        // TODO: Is this necessary if nScriptForEach calls validate as well?
33789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        mRS.validate();
33889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (ains != null) {
33989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            for (Allocation ain : ains) {
34089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                mRS.validateObject(ain);
34189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            }
34289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
34389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        mRS.validateObject(aout);
34489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
34589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (ains == null && aout == null) {
34689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            throw new RSIllegalArgumentException(
34789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                "At least one of ain or aout is required to be non-null.");
34889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
34989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
35089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        long[] in_ids;
35189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (ains != null) {
35289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            in_ids = new long[ains.length];
35389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            for (int index = 0; index < ains.length; ++index) {
35489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang                in_ids[index] = ains[index].getID(mRS);
35589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            }
35689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        } else {
35789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            in_ids = null;
35889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
35989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
36089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        long out_id = 0;
36189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (aout != null) {
36289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            out_id = aout.getID(mRS);
36389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
36489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
36589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        byte[] params = null;
36689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (v != null) {
36789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            params = v.getData();
36889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
36989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
37089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        int[] limits = null;
37189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        if (sc != null) {
37289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            limits = new int[6];
37389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
37489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            limits[0] = sc.xstart;
37589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            limits[1] = sc.xend;
37689b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            limits[2] = sc.ystart;
37789b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            limits[3] = sc.yend;
37889b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            limits[4] = sc.zstart;
37989b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang            limits[5] = sc.zend;
38089b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        }
38189b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
38289b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang        mRS.nScriptForEach(getID(mRS), slot, in_ids, out_id, params, limits);
38389b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    }
38489b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang
38589b58238694d7d1eebaac0aa59b0bdd67a779582Miao Wang    /**
386f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross     * Only intended for use by generated reflected code.  (General reduction)
387f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross     *
388f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross     * @hide
389f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross     */
390f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross    protected void reduce(int slot, Allocation[] ains, Allocation aout, LaunchOptions sc) {
391f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        mRS.validate();
392f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        if (ains == null || ains.length < 1) {
393f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            throw new RSIllegalArgumentException(
394f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross                "At least one input is required.");
395f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        }
396f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        if (aout == null) {
397f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            throw new RSIllegalArgumentException(
398f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross                "aout is required to be non-null.");
399f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        }
400f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        for (Allocation ain : ains) {
401f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            mRS.validateObject(ain);
402f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        }
403f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross
404f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        long[] in_ids = new long[ains.length];
405f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        for (int index = 0; index < ains.length; ++index) {
406f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            in_ids[index] = ains[index].getID(mRS);
407f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        }
408f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        long out_id = aout.getID(mRS);
409f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross
410f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        int[] limits = null;
411f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        if (sc != null) {
412f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            limits = new int[6];
413f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross
414f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            limits[0] = sc.xstart;
415f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            limits[1] = sc.xend;
416f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            limits[2] = sc.ystart;
417f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            limits[3] = sc.yend;
418f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            limits[4] = sc.zstart;
419f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross            limits[5] = sc.zend;
420f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross        }
421f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross
4222141e9b9d98b6f4e2f4124f9b67a7819e8d40a4cDavid Gross        mRS.nScriptReduce(getID(mRS), slot, in_ids, out_id, limits);
423f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross    }
424f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross
425f9e49ed8dd695fe9c7dd9b3516d613365667763aDavid Gross    /**
4265154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala     * Only intended for use by generated reflected code.
4275154a13fa3b65d2f4e47ceeca51f4013daa49b7aMatt Wala     *
42845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param index
42945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param v
43045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
43145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setVar(int index, float v) {
4326f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mRS.nScriptSetVarF(getID(mRS), index, v, mUseIncSupp);
43345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
43445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
43545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
43645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
43745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
43845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param index
43945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param v
44045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
44145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setVar(int index, double v) {
4426f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mRS.nScriptSetVarD(getID(mRS), index, v, mUseIncSupp);
44345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
44445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
44545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
44645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
44745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
44845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param index
44945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param v
45045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
45145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setVar(int index, int v) {
4526f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mRS.nScriptSetVarI(getID(mRS), index, v, mUseIncSupp);
45345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
45445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
45545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
45645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
45745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
45845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param index
45945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param v
46045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
46145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setVar(int index, long v) {
46269331f9e1951415062a79181551abbfc440e6b35Miao Wang        mRS.nScriptSetVarJ(getID(mRS), index, v, mUseIncSupp);
46345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
46445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
46545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
46645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
46745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
46845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param index
46945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param v
47045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
47145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setVar(int index, boolean v) {
4726f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mRS.nScriptSetVarI(getID(mRS), index, v ? 1 : 0, mUseIncSupp);
47345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
47445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
47545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
47645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
47745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
47845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param index
47945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param o
48045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
48145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setVar(int index, BaseObj o) {
4826f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseIncSupp) {
4836f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            long oInc = getDummyAlloc((Allocation)o);
4846f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : oInc, mUseIncSupp);
4856f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        } else {
4866f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptSetVarObj(getID(mRS), index, (o == null) ? 0 : o.getID(mRS), mUseIncSupp);
4876f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
48845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
48945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
49045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
49145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
49245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
49345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param index
49445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param v
49545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
49645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setVar(int index, FieldPacker v) {
4976f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        mRS.nScriptSetVarV(getID(mRS), index, v.getData(), mUseIncSupp);
49845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
49945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
50045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
50145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by generated reflected code.
50245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
50345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param index
50445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param v
50545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param e
50645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param dims
50745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
50845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public void setVar(int index, FieldPacker v, Element e, int[] dims) {
5096f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        if (mUseIncSupp) {
5106f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            long dElement = e.getDummyElement(mRS);
5116f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), dElement, dims, mUseIncSupp);
5126f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        } else {
5136f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang            mRS.nScriptSetVarVE(getID(mRS), index, v.getData(), e.getID(mRS), dims, mUseIncSupp);
5146f5555db1af436bb5aad430e6e00aa5b69d5ca6cMiao Wang        }
51545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
51645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
517032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    /**
518032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Only intended for use by generated reflected code.
519032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     *
520032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     */
52145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static class Builder {
52245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        RenderScript mRS;
52345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
52445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        Builder(RenderScript rs) {
52545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mRS = rs;
52645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
52745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
52845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
52945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
530032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    /**
531032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     * Only intended for use by generated reflected code.
532032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     *
533032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     */
53445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    public static class FieldBase {
53545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected Element mElement;
53645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected Allocation mAllocation;
53745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
53845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected void init(RenderScript rs, int dimx) {
53945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT);
54045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
54145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
54245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected void init(RenderScript rs, int dimx, int usages) {
54345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            mAllocation = Allocation.createSized(rs, mElement, dimx, Allocation.USAGE_SCRIPT | usages);
54445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
54545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
54645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        protected FieldBase() {
54745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
54845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
54945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Element getElement() {
55045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return mElement;
55145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
55245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
55345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Type getType() {
55445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return mAllocation.getType();
55545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
55645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
55745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public Allocation getAllocation() {
55845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            return mAllocation;
55945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
56045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
56145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        //@Override
56245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        public void updateAllocation() {
56345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
56445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
565e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
566e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
567032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    /**
56872c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * Class for specifying the specifics about how a kernel will be
56972c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * launched.
57072c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     *
57172c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * This class can specify a potential range of cells on which to
57272c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * run a kernel.  If no set is called for a dimension then this
57372c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * class will have no impact on that dimension when the kernel
57472c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * is executed.
57572c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     *
57672c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * The forEach kernel launch will operate over the intersection of
57772c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * the dimensions.
57872c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     *
57972c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * Example:
58072c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * LaunchOptions with setX(5, 15)
58172c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * Allocation with dimension X=10, Y=10
58272c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * The resulting forEach run would execute over:
58372c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * x = 5 to 9 (inclusive) and
58472c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang     * y = 0 to 9 (inclusive).
585032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     *
586032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines     */
587032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines    public static final class LaunchOptions {
588032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        private int xstart = 0;
589032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        private int ystart = 0;
590032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        private int xend = 0;
591032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        private int yend = 0;
592032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        private int zstart = 0;
593032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        private int zend = 0;
594032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        private int strategy;
595032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines
596032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
59772c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang         * Set the X range. xstartArg is the lowest coordinate of the range,
59872c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang         * and xendArg-1 is the highest coordinate of the range.
599032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
600032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @param xstartArg Must be >= 0
60172c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang         * @param xendArg Must be > xstartArg
602032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
603032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @return LaunchOptions
604032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
605e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        public LaunchOptions setX(int xstartArg, int xendArg) {
606e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            if (xstartArg < 0 || xendArg <= xstartArg) {
607e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
608e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            }
609e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            xstart = xstartArg;
610e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            xend = xendArg;
611e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            return this;
612e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
613e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
614032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
61572c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang         * Set the Y range. ystartArg is the lowest coordinate of the range,
61672c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang         * and yendArg-1 is the highest coordinate of the range.
617032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
618032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @param ystartArg Must be >= 0
61972c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang         * @param yendArg Must be > ystartArg
620032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
621032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @return LaunchOptions
622032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
623e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        public LaunchOptions setY(int ystartArg, int yendArg) {
624e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            if (ystartArg < 0 || yendArg <= ystartArg) {
625e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
626e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            }
627e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            ystart = ystartArg;
628e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            yend = yendArg;
629e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            return this;
630e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
631e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
632032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
63372c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang         * Set the Z range. zstartArg is the lowest coordinate of the range,
63472c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang         * and zendArg-1 is the highest coordinate of the range.
635032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
636032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @param zstartArg Must be >= 0
63772c540a88dcb5779b7fdd33d266d49f2918a020eMiao Wang         * @param zendArg Must be > zstartArg
638032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
639032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @return LaunchOptions
640032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
641e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        public LaunchOptions setZ(int zstartArg, int zendArg) {
642e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            if (zstartArg < 0 || zendArg <= zstartArg) {
643e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray                throw new RSIllegalArgumentException("Invalid dimensions");
644e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            }
645e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            zstart = zstartArg;
646e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            zend = zendArg;
647e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            return this;
648e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
649e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
650e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
651032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
652032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * Returns the current X start
653032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
654032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @return int current value
655032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
656e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        public int getXStart() {
657e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            return xstart;
658e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
659032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
660032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * Returns the current X end
661032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
662032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @return int current value
663032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
664e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        public int getXEnd() {
665e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            return xend;
666e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
667032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
668032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * Returns the current Y start
669032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
670032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @return int current value
671032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
672e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        public int getYStart() {
673e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            return ystart;
674e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
675032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
676032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * Returns the current Y end
677032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
678032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @return int current value
679032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
680e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        public int getYEnd() {
681e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            return yend;
682e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
683032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
684032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * Returns the current Z start
685032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
686032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @return int current value
687032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
688e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        public int getZStart() {
689e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            return zstart;
690e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
691032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines        /**
692032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * Returns the current Z end
693032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         *
694032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         * @return int current value
695032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines         */
696e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        public int getZEnd() {
697e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray            return zend;
698e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray        }
699e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray
700e47cec65ee7148f14c32a000da1b51ff4dfc78e9Tim Murray    }
70145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams}
702