Type.java revision 3b9c52ab8c1ab240d2299358d01a8efbe392d111
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
19dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
2043ee06857bb7f99446d1d84f8789016c5d105558Jason Samsimport java.lang.reflect.Field;
21dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchoukimport android.util.Log;
2243ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
23b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/**
24b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * @hide
25b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams *
26b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams **/
27b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspublic class Type extends BaseObj {
28768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimX;
29768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimY;
30768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mDimZ;
31768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    boolean mDimLOD;
32768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    boolean mDimFaces;
33768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    int mElementCount;
341bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams    Element mElement;
35768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
3643ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    Class mJavaClass;
371bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
38e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    public Element getElement() {
39e17964e150e459bacced5658ae36fe1c56082e37Jason Sams        return mElement;
40e17964e150e459bacced5658ae36fe1c56082e37Jason Sams    }
411bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams
42768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getX() {
43768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimX;
44768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
45768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getY() {
46768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimY;
47768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
48768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getZ() {
49768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimZ;
50768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
51768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public boolean getLOD() {
52768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimLOD;
53768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
54768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public boolean getFaces() {
55768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mDimFaces;
56768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
57768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    public int getElementCount() {
58768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        return mElementCount;
59768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
60768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
61768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    void calcElementCount() {
62768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        boolean hasLod = getLOD();
63768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int x = getX();
64768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int y = getY();
65768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int z = getZ();
66768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int faces = 1;
67768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(getFaces()) {
68768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            faces = 6;
69768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
70768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(x == 0) {
71768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            x = 1;
72768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
73768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(y == 0) {
74768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            y = 1;
75768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
76768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(z == 0) {
77768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            z = 1;
78768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
79768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
80768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        int count = x * y * z * faces;
81768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        if(hasLod && (x > 1) && (y > 1) && (z > 1)) {
82768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(x > 1) {
83768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                x >>= 1;
84768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
85768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(y > 1) {
86768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                y >>= 1;
87768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
88768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            if(z > 1) {
89768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                z >>= 1;
90768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            }
91768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
92768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            count += x * y * z * faces;
93768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        }
94768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams        mElementCount = count;
95768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams    }
96768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
97768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
98b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    Type(int id, RenderScript rs) {
990de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk        super(id, rs);
10043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    }
10143ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
10243ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    protected void finalize() throws Throwable {
10343ee06857bb7f99446d1d84f8789016c5d105558Jason Sams        super.finalize();
104b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
105b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
106dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    @Override
107dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    void updateFromNative() {
108dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // We have 6 integer to obtain mDimX; mDimY; mDimZ;
109dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        // mDimLOD; mDimFaces; mElement;
110dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int[] dataBuffer = new int[6];
111dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mRS.nTypeGetNativeData(mID, dataBuffer);
112dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
113dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimX = dataBuffer[0];
114dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimY = dataBuffer[1];
115dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimZ = dataBuffer[2];
116dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimLOD = dataBuffer[3] == 1 ? true : false;
117dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        mDimFaces = dataBuffer[4] == 1 ? true : false;
118dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
119dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        int elementID = dataBuffer[5];
120dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        if(elementID != 0) {
1210de9444aa6c25d2c586e8204a6168d10e67376e0Alex Sakhartchouk            mElement = new Element(elementID, mRS);
122dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk            mElement.updateFromNative();
123dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        }
124dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk        calcElementCount();
125dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk    }
126dfac814c18f73dd7289f9927edca3e3b6ec6bc00Alex Sakhartchouk
127fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams    public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
128b42315d37ab22e64ef88d3aed38ed75fd7071eedJason Sams        android.util.Log.e("RenderScript", "Calling depricated createFromClass");
129b42315d37ab22e64ef88d3aed38ed75fd7071eedJason Sams        return null;
13043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams    }
13143ee06857bb7f99446d1d84f8789016c5d105558Jason Sams
132fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams
133b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    public static class Builder {
134b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        RenderScript mRS;
1353b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        Dimension[] mDimensions;
1363b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        int[] mDimensionValues;
13722534176fb5c1257130ef4ee589739ca42766a32Jason Sams        int mEntryCount;
13822534176fb5c1257130ef4ee589739ca42766a32Jason Sams        Element mElement;
139b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
14022534176fb5c1257130ef4ee589739ca42766a32Jason Sams        class Entry {
14122534176fb5c1257130ef4ee589739ca42766a32Jason Sams            Dimension mDim;
14222534176fb5c1257130ef4ee589739ca42766a32Jason Sams            int mValue;
143b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
144b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
14522534176fb5c1257130ef4ee589739ca42766a32Jason Sams        public Builder(RenderScript rs, Element e) {
1463c0dfbab807a459622aeade4940daddf482dec66Jason Sams            if(e.mID == 0) {
1473c0dfbab807a459622aeade4940daddf482dec66Jason Sams                throw new IllegalArgumentException("Invalid element.");
1483c0dfbab807a459622aeade4940daddf482dec66Jason Sams            }
1493c0dfbab807a459622aeade4940daddf482dec66Jason Sams
15022534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mRS = rs;
1513b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            mDimensions = new Dimension[4];
1523b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            mDimensionValues = new int[4];
15322534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mElement = e;
154b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
155b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
156b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        public void add(Dimension d, int value) {
1573c0dfbab807a459622aeade4940daddf482dec66Jason Sams            if(value < 1) {
1583c0dfbab807a459622aeade4940daddf482dec66Jason Sams                throw new IllegalArgumentException("Values of less than 1 for Dimensions are not valid.");
1593c0dfbab807a459622aeade4940daddf482dec66Jason Sams            }
1603b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            if(mDimensions.length >= mEntryCount) {
1613b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                Dimension[] dn = new Dimension[mEntryCount + 8];
1623b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                System.arraycopy(mDimensions, 0, dn, 0, mEntryCount);
1633b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                mDimensions = dn;
1643b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams
1653b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                int[] in = new int[mEntryCount + 8];
1663b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                System.arraycopy(mDimensionValues, 0, in, 0, mEntryCount);
1673b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                mDimensionValues = in;
16822534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
1693b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            mDimensions[mEntryCount] = d;
1703b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            mDimensionValues[mEntryCount] = value;
17122534176fb5c1257130ef4ee589739ca42766a32Jason Sams            mEntryCount++;
17222534176fb5c1257130ef4ee589739ca42766a32Jason Sams        }
17322534176fb5c1257130ef4ee589739ca42766a32Jason Sams
1743b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams        public Type create() {
1753b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            int dims[] = new int[mEntryCount];
1763b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            for (int ct=0; ct < mEntryCount; ct++) {
1773b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                dims[ct] = mDimensions[ct].mID;
17822534176fb5c1257130ef4ee589739ca42766a32Jason Sams            }
179b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
1803b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            int id = mRS.nTypeCreate(mElement.getID(), dims, mDimensionValues);
1813b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams            Type t = new Type(id, mRS);
1821bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            t.mElement = mElement;
183768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams
1841bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            for(int ct=0; ct < mEntryCount; ct++) {
1853b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                if(mDimensions[ct] == Dimension.X) {
1863b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                    t.mDimX = mDimensionValues[ct];
187768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
1883b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                if(mDimensions[ct] == Dimension.Y) {
1893b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                    t.mDimY = mDimensionValues[ct];
190768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
1913b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                if(mDimensions[ct] == Dimension.Z) {
1923b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                    t.mDimZ = mDimensionValues[ct];
193768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
1943b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                if(mDimensions[ct] == Dimension.LOD) {
1953b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                    t.mDimLOD = mDimensionValues[ct] != 0;
196768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
1973b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                if(mDimensions[ct] == Dimension.FACE) {
1983b9c52ab8c1ab240d2299358d01a8efbe392d111Jason Sams                    t.mDimFaces = mDimensionValues[ct] != 0;
199768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams                }
2001bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            }
201768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams            t.calcElementCount();
2021bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams            return t;
203b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams        }
204b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams    }
205b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams
206b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams}
207