Type.java revision e447a786357c91d7c48f2475605e692de5b12da1
1/*
2 * Copyright (C) 2008 The Android Open Source Project
3 *
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
7 *
8 *      http://www.apache.org/licenses/LICENSE-2.0
9 *
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
15 */
16
17package android.renderscript;
18
19
20import java.lang.reflect.Field;
21import android.util.Log;
22
23/**
24 * @hide
25 *
26 **/
27public class Type extends BaseObj {
28    int mDimX;
29    int mDimY;
30    int mDimZ;
31    boolean mDimLOD;
32    boolean mDimFaces;
33    int mElementCount;
34    Element mElement;
35
36    Class mJavaClass;
37
38    public Element getElement() {
39        return mElement;
40    }
41
42    public int getX() {
43        return mDimX;
44    }
45    public int getY() {
46        return mDimY;
47    }
48    public int getZ() {
49        return mDimZ;
50    }
51    public boolean getLOD() {
52        return mDimLOD;
53    }
54    public boolean getFaces() {
55        return mDimFaces;
56    }
57    public int getElementCount() {
58        return mElementCount;
59    }
60
61    void calcElementCount() {
62        boolean hasLod = getLOD();
63        int x = getX();
64        int y = getY();
65        int z = getZ();
66        int faces = 1;
67        if(getFaces()) {
68            faces = 6;
69        }
70        if(x == 0) {
71            x = 1;
72        }
73        if(y == 0) {
74            y = 1;
75        }
76        if(z == 0) {
77            z = 1;
78        }
79
80        int count = x * y * z * faces;
81        if(hasLod && (x > 1) && (y > 1) && (z > 1)) {
82            if(x > 1) {
83                x >>= 1;
84            }
85            if(y > 1) {
86                y >>= 1;
87            }
88            if(z > 1) {
89                z >>= 1;
90            }
91
92            count += x * y * z * faces;
93        }
94        mElementCount = count;
95    }
96
97
98    Type(int id, RenderScript rs) {
99        super(id, rs);
100    }
101
102    protected void finalize() throws Throwable {
103        super.finalize();
104    }
105
106    @Override
107    void updateFromNative() {
108        // We have 6 integer to obtain mDimX; mDimY; mDimZ;
109        // mDimLOD; mDimFaces; mElement;
110        int[] dataBuffer = new int[6];
111        mRS.nTypeGetNativeData(mID, dataBuffer);
112
113        mDimX = dataBuffer[0];
114        mDimY = dataBuffer[1];
115        mDimZ = dataBuffer[2];
116        mDimLOD = dataBuffer[3] == 1 ? true : false;
117        mDimFaces = dataBuffer[4] == 1 ? true : false;
118
119        int elementID = dataBuffer[5];
120        if(elementID != 0) {
121            mElement = new Element(elementID, mRS);
122            mElement.updateFromNative();
123        }
124        calcElementCount();
125    }
126
127    public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
128        android.util.Log.e("RenderScript", "Calling depricated createFromClass");
129        return null;
130    }
131
132
133    public static class Builder {
134        RenderScript mRS;
135        Entry[] mEntries;
136        int mEntryCount;
137        Element mElement;
138
139        class Entry {
140            Dimension mDim;
141            int mValue;
142        }
143
144        public Builder(RenderScript rs, Element e) {
145            if(e.mID == 0) {
146                throw new IllegalArgumentException("Invalid element.");
147            }
148
149            mRS = rs;
150            mEntries = new Entry[4];
151            mElement = e;
152        }
153
154        public void add(Dimension d, int value) {
155            if(value < 1) {
156                throw new IllegalArgumentException("Values of less than 1 for Dimensions are not valid.");
157            }
158            if(mEntries.length >= mEntryCount) {
159                Entry[] en = new Entry[mEntryCount + 8];
160                System.arraycopy(mEntries, 0, en, 0, mEntries.length);
161                mEntries = en;
162            }
163            mEntries[mEntryCount] = new Entry();
164            mEntries[mEntryCount].mDim = d;
165            mEntries[mEntryCount].mValue = value;
166            mEntryCount++;
167        }
168
169        static synchronized Type internalCreate(RenderScript rs, Builder b) {
170            rs.nTypeBegin(b.mElement.mID);
171            for (int ct=0; ct < b.mEntryCount; ct++) {
172                Entry en = b.mEntries[ct];
173                rs.nTypeAdd(en.mDim.mID, en.mValue);
174            }
175            int id = rs.nTypeCreate();
176            return new Type(id, rs);
177        }
178
179        public Type create() {
180            Type t = internalCreate(mRS, this);
181            t.mElement = mElement;
182
183            for(int ct=0; ct < mEntryCount; ct++) {
184                if(mEntries[ct].mDim == Dimension.X) {
185                    t.mDimX = mEntries[ct].mValue;
186                }
187                if(mEntries[ct].mDim == Dimension.Y) {
188                    t.mDimY = mEntries[ct].mValue;
189                }
190                if(mEntries[ct].mDim == Dimension.Z) {
191                    t.mDimZ = mEntries[ct].mValue;
192                }
193                if(mEntries[ct].mDim == Dimension.LOD) {
194                    t.mDimLOD = mEntries[ct].mValue != 0;
195                }
196                if(mEntries[ct].mDim == Dimension.FACE) {
197                    t.mDimFaces = mEntries[ct].mValue != 0;
198                }
199            }
200            t.calcElementCount();
201            return t;
202        }
203    }
204
205}
206