blob: b6b7adfc771a4b6aeb244839c5ef0b8420f70e2a [file] [log] [blame]
/*
* Copyright (C) 2008 The Android Open Source Project
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
package android.renderscript;
import java.lang.reflect.Field;
/**
* @hide
*
**/
public class Type extends BaseObj {
Dimension[] mDimensions;
int[] mValues;
Element mElement;
private int mNativeCache;
Class mJavaClass;
Type(int id, RenderScript rs) {
super(rs);
mID = id;
mNativeCache = 0;
}
protected void finalize() throws Throwable {
if(mNativeCache != 0) {
mRS.nTypeFinalDestroy(this);
mNativeCache = 0;
}
super.finalize();
}
public static Type createFromClass(RenderScript rs, Class c, int size) {
Element e = Element.createFromClass(rs, c);
Builder b = new Builder(rs, e);
b.add(Dimension.X, size);
Type t = b.create();
e.destroy();
// native fields
{
Field[] fields = c.getFields();
int[] arTypes = new int[fields.length];
int[] arBits = new int[fields.length];
for(int ct=0; ct < fields.length; ct++) {
Field f = fields[ct];
Class fc = f.getType();
if(fc == int.class) {
arTypes[ct] = Element.DataType.SIGNED.mID;
arBits[ct] = 32;
} else if(fc == short.class) {
arTypes[ct] = Element.DataType.SIGNED.mID;
arBits[ct] = 16;
} else if(fc == byte.class) {
arTypes[ct] = Element.DataType.SIGNED.mID;
arBits[ct] = 8;
} else if(fc == float.class) {
arTypes[ct] = Element.DataType.FLOAT.mID;
arBits[ct] = 32;
} else {
throw new IllegalArgumentException("Unkown field type");
}
}
rs.nTypeSetupFields(t, arTypes, arBits, fields);
}
t.mJavaClass = c;
return t;
}
public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) {
Type t = createFromClass(rs, c, size);
t.setName(scriptName);
return t;
}
public static class Builder {
RenderScript mRS;
Entry[] mEntries;
int mEntryCount;
Element mElement;
class Entry {
Dimension mDim;
int mValue;
}
public Builder(RenderScript rs, Element e) {
mRS = rs;
mEntries = new Entry[4];
mElement = e;
}
public void add(Dimension d, int value) {
if(mEntries.length >= mEntryCount) {
Entry[] en = new Entry[mEntryCount + 8];
System.arraycopy(mEntries, 0, en, 0, mEntries.length);
mEntries = en;
}
mEntries[mEntryCount] = new Entry();
mEntries[mEntryCount].mDim = d;
mEntries[mEntryCount].mValue = value;
mEntryCount++;
}
static synchronized Type internalCreate(RenderScript rs, Builder b) {
rs.nTypeBegin(b.mElement.mID);
for (int ct=0; ct < b.mEntryCount; ct++) {
Entry en = b.mEntries[ct];
rs.nTypeAdd(en.mDim.mID, en.mValue);
}
int id = rs.nTypeCreate();
return new Type(id, rs);
}
public Type create() {
Type t = internalCreate(mRS, this);
t.mElement = mElement;
t.mDimensions = new Dimension[mEntryCount];
t.mValues = new int[mEntryCount];
for(int ct=0; ct < mEntryCount; ct++) {
t.mDimensions[ct] = mEntries[ct].mDim;
t.mValues[ct] = mEntries[ct].mValue;
}
return t;
}
}
}