198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/* 298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Copyright (C) 2012 The Android Open Source Project 398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * you may not use this file except in compliance with the License. 698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * You may obtain a copy of the License at 798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * http://www.apache.org/licenses/LICENSE-2.0 998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 1098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Unless required by applicable law or agreed to in writing, software 1198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * See the License for the specific language governing permissions and 1498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * limitations under the License. 1598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 1698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 1798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspackage android.support.v8.renderscript; 1898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 1998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.content.Context; 2098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.content.res.Resources; 2198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport android.util.Log; 2298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 2398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.io.File; 2498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.io.IOException; 2598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.io.InputStream; 2698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.util.Map.Entry; 2798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.util.HashMap; 2898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 2998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.reflect.Field; 3098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samsimport java.lang.reflect.Modifier; 3198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 3298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams/** 3398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 3498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams **/ 3598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Samspublic class ScriptC extends Script { 3698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams private static final String TAG = "ScriptC"; 3798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 3898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 3998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Only intended for use by the generated derived classes. 4098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 4198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param id 4298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param rs 4398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 4498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams protected ScriptC(int id, RenderScript rs) { 4598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams super(id, rs); 4698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 4798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 4898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams /** 4998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * Only intended for use by the generated derived classes. 5098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 5198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * 5298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param rs 5398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param resources 5498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams * @param resourceID 5598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams */ 5698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams protected ScriptC(RenderScript rs, Resources resources, int resourceID) { 5798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams super(0, rs); 5898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams int id = internalCreate(rs, resources, resourceID); 5998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (id == 0) { 6098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new RSRuntimeException("Loading of ScriptC script failed."); 6198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 6298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams setID(id); 6398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 6498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 6598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 6698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams private static synchronized int internalCreate(RenderScript rs, Resources resources, int resourceID) { 6798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams byte[] pgm; 6898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams int pgmLength; 6998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams InputStream is = resources.openRawResource(resourceID); 7098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams try { 7198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams try { 7298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams pgm = new byte[1024]; 7398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams pgmLength = 0; 7498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams while(true) { 7598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams int bytesLeft = pgm.length - pgmLength; 7698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (bytesLeft == 0) { 7798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams byte[] buf2 = new byte[pgm.length * 2]; 7898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams System.arraycopy(pgm, 0, buf2, 0, pgm.length); 7998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams pgm = buf2; 8098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams bytesLeft = pgm.length - pgmLength; 8198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 8298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams int bytesRead = is.read(pgm, pgmLength, bytesLeft); 8398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams if (bytesRead <= 0) { 8498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams break; 8598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 8698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams pgmLength += bytesRead; 8798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 8898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } finally { 8998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams is.close(); 9098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 9198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } catch(IOException e) { 9298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams throw new Resources.NotFoundException(); 9398a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 9498a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 9598a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams String resName = resources.getResourceEntryName(resourceID); 9698a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams String cachePath = rs.getApplicationContext().getCacheDir().toString(); 9798a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams 9898a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Log.v(TAG, "Create script for resource = " + resName + ", " + pgmLength + ", " + pgm); 9998a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams Log.v(TAG, " path = " + cachePath); 10098a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams return rs.nScriptCCreate(resName, cachePath, pgm, pgmLength); 10198a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams } 10298a281354fe06d1f970d0521c9a08d9eb0aa1a45Jason Sams} 103