1ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray/*
2ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * Copyright (C) 2013 The Android Open Source Project
3ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray *
4ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * Licensed under the Apache License, Version 2.0 (the "License");
5ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * you may not use this file except in compliance with the License.
6ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * You may obtain a copy of the License at
7ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray *
8ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray *      http://www.apache.org/licenses/LICENSE-2.0
9ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray *
10ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * Unless required by applicable law or agreed to in writing, software
11ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * distributed under the License is distributed on an "AS IS" BASIS,
12ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * See the License for the specific language governing permissions and
14ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray * limitations under the License.
15ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray */
16ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
17ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murraypackage android.support.v8.renderscript;
18ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
19179158fa990160cf3f309f6a87a039e71ab664e8Tim Murrayimport java.lang.reflect.Field;
20179158fa990160cf3f309f6a87a039e71ab664e8Tim Murrayimport java.lang.reflect.Method;
21179158fa990160cf3f309f6a87a039e71ab664e8Tim Murray
22ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.content.Context;
23ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.content.pm.ApplicationInfo;
24ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.content.pm.PackageManager;
25ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.content.res.AssetManager;
26ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.os.Process;
27ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.util.Log;
28ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayimport android.view.Surface;
29ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
30ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
31ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
32ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murrayclass RenderScriptThunker extends RenderScript {
33ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    android.renderscript.RenderScript mN;
34ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
35ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    void validate() {
36ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        if (mN == null) {
37ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray            throw new RSInvalidStateException("Calling RS with no Context active.");
38ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        }
39ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
40ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
41ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    public void setPriority(Priority p) {
42d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        try {
43d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            if (p == Priority.LOW) mN.setPriority(android.renderscript.RenderScript.Priority.LOW);
44d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            if (p == Priority.NORMAL) mN.setPriority(android.renderscript.RenderScript.Priority.NORMAL);
45d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        } catch (android.renderscript.RSRuntimeException e) {
46d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            throw ExceptionThunker.convertException(e);
47d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        }
48ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
49ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
50ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    RenderScriptThunker(Context ctx) {
51ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        super(ctx);
52ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray        isNative = true;
53ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
54ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
55ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    public static RenderScript create(Context ctx, int sdkVersion) {
56d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        try {
57d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            RenderScriptThunker rs = new RenderScriptThunker(ctx);
58179158fa990160cf3f309f6a87a039e71ab664e8Tim Murray            Class<?> javaRS = Class.forName("android.renderscript.RenderScript");
59179158fa990160cf3f309f6a87a039e71ab664e8Tim Murray            Class[] signature = {Context.class, Integer.TYPE};
60179158fa990160cf3f309f6a87a039e71ab664e8Tim Murray            Object[] args = {ctx, new Integer(sdkVersion)};
61179158fa990160cf3f309f6a87a039e71ab664e8Tim Murray            Method create = javaRS.getDeclaredMethod("create", signature);
62179158fa990160cf3f309f6a87a039e71ab664e8Tim Murray            rs.mN = (android.renderscript.RenderScript)create.invoke(null, args);
63d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            return rs;
64d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        }
65d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        catch(android.renderscript.RSRuntimeException e) {
66d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            throw ExceptionThunker.convertException(e);
67179158fa990160cf3f309f6a87a039e71ab664e8Tim Murray        } catch (Exception e) {
68179158fa990160cf3f309f6a87a039e71ab664e8Tim Murray            throw new RSRuntimeException("Failure to create platform RenderScript context");
69d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        }
70ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
71ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
72ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    public void contextDump() {
73d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        try {
74d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            mN.contextDump();
75d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        } catch (android.renderscript.RSRuntimeException e) {
76d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            throw ExceptionThunker.convertException(e);
77d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        }
78ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
79ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
80ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    public void finish() {
81d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        try {
82d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            mN.finish();
83d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        } catch (android.renderscript.RSRuntimeException e) {
84d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            throw ExceptionThunker.convertException(e);
85d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        }
86ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
87ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray
88ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    public void destroy() {
89d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        try {
90d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            mN.destroy();
91d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            mN = null;
92d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        } catch (android.renderscript.RSRuntimeException e) {
93d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray            throw ExceptionThunker.convertException(e);
94d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray        }
95d1107f953974cf7a6c8bdf43e898d2f1f74427e6Tim Murray
96ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray    }
97eeb3042428fbe3a3cace554d3aca43b324904ad1Tim Murray
988b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray    public void setMessageHandler(RSMessageHandler msg) {
998b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray        mMessageCallback = msg;
1008b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray        try {
1018b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray            android.renderscript.RenderScript.RSMessageHandler handler =
1028b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                new android.renderscript.RenderScript.RSMessageHandler() {
1038b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                    public void run() {
1048b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                        mMessageCallback.mData = mData;
1058b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                        mMessageCallback.mID = mID;
1068b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                        mMessageCallback.mLength = mLength;
1078b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                        mMessageCallback.run();
1088b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                    }
1098b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                };
1108b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray            mN.setMessageHandler(handler);
1118b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray        } catch (android.renderscript.RSRuntimeException e) {
1128b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray            throw ExceptionThunker.convertException(e);
1138b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray        }
1148b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray    }
1158b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray
1168b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray    public void setErrorHandler(RSErrorHandler msg) {
1178b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray        mErrorCallback = msg;
1188b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray        try {
1198b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray            android.renderscript.RenderScript.RSErrorHandler handler =
1208b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                new android.renderscript.RenderScript.RSErrorHandler() {
1218b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                    public void run() {
1228b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                        mErrorCallback.mErrorMessage = mErrorMessage;
1238b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                        mErrorCallback.mErrorNum = mErrorNum;
1248b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                        mErrorCallback.run();
1258b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                    }
1268b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray                };
1278b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray            mN.setErrorHandler(handler);
1288b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray        } catch (android.renderscript.RSRuntimeException e) {
1298b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray            throw ExceptionThunker.convertException(e);
1308b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray        }
1318b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray    }
1328b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray
1338b33529b03912efab1aedd30ca5bd818ddbe3713Tim Murray
134eeb3042428fbe3a3cace554d3aca43b324904ad1Tim Murray    boolean equals(Object obj1, Object obj2) {
135eeb3042428fbe3a3cace554d3aca43b324904ad1Tim Murray        if (obj2 instanceof android.support.v8.renderscript.BaseObj) {
136eeb3042428fbe3a3cace554d3aca43b324904ad1Tim Murray            return ((android.renderscript.BaseObj)obj1).equals(((android.support.v8.renderscript.BaseObj)obj2).getNObj());
137eeb3042428fbe3a3cace554d3aca43b324904ad1Tim Murray        }
138eeb3042428fbe3a3cace554d3aca43b324904ad1Tim Murray        return false;
139eeb3042428fbe3a3cace554d3aca43b324904ad1Tim Murray    }
140ce8b0e674c93035013d1c33aaabc9bb6ceffde0fTim Murray}
141