diff options
Diffstat (limited to 'src/native/ogl/GraphicsContext3D.c')
-rw-r--r-- | src/native/ogl/GraphicsContext3D.c | 171 |
1 files changed, 171 insertions, 0 deletions
diff --git a/src/native/ogl/GraphicsContext3D.c b/src/native/ogl/GraphicsContext3D.c new file mode 100644 index 0000000..9d800f8 --- /dev/null +++ b/src/native/ogl/GraphicsContext3D.c @@ -0,0 +1,171 @@ +/* + * $RCSfile$ + * + * Copyright (c) 2004 Sun Microsystems, Inc. All rights reserved. + * + * Use is subject to license terms. + * + * $Revision$ + * $Date$ + * $State$ + */ + +#include <stdio.h> +#include <jni.h> + +#include "gldefs.h" + +JNIEXPORT +void JNICALL Java_javax_media_j3d_GraphicsContext3D_readRasterNative( + JNIEnv *env, jobject obj, jlong ctxInfo, + jint type, jint xOffset, jint yOffset, + jint wRaster, jint hRaster, jint hCanvas, + jint format, jobject image, jobject depth, jobject ctx) +{ + JNIEnv table; + int yAdjusted; + jclass ctx_class; + GLenum gltype; + + GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; + jlong d3dctx = ctxProperties->context; + + table = *env; + + glPixelStorei(GL_PACK_ROW_LENGTH, wRaster); + glPixelStorei(GL_PACK_ALIGNMENT, 1); + yAdjusted = hCanvas - hRaster - yOffset; + + ctx_class = (jclass) (*(table->GetObjectClass))(env, ctx); + + if ((type & javax_media_j3d_Raster_RASTER_COLOR) != 0) { + + jclass image_class; + + jfieldID byteData_field; + jarray byteData_array; + jbyte *byteData; + + byteData_field = (jfieldID)(*(table->GetFieldID))(env, + ctx_class, "byteBuffer","[B"); + byteData_array = (jarray)(*(table->GetObjectField))(env, ctx, + byteData_field); + + image_class = (jclass) (*(table->GetObjectClass))(env, image); + + if (image_class == NULL) { + return; + } + + switch (format) { + case FORMAT_BYTE_RGBA: + gltype = GL_RGBA; + break; + case FORMAT_BYTE_RGB: + gltype = GL_RGB; + break; + + case FORMAT_BYTE_ABGR: + if (ctxProperties->abgr_ext) { /* If its zero, should never come here! */ + gltype = GL_ABGR_EXT; + } + break; + + case FORMAT_BYTE_BGR: + if (ctxProperties->bgr_ext) { /* If its zero, should never come here! */ + gltype = ctxProperties->bgr_ext_enum; + } + break; + case FORMAT_BYTE_LA: + gltype = GL_LUMINANCE_ALPHA; + break; + case FORMAT_BYTE_GRAY: + case FORMAT_USHORT_GRAY: + /* TODO: throw exception */ + break; + } + byteData = (jbyte *)(*(table->GetPrimitiveArrayCritical))(env, + byteData_array, NULL); + glReadPixels(xOffset, yAdjusted, wRaster, hRaster, + gltype, GL_UNSIGNED_BYTE, byteData); + + /* + { + int i, j , *intData; + fprintf(stderr, "format = %d, wRaster = %d, hRaster = %d\n\n", format, wRaster, hRaster); + intData = (int*)byteData; + for (i = 0; i < wRaster; i++) { + for (j = 0; j < hRaster; j++, intData++) { + fprintf(stderr, " 0x%x", *intData); + } + fprintf(stderr, "\n"); + } + } + */ + (*(table->ReleasePrimitiveArrayCritical))(env, byteData_array, + byteData, 0); + } + + + if ((type & javax_media_j3d_Raster_RASTER_DEPTH) != 0) { + + jclass depth_class; + jfieldID wDepth_field, depth_type_field; + jint depth_type, wDepth; + + depth_class = (jclass) (*(table->GetObjectClass))(env, depth); + + if (depth_class == NULL) { + return; + } + + wDepth_field = (jfieldID) (*(table->GetFieldID))(env, depth_class, + "width", "I"); + wDepth = (jint)(*(table->GetIntField))(env, depth, wDepth_field); + + depth_type_field = (jfieldID) (*(table->GetFieldID))(env, + depth_class, "type", "I"); + depth_type = (jint)(*(table->GetIntField))(env, depth, + depth_type_field); + + if (depth_type == javax_media_j3d_DepthComponentRetained_DEPTH_COMPONENT_TYPE_INT) { + jfieldID intData_field; + jarray intData_array; + jint *intData; + + intData_field = (jfieldID)(*(table->GetFieldID))(env, + ctx_class, "intBuffer","[I"); + intData_array = (jarray)(*(table->GetObjectField))(env, ctx, + intData_field); + + intData = (jint *)(*(table->GetPrimitiveArrayCritical))(env, + intData_array, NULL); + + /* yOffset is adjusted for OpenGL - Y upward */ + glReadPixels(xOffset, yAdjusted, wRaster, hRaster, + GL_DEPTH_COMPONENT, GL_UNSIGNED_INT, intData); + + (*(table->ReleasePrimitiveArrayCritical))(env, intData_array, + intData, 0); + } else { /* javax_media_j3d_DepthComponentRetained_DEPTH_COMPONENT_TYPE_FLOAT */ + jfieldID floatData_field; + jarray floatData_array; + jfloat *floatData; + + floatData_field = (jfieldID)(*(table->GetFieldID))(env, + ctx_class, "floatBuffer","[F"); + floatData_array = (jarray)(*(table->GetObjectField))(env, ctx, + floatData_field); + floatData = (jfloat *)(*(table->GetPrimitiveArrayCritical))(env, + floatData_array, NULL); + + /* yOffset is adjusted for OpenGL - Y upward */ + glReadPixels(xOffset, yAdjusted, wRaster, hRaster, + GL_DEPTH_COMPONENT, GL_FLOAT, floatData); + + (*(table->ReleasePrimitiveArrayCritical))(env, floatData_array, + floatData, 0); + } + } +} + |