169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams/*
269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * Copyright (C) 2008 The Android Open Source Project
369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams *
469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * Licensed under the Apache License, Version 2.0 (the "License");
569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * you may not use this file except in compliance with the License.
669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * You may obtain a copy of the License at
769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams *
869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams *      http://www.apache.org/licenses/LICENSE-2.0
969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams *
1069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * Unless required by applicable law or agreed to in writing, software
1169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * See the License for the specific language governing permissions and
1469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * limitations under the License.
1569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams */
1669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
1769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Samspackage android.renderscript;
1869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
1969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams/**
2069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * @hide
2169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams **/
2269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Samspublic class Script extends BaseObj {
23fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams    public static final int MAX_SLOT = 16;
24fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams
2569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    boolean mIsRoot;
2643ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    Type[] mTypes;
27334ea0c98f051b5a6b85bc616c93304651854298Jason Sams    boolean[] mWritable;
28be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams    Invokable[] mInvokables;
29be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams
30be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams    public static class Invokable {
31be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        RenderScript mRS;
32be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        Script mScript;
33be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        int mSlot;
34be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        String mName;
35be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams
36be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        Invokable() {
37be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            mSlot = -1;
38be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        }
39be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams
40be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        public void execute() {
41be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            mRS.nScriptInvoke(mScript.mID, mSlot);
42be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        }
43be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams    }
4469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
4569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    Script(int id, RenderScript rs) {
4669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        super(rs);
4769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        mID = id;
4869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
4969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
5069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    public void bindAllocation(Allocation va, int slot) {
51771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
5269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        mRS.nScriptBindAllocation(mID, va.mID, slot);
5369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
5469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
5569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    public void setClearColor(float r, float g, float b, float a) {
56771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
5722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        mRS.nScriptSetClearColor(mID, r, g, b, a);
5869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
5969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
6069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    public void setClearDepth(float d) {
61771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
6222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        mRS.nScriptSetClearDepth(mID, d);
6369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
6469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
6569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    public void setClearStencil(int stencil) {
66771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
6722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        mRS.nScriptSetClearStencil(mID, stencil);
6869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
6969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
7022534176fb5c1257130ef4ee589739ca42766a32Jason Sams    public void setTimeZone(String timeZone) {
71771bebb94054d06f97284379c93a2620613513c3Jason Sams        mRS.validate();
7222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        try {
7322534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mRS.nScriptSetTimeZone(mID, timeZone.getBytes("UTF-8"));
7422534176fb5c1257130ef4ee589739ca42766a32Jason Sams        } catch (java.io.UnsupportedEncodingException e) {
7522534176fb5c1257130ef4ee589739ca42766a32Jason Sams            throw new RuntimeException(e);
7622534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
7722534176fb5c1257130ef4ee589739ca42766a32Jason Sams    }
7869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
7969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    public static class Builder {
8069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        RenderScript mRS;
8169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        boolean mIsRoot = false;
8243ee06857bb7f99446d1d84f8789016c5d105558Jason Sams        Type[] mTypes;
83fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams        String[] mNames;
84334ea0c98f051b5a6b85bc616c93304651854298Jason Sams        boolean[] mWritable;
85be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        int mInvokableCount = 0;
86be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        Invokable[] mInvokables;
8769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
8869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        Builder(RenderScript rs) {
8969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams            mRS = rs;
90fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams            mTypes = new Type[MAX_SLOT];
91fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams            mNames = new String[MAX_SLOT];
92334ea0c98f051b5a6b85bc616c93304651854298Jason Sams            mWritable = new boolean[MAX_SLOT];
93be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            mInvokables = new Invokable[MAX_SLOT];
9469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        }
9569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
96fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams        public void setType(Type t, int slot) {
97fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams            mTypes[slot] = t;
98fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams            mNames[slot] = null;
99fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams        }
100fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams
101fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams        public void setType(Type t, String name, int slot) {
102fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams            mTypes[slot] = t;
103fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams            mNames[slot] = name;
10469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        }
10569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
106be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        public Invokable addInvokable(String func) {
107be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            Invokable i = new Invokable();
108be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            i.mName = func;
109be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            i.mRS = mRS;
110be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            i.mSlot = mInvokableCount;
111be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            mInvokables[mInvokableCount++] = i;
112be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            return i;
113be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams        }
114be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams
115334ea0c98f051b5a6b85bc616c93304651854298Jason Sams        public void setType(boolean writable, int slot) {
116334ea0c98f051b5a6b85bc616c93304651854298Jason Sams            mWritable[slot] = writable;
117334ea0c98f051b5a6b85bc616c93304651854298Jason Sams        }
118334ea0c98f051b5a6b85bc616c93304651854298Jason Sams
11969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        void transferCreate() {
120fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams            mRS.nScriptSetRoot(mIsRoot);
121fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams            for(int ct=0; ct < mTypes.length; ct++) {
122fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams                if(mTypes[ct] != null) {
123334ea0c98f051b5a6b85bc616c93304651854298Jason Sams                    mRS.nScriptSetType(mTypes[ct].mID, mWritable[ct], mNames[ct], ct);
124fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams                }
12543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams            }
126be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            for(int ct=0; ct < mInvokableCount; ct++) {
127be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams                mRS.nScriptSetInvokable(mInvokables[ct].mName, ct);
128be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            }
12969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        }
13069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
13169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        void transferObject(Script s) {
13269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams            s.mIsRoot = mIsRoot;
133fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams            s.mTypes = mTypes;
134be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            s.mInvokables = new Invokable[mInvokableCount];
135be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            for(int ct=0; ct < mInvokableCount; ct++) {
136be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams                s.mInvokables[ct] = mInvokables[ct];
137be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams                s.mInvokables[ct].mScript = s;
138be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            }
139be2e84193f709419634de4cc3ba0e67acf6976f3Jason Sams            s.mInvokables = null;
14069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        }
14169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
14269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        public void setRoot(boolean r) {
14369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams            mIsRoot = r;
14469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams        }
14569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
14669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams    }
14769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
14869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams}
14969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams
150