Type.java revision 0de9444aa6c25d2c586e8204a6168d10e67376e0
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    private int mNativeCache;
37    Class mJavaClass;
38
39    public Element getElement() {
40        return mElement;
41    }
42
43    public int getX() {
44        return mDimX;
45    }
46    public int getY() {
47        return mDimY;
48    }
49    public int getZ() {
50        return mDimZ;
51    }
52    public boolean getLOD() {
53        return mDimLOD;
54    }
55    public boolean getFaces() {
56        return mDimFaces;
57    }
58    public int getElementCount() {
59        return mElementCount;
60    }
61
62    void calcElementCount() {
63        boolean hasLod = getLOD();
64        int x = getX();
65        int y = getY();
66        int z = getZ();
67        int faces = 1;
68        if(getFaces()) {
69            faces = 6;
70        }
71        if(x == 0) {
72            x = 1;
73        }
74        if(y == 0) {
75            y = 1;
76        }
77        if(z == 0) {
78            z = 1;
79        }
80
81        int count = x * y * z * faces;
82        if(hasLod && (x > 1) && (y > 1) && (z > 1)) {
83            if(x > 1) {
84                x >>= 1;
85            }
86            if(y > 1) {
87                y >>= 1;
88            }
89            if(z > 1) {
90                z >>= 1;
91            }
92
93            count += x * y * z * faces;
94        }
95        mElementCount = count;
96    }
97
98
99    Type(int id, RenderScript rs) {
100        super(id, rs);
101        mNativeCache = 0;
102    }
103
104    protected void finalize() throws Throwable {
105        if(mNativeCache != 0) {
106            mRS.nTypeFinalDestroy(this);
107            mNativeCache = 0;
108        }
109        super.finalize();
110    }
111
112    @Override
113    void updateFromNative() {
114        // We have 6 integer to obtain mDimX; mDimY; mDimZ;
115        // mDimLOD; mDimFaces; mElement;
116        int[] dataBuffer = new int[6];
117        mRS.nTypeGetNativeData(mID, dataBuffer);
118
119        mDimX = dataBuffer[0];
120        mDimY = dataBuffer[1];
121        mDimZ = dataBuffer[2];
122        mDimLOD = dataBuffer[3] == 1 ? true : false;
123        mDimFaces = dataBuffer[4] == 1 ? true : false;
124
125        int elementID = dataBuffer[5];
126        if(elementID != 0) {
127            mElement = new Element(elementID, mRS);
128            mElement.updateFromNative();
129        }
130        calcElementCount();
131    }
132
133    public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
134        android.util.Log.e("RenderScript", "Calling depricated createFromClass");
135        return null;
136    }
137
138
139    public static class Builder {
140        RenderScript mRS;
141        Entry[] mEntries;
142        int mEntryCount;
143        Element mElement;
144
145        class Entry {
146            Dimension mDim;
147            int mValue;
148        }
149
150        public Builder(RenderScript rs, Element e) {
151            if(e.mID == 0) {
152                throw new IllegalArgumentException("Invalid element.");
153            }
154
155            mRS = rs;
156            mEntries = new Entry[4];
157            mElement = e;
158        }
159
160        public void add(Dimension d, int value) {
161            if(value < 1) {
162                throw new IllegalArgumentException("Values of less than 1 for Dimensions are not valid.");
163            }
164            if(mEntries.length >= mEntryCount) {
165                Entry[] en = new Entry[mEntryCount + 8];
166                System.arraycopy(mEntries, 0, en, 0, mEntries.length);
167                mEntries = en;
168            }
169            mEntries[mEntryCount] = new Entry();
170            mEntries[mEntryCount].mDim = d;
171            mEntries[mEntryCount].mValue = value;
172            mEntryCount++;
173        }
174
175        static synchronized Type internalCreate(RenderScript rs, Builder b) {
176            rs.nTypeBegin(b.mElement.mID);
177            for (int ct=0; ct < b.mEntryCount; ct++) {
178                Entry en = b.mEntries[ct];
179                rs.nTypeAdd(en.mDim.mID, en.mValue);
180            }
181            int id = rs.nTypeCreate();
182            return new Type(id, rs);
183        }
184
185        public Type create() {
186            Type t = internalCreate(mRS, this);
187            t.mElement = mElement;
188
189            for(int ct=0; ct < mEntryCount; ct++) {
190                if(mEntries[ct].mDim == Dimension.X) {
191                    t.mDimX = mEntries[ct].mValue;
192                }
193                if(mEntries[ct].mDim == Dimension.Y) {
194                    t.mDimY = mEntries[ct].mValue;
195                }
196                if(mEntries[ct].mDim == Dimension.Z) {
197                    t.mDimZ = mEntries[ct].mValue;
198                }
199                if(mEntries[ct].mDim == Dimension.LOD) {
200                    t.mDimLOD = mEntries[ct].mValue != 0;
201                }
202                if(mEntries[ct].mDim == Dimension.FACE) {
203                    t.mDimFaces = mEntries[ct].mValue != 0;
204                }
205            }
206            t.calcElementCount();
207            return t;
208        }
209    }
210
211}
212