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