169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams/* 269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * Copyright (C) 2008 The Android Open Source Project 369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * 469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * Licensed under the Apache License, Version 2.0 (the "License"); 569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * you may not use this file except in compliance with the License. 669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * You may obtain a copy of the License at 769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * 869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * http://www.apache.org/licenses/LICENSE-2.0 969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * 1069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * Unless required by applicable law or agreed to in writing, software 1169f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * distributed under the License is distributed on an "AS IS" BASIS, 1269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 1369f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * See the License for the specific language governing permissions and 1469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams * limitations under the License. 1569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams */ 1669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams 1769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Samspackage android.renderscript; 1869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams 196b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liaoimport android.content.Context; 2069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Samsimport android.content.res.Resources; 21d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratoimport android.util.Log; 2269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams 236b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liaoimport java.io.File; 24d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratoimport java.io.IOException; 25d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratoimport java.io.InputStream; 26d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratoimport java.util.Map.Entry; 27d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratoimport java.util.HashMap; 2869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams 29f415cf2d78cb214b0a661e0f03905b4279656ea8Joe Onoratoimport java.lang.reflect.Field; 30f415cf2d78cb214b0a661e0f03905b4279656ea8Joe Onoratoimport java.lang.reflect.Modifier; 31f415cf2d78cb214b0a661e0f03905b4279656ea8Joe Onorato 3269f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams/** 33a23d4e792cb13090c540edfdd5cee03799bb9d48Jason Sams * 3469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams **/ 3569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Samspublic class ScriptC extends Script { 36f415cf2d78cb214b0a661e0f03905b4279656ea8Joe Onorato private static final String TAG = "ScriptC"; 37f415cf2d78cb214b0a661e0f03905b4279656ea8Joe Onorato 3867e3d206ca80dd97309ca63169503088cb509bdeJason Sams /** 3967e3d206ca80dd97309ca63169503088cb509bdeJason Sams * Only intended for use by the generated derived classes. 4067e3d206ca80dd97309ca63169503088cb509bdeJason Sams * 4167e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param id 4267e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param rs 4367e3d206ca80dd97309ca63169503088cb509bdeJason Sams */ 443ba02b3d2f6fb49677466a2e93c96f307d2a7a41Jason Sams protected ScriptC(int id, RenderScript rs) { 4569f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams super(id, rs); 4669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams } 4769f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams 4867e3d206ca80dd97309ca63169503088cb509bdeJason Sams /** 4967e3d206ca80dd97309ca63169503088cb509bdeJason Sams * Only intended for use by the generated derived classes. 5067e3d206ca80dd97309ca63169503088cb509bdeJason Sams * 5167e3d206ca80dd97309ca63169503088cb509bdeJason Sams * 5267e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param rs 5367e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param resources 5467e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param resourceID 5567e3d206ca80dd97309ca63169503088cb509bdeJason Sams */ 563ba02b3d2f6fb49677466a2e93c96f307d2a7a41Jason Sams protected ScriptC(RenderScript rs, Resources resources, int resourceID) { 572d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams super(0, rs); 5806d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams int id = internalCreate(rs, resources, resourceID); 59fdc54a97ee588bbd6c981a5708050fd97f01baecJason Sams if (id == 0) { 60fdc54a97ee588bbd6c981a5708050fd97f01baecJason Sams throw new RSRuntimeException("Loading of ScriptC script failed."); 61fdc54a97ee588bbd6c981a5708050fd97f01baecJason Sams } 6206d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams setID(id); 632d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 642d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams 652d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams 661de0b87168837cfcd9318bec5c97d2e7d78d3293Jason Sams private static synchronized int internalCreate(RenderScript rs, Resources resources, int resourceID) { 672d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams byte[] pgm; 682d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams int pgmLength; 692d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams InputStream is = resources.openRawResource(resourceID); 702d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams try { 712d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams try { 722d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams pgm = new byte[1024]; 732d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams pgmLength = 0; 742d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams while(true) { 752d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams int bytesLeft = pgm.length - pgmLength; 762d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams if (bytesLeft == 0) { 772d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams byte[] buf2 = new byte[pgm.length * 2]; 782d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams System.arraycopy(pgm, 0, buf2, 0, pgm.length); 792d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams pgm = buf2; 802d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams bytesLeft = pgm.length - pgmLength; 812d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 822d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams int bytesRead = is.read(pgm, pgmLength, bytesLeft); 832d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams if (bytesRead <= 0) { 842d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams break; 852d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 862d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams pgmLength += bytesRead; 872d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 882d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } finally { 892d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams is.close(); 902d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 912d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } catch(IOException e) { 922d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams throw new Resources.NotFoundException(); 932d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 942d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams 95eeca435dc6134a285b9bbb832cd6a1a88f34e85fShih-wei Liao // E.g, /system/apps/Fountain.apk 96e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams //String packageName = rs.getApplicationContext().getPackageResourcePath(); 97eeca435dc6134a285b9bbb832cd6a1a88f34e85fShih-wei Liao // For res/raw/fountain.bc, it wil be /com.android.fountain:raw/fountain 98ef72ff220c8bf6c8d7753f30ddaad89d4d8cada9Logan Chien String resName = resources.getResourceEntryName(resourceID); 996b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liao String cacheDir = rs.getApplicationContext().getCacheDir().toString(); 100eeca435dc6134a285b9bbb832cd6a1a88f34e85fShih-wei Liao 101eeca435dc6134a285b9bbb832cd6a1a88f34e85fShih-wei Liao Log.v(TAG, "Create script for resource = " + resName); 102e4a06c5fc738bf219f2a495e12a637b2d0871651Jason Sams return rs.nScriptCCreate(resName, cacheDir, pgm, pgmLength); 1032d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 10469f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams} 105