ScriptC.java revision 032b2c2c8a3cf2c55f6f08557f2648d799766c4e
145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/* 245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Copyright (C) 2012 The Android Open Source Project 345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * you may not use this file except in compliance with the License. 645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * You may obtain a copy of the License at 745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 1045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Unless required by applicable law or agreed to in writing, software 1145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * See the License for the specific language governing permissions and 1445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * limitations under the License. 1545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 1645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 1745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspackage android.support.v8.renderscript; 1845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 1945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.Context; 2045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.res.Resources; 2145d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log; 2245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 2345d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.io.File; 2445d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.io.IOException; 2545d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.io.InputStream; 2645d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.util.Map.Entry; 2745d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.util.HashMap; 2845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 2945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.reflect.Field; 3045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.reflect.Modifier; 3145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 3245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/** 33032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * The superclass for all user-defined scripts. This is only 34032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * intended to be used by the generated derived classes. 3545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/ 3645d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class ScriptC extends Script { 3745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams private static final String TAG = "ScriptC"; 3845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 3945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 4045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Only intended for use by the generated derived classes. 4145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 4245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param id 4345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rs 4445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 4545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams protected ScriptC(int id, RenderScript rs) { 4645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams super(id, rs); 4745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 4845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 4945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams /** 5045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Only intended for use by the generated derived classes. 5145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 5245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * 5345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param rs 5445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param resources 5545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * @param resourceID 5645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */ 5745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams protected ScriptC(RenderScript rs, Resources resources, int resourceID) { 5845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams super(0, rs); 59baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray 60baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray if (rs.isNative) { 61baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray RenderScriptThunker rst = (RenderScriptThunker)rs; 62baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray ScriptCThunker s = new ScriptCThunker(rst, resources, resourceID); 63baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray mT = s; 64baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray return; 65baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray } 66baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray 6745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int id = internalCreate(rs, resources, resourceID); 6845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (id == 0) { 6945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new RSRuntimeException("Loading of ScriptC script failed."); 7045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 7145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams setID(id); 7245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 7345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 7445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 7545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams private static synchronized int internalCreate(RenderScript rs, Resources resources, int resourceID) { 7645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams byte[] pgm; 7745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int pgmLength; 7845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams InputStream is = resources.openRawResource(resourceID); 7945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams try { 8045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams try { 8145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams pgm = new byte[1024]; 8245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams pgmLength = 0; 8345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams while(true) { 8445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int bytesLeft = pgm.length - pgmLength; 8545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (bytesLeft == 0) { 8645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams byte[] buf2 = new byte[pgm.length * 2]; 8745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams System.arraycopy(pgm, 0, buf2, 0, pgm.length); 8845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams pgm = buf2; 8945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams bytesLeft = pgm.length - pgmLength; 9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams int bytesRead = is.read(pgm, pgmLength, bytesLeft); 9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams if (bytesRead <= 0) { 9345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams break; 9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams pgmLength += bytesRead; 9645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 9745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } finally { 9845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams is.close(); 9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 10045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } catch(IOException e) { 10145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams throw new Resources.NotFoundException(); 10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams String resName = resources.getResourceEntryName(resourceID); 10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams String cachePath = rs.getApplicationContext().getCacheDir().toString(); 10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams 10790fbed82b44c96f1e51db4dacb00d2b3f6affbdfTim Murray // Log.v(TAG, "Create script for resource = " + resName + ", " + pgmLength + ", " + pgm); 10890fbed82b44c96f1e51db4dacb00d2b3f6affbdfTim Murray //Log.v(TAG, " path = " + cachePath); 10945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams return rs.nScriptCCreate(resName, cachePath, pgm, pgmLength); 11045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams } 11145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams} 112