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