Type.java revision b42315d37ab22e64ef88d3aed38ed75fd7071eed
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 1943ee06857bb7f99446d1d84f8789016c5d105558Jason Samsimport java.lang.reflect.Field; 2043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams 21b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams/** 22b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * @hide 23b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams * 24b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams **/ 25b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Samspublic class Type extends BaseObj { 26768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int mDimX; 27768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int mDimY; 28768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int mDimZ; 29768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams boolean mDimLOD; 30768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams boolean mDimFaces; 31768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int mElementCount; 321bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams Element mElement; 33768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 3443ee06857bb7f99446d1d84f8789016c5d105558Jason Sams private int mNativeCache; 3543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams Class mJavaClass; 361bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 37e17964e150e459bacced5658ae36fe1c56082e37Jason Sams public Element getElement() { 38e17964e150e459bacced5658ae36fe1c56082e37Jason Sams return mElement; 39e17964e150e459bacced5658ae36fe1c56082e37Jason Sams } 401bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams 41768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public int getX() { 42768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mDimX; 43768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 44768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public int getY() { 45768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mDimY; 46768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 47768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public int getZ() { 48768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mDimZ; 49768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 50768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public boolean getLOD() { 51768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mDimLOD; 52768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 53768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public boolean getFaces() { 54768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mDimFaces; 55768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 56768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams public int getElementCount() { 57768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams return mElementCount; 58768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 59768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 60768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams void calcElementCount() { 61768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams boolean hasLod = getLOD(); 62768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int x = getX(); 63768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int y = getY(); 64768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int z = getZ(); 65768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int faces = 1; 66768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(getFaces()) { 67768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams faces = 6; 68768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 69768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(x == 0) { 70768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams x = 1; 71768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 72768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(y == 0) { 73768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams y = 1; 74768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 75768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(z == 0) { 76768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams z = 1; 77768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 78768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 79768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams int count = x * y * z * faces; 80768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(hasLod && (x > 1) && (y > 1) && (z > 1)) { 81768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(x > 1) { 82768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams x >>= 1; 83768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 84768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(y > 1) { 85768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams y >>= 1; 86768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 87768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(z > 1) { 88768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams z >>= 1; 89768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 90768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 91768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams count += x * y * z * faces; 92768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 93768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams mElementCount = count; 94768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 95768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 96768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 97b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams Type(int id, RenderScript rs) { 98b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams super(rs); 99b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams mID = id; 10043ee06857bb7f99446d1d84f8789016c5d105558Jason Sams mNativeCache = 0; 10143ee06857bb7f99446d1d84f8789016c5d105558Jason Sams } 10243ee06857bb7f99446d1d84f8789016c5d105558Jason Sams 10343ee06857bb7f99446d1d84f8789016c5d105558Jason Sams protected void finalize() throws Throwable { 1041b52aae4d908fcf749e9a8d86bb0a33c70728c56Jason Sams if(mNativeCache != 0) { 10543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams mRS.nTypeFinalDestroy(this); 10643ee06857bb7f99446d1d84f8789016c5d105558Jason Sams mNativeCache = 0; 10743ee06857bb7f99446d1d84f8789016c5d105558Jason Sams } 10843ee06857bb7f99446d1d84f8789016c5d105558Jason Sams super.finalize(); 109b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 110b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 111fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams public static Type createFromClass(RenderScript rs, Class c, int size, String scriptName) { 112b42315d37ab22e64ef88d3aed38ed75fd7071eedJason Sams android.util.Log.e("RenderScript", "Calling depricated createFromClass"); 113b42315d37ab22e64ef88d3aed38ed75fd7071eedJason Sams return null; 11443ee06857bb7f99446d1d84f8789016c5d105558Jason Sams } 11543ee06857bb7f99446d1d84f8789016c5d105558Jason Sams 116fbf0b9ecda03fbdbd4ebabfd18da09a789686249Jason Sams 117b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public static class Builder { 118b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams RenderScript mRS; 11922534176fb5c1257130ef4ee589739ca42766a32Jason Sams Entry[] mEntries; 12022534176fb5c1257130ef4ee589739ca42766a32Jason Sams int mEntryCount; 12122534176fb5c1257130ef4ee589739ca42766a32Jason Sams Element mElement; 122b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 12322534176fb5c1257130ef4ee589739ca42766a32Jason Sams class Entry { 12422534176fb5c1257130ef4ee589739ca42766a32Jason Sams Dimension mDim; 12522534176fb5c1257130ef4ee589739ca42766a32Jason Sams int mValue; 126b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 127b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 12822534176fb5c1257130ef4ee589739ca42766a32Jason Sams public Builder(RenderScript rs, Element e) { 1293c0dfbab807a459622aeade4940daddf482dec66Jason Sams if(e.mID == 0) { 1303c0dfbab807a459622aeade4940daddf482dec66Jason Sams throw new IllegalArgumentException("Invalid element."); 1313c0dfbab807a459622aeade4940daddf482dec66Jason Sams } 1323c0dfbab807a459622aeade4940daddf482dec66Jason Sams 13322534176fb5c1257130ef4ee589739ca42766a32Jason Sams mRS = rs; 13422534176fb5c1257130ef4ee589739ca42766a32Jason Sams mEntries = new Entry[4]; 13522534176fb5c1257130ef4ee589739ca42766a32Jason Sams mElement = e; 136b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 137b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 138b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public void add(Dimension d, int value) { 1393c0dfbab807a459622aeade4940daddf482dec66Jason Sams if(value < 1) { 1403c0dfbab807a459622aeade4940daddf482dec66Jason Sams throw new IllegalArgumentException("Values of less than 1 for Dimensions are not valid."); 1413c0dfbab807a459622aeade4940daddf482dec66Jason Sams } 14222534176fb5c1257130ef4ee589739ca42766a32Jason Sams if(mEntries.length >= mEntryCount) { 14322534176fb5c1257130ef4ee589739ca42766a32Jason Sams Entry[] en = new Entry[mEntryCount + 8]; 144484d57f4355ab3979025beaddeb0cbecb1a5b81fRomain Guy System.arraycopy(mEntries, 0, en, 0, mEntries.length); 14522534176fb5c1257130ef4ee589739ca42766a32Jason Sams mEntries = en; 14622534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 14722534176fb5c1257130ef4ee589739ca42766a32Jason Sams mEntries[mEntryCount] = new Entry(); 14822534176fb5c1257130ef4ee589739ca42766a32Jason Sams mEntries[mEntryCount].mDim = d; 14922534176fb5c1257130ef4ee589739ca42766a32Jason Sams mEntries[mEntryCount].mValue = value; 15022534176fb5c1257130ef4ee589739ca42766a32Jason Sams mEntryCount++; 15122534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 15222534176fb5c1257130ef4ee589739ca42766a32Jason Sams 15322534176fb5c1257130ef4ee589739ca42766a32Jason Sams static synchronized Type internalCreate(RenderScript rs, Builder b) { 15422534176fb5c1257130ef4ee589739ca42766a32Jason Sams rs.nTypeBegin(b.mElement.mID); 15522534176fb5c1257130ef4ee589739ca42766a32Jason Sams for (int ct=0; ct < b.mEntryCount; ct++) { 15622534176fb5c1257130ef4ee589739ca42766a32Jason Sams Entry en = b.mEntries[ct]; 15722534176fb5c1257130ef4ee589739ca42766a32Jason Sams rs.nTypeAdd(en.mDim.mID, en.mValue); 15822534176fb5c1257130ef4ee589739ca42766a32Jason Sams } 15922534176fb5c1257130ef4ee589739ca42766a32Jason Sams int id = rs.nTypeCreate(); 16022534176fb5c1257130ef4ee589739ca42766a32Jason Sams return new Type(id, rs); 161b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 162b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 163b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams public Type create() { 1641bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams Type t = internalCreate(mRS, this); 1651bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams t.mElement = mElement; 166768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams 1671bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams for(int ct=0; ct < mEntryCount; ct++) { 168768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(mEntries[ct].mDim == Dimension.X) { 169768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams t.mDimX = mEntries[ct].mValue; 170768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 171768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(mEntries[ct].mDim == Dimension.Y) { 172768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams t.mDimY = mEntries[ct].mValue; 173768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 174768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(mEntries[ct].mDim == Dimension.Z) { 175768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams t.mDimZ = mEntries[ct].mValue; 176768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 177768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(mEntries[ct].mDim == Dimension.LOD) { 178768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams t.mDimLOD = mEntries[ct].mValue != 0; 179768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 180768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams if(mEntries[ct].mDim == Dimension.FACE) { 181768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams t.mDimFaces = mEntries[ct].mValue != 0; 182768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams } 1831bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams } 184768bc02d815a94ad29146f1ed60c847d1af118ccJason Sams t.calcElementCount(); 1851bada8cd6e4f340de93cff4a2439835fc3b1456cJason Sams return t; 186b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 187b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams } 188b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams 189b8c5a84e7c23746a3fc26013e0880d3d95ca6588Jason Sams} 190