Browse Source

add 8bit alpha support

cxgeorge 24 years ago
parent
commit
1b298b9cac
1 changed files with 62 additions and 5 deletions
  1. 62 5
      panda/src/dxgsg/dxTextureContext.cxx

+ 62 - 5
panda/src/dxgsg/dxTextureContext.cxx

@@ -25,7 +25,8 @@ typedef enum {
     None,Conv32to32,Conv32to32_NoAlpha,Conv32to24,Conv32to16_0555,
     None,Conv32to32,Conv32to32_NoAlpha,Conv32to24,Conv32to16_0555,
     Conv32to16_1555,Conv32to16_0565,Conv32to16_4444,Conv24to32,Conv24to24,
     Conv32to16_1555,Conv32to16_0565,Conv32to16_4444,Conv24to32,Conv24to24,
     Conv24to16_0555,Conv24to16_0565,ConvLum16to16_1555,ConvLum16to16_4444,
     Conv24to16_0555,Conv24to16_0565,ConvLum16to16_1555,ConvLum16to16_4444,
-    ConvLum16to32,ConvLum16to16,ConvLum8to8,ConvLum8to24,ConvLum8to32,ConvLum8to16_0555,ConvLum8to16_0565
+    ConvLum16to32,ConvLum16to16,ConvLum8to8,ConvLum8to24,ConvLum8to32,ConvLum8to16_0555,ConvLum8to16_0565,
+    ConvAlpha8to16_4444,ConvAlpha8to32,ConvAlpha8to8
 } ConversionType;
 } ConversionType;
 
 
 #ifdef _DEBUG
 #ifdef _DEBUG
@@ -33,7 +34,7 @@ char *ConvNameStrs[] = {"None","Conv32to32","Conv32to32_NoAlpha","Conv32to24","C
     "Conv32to16_1555","Conv32to16_0565","Conv32to16_4444","Conv24to32","Conv24to24",
     "Conv32to16_1555","Conv32to16_0565","Conv32to16_4444","Conv24to32","Conv24to24",
     "Conv24to16_0555","Conv24to16_0565","ConvLum16to16_1555","ConvLum16to16_4444",
     "Conv24to16_0555","Conv24to16_0565","ConvLum16to16_1555","ConvLum16to16_4444",
     "ConvLum16to32","ConvLum16to16","ConvLum8to8","ConvLum8to24","ConvLum8to32",
     "ConvLum16to32","ConvLum16to16","ConvLum8to8","ConvLum8to24","ConvLum8to32",
-    "ConvLum8to16_0555","ConvLum8to16_0565"
+    "ConvLum8to16_0555","ConvLum8to16_0565","ConvAlpha8to16_4444","ConvAlpha8to32","ConvAlpha8to8"
 };
 };
 #endif
 #endif
 
 
@@ -611,6 +612,40 @@ HRESULT ConvertPixBuftoDDSurf(ConversionType ConvNeeded,BYTE *pbuf,LPDIRECTDRAWS
                 break;
                 break;
             }
             }
 
 
+        case ConvAlpha8to32: {
+
+              //  waste of space, but this is only place we can get 8bits alpha resolution
+                BYTE *pSrcWord = (BYTE *) pbuf;
+                DWORD *pDstWord;
+
+                for(DWORD y=0; y<dwOrigHeight; y++,pDDSurfBytes += ddsd.lPitch) {
+                    pDstWord = (DWORD *)pDDSurfBytes;
+
+                    for(DWORD x=0; x<dwOrigWidth; x++,pSrcWord++,pDstWord++) {
+                        // OR alpha with full white
+                        *pDstWord = (*pSrcWord << 24) | 0xFFFFFF;
+                    }
+                }
+                break;
+            }
+
+        case ConvAlpha8to16_4444: {
+                BYTE *pSrcWord = (BYTE *) pbuf;
+                WORD *pDstWord;
+
+                assert(ddsd.ddpfPixelFormat.dwRGBAlphaBitMask==0xf000);  // assumes ARGB order
+
+                for(DWORD y=0; y<dwOrigHeight; y++,pDDSurfBytes += ddsd.lPitch) {
+                    pDstWord = (WORD*)pDDSurfBytes;
+
+                    for(DWORD x=0; x<dwOrigWidth; x++,pSrcWord++,pDstWord++) {
+                        WORD a = (BYTE)(*pSrcWord>>4);
+                        *pDstWord = (a << 12) | 0x0FFF; // OR alpha with full white
+                    }
+                }
+                break;
+            }
+
         default:
         default:
             dxgsg_cat.error() << "CreateTexture failed! unhandled texture conversion type: "<< ConvNeeded <<" \n";
             dxgsg_cat.error() << "CreateTexture failed! unhandled texture conversion type: "<< ConvNeeded <<" \n";
             pDDSurf->Unlock(NULL);
             pDDSurf->Unlock(NULL);
@@ -1063,7 +1098,7 @@ CreateTexture(LPDIRECT3DDEVICE7 pd3dDevice, int cNumTexPixFmts, LPDDPIXELFORMAT
 
 
 #if 0
 #if 0
 //#ifdef _DEBUG
 //#ifdef _DEBUG
-// use dxcapsviewer
+// easier to use dxcapsviewer instead of this
     { static BOOL bPrinted=FALSE;
     { static BOOL bPrinted=FALSE;
         if(!bPrinted) {
         if(!bPrinted) {
             dxgsg_cat.debug() << "Gfx card supported TexFmts:\n";
             dxgsg_cat.debug() << "Gfx card supported TexFmts:\n";
@@ -1102,7 +1137,7 @@ CreateTexture(LPDIRECT3DDEVICE7 pd3dDevice, int cNumTexPixFmts, LPDDPIXELFORMAT
         }
         }
     }
     }
 
 
-    assert(((cNumColorChannels==4)||(cNumColorChannels==2))==(cNumAlphaBits>0));
+    assert((cNumColorChannels!=3)==(cNumAlphaBits>0));  // 3 channel w/alpha makes no sense
 
 
     // handle each bitdepth separately
     // handle each bitdepth separately
 
 
@@ -1359,7 +1394,7 @@ CreateTexture(LPDIRECT3DDEVICE7 pd3dDevice, int cNumTexPixFmts, LPDDPIXELFORMAT
                     }
                     }
                 }
                 }
 
 
-              // find compatible 16bpp fmt, just look for any 565, then 0555
+             // find compatible 16bpp fmt, just look for any 565, then 0555
                 DWORD dwMasks[2] = {0xF800, 0x7C00};
                 DWORD dwMasks[2] = {0xF800, 0x7C00};
 
 
                 for(DWORD modenum=0;modenum<2;modenum++)
                 for(DWORD modenum=0;modenum<2;modenum++)
@@ -1371,6 +1406,28 @@ CreateTexture(LPDIRECT3DDEVICE7 pd3dDevice, int cNumTexPixFmts, LPDDPIXELFORMAT
                             goto found_matching_format;
                             goto found_matching_format;
                         }
                         }
                     }
                     }
+            } else if(ddsd.ddpfPixelFormat.dwFlags & DDPF_ALPHA) {
+                // look for 32-bit ARGB, else 16-4444.
+                // skip 8bit alpha only, because I think only voodoo supports it
+                // and the voodoo support isn't the kind of blending model we need 
+                // w/color assumed to be white (but need to verify this)
+                for(i=0,pCurPixFmt=&pTexPixFmts[cNumTexPixFmts-1];i<cNumTexPixFmts;i++,pCurPixFmt--) {
+                        if((pCurPixFmt->dwRGBBitCount==32) && (pCurPixFmt->dwFlags & DDPF_RGB) &&
+                           (pCurPixFmt->dwFlags & DDPF_ALPHAPIXELS)) {
+                            ConvNeeded=ConvAlpha8to32;
+                            goto found_matching_format;
+                        }
+                }
+
+                for(i=0,pCurPixFmt=&pTexPixFmts[cNumTexPixFmts-1];i<cNumTexPixFmts;i++,pCurPixFmt--) {
+                        if((pCurPixFmt->dwRGBBitCount==16) 
+                           && (pCurPixFmt->dwFlags & DDPF_RGB)
+                           && (pCurPixFmt->dwFlags & DDPF_ALPHAPIXELS)
+                           && (pCurPixFmt->dwRGBAlphaBitMask==0xF000)) {
+                            ConvNeeded=ConvAlpha8to16_4444;
+                            goto found_matching_format;
+                        }
+                }
             }
             }
             break;
             break;