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