diff options
Diffstat (limited to 'src/native/ogl/RasterRetained.c')
-rw-r--r-- | src/native/ogl/RasterRetained.c | 392 |
1 files changed, 392 insertions, 0 deletions
diff --git a/src/native/ogl/RasterRetained.c b/src/native/ogl/RasterRetained.c new file mode 100644 index 0000000..775bb2f --- /dev/null +++ b/src/native/ogl/RasterRetained.c @@ -0,0 +1,392 @@ +/* + * $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" + +#ifdef DEBUG +/* Uncomment the following for VERBOSE debug messages */ +/* #define VERBOSE */ +#endif /* DEBUG */ + + +JNIEXPORT +void JNICALL Java_javax_media_j3d_RasterRetained_execute(JNIEnv *env, + jobject obj, jlong ctxInfo, jobject geo, + jboolean updateAlpha, jfloat alpha, + jint type, jint w_raster, jint h_raster, + jint x_offset, jint y_offset, jfloat x, jfloat y, jfloat z, jbyteArray imageYdown) + + +{ + jclass geo_class; + JNIEnv table; + + jfieldID w_field, h_field; + int width, height; + + GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; + jlong ctx = ctxProperties->context; + + table = *env; + + geo_class = (jclass) (*(table->GetObjectClass))(env, geo); + +#ifdef VERBOSE + fprintf(stderr, + "x %g ,y %g ,z %g ,w_raster %d,h_raster %d, x_offset %d, y_offset %d\n", + x,y,z,w_raster,h_raster,x_offset,y_offset); +#endif + + if ((type == javax_media_j3d_Raster_RASTER_COLOR) || + (type == javax_media_j3d_Raster_RASTER_COLOR_DEPTH)) { + jobject image; + jclass image_class; + jfieldID image_field, format_field; + jbyte *byteData; + int format; + int glformat; + + image_field = (jfieldID)(*(table->GetFieldID))(env, geo_class, + "image","Ljavax/media/j3d/ImageComponent2DRetained;"); + image = (jobject) (*(table->GetObjectField))(env, geo, image_field); + + if (image == NULL) { + return; + } + image_class = (jclass) (*(table->GetObjectClass))(env, image); + + format_field = (jfieldID) (*(table->GetFieldID))(env, image_class, + "storedYdownFormat", "I"); + format = (jint)(*(table->GetIntField))(env, image, format_field); + w_field = (jfieldID) (*(table->GetFieldID))(env, image_class, + "width", "I"); + width = (jint)(*(table->GetIntField))(env, image, w_field); + h_field = (jfieldID)(*(table->GetFieldID))(env, image_class, + "height", "I"); + height = (jint)(*(table->GetIntField))(env, image, h_field); + + + /* + * raster position is upper left corner, default for Java3D + * ImageComponent currently has the data reverse in Y + */ + glPixelZoom(1.0, -1.0); + glPixelStorei(GL_UNPACK_ROW_LENGTH, width); + if (x_offset >= 0) { + glPixelStorei(GL_UNPACK_SKIP_PIXELS, x_offset); + if (x_offset + w_raster > width) { + w_raster = width - x_offset; + } + } else { + w_raster += x_offset; + if (w_raster > width) { + w_raster = width; + } + } + if (y_offset >= 0) { + glPixelStorei(GL_UNPACK_SKIP_ROWS, y_offset); + if (y_offset + h_raster > height) { + h_raster = height - y_offset; + } + } else { + h_raster += y_offset; + if (h_raster > height) { + h_raster = height; + } + } + + + + glRasterPos3f(x, y, z); + + byteData = (jbyte *)(*(table->GetPrimitiveArrayCritical))(env, + imageYdown, NULL); + +/* + { + int i, j, *intData; + + fprintf(stderr, "format = %d, w_raster = %d, h_raster = %d\n\n", format, w_raster, h_raster); + intData = (int*)byteData; + for (i = 0; i < w_raster; i++) { + for (j = 0; j < h_raster; j++, intData++) { + fprintf(stderr, " 0x%x", *intData); + } + fprintf(stderr, "\n"); + } + } + */ + switch (format) { + case FORMAT_BYTE_RGBA: + glformat = GL_RGBA; + break; + case FORMAT_BYTE_RGB: + glformat = GL_RGB; + break; + + case FORMAT_BYTE_ABGR: + if (ctxProperties->abgr_ext) { /* If its zero, should never come here! */ + glformat = GL_ABGR_EXT; + } + break; + case FORMAT_BYTE_BGR: + if (ctxProperties->bgr_ext) { /* If its zero, should never come here! */ + glformat = ctxProperties->bgr_ext_enum; + } + break; + case FORMAT_BYTE_LA: + glformat = GL_LUMINANCE_ALPHA; + break; + case FORMAT_BYTE_GRAY: + case FORMAT_USHORT_GRAY: + /* TODO: throw exception */ + break; + } + glDrawPixels(w_raster, h_raster, glformat, GL_UNSIGNED_BYTE, + byteData); + + (*(table->ReleasePrimitiveArrayCritical))(env, + imageYdown, byteData, 0); + } + + if ((type == javax_media_j3d_Raster_RASTER_DEPTH) || + (type == javax_media_j3d_Raster_RASTER_COLOR_DEPTH)) { + GLint draw_buf; + jobject depth; + jclass depth_class; + jfieldID depth_field, depth_type_field; + int depth_type; + + depth_field = (jfieldID)(*(table->GetFieldID))(env, geo_class, + "depthComponent","Ljavax/media/j3d/DepthComponentRetained;"); + + depth = (jobject) (*(table->GetObjectField))(env, geo, depth_field); + if (depth == NULL) { + return; + } + depth_class = (jclass) (*(table->GetObjectClass))(env, depth); + + depth_type_field = (jfieldID) (*(table->GetFieldID))(env, + depth_class, "type", "I"); + depth_type = (jint)(*(table->GetIntField))(env, depth, + depth_type_field); + + w_field = (jfieldID) (*(table->GetFieldID))(env, depth_class, + "width", "I"); + width = (jint)(*(table->GetIntField))(env, depth, w_field); + h_field = (jfieldID)(*(table->GetFieldID))(env, depth_class, + "height", "I"); + height = (jint)(*(table->GetIntField))(env, depth, h_field); + + + glGetIntegerv(GL_DRAW_BUFFER, &draw_buf); + /* disable draw buffer */ + glDrawBuffer(GL_NONE); + /* glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE); */ + + /* + * raster position is upper left corner, default for Java3D + * ImageComponent currently has the data reverse in Y + */ + glPixelStorei(GL_UNPACK_ROW_LENGTH, width); + if (x_offset >= 0) { + glPixelStorei(GL_UNPACK_SKIP_PIXELS, x_offset); + if (x_offset + w_raster > width) { + w_raster = width - x_offset; + } + } else { + w_raster += x_offset; + if (w_raster > width) { + w_raster = width; + } + } + if (y_offset >= 0) { + glPixelStorei(GL_UNPACK_SKIP_ROWS, y_offset); + if (y_offset + h_raster > height) { + h_raster = height - y_offset; + } + } else { + h_raster += y_offset; + if (h_raster > height) { + h_raster = height; + } + } + + + if (depth_type == javax_media_j3d_DepthComponentRetained_DEPTH_COMPONENT_TYPE_INT) { + jfieldID intData_field; + jintArray intData_array; + jint *intData; + + intData_field = (jfieldID)(*(table->GetFieldID))(env, + depth_class, "depthData","[I"); + + intData_array = (jintArray)(*(table->GetObjectField))(env, depth, + intData_field); + intData = (jint *)(*(table->GetPrimitiveArrayCritical))(env, + intData_array, NULL); + glDrawPixels(w_raster, h_raster, 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; + jfloatArray floatData_array; + jfloat *floatData; + + floatData_field = (jfieldID)(*(table->GetFieldID))(env, + depth_class, "depthData","[F"); + floatData_array = (jfloatArray)(*(table->GetObjectField))(env, depth, + floatData_field); + floatData = (jfloat *)(*(table->GetPrimitiveArrayCritical))(env, + floatData_array, NULL); + glDrawPixels(w_raster, h_raster, GL_DEPTH_COMPONENT, + GL_FLOAT, floatData); + (*(table->ReleasePrimitiveArrayCritical))(env, floatData_array, + floatData, 0); + } + + /* re-enable draw buffer */ + glDrawBuffer(draw_buf); + + } + glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + +} + + +#if 0 + +JNIEXPORT +void JNICALL Java_javax_media_j3d_RasterRetained_executeTiled(JNIEnv *env, + jobject obj, jlong ctxInfo, jobject geo, + jint format, jint w_raster, jint h_raster, + jint x_offset, jint y_offset, jint deltaw, jint deltah, jfloat x, jfloat y, jfloat z, jbyteArray tile) + + +{ + jclass geo_class; + JNIEnv table; + jint j; + int alphaChanged = 0; /* used so we can get alpha data from */ + /* JNI before using it so we can use */ + /* GetPrimitiveArrayCritical */ + jobject image; + jclass image_class; + jfieldID byteData_field, image_field, format_field; + jbyteArray byteData_array; + jbyte *byteData; + int glformat; + float rasterPos[3]; + GraphicsContextPropertiesInfo *ctxProperties = (GraphicsContextPropertiesInfo *)ctxInfo; + jlong ctx = ctxProperties->context; + + table = *env; + + +#ifdef VERBOSE + fprintf(stderr, + "x %g ,y %g ,z %g ,w_raster %d,h_raster %d, x_offset %d, y_offset %d\n", + x,y,z,w_raster,h_raster,x_offset,y_offset); +#endif + + + /* + * raster position is upper left corner, default for Java3D + * ImageComponent currently has the data reverse in Y + */ + glPixelZoom(1.0, -1.0); + /* glPixelStorei(GL_UNPACK_ROW_LENGTH, width);*/ + if (x_offset >= 0) { + glPixelStorei(GL_UNPACK_SKIP_PIXELS, x_offset); + if (x_offset + w_raster > width) { + w_raster = width - x_offset; + } + } else { + w_raster += x_offset; + if (w_raster > width) { + w_raster = width; + } + } + if (y_offset >= 0) { + glPixelStorei(GL_UNPACK_SKIP_ROWS, y_offset); + if (y_offset + h_raster > height) { + h_raster = height - y_offset; + } + } else { + h_raster += y_offset; + if (h_raster > height) { + h_raster = height; + } + } + + if (deltaw == 0 && deltah == 0) { + glRasterPos3f(x, y, z); + } + else { + glGetFloatv(GL_CURRENT_RASTER_POSITION,rasterPos); + rasterPos[0] += (float)deltaw; + rasterPos[1] += (float)deltah; + glRasterPos3f(rasterPos[0], rasterPos[1], rasterPos[2]); + } + + + + byteData = (jbyte *)(*(table->GetPrimitiveArrayCritical))(env, + tile, NULL); + switch (format) { + case FORMAT_BYTE_RGBA: + glformat = GL_RGBA; + break; + case FORMAT_BYTE_RGB: + glformat = GL_RGB; + break; + + case FORMAT_BYTE_ABGR: + if (ctxProperties->abgr_ext) { /* If its zero, should never come here! */ + glformat = GL_ABGR_EXT; + } + break; + + + case FORMAT_BYTE_BGR: + if (ctxProperties->bgr_ext) { /* If its zero, should never come here! */ + glformat = ctxProperties->bgr_ext_enum; + } + break; + + case FORMAT_BYTE_LA: + glformat = GL_LUMINANCE_ALPHA; + break; + case FORMAT_BYTE_GRAY: + case FORMAT_USHORT_GRAY: + /* TODO: throw exception */ + break; + } + fprintf(stderr, "w_raster = %d, h_raster = %d, glformat = %d\n",w_raster, h_raster, glformat); + glDrawPixels(w_raster, h_raster, glformat, GL_UNSIGNED_BYTE, + byteData); + + (*(table->ReleasePrimitiveArrayCritical))(env, + tile, byteData, 0); + + /* glPixelStorei(GL_UNPACK_ROW_LENGTH, 0);*/ + glPixelStorei(GL_UNPACK_SKIP_PIXELS, 0); + glPixelStorei(GL_UNPACK_SKIP_ROWS, 0); + +} +#endif |