From 9414e967cfe4f287e15ded496d00d304ee24ca53 Mon Sep 17 00:00:00 2001 From: Chien Yang Date: Mon, 16 Oct 2006 23:52:10 +0000 Subject: 1) Clean up dead code. 2) Support INT image type for 3D texture, volume and part of Cubemap. git-svn-id: https://svn.java.net/svn/j3d-core~svn/trunk@721 ba19aa83-45c5-6ac9-afd3-db810772062c --- src/native/d3d/Attributes.cpp | 149 ++- src/native/d3d/Canvas3D.cpp | 12 +- src/native/d3d/D3dUtil.cpp | 2820 ++++++++++++++++------------------------- 3 files changed, 1210 insertions(+), 1771 deletions(-) (limited to 'src/native') diff --git a/src/native/d3d/Attributes.cpp b/src/native/d3d/Attributes.cpp index e1d5eaf..dc21c80 100644 --- a/src/native/d3d/Attributes.cpp +++ b/src/native/d3d/Attributes.cpp @@ -2242,6 +2242,7 @@ void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture2DSubImage( imageObjPtr = (void *)env->GetDirectBufferAddress(data); } + // update Image data switch (imageFormat) { case IMAGE_FORMAT_BYTE_BGR: case IMAGE_FORMAT_BYTE_RGB: @@ -2592,12 +2593,10 @@ void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DImage( return; } - // TODO --- Need to re-write. Chien // update Image data if (data != NULL) { void *imageObjPtr; - - /* Need to support INT, and NIO buffers -- Chien */ + jbyte *dataBuffer; if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { @@ -2607,22 +2606,27 @@ void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DImage( imageObjPtr = (void *)env->GetDirectBufferAddress(data); } - if (imageFormat != IMAGE_FORMAT_USHORT_GRAY) { - jbyte *byteData = (jbyte *) imageObjPtr; + switch (imageFormat) { + case IMAGE_FORMAT_BYTE_BGR: + case IMAGE_FORMAT_BYTE_RGB: + case IMAGE_FORMAT_BYTE_ABGR: + case IMAGE_FORMAT_BYTE_RGBA: + case IMAGE_FORMAT_BYTE_LA: + case IMAGE_FORMAT_BYTE_GRAY: + case IMAGE_FORMAT_INT_BGR: + case IMAGE_FORMAT_INT_RGB: + case IMAGE_FORMAT_INT_ARGB: + dataBuffer = (jbyte *) imageObjPtr; copyDataToVolume(imageFormat, textureFormat, 0, 0, 0, 0, 0, 0, - width, height, depth, width, height, byteData, + width, height, depth, width, height, dataBuffer, surf, level); - - } else { - /* - jshort *shortData = (jshort *) env->GetPrimitiveArrayCritical(imageYup, NULL); - copyDataToVolume(imageFormat, textureFormat, 0, 0, 0, 0, 0, 0, - width, height, depth, width, height, shortData, - surf, level); - env->ReleasePrimitiveArrayCritical(imageYup, shortData, 0); - */ - } - + break; + case IMAGE_FORMAT_USHORT_GRAY: + default: + throwAssert(env, "updateTexture3DImage : imageFormat illegal format"); + return; + } + if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); @@ -2678,10 +2682,8 @@ void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DSubImage( return; } - // TODO --- Need to re-write. Chien void *imageObjPtr; - - /* Need to support INT, and NIO buffers -- Chien */ + jbyte *dataBuffer; if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { @@ -2692,24 +2694,29 @@ void JNICALL Java_javax_media_j3d_NativePipeline_updateTexture3DSubImage( } // update Image data - if (imageFormat != IMAGE_FORMAT_USHORT_GRAY) { - jbyte *byteData = (jbyte *) imageObjPtr; + switch (imageFormat) { + case IMAGE_FORMAT_BYTE_BGR: + case IMAGE_FORMAT_BYTE_RGB: + case IMAGE_FORMAT_BYTE_ABGR: + case IMAGE_FORMAT_BYTE_RGBA: + case IMAGE_FORMAT_BYTE_LA: + case IMAGE_FORMAT_BYTE_GRAY: + case IMAGE_FORMAT_INT_BGR: + case IMAGE_FORMAT_INT_RGB: + case IMAGE_FORMAT_INT_ARGB: + dataBuffer = (jbyte *) imageObjPtr; copyDataToVolume(imageFormat, textureFormat, xoffset, yoffset, zoffset, imgXOffset, imgYOffset, imgZOffset, width, height, depth, - tilew, tileh, byteData, + tilew, tileh, dataBuffer, surf, level); - } else { - /* - jshort *shortData = (jshort *) env->GetPrimitiveArrayCritical(image, NULL); - copyDataToVolume(imageFormat, textureFormat, xoffset, - yoffset, zoffset, - imgXOffset, imgYOffset, imgZOffset, - width, height, depth, tilew, tileh, shortData, - surf, level); - env->ReleasePrimitiveArrayCritical(image, shortData, 0); - */ + break; + case IMAGE_FORMAT_USHORT_GRAY: + default: + throwAssert(env, "updateTexture3DSubImage : imageFormat illegal format"); + return; } + if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); @@ -2872,10 +2879,8 @@ void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapSubImage( return; } - // TODO --- Need to re-write. Chien void *imageObjPtr; - - /* Need to support INT, and NIO buffers -- Chien */ + jbyte *dataBuffer; if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { @@ -2886,32 +2891,34 @@ void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapSubImage( } // update Image data - if (imageFormat != IMAGE_FORMAT_USHORT_GRAY) { - jbyte *byteData = (jbyte *) imageObjPtr; - copyDataToCubeMap(imageFormat, textureFormat, - xoffset, yoffset, - imgXOffset, imgYOffset, - width, height, - tilew, byteData, - surf, level, face); - - } else { - /* - jshort *shortData = (jshort *) env->GetPrimitiveArrayCritical(image, NULL); + switch (imageFormat) { + case IMAGE_FORMAT_BYTE_BGR: + case IMAGE_FORMAT_BYTE_RGB: + case IMAGE_FORMAT_BYTE_ABGR: + case IMAGE_FORMAT_BYTE_RGBA: + case IMAGE_FORMAT_BYTE_LA: + case IMAGE_FORMAT_BYTE_GRAY: + case IMAGE_FORMAT_INT_BGR: + case IMAGE_FORMAT_INT_RGB: + case IMAGE_FORMAT_INT_ARGB: + dataBuffer = (jbyte *) imageObjPtr; copyDataToCubeMap(imageFormat, textureFormat, xoffset, yoffset, imgXOffset, imgYOffset, width, height, - tilew, shortData, + tilew, dataBuffer, surf, level, face); - env->ReleasePrimitiveArrayCritical(image, shortData, 0); - */ + break; + case IMAGE_FORMAT_USHORT_GRAY: + default: + throwAssert(env, "updateTextureCubeMapSubImage : imageFormat illegal format"); + return; } + if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); - } - + } } extern "C" JNIEXPORT @@ -2987,13 +2994,11 @@ void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapImage( return; } - // TODO --- Need to re-write. Chien // update Image data if (data != NULL) { void *imageObjPtr; + jbyte *dataBuffer; - /* Need to support INT, and NIO buffers -- Chien */ - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { imageObjPtr = (void *) env->GetPrimitiveArrayCritical((jarray)data, NULL); @@ -3002,21 +3007,27 @@ void JNICALL Java_javax_media_j3d_NativePipeline_updateTextureCubeMapImage( imageObjPtr = (void *)env->GetDirectBufferAddress(data); } - if (imageFormat != IMAGE_FORMAT_USHORT_GRAY) { - jbyte *byteData = (jbyte *) imageObjPtr; - copyDataToCubeMap(imageFormat, textureFormat, 0, 0, 0, 0, - width, height, width, byteData, - surf, level, face); - - } else { - /* - jshort *shortData = (jshort *) env->GetPrimitiveArrayCritical(imageYup, NULL); + switch (imageFormat) { + case IMAGE_FORMAT_BYTE_BGR: + case IMAGE_FORMAT_BYTE_RGB: + case IMAGE_FORMAT_BYTE_ABGR: + case IMAGE_FORMAT_BYTE_RGBA: + case IMAGE_FORMAT_BYTE_LA: + case IMAGE_FORMAT_BYTE_GRAY: + case IMAGE_FORMAT_INT_BGR: + case IMAGE_FORMAT_INT_RGB: + case IMAGE_FORMAT_INT_ARGB: + dataBuffer = (jbyte *) imageObjPtr; copyDataToCubeMap(imageFormat, textureFormat, 0, 0, 0, 0, - width, height, width, shortData, + width, height, width, dataBuffer, surf, level, face); - env->ReleasePrimitiveArrayCritical(imageYup, shortData, 0); - */ - } + break; + case IMAGE_FORMAT_USHORT_GRAY: + default: + throwAssert(env, "updateTextureCubeMapImage : imageFormat illegal format"); + return; + } + if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); diff --git a/src/native/d3d/Canvas3D.cpp b/src/native/d3d/Canvas3D.cpp index e6a3eca..49d3493 100644 --- a/src/native/d3d/Canvas3D.cpp +++ b/src/native/d3d/Canvas3D.cpp @@ -223,7 +223,7 @@ void JNICALL Java_javax_media_j3d_NativePipeline_texturemapping( jint rasWidth, jint format, jint objectId, - jbyteArray imageYdown, + jbyteArray byteData, jint winWidth, jint winHeight) { @@ -237,7 +237,7 @@ void JNICALL Java_javax_media_j3d_NativePipeline_texturemapping( Java_javax_media_j3d_NativePipeline_updateTexture2DSubImage( env, texture, ctx, 0, minX, minY, J3D_RGBA, format, minX, minY, rasWidth, maxX-minX, maxY-minY, IMAGE_DATA_TYPE_BYTE_ARRAY, - imageYdown); + byteData); LPDIRECT3DTEXTURE9 surf = d3dCtx->textureTable[objectId]; @@ -819,18 +819,16 @@ void JNICALL Java_javax_media_j3d_NativePipeline_readOffScreenBuffer( else { imageObjPtr = (void *)env->GetDirectBufferAddress(data); } - - + /* TODO : Need to re-write --- Chien. */ - printf("[TODO NEEDED] Canvas3D : *** ireadOffScreenBuffer() ***\n"); + printf("[TODO NEEDED] Canvas3D : *** readOffScreenBuffer() ***\n"); copyDataFromSurface(format, 0, 0, width, height, (jbyte *)imageObjPtr, d3dCtx->backSurface); - if((dataType == IMAGE_DATA_TYPE_BYTE_ARRAY) || (dataType == IMAGE_DATA_TYPE_INT_ARRAY)) { env->ReleasePrimitiveArrayCritical((jarray)data, imageObjPtr, 0); } - return; + return; } diff --git a/src/native/d3d/D3dUtil.cpp b/src/native/d3d/D3dUtil.cpp index 512ccba..e14adc1 100644 --- a/src/native/d3d/D3dUtil.cpp +++ b/src/native/d3d/D3dUtil.cpp @@ -6248,173 +6248,266 @@ void copyDataToSurfaceGrayRev(jint internalFormat, } } - -void copyDataToSurfaceGrayRev(jint internalFormat, - PIXELFORMAT *ddpf, - unsigned char* pRect, - DWORD rectPitch, - jshort *data, - jint xoffset, jint yoffset, - DWORD xlimit, DWORD ylimit, - jint subWidth) +/* + * Copy data to Texture memory surface *pRect + * with pitch = rectPitch + * Note that rectPitch >= surface width since + * D3D may allocate extra width in texture memory + * for other purpose or for alignment. Addional + * offset = (xoffset, yoffset) is added to copy + * data in texture memory. + * + * The source image has width = subWidth and + * pointer *data. + * + * + */ +void copyDataToSurfaceRGBA(jint internalFormat, + PIXELFORMAT *ddpf, + unsigned char* pRect, + DWORD rectPitch, + jbyte *data, + jint xoffset, jint yoffset, + DWORD xlimit, DWORD ylimit, + jint subWidth) { unsigned char *src; unsigned char *dst; - DWORD a, r, g, b, l; - DWORD srcPitch = subWidth << 1; + DWORD r, g, b, a, l; unsigned char *srcRow = (unsigned char *) data; unsigned char *destRow = pRect + rectPitch*yoffset; + const DWORD srcPitch = subWidth*4; - - if (internalFormat == ALPHA) { - int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); - int ashift = firstBit(ddpf->dwRGBAlphaBitMask); - DWORD mask; - - if ((ddpf->dwRGBBitCount <= 32) && - (ddpf->dwRGBBitCount > 24)) { - destRow += ((xlimit << 2) - 1); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } - mask = a << ashift; - *dst-- = (byte) ((mask >> 24) & 0xff); - *dst-- = (byte) ((mask >> 16) & 0xff); - *dst-- = (byte) ((mask >> 8) & 0xff); - *dst-- = (byte) (mask & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 24) && - (ddpf->dwRGBBitCount > 16)) { - destRow += (xlimit*3 - 1); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } - mask = a << ashift; - *dst-- = (byte) ((mask >> 16) & 0xff); - *dst-- = (byte) ((mask >> 8) & 0xff); - *dst-- = (byte) (mask & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 16) && - (ddpf->dwRGBBitCount > 8)) { - destRow += ((xlimit << 1) - 1); + if ((internalFormat == J3D_RGBA) || + (internalFormat == J3D_RGB)) { + if ((ddpf->dwRGBBitCount == 32) && + (ddpf->dwRBitMask == 0xff0000) && + (ddpf->dwGBitMask == 0xff00) && + (ddpf->dwBBitMask == 0xff)) { + // Most common case + // Note that format of destination is ARGB, which + // in PC format are BGRA, so we can't directly + // copy a row using CopyMemory() + destRow += (xoffset << 2); for (int i=yoffset; i < ylimit; i++) { src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } - mask = (a << ashift); - *dst-- = (byte) ((mask >> 8) & 0xff); - *dst-- = (byte) (mask & 0xff); + r = *src++; + g = *src++; + b = *src++; + *dst++ = b; + *dst++ = g; + *dst++ = r; + *dst++ = *src++; } srcRow += srcPitch; destRow += rectPitch; } - } else if (ddpf->dwRGBBitCount <= 8) { - destRow += (xlimit - 1); + } else if ((ddpf->dwRGBBitCount == 16) && + (ddpf->dwRBitMask == 0xf00) && + (ddpf->dwGBitMask == 0xf0) && + (ddpf->dwBBitMask == 0xf)) { + destRow += (xoffset << 1); for (int i=yoffset; i < ylimit; i++) { src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } - *dst-- = (byte) (a << ashift); + r = (*src++) >> 4; // discard the lower 4 bit + g = (*src++) >> 4; + b = (*src++) >> 4; + a = (*src++) >> 4; + *dst++ = (g << 4) | b; + *dst++ = (a << 4) | r; } srcRow += srcPitch; destRow += rectPitch; } - } else { - printf("Texture memory with RGBBitCount = %d not support. \n", - ddpf->dwRGBBitCount); - } - } else if ((internalFormat == LUMINANCE) || - (internalFormat == INTENSITY)) { - int rDiscard = 8-ucountBits(ddpf->dwRBitMask); - int gDiscard = 8-ucountBits(ddpf->dwGBitMask); - int bDiscard = 8-ucountBits(ddpf->dwBBitMask); - int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); - int rshift = firstBit(ddpf->dwRBitMask); - int gshift = firstBit(ddpf->dwGBitMask); - int bshift = firstBit(ddpf->dwBBitMask); - int ashift = firstBit(ddpf->dwRGBAlphaBitMask); - DWORD mask; + } else { // handle less common (even weird) format + int rDiscard = 8-ucountBits(ddpf->dwRBitMask); + int gDiscard = 8-ucountBits(ddpf->dwGBitMask); + int bDiscard = 8-ucountBits(ddpf->dwBBitMask); + int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); + int rshift = firstBit(ddpf->dwRBitMask); + int gshift = firstBit(ddpf->dwGBitMask); + int bshift = firstBit(ddpf->dwBBitMask); + int ashift = firstBit(ddpf->dwRGBAlphaBitMask); + DWORD mask; - if ((ddpf->dwRGBBitCount <= 32) && - (ddpf->dwRGBBitCount > 24)) { - destRow += ((xlimit << 2) - 1); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - l = *src++; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; + if ((ddpf->dwRGBBitCount <= 32) && + (ddpf->dwRGBBitCount > 24)) { + destRow += (xoffset << 2); + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + if (rDiscard >= 0) { + r = (*src++) >> rDiscard; + } else { + r = (*src++) << -rDiscard; + } + if (gDiscard >= 0) { + g = (*src++) >> gDiscard; + } else { + g = (*src++) >> -gDiscard; + } + if (bDiscard >= 0) { + b = (*src++) >> bDiscard; + } else { + b = (*src++) >> -bDiscard; + } + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) >> -aDiscard; + } + mask = (r << rshift) | (g << gshift) | + (b << bshift) | (a << ashift); + *dst++ = (byte) (mask & 0xff); + *dst++ = (byte) ((mask >> 8) & 0xff); + *dst++ = (byte) ((mask >> 16) & 0xff); + *dst++ = (byte) ((mask >> 24) & 0xff); } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; + srcRow += srcPitch; + destRow += rectPitch; + } + } else if ((ddpf->dwRGBBitCount <= 24) && + (ddpf->dwRGBBitCount > 16)) { + destRow += (xoffset*3); + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + if (rDiscard >= 0) { + r = (*src++) >> rDiscard; + } else { + r = (*src++) << -rDiscard; + } + if (gDiscard >= 0) { + g = (*src++) >> gDiscard; + } else { + g = (*src++) >> -gDiscard; + } + if (bDiscard >= 0) { + b = (*src++) >> bDiscard; + } else { + b = (*src++) >> -bDiscard; + } + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) >> -aDiscard; + } + mask = (r << rshift) | (g << gshift) | + (b << bshift) | (a << ashift); + *dst++ = (byte) (mask & 0xff); + *dst++ = (byte) ((mask >> 8) & 0xff); + *dst++ = (byte) ((mask >> 16) & 0xff); } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); - *dst-- = (byte) ((mask >> 24) & 0xff); - *dst-- = (byte) ((mask >> 16) & 0xff); - *dst-- = (byte) ((mask >> 8) & 0xff); - *dst-- = (byte) (mask & 0xff); + srcRow += srcPitch; + destRow += rectPitch; } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 24) && - (ddpf->dwRGBBitCount > 16)) { - destRow += (xlimit*3 - 1); + } else if ((ddpf->dwRGBBitCount <= 16) && + (ddpf->dwRGBBitCount > 8)) { + destRow += (xoffset << 1); + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + if (rDiscard >= 0) { + r = (*src++) >> rDiscard; + } else { + r = (*src++) << -rDiscard; + } + if (gDiscard >= 0) { + g = (*src++) >> gDiscard; + } else { + g = (*src++) >> -gDiscard; + } + if (bDiscard >= 0) { + b = (*src++) >> bDiscard; + } else { + b = (*src++) >> -bDiscard; + } + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) >> -aDiscard; + } + mask = (r << rshift) | (g << gshift) | + (b << bshift) | (a << ashift); + *dst++ = (byte) (mask & 0xff); + *dst++ = (byte) ((mask >> 8) & 0xff); + } + srcRow += srcPitch; + destRow += rectPitch; + } + } else if (ddpf->dwRGBBitCount <= 8) { + destRow += xoffset; + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + if (rDiscard >= 0) { + r = (*src++) >> rDiscard; + } else { + r = (*src++) << -rDiscard; + } + if (gDiscard >= 0) { + g = (*src++) >> gDiscard; + } else { + g = (*src++) >> -gDiscard; + } + if (bDiscard >= 0) { + b = (*src++) >> bDiscard; + } else { + b = (*src++) >> -bDiscard; + } + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) >> -aDiscard; + } + *dst++ = (byte) ((r << rshift) | (g << gshift) | + (b << bshift) | (a << ashift)); + } + srcRow += srcPitch; + destRow += rectPitch; + } + } else { + // should not happen, RGBBitCount > 32. Even DirectX + // RGB mask can't address it. + printf("Texture memory with RGBBitCount = %d not support. \n", + ddpf->dwRGBBitCount); + } + } + } else if (internalFormat == LUMINANCE_ALPHA) { + + int rDiscard = 8-ucountBits(ddpf->dwRBitMask); + int gDiscard = 8-ucountBits(ddpf->dwGBitMask); + int bDiscard = 8-ucountBits(ddpf->dwBBitMask); + int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); + int rshift = firstBit(ddpf->dwRBitMask); + int gshift = firstBit(ddpf->dwGBitMask); + int bshift = firstBit(ddpf->dwBBitMask); + int ashift = firstBit(ddpf->dwRGBAlphaBitMask); + DWORD mask; + + if ((ddpf->dwRGBBitCount <= 32) && + (ddpf->dwRGBBitCount > 24)) { + destRow += (xoffset << 2); for (int i=yoffset; i < ylimit; i++) { src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte l = *src++; + src++; + src++; + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) << -aDiscard; + } if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -6430,29 +6523,70 @@ void copyDataToSurfaceGrayRev(jint internalFormat, } else { b = l << -bDiscard; } + mask = (r << rshift) | (g << gshift) | + (b << bshift) | (a << ashift); + *dst++ = (byte) (mask & 0xff); + *dst++ = (byte) ((mask >> 8) & 0xff); + *dst++ = (byte) ((mask >> 16) & 0xff); + *dst++ = (byte) ((mask >> 24) & 0xff); + } + srcRow += srcPitch; + destRow += rectPitch; + } + } else if ((ddpf->dwRGBBitCount <= 24) && + (ddpf->dwRGBBitCount > 16)) { + destRow += (xoffset*3); + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + l = *src++; + src++; + src++; if (aDiscard >= 0) { - a = l >> aDiscard; + a = (*src++) >> aDiscard; } else { - a = l << -aDiscard; + a = (*src++) << -aDiscard; + } + if (rDiscard >= 0) { + r = l >> rDiscard; + } else { + r = l << -rDiscard; + } + if (gDiscard >= 0) { + g = l >> gDiscard; + } else { + g = l << -gDiscard; + } + if (bDiscard >= 0) { + b = l >> bDiscard; + } else { + b = l << -bDiscard; } mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); - *dst-- = (byte) ((mask >> 16) & 0xff); - *dst-- = (byte) ((mask >> 8) & 0xff); - *dst-- = (byte) (mask & 0xff); + (b << bshift) | (a << ashift); + *dst++ = (byte) (mask & 0xff); + *dst++ = (byte) ((mask >> 8) & 0xff); + *dst++ = (byte) ((mask >> 16) & 0xff); } srcRow += srcPitch; destRow += rectPitch; } } else if ((ddpf->dwRGBBitCount <= 16) && (ddpf->dwRGBBitCount > 8)) { - destRow += ((xlimit << 1) - 1); + destRow += (xoffset << 1); for (int i=yoffset; i < ylimit; i++) { src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte l = *src++; + src++; + src++; + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) << -aDiscard; + } if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -6468,27 +6602,28 @@ void copyDataToSurfaceGrayRev(jint internalFormat, } else { b = l << -bDiscard; } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; - } mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); - *dst-- = (byte) ((mask >> 8) & 0xff); - *dst-- = (byte) (mask & 0xff); + (b << bshift) | (a << ashift); + *dst++ = (byte) (mask & 0xff); + *dst++ = (byte) ((mask >> 8) & 0xff); } srcRow += srcPitch; destRow += rectPitch; } } else if (ddpf->dwRGBBitCount <= 8) { - destRow += (xlimit - 1); + destRow += xoffset; for (int i=yoffset; i < ylimit; i++) { src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte l = *src++; + src++; + src++; + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) << -aDiscard; + } if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -6504,15 +6639,8 @@ void copyDataToSurfaceGrayRev(jint internalFormat, } else { b = l << -bDiscard; } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; - } - *dst-- = (byte) ((r << rshift) | - (g << gshift) | - (b << bshift) | - (a << ashift)); + *dst++ = (byte) ((r << rshift) | (g << gshift) | + (b << bshift) | (a << ashift)); } srcRow += srcPitch; destRow += rectPitch; @@ -6521,248 +6649,97 @@ void copyDataToSurfaceGrayRev(jint internalFormat, printf("Texture memory with RGBBitCount = %d not support. \n", ddpf->dwRGBBitCount); } - } else { - printf("Texture format %d not support.\n", internalFormat); - } -} - - - -/* - * Copy data to Texture memory surface *pRect - * with pitch = rectPitch - * Note that rectPitch >= surface width since - * D3D may allocate extra width in texture memory - * for other purpose or for alignment. Addional - * offset = (xoffset, yoffset) is added to copy - * data in texture memory. - * - * The source image has width = subWidth and - * pointer *data. - * - * - */ -void copyDataToSurfaceRGBA(jint internalFormat, - PIXELFORMAT *ddpf, - unsigned char* pRect, - DWORD rectPitch, - jbyte *data, - jint xoffset, jint yoffset, - DWORD xlimit, DWORD ylimit, - jint subWidth) -{ - unsigned char *src; - unsigned char *dst; - DWORD r, g, b, a, l; - unsigned char *srcRow = (unsigned char *) data; - unsigned char *destRow = pRect + rectPitch*yoffset; - const DWORD srcPitch = subWidth*4; + } else if (internalFormat == ALPHA) { + int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); + int ashift = firstBit(ddpf->dwRGBAlphaBitMask); + DWORD mask; - if ((internalFormat == J3D_RGBA) || - (internalFormat == J3D_RGB)) { - if ((ddpf->dwRGBBitCount == 32) && - (ddpf->dwRBitMask == 0xff0000) && - (ddpf->dwGBitMask == 0xff00) && - (ddpf->dwBBitMask == 0xff)) { - // Most common case - // Note that format of destination is ARGB, which - // in PC format are BGRA, so we can't directly - // copy a row using CopyMemory() + if ((ddpf->dwRGBBitCount <= 32) && + (ddpf->dwRGBBitCount > 24)) { destRow += (xoffset << 2); for (int i=yoffset; i < ylimit; i++) { src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - r = *src++; - g = *src++; - b = *src++; - *dst++ = b; - *dst++ = g; - *dst++ = r; - *dst++ = *src++; + src += 3; + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) << -aDiscard; + } + mask = a << ashift; + *dst++ = (byte) (mask & 0xff); + *dst++ = (byte) ((mask >> 8) & 0xff); + *dst++ = (byte) ((mask >> 16) & 0xff); + *dst++ = (byte) ((mask >> 24) & 0xff); } srcRow += srcPitch; destRow += rectPitch; } - } else if ((ddpf->dwRGBBitCount == 16) && - (ddpf->dwRBitMask == 0xf00) && - (ddpf->dwGBitMask == 0xf0) && - (ddpf->dwBBitMask == 0xf)) { - destRow += (xoffset << 1); + } else if ((ddpf->dwRGBBitCount <= 24) && + (ddpf->dwRGBBitCount > 16)) { + destRow += (xoffset*3); for (int i=yoffset; i < ylimit; i++) { src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - r = (*src++) >> 4; // discard the lower 4 bit - g = (*src++) >> 4; - b = (*src++) >> 4; - a = (*src++) >> 4; - *dst++ = (g << 4) | b; - *dst++ = (a << 4) | r; + src += 3; + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) << -aDiscard; + } + mask = a << ashift; + *dst++ = (byte) (mask & 0xff); + *dst++ = (byte) ((mask >> 8) & 0xff); + *dst++ = (byte) ((mask >> 16) & 0xff); } srcRow += srcPitch; destRow += rectPitch; } - } else { // handle less common (even weird) format - int rDiscard = 8-ucountBits(ddpf->dwRBitMask); - int gDiscard = 8-ucountBits(ddpf->dwGBitMask); - int bDiscard = 8-ucountBits(ddpf->dwBBitMask); - int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); - int rshift = firstBit(ddpf->dwRBitMask); - int gshift = firstBit(ddpf->dwGBitMask); - int bshift = firstBit(ddpf->dwBBitMask); - int ashift = firstBit(ddpf->dwRGBAlphaBitMask); - DWORD mask; - - if ((ddpf->dwRGBBitCount <= 32) && - (ddpf->dwRGBBitCount > 24)) { - destRow += (xoffset << 2); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - if (rDiscard >= 0) { - r = (*src++) >> rDiscard; - } else { - r = (*src++) << -rDiscard; - } - if (gDiscard >= 0) { - g = (*src++) >> gDiscard; - } else { - g = (*src++) >> -gDiscard; - } - if (bDiscard >= 0) { - b = (*src++) >> bDiscard; - } else { - b = (*src++) >> -bDiscard; - } - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) >> -aDiscard; - } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - *dst++ = (byte) ((mask >> 24) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 24) && - (ddpf->dwRGBBitCount > 16)) { - destRow += (xoffset*3); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - if (rDiscard >= 0) { - r = (*src++) >> rDiscard; - } else { - r = (*src++) << -rDiscard; - } - if (gDiscard >= 0) { - g = (*src++) >> gDiscard; - } else { - g = (*src++) >> -gDiscard; - } - if (bDiscard >= 0) { - b = (*src++) >> bDiscard; - } else { - b = (*src++) >> -bDiscard; - } - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) >> -aDiscard; - } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 16) && - (ddpf->dwRGBBitCount > 8)) { - destRow += (xoffset << 1); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - if (rDiscard >= 0) { - r = (*src++) >> rDiscard; - } else { - r = (*src++) << -rDiscard; - } - if (gDiscard >= 0) { - g = (*src++) >> gDiscard; - } else { - g = (*src++) >> -gDiscard; - } - if (bDiscard >= 0) { - b = (*src++) >> bDiscard; - } else { - b = (*src++) >> -bDiscard; - } - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) >> -aDiscard; - } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); + } else if ((ddpf->dwRGBBitCount <= 16) && + (ddpf->dwRGBBitCount > 8)) { + destRow += (xoffset << 1); + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + src += 3; + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) << -aDiscard; } - srcRow += srcPitch; - destRow += rectPitch; + mask = (a << ashift); + *dst++ = (byte) (mask & 0xff); + *dst++ = (byte) ((mask >> 8) & 0xff); } - } else if (ddpf->dwRGBBitCount <= 8) { - destRow += xoffset; - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - if (rDiscard >= 0) { - r = (*src++) >> rDiscard; - } else { - r = (*src++) << -rDiscard; - } - if (gDiscard >= 0) { - g = (*src++) >> gDiscard; - } else { - g = (*src++) >> -gDiscard; - } - if (bDiscard >= 0) { - b = (*src++) >> bDiscard; - } else { - b = (*src++) >> -bDiscard; - } - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) >> -aDiscard; - } - *dst++ = (byte) ((r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift)); + srcRow += srcPitch; + destRow += rectPitch; + } + } else if (ddpf->dwRGBBitCount <= 8) { + destRow += xoffset; + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + src += 3; + if (aDiscard >= 0) { + a = (*src++) >> aDiscard; + } else { + a = (*src++) << -aDiscard; } - srcRow += srcPitch; - destRow += rectPitch; + *dst++ = (byte) (a << ashift); } - } else { - // should not happen, RGBBitCount > 32. Even DirectX - // RGB mask can't address it. - printf("Texture memory with RGBBitCount = %d not support. \n", - ddpf->dwRGBBitCount); + srcRow += srcPitch; + destRow += rectPitch; } + } else { + printf("Texture memory with RGBBitCount = %d not support. \n", + ddpf->dwRGBBitCount); } - } else if (internalFormat == LUMINANCE_ALPHA) { - + } else if ((internalFormat == LUMINANCE) || + (internalFormat == INTENSITY)) { int rDiscard = 8-ucountBits(ddpf->dwRBitMask); int gDiscard = 8-ucountBits(ddpf->dwGBitMask); int bDiscard = 8-ucountBits(ddpf->dwBBitMask); @@ -6780,14 +6757,8 @@ void copyDataToSurfaceRGBA(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { + src += 3; l = *src++; - src++; - src++; - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -6803,8 +6774,13 @@ void copyDataToSurfaceRGBA(jint internalFormat, } else { b = l << -bDiscard; } + if (aDiscard >= 0) { + a = l >> aDiscard; + } else { + a = l << -aDiscard; + } mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); + (b << bshift) | (a << ashift); *dst++ = (byte) (mask & 0xff); *dst++ = (byte) ((mask >> 8) & 0xff); *dst++ = (byte) ((mask >> 16) & 0xff); @@ -6820,14 +6796,8 @@ void copyDataToSurfaceRGBA(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { + src += 3; l = *src++; - src++; - src++; - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -6843,8 +6813,13 @@ void copyDataToSurfaceRGBA(jint internalFormat, } else { b = l << -bDiscard; } + if (aDiscard >= 0) { + a = l >> aDiscard; + } else { + a = l << -aDiscard; + } mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); + (b << bshift) | (a << ashift); *dst++ = (byte) (mask & 0xff); *dst++ = (byte) ((mask >> 8) & 0xff); *dst++ = (byte) ((mask >> 16) & 0xff); @@ -6859,14 +6834,8 @@ void copyDataToSurfaceRGBA(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { + src += 3; l = *src++; - src++; - src++; - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -6882,8 +6851,13 @@ void copyDataToSurfaceRGBA(jint internalFormat, } else { b = l << -bDiscard; } + if (aDiscard >= 0) { + a = l >> aDiscard; + } else { + a = l << -aDiscard; + } mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); + (b << bshift) | (a << ashift); *dst++ = (byte) (mask & 0xff); *dst++ = (byte) ((mask >> 8) & 0xff); } @@ -6896,261 +6870,7 @@ void copyDataToSurfaceRGBA(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - l = *src++; - src++; - src++; - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - *dst++ = (byte) ((r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift)); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else { - printf("Texture memory with RGBBitCount = %d not support. \n", - ddpf->dwRGBBitCount); - } - } else if (internalFormat == ALPHA) { - int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); - int ashift = firstBit(ddpf->dwRGBAlphaBitMask); - DWORD mask; - - if ((ddpf->dwRGBBitCount <= 32) && - (ddpf->dwRGBBitCount > 24)) { - destRow += (xoffset << 2); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 3; - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } - mask = a << ashift; - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - *dst++ = (byte) ((mask >> 24) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 24) && - (ddpf->dwRGBBitCount > 16)) { - destRow += (xoffset*3); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 3; - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } - mask = a << ashift; - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 16) && - (ddpf->dwRGBBitCount > 8)) { - destRow += (xoffset << 1); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 3; - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } - mask = (a << ashift); - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if (ddpf->dwRGBBitCount <= 8) { - destRow += xoffset; - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 3; - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; - } else { - a = (*src++) << -aDiscard; - } - *dst++ = (byte) (a << ashift); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else { - printf("Texture memory with RGBBitCount = %d not support. \n", - ddpf->dwRGBBitCount); - } - } else if ((internalFormat == LUMINANCE) || - (internalFormat == INTENSITY)) { - int rDiscard = 8-ucountBits(ddpf->dwRBitMask); - int gDiscard = 8-ucountBits(ddpf->dwGBitMask); - int bDiscard = 8-ucountBits(ddpf->dwBBitMask); - int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); - int rshift = firstBit(ddpf->dwRBitMask); - int gshift = firstBit(ddpf->dwGBitMask); - int bshift = firstBit(ddpf->dwBBitMask); - int ashift = firstBit(ddpf->dwRGBAlphaBitMask); - DWORD mask; - - if ((ddpf->dwRGBBitCount <= 32) && - (ddpf->dwRGBBitCount > 24)) { - destRow += (xoffset << 2); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 3; - l = *src++; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; - } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - *dst++ = (byte) ((mask >> 24) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 24) && - (ddpf->dwRGBBitCount > 16)) { - destRow += (xoffset*3); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 3; - l = *src++; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; - } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 16) && - (ddpf->dwRGBBitCount > 8)) { - destRow += (xoffset << 1); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 3; - l = *src++; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; - } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if (ddpf->dwRGBBitCount <= 8) { - destRow += xoffset; - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 3; + src += 3; l = *src++; if (rDiscard >= 0) { r = l >> rDiscard; @@ -10296,570 +10016,40 @@ void copyInt_XBGR_DataToSurface(jint textureFormat, for (int j=xoffset; j < xlimit; j++) { if (rDiscard >= 0) { r = (*src++) >> rDiscard; - } else { - r = (*src++) << -rDiscard; - } - if (gDiscard >= 0) { - g = (*src++) >> gDiscard; - } else { - g = (*src++) >> -gDiscard; - } - if (bDiscard >= 0) { - b = (*src++) >> bDiscard; - } else { - b = (*src++) >> -bDiscard; - } - *src++; /* a */ - *dst++ = (byte) ((r << rshift) | (g << gshift) | - (b << bshift) | ddpf->dwRGBAlphaBitMask); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else { - // should not happen, RGBBitCount > 32. Even DirectX - // RGB mask can't address it. - printf("Texture memory with RGBBitCount = %d not support. \n", - ddpf->dwRGBBitCount); - } - } - } else if (textureFormat == LUMINANCE_ALPHA) { - int rDiscard = 8-ucountBits(ddpf->dwRBitMask); - int gDiscard = 8-ucountBits(ddpf->dwGBitMask); - int bDiscard = 8-ucountBits(ddpf->dwBBitMask); - int rshift = firstBit(ddpf->dwRBitMask); - int gshift = firstBit(ddpf->dwGBitMask); - int bshift = firstBit(ddpf->dwBBitMask); - DWORD mask; - - if ((ddpf->dwRGBBitCount <= 32) && - (ddpf->dwRGBBitCount > 24)) { - destRow += (xoffset << 2); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - l = *src++; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - src += 3; - mask = (r << rshift) | (g << gshift) | - (b << bshift) | ddpf->dwRGBAlphaBitMask; - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - *dst++ = (byte) ((mask >> 24) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 24) && - (ddpf->dwRGBBitCount > 16)) { - destRow += (xoffset*3); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - l = *src++; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - src += 3; - mask = (r << rshift) | (g << gshift) | - (b << bshift) | ddpf->dwRGBAlphaBitMask; - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 16) && - (ddpf->dwRGBBitCount > 8)) { - destRow += (xoffset << 1); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - l = *src++; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - src += 3; - mask = (r << rshift) | (g << gshift) | - (b << bshift) | ddpf->dwRGBAlphaBitMask; - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if (ddpf->dwRGBBitCount <= 8) { - destRow += xoffset; - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - l = *src++; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - src += 3; - *dst++ = (byte) ((r << rshift) | (g << gshift) | - (b << bshift) |ddpf->dwRGBAlphaBitMask); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else { - printf("Texture memory with RGBBitCount = %d not support. \n", - ddpf->dwRGBBitCount); - } - } else if (textureFormat == ALPHA) { - byte m1 = (byte) (ddpf->dwRGBAlphaBitMask & 0xff); - byte m2 = (byte) ((ddpf->dwRGBAlphaBitMask >> 8) & 0xff); - byte m3 = (byte) ((ddpf->dwRGBAlphaBitMask >> 16) & 0xff); - byte m4 = (byte) ((ddpf->dwRGBAlphaBitMask >> 24) & 0xff); - - if ((ddpf->dwRGBBitCount <= 32) && - (ddpf->dwRGBBitCount > 24)) { - destRow += (xoffset << 2); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 4; - *dst++ = m1; - *dst++ = m2; - *dst++ = m3; - *dst++ = m4; - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 24) && - (ddpf->dwRGBBitCount > 16)) { - destRow += (xoffset*3); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 4; - *dst++ = m1; - *dst++ = m2; - *dst++ = m3; - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 16) && - (ddpf->dwRGBBitCount > 8)) { - destRow += (xoffset << 1); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 4; - *dst++ = m1; - *dst++ = m2; - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if (ddpf->dwRGBBitCount <= 8) { - destRow += xoffset; - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - src += 4; - *dst++ = m1; - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else { - printf("Texture memory with RGBBitCount = %d not support. \n", - ddpf->dwRGBBitCount); - } - } else if ((textureFormat == LUMINANCE) || - (textureFormat == INTENSITY)) { - int rDiscard = 8-ucountBits(ddpf->dwRBitMask); - int gDiscard = 8-ucountBits(ddpf->dwGBitMask); - int bDiscard = 8-ucountBits(ddpf->dwBBitMask); - int rshift = firstBit(ddpf->dwRBitMask); - int gshift = firstBit(ddpf->dwGBitMask); - int bshift = firstBit(ddpf->dwBBitMask); - DWORD mask; - - if ((ddpf->dwRGBBitCount <= 32) && - (ddpf->dwRGBBitCount > 24)) { - destRow += (xoffset << 2); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - l = *src; - src += 4; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | ddpf->dwRGBAlphaBitMask; - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - *dst++ = (byte) ((mask >> 24) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 24) && - (ddpf->dwRGBBitCount > 16)) { - destRow += (xoffset*3); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - l = *src; - src += 4; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | ddpf->dwRGBAlphaBitMask; - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - *dst++ = (byte) ((mask >> 16) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if ((ddpf->dwRGBBitCount <= 16) && - (ddpf->dwRGBBitCount > 8)) { - destRow += (xoffset << 1); - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - l = *src; - src += 4; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - mask = (r << rshift) | (g << gshift) | - (b << bshift) | ddpf->dwRGBAlphaBitMask; - *dst++ = (byte) (mask & 0xff); - *dst++ = (byte) ((mask >> 8) & 0xff); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else if (ddpf->dwRGBBitCount <= 8) { - destRow += xoffset; - for (int i=yoffset; i < ylimit; i++) { - src = srcRow; - dst = destRow; - for (int j=xoffset; j < xlimit; j++) { - l = *src; - src += 4; - if (rDiscard >= 0) { - r = l >> rDiscard; - } else { - r = l << -rDiscard; - } - if (gDiscard >= 0) { - g = l >> gDiscard; - } else { - g = l << -gDiscard; - } - if (bDiscard >= 0) { - b = l >> bDiscard; - } else { - b = l << -bDiscard; - } - *dst++ = (byte) ((r << rshift) | - (g << gshift) | - (b << bshift) | - ddpf->dwRGBAlphaBitMask); - } - srcRow += srcPitch; - destRow += rectPitch; - } - } else { - printf("Texture memory with RGBBitCount = %d not support. \n", - ddpf->dwRGBBitCount); - } - } else { - printf("Texture format %d not support.\n", textureFormat); - } -} - -/* - * Copy data from memory to DirectDraw surface - * - * Source image with WIDTH = tilew, the subimage with - * dimension (subWidth, subHeight) is copy with - * offset = (imgXOffset, imgYOffset) from the start - * pointer *data. - * - * Destination frame buffer is copy with - * offset = (xoffset, yoffset) - * - */ -void copyDataToSurface(jint imageFormat, - jint textureFormat, - jint xoffset, jint yoffset, - jint imgXOffset, jint imgYOffset, - jint subWidth, jint subHeight, - jint tilew, jbyte *data, - LPDIRECT3DTEXTURE9 surf, - jint level) -{ - D3DSURFACE_DESC ddsd; - D3DLOCKED_RECT lockedRect; - PIXELFORMAT ddpf; - HRESULT hr; - - if (surf == NULL) { - return; - } - surf->GetLevelDesc(level, &ddsd); - DWORD width = ddsd.Width; - DWORD height = ddsd.Height; - computePixelFormat(&ddpf, ddsd.Format); - - // It is possible when texture is not a power of 2 or - // square only texture is required in hardware. In these - // case the hardware memory buffer may smaller than the - // texture pass in. - - if ((xoffset >= width) || (yoffset >= height)) { - return; - } - - DWORD xlimit = min(xoffset + subWidth, width); - DWORD ylimit = min(yoffset + subHeight, height); - - hr = surf->LockRect(level, &lockedRect, NULL, 0); - - - if (FAILED(hr)) { - printf("Fail to lock surface: %s\n", DXGetErrorString9(hr)); - return; - } - int offset = tilew*imgYOffset + imgXOffset; - switch (imageFormat) { - case IMAGE_FORMAT_BYTE_RGBA : - /* printf("[IMAGE_FORMAT_BYTE_RGBA] imageFormat %d, textureFormat %d\n", - imageFormat, textureFormat); */ - - // This is the one we use when byReference = false - copyDataToSurfaceRGBA(textureFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 2), - xoffset, yoffset, - xlimit, ylimit, tilew); - break; - case IMAGE_FORMAT_BYTE_RGB: - /* printf("[IMAGE_FORMAT_BYTE_RGB] imageFormat %d, textureFormat %d\n", - imageFormat, textureFormat); */ - copyDataToSurfaceRGB(textureFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + 3*offset, - xoffset, yoffset, - xlimit, ylimit, tilew); - break; - case IMAGE_FORMAT_BYTE_ABGR: - /* printf("[IMAGE_FORMAT_BYTE_ABGR] imageFormat %d, textureFormat %d\n", - imageFormat, textureFormat); */ - - copyDataToSurfaceABGR(textureFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 2), - xoffset, yoffset, - xlimit, ylimit, tilew); - break; - case IMAGE_FORMAT_BYTE_BGR: - /* printf("[IMAGE_FORMAT_BYTE_BGR] imageFormat %d, textureFormat %d\n", - imageFormat, textureFormat); */ - - copyDataToSurfaceBGR(textureFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + 3*offset, - xoffset, yoffset, - xlimit, ylimit, tilew); - break; - case IMAGE_FORMAT_BYTE_LA: - copyDataToSurfaceLA(textureFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 1), - xoffset, yoffset, - xlimit, ylimit, tilew); - break; - case IMAGE_FORMAT_BYTE_GRAY: - copyDataToSurfaceGray(textureFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + offset, - xoffset, yoffset, - xlimit, ylimit, tilew); - break; - case IMAGE_FORMAT_INT_BGR: - /* printf("[IMAGE_FORMAT_INT_BGR] imageFormat %d, textureFormat %d not support !\n", - imageFormat, textureFormat); */ - copyInt_XBGR_DataToSurface(textureFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 2), - xoffset, yoffset, - xlimit, ylimit, tilew); - - break; - case IMAGE_FORMAT_INT_RGB: - /* printf("[IMAGE_FORMAT_INT_RGB] imageFormat %d, textureFormat %d\n", - imageFormat, textureFormat); */ - copyInt_XRGB_DataToSurface(textureFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 2), - xoffset, yoffset, - xlimit, ylimit, tilew); - break; - case IMAGE_FORMAT_INT_ARGB: - /* printf("[IMAGE_FORMAT_INT_ABGR] imageFormat %d, textureFormat %d\n", - imageFormat, textureFormat); */ - copyInt_ARGB_DataToSurface(textureFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 2), - xoffset, yoffset, - xlimit, ylimit, tilew); - break; - default: // should not happen - printf("[Java 3D] imageFormat %d, textureFormat %d not support !\n", - imageFormat, textureFormat); - } - - hr = surf->UnlockRect(level); - if (FAILED(hr)) { - printf("Fail to unlock surface: %s\n", DXGetErrorString9(hr)); - return; - } -} - - - -void copyDataToSurfaceGray(jint internalFormat, - PIXELFORMAT *ddpf, - unsigned char* pRect, - DWORD rectPitch, - jshort *data, - jint xoffset, jint yoffset, - DWORD xlimit, DWORD ylimit, - jint subWidth) -{ - unsigned char *src; - unsigned char *dst; - DWORD a, r, g, b, l; - DWORD srcPitch = subWidth << 1; - unsigned char *srcRow = (unsigned char *) data; - unsigned char *destRow = pRect + rectPitch*yoffset; - - - if (internalFormat == ALPHA) { - int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); - int ashift = firstBit(ddpf->dwRGBAlphaBitMask); + } else { + r = (*src++) << -rDiscard; + } + if (gDiscard >= 0) { + g = (*src++) >> gDiscard; + } else { + g = (*src++) >> -gDiscard; + } + if (bDiscard >= 0) { + b = (*src++) >> bDiscard; + } else { + b = (*src++) >> -bDiscard; + } + *src++; /* a */ + *dst++ = (byte) ((r << rshift) | (g << gshift) | + (b << bshift) | ddpf->dwRGBAlphaBitMask); + } + srcRow += srcPitch; + destRow += rectPitch; + } + } else { + // should not happen, RGBBitCount > 32. Even DirectX + // RGB mask can't address it. + printf("Texture memory with RGBBitCount = %d not support. \n", + ddpf->dwRGBBitCount); + } + } + } else if (textureFormat == LUMINANCE_ALPHA) { + int rDiscard = 8-ucountBits(ddpf->dwRBitMask); + int gDiscard = 8-ucountBits(ddpf->dwGBitMask); + int bDiscard = 8-ucountBits(ddpf->dwBBitMask); + int rshift = firstBit(ddpf->dwRBitMask); + int gshift = firstBit(ddpf->dwGBitMask); + int bshift = firstBit(ddpf->dwBBitMask); DWORD mask; if ((ddpf->dwRGBBitCount <= 32) && @@ -10869,13 +10059,25 @@ void copyDataToSurfaceGray(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; + l = *src++; + if (rDiscard >= 0) { + r = l >> rDiscard; } else { - a = (*src++) << -aDiscard; + r = l << -rDiscard; } - mask = a << ashift; + if (gDiscard >= 0) { + g = l >> gDiscard; + } else { + g = l << -gDiscard; + } + if (bDiscard >= 0) { + b = l >> bDiscard; + } else { + b = l << -bDiscard; + } + src += 3; + mask = (r << rshift) | (g << gshift) | + (b << bshift) | ddpf->dwRGBAlphaBitMask; *dst++ = (byte) (mask & 0xff); *dst++ = (byte) ((mask >> 8) & 0xff); *dst++ = (byte) ((mask >> 16) & 0xff); @@ -10891,13 +10093,25 @@ void copyDataToSurfaceGray(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; + l = *src++; + if (rDiscard >= 0) { + r = l >> rDiscard; } else { - a = (*src++) << -aDiscard; + r = l << -rDiscard; } - mask = a << ashift; + if (gDiscard >= 0) { + g = l >> gDiscard; + } else { + g = l << -gDiscard; + } + if (bDiscard >= 0) { + b = l >> bDiscard; + } else { + b = l << -bDiscard; + } + src += 3; + mask = (r << rshift) | (g << gshift) | + (b << bshift) | ddpf->dwRGBAlphaBitMask; *dst++ = (byte) (mask & 0xff); *dst++ = (byte) ((mask >> 8) & 0xff); *dst++ = (byte) ((mask >> 16) & 0xff); @@ -10912,13 +10126,25 @@ void copyDataToSurfaceGray(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; + l = *src++; + if (rDiscard >= 0) { + r = l >> rDiscard; } else { - a = (*src++) << -aDiscard; + r = l << -rDiscard; } - mask = (a << ashift); + if (gDiscard >= 0) { + g = l >> gDiscard; + } else { + g = l << -gDiscard; + } + if (bDiscard >= 0) { + b = l >> bDiscard; + } else { + b = l << -bDiscard; + } + src += 3; + mask = (r << rshift) | (g << gshift) | + (b << bshift) | ddpf->dwRGBAlphaBitMask; *dst++ = (byte) (mask & 0xff); *dst++ = (byte) ((mask >> 8) & 0xff); } @@ -10931,13 +10157,25 @@ void copyDataToSurfaceGray(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - if (aDiscard >= 0) { - a = (*src++) >> aDiscard; + l = *src++; + if (rDiscard >= 0) { + r = l >> rDiscard; } else { - a = (*src++) << -aDiscard; + r = l << -rDiscard; } - *dst++ = (byte) (a << ashift); + if (gDiscard >= 0) { + g = l >> gDiscard; + } else { + g = l << -gDiscard; + } + if (bDiscard >= 0) { + b = l >> bDiscard; + } else { + b = l << -bDiscard; + } + src += 3; + *dst++ = (byte) ((r << rshift) | (g << gshift) | + (b << bshift) |ddpf->dwRGBAlphaBitMask); } srcRow += srcPitch; destRow += rectPitch; @@ -10946,19 +10184,83 @@ void copyDataToSurfaceGray(jint internalFormat, printf("Texture memory with RGBBitCount = %d not support. \n", ddpf->dwRGBBitCount); } - } else if ((internalFormat == LUMINANCE) || - (internalFormat == INTENSITY)) { + } else if (textureFormat == ALPHA) { + byte m1 = (byte) (ddpf->dwRGBAlphaBitMask & 0xff); + byte m2 = (byte) ((ddpf->dwRGBAlphaBitMask >> 8) & 0xff); + byte m3 = (byte) ((ddpf->dwRGBAlphaBitMask >> 16) & 0xff); + byte m4 = (byte) ((ddpf->dwRGBAlphaBitMask >> 24) & 0xff); + + if ((ddpf->dwRGBBitCount <= 32) && + (ddpf->dwRGBBitCount > 24)) { + destRow += (xoffset << 2); + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + src += 4; + *dst++ = m1; + *dst++ = m2; + *dst++ = m3; + *dst++ = m4; + } + srcRow += srcPitch; + destRow += rectPitch; + } + } else if ((ddpf->dwRGBBitCount <= 24) && + (ddpf->dwRGBBitCount > 16)) { + destRow += (xoffset*3); + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + src += 4; + *dst++ = m1; + *dst++ = m2; + *dst++ = m3; + } + srcRow += srcPitch; + destRow += rectPitch; + } + } else if ((ddpf->dwRGBBitCount <= 16) && + (ddpf->dwRGBBitCount > 8)) { + destRow += (xoffset << 1); + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + src += 4; + *dst++ = m1; + *dst++ = m2; + } + srcRow += srcPitch; + destRow += rectPitch; + } + } else if (ddpf->dwRGBBitCount <= 8) { + destRow += xoffset; + for (int i=yoffset; i < ylimit; i++) { + src = srcRow; + dst = destRow; + for (int j=xoffset; j < xlimit; j++) { + src += 4; + *dst++ = m1; + } + srcRow += srcPitch; + destRow += rectPitch; + } + } else { + printf("Texture memory with RGBBitCount = %d not support. \n", + ddpf->dwRGBBitCount); + } + } else if ((textureFormat == LUMINANCE) || + (textureFormat == INTENSITY)) { int rDiscard = 8-ucountBits(ddpf->dwRBitMask); int gDiscard = 8-ucountBits(ddpf->dwGBitMask); int bDiscard = 8-ucountBits(ddpf->dwBBitMask); - int aDiscard = 8-ucountBits(ddpf->dwRGBAlphaBitMask); int rshift = firstBit(ddpf->dwRBitMask); int gshift = firstBit(ddpf->dwGBitMask); int bshift = firstBit(ddpf->dwBBitMask); - int ashift = firstBit(ddpf->dwRGBAlphaBitMask); DWORD mask; - if ((ddpf->dwRGBBitCount <= 32) && (ddpf->dwRGBBitCount > 24)) { destRow += (xoffset << 2); @@ -10966,8 +10268,8 @@ void copyDataToSurfaceGray(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - l = *src++; + l = *src; + src += 4; if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -10983,13 +10285,8 @@ void copyDataToSurfaceGray(jint internalFormat, } else { b = l << -bDiscard; } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; - } mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); + (b << bshift) | ddpf->dwRGBAlphaBitMask; *dst++ = (byte) (mask & 0xff); *dst++ = (byte) ((mask >> 8) & 0xff); *dst++ = (byte) ((mask >> 16) & 0xff); @@ -11005,8 +10302,8 @@ void copyDataToSurfaceGray(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - l = *src++; + l = *src; + src += 4; if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -11022,13 +10319,8 @@ void copyDataToSurfaceGray(jint internalFormat, } else { b = l << -bDiscard; } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; - } mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); + (b << bshift) | ddpf->dwRGBAlphaBitMask; *dst++ = (byte) (mask & 0xff); *dst++ = (byte) ((mask >> 8) & 0xff); *dst++ = (byte) ((mask >> 16) & 0xff); @@ -11043,8 +10335,8 @@ void copyDataToSurfaceGray(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - l = *src++; + l = *src; + src += 4; if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -11060,13 +10352,8 @@ void copyDataToSurfaceGray(jint internalFormat, } else { b = l << -bDiscard; } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; - } mask = (r << rshift) | (g << gshift) | - (b << bshift) | (a << ashift); + (b << bshift) | ddpf->dwRGBAlphaBitMask; *dst++ = (byte) (mask & 0xff); *dst++ = (byte) ((mask >> 8) & 0xff); } @@ -11079,8 +10366,8 @@ void copyDataToSurfaceGray(jint internalFormat, src = srcRow; dst = destRow; for (int j=xoffset; j < xlimit; j++) { - *src++; // discard lower order byte - l = *src++; + l = *src; + src += 4; if (rDiscard >= 0) { r = l >> rDiscard; } else { @@ -11096,15 +10383,10 @@ void copyDataToSurfaceGray(jint internalFormat, } else { b = l << -bDiscard; } - if (aDiscard >= 0) { - a = l >> aDiscard; - } else { - a = l << -aDiscard; - } - *dst++ = (byte) ((r << rshift) | - (g << gshift) | - (b << bshift) | - (a << ashift)); + *dst++ = (byte) ((r << rshift) | + (g << gshift) | + (b << bshift) | + ddpf->dwRGBAlphaBitMask); } srcRow += srcPitch; destRow += rectPitch; @@ -11114,7 +10396,165 @@ void copyDataToSurfaceGray(jint internalFormat, ddpf->dwRGBBitCount); } } else { - printf("Texture format %d not support.\n", internalFormat); + printf("Texture format %d not support.\n", textureFormat); + } +} + +/* + * Copy data from memory to DirectDraw surface + * + * Source image with WIDTH = tilew, the subimage with + * dimension (subWidth, subHeight) is copy with + * offset = (imgXOffset, imgYOffset) from the start + * pointer *data. + * + * Destination frame buffer is copy with + * offset = (xoffset, yoffset) + * + */ +void copyDataToSurface(jint imageFormat, + jint textureFormat, + jint xoffset, jint yoffset, + jint imgXOffset, jint imgYOffset, + jint subWidth, jint subHeight, + jint tilew, jbyte *data, + LPDIRECT3DTEXTURE9 surf, + jint level) +{ + D3DSURFACE_DESC ddsd; + D3DLOCKED_RECT lockedRect; + PIXELFORMAT ddpf; + HRESULT hr; + + if (surf == NULL) { + return; + } + surf->GetLevelDesc(level, &ddsd); + DWORD width = ddsd.Width; + DWORD height = ddsd.Height; + computePixelFormat(&ddpf, ddsd.Format); + + // It is possible when texture is not a power of 2 or + // square only texture is required in hardware. In these + // case the hardware memory buffer may smaller than the + // texture pass in. + + if ((xoffset >= width) || (yoffset >= height)) { + return; + } + + DWORD xlimit = min(xoffset + subWidth, width); + DWORD ylimit = min(yoffset + subHeight, height); + + hr = surf->LockRect(level, &lockedRect, NULL, 0); + + + if (FAILED(hr)) { + printf("Fail to lock surface: %s\n", DXGetErrorString9(hr)); + return; + } + int offset = tilew*imgYOffset + imgXOffset; + switch (imageFormat) { + case IMAGE_FORMAT_BYTE_RGBA : + /* printf("[IMAGE_FORMAT_BYTE_RGBA] imageFormat %d, textureFormat %d\n", + imageFormat, textureFormat); */ + + // This is the one we use when byReference = false + copyDataToSurfaceRGBA(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 2), + xoffset, yoffset, + xlimit, ylimit, tilew); + break; + case IMAGE_FORMAT_BYTE_RGB: + /* printf("[IMAGE_FORMAT_BYTE_RGB] imageFormat %d, textureFormat %d\n", + imageFormat, textureFormat); */ + copyDataToSurfaceRGB(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + 3*offset, + xoffset, yoffset, + xlimit, ylimit, tilew); + break; + case IMAGE_FORMAT_BYTE_ABGR: + /* printf("[IMAGE_FORMAT_BYTE_ABGR] imageFormat %d, textureFormat %d\n", + imageFormat, textureFormat); */ + + copyDataToSurfaceABGR(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 2), + xoffset, yoffset, + xlimit, ylimit, tilew); + break; + case IMAGE_FORMAT_BYTE_BGR: + /* printf("[IMAGE_FORMAT_BYTE_BGR] imageFormat %d, textureFormat %d\n", + imageFormat, textureFormat); */ + + copyDataToSurfaceBGR(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + 3*offset, + xoffset, yoffset, + xlimit, ylimit, tilew); + break; + case IMAGE_FORMAT_BYTE_LA: + copyDataToSurfaceLA(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 1), + xoffset, yoffset, + xlimit, ylimit, tilew); + break; + case IMAGE_FORMAT_BYTE_GRAY: + copyDataToSurfaceGray(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + offset, + xoffset, yoffset, + xlimit, ylimit, tilew); + break; + case IMAGE_FORMAT_INT_BGR: + /* printf("[IMAGE_FORMAT_INT_BGR] imageFormat %d, textureFormat %d not support !\n", + imageFormat, textureFormat); */ + copyInt_XBGR_DataToSurface(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 2), + xoffset, yoffset, + xlimit, ylimit, tilew); + + break; + case IMAGE_FORMAT_INT_RGB: + /* printf("[IMAGE_FORMAT_INT_RGB] imageFormat %d, textureFormat %d\n", + imageFormat, textureFormat); */ + copyInt_XRGB_DataToSurface(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 2), + xoffset, yoffset, + xlimit, ylimit, tilew); + break; + case IMAGE_FORMAT_INT_ARGB: + /* printf("[IMAGE_FORMAT_INT_ABGR] imageFormat %d, textureFormat %d\n", + imageFormat, textureFormat); */ + copyInt_ARGB_DataToSurface(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 2), + xoffset, yoffset, + xlimit, ylimit, tilew); + break; + default: // should not happen + printf("[Java 3D] imageFormat %d, textureFormat %d not support !\n", + imageFormat, textureFormat); + } + + hr = surf->UnlockRect(level); + if (FAILED(hr)) { + printf("Fail to unlock surface: %s\n", DXGetErrorString9(hr)); + return; } } @@ -12000,234 +11440,66 @@ void copyDepthToSurface(D3dCtx *d3dCtx, } if (!d3dCtx->zEnable) { - copyDepthToSurfaceAlways(dst_xoffset, dst_yoffset, - src_xoffset, src_yoffset, - subWidth, subHeight, - src_width, src_height, - data, surf); - } else { - // Currently ZFUNC must be D3DCMP_LESS - copyDepthToSurfaceCmp(dst_xoffset, dst_yoffset, - src_xoffset, src_yoffset, - subWidth, subHeight, - src_width, src_height, - data, surf); - } -} - - -// copy data to DirectDraw depth surface from memory -// and reverse the Y axis -void copyDepthToSurface(D3dCtx *d3dCtx, - LPDIRECT3DDEVICE9 device, - jint dst_xoffset, jint dst_yoffset, - jint src_xoffset, jint src_yoffset, - jint subWidth, jint subHeight, - jint src_width, jint src_height, - jfloat *data, - LPDIRECT3DSURFACE9 surf) -{ - if (!d3dCtx->zWriteEnable) { - return; - } - - if (!d3dCtx->zEnable) { - copyDepthToSurfaceAlways(dst_xoffset, dst_yoffset, - src_xoffset, src_yoffset, - subWidth, subHeight, - src_width, src_height, - data, surf); - } else { - // Currently ZFUNC must be D3DCMP_LESS - copyDepthToSurfaceCmp(dst_xoffset, dst_yoffset, - src_xoffset, src_yoffset, - subWidth, subHeight, - src_width, src_height, - data, surf); - } -} - -void copyDataToVolume(jint storedFormat, - jint internalFormat, - jint xoffset, jint yoffset, - jint zoffset, - jint imgXOffset, jint imgYOffset, - jint imgZOffset, - jint subWidth, jint subHeight, jint subDepth, - jint tilew, jint tileh, - jbyte* data, - LPDIRECT3DVOLUMETEXTURE9 surf, - jint level) -{ - - D3DVOLUME_DESC ddsd; - D3DLOCKED_BOX lockedBox; - PIXELFORMAT ddpf; - HRESULT hr; - UINT i; - - if (surf == NULL) { - return; - } - surf->GetLevelDesc(level, &ddsd); - DWORD width = ddsd.Width; - DWORD height = ddsd.Height; - DWORD depth = ddsd.Depth; - computePixelFormat(&ddpf, ddsd.Format); - - // It is possible when texture is not a power of 2 or - // square only texture is required in hardware. In these - // case the hardware memory buffer may smaller than the - // texture pass in. - - if ((xoffset >= width) || - (yoffset >= height) || - (zoffset >= depth)) { - return; - } - - DWORD xlimit = min(xoffset + subWidth, width); - DWORD ylimit = min(yoffset + subHeight, height); - DWORD zlimit = min(zoffset + subDepth, depth); - - hr = surf->LockBox(level, &lockedBox, NULL, 0); - - - if (FAILED(hr)) { - printf("Fail to lock volume: %s\n", DXGetErrorString9(hr)); - return; - } - - int imgOffset = tilew*(tileh*imgZOffset + imgYOffset) + imgXOffset; - int srcSlicePitch = tilew*tileh; - unsigned char* p = (unsigned char *) lockedBox.pBits + - zoffset*lockedBox.SlicePitch; - - - - switch (storedFormat) { - case IMAGE_FORMAT_BYTE_RGBA : - // This is the one we use when byReference = false - data += (imgOffset << 2); - srcSlicePitch <<= 2; - - for (i = zoffset; i < zlimit; i++) { - copyDataToSurfaceRGBA(internalFormat, &ddpf, - p, - lockedBox.RowPitch, - data, - xoffset, yoffset, - xlimit, ylimit, - tilew); - p += lockedBox.SlicePitch; - data += srcSlicePitch; - } - - break; - case IMAGE_FORMAT_BYTE_RGB: - data += (imgOffset*3); - srcSlicePitch *= 3; - - for (i = zoffset; i < zlimit; i++) { - copyDataToSurfaceRGB(internalFormat, &ddpf, - p, - lockedBox.RowPitch, - data, - xoffset, yoffset, - xlimit, ylimit, - tilew); - p += lockedBox.SlicePitch; - data += srcSlicePitch; - } - break; - case IMAGE_FORMAT_BYTE_ABGR: - data += (imgOffset << 2); - srcSlicePitch <<= 2; - - for (i = zoffset; i < zlimit; i++) { - copyDataToSurfaceABGR(internalFormat, &ddpf, - p, - lockedBox.RowPitch, - data, - xoffset, yoffset, - xlimit, ylimit, - tilew); - p += lockedBox.SlicePitch; - data += srcSlicePitch; - } - break; - case IMAGE_FORMAT_BYTE_BGR: - data += (imgOffset*3); - srcSlicePitch *= 3; - - for (i = zoffset; i < zlimit; i++) { - copyDataToSurfaceBGR(internalFormat, &ddpf, - p, - lockedBox.RowPitch, - data, - xoffset, yoffset, - xlimit, ylimit, - tilew); - p += lockedBox.SlicePitch; - data += srcSlicePitch; - } - break; - case IMAGE_FORMAT_BYTE_LA: - data += (imgOffset << 1); - srcSlicePitch <<= 1; - - for (i = zoffset; i < zlimit; i++) { - copyDataToSurfaceLA(internalFormat, &ddpf, - p, - lockedBox.RowPitch, - data, - xoffset, yoffset, - xlimit, ylimit, - tilew); - p += lockedBox.SlicePitch; - data += srcSlicePitch; - } - break; - case IMAGE_FORMAT_BYTE_GRAY: - data += imgOffset; - - for (i = zoffset; i < zlimit; i++) { - copyDataToSurfaceGray(internalFormat, &ddpf, - p, - lockedBox.RowPitch, - data, - xoffset, yoffset, - xlimit, ylimit, - tilew); - p += lockedBox.SlicePitch; - data += srcSlicePitch; - } - break; - default: // should not happen - printf("[Java 3D] StoredFormat %d, internalFormat %d not support !\n", - storedFormat, internalFormat); + copyDepthToSurfaceAlways(dst_xoffset, dst_yoffset, + src_xoffset, src_yoffset, + subWidth, subHeight, + src_width, src_height, + data, surf); + } else { + // Currently ZFUNC must be D3DCMP_LESS + copyDepthToSurfaceCmp(dst_xoffset, dst_yoffset, + src_xoffset, src_yoffset, + subWidth, subHeight, + src_width, src_height, + data, surf); } +} - hr = surf->UnlockBox(level); - if (FAILED(hr)) { - printf("Fail to unlock volume: %s\n", DXGetErrorString9(hr)); + +// copy data to DirectDraw depth surface from memory +// and reverse the Y axis +void copyDepthToSurface(D3dCtx *d3dCtx, + LPDIRECT3DDEVICE9 device, + jint dst_xoffset, jint dst_yoffset, + jint src_xoffset, jint src_yoffset, + jint subWidth, jint subHeight, + jint src_width, jint src_height, + jfloat *data, + LPDIRECT3DSURFACE9 surf) +{ + if (!d3dCtx->zWriteEnable) { return; } -} + if (!d3dCtx->zEnable) { + copyDepthToSurfaceAlways(dst_xoffset, dst_yoffset, + src_xoffset, src_yoffset, + subWidth, subHeight, + src_width, src_height, + data, surf); + } else { + // Currently ZFUNC must be D3DCMP_LESS + copyDepthToSurfaceCmp(dst_xoffset, dst_yoffset, + src_xoffset, src_yoffset, + subWidth, subHeight, + src_width, src_height, + data, surf); + } +} -void copyDataToVolume(jint storedFormat, - jint internalFormat, +void copyDataToVolume(jint imageFormat, + jint textureFormat, jint xoffset, jint yoffset, jint zoffset, jint imgXOffset, jint imgYOffset, jint imgZOffset, jint subWidth, jint subHeight, jint subDepth, jint tilew, jint tileh, - jshort* data, + jbyte* data, LPDIRECT3DVOLUMETEXTURE9 surf, jint level) { + D3DVOLUME_DESC ddsd; D3DLOCKED_BOX lockedBox; PIXELFORMAT ddpf; @@ -12237,14 +11509,16 @@ void copyDataToVolume(jint storedFormat, if (surf == NULL) { return; } - surf->GetLevelDesc(level, &ddsd); DWORD width = ddsd.Width; DWORD height = ddsd.Height; DWORD depth = ddsd.Depth; - computePixelFormat(&ddpf, ddsd.Format); + // It is possible when texture is not a power of 2 or + // square only texture is required in hardware. In these + // case the hardware memory buffer may smaller than the + // texture pass in. if ((xoffset >= width) || (yoffset >= height) || @@ -12252,37 +11526,176 @@ void copyDataToVolume(jint storedFormat, return; } - DWORD xlimit = min(xoffset + subWidth, width); DWORD ylimit = min(yoffset + subHeight, height); DWORD zlimit = min(zoffset + subDepth, depth); hr = surf->LockBox(level, &lockedBox, NULL, 0); + if (FAILED(hr)) { printf("Fail to lock volume: %s\n", DXGetErrorString9(hr)); return; } int imgOffset = tilew*(tileh*imgZOffset + imgYOffset) + imgXOffset; - int srcSlicePitch = (tilew*tileh) << 1; + int srcSlicePitch = tilew*tileh; unsigned char* p = (unsigned char *) lockedBox.pBits + - zoffset*lockedBox.SlicePitch; + zoffset*lockedBox.SlicePitch; - data += (imgOffset << 1); - for (i = zoffset; i < zlimit; i++) { - copyDataToSurfaceGray(internalFormat, &ddpf, - p, - lockedBox.RowPitch, - data, - xoffset, yoffset, - xlimit, ylimit, - tilew); - p += lockedBox.SlicePitch; - data += srcSlicePitch; - } + switch (imageFormat) { + case IMAGE_FORMAT_BYTE_RGBA : + // This is the one we use when byReference = false + data += (imgOffset << 2); + srcSlicePitch <<= 2; + + for (i = zoffset; i < zlimit; i++) { + copyDataToSurfaceRGBA(textureFormat, &ddpf, + p, + lockedBox.RowPitch, + data, + xoffset, yoffset, + xlimit, ylimit, + tilew); + p += lockedBox.SlicePitch; + data += srcSlicePitch; + } + + break; + case IMAGE_FORMAT_BYTE_RGB: + data += (imgOffset*3); + srcSlicePitch *= 3; + + for (i = zoffset; i < zlimit; i++) { + copyDataToSurfaceRGB(textureFormat, &ddpf, + p, + lockedBox.RowPitch, + data, + xoffset, yoffset, + xlimit, ylimit, + tilew); + p += lockedBox.SlicePitch; + data += srcSlicePitch; + } + break; + case IMAGE_FORMAT_BYTE_ABGR: + data += (imgOffset << 2); + srcSlicePitch <<= 2; + + for (i = zoffset; i < zlimit; i++) { + copyDataToSurfaceABGR(textureFormat, &ddpf, + p, + lockedBox.RowPitch, + data, + xoffset, yoffset, + xlimit, ylimit, + tilew); + p += lockedBox.SlicePitch; + data += srcSlicePitch; + } + break; + case IMAGE_FORMAT_BYTE_BGR: + data += (imgOffset*3); + srcSlicePitch *= 3; + + for (i = zoffset; i < zlimit; i++) { + copyDataToSurfaceBGR(textureFormat, &ddpf, + p, + lockedBox.RowPitch, + data, + xoffset, yoffset, + xlimit, ylimit, + tilew); + p += lockedBox.SlicePitch; + data += srcSlicePitch; + } + break; + case IMAGE_FORMAT_BYTE_LA: + data += (imgOffset << 1); + srcSlicePitch <<= 1; + + for (i = zoffset; i < zlimit; i++) { + copyDataToSurfaceLA(textureFormat, &ddpf, + p, + lockedBox.RowPitch, + data, + xoffset, yoffset, + xlimit, ylimit, + tilew); + p += lockedBox.SlicePitch; + data += srcSlicePitch; + } + break; + case IMAGE_FORMAT_BYTE_GRAY: + data += imgOffset; + + for (i = zoffset; i < zlimit; i++) { + copyDataToSurfaceGray(textureFormat, &ddpf, + p, + lockedBox.RowPitch, + data, + xoffset, yoffset, + xlimit, ylimit, + tilew); + p += lockedBox.SlicePitch; + data += srcSlicePitch; + } + break; + case IMAGE_FORMAT_INT_BGR: + data += (imgOffset << 2); + srcSlicePitch <<= 2; + + for (i = zoffset; i < zlimit; i++) { + copyInt_XBGR_DataToSurface(textureFormat, &ddpf, + p, + lockedBox.RowPitch, + data, + xoffset, yoffset, + xlimit, ylimit, + tilew); + p += lockedBox.SlicePitch; + data += srcSlicePitch; + } + break; + case IMAGE_FORMAT_INT_RGB: + data += (imgOffset << 2); + srcSlicePitch <<= 2; + + for (i = zoffset; i < zlimit; i++) { + copyInt_XRGB_DataToSurface(textureFormat, &ddpf, + p, + lockedBox.RowPitch, + data, + xoffset, yoffset, + xlimit, ylimit, + tilew); + p += lockedBox.SlicePitch; + data += srcSlicePitch; + } + break; + case IMAGE_FORMAT_INT_ARGB: + data += (imgOffset << 2); + srcSlicePitch <<= 2; + + for (i = zoffset; i < zlimit; i++) { + copyInt_ARGB_DataToSurface(textureFormat, &ddpf, + p, + lockedBox.RowPitch, + data, + xoffset, yoffset, + xlimit, ylimit, + tilew); + p += lockedBox.SlicePitch; + data += srcSlicePitch; + } + break; + default: // should not happen + printf("[Java 3D] StoredFormat %d, textureFormat %d not support !\n", + imageFormat, textureFormat); + } + hr = surf->UnlockBox(level); if (FAILED(hr)) { printf("Fail to unlock volume: %s\n", DXGetErrorString9(hr)); @@ -12417,7 +11830,7 @@ int getPrimitiveNum(int primitive, int vcount) */ LPDIRECT3DCUBETEXTURE9 createCubeMapTexture(D3dCtx *d3dCtx, jint numLevels, - jint internalFormat, + jint textureFormat, jint width, jint height) { @@ -12433,7 +11846,7 @@ LPDIRECT3DCUBETEXTURE9 createCubeMapTexture(D3dCtx *d3dCtx, } getTexWidthHeight(deviceInfo, &width, &height); - format = getTexFormat(internalFormat); + format = getTexFormat(textureFormat); // If format not support, the utility function will adjust the // calling parameters automatically @@ -12452,75 +11865,8 @@ LPDIRECT3DCUBETEXTURE9 createCubeMapTexture(D3dCtx *d3dCtx, return pTexture; } - -void copyDataToCubeMap(jint storedFormat, - jint internalFormat, - jint xoffset, jint yoffset, - jint imgXOffset, jint imgYOffset, - jint subWidth, jint subHeight, - jint tilew, - jshort *data, LPDIRECT3DCUBETEXTURE9 surf, - jint level, - jint face) -{ - D3DSURFACE_DESC ddsd; - D3DLOCKED_RECT lockedRect; - PIXELFORMAT ddpf; - HRESULT hr; - - if (surf == NULL) { - return; - } - - surf->GetLevelDesc(level, &ddsd); - DWORD width = ddsd.Width; - DWORD height = ddsd.Height; - computePixelFormat(&ddpf, ddsd.Format); - - if ((xoffset >= width) || (yoffset >= height)) { - return; - } - DWORD xlimit = min(xoffset + subWidth, width); - DWORD ylimit = min(yoffset + subHeight, height); - - hr = surf->LockRect(textureCubeMapFace[face], level, - &lockedRect, NULL, 0); - - if (FAILED(hr)) { - printf("Fail to lock surface: %s\n", DXGetErrorString9(hr)); - return; - } - - int offset = tilew*imgYOffset + imgXOffset; - - if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || - (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { - copyDataToSurfaceGray(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + - ((offset+tilew*(ylimit-yoffset)) << 1), - xoffset, yoffset, - xlimit, ylimit, -tilew); - } else { - copyDataToSurfaceGrayRev(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 1), - xoffset, yoffset, - xlimit, ylimit, tilew); - } - - hr = surf->UnlockRect(textureCubeMapFace[face], level); - if (FAILED(hr)) { - printf("Fail to unlock surface: %s\n", DXGetErrorString9(hr)); - return; - } -} - - -void copyDataToCubeMap(jint storedFormat, - jint internalFormat, +void copyDataToCubeMap(jint imageFormat, + jint textureFormat, jint xoffset, jint yoffset, jint imgXOffset, jint imgYOffset, jint subWidth, jint subHeight, @@ -12565,129 +11911,213 @@ void copyDataToCubeMap(jint storedFormat, } int offset = tilew*imgYOffset + imgXOffset; - switch (storedFormat) { - case IMAGE_FORMAT_BYTE_RGBA : - // This is the one we use when byReference = false - if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || - (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { - // Copy the pixel from bottom to up and - // left to right in this case to match OGL definition - copyDataToSurfaceRGBA(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + - ((offset + tilew*(ylimit-yoffset-1)) << 2), - xoffset, yoffset, - xlimit, ylimit, -tilew); - } else { - // Copy the pixel from up to bottom and - // right to left in this case to match OGL definition - copyDataToSurfaceRGBARev(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 2), - xoffset, yoffset, - xlimit, ylimit, tilew); - } - break; - case IMAGE_FORMAT_BYTE_RGB: - if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || - (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { - copyDataToSurfaceRGB(internalFormat, &ddpf, + switch (imageFormat) { + case IMAGE_FORMAT_BYTE_RGBA : + // This is the one we use when byReference = false + if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || + (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { + // Copy the pixel from bottom to up and + // left to right in this case to match OGL definition + copyDataToSurfaceRGBA(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + + ((offset + tilew*(ylimit-yoffset-1)) << 2), + xoffset, yoffset, + xlimit, ylimit, -tilew); + } else { + // Copy the pixel from up to bottom and + // right to left in this case to match OGL definition + copyDataToSurfaceRGBARev(textureFormat, &ddpf, (unsigned char *) lockedRect.pBits, lockedRect.Pitch, - data + - 3*(offset + tilew*(ylimit-yoffset-1)), + data + (offset << 2), xoffset, yoffset, - xlimit, ylimit, -tilew); - } else { - copyDataToSurfaceRGBRev(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + 3*offset, - xoffset, yoffset, - xlimit, ylimit, tilew); - } - break; - case IMAGE_FORMAT_BYTE_ABGR: - if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || - (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { - copyDataToSurfaceABGR(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + - ((offset+tilew*(ylimit-yoffset-1)) << 2), - xoffset, yoffset, - xlimit, ylimit, -tilew); - } else { - copyDataToSurfaceABGRRev(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 2), - xoffset, yoffset, - xlimit, ylimit, tilew); - } - break; - case IMAGE_FORMAT_BYTE_BGR: - if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || - (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { - copyDataToSurfaceBGR(internalFormat, &ddpf, + xlimit, ylimit, tilew); + } + break; + case IMAGE_FORMAT_BYTE_RGB: + if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || + (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { + copyDataToSurfaceRGB(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + + 3*(offset + tilew*(ylimit-yoffset-1)), + xoffset, yoffset, + xlimit, ylimit, -tilew); + } else { + copyDataToSurfaceRGBRev(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + 3*offset, + xoffset, yoffset, + xlimit, ylimit, tilew); + } + break; + case IMAGE_FORMAT_BYTE_ABGR: + if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || + (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { + copyDataToSurfaceABGR(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + + ((offset+tilew*(ylimit-yoffset-1)) << 2), + xoffset, yoffset, + xlimit, ylimit, -tilew); + } else { + copyDataToSurfaceABGRRev(textureFormat, &ddpf, (unsigned char *) lockedRect.pBits, lockedRect.Pitch, - data + - 3*(offset + tilew*(ylimit-yoffset-1)), + data + (offset << 2), xoffset, yoffset, - xlimit, ylimit, -tilew); - } else { - copyDataToSurfaceBGRRev(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + 3*offset, - xoffset, yoffset, - xlimit, ylimit, tilew); - } - break; - case IMAGE_FORMAT_BYTE_LA: - if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || - (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { - copyDataToSurfaceLA(internalFormat, &ddpf, + xlimit, ylimit, tilew); + } + break; + case IMAGE_FORMAT_BYTE_BGR: + if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || + (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { + copyDataToSurfaceBGR(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + + 3*(offset + tilew*(ylimit-yoffset-1)), + xoffset, yoffset, + xlimit, ylimit, -tilew); + } else { + copyDataToSurfaceBGRRev(textureFormat, &ddpf, (unsigned char *) lockedRect.pBits, lockedRect.Pitch, - data + - ((offset+tilew*(ylimit-yoffset-1)) << 1), + data + 3*offset, xoffset, yoffset, - xlimit, ylimit, -tilew); - } else { - copyDataToSurfaceLARev(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + (offset << 1), - xoffset, yoffset, - xlimit, ylimit, tilew); - } - break; - case IMAGE_FORMAT_BYTE_GRAY: - if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || - (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { - copyDataToSurfaceGray(internalFormat, &ddpf, + xlimit, ylimit, tilew); + } + break; + case IMAGE_FORMAT_BYTE_LA: + if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || + (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { + copyDataToSurfaceLA(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + + ((offset+tilew*(ylimit-yoffset-1)) << 1), + xoffset, yoffset, + xlimit, ylimit, -tilew); + } else { + copyDataToSurfaceLARev(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 1), + xoffset, yoffset, + xlimit, ylimit, tilew); + } + break; + case IMAGE_FORMAT_BYTE_GRAY: + if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || + (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { + copyDataToSurfaceGray(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + + offset + tilew*(ylimit-yoffset-1), + xoffset, yoffset, + xlimit, ylimit, -tilew); + } else { + copyDataToSurfaceGrayRev(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + offset, + xoffset, yoffset, + xlimit, ylimit, tilew); + } + break; + case IMAGE_FORMAT_INT_BGR : + // This is the one we use when byReference = false + if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || + (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { + // Copy the pixel from bottom to up and + // left to right in this case to match OGL definition + copyInt_XBGR_DataToSurface(textureFormat, &ddpf, (unsigned char *) lockedRect.pBits, lockedRect.Pitch, data + - offset + tilew*(ylimit-yoffset-1), + ((offset + tilew*(ylimit-yoffset-1)) << 2), xoffset, yoffset, xlimit, ylimit, -tilew); - } else { - copyDataToSurfaceGrayRev(internalFormat, &ddpf, - (unsigned char *) lockedRect.pBits, - lockedRect.Pitch, - data + offset, - xoffset, yoffset, - xlimit, ylimit, tilew); - } - break; - default: // should not happen - printf("[Java 3D] StoredFormat %d, internalFormat %d not support !\n", - storedFormat, internalFormat); + } else { + // Copy the pixel from up to bottom and + // right to left in this case to match OGL definition + printf("[copyDataToCubeMap] copyInt_BGR_DataToSurfaceRev is unsupported!\n"); + + /* + copyInt_XBGR_DataToSurfaceRev(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 2), + xoffset, yoffset, + xlimit, ylimit, tilew); + */ + } + break; + case IMAGE_FORMAT_INT_RGB : + // This is the one we use when byReference = false + if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || + (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { + // Copy the pixel from bottom to up and + // left to right in this case to match OGL definition + copyInt_XRGB_DataToSurface(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + + ((offset + tilew*(ylimit-yoffset-1)) << 2), + xoffset, yoffset, + xlimit, ylimit, -tilew); + } else { + // Copy the pixel from up to bottom and + // right to left in this case to match OGL definition + printf("[copyDataToCubeMap] copyInt_XRGB_DataToSurfaceRev is unsupported!\n"); + + /* + copyInt_XRGB_DataToSurfaceRev(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 2), + xoffset, yoffset, + xlimit, ylimit, tilew); + */ + } + break; + case IMAGE_FORMAT_INT_ARGB : + // This is the one we use when byReference = false + if ((face == D3DCUBEMAP_FACE_NEGATIVE_Y) || + (face == D3DCUBEMAP_FACE_POSITIVE_Y)) { + // Copy the pixel from bottom to up and + // left to right in this case to match OGL definition + copyInt_ARGB_DataToSurface(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + + ((offset + tilew*(ylimit-yoffset-1)) << 2), + xoffset, yoffset, + xlimit, ylimit, -tilew); + } else { + // Copy the pixel from up to bottom and + // right to left in this case to match OGL definition + printf("[copyDataToCubeMap] copyInt_ARGB_DataToSurfaceRev is unsupported!\n"); + + /* + copyInt_ARGB_DataToSurfaceRev(textureFormat, &ddpf, + (unsigned char *) lockedRect.pBits, + lockedRect.Pitch, + data + (offset << 2), + xoffset, yoffset, + xlimit, ylimit, tilew); + */ + } + break; + default: // should not happen + printf("[Java 3D] StoredFormat %d, textureFormat %d not support !\n", + imageFormat, textureFormat); } hr = surf->UnlockRect(textureCubeMapFace[face], level); -- cgit v1.2.3