Type.java revision b42315d37ab22e64ef88d3aed38ed75fd7071eed
1b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/*
2b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Copyright (C) 2008 The Android Open Source Project
3b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
4b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
5b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * you may not use this file except in compliance with the License.
6b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * You may obtain a copy of the License at
7b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
8b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
9b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
10b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * Unless required by applicable law or agreed to in writing, software
11b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
12b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * See the License for the specific language governing permissions and
14b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * limitations under the License.
15b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams */
16b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
17b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspackage android.renderscript;
18b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
1943ee06857bb7f99446d1d84f8789016c5d105558Jason Samsimport java.lang.reflect.Field;
2043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
21b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/**
22b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * @hide
23b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
24b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams **/
25b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspublic class Type extends BaseObj {
26768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimX;
27768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimY;
28768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimZ;
29768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    boolean mDimLOD;
30768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    boolean mDimFaces;
31768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mElementCount;
321bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    Element mElement;
33768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
3443ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    private int mNativeCache;
3543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    Class mJavaClass;
361bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
37e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    public Element getElement() {
38e17964e150e459bacced5658ae36fe1c56082e37Jason Sams        return mElement;
39e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    }
401bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
41768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getX() {
42768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimX;
43768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
44768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getY() {
45768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimY;
46768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
47768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getZ() {
48768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimZ;
49768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
50768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public boolean getLOD() {
51768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimLOD;
52768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
53768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public boolean getFaces() {
54768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimFaces;
55768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
56768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getElementCount() {
57768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mElementCount;
58768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
59768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
60768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    void calcElementCount() {
61768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        boolean hasLod = getLOD();
62768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int x = getX();
63768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int y = getY();
64768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int z = getZ();
65768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int faces = 1;
66768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(getFaces()) {
67768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            faces = 6;
68768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
69768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(x == 0) {
70768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            x = 1;
71768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
72768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(y == 0) {
73768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            y = 1;
74768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
75768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(z == 0) {
76768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            z = 1;
77768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
78768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
79768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int count = x * y * z * faces;
80768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(hasLod && (x > 1) && (y > 1) && (z > 1)) {
81768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(x > 1) {
82768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                x >>= 1;
83768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
84768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(y > 1) {
85768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                y >>= 1;
86768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
87768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(z > 1) {
88768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                z >>= 1;
89768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
90768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
91768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            count += x * y * z * faces;
92768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
93768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        mElementCount = count;
94768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
95768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
96768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
97b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    Type(int id, RenderScript rs) {
98b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        super(rs);
99b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        mID = id;
10043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams        mNativeCache = 0;
10143ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    }
10243ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
10343ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    protected void finalize() throws Throwable {
1041b52aae4d908fcf749e9a8d86bb0a33c70728c56Jason Sams        if(mNativeCache != 0) {
10543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams            mRS.nTypeFinalDestroy(this);
10643ee06857bb7f99446d1d84f8789016c5d105558Jason Sams            mNativeCache = 0;
10743ee06857bb7f99446d1d84f8789016c5d105558Jason Sams        }
10843ee06857bb7f99446d1d84f8789016c5d105558Jason Sams        super.finalize();
109b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
110b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
111fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams    public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
112b42315d37ab22e64ef88d3aed38ed75fd7071eedJason Sams        android.util.Log.e("RenderScript", "Calling depricated createFromClass");
113b42315d37ab22e64ef88d3aed38ed75fd7071eedJason Sams        return null;
11443ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    }
11543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
116fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams
117b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    public static class Builder {
118b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        RenderScript mRS;
11922534176fb5c1257130ef4ee589739ca42766a32Jason Sams        Entry[] mEntries;
12022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        int mEntryCount;
12122534176fb5c1257130ef4ee589739ca42766a32Jason Sams        Element mElement;
122b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
12322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        class Entry {
12422534176fb5c1257130ef4ee589739ca42766a32Jason Sams            Dimension mDim;
12522534176fb5c1257130ef4ee589739ca42766a32Jason Sams            int mValue;
126b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
127b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
12822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public Builder(RenderScript rs, Element e) {
1293c0dfbab807a459622aeade4940daddf482dec66Jason Sams            if(e.mID == 0) {
1303c0dfbab807a459622aeade4940daddf482dec66Jason Sams                throw new IllegalArgumentException("Invalid element.");
1313c0dfbab807a459622aeade4940daddf482dec66Jason Sams            }
1323c0dfbab807a459622aeade4940daddf482dec66Jason Sams
13322534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mRS = rs;
13422534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mEntries = new Entry[4];
13522534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mElement = e;
136b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
137b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
138b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        public void add(Dimension d, int value) {
1393c0dfbab807a459622aeade4940daddf482dec66Jason Sams            if(value < 1) {
1403c0dfbab807a459622aeade4940daddf482dec66Jason Sams                throw new IllegalArgumentException("Values of less than 1 for Dimensions are not valid.");
1413c0dfbab807a459622aeade4940daddf482dec66Jason Sams            }
14222534176fb5c1257130ef4ee589739ca42766a32Jason Sams            if(mEntries.length >= mEntryCount) {
14322534176fb5c1257130ef4ee589739ca42766a32Jason Sams                Entry[] en = new Entry[mEntryCount + 8];
144484d57f4355ab3979025beaddeb0cbecb1a5b81fRomain Guy                System.arraycopy(mEntries, 0, en, 0, mEntries.length);
14522534176fb5c1257130ef4ee589739ca42766a32Jason Sams                mEntries = en;
14622534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
14722534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mEntries[mEntryCount] = new Entry();
14822534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mEntries[mEntryCount].mDim = d;
14922534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mEntries[mEntryCount].mValue = value;
15022534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mEntryCount++;
15122534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
15222534176fb5c1257130ef4ee589739ca42766a32Jason Sams
15322534176fb5c1257130ef4ee589739ca42766a32Jason Sams        static synchronized Type internalCreate(RenderScript rs, Builder b) {
15422534176fb5c1257130ef4ee589739ca42766a32Jason Sams            rs.nTypeBegin(b.mElement.mID);
15522534176fb5c1257130ef4ee589739ca42766a32Jason Sams            for (int ct=0; ct < b.mEntryCount; ct++) {
15622534176fb5c1257130ef4ee589739ca42766a32Jason Sams                Entry en = b.mEntries[ct];
15722534176fb5c1257130ef4ee589739ca42766a32Jason Sams                rs.nTypeAdd(en.mDim.mID, en.mValue);
15822534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
15922534176fb5c1257130ef4ee589739ca42766a32Jason Sams            int id = rs.nTypeCreate();
16022534176fb5c1257130ef4ee589739ca42766a32Jason Sams            return new Type(id, rs);
161b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
162b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
163b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        public Type create() {
1641bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            Type t = internalCreate(mRS, this);
1651bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            t.mElement = mElement;
166768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
1671bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            for(int ct=0; ct < mEntryCount; ct++) {
168768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                if(mEntries[ct].mDim == Dimension.X) {
169768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                    t.mDimX = mEntries[ct].mValue;
170768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
171768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                if(mEntries[ct].mDim == Dimension.Y) {
172768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                    t.mDimY = mEntries[ct].mValue;
173768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
174768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                if(mEntries[ct].mDim == Dimension.Z) {
175768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                    t.mDimZ = mEntries[ct].mValue;
176768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
177768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                if(mEntries[ct].mDim == Dimension.LOD) {
178768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                    t.mDimLOD = mEntries[ct].mValue != 0;
179768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
180768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                if(mEntries[ct].mDim == Dimension.FACE) {
181768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                    t.mDimFaces = mEntries[ct].mValue != 0;
182768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
1831bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            }
184768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            t.calcElementCount();
1851bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            return t;
186b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
187b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
188b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
189b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams}
190