aboutsummaryrefslogtreecommitdiffstats
path: root/src/native/d3d/D3dUtil.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/native/d3d/D3dUtil.cpp')
-rw-r--r--src/native/d3d/D3dUtil.cpp12500
1 files changed, 0 insertions, 12500 deletions
diff --git a/src/native/d3d/D3dUtil.cpp b/src/native/d3d/D3dUtil.cpp
deleted file mode 100644
index 3bb495a..0000000
--- a/src/native/d3d/D3dUtil.cpp
+++ /dev/null
@@ -1,12500 +0,0 @@
-/*
- * $RCSfile$
- *
- * Copyright 2000-2008 Sun Microsystems, Inc. All Rights Reserved.
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- *
- * This code is free software; you can redistribute it and/or modify it
- * under the terms of the GNU General Public License version 2 only, as
- * published by the Free Software Foundation. Sun designates this
- * particular file as subject to the "Classpath" exception as provided
- * by Sun in the LICENSE file that accompanied this code.
- *
- * This code is distributed in the hope that it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
- * version 2 for more details (a copy is included in the LICENSE file that
- * accompanied this code).
- *
- * You should have received a copy of the GNU General Public License version
- * 2 along with this work; if not, write to the Free Software Foundation,
- * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
- *
- * Please contact Sun Microsystems, Inc., 4150 Network Circle, Santa Clara,
- * CA 95054 USA or visit www.sun.com if you need additional information or
- * have any questions.
- *
- * $Revision$
- * $Date$
- * $State$
- */
-
-#include "StdAfx.h"
-
-HANDLE hSema = CreateSemaphore(NULL, 1, 1, "Java3d_Ctx");
-
-HANDLE geometrySema = CreateSemaphore(NULL, 1, 1,
- "Java3d_GeometryArrayLock");
-HANDLE surfaceListSema = CreateSemaphore(NULL, 1, 1, "Java3d_SurfaceListLock");
-
-BOOL firstError = true;
-BOOL firstWarning = true;
-BOOL debug = false;
-
-
-vector<void *> freePointerList0;
-vector<void *> freePointerList1;
-BOOL useFreePointerList0 = true;
-
-char *D3dErrorMessage[] = {
- "Can't found 3D Driver !",
- "Current display driver did not support renderer inside window. Now switch to full screen mode...",
- "DirectX 9.0c or above is required for this version of Java3D.",
- "Your graphics card did not support >= 16 bit color mode which Java 3D required.",
- "Please switch your display mode to at least 16 bit color depth.",
- "No compatible device found, please switch to other display mode and try again !",
- "Fail to create hardware D3D Device, switch to use reference rasterizer.",
- "Fail to create reference rasterizer 3D Device.",
- "Fail to set Viewport",
- "Fail to get attach back buffer",
- "256 color mode not support !",
- "Out of memory !",
- "Unknown 3D device specified in property j3d.d3ddevice, please use either \"reference\" or \"hardware\".",
- "Graphics card did not support Hardware acceleration",
- "Graphics card did not support Transform and light hardware acceleration",
- "No Stencil buffer found in current display mode. DecalGroup may not work correctly.",
- "Can't found a valid texture format, please try to use reference mode. DirectX SDK must be installed to use reference mode",
- "Fail to create offscreen image for background",
- "Fail to create Vertex Buffer",
- "Fail to Reset() D3D device, try Recreate device again.",
- "No compatible depth buffer found in your system, please switch to other display mode or try reference rasterizer.",
- "Depth buffer with the required bit depth is not support, please try the default.",
- "Fail to lock Vertex Buffer",
- "Fail to create Vertex Buffer",
- "Fail to create Index Buffer",
- "Fail to lock Index Buffer",
- "Graphics card doesn't support Hardware Acceleration. \n Java3D will use DirectX Reference Rasterizer (Soft).",
- "Unable to create DirectX D3D context.\n Neither Hardware and Software Renderer are available.\n Please update your video card drivers\n and get the latest DirectX available at http://microsoft.com/directx \n"
-};
-
-D3DTRANSFORMSTATETYPE transformState[] = {
- D3DTS_TEXTURE0,
- D3DTS_TEXTURE1,
- D3DTS_TEXTURE2,
- D3DTS_TEXTURE3,
- D3DTS_TEXTURE4,
- D3DTS_TEXTURE5,
- D3DTS_TEXTURE6,
- D3DTS_TEXTURE7};
-
-#define D3DFORMATTABLESIZE 40
-
-D3DFORMAT d3dFormatTable[] = {
- D3DFMT_UNKNOWN, //01
- D3DFMT_R8G8B8, //02
- D3DFMT_A8R8G8B8, //03
- D3DFMT_X8R8G8B8, //04
- D3DFMT_R5G6B5, //05
- D3DFMT_X1R5G5B5, //06
- D3DFMT_A1R5G5B5, //07
- D3DFMT_A4R4G4B4, //08
- D3DFMT_R3G3B2, //09
- D3DFMT_A8, //10
- D3DFMT_A8R3G3B2, //11
- D3DFMT_X4R4G4B4, //12
- D3DFMT_A8P8, //13
- D3DFMT_P8, //14
- D3DFMT_L8, //15
- D3DFMT_A8L8, //16
- D3DFMT_A4L4, //17
- D3DFMT_V8U8, //18
- D3DFMT_L6V5U5, //19
- D3DFMT_X8L8V8U8, //20
- D3DFMT_Q8W8V8U8, //21
- D3DFMT_V16U16, //22
- // D3DFMT_W11V11U10, //XX
- D3DFMT_UYVY, //23
- D3DFMT_YUY2, //24
- D3DFMT_DXT1, //25
- D3DFMT_DXT2, //26
- D3DFMT_DXT3, //27
- D3DFMT_DXT4, //28
- D3DFMT_DXT5, //29
- D3DFMT_D16_LOCKABLE, //30
- D3DFMT_D32, //31
- D3DFMT_D15S1, //32
- D3DFMT_D24S8, //33
- D3DFMT_D16, //34
- D3DFMT_D24X8, //35
- D3DFMT_D24X4S4, //36
- D3DFMT_VERTEXDATA, //37
- D3DFMT_INDEX16, //38
- D3DFMT_INDEX32 //39
-};
-
-char *d3dFormatTableChar[] = {
- "D3DFMT_UNKNOWN", //01
- "D3DFMT_R8G8B8", //02
- "D3DFMT_A8R8G8B8", //03
- "D3DFMT_X8R8G8B8", //04
- "D3DFMT_R5G6B5", //05
- "D3DFMT_X1R5G5B5", //06
- "D3DFMT_A1R5G5B5", //07
- "D3DFMT_A4R4G4B4", //08
- "D3DFMT_R3G3B2", //09
- "D3DFMT_A8", //10
- "D3DFMT_A8R3G3B2", //11
- "D3DFMT_X4R4G4B4", //12
- "D3DFMT_A8P8", //13
- "D3DFMT_P8", //14
- "D3DFMT_L8", //15
- "D3DFMT_A8L8", //16
- "D3DFMT_A4L4", //17
- "D3DFMT_V8U8", //18
- "D3DFMT_L6V5U5", //19
- "D3DFMT_X8L8V8U8", //20
- "D3DFMT_Q8W8V8U8", //21
- "D3DFMT_V16U16", //22
- // "D3DFMT_W11V11U10", //XX
- "D3DFMT_UYVY", //23
- "D3DFMT_YUY2", //24
- "D3DFMT_DXT1", //25
- "D3DFMT_DXT2", //26
- "D3DFMT_DXT3", //27
- "D3DFMT_DXT4", //28
- "D3DFMT_DXT5", //29
- "D3DFMT_D16_LOCKABLE",//30
- "D3DFMT_D32", //31
- "D3DFMT_D15S1", //32
- "D3DFMT_D24S8", //33
- "D3DFMT_D16", //34
- "D3DFMT_D24X8", //35
- "D3DFMT_D24X4S4", //36
- "D3DFMT_VERTEXDATA", //37
- "D3DFMT_INDEX16", //38
- "D3DFMT_INDEX32" //39
-};
-
-char* multipleSampleTypeTable[] = {
- "D3DMULTISAMPLE_NONE",
- "D3DMULTISAMPLE_UNKNOWN",
- "D3DMULTISAMPLE_2_SAMPLES",
- "D3DMULTISAMPLE_3_SAMPLES",
- "D3DMULTISAMPLE_4_SAMPLES",
- "D3DMULTISAMPLE_5_SAMPLES",
- "D3DMULTISAMPLE_6_SAMPLES",
- "D3DMULTISAMPLE_7_SAMPLES",
- "D3DMULTISAMPLE_8_SAMPLES",
- "D3DMULTISAMPLE_9_SAMPLES",
- "D3DMULTISAMPLE_10_SAMPLES",
- "D3DMULTISAMPLE_11_SAMPLES",
- "D3DMULTISAMPLE_12_SAMPLES",
- "D3DMULTISAMPLE_13_SAMPLES",
- "D3DMULTISAMPLE_14_SAMPLES",
- "D3DMULTISAMPLE_15_SAMPLES",
- "D3DMULTISAMPLE_16_SAMPLES"
-};
-
-char* swapEffectTable[] = {
- "D3DSWAPEFFECT_UNKNOWN",
- "D3DSWAPEFFECT_DISCARD",
- "D3DSWAPEFFECT_FLIP",
- "D3DSWAPEFFECT_COPY",
- "D3DSWAPEFFECT_COPY_VSYNC"
-};
-
-
-// mapping from java enum to d3d enum
-
-D3DCUBEMAP_FACES textureCubeMapFace[] = {
- D3DCUBEMAP_FACE_POSITIVE_X,
- D3DCUBEMAP_FACE_NEGATIVE_X,
- D3DCUBEMAP_FACE_POSITIVE_Y,
- D3DCUBEMAP_FACE_NEGATIVE_Y,
- D3DCUBEMAP_FACE_NEGATIVE_Z,
- D3DCUBEMAP_FACE_POSITIVE_Z,
-};
-
-typedef struct _PIXELFORMAT {
- DWORD dwRGBBitCount;
- DWORD dwRBitMask;
- DWORD dwGBitMask;
- DWORD dwBBitMask;
- DWORD dwRGBAlphaBitMask;
- BOOL noAlpha;
-} PIXELFORMAT;
-
-
-typedef struct _DEPTHPIXELFORMAT {
- DWORD dwZBufferBitDepth;
- DWORD dwZBitMask;
- DWORD dwStencilBitDepth;
- DWORD dwStencilBitMask;
-} DEPTHPIXELFORMAT;
-
-void throwAssert(JNIEnv *env, char *str)
-{
- jclass rte;
- if ((rte = (jclass)env->FindClass("java/lang/AssertionError")) != NULL) {
- (void *)env->ThrowNew(rte, str);
- }
-}
-
-char *getSwapEffectName(D3DSWAPEFFECT swapEffect)
-{
- int t = (int) swapEffect;
- if ((t < 0) || (t > 4)) {
- return swapEffectTable[0];
- }
- return swapEffectTable[t];
-}
-
-char *getMultiSampleName(D3DMULTISAMPLE_TYPE mtype)
-{
- int t = (int) mtype;
- if ((t < 0) || (t > 16)) {
- // UNKNOWN
- return multipleSampleTypeTable[1];
- }
- return multipleSampleTypeTable[t];
-}
-
-char* getPixelFormatName(D3DFORMAT f)
-{
- for (int i=0; i < D3DFORMATTABLESIZE; i++) {
- if (f == d3dFormatTable[i]) {
- return d3dFormatTableChar[i];
- }
- }
- // should not happen
- return d3dFormatTableChar[0];
-}
-
-// If there is a new D3DFORMAT, just add it here and
-// our copy procedures can handle any format specific
-// as bit mask.
-//@TODO add floating point pixelFormats
-VOID computePixelFormat(PIXELFORMAT *ddpf, D3DFORMAT format)
-{
- switch (format) {
- case D3DFMT_R8G8B8:
- ddpf->dwRGBBitCount = 24;
- ddpf->dwRGBAlphaBitMask = 0;
- ddpf->dwRBitMask = 0x00ff0000;
- ddpf->dwGBitMask = 0x0000ff00;
- ddpf->dwBBitMask = 0x000000ff;
- ddpf->noAlpha = true;
- break;
- case D3DFMT_A8R8G8B8:
- ddpf->dwRGBBitCount = 32;
- ddpf->dwRGBAlphaBitMask = 0xff000000;
- ddpf->dwRBitMask = 0x00ff0000;
- ddpf->dwGBitMask = 0x0000ff00;
- ddpf->dwBBitMask = 0x000000ff;
- ddpf->noAlpha = false;
- break;
- case D3DFMT_X8R8G8B8:
- ddpf->dwRGBBitCount = 32;
- ddpf->dwRGBAlphaBitMask = 0;
- ddpf->dwRBitMask = 0x00ff0000;
- ddpf->dwGBitMask = 0x0000ff00;
- ddpf->dwBBitMask = 0x000000ff;
- ddpf->noAlpha = true;
- break;
- case D3DFMT_R5G6B5:
- ddpf->dwRGBBitCount = 16;
- ddpf->dwRGBAlphaBitMask = 0;
- ddpf->dwRBitMask = 0xf800;
- ddpf->dwGBitMask = 0x07e0;
- ddpf->dwBBitMask = 0x001f;
- ddpf->noAlpha = true;
- break;
- case D3DFMT_X1R5G5B5:
- ddpf->dwRGBBitCount = 16;
- ddpf->dwRGBAlphaBitMask = 0;
- ddpf->dwRBitMask = 0x7c00;
- ddpf->dwGBitMask = 0x03e0;
- ddpf->dwBBitMask = 0x001f;
- ddpf->noAlpha = true;
- break;
- case D3DFMT_A1R5G5B5:
- ddpf->dwRGBBitCount = 16;
- ddpf->dwRGBAlphaBitMask = 0x8000;
- ddpf->dwRBitMask = 0x7c00;
- ddpf->dwGBitMask = 0x03e0;
- ddpf->dwBBitMask = 0x001f;
- ddpf->noAlpha = false;
- break;
- case D3DFMT_A4R4G4B4:
- ddpf->dwRGBBitCount = 16;
- ddpf->dwRGBAlphaBitMask = 0xf000;
- ddpf->dwRBitMask = 0x0f00;
- ddpf->dwGBitMask = 0x00f0;
- ddpf->dwBBitMask = 0x000f;
- ddpf->noAlpha = false;
- break;
- case D3DFMT_X4R4G4B4:
- ddpf->dwRGBBitCount = 16;
- ddpf->dwRGBAlphaBitMask = 0;
- ddpf->dwRBitMask = 0x0f00;
- ddpf->dwGBitMask = 0x00f0;
- ddpf->dwBBitMask = 0x000f;
- ddpf->noAlpha = true;
- break;
- case D3DFMT_R3G3B2:
- ddpf->dwRGBBitCount = 8;
- ddpf->dwRGBAlphaBitMask = 0;
- ddpf->dwRBitMask = 0xe0;
- ddpf->dwGBitMask = 0x1c;
- ddpf->dwBBitMask = 0x03;
- ddpf->noAlpha = true;
- break;
- case D3DFMT_A8R3G3B2:
- ddpf->dwRGBBitCount = 16;
- ddpf->dwRGBAlphaBitMask = 0xff00;
- ddpf->dwRBitMask = 0x00e0;
- ddpf->dwGBitMask = 0x001c;
- ddpf->dwBBitMask = 0x0003;
- ddpf->noAlpha = false;
- break;
- case D3DFMT_A8:
- ddpf->dwRGBBitCount = 8;
- ddpf->dwRGBAlphaBitMask = 0xff;
- ddpf->dwRBitMask = 0;
- ddpf->dwGBitMask = 0;
- ddpf->dwBBitMask = 0;
- ddpf->noAlpha = false;
- break;
- case D3DFMT_L8:
- ddpf->dwRGBBitCount = 8;
- ddpf->dwRGBAlphaBitMask = 0;
- ddpf->dwRBitMask = 0xff;
- ddpf->dwGBitMask = 0;
- ddpf->dwBBitMask = 0;
- ddpf->noAlpha = true;
- break;
- case D3DFMT_A8L8:
- ddpf->dwRGBBitCount = 16;
- ddpf->dwRGBAlphaBitMask = 0xff00;
- ddpf->dwRBitMask = 0x00ff;
- ddpf->dwGBitMask = 0;
- ddpf->dwBBitMask = 0;
- ddpf->noAlpha = false;
- break;
- case D3DFMT_A4L4:
- ddpf->dwRGBBitCount = 8;
- ddpf->dwRGBAlphaBitMask = 0xf0;
- ddpf->dwRBitMask = 0x0f;
- ddpf->dwGBitMask = 0;
- ddpf->dwBBitMask = 0;
- ddpf->noAlpha = false;
- break;
- default:
- printf("Unsupport format %d\n ", format);
- ddpf->dwRGBBitCount = 8;
- ddpf->dwRGBAlphaBitMask = 0;
- ddpf->dwRBitMask = 0;
- ddpf->dwGBitMask = 0;
- ddpf->dwBBitMask = 0;
- ddpf->noAlpha = true;
- break;
- }
-
-}
-
-
-/*
- * Right now only format D3DFMT_D16_LOCKABLE
- * is lockable by application. So can't use
- * with stencil buffer (in DecalGroup) together
- */
-VOID computeDepthPixelFormat(DEPTHPIXELFORMAT *ddpf,
- D3DFORMAT format)
-{
- switch (format) {
- case D3DFMT_D16_LOCKABLE:
- case D3DFMT_D16:
- ddpf->dwZBufferBitDepth = 16;
- ddpf->dwZBitMask = 0xffff;
- ddpf->dwStencilBitDepth = 0;
- ddpf->dwStencilBitMask = 0x0000;
- break;
- case D3DFMT_D15S1:
- ddpf->dwZBufferBitDepth = 16;
- ddpf->dwZBitMask = 0xfffe;
- ddpf->dwStencilBitDepth = 1;
- ddpf->dwStencilBitMask = 0x0001;
- break;
- case D3DFMT_D32:
- ddpf->dwZBufferBitDepth = 32;
- ddpf->dwZBitMask = 0xffffffff;
- ddpf->dwStencilBitDepth = 0;
- ddpf->dwStencilBitMask = 0x000000;
- break;
- case D3DFMT_D24S8:
- ddpf->dwZBufferBitDepth = 32;
- ddpf->dwZBitMask = 0xffffff00;
- ddpf->dwStencilBitDepth = 8;
- ddpf->dwStencilBitMask = 0x00000ff;
- break;
- case D3DFMT_D24X8:
- ddpf->dwZBufferBitDepth = 32;
- ddpf->dwZBitMask = 0xffffff00;
- ddpf->dwStencilBitDepth = 0;
- ddpf->dwStencilBitMask = 0x0000000;
- break;
- case D3DFMT_D24X4S4:
- ddpf->dwZBufferBitDepth = 32;
- ddpf->dwZBitMask = 0xffffff00;
- ddpf->dwStencilBitDepth = 4;
- ddpf->dwStencilBitMask = 0x000000f;
- break;
- default:
- printf("Unknown depth buffer format %d\n", format);
- }
-}
-
-
-/*
- * Set the correct D3DTSS_TEXTURETRANSFORMFLAGS
- */
-void setTexTransformStageFlag(D3dCtx* d3dCtx,
- LPDIRECT3DDEVICE9 device,
- int tus, int ts, int genMode)
-{
- /*
- * In case of automatic texture generation, disable
- * texture unit transform stage will cause crash in
- * reference device mode.
- */
- if ((!d3dCtx->texTransformSet[tus]) &&
- (d3dCtx->texGenMode == TEX_GEN_NONE)) {
- device->SetTextureStageState(tus,
- D3DTSS_TEXTURETRANSFORMFLAGS,
- D3DTTFF_DISABLE);
- } else {
- D3DXMATRIX *m;
-
- switch (ts) {
- case 2:
- // Adjust for 2D texture transform in D3D
- // 1 0 0 0
- // 0 1 0 0
- // du dv 0 0
- // 0 0 0 0
- //
-
- /*
- *
- * The texture transform matrix is funky. With COUNT=2
- * and texture coordinates coming from the vertices, you
- * can't use the stock transformation matrix functions to
- * generate the matrix without adjusting it before setting
- * the transform. Basically in the case of COUNT=2 with
- * texcoords coming from the vertices, the pipeline uses
- * the upper 3x3 submatrix of the 4x4 matrix as the
- * transformation. So if you were expecting the (u,v)
- * translation elements to be on the 4th row, these won't
- * be applied properly in this case.
- *
- * What's funky is that if you were using COUNT=2 and
- * texture coordinates coming in automatically, then it
- * wants the translation in the 4th row. I can't decide
- * yet if this is a poor specification that results in
- * this matrix weirdness, or if its a bug in the runtime.
- */
- if ((genMode != TEX_GEN_AUTO) &&
- !d3dCtx->texTranslateSet[tus]) {
- m = &d3dCtx->texTransform[tus];
- (*m)._31 = (*m)._41;
- (*m)._32 = (*m)._42;
- device->SetTransform((D3DTRANSFORMSTATETYPE)
- (D3DTS_TEXTURE0 + tus), m);
- d3dCtx->texTranslateSet[tus] = true;
- }
-
- device->SetTextureStageState(tus,
- D3DTSS_TEXTURETRANSFORMFLAGS,
- D3DTTFF_COUNT2);
- break;
- case 3:
- device->SetTextureStageState(tus,
- D3DTSS_TEXTURETRANSFORMFLAGS,
- D3DTTFF_COUNT3);
- break;
- case 4:
- if (d3dCtx->texGenMode[tus] == TEX_OBJ_LINEAR) {
- // The texture transform matrix is funky that only the
- // upper 3x3 matrix is used if we are not using
- // automatic texture generation. In case of Object
- // Linear we are need to workaround by doing our
- // own texture transform when generate texture
- // coordinate.
- device->SetTextureStageState(tus,
- D3DTSS_TEXTURETRANSFORMFLAGS,
- D3DTTFF_DISABLE);
- } else {
- device->SetTextureStageState(tus,
- D3DTSS_TEXTURETRANSFORMFLAGS,
- D3DTTFF_COUNT4|D3DTTFF_PROJECTED);
- }
- break;
- default:
- printf("ERROR texCoordFormat, stage %d, format %d\n",
- tus, ts);
- }
- }
-
-}
-
-/*
- * Set the corresponding D3D texture coordinate
- * mapping mode.
- */
-inline int setTextureStage(D3dCtx *d3dCtx,
- LPDIRECT3DDEVICE9 device,
- int mapTexStage,
- jint texStage)
-{
- DWORD mode = 0;
- int genMode = d3dCtx->texGenMode[mapTexStage];
-
- // printf("Set TexStage mapTexStage = %d, texStage = %d, genMode = %d\n",
- // mapTexStage, texStage, genMode);
-
- switch (genMode) {
- case TEX_GEN_NONE:
- case TEX_OBJ_LINEAR:
- case TEX_GEN_INVALID:
- // optimize for general case
- device->SetTextureStageState(mapTexStage,
- D3DTSS_TEXCOORDINDEX,
- texStage);
- return genMode;
- case TEX_EYE_LINEAR:
- mode = D3DTSS_TCI_CAMERASPACEPOSITION;
- break;
- case TEX_SPHERE_MAP:
- mode = D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR;
- break;
- case TEX_NORMAL_MAP:
- mode = D3DTSS_TCI_CAMERASPACENORMAL;
- break;
- case TEX_REFLECT_MAP:
- mode = D3DTSS_TCI_CAMERASPACEREFLECTIONVECTOR;
- break;
- default:
- // should not happen
- printf("Unknown TexCoordGenMode %d\n", genMode);
- break;
- }
- // Need to OR texStage for Wrapping mode even though
- // there is no texture coordinate defined in that texStage in VB.
- // This also clear the texStage previously set.
- device->SetTextureStageState(mapTexStage,
- D3DTSS_TEXCOORDINDEX,
- mode | texStage);
-
- return TEX_GEN_AUTO;
-}
-
-
-void getTexWidthHeight(D3dDeviceInfo *deviceInfo,
- jint* width, jint *height)
-{
- int texWidth, texHeight;
-
- texWidth = *width;
- texHeight = *height;
-
-
- // Found a texture bigger than width/height
- if (deviceInfo->texturePow2Only) {
- for (texWidth=1; *width > texWidth; texWidth <<= 1);
- for (texHeight=1; *height > texHeight; texHeight <<= 1);
- }
-
-
- if (deviceInfo->textureSquareOnly) {
- if (texWidth >= texHeight) {
- texHeight = texWidth;
- } else {
- texWidth = texHeight;
- }
- }
-
- // Check for maximum texture size support by hardware
- if (texWidth > deviceInfo->maxTextureWidth) {
- if (debug) {
- printf("[Java 3D] Warning: Input texture width %d > maximum texture width %d hardware can support.\n", texWidth, deviceInfo->maxTextureWidth);
- if (*width != texWidth) {
- printf("Note that width is adjust from %d to %d to reflect texture limitation e.g. POW2, SQAUREONLY in hardware.\n", *width, texWidth);
- }
- }
- texWidth = deviceInfo->maxTextureWidth;
- }
-
- if (texHeight > deviceInfo->maxTextureHeight) {
- if (debug) {
- printf("[Java 3D] Warning: Input texture height %d > maximum texture height %d hardware can support.\n", texHeight, deviceInfo->maxTextureHeight);
- if (*height != texHeight) {
- printf("Note that height is adjust from %d to %d to reflect texture limitation e.g. POW2, SQAUREONLY in hardware.\n", *height, texHeight);
- }
- }
- texHeight = deviceInfo->maxTextureHeight;
- }
-
- *width = texWidth;
- *height = texHeight;
-}
-
-D3DFORMAT getTexFormat(jint textureFormat) {
-
- switch (textureFormat) {
- case J3D_RGBA:
- case INTENSITY:
- // printf("[getTexFormat] textureFormat %d J3D_RGBA\n", textureFormat);
- return D3DFMT_A8R8G8B8;
- case J3D_RGB:
- // printf("[getTexFormat] textureFormat %d J3D_RGB\n", textureFormat);
- return D3DFMT_R8G8B8;
- case LUMINANCE_ALPHA:
- return D3DFMT_A8L8;
- case ALPHA:
- return D3DFMT_A8;
- case LUMINANCE:
- return D3DFMT_L8;
- default:
- printf("CreateTextureSurface: Unknown Java 3D Texture Format %d\n", textureFormat);
- return D3DFMT_UNKNOWN;
- }
-
-}
-
-D3dCtx* findCtx(HWND hwnd)
-{
- D3dCtx *ctx = NULL;
-
- for (ITER_D3dCtxVector p = d3dCtxList.begin(); p != d3dCtxList.end(); p++) {
- if ((*p)->hwnd == hwnd) {
- ctx = *p;
- break;
- }
- }
- return ctx;
-}
-
-inline VOID lock()
-{
- if (hSema != NULL) {
- WaitForSingleObject(hSema, INFINITE);
- }
-}
-
-inline VOID unlock()
-{
- if (hSema != NULL) {
- ReleaseSemaphore(hSema, 1, NULL);
- }
-}
-
-
-inline VOID lockSurfaceList()
-{
- if (surfaceListSema != NULL) {
- WaitForSingleObject(surfaceListSema, INFINITE);
- }
-}
-
-inline VOID unlockSurfaceList()
-{
- if (surfaceListSema != NULL) {
- ReleaseSemaphore(surfaceListSema, 1, NULL);
- }
-}
-
-inline VOID lockGeometry()
-{
- if (geometrySema != NULL) {
- WaitForSingleObject(geometrySema, INFINITE);
- }
-}
-
-inline VOID unlockGeometry()
-{
- if (geometrySema != NULL) {
- ReleaseSemaphore(geometrySema, 1, NULL);
- }
-}
-
-VOID freePointer(void * ptr)
-{
- if (ptr != NULL) {
- lockSurfaceList();
- if (useFreePointerList0) {
- freePointerList0.push_back(ptr);
- } else {
- freePointerList1.push_back(ptr);
- }
- unlockSurfaceList();
- }
-}
-
-
-char *getErrorMessage(int idx)
-{
- return D3dErrorMessage[idx];
-}
-
-
-
-HWND getTopWindow(HWND hwnd)
-{
- HWND desktop = GetDesktopWindow();
- HWND parent = GetParent(hwnd);
-
- while ((parent != NULL) && (parent != desktop)) {
- hwnd = parent;
- parent = GetParent(hwnd);
- }
- return hwnd;
-}
-
-
-DWORD firstBit(DWORD mask)
-{
- int i;
-
- for (i=0; i < sizeof(DWORD)*8-1; i++) {
- if ((mask & 0x01) > 0) {
- return i;
- }
- mask >>= 1;
- }
-
- return i;
-}
-
-// create a DirectDraw Texture surface of specific width and height
-LPDIRECT3DTEXTURE9 createTextureSurface(D3dCtx *d3dCtx,
- jint numLevels,
- jint textureFormat,
- jint width, jint height,
- jboolean useAutoMipMap)
-{
- LPDIRECT3DTEXTURE9 pTexture;
- D3DFORMAT format;
- HRESULT hr;
- DWORD usage = 0;
-
- LPDIRECT3DDEVICE9 pDevice = d3dCtx->pDevice;
- D3dDeviceInfo *deviceInfo = d3dCtx->deviceInfo;
-
- if (!deviceInfo->supportMipmap) {
- numLevels = 1;
- }
-
- getTexWidthHeight(deviceInfo, &width, &height);
- format = getTexFormat(textureFormat);
-
- if (useAutoMipMap) {
- usage |= D3DUSAGE_AUTOGENMIPMAP;
- }
-
- // If format not support, the utility function will adjust the
- // calling parameters automatically
- hr = D3DXCreateTexture(d3dCtx->pDevice, width, height,
- numLevels, usage, format, D3DPOOL_MANAGED,
- &pTexture);
-
- if (FAILED(hr)) {
- printf("Fail to create texture surface %dx%d, format %d, level %d : %s\n",
- width, height, format, numLevels, DXGetErrorString9(hr));
- return NULL;
- }
-
- return pTexture;
-}
-
-
-
-// create a DirectDraw Texture surface of specific width and height
-LPDIRECT3DVOLUMETEXTURE9 createVolumeTexture(D3dCtx *d3dCtx,
- jint numLevels,
- jint textureFormat,
- jint width,
- jint height,
- jint depth,
- jboolean useAutoMipMap)
-
-{
- LPDIRECT3DVOLUMETEXTURE9 pTexture;
- int texWidth, texHeight, texDepth;
- D3DFORMAT format;
- HRESULT hr;
- DWORD usage = 0;
-
- LPDIRECT3DDEVICE9 pDevice = d3dCtx->pDevice;
- D3dDeviceInfo *deviceInfo = d3dCtx->deviceInfo;
-
- texWidth = width;
- texHeight = height;
- texDepth = depth;
-
- if (!deviceInfo->supportMipmap) {
- numLevels = 1;
- }
-
- if (useAutoMipMap) {
- usage |= D3DUSAGE_AUTOGENMIPMAP;
- }
-
- // Found a texture bigger than width/height
- if (deviceInfo->texturePow2Only) {
- for (texWidth=1; width > texWidth; texWidth <<= 1);
- for (texHeight=1; height > texHeight; texHeight <<= 1);
- for (texDepth=1; depth > texDepth; texDepth <<= 1);
- }
-
- if (deviceInfo->textureSquareOnly) {
- if (texWidth >= texHeight) {
- texHeight = texWidth;
- } else {
- texWidth = texHeight;
- }
- if (texDepth <= texWidth) {
- texDepth = texWidth;
- } else {
- texWidth = texHeight = texDepth;
- }
- }
-
- // Check for maximum texture size support by hardware
- if (texWidth > deviceInfo->maxTextureWidth) {
- if (debug) {
- printf("[Java 3D] Warning: Input texture width %d > maximum texture width %d hardware can support.\n", texWidth, deviceInfo->maxTextureWidth);
- if (width != texWidth) {
- printf("Note that width is adjust from %d to %d to reflect texture limitation e.g. POW2, SQAUREONLY in hardware.\n", width, texWidth);
- }
- }
- texWidth = deviceInfo->maxTextureWidth;
- }
-
- if (texHeight > deviceInfo->maxTextureHeight) {
- if (debug) {
- printf("[Java 3D] Warning: Input texture height %d > maximum texture height %d hardware can support.\n", texHeight, deviceInfo->maxTextureHeight);
- if (height != texHeight) {
- printf("Note that height is adjust from %d to %d to reflect texture limitation e.g. POW2, SQAUREONLY in hardware.\n", height, texHeight);
- }
- }
- texHeight = deviceInfo->maxTextureHeight;
- }
-
- if (texDepth > deviceInfo->maxTextureDepth) {
- if (debug) {
- printf("[Java 3D] Warning: Input texture depth %d > maximum texture depth %d hardware can support.\n", texDepth, deviceInfo->maxTextureDepth);
- if (depth != texDepth) {
- printf("Note that depth is adjust from %d to %d to reflect texture limitation e.g. POW2, SQAUREONLY in hardware.\n", depth, texDepth);
- }
- }
- texDepth = deviceInfo->maxTextureDepth;
- }
-
- format = getTexFormat(textureFormat);
-
- // If format not support, the utility function will adjust the
- // calling parameters automatically
- hr = D3DXCreateVolumeTexture(d3dCtx->pDevice, texWidth, texHeight,
- texDepth, numLevels, usage, format, D3DPOOL_MANAGED,
- &pTexture);
-
- if (FAILED(hr)) {
- if (debug) {
- printf("Fail to create volume texture %dx%dx%d, format %d, level %d : %s\n",
- texWidth, texHeight, texDepth, format, numLevels,
- DXGetErrorString9(hr));
- }
- return NULL;
- }
-
- return pTexture;
-}
-
-
-// copy data from DirectDraw surface to memory
-// and reverse the Y axis
-void copyDataFromSurface(jint imageFormat,
- jint xoffset, jint yoffset,
- jint subWidth, jint subHeight,
- jbyte *data,
- LPDIRECT3DSURFACE9 surf)
-{
- D3DSURFACE_DESC ddsd;
- D3DLOCKED_RECT lockedRect;
- PIXELFORMAT ddpf;
- HRESULT hr;
-
- if (surf == NULL) {
- return;
- }
-
- surf->GetDesc(&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(&lockedRect, NULL, D3DLOCK_NOSYSLOCK|
- D3DLOCK_READONLY);
-
- if (FAILED(hr)) {
- printf("Fail to lock surface: %s\n", DXGetErrorString9(hr));
- return;
- }
-
- unsigned char *src;
- unsigned char *dst;
- byte b1, b2, b3, b4;
- DWORD mask, t;
- DWORD dstPitch;
-
- unsigned char *destRow = (unsigned char *) data;
- unsigned char *srcRow = ((unsigned char *) lockedRect.pBits) +
- xoffset*((int) ceil((float) ddpf.dwRGBBitCount/8.0)) +
- (yoffset*lockedRect.Pitch);
-
- if ((imageFormat == IMAGE_FORMAT_INT_RGB) ||
- (imageFormat == IMAGE_FORMAT_INT_ARGB)) {
- dstPitch = subWidth << 2;
- destRow += (subHeight-1)*dstPitch;
-
- /* printf("[Java 3D] copyDataFromSurface: (1) %d\n", ddpf.dwRGBBitCount); */
-
- if ((ddpf.dwRGBBitCount == 32) &&
- (ddpf.dwRBitMask == 0xff0000) &&
- (ddpf.dwGBitMask == 0xff00) &&
- (ddpf.dwBBitMask == 0xff)) {
- // Optimize for the most common case
- if (ddpf.noAlpha) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- *dst++ = *src++;
- *dst++ = *src++;
- *dst++ = *src++;
- *src++;
- *dst++ = (byte) 0xff;
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- *dst++ = *src++;
- *dst++ = *src++;
- *dst++ = *src++;
- *dst++ = *src++;
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- }
- } else { // handle less common format
- int rshift = firstBit(ddpf.dwRBitMask) +
- ucountBits(ddpf.dwRBitMask) - 8;
- int gshift = firstBit(ddpf.dwGBitMask) +
- ucountBits(ddpf.dwGBitMask) - 8;
- int bshift = firstBit(ddpf.dwBBitMask) +
- ucountBits(ddpf.dwBBitMask) - 8;
- int ashift = firstBit(ddpf.dwRGBAlphaBitMask) +
- ucountBits(ddpf.dwRGBAlphaBitMask) - 8;
-
- if ((ddpf.dwRGBBitCount <= 32) &&
- (ddpf.dwRGBBitCount > 24)) {
-
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- b4 = *src++;
- mask = ((b4 << 24) | (b3 << 16)| (b2 << 8) | b1);
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- } else {
- *dst++ = (byte) ((mask >> 24) & 0xff);
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if ((ddpf.dwRGBBitCount <= 24) &&
- (ddpf.dwRGBBitCount > 16)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- mask = ((b3 << 16) | (b2 << 8) | b1);
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if ((ddpf.dwRGBBitCount <= 16) &&
- (ddpf.dwRGBBitCount > 8)) {
-
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- mask = ((b2 << 8) | b1);
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if (ddpf.dwRGBBitCount <= 8) {
- /* printf("[Java 3D] copyDataFromSurface: Format on (8 bits or less surface) not support %d\n", imageFormat); */
- }
- }
- } else if ((imageFormat == IMAGE_FORMAT_BYTE_RGBA) ||
- (imageFormat == IMAGE_FORMAT_BYTE_RGB) ||
- (imageFormat == IMAGE_FORMAT_INT_BGR)) {
-
- /* printf("[Java 3D] copyDataFromSurface: (2) %d\n", ddpf.dwRGBBitCount); */
-
- dstPitch = subWidth << 2;
- destRow += (subHeight-1)*dstPitch;
-
- if ((ddpf.dwRGBBitCount == 32) &&
- (ddpf.dwRBitMask == 0xff0000) &&
- (ddpf.dwGBitMask == 0xff00) &&
- (ddpf.dwBBitMask == 0xff)) {
- // Optimize for the most common case
- if (ddpf.noAlpha) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- *dst++ = b3;
- *dst++ = b2;
- *dst++ = b1;
- *src++;
- *dst++ = (byte) 0xff;
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- *dst++ = b3;
- *dst++ = b2;
- *dst++ = b1;
- *dst++ = *src++;
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- }
- } else { // handle less common format
- int rshift = firstBit(ddpf.dwRBitMask) +
- ucountBits(ddpf.dwRBitMask) - 8;
- int gshift = firstBit(ddpf.dwGBitMask) +
- ucountBits(ddpf.dwGBitMask) - 8;
- int bshift = firstBit(ddpf.dwBBitMask) +
- ucountBits(ddpf.dwBBitMask) - 8;
- int ashift = firstBit(ddpf.dwRGBAlphaBitMask) +
- ucountBits(ddpf.dwRGBAlphaBitMask) - 8;
-
- if ((ddpf.dwRGBBitCount <= 32) &&
- (ddpf.dwRGBBitCount > 24)) {
-
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- b4 = *src++;
- mask = ((b4 << 24) | (b3 << 16)| (b2 << 8) | b1);
- if (rshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRBitMask) >>
- rshift);
- } else {
- t = (mask & ddpf.dwRBitMask) << -rshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
-
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (bshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwBBitMask) >>
- bshift);
- } else {
- t = (mask & ddpf.dwBBitMask) << -bshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- } else {
- if (ashift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRGBAlphaBitMask) >>
- ashift);
- } else {
- t = (mask & ddpf.dwRGBAlphaBitMask) <<-ashift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if ((ddpf.dwRGBBitCount <= 24) &&
- (ddpf.dwRGBBitCount > 16)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- mask = ((b3 << 16) | (b2 << 8) | b1);
- if (rshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRBitMask) >>
- rshift);
- } else {
- t = (mask & ddpf.dwRBitMask) << -rshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) <<-gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (bshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwBBitMask) >>
- bshift);
- } else {
- t = (mask & ddpf.dwBBitMask) << -bshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- } else {
- if (ashift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRGBAlphaBitMask) >>
- ashift);
- } else {
- t = (mask & ddpf.dwRGBAlphaBitMask) <<-ashift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if ((ddpf.dwRGBBitCount <= 16) &&
- (ddpf.dwRGBBitCount > 8)) {
-
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- mask = ((b2 << 8) | b1);
- if (rshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRBitMask) >>
- rshift);
- } else {
- t = (mask & ddpf.dwRBitMask) << -rshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
-
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (bshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwBBitMask) >>
- bshift);
- } else {
- t = (mask & ddpf.dwBBitMask) << -bshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
-
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- } else {
- if (ashift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRGBAlphaBitMask) >>
- ashift);
- } else {
- t = (mask & ddpf.dwRGBAlphaBitMask) <<-ashift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if (ddpf.dwRGBBitCount <= 8) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- mask = *src++;
- if (rshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRBitMask) >>
- rshift);
- } else {
- t = (mask & ddpf.dwRBitMask) << -rshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
-
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (bshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwBBitMask) >>
- bshift);
- } else {
- t = (mask & ddpf.dwBBitMask) << -bshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- } else {
- if (ashift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRGBAlphaBitMask) >>
- ashift);
- } else {
- t = (mask & ddpf.dwRGBAlphaBitMask) <<-ashift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- }
- }
- } else if (imageFormat == IMAGE_FORMAT_BYTE_LA) {
- int gshift = firstBit(ddpf.dwGBitMask) +
- ucountBits(ddpf.dwGBitMask) - 8;
- int ashift = firstBit(ddpf.dwRGBAlphaBitMask) +
- ucountBits(ddpf.dwRGBAlphaBitMask) - 8;
- dstPitch = subWidth << 1;
- destRow += (subHeight-1)*dstPitch;
-
- if ((ddpf.dwRGBBitCount == 32) &&
- (ddpf.dwRBitMask == 0xff0000) &&
- (ddpf.dwGBitMask == 0xff00) &&
- (ddpf.dwBBitMask == 0xff)) {
- // Optimize for the most common case
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- *dst++ = b2;
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- *src++;
- } else {
- *dst++ = *src++;
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
-
- }
- } else { // handle less common format
- int gshift = firstBit(ddpf.dwGBitMask) +
- ucountBits(ddpf.dwGBitMask) - 8;
- if ((ddpf.dwRGBBitCount <= 32) &&
- (ddpf.dwRGBBitCount > 24)) {
-
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- b4 = *src++;
- mask = ((b4 << 24) | (b3 << 16)| (b2 << 8) | b1);
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- } else {
- if (ashift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRGBAlphaBitMask) >>
- ashift);
- } else {
- t = (mask & ddpf.dwRGBAlphaBitMask) <<-ashift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if ((ddpf.dwRGBBitCount <= 24) &&
- (ddpf.dwRGBBitCount > 16)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- mask = ((b3 << 16) | (b2 << 8) | b1);
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- } else {
- if (ashift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRGBAlphaBitMask) >>
- ashift);
- } else {
- t = (mask & ddpf.dwRGBAlphaBitMask) <<-ashift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if ((ddpf.dwRGBBitCount <= 16) &&
- (ddpf.dwRGBBitCount > 8)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- mask = ((b2 << 8) | b1);
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- } else {
- if (ashift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRGBAlphaBitMask) >>
- ashift);
- } else {
- t = (mask & ddpf.dwRGBAlphaBitMask) <<-ashift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if (ddpf.dwRGBBitCount <= 8) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- mask = *src++;
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- if (ddpf.noAlpha) {
- *dst++ = (byte) 0xff;
- } else {
- if (ashift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwRGBAlphaBitMask) >>
- ashift);
- } else {
- t = (mask & ddpf.dwRGBAlphaBitMask) <<-ashift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- }
- }
-
- } else if (imageFormat == IMAGE_FORMAT_BYTE_GRAY) {
- int gshift = firstBit(ddpf.dwGBitMask) +
- ucountBits(ddpf.dwGBitMask) - 8;
- dstPitch = subWidth;
- destRow += (subHeight-1)*dstPitch;
-
- if ((ddpf.dwRGBBitCount == 32) &&
- (ddpf.dwRBitMask == 0xff0000) &&
- (ddpf.dwGBitMask == 0xff00) &&
- (ddpf.dwBBitMask == 0xff)) {
- // Optimize for the most common case
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- *dst++ = b2;
- *src++;
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else { // handle less common format
- int gshift = firstBit(ddpf.dwGBitMask) +
- ucountBits(ddpf.dwGBitMask) - 8;
- if ((ddpf.dwRGBBitCount <= 32) &&
- (ddpf.dwRGBBitCount > 24)) {
-
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- b4 = *src++;
- mask = ((b4 << 24) | (b3 << 16)| (b2 << 8) | b1);
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if ((ddpf.dwRGBBitCount <= 24) &&
- (ddpf.dwRGBBitCount > 16)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- mask = ((b3 << 16) | (b2 << 8) | b1);
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if ((ddpf.dwRGBBitCount <= 16) &&
- (ddpf.dwRGBBitCount > 8)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- mask = ((b2 << 8) | b1);
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- } else if (ddpf.dwRGBBitCount <= 8) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- mask = *src++;
- if (gshift >= 0) {
- *dst++ = (byte) ((mask & ddpf.dwGBitMask) >>
- gshift);
- } else {
- t = (mask & ddpf.dwGBitMask) << -gshift;
- *dst++ = (t <= 0xff ? (byte) t : 0xff);
- }
- }
- srcRow += lockedRect.Pitch;
- destRow -= dstPitch;
- }
- }
- }
-
- } else {
- // IMAGE_FORMAT_USHORT_GRAY
- printf("[Java 3D] copyDataFromSurface: Format not support %d\n", imageFormat);
- }
-
-
- hr = surf->UnlockRect();
- if (FAILED(hr)) {
- printf("Fail to unlock surface: %s\n", DXGetErrorString9(hr));
- return;
- }
-
-}
-
-
-void copyDataToSurfaceABGR(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;
- const DWORD srcPitch = subWidth*4;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
-
- if ((internalFormat == J3D_RGBA) ||
- (internalFormat == J3D_RGB)) {
- if ((ddpf->dwRGBBitCount == 32) &&
- (ddpf->dwRBitMask == 0xff0000) &&
- (ddpf->dwGBitMask == 0xff00) &&
- (ddpf->dwBBitMask == 0xff)) {
- // Optimize for most common case
- destRow += (xoffset << 2);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- a = *src++;
- *dst++ = *src++;
- *dst++ = *src++;
- *dst++ = *src++;
- *dst++ = a;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } 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++) {
- a = (*src++) >> 4; // discard the lower 4 bit
- b = (*src++) >> 4;
- g = (*src++) >> 4;
- r = (*src++) >> 4;
- *dst++ = (g << 4) | b;
- *dst++ = (a << 4) | r;
- }
- 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 (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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 (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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 (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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 (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- *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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src++;
- src++;
- 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;
- }
- 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 (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src++;
- src++;
- 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;
- }
- 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 (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src++;
- src++;
- 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;
- }
- 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 (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src++;
- src++;
- 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;
- }
- *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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- *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++) {
- l = *src++;
- src += 3;
- 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++) {
- l = *src++;
- src += 3;
- 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++) {
- l = *src++;
- src += 3;
- 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++) {
- l = *src++;
- src += 3;
- 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;
- }
- *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 {
- printf("Texture format %d not support.\n", internalFormat);
- }
-}
-
-
-void copyDataToSurfaceBGR(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, l;
- const DWORD srcPitch = subWidth*3;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
-
-
- if ((internalFormat == J3D_RGBA) ||
- (internalFormat == J3D_RGB)) {
- if ((ddpf->dwRGBBitCount == 32) &&
- (ddpf->dwRBitMask == 0xff0000) &&
- (ddpf->dwGBitMask == 0xff00) &&
- (ddpf->dwBBitMask == 0xff)) {
- // Optimize for most common case
- destRow += (xoffset << 2);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- *dst++ = *src++;
- *dst++ = *src++;
- *dst++ = *src++;
- *dst++ = 0xff;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
-
- } 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++) {
- b = (*src++) >> 4;
- g = (*src++) >> 4;
- r = (*src++) >> 4;
- *dst++ = (g << 4) | b;
- *dst++ = 0xf0 | r;
- }
- 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 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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- *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 (internalFormat == 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++) {
- src++;
- src++;
- 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;
- }
- 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++) {
- src++;
- src++;
- 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;
- }
- 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++) {
- src++;
- src++;
- 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;
- }
- 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++) {
- src++;
- src++;
- 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;
- }
- *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 (internalFormat == 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 += 3;
- *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 += 3;
- *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 += 3;
- *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 += 3;
- *dst++ = m1;
- }
- 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 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 += 3;
- 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 += 3;
- 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 += 3;
- 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 += 3;
- 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", internalFormat);
- }
-}
-
-/*
- * Same as copyDataToSurfaceRGBA()
- * but the pixel is written in the destination buffer
- * from right to left. This is used for CubeMapping.
- */
-void copyDataToSurfaceRGBARev(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;
-
- 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 += ((xlimit << 2) - 1);
- 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-- = *src++;
- *dst-- = r;
- *dst-- = g;
- *dst-- = b;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if ((ddpf->dwRGBBitCount == 16) &&
- (ddpf->dwRBitMask == 0xf00) &&
- (ddpf->dwGBitMask == 0xf0) &&
- (ddpf->dwBBitMask == 0xf)) {
- destRow += ((xlimit << 1) - 1);
- 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-- = (a << 4) | r;
- *dst-- = (g << 4) | b;
-
- }
- 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 += ((xlimit << 2) - 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 >> 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++) {
- 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 >> 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);
- 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 >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit-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;
- }
- *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 += ((xlimit << 2) -1);
- 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 = (*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;
- }
- 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;
- }
- } 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++) {
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | (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);
- 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 = (*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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | (a << ashift);
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- 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 = (*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 += ((xlimit << 2) - 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 >> 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 += 3;
- 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);
- 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 >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit-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;
- }
- *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 += ((xlimit << 2) - 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 >> 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 += 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 >> 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);
- 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 >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit-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;
- }
- *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 {
- printf("Texture format %d not support.\n", internalFormat);
- }
-}
-
-void copyDataToSurfaceABGRRev(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;
- const DWORD srcPitch = subWidth*4;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
-
- if ((internalFormat == J3D_RGBA) ||
- (internalFormat == J3D_RGB)) {
- if ((ddpf->dwRGBBitCount == 32) &&
- (ddpf->dwRBitMask == 0xff0000) &&
- (ddpf->dwGBitMask == 0xff00) &&
- (ddpf->dwBBitMask == 0xff)) {
- // Optimize for most common case
- destRow += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- a = *src++;
- b = *src++;
- g = *src++;
- r = *src++;
- *dst-- = a;
- *dst-- = r;
- *dst-- = g;
- *dst-- = b;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if ((ddpf->dwRGBBitCount == 16) &&
- (ddpf->dwRBitMask == 0xf00) &&
- (ddpf->dwGBitMask == 0xf0) &&
- (ddpf->dwBBitMask == 0xf)) {
- destRow += ((xlimit << 1) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- a = (*src++) >> 4; // discard the lower 4 bit
- b = (*src++) >> 4;
- g = (*src++) >> 4;
- r = (*src++) >> 4;
- *dst-- = (a << 4) | r;
- *dst-- = (g << 4) | b;
- }
- 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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;
- }
- } 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | (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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | (a << ashift);
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit-1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- *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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src++;
- src++;
- 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;
- }
- 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;
- }
- } 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | (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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | (a << ashift);
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src++;
- src++;
- 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;
- }
- *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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- 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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- mask = (a << ashift);
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += xlimit;
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- *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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src += 3;
- 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 >> 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++) {
- l = *src++;
- src += 3;
- 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 >> 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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src += 3;
- 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 >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src += 3;
- 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;
- }
- *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 {
- printf("Texture format %d not support.\n", internalFormat);
- }
-
-}
-
-
-void copyDataToSurfaceBGRRev(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, l;
- const DWORD srcPitch = subWidth*3;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
-
-
- if ((internalFormat == J3D_RGBA) ||
- (internalFormat == J3D_RGB)) {
- if ((ddpf->dwRGBBitCount == 32) &&
- (ddpf->dwRBitMask == 0xff0000) &&
- (ddpf->dwGBitMask == 0xff00) &&
- (ddpf->dwBBitMask == 0xff)) {
- // Optimize for most common case
- destRow += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b = *src++;
- g = *src++;
- r = *src++;
- *dst-- = 0xff;
- *dst-- = r;
- *dst-- = g;
- *dst-- = b;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
-
- } else if ((ddpf->dwRGBBitCount == 16) &&
- (ddpf->dwRBitMask == 0xf00) &&
- (ddpf->dwGBitMask == 0xf0) &&
- (ddpf->dwBBitMask == 0xf)) {
- destRow += ((xlimit << 1) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b = (*src++) >> 4;
- g = (*src++) >> 4;
- r = (*src++) >> 4;
- *dst-- = 0xf0 | r;
- *dst-- = (g << 4) | b;
- }
- 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 rshift = firstBit(ddpf->dwRBitMask);
- int gshift = firstBit(ddpf->dwGBitMask);
- int bshift = firstBit(ddpf->dwBBitMask);
- 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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- *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 (internalFormat == 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src++;
- src++;
- 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;
- }
- *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 (internalFormat == 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src += 3;
- *dst-- = m4;
- *dst-- = m3;
- *dst-- = m2;
- *dst-- = m1;
- }
- 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 += 3;
- *dst-- = m3;
- *dst-- = m2;
- *dst-- = m1;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if ((ddpf->dwRGBBitCount <= 16) &&
- (ddpf->dwRGBBitCount > 8)) {
- destRow += ((xlimit << 1) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src += 3;
- *dst-- = m2;
- *dst-- = m1;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src += 3;
- *dst-- = m1;
- }
- 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 rshift = firstBit(ddpf->dwRBitMask);
- int gshift = firstBit(ddpf->dwGBitMask);
- int bshift = firstBit(ddpf->dwBBitMask);
- 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++) {
- l = *src++;
- src += 3;
- 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 >> 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++) {
- l = *src++;
- src += 3;
- 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 >> 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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src += 3;
- 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 >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src += 3;
- 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", internalFormat);
- }
-}
-
-
-void copyDataToSurfaceRGBRev(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, l;
- const DWORD srcPitch = subWidth*3;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
-
- if ((internalFormat == J3D_RGBA) ||
- (internalFormat == J3D_RGB)) {
- destRow += ((xlimit << 2) - 1);
- 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()
- 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-- = (byte) 0xff;
- *dst-- = r;
- *dst-- = g;
- *dst-- = b;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if ((ddpf->dwRGBBitCount == 16) &&
- (ddpf->dwRBitMask == 0xf00) &&
- (ddpf->dwGBitMask == 0xf0) &&
- (ddpf->dwBBitMask == 0xf)) {
- destRow += ((xlimit << 1) - 1);
- 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;
- *dst-- = 0xf0 | r;
- *dst-- = (g << 4) | b;
- }
- 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 rshift = firstBit(ddpf->dwRBitMask);
- int gshift = firstBit(ddpf->dwGBitMask);
- int bshift = firstBit(ddpf->dwBBitMask);
- 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++) {
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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++) {
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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);
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 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;
- }
- *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 (internalFormat == 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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++) {
- l = *src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src++;
- 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;
- }
- *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 (internalFormat == 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src += 3;
- *dst-- = m4;
- *dst-- = m3;
- *dst-- = m2;
- *dst-- = m1;
- }
- 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 += 3;
- *dst-- = m3;
- *dst-- = m2;
- *dst-- = m1;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if ((ddpf->dwRGBBitCount <= 16) &&
- (ddpf->dwRGBBitCount > 8)) {
- destRow += ((xlimit << 1) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src += 3;
- *dst-- = m2;
- *dst-- = m1;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src += 3;
- *dst-- = m1;
- }
- 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 rshift = firstBit(ddpf->dwRBitMask);
- int gshift = firstBit(ddpf->dwGBitMask);
- int bshift = firstBit(ddpf->dwBBitMask);
- 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++) {
- l = *src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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++) {
- l = *src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src++;
- 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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | ddpf->dwRGBAlphaBitMask;
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- src++;
- 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;
- }
- *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", internalFormat);
- }
-}
-
-void copyDataToSurfaceLARev(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;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
- const DWORD srcPitch = subWidth*2;
-
- 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- *dst-- = *src++;
- *dst-- = l;
- *dst-- = l;
- *dst-- = l;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if ((ddpf->dwRGBBitCount == 16) &&
- (ddpf->dwRBitMask == 0xf00) &&
- (ddpf->dwGBitMask == 0xf0) &&
- (ddpf->dwBBitMask == 0xf)) {
- destRow += ((xlimit << 1) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = (*src++) >> 4; // discard the lower 4 bit
- a = (*src++) >> 4;
- *dst-- = (a << 4) | l;
- *dst-- = (l << 4) | l;
- }
- 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << 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;
- }
- } 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++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << bshift) | (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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << bshift) | (a << ashift);
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- *dst-- = (byte) ((l << rshift) | (l << gshift) |
- (l << 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *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;
- }
- 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;
- }
- } 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++) {
- l = *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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | (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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *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;
- }
- mask = (r << rshift) | (g << gshift) |
- (b << bshift) | (a << ashift);
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src++;
- 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++;
- 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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src++;
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- mask = (a << ashift);
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src++;
- 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src++;
- 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 >> 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++;
- 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 >> 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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src++;
- 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 >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- src++;
- 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;
- }
- *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 {
- printf("Texture format %d not support.\n", internalFormat);
- }
-}
-
-void copyDataToSurfaceGrayRev(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;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
- const DWORD srcPitch = subWidth;
-
- 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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- *dst-- = 0xff;
- *dst-- = l;
- *dst-- = l;
- *dst-- = l;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if ((ddpf->dwRGBBitCount == 16) &&
- (ddpf->dwRBitMask == 0xf00) &&
- (ddpf->dwGBitMask == 0xf0) &&
- (ddpf->dwBBitMask == 0xf)) {
- destRow += ((xlimit << 1) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = (*src++) >> 4; // discard the lower 4 bit
- *dst-- = 0xf0 | l;
- *dst-- = (l << 4) | l;
- }
- 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 rshift = firstBit(ddpf->dwRBitMask);
- int gshift = firstBit(ddpf->dwGBitMask);
- int bshift = firstBit(ddpf->dwBBitMask);
- 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++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << bshift) | ddpf->dwRGBAlphaBitMask;
- *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++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << bshift) | ddpf->dwRGBAlphaBitMask;
- *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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << bshift) | ddpf->dwRGBAlphaBitMask;
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- *dst-- = (byte) ((l << rshift) | (l << gshift) |
- (l << 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 (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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- if (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -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 >> 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++) {
- l = *src++;
- if (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -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);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if ((ddpf->dwRGBBitCount <= 16) &&
- (ddpf->dwRGBBitCount > 8)) {
- destRow += ((xlimit << 1) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- if (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -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 >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- l = *src++;
- if (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -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 += ((xlimit << 2) - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- 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++) {
- 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);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- mask = (a << ashift);
- *dst-- = (byte) ((mask >> 8) & 0xff);
- *dst-- = (byte) (mask & 0xff);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 1);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- 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 += ((xlimit << 2) - 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;
- }
- if (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -aDiscard;
- }
- 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;
- }
- } 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++) {
- 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 >> 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);
- 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;
- }
- 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);
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } else if (ddpf->dwRGBBitCount <= 8) {
- destRow += (xlimit - 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;
- }
- if (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -aDiscard;
- }
- *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 {
- 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;
-
- 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++) {
- r = *src++;
- g = *src++;
- b = *src++;
- *dst++ = b;
- *dst++ = g;
- *dst++ = r;
- *dst++ = *src++;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } 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++) {
- 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 { // 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);
- }
- 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++) {
- 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;
- }
- 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 = (*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;
- }
- 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++) {
- 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;
- }
- 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++) {
- 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;
- 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;
- }
- *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 {
- printf("Texture format %d not support.\n", internalFormat);
- }
-}
-
-
-void copyDataToSurfaceRGB(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, l;
- const DWORD srcPitch = subWidth*3;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
-
- if ((internalFormat == J3D_RGBA) ||
- (internalFormat == J3D_RGB)) {
- destRow += (xoffset << 2);
- 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()
- 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++ = (byte) 0xff;
-
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } 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++) {
- r = (*src++) >> 4; // discard the lower 4 bit
- g = (*src++) >> 4;
- b = (*src++) >> 4;
- *dst++ = (g << 4) | b;
- *dst++ = 0xf0 | r;
- }
- 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 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++) {
- 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;
- }
- 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++) {
- 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;
- }
- 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++) {
- 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;
- }
- 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++) {
- 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;
- }
- *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 (internalFormat == 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++;
- src++;
- 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;
- }
- 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++;
- 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;
- }
- 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++;
- 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;
- }
- 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++;
- 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;
- }
- *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 (internalFormat == 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 += 3;
- *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 += 3;
- *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 += 3;
- *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 += 3;
- *dst++ = m1;
- }
- 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 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++;
- 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;
- }
- 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++;
- 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;
- }
- 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++;
- 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;
- }
- 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++;
- 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;
- }
- *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", internalFormat);
- }
-}
-
-
-void copyDataToSurfaceLA(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;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
- const DWORD srcPitch = subWidth*2;
-
- 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++) {
- l = *src++;
- *dst++ = l;
- *dst++ = l;
- *dst++ = l;
- *dst++ = *src++;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } 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++) {
- l = (*src++) >> 4; // discard the lower 4 bit
- a = (*src++) >> 4;
- *dst++ = (l << 4) | l;
- *dst++ = (a << 4) | l;
- }
- 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) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << 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) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << 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) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << 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) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) >> -aDiscard;
- }
- *dst++ = (byte) ((l << rshift) | (l << gshift) |
- (l << 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++) {
- l = *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;
- }
- 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++;
- 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;
- }
- 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++) {
- l = *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;
- }
- 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++) {
- l = *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++;
- 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++;
- 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++;
- 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++;
- 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++;
- 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++;
- 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++;
- 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++;
- 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;
- }
- *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 {
- printf("Texture format %d not support.\n", internalFormat);
- }
-}
-
-void copyDataToSurfaceGray(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;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
- const DWORD srcPitch = subWidth;
-
-
- 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++) {
- l = *src++;
- *dst++ = l;
- *dst++ = l;
- *dst++ = l;
- *dst++ = 0xff;
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } 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++) {
- l = (*src++) >> 4; // discard the lower 4 bit
- *dst++ = (l << 4) | l;
- *dst++ = 0xf0 | l;
- }
- 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 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++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << 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++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << 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++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- mask = (l << rshift) | (l << gshift) |
- (l << 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++) {
- if (rDiscard >= 0) {
- l = (*src++) >> rDiscard;
- } else {
- l = (*src++) << -rDiscard;
- }
- *dst++ = (byte) ((l << rshift) | (l << gshift) |
- (l << 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 (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++) {
- l = *src++;
- if (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -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 & 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 (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -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 & 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 (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -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 & 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 (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -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++) {
- 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++) {
- 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++) {
- 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++) {
- 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++) {
- 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++) {
- 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++) {
- 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++) {
- 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;
- }
- *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 {
- printf("Texture format %d not support.\n", internalFormat);
- }
-}
-
-
-/**************** NEW (1.5.0 stuff) ****************/
-/* Note this method only works on little endian architecture */
-void copyInt_ARGB_DataToSurface(jint textureFormat,
- 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;
- const DWORD srcPitch = subWidth*4;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
-
- if ((textureFormat == J3D_RGBA) ||
- (textureFormat == J3D_RGB)) {
- /* printf("copyInt_ARGB_DataToSurface : RGBBitCount = %d \n",
- ddpf->dwRGBBitCount); */
- if ((ddpf->dwRGBBitCount == 32) &&
- (ddpf->dwRBitMask == 0xff0000) &&
- (ddpf->dwGBitMask == 0xff00) &&
- (ddpf->dwBBitMask == 0xff)) {
- // Optimize for most common case
- destRow += (xoffset << 2);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- *dst++ = *src++; /* b */
- *dst++ = *src++; /* g */
- *dst++ = *src++; /* r */
- *dst++ = *src++; /* a */
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } 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++) {
- b = (*src++) >> 4; // discard the lower 4 bit
- g = (*src++) >> 4;
- r = (*src++) >> 4;
- a = (*src++) >> 4;
- *dst++ = (g << 4) | b;
- *dst++ = (a << 4) | r;
- }
- 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 (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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 (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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 (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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 (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- 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 (textureFormat == 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++;
- src++;
- 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 = (*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++) {
- src++;
- src++;
- 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 = (*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++) {
- src++;
- src++;
- 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 = (*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++) {
- src++;
- src++;
- 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 = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- *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 (textureFormat == 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- 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++) {
- if (aDiscard >= 0) {
- a = (*src++) >> aDiscard;
- } else {
- a = (*src++) << -aDiscard;
- }
- src += 3;
- *dst++ = (byte) (a << ashift);
- }
- 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);
- 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;
- }
- 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++) {
- 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;
- }
- 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++) {
- 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;
- }
- 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++) {
- 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;
- }
- if (aDiscard >= 0) {
- a = l >> aDiscard;
- } else {
- a = l << -aDiscard;
- }
- *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 {
- printf("Texture format %d not support.\n", textureFormat);
- }
-}
-
-/* Note this method only works on little endian architecture */
-void copyInt_XRGB_DataToSurface(jint textureFormat,
- 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;
- const DWORD srcPitch = subWidth*4;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
-
- if ((textureFormat == J3D_RGBA) ||
- (textureFormat == J3D_RGB)) {
- /* printf("copyInt_XRGB_DataToSurface : RGBBitCount = %d \n",
- ddpf->dwRGBBitCount); */
- if ((ddpf->dwRGBBitCount == 32) &&
- (ddpf->dwRBitMask == 0xff0000) &&
- (ddpf->dwGBitMask == 0xff00) &&
- (ddpf->dwBBitMask == 0xff)) {
- // Optimize for most common case
- destRow += (xoffset << 2);
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- *dst++ = *src++; /* b */
- *dst++ = *src++; /* g */
- *dst++ = *src++; /* r */
- *dst++ = 0xff; *src++; /* a */
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } 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++) {
- b = (*src++) >> 4; // discard the lower 4 bit
- g = (*src++) >> 4;
- r = (*src++) >> 4;
- *src++; /* a */
- *dst++ = (g << 4) | b;
- *dst++ = 0xf0 | r;
- }
- 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 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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- *src++; /* a */
- 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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- *src++; /* a */
- 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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- *src++; /* a */
- 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++) {
- if (bDiscard >= 0) {
- b = (*src++) >> bDiscard;
- } else {
- b = (*src++) >> -bDiscard;
- }
- if (gDiscard >= 0) {
- g = (*src++) >> gDiscard;
- } else {
- g = (*src++) >> -gDiscard;
- }
- if (rDiscard >= 0) {
- r = (*src++) >> rDiscard;
- } else {
- r = (*src++) << -rDiscard;
- }
- *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++) {
- src++;
- src++;
- 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++; /* a */
- 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++) {
- src++;
- src++;
- 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++; /* a */
- 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++) {
- src++;
- src++;
- 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++; /* a */
- 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++) {
- src++;
- src++;
- 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++; /* a */
- *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);
- }
-}
-
-/* Note this method only works on little endian architecture */
-void copyInt_XBGR_DataToSurface(jint textureFormat,
- 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;
- const DWORD srcPitch = subWidth*4;
- unsigned char *srcRow = (unsigned char *) data;
- unsigned char *destRow = pRect + rectPitch*yoffset;
-
- if ((textureFormat == J3D_RGBA) ||
- (textureFormat == J3D_RGB)) {
- /* printf("copyInt_XRGB_DataToSurface : RGBBitCount = %d \n",
- ddpf->dwRGBBitCount); */
- if ((ddpf->dwRGBBitCount == 32) &&
- (ddpf->dwRBitMask == 0xff0000) &&
- (ddpf->dwGBitMask == 0xff00) &&
- (ddpf->dwBBitMask == 0xff)) {
- // Optimize for most common case
- 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; /* b */
- *dst++ = g; /* g */
- *dst++ = r; /* r */
- *dst++ = 0xff; *src++; /* a */
- }
- srcRow += srcPitch;
- destRow += rectPitch;
- }
- } 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++) {
- r = (*src++) >> 4; // discard the lower 4 bit
- g = (*src++) >> 4;
- b = (*src++) >> 4;
- *src++; /* a */
- *dst++ = (g << 4) | b;
- *dst++ = 0xf0 | r;
- }
- 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 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++) {
- 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 */
- 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++) {
- 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 */
- 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++) {
- 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 */
- 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++) {
- 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;
- }
-}
-
-// copy data from DirectDraw depth surface to memory
-// and reverse the Y axis
-void copyDepthFromSurface(jint xoffset, jint yoffset,
- jint subWidth, jint subHeight,
- jint *data,
- LPDIRECT3DSURFACE9 surf)
-{
- D3DSURFACE_DESC ddsd;
- DEPTHPIXELFORMAT ddpf;
- D3DLOCKED_RECT lockedRect;
- HRESULT hr;
-
- if (surf == NULL) {
- return;
- }
- surf->GetDesc(&ddsd);
- DWORD width = ddsd.Width;
- DWORD height = ddsd.Height;
- computeDepthPixelFormat(&ddpf, ddsd.Format);
-
- if ((xoffset >= width) || (yoffset >= height)) {
- return;
- }
-
- DWORD xlimit = min(xoffset + subWidth, width);
- DWORD ylimit = min(yoffset + subHeight, height);
-
- hr = surf->LockRect(&lockedRect, NULL, D3DLOCK_READONLY);
-
- if (FAILED(hr)) {
- if (debug) {
- printf("Fail to lock depth surface: %s\n", DXGetErrorString9(hr));
- }
- return;
- }
-
- DWORD b1, b2, b3, b4;
- DWORD mask;
- jint *destRow = data;
- jint *dst;
- unsigned char *src;
- unsigned char *srcRow = ((unsigned char *) lockedRect.pBits) +
- xoffset*((int) ceil((float) ddpf.dwZBufferBitDepth/8.0)) +
- (yoffset*lockedRect.Pitch);
-
- int zshift = firstBit(ddpf.dwZBitMask);
-
- destRow += (subHeight-1)*subWidth;
-
- if ((ddpf.dwZBufferBitDepth <= 32) &&
- (ddpf.dwZBufferBitDepth > 24)) {
-
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- b4 = *src++;
- mask = (b4 << 24) | (b3 << 16) |
- (b2 << 8) | b1;
- *dst++ = (mask & ddpf.dwZBitMask) >> zshift;
- }
- srcRow += lockedRect.Pitch;
- destRow -= subWidth;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 24) &&
- (ddpf.dwZBufferBitDepth > 16)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- mask = (b3 << 16) | (b2 << 8) | b1;
- *dst++ = (mask & ddpf.dwZBitMask) >> zshift;
- }
- srcRow += lockedRect.Pitch;
- destRow -= subWidth;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 16) &&
- (ddpf.dwZBufferBitDepth > 8)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- mask = (b2 << 8) | b1;
- *dst++ = (mask & ddpf.dwZBitMask) >> zshift;
- }
- srcRow += lockedRect.Pitch;
- destRow -= subWidth;
- }
- } else if (ddpf.dwZBufferBitDepth <= 8) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- *dst++ = (*src++ & ddpf.dwZBitMask) >> zshift;
- }
- srcRow += lockedRect.Pitch;
- destRow -= subWidth;
- }
- } else {
- // This is not support by D3D 8 either
- printf("[Java 3D] %d bit Z buffer not support !\n",
- ddpf.dwZBufferBitDepth);
- }
-
- hr = surf->UnlockRect();
- if (FAILED(hr)) {
- printf("Fail to unlock depth surface: %s\n", DXGetErrorString9(hr));
- return;
- }
-}
-
-
-// copy data from DirectDraw depth surface to memory
-// and reverse the Y axis
-void copyDepthFromSurface(jint xoffset, jint yoffset,
- jint subWidth, jint subHeight,
- jfloat *data,
- LPDIRECT3DSURFACE9 surf)
-{
- D3DSURFACE_DESC ddsd;
- DEPTHPIXELFORMAT ddpf;
- D3DLOCKED_RECT lockedRect;
- HRESULT hr;
-
- if (surf == NULL) {
- return;
- }
-
- surf->GetDesc(&ddsd);
- DWORD width = ddsd.Width;
- DWORD height = ddsd.Height;
- computeDepthPixelFormat(&ddpf, ddsd.Format);
-
- if ((xoffset >= width) || (yoffset >= height)) {
- return;
- }
-
- DWORD xlimit = min(xoffset + subWidth, width);
- DWORD ylimit = min(yoffset + subHeight, height);
-
- hr = surf->LockRect(&lockedRect, NULL, D3DLOCK_READONLY);
-
- if (FAILED(hr)) {
- if (debug) {
- printf("Fail to lock depth surface: %s\n", DXGetErrorString9(hr));
- }
- return;
- }
-
- DWORD b1, b2, b3, b4;
- DWORD mask;
- jfloat *destRow = data;
- jfloat *dst;
- unsigned char *src;
- unsigned char *srcRow = ((unsigned char *) lockedRect.pBits) +
- xoffset*((int) ceil((float) ddpf.dwZBufferBitDepth/8.0)) +
- (yoffset*lockedRect.Pitch);
-
- int zshift = firstBit(ddpf.dwZBitMask);
- float maxdepth = float( 1 << ddpf.dwZBufferBitDepth);
-
- destRow += (subHeight-1)*subWidth;
-
- if ((ddpf.dwZBufferBitDepth <= 32) &&
- (ddpf.dwZBufferBitDepth > 24)) {
-
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- b4 = *src++;
- mask = (b4 << 24) | (b3 << 16) |
- (b2 << 8) | b1;
- *dst++ = (((mask & ddpf.dwZBitMask) >>
- zshift))/ maxdepth;
- }
- srcRow += lockedRect.Pitch;
- destRow -= subWidth;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 24) &&
- (ddpf.dwZBufferBitDepth > 16)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- b3 = *src++;
- mask = (b3 << 16) | (b2 << 8) | b1;
- *dst++ = ((mask & ddpf.dwZBitMask) >>
- zshift)/ maxdepth;
- }
- srcRow += lockedRect.Pitch;
- destRow -= subWidth;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 16) &&
- (ddpf.dwZBufferBitDepth > 8)) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- b1 = *src++;
- b2 = *src++;
- mask = (b2 << 8) | b1;
- *dst++ = ((mask & ddpf.dwZBitMask) >>
- zshift)/ maxdepth;
- }
- srcRow += lockedRect.Pitch;
- destRow -= subWidth;
- }
- } else if (ddpf.dwZBufferBitDepth <= 8) {
- for (int i=yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=xoffset; j < xlimit; j++) {
- *dst++ = ((*src++ & ddpf.dwZBitMask) >>
- zshift)/ maxdepth;
- }
- srcRow += lockedRect.Pitch;
- destRow -= subWidth;
- }
- } else {
- // This is not support by D3D 8 either
- printf("[Java 3D] %d bit Z buffer not support !\n",
- ddpf.dwZBufferBitDepth);
- }
-
- hr = surf->UnlockRect();
- if (FAILED(hr)) {
- printf("Fail to unlock depth surface: %s\n", DXGetErrorString9(hr));
- return;
- }
-}
-
-
-// copy data to DirectDraw depth surface from memory
-// and reverse the Y axis
-void copyDepthToSurfaceAlways(jint dst_xoffset, jint dst_yoffset,
- jint src_xoffset, jint src_yoffset,
- jint subWidth, jint subHeight,
- jint src_width, jint src_height,
- jint *data,
- LPDIRECT3DSURFACE9 surf)
-{
- D3DSURFACE_DESC ddsd;
- DEPTHPIXELFORMAT ddpf;
- D3DLOCKED_RECT lockedRect;
- HRESULT hr;
-
- if (surf == NULL) {
- return;
- }
-
- surf->GetDesc(&ddsd);
- DWORD width = ddsd.Width;
- DWORD height = ddsd.Height;
- computeDepthPixelFormat(&ddpf, ddsd.Format);
-
- if ((dst_xoffset >= width) || (dst_yoffset >= height)) {
- return;
- }
-
- DWORD xlimit = min(dst_xoffset + subWidth, width);
- DWORD ylimit = min(dst_yoffset + subHeight, height);
-
- hr = surf->LockRect(&lockedRect, NULL, 0);
-
- if (FAILED(hr)) {
- if (debug) {
- printf("Fail to lock depth surface: %s\n", DXGetErrorString9(hr));
- }
- return;
- }
- jint *src;
- jint *srcRow = data + src_xoffset +
- (src_yoffset + subHeight-1)*src_width;
- unsigned char *dst;
- unsigned char *destRow = ((unsigned char *) lockedRect.pBits) +
- dst_xoffset + dst_yoffset*lockedRect.Pitch;
-
- int zshift = firstBit(ddpf.dwZBitMask);
- DWORD mask;
- int maxValue = ddpf.dwZBitMask >> zshift;
-
-
- if ((ddpf.dwZBufferBitDepth <= 32) &&
- (ddpf.dwZBufferBitDepth > 24)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- mask = *src++;
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- *dst++ = (byte) ((mask >> 24) & 0xff);
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 24) &&
- (ddpf.dwZBufferBitDepth > 16)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- mask = *src++;
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 16) &&
- (ddpf.dwZBufferBitDepth > 8)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- mask = *src++;
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if (ddpf.dwZBufferBitDepth <= 8) {
- byte bmask = (byte) (ddpf.dwZBitMask & 0xff);
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- mask = *src++;
- if (mask < maxValue) {
- *dst++ = (byte) ((mask << zshift) & 0xff);
- } else {
- *dst++ = bmask;
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
-
- }
-
- hr = surf->UnlockRect();
- if (FAILED(hr)) {
- printf("Fail to unlock depth surface: %s\n", DXGetErrorString9(hr));
- return;
- }
-
-}
-
-
-// copy data to DirectDraw depth surface from memory
-// and reverse the Y axis
-void copyDepthToSurfaceAlways(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)
-{
- D3DSURFACE_DESC ddsd;
- DEPTHPIXELFORMAT ddpf;
- D3DLOCKED_RECT lockedRect;
- HRESULT hr;
-
- if (surf == NULL) {
- return;
- }
-
- surf->GetDesc(&ddsd);
- DWORD width = ddsd.Width;
- DWORD height = ddsd.Height;
- computeDepthPixelFormat(&ddpf, ddsd.Format);
-
-
- if ((dst_xoffset >= width) || (dst_yoffset >= height)) {
- return;
- }
-
- DWORD xlimit = min(dst_xoffset + subWidth, width);
- DWORD ylimit = min(dst_yoffset + subHeight, height);
-
- hr = surf->LockRect(&lockedRect, NULL, 9);
-
- if (FAILED(hr)) {
- if (debug) {
- printf("Fail to lock depth surface: %s\n", DXGetErrorString9(hr));
- }
- return;
- }
- jfloat *src;
- jfloat *srcRow = data + src_xoffset +
- (src_yoffset + subHeight-1)*src_width;
- unsigned char *dst;
- unsigned char *destRow = ((unsigned char *) lockedRect.pBits) +
- dst_xoffset + dst_yoffset*lockedRect.Pitch;
-
- int zshift = firstBit(ddpf.dwZBitMask);
- DWORD mask;
- int maxValue = ddpf.dwZBitMask >> zshift;
- float maxdepth = float( 1 << ddpf.dwZBufferBitDepth);
-
- if ((ddpf.dwZBufferBitDepth <= 32) &&
- (ddpf.dwZBufferBitDepth > 24)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- mask = DWORD((*src++)*maxdepth);
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- *dst++ = (byte) ((mask >> 24) & 0xff);
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 24) &&
- (ddpf.dwZBufferBitDepth > 16)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- mask = DWORD((*src++)*maxdepth);
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 16) &&
- (ddpf.dwZBufferBitDepth > 8)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- mask = DWORD((*src++)*maxdepth);
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if (ddpf.dwZBufferBitDepth <= 8) {
- byte bmask = (byte) (ddpf.dwZBitMask & 0xff);
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- mask = DWORD((*src++)*maxdepth);
- if (mask < maxValue) {
- *dst++ = (byte) ((mask << zshift) & 0xff);
- } else {
- *dst++ = bmask;
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
-
- }
-
- hr = surf->UnlockRect();
- if (FAILED(hr)) {
- printf("Fail to unlock depth surface: %s\n", DXGetErrorString9(hr));
- return;
- }
-
-}
-
-// copy data to DirectDraw depth surface from memory
-// and reverse the Y axis with Z test D3DCMP_LESS
-void copyDepthToSurfaceCmp(jint dst_xoffset, jint dst_yoffset,
- jint src_xoffset, jint src_yoffset,
- jint subWidth, jint subHeight,
- jint src_width, jint src_height,
- jint *data,
- LPDIRECT3DSURFACE9 surf)
-{
- D3DSURFACE_DESC ddsd;
- DEPTHPIXELFORMAT ddpf;
- D3DLOCKED_RECT lockedRect;
- HRESULT hr;
-
- if (surf == NULL) {
- return;
- }
-
- surf->GetDesc(&ddsd);
- DWORD width = ddsd.Width;
- DWORD height = ddsd.Height;
- computeDepthPixelFormat(&ddpf, ddsd.Format);
-
-
- if ((dst_xoffset >= width) || (dst_yoffset >= height)) {
- return;
- }
-
- DWORD xlimit = min(dst_xoffset + subWidth, width);
- DWORD ylimit = min(dst_yoffset + subHeight, height);
-
- hr = surf->LockRect(&lockedRect, NULL, 0);
-
- if (FAILED(hr)) {
- if (debug) {
- printf("Fail to lock depth surface: %s\n", DXGetErrorString9(hr));
- }
- return;
- }
-
- jint *src;
- jint *srcRow = data + src_xoffset +
- (src_yoffset + subHeight-1)*src_width;
- unsigned char *dst;
- unsigned char *destRow = ((unsigned char *) lockedRect.pBits) +
- dst_xoffset + dst_yoffset*lockedRect.Pitch;
-
-
- int zshift = firstBit(ddpf.dwZBitMask);
- DWORD mask;
- DWORD b1, b2, b3, b4;
- DWORD zmask;
- int maxValue = ddpf.dwZBitMask >> zshift;
-
-
- if ((ddpf.dwZBufferBitDepth <= 32) &&
- (ddpf.dwZBufferBitDepth > 24)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- b1 = *dst++;
- b2 = *dst++;
- b3 = *dst++;
- b4 = *dst++;
- zmask = (b4 << 24) | (b3 << 16) |
- (b2 << 8) | b1;
- zmask = (zmask & ddpf.dwZBitMask) >> zshift;
- mask = *src++;
- if (mask < zmask) {
- // z depth test pass
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- dst -= 4;
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- *dst++ = (byte) ((mask >> 24) & 0xff);
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 24) &&
- (ddpf.dwZBufferBitDepth > 16)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- b1 = *dst++;
- b2 = *dst++;
- b3 = *dst++;
- zmask = (b3 << 16) | (b2 << 8) | b1;
- zmask = (zmask & ddpf.dwZBitMask) >> zshift;
- mask = *src++;
- if (mask < zmask) {
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- dst -= 3;
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 16) &&
- (ddpf.dwZBufferBitDepth > 8)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- b1 = *dst++;
- b2 = *dst++;
- zmask = (b2 << 8) | b1;
- zmask = (zmask & ddpf.dwZBitMask) >> zshift;
- mask = *src++;
- if (mask < zmask) {
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- dst -= 2;
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if (ddpf.dwZBufferBitDepth <= 8) {
- byte bmask = (byte) (ddpf.dwZBitMask & 0xff);
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- zmask = (*dst++ & ddpf.dwZBitMask) >> zshift;
- mask = *src++;
- if (mask < zmask) {
- dst--;
- if (mask < maxValue) {
- *dst++ = (byte) ((mask << zshift) & 0xff);
- } else {
- *dst++ = bmask;
- }
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
-
- }
-
- hr = surf->UnlockRect();
- if (FAILED(hr)) {
- printf("Fail to unlock depth surface: %s\n", DXGetErrorString9(hr));
- return;
- }
-
-}
-
-
-// copy data to DirectDraw depth surface from memory
-// and reverse the Y axis with Z test D3DCMP_LESS
-void copyDepthToSurfaceCmp(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)
-{
- D3DSURFACE_DESC ddsd;
- DEPTHPIXELFORMAT ddpf;
- D3DLOCKED_RECT lockedRect;
- HRESULT hr;
-
- if (surf == NULL) {
- return;
- }
-
- surf->GetDesc(&ddsd);
- DWORD width = ddsd.Width;
- DWORD height = ddsd.Height;
- computeDepthPixelFormat(&ddpf, ddsd.Format);
-
-
- if ((dst_xoffset >= width) || (dst_yoffset >= height)) {
- return;
- }
-
- DWORD xlimit = min(dst_xoffset + subWidth, width);
- DWORD ylimit = min(dst_yoffset + subHeight, height);
-
- hr = surf->LockRect(&lockedRect, NULL, 0);
-
- if (FAILED(hr)) {
- if (debug) {
- printf("Fail to lock depth surface: %s\n", DXGetErrorString9(hr));
- }
- return;
- }
- jfloat *src;
- jfloat *srcRow = data + src_xoffset +
- (src_yoffset + subHeight-1)*src_width;
- unsigned char *dst;
- unsigned char *destRow = ((unsigned char *) lockedRect.pBits) +
- dst_xoffset + dst_yoffset*lockedRect.Pitch;
-
- int zshift = firstBit(ddpf.dwZBitMask);
- DWORD mask;
- DWORD b1, b2, b3, b4;
- DWORD zmask;
- int maxValue = ddpf.dwZBitMask >> zshift;
- float maxdepth = float(1 << ddpf.dwZBufferBitDepth);
-
- if ((ddpf.dwZBufferBitDepth <= 32) &&
- (ddpf.dwZBufferBitDepth > 24)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- b1 = *dst++;
- b2 = *dst++;
- b3 = *dst++;
- b4 = *dst++;
- zmask = (b4 << 24) | (b3 << 16) |
- (b2 << 8) | b1;
- zmask = (zmask & ddpf.dwZBitMask) >> zshift;
- mask = DWORD((*src++)*maxdepth);
- if (mask < zmask) {
- // z depth test pass
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- dst -= 4;
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- *dst++ = (byte) ((mask >> 24) & 0xff);
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 24) &&
- (ddpf.dwZBufferBitDepth > 16)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- b1 = *dst++;
- b2 = *dst++;
- b3 = *dst++;
- zmask = (b3 << 16) | (b2 << 8) | b1;
- zmask = (zmask & ddpf.dwZBitMask) >> zshift;
- mask = DWORD((*src++)*maxdepth);
- if (mask < zmask) {
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- dst -= 3;
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- *dst++ = (byte) ((mask >> 16) & 0xff);
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if ((ddpf.dwZBufferBitDepth <= 16) &&
- (ddpf.dwZBufferBitDepth > 8)) {
-
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- b1 = *dst++;
- b2 = *dst++;
- zmask = (b2 << 8) | b1;
- zmask = (zmask & ddpf.dwZBitMask) >> zshift;
- mask = DWORD((*src++)*maxdepth);
- if (mask < zmask) {
- if (mask < maxValue) {
- mask = mask << zshift;
- } else {
- mask = ddpf.dwZBitMask;
- }
- dst -= 2;
- *dst++ = (byte) (mask & 0xff);
- *dst++ = (byte) ((mask >> 8) & 0xff);
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
- } else if (ddpf.dwZBufferBitDepth <= 8) {
- byte bmask = (byte) (ddpf.dwZBitMask & 0xff);
- for (int i=dst_yoffset; i < ylimit; i++) {
- src = srcRow;
- dst = destRow;
- for (int j=dst_xoffset; j < xlimit; j++) {
- zmask = (*dst++ & ddpf.dwZBitMask) >> zshift;
- mask = DWORD((*src++)*maxdepth);
- if (mask < zmask) {
- dst--;
- if (mask < maxValue) {
- *dst++ = (byte) ((mask << zshift) & 0xff);
- } else {
- *dst++ = bmask;
- }
- }
- }
- srcRow -= src_width;
- destRow += lockedRect.Pitch;
- }
-
- }
-
- hr = surf->UnlockRect();
- if (FAILED(hr)) {
- printf("Fail to unlock depth surface: %s\n", DXGetErrorString9(hr));
- return;
- }
-
-}
-
-// 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,
- jint *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);
- }
-}
-
-
-// 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 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,
- 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 (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));
- return;
- }
-}
-
-VOID createLineModeIndexBuffer(D3dCtx *d3dCtx)
-{
- HRESULT hr;
- WORD *wptr;
-
- hr = d3dCtx->pDevice->CreateIndexBuffer(6*sizeof(WORD),
- D3DUSAGE_WRITEONLY,
- D3DFMT_INDEX16,
- D3DPOOL_DEFAULT,
- &d3dCtx->lineModeIndexBuffer,
- NULL);
- if (FAILED(hr)) {
- D3dCtx::d3dWarning(CREATEINDEXVBFAIL, hr);
- return;
- }
-
-
- hr = d3dCtx->lineModeIndexBuffer->Lock(0, 0, (VOID **) &wptr, 0);
- if (FAILED(hr)) {
- D3dCtx::d3dWarning(LOCKINDEXVBFAIL, hr);
- return;
- }
-
- *wptr++ = 0;
- *wptr++ = 1;
- *wptr++ = 2;
- *wptr++ = 3;
- *wptr++ = 0;
- *wptr = 0; // not used
- d3dCtx->lineModeIndexBuffer->Unlock();
-}
-
-// Return TRUE if index is adjust smaller
-BOOL createQuadIndices(D3dCtx *d3dCtx, int vcount)
-{
- DWORD dwIndexCount = (vcount*3) >> 1;
- WORD *q;
- LPDIRECT3DDEVICE9 device = d3dCtx->pDevice;
- HRESULT hr;
- BOOL adjustIdx = FALSE;
-
- if (dwIndexCount > d3dCtx->deviceInfo->maxVertexIndex) {
- // We'll render the VB multiple times in this case
- dwIndexCount = min(d3dCtx->deviceInfo->maxVertexIndex,
- (d3dCtx->deviceInfo->maxPrimitiveCount << 1));
- adjustIdx = TRUE;
- }
-
- if (dwIndexCount > d3dCtx->quadIndexBufferSize) {
- d3dCtx->freeResource(d3dCtx->quadIndexBuffer);
- hr = device->CreateIndexBuffer(dwIndexCount*sizeof(WORD),
- D3DUSAGE_WRITEONLY,
- D3DFMT_INDEX16,
- D3DPOOL_MANAGED,
- &d3dCtx->quadIndexBuffer,
- NULL);
- if (FAILED(hr)) {
- printf("[Java3D] Error CREATEINDEXVBFAIL \n");
- D3dCtx::d3dWarning(CREATEINDEXVBFAIL, hr);
- d3dCtx->quadIndexBufferSize = 0;
- d3dCtx->quadIndexBuffer = NULL;
- if (d3dCtx->quadIndexBufferSize > 0) {
- // indices has successfully set before, we prevent
- // setting this when indices did not set before.
- // It is becasue there is a bug in Nvidia driver which
- // will crash in this case.
- device->SetIndices(NULL);
- }
- return adjustIdx;
- }
-
- d3dCtx->quadIndexBufferSize = dwIndexCount;
- hr = d3dCtx->quadIndexBuffer->Lock(0, 0, (VOID **) &q, 0);
- if (FAILED(hr)) {
- D3dCtx::d3dWarning(LOCKINDEXVBFAIL, hr);
- if (d3dCtx->quadIndexBufferSize > 0) {
- device->SetIndices(NULL);
- }
- return adjustIdx;
- }
- int i = -1;
- int j = 0;
-
- while (j < dwIndexCount) {
- q[j++] = ++i; // q[0] = 0
- q[j++] = i+1; // q[1] = 1
- q[j++] = i+2; // q[2] = 2
- q[j++] = i++; // q[3] = 0
- q[j++] = ++i; // q[4] = 2
- q[j++] = ++i; // q[5] = 3
- }
-
- d3dCtx->quadIndexBuffer->Unlock();
- }
-
- return adjustIdx;
-}
-
-
-int getPrimitiveNum(int primitive, int vcount)
-{
- switch (primitive) {
- case D3DPT_TRIANGLESTRIP:
- return vcount-2;
- case D3DPT_TRIANGLEFAN:
- return vcount-2;
- case D3DPT_LINESTRIP:
- return vcount - 1;
- case D3DPT_LINELIST:
- return vcount >> 1;
- case D3DPT_TRIANGLELIST:
- return vcount/3;
- case D3DPT_POINTLIST:
- return vcount;
- default: // should not happen
- printf("[Java 3D] Unknown primitive type %d\n", primitive);
- }
- return 0;
-}
-
-
-/*
- * Note that the condition width == height always holds
- * when this function is invoked.
- */
-LPDIRECT3DCUBETEXTURE9 createCubeMapTexture(D3dCtx *d3dCtx,
- jint numLevels,
- jint textureFormat,
- jint width,
- jint height,
- jboolean useAutoMipMap)
-{
- LPDIRECT3DCUBETEXTURE9 pTexture;
- D3DFORMAT format;
- HRESULT hr;
- DWORD usage = 0;
-
- LPDIRECT3DDEVICE9 pDevice = d3dCtx->pDevice;
- D3dDeviceInfo *deviceInfo = d3dCtx->deviceInfo;
-
- if (!deviceInfo->supportMipmap) {
- numLevels = 1;
- }
-
- getTexWidthHeight(deviceInfo, &width, &height);
- format = getTexFormat(textureFormat);
-
- if (useAutoMipMap) {
- usage |= D3DUSAGE_AUTOGENMIPMAP;
- }
-
- // If format not support, the utility function will adjust the
- // calling parameters automatically
- hr = D3DXCreateCubeTexture(d3dCtx->pDevice, width,
- numLevels, usage, format, D3DPOOL_MANAGED,
- &pTexture);
-
- if (FAILED(hr)) {
- if (debug) {
- printf("Fail to create cube texture surface %dx%d, format %d, level %d : %s\n",
- width, height, format, numLevels, DXGetErrorString9(hr));
- }
- return NULL;
- }
-
- return pTexture;
-}
-
-void copyDataToCubeMap(jint imageFormat,
- jint textureFormat,
- jint xoffset, jint yoffset,
- jint imgXOffset, jint imgYOffset,
- jint subWidth, jint subHeight,
- jint tilew,
- jbyte* 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);
-
- // 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(textureCubeMapFace[face],
- 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 :
- // 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 + (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(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 + (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(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 + 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(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 :
- printf("[Java 3D] Cubemap doesn't support FORMAT_INT_BGR, \n");
- printf("please see issue 377 : https://java3d.dev.java.net/issues/show_bug.cgi?id=377\n");
- printf("For more information on reporting Java 3D related issue : https://java3d.dev.java.net/#Reporting_Issue \n");
- // 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)) << 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_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 :
- printf("[Java 3D] Cubemap doesn't support FORMAT_INT_RGB!\n");
- printf("please see issue 377 : https://java3d.dev.java.net/issues/show_bug.cgi?id=377\n");
- printf("For more information on reporting Java 3D related issue : https://java3d.dev.java.net/#Reporting_Issue \n");
-
- // 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 :
- printf("[Java 3D] Cubemap doesn't support FORMAT_INT_ARGB!\n");
- printf("please see issue 377 : https://java3d.dev.java.net/issues/show_bug.cgi?id=377\n");
- printf("For more information on reporting Java 3D related issue : https://java3d.dev.java.net/#Reporting_Issue \n");
-
- // 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] imageFormat %d, textureFormat %d not support !\n",
- imageFormat, textureFormat);
- }
-
- hr = surf->UnlockRect(textureCubeMapFace[face], level);
- if (FAILED(hr)) {
- printf("Fail to unlock surface: %s\n", DXGetErrorString9(hr));
- return;
- }
-}
-
-
-void drawTextureRect(D3dCtx *d3dCtx,
- LPDIRECT3DDEVICE9 device,
- LPDIRECT3DTEXTURE9 surf,
- D3DTLVERTEX screenCoord,
- int startx, int starty,
- int endx, int endy,
- int scaleWidth, int scaleHeight,
- boolean texModeRepeat)
-{
- LPDIRECT3DTEXTURE9 texture = NULL;
- DWORD transflag, minstate, magstate, texcoordstate;
- DWORD wrapU, wrapV;
- DWORD colorOp, colorArg, alphaOp, alphaArg;
- D3DMATRIX m;
-
- magstate = 1;
- minstate = 1;
-
- int h = endy - starty;
- int w = endx - startx;
-
- device->SetRenderState(D3DRS_SPECULARENABLE, FALSE);
-
- device->GetTexture(0, (LPDIRECT3DBASETEXTURE9 *) &texture);
-
- device->GetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS,
- &transflag);
- if (transflag != D3DTTFF_DISABLE) {
- device->GetTransform(D3DTS_TEXTURE0, &m);
- }
- //alessandro
- //device->GetTextureStageState(0, D3DTSS_MINFILTER, &minstate);
- //device->GetTextureStageState(0, D3DTSS_MAGFILTER, &magstate);
- device->GetTextureStageState(0, D3DTSS_TEXCOORDINDEX, &texcoordstate);
- device->SetTexture(0, surf);
- device->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS,
- D3DTTFF_DISABLE);
-
- if ((w == scaleWidth) && (h == scaleHeight)) {
- // alessandro
- // device->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_POINT);
- // device->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_POINT);
- } else {
- // device->SetTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
- // device->SetTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
- }
- device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, 0);
- device->SetRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
-
- device->GetTextureStageState(0, D3DTSS_COLOROP, &colorOp);
- device->GetTextureStageState(0, D3DTSS_COLORARG1, &colorArg);
- device->GetTextureStageState(0, D3DTSS_ALPHAOP, &alphaOp);
- device->GetTextureStageState(0, D3DTSS_ALPHAARG1, &alphaArg);
-
- device->SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
- device->SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
- device->SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);
- device->SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_TEXTURE);
- if (d3dCtx->fillMode != D3DFILL_SOLID) {
- device->SetRenderState(D3DRS_FILLMODE, D3DFILL_SOLID);
- }
-
- D3DSURFACE_DESC ddsd;
- surf->GetLevelDesc(0, &ddsd);
-
-
- float tumax;
- float tvmax;
- float tumin = startx/(float) ddsd.Width;
- float tvmin = starty/(float) ddsd.Height;
- boolean multipleDraw;
-
- if (texModeRepeat) {
- if ((w == ddsd.Width) && (h == ddsd.Height)) {
- // width & height match texture, so there is
- // no need to draw multiple time
- tumax = scaleWidth/(float) ddsd.Width;
- tvmax = scaleHeight/(float) ddsd.Height;
- device->GetSamplerState (0, D3DSAMP_ADDRESSU, &wrapU);
- device->GetSamplerState (0, D3DSAMP_ADDRESSV, &wrapV);
- device->SetSamplerState (0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
- device->SetSamplerState (0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
- multipleDraw = false;
- } else {
- tumax = endx/(float) ddsd.Width;
- tvmax = endy/(float) ddsd.Height;
- multipleDraw = true;
- }
- } else {
- tumax = endx/(float) ddsd.Width;
- tvmax = endy/(float) ddsd.Height;
- multipleDraw = false;
- }
-
-
- d3dCtx->rasterRect[0].tu = tumin;
- d3dCtx->rasterRect[0].tv = tvmax;
- d3dCtx->rasterRect[1].tu = tumin;
- d3dCtx->rasterRect[1].tv = tvmin;
- d3dCtx->rasterRect[2].tu = tumax;
- d3dCtx->rasterRect[2].tv = tvmax;
- d3dCtx->rasterRect[3].tu = tumax;
- d3dCtx->rasterRect[3].tv = tvmin;
-
- d3dCtx->rasterRect[0].sx = screenCoord.sx;
- d3dCtx->rasterRect[0].sz = screenCoord.sz;
- d3dCtx->rasterRect[0].rhw = screenCoord.rhw;
-
- d3dCtx->rasterRect[1].sx = screenCoord.sx;
- d3dCtx->rasterRect[1].sy = screenCoord.sy;
- d3dCtx->rasterRect[1].sz = screenCoord.sz;
- d3dCtx->rasterRect[1].rhw = screenCoord.rhw;
-
- d3dCtx->rasterRect[2].sz = screenCoord.sz;
- d3dCtx->rasterRect[2].rhw = screenCoord.rhw;
-
- d3dCtx->rasterRect[3].sy = screenCoord.sy;
- d3dCtx->rasterRect[3].sz = screenCoord.sz;
- d3dCtx->rasterRect[3].rhw = screenCoord.rhw;
-
- if ((h > 0) && (w > 0)) {
- //device->SetVertexShader(D3DFVF_XYZRHW|D3DFVF_TEX1);
- //device->SetVertexShader(vertexFormat);
- device->SetVertexShader(NULL);
- device->SetFVF(D3DFVF_XYZRHW|D3DFVF_TEX1);
-
- if (!multipleDraw) {
- d3dCtx->rasterRect[0].sy = screenCoord.sy + scaleHeight;
- d3dCtx->rasterRect[2].sx = screenCoord.sx + scaleWidth;
- d3dCtx->rasterRect[2].sy = screenCoord.sy + scaleHeight;
- d3dCtx->rasterRect[3].sx = screenCoord.sx + scaleWidth;
- device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,
- 2,
- d3dCtx->rasterRect,
- sizeof(D3DTLVERTEX));
- } else {
- d3dCtx->rasterRect[0].sy = screenCoord.sy + h;
- d3dCtx->rasterRect[2].sx = screenCoord.sx + w;
- d3dCtx->rasterRect[2].sy = screenCoord.sy + h;
- d3dCtx->rasterRect[3].sx = screenCoord.sx + w;
- for (int i=0; i < ceil(scaleHeight/((double) h)); i++) {
- for (int j=0; j < ceil(scaleWidth/((double) w)); j++) {
- device->DrawPrimitiveUP(D3DPT_TRIANGLESTRIP,
- 2,
- d3dCtx->rasterRect,
- sizeof(D3DTLVERTEX));
- d3dCtx->rasterRect[0].sx += w;
- d3dCtx->rasterRect[1].sx += w;
- d3dCtx->rasterRect[2].sx += w;
- d3dCtx->rasterRect[3].sx += w;
- }
- d3dCtx->rasterRect[0].sx = screenCoord.sx;
- d3dCtx->rasterRect[1].sx = screenCoord.sx;
- d3dCtx->rasterRect[2].sx = screenCoord.sx + w;
- d3dCtx->rasterRect[3].sx = screenCoord.sx + w;
- d3dCtx->rasterRect[0].sy += h;
- d3dCtx->rasterRect[1].sy += h;
- d3dCtx->rasterRect[2].sy += h;
- d3dCtx->rasterRect[3].sy += h;
- }
-
- }
- }
-
- // restore original texture stage values
- if (texture != NULL) {
- device->SetTexture(0, texture);
- texture->Release();
- } else {
- device->SetTexture(0, NULL);
- }
-
- device->SetTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS,
- transflag);
- if (transflag != D3DTTFF_DISABLE) {
- device->SetTransform(D3DTS_TEXTURE0, &m);
- }
- if (d3dCtx->fillMode != D3DFILL_SOLID) {
- device->SetRenderState(D3DRS_FILLMODE, d3dCtx->fillMode);
- }
- //device->SetTextureStageState(0, D3DTSS_MINFILTER, minstate);
- //device->SetTextureStageState(0, D3DTSS_MAGFILTER, magstate);
- device->SetTextureStageState(0, D3DTSS_TEXCOORDINDEX, texcoordstate);
-
- device->SetTextureStageState(0, D3DTSS_COLOROP, colorOp);
- device->SetTextureStageState(0, D3DTSS_COLORARG1, colorArg);
- device->SetTextureStageState(0, D3DTSS_ALPHAOP, alphaOp);
- device->SetTextureStageState(0, D3DTSS_ALPHAARG1, alphaArg);
-
- if (texModeRepeat && !multipleDraw) {
- device->SetSamplerState (0, D3DSAMP_ADDRESSU, wrapU);
- device->SetSamplerState (0, D3DSAMP_ADDRESSV, wrapV);
- }
- device->SetRenderState(D3DRS_CULLMODE, d3dCtx->cullMode);
- device->SetRenderState(D3DRS_SPECULARENABLE, TRUE);
-}
-
-DWORD ucountBits(DWORD mask)
-{
- DWORD count = 0;
- int i;
-
- for (i=sizeof(DWORD)*8-1; i >=0 ; i--) {
- if ((mask & 0x01) > 0) {
- count++;
- }
- mask >>= 1;
- }
- return count;
-}