ScriptC.java revision 032b2c2c8a3cf2c55f6f08557f2648d799766c4e
145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/*
245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Copyright (C) 2012 The Android Open Source Project
345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Licensed under the Apache License, Version 2.0 (the "License");
545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * you may not use this file except in compliance with the License.
645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * You may obtain a copy of the License at
745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *      http://www.apache.org/licenses/LICENSE-2.0
945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams *
1045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * Unless required by applicable law or agreed to in writing, software
1145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * distributed under the License is distributed on an "AS IS" BASIS,
1245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
1345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * See the License for the specific language governing permissions and
1445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams * limitations under the License.
1545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams */
1645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1745d443665f5ce7efa934706a89883f0cc87f3513Jason Samspackage android.support.v8.renderscript;
1845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
1945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.Context;
2045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.content.res.Resources;
2145d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport android.util.Log;
2245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2345d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.io.File;
2445d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.io.IOException;
2545d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.io.InputStream;
2645d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.util.Map.Entry;
2745d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.util.HashMap;
2845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
2945d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.reflect.Field;
3045d443665f5ce7efa934706a89883f0cc87f3513Jason Samsimport java.lang.reflect.Modifier;
3145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
3245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams/**
33032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * The superclass for all user-defined scripts. This is only
34032b2c2c8a3cf2c55f6f08557f2648d799766c4eStephen Hines * intended to be used by the generated derived classes.
3545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams **/
3645d443665f5ce7efa934706a89883f0cc87f3513Jason Samspublic class ScriptC extends Script {
3745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    private static final String TAG = "ScriptC";
3845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
3945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
4045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by the generated derived classes.
4145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
4245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param id
4345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param rs
4445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
4545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    protected ScriptC(int id, RenderScript rs) {
4645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        super(id, rs);
4745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
4845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
4945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    /**
5045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * Only intended for use by the generated derived classes.
5145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
5245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     *
5345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param rs
5445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param resources
5545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     * @param resourceID
5645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams     */
5745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    protected ScriptC(RenderScript rs, Resources resources, int resourceID) {
5845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        super(0, rs);
59baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray
60baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        if (rs.isNative) {
61baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            RenderScriptThunker rst = (RenderScriptThunker)rs;
62baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            ScriptCThunker s = new ScriptCThunker(rst, resources, resourceID);
63baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            mT = s;
64baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray            return;
65baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray        }
66baf4b4a16ff2ab85653438b93db9af03d4375f2dTim Murray
6745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int id = internalCreate(rs, resources, resourceID);
6845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        if (id == 0) {
6945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new RSRuntimeException("Loading of ScriptC script failed.");
7045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
7145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        setID(id);
7245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
7345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
7445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
7545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    private static synchronized int internalCreate(RenderScript rs, Resources resources, int resourceID) {
7645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        byte[] pgm;
7745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        int pgmLength;
7845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        InputStream is = resources.openRawResource(resourceID);
7945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        try {
8045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            try {
8145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                pgm = new byte[1024];
8245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                pgmLength = 0;
8345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                while(true) {
8445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    int bytesLeft = pgm.length - pgmLength;
8545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if (bytesLeft == 0) {
8645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        byte[] buf2 = new byte[pgm.length * 2];
8745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        System.arraycopy(pgm, 0, buf2, 0, pgm.length);
8845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        pgm = buf2;
8945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        bytesLeft = pgm.length - pgmLength;
9045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
9145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    int bytesRead = is.read(pgm, pgmLength, bytesLeft);
9245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    if (bytesRead <= 0) {
9345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                        break;
9445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    }
9545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                    pgmLength += bytesRead;
9645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                }
9745d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            } finally {
9845d443665f5ce7efa934706a89883f0cc87f3513Jason Sams                is.close();
9945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            }
10045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        } catch(IOException e) {
10145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams            throw new Resources.NotFoundException();
10245d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        }
10345d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10445d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        String resName = resources.getResourceEntryName(resourceID);
10545d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        String cachePath = rs.getApplicationContext().getCacheDir().toString();
10645d443665f5ce7efa934706a89883f0cc87f3513Jason Sams
10790fbed82b44c96f1e51db4dacb00d2b3f6affbdfTim Murray        //        Log.v(TAG, "Create script for resource = " + resName + ", " + pgmLength + ", " + pgm);
10890fbed82b44c96f1e51db4dacb00d2b3f6affbdfTim Murray        //Log.v(TAG, " path = " + cachePath);
10945d443665f5ce7efa934706a89883f0cc87f3513Jason Sams        return rs.nScriptCCreate(resName, cachePath, pgm, pgmLength);
11045d443665f5ce7efa934706a89883f0cc87f3513Jason Sams    }
11145d443665f5ce7efa934706a89883f0cc87f3513Jason Sams}
112