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