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 1969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Samsimport android.content.res.Resources; 2069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams 216b32fab1dbfd8bc1cc176557fe0a7b2ebd4966bdShih-wei Liaoimport java.io.File; 22d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratoimport java.io.IOException; 23d7b3774da62d3c70cc7e8cf549967a1c823501e6Joe Onoratoimport java.io.InputStream; 24f415cf2d78cb214b0a661e0f03905b4279656ea8Joe Onorato 259c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines/** 26c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * The superclass for all user-defined scripts. This is only 27c11e25c4e653124def1fb18e203b894f42106cbeTim Murray * intended to be used by the generated derived classes. 2869f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams **/ 2969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Samspublic class ScriptC extends Script { 30f415cf2d78cb214b0a661e0f03905b4279656ea8Joe Onorato private static final String TAG = "ScriptC"; 31f415cf2d78cb214b0a661e0f03905b4279656ea8Joe Onorato 329c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 3367e3d206ca80dd97309ca63169503088cb509bdeJason Sams * Only intended for use by the generated derived classes. 3467e3d206ca80dd97309ca63169503088cb509bdeJason Sams * 3567e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param id 3667e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param rs 3767e3d206ca80dd97309ca63169503088cb509bdeJason Sams */ 383ba02b3d2f6fb49677466a2e93c96f307d2a7a41Jason Sams protected ScriptC(int id, RenderScript rs) { 3969f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams super(id, rs); 4069f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams } 410e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat /** 420e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat * Only intended for use by the generated derived classes. 430e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat * 440e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat * @param id 450e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat * @param rs 460e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat * 470e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat */ 480e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat protected ScriptC(long id, RenderScript rs) { 490e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat super(id, rs); 500e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat } 519c9ad3f8c218954e46aab81f9af7834cea5675caStephen Hines /** 5267e3d206ca80dd97309ca63169503088cb509bdeJason Sams * Only intended for use by the generated derived classes. 5367e3d206ca80dd97309ca63169503088cb509bdeJason Sams * 5467e3d206ca80dd97309ca63169503088cb509bdeJason Sams * 5567e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param rs 5667e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param resources 5767e3d206ca80dd97309ca63169503088cb509bdeJason Sams * @param resourceID 5867e3d206ca80dd97309ca63169503088cb509bdeJason Sams */ 593ba02b3d2f6fb49677466a2e93c96f307d2a7a41Jason Sams protected ScriptC(RenderScript rs, Resources resources, int resourceID) { 602d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams super(0, rs); 610e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat long id = internalCreate(rs, resources, resourceID); 62fdc54a97ee588bbd6c981a5708050fd97f01baecJason Sams if (id == 0) { 63fdc54a97ee588bbd6c981a5708050fd97f01baecJason Sams throw new RSRuntimeException("Loading of ScriptC script failed."); 64fdc54a97ee588bbd6c981a5708050fd97f01baecJason Sams } 6506d69de78845659e6904ae4964e606a7f1a6a4a8Jason Sams setID(id); 662d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 672d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams 687d25a829d3da96fb6ac0d285aa1bfb2022271beeStephen Hines /** 6956f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray * Only intended for use by the generated derived classes. 7056f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray * 7156f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray * @param rs 7256f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray */ 7356f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray protected ScriptC(RenderScript rs, String resName, byte[] bitcode32, byte[] bitcode64) { 7456f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray super(0, rs); 7556f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray long id = 0; 7656f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray if (RenderScript.sPointerSize == 4) { 7756f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray id = internalStringCreate(rs, resName, bitcode32); 7856f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray } else { 7956f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray id = internalStringCreate(rs, resName, bitcode64); 8056f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray } 8156f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray if (id == 0) { 8256f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray throw new RSRuntimeException("Loading of ScriptC script failed."); 8356f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray } 8456f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray setID(id); 8556f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray } 8656f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray 870e0c0885aed99a119052a792becb5a0c5a93632dAshok Bhat private static synchronized long internalCreate(RenderScript rs, Resources resources, int resourceID) { 882d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams byte[] pgm; 892d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams int pgmLength; 902d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams InputStream is = resources.openRawResource(resourceID); 912d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams try { 922d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams try { 932d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams pgm = new byte[1024]; 942d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams pgmLength = 0; 952d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams while(true) { 962d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams int bytesLeft = pgm.length - pgmLength; 972d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams if (bytesLeft == 0) { 982d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams byte[] buf2 = new byte[pgm.length * 2]; 992d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams System.arraycopy(pgm, 0, buf2, 0, pgm.length); 1002d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams pgm = buf2; 1012d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams bytesLeft = pgm.length - pgmLength; 1022d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 1032d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams int bytesRead = is.read(pgm, pgmLength, bytesLeft); 1042d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams if (bytesRead <= 0) { 1052d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams break; 1062d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 1072d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams pgmLength += bytesRead; 1082d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 1092d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } finally { 1102d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams is.close(); 1112d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 1122d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } catch(IOException e) { 1132d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams throw new Resources.NotFoundException(); 1142d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 1152d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams 116ef72ff220c8bf6c8d7753f30ddaad89d4d8cada9Logan Chien String resName = resources.getResourceEntryName(resourceID); 117eeca435dc6134a285b9bbb832cd6a1a88f34e85fShih-wei Liao 118da67debe22159fdf0bbeca6340766ebe2b8e67a3Tim Murray // Log.v(TAG, "Create script for resource = " + resName); 11915fcf61dc0f1206b8eb562df8984035a599d290aYang Ni return rs.nScriptCCreate(resName, RenderScript.getCachePath(), pgm, pgmLength); 1202d71bc7b4c46a32cead32a35e6e137d13e8315eaJason Sams } 12156f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray 12256f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray private static synchronized long internalStringCreate(RenderScript rs, String resName, byte[] bitcode) { 12356f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray // Log.v(TAG, "Create script for resource = " + resName); 12415fcf61dc0f1206b8eb562df8984035a599d290aYang Ni return rs.nScriptCCreate(resName, RenderScript.getCachePath(), bitcode, bitcode.length); 12556f9e6f8d5436d50530807950661e66ca5efe2bbTim Murray } 12669f0d31e576c0110c2cbbafc3b9bd46e73fc1afcJason Sams} 127