1/*
2**
3** Copyright 2009, The Android Open Source Project
4**
5** Licensed under the Apache License, Version 2.0 (the "License");
6** you may not use this file except in compliance with the License.
7** You may obtain a copy of the License at
8**
9**     http://www.apache.org/licenses/LICENSE-2.0
10**
11** Unless required by applicable law or agreed to in writing, software
12** distributed under the License is distributed on an "AS IS" BASIS,
13** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14** See the License for the specific language governing permissions and
15** limitations under the License.
16*/
17
18// This source file is automatically generated
19
20#include "jni.h"
21#include "JNIHelp.h"
22#include <android_runtime/AndroidRuntime.h>
23#include <utils/misc.h>
24
25#include <assert.h>
26#include <GLES/gl.h>
27#include <GLES/glext.h>
28
29static int initialized = 0;
30
31static jclass nioAccessClass;
32static jclass bufferClass;
33static jmethodID getBasePointerID;
34static jmethodID getBaseArrayID;
35static jmethodID getBaseArrayOffsetID;
36static jfieldID positionID;
37static jfieldID limitID;
38static jfieldID elementSizeShiftID;
39
40/* Cache method IDs each time the class is loaded. */
41
42static void
43nativeClassInit(JNIEnv *_env, jclass glImplClass)
44{
45    jclass nioAccessClassLocal = _env->FindClass("java/nio/NIOAccess");
46    nioAccessClass = (jclass) _env->NewGlobalRef(nioAccessClassLocal);
47
48    jclass bufferClassLocal = _env->FindClass("java/nio/Buffer");
49    bufferClass = (jclass) _env->NewGlobalRef(bufferClassLocal);
50
51    getBasePointerID = _env->GetStaticMethodID(nioAccessClass,
52            "getBasePointer", "(Ljava/nio/Buffer;)J");
53    getBaseArrayID = _env->GetStaticMethodID(nioAccessClass,
54            "getBaseArray", "(Ljava/nio/Buffer;)Ljava/lang/Object;");
55    getBaseArrayOffsetID = _env->GetStaticMethodID(nioAccessClass,
56            "getBaseArrayOffset", "(Ljava/nio/Buffer;)I");
57
58    positionID = _env->GetFieldID(bufferClass, "position", "I");
59    limitID = _env->GetFieldID(bufferClass, "limit", "I");
60    elementSizeShiftID =
61        _env->GetFieldID(bufferClass, "_elementSizeShift", "I");
62}
63
64
65static void *
66getPointer(JNIEnv *_env, jobject buffer, jarray *array, jint *remaining, jint *offset)
67{
68    jint position;
69    jint limit;
70    jint elementSizeShift;
71    jlong pointer;
72
73    position = _env->GetIntField(buffer, positionID);
74    limit = _env->GetIntField(buffer, limitID);
75    elementSizeShift = _env->GetIntField(buffer, elementSizeShiftID);
76    *remaining = (limit - position) << elementSizeShift;
77    pointer = _env->CallStaticLongMethod(nioAccessClass,
78            getBasePointerID, buffer);
79    if (pointer != 0L) {
80        *array = NULL;
81        return (void *) (jint) pointer;
82    }
83
84    *array = (jarray) _env->CallStaticObjectMethod(nioAccessClass,
85            getBaseArrayID, buffer);
86    *offset = _env->CallStaticIntMethod(nioAccessClass,
87            getBaseArrayOffsetID, buffer);
88
89    return NULL;
90}
91
92
93static void
94releasePointer(JNIEnv *_env, jarray array, void *data, jboolean commit)
95{
96    _env->ReleasePrimitiveArrayCritical(array, data,
97					   commit ? 0 : JNI_ABORT);
98}
99
100// --------------------------------------------------------------------------
101/* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */
102static jint
103android_glQueryMatrixxOES___3II_3II
104  (JNIEnv *_env, jobject _this, jintArray mantissa_ref, jint mantissaOffset, jintArray exponent_ref, jint exponentOffset) {
105    jint _exception = 0;
106    const char * _exceptionType;
107    const char * _exceptionMessage;
108    GLbitfield _returnValue = -1;
109    GLfixed *mantissa_base = (GLfixed *) 0;
110    jint _mantissaRemaining;
111    GLfixed *mantissa = (GLfixed *) 0;
112    GLint *exponent_base = (GLint *) 0;
113    jint _exponentRemaining;
114    GLint *exponent = (GLint *) 0;
115
116    if (!mantissa_ref) {
117        _exception = 1;
118        _exceptionType = "java/lang/IllegalArgumentException";
119        _exceptionMessage = "mantissa == null";
120        goto exit;
121    }
122    if (mantissaOffset < 0) {
123        _exception = 1;
124        _exceptionType = "java/lang/IllegalArgumentException";
125        _exceptionMessage = "mantissaOffset < 0";
126        goto exit;
127    }
128    _mantissaRemaining = _env->GetArrayLength(mantissa_ref) - mantissaOffset;
129    if (_mantissaRemaining < 16) {
130        _exception = 1;
131        _exceptionType = "java/lang/IllegalArgumentException";
132        _exceptionMessage = "length - mantissaOffset < 16 < needed";
133        goto exit;
134    }
135    mantissa_base = (GLfixed *)
136        _env->GetPrimitiveArrayCritical(mantissa_ref, (jboolean *)0);
137    mantissa = mantissa_base + mantissaOffset;
138
139    if (!exponent_ref) {
140        _exception = 1;
141        _exceptionType = "java/lang/IllegalArgumentException";
142        _exceptionMessage = "exponent == null";
143        goto exit;
144    }
145    if (exponentOffset < 0) {
146        _exception = 1;
147        _exceptionType = "java/lang/IllegalArgumentException";
148        _exceptionMessage = "exponentOffset < 0";
149        goto exit;
150    }
151    _exponentRemaining = _env->GetArrayLength(exponent_ref) - exponentOffset;
152    if (_exponentRemaining < 16) {
153        _exception = 1;
154        _exceptionType = "java/lang/IllegalArgumentException";
155        _exceptionMessage = "length - exponentOffset < 16 < needed";
156        goto exit;
157    }
158    exponent_base = (GLint *)
159        _env->GetPrimitiveArrayCritical(exponent_ref, (jboolean *)0);
160    exponent = exponent_base + exponentOffset;
161
162    _returnValue = glQueryMatrixxOES(
163        (GLfixed *)mantissa,
164        (GLint *)exponent
165    );
166
167exit:
168    if (exponent_base) {
169        _env->ReleasePrimitiveArrayCritical(exponent_ref, exponent_base,
170            _exception ? JNI_ABORT: 0);
171    }
172    if (mantissa_base) {
173        _env->ReleasePrimitiveArrayCritical(mantissa_ref, mantissa_base,
174            _exception ? JNI_ABORT: 0);
175    }
176    if (_exception) {
177        jniThrowException(_env, _exceptionType, _exceptionMessage);
178    }
179    return _returnValue;
180}
181
182/* GLbitfield glQueryMatrixxOES ( GLfixed *mantissa, GLint *exponent ) */
183static jint
184android_glQueryMatrixxOES__Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2
185  (JNIEnv *_env, jobject _this, jobject mantissa_buf, jobject exponent_buf) {
186    jint _exception = 0;
187    const char * _exceptionType;
188    const char * _exceptionMessage;
189    jarray _mantissaArray = (jarray) 0;
190    jint _mantissaBufferOffset = (jint) 0;
191    jarray _exponentArray = (jarray) 0;
192    jint _exponentBufferOffset = (jint) 0;
193    GLbitfield _returnValue = -1;
194    jint _mantissaRemaining;
195    GLfixed *mantissa = (GLfixed *) 0;
196    jint _exponentRemaining;
197    GLint *exponent = (GLint *) 0;
198
199    mantissa = (GLfixed *)getPointer(_env, mantissa_buf, &_mantissaArray, &_mantissaRemaining, &_mantissaBufferOffset);
200    if (_mantissaRemaining < 16) {
201        _exception = 1;
202        _exceptionType = "java/lang/IllegalArgumentException";
203        _exceptionMessage = "remaining() < 16 < needed";
204        goto exit;
205    }
206    exponent = (GLint *)getPointer(_env, exponent_buf, &_exponentArray, &_exponentRemaining, &_exponentBufferOffset);
207    if (_exponentRemaining < 16) {
208        _exception = 1;
209        _exceptionType = "java/lang/IllegalArgumentException";
210        _exceptionMessage = "remaining() < 16 < needed";
211        goto exit;
212    }
213    if (mantissa == NULL) {
214        char * _mantissaBase = (char *)_env->GetPrimitiveArrayCritical(_mantissaArray, (jboolean *) 0);
215        mantissa = (GLfixed *) (_mantissaBase + _mantissaBufferOffset);
216    }
217    if (exponent == NULL) {
218        char * _exponentBase = (char *)_env->GetPrimitiveArrayCritical(_exponentArray, (jboolean *) 0);
219        exponent = (GLint *) (_exponentBase + _exponentBufferOffset);
220    }
221    _returnValue = glQueryMatrixxOES(
222        (GLfixed *)mantissa,
223        (GLint *)exponent
224    );
225
226exit:
227    if (_exponentArray) {
228        releasePointer(_env, _exponentArray, exponent, _exception ? JNI_FALSE : JNI_TRUE);
229    }
230    if (_mantissaArray) {
231        releasePointer(_env, _mantissaArray, mantissa, _exception ? JNI_FALSE : JNI_TRUE);
232    }
233    if (_exception) {
234        jniThrowException(_env, _exceptionType, _exceptionMessage);
235    }
236    return _returnValue;
237}
238
239static const char *classPathName = "android/opengl/GLES10Ext";
240
241static JNINativeMethod methods[] = {
242{"_nativeClassInit", "()V", (void*)nativeClassInit },
243{"glQueryMatrixxOES", "([II[II)I", (void *) android_glQueryMatrixxOES___3II_3II },
244{"glQueryMatrixxOES", "(Ljava/nio/IntBuffer;Ljava/nio/IntBuffer;)I", (void *) android_glQueryMatrixxOES__Ljava_nio_IntBuffer_2Ljava_nio_IntBuffer_2 },
245};
246
247int register_android_opengl_jni_GLES10Ext(JNIEnv *_env)
248{
249    int err;
250    err = android::AndroidRuntime::registerNativeMethods(_env, classPathName, methods, NELEM(methods));
251    return err;
252}
253