155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer/* void glGetShaderSource ( GLuint shader, GLsizei bufsize, GLsizei *length, char *source ) */
255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferstatic void
355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferandroid_glGetShaderSource__II_3II_3BI
455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer  (JNIEnv *_env, jobject _this, jint shader, jint bufsize, jintArray length_ref, jint lengthOffset, jbyteArray source_ref, jint sourceOffset) {
555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    jint _exception = 0;
655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    const char * _exceptionType;
755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    const char * _exceptionMessage;
855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    GLsizei *length_base = (GLsizei *) 0;
955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    jint _lengthRemaining;
1055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    GLsizei *length = (GLsizei *) 0;
1155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    char *source_base = (char *) 0;
1255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    jint _sourceRemaining;
1355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    char *source = (char *) 0;
1455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer
1555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (!length_ref) {
1655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exception = 1;
1755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
1855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exceptionMessage = "length == null";
1955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        goto exit;
2055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
2155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (lengthOffset < 0) {
2255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exception = 1;
2355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
2455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exceptionMessage = "lengthOffset < 0";
2555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        goto exit;
2655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
2755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    _lengthRemaining = _env->GetArrayLength(length_ref) - lengthOffset;
2855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    length_base = (GLsizei *)
2955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _env->GetPrimitiveArrayCritical(length_ref, (jboolean *)0);
3055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    length = length_base + lengthOffset;
3155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer
3255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (!source_ref) {
3355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exception = 1;
3455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
3555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exceptionMessage = "source == null";
3655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        goto exit;
3755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
3855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (sourceOffset < 0) {
3955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exception = 1;
4055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exceptionType = "java/lang/IllegalArgumentException";
4155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _exceptionMessage = "sourceOffset < 0";
4255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        goto exit;
4355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
4455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    _sourceRemaining = _env->GetArrayLength(source_ref) - sourceOffset;
4555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    source_base = (char *)
4655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _env->GetPrimitiveArrayCritical(source_ref, (jboolean *)0);
4755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    source = source_base + sourceOffset;
4855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer
4955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    glGetShaderSource(
5055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        (GLuint)shader,
5155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        (GLsizei)bufsize,
5255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        (GLsizei *)length,
5355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        (char *)source
5455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    );
5555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer
5655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferexit:
5755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (source_base) {
5855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _env->ReleasePrimitiveArrayCritical(source_ref, source_base,
5955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer            _exception ? JNI_ABORT: 0);
6055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
6155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (length_base) {
6255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        _env->ReleasePrimitiveArrayCritical(length_ref, length_base,
6355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer            _exception ? JNI_ABORT: 0);
6455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
6555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (_exception) {
6655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        jniThrowException(_env, _exceptionType, _exceptionMessage);
6755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
6855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer}
6955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer
7055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer/* void glGetShaderSource ( GLuint shader, GLsizei bufsize, GLsizei *length, char *source ) */
7155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferstatic void
7255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferandroid_glGetShaderSource__IILjava_nio_IntBuffer_2B
7355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer  (JNIEnv *_env, jobject _this, jint shader, jint bufsize, jobject length_buf, jbyte source) {
7455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    jarray _array = (jarray) 0;
7555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    jint _bufferOffset = (jint) 0;
7655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    jint _remaining;
7755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    GLsizei *length = (GLsizei *) 0;
7855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer
7955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    length = (GLsizei *)getPointer(_env, length_buf, &_array, &_remaining, &_bufferOffset);
8055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (length == NULL) {
8155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        char * _lengthBase = (char *)_env->GetPrimitiveArrayCritical(_array, (jboolean *) 0);
8255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        length = (GLsizei *) (_lengthBase + _bufferOffset);
8355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
8455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    glGetShaderSource(
8555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        (GLuint)shader,
8655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        (GLsizei)bufsize,
8755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        (GLsizei *)length,
88d8f096114da14f9793d4cca6022ca41b70ab9daaAshok Bhat        reinterpret_cast<char *>(source)
8955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    );
9055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (_array) {
9155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        releasePointer(_env, _array, length, JNI_TRUE);
9255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
9355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer}
9455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer
9555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer/* void glGetShaderSource ( GLuint shader, GLsizei bufsize, GLsizei *length, char *source ) */
9655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshoferstatic jstring android_glGetShaderSource(JNIEnv *_env, jobject, jint shader) {
9755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    GLint shaderLen = 0;
9855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    glGetShaderiv((GLuint)shader, GL_SHADER_SOURCE_LENGTH, &shaderLen);
9955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (!shaderLen) {
10055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        return _env->NewStringUTF("");
10155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
10255b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    char* buf = (char*) malloc(shaderLen);
10355b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    if (buf == NULL) {
10455b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        jniThrowException(_env, "java/lang/IllegalArgumentException", "out of memory");
10555b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer        return NULL;
10655b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    }
10755b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    glGetShaderSource(shader, shaderLen, NULL, buf);
10855b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    jstring result = _env->NewStringUTF(buf);
10955b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    free(buf);
11055b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer    return result;
11155b4e553c8e6021cb65a9ac99857bfbf4d4f335dThomas Tafertshofer}
112