فهرست منبع

Image format code tweaks.

Areloch 7 سال پیش
والد
کامیت
0c3fc59ccc

+ 48 - 0
Engine/source/gfx/bitmap/bitmapUtils.cpp

@@ -174,9 +174,57 @@ void bitmapExtrudeRGBA_c(const void *srcMip, void *mip, U32 srcHeight, U32 srcWi
    }
    }
 }
 }
 
 
+void bitmapExtrudeFPRGBA_c(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth)
+{
+   const U16 *src = (const U16 *)srcMip;
+   U16 *dst = (U16 *)mip;
+   U32 stride = srcHeight != 1 ? (srcWidth) * 8 : 0;
+
+   U32 width = srcWidth >> 1;
+   U32 height = srcHeight >> 1;
+   if (width == 0) width = 1;
+   if (height == 0) height = 1;
+
+   if (srcWidth != 1)
+   {
+      for (U32 y = 0; y < height; y++)
+      {
+         for (U32 x = 0; x < width; x++)
+         {
+            *dst++ = (U32(*src) + U32(src[4]) + U32(src[stride]) + U32(src[stride + 4]) + 2) >> 2;
+            src++;
+            *dst++ = (U32(*src) + U32(src[4]) + U32(src[stride]) + U32(src[stride + 4]) + 2) >> 2;
+            src++;
+            *dst++ = (U32(*src) + U32(src[4]) + U32(src[stride]) + U32(src[stride + 4]) + 2) >> 2;
+            src++;
+            *dst++ = (U32(*src) + U32(src[4]) + U32(src[stride]) + U32(src[stride + 4]) + 2) >> 2;
+            src += 5;
+         }
+         src += stride;   // skip
+      }
+   }
+   else
+   {
+      for (U32 y = 0; y < height; y++)
+      {
+         *dst++ = (U32(*src) + U32(src[stride]) + 1) >> 1;
+         src++;
+         *dst++ = (U32(*src) + U32(src[stride]) + 1) >> 1;
+         src++;
+         *dst++ = (U32(*src) + U32(src[stride]) + 1) >> 1;
+         src++;
+         *dst++ = (U32(*src) + U32(src[stride]) + 1) >> 1;
+         src += 5;
+
+         src += stride;   // skip
+      }
+   }
+}
+
 void (*bitmapExtrude5551)(const void *srcMip, void *mip, U32 height, U32 width) = bitmapExtrude5551_c;
 void (*bitmapExtrude5551)(const void *srcMip, void *mip, U32 height, U32 width) = bitmapExtrude5551_c;
 void (*bitmapExtrudeRGB)(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth) = bitmapExtrudeRGB_c;
 void (*bitmapExtrudeRGB)(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth) = bitmapExtrudeRGB_c;
 void (*bitmapExtrudeRGBA)(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth) = bitmapExtrudeRGBA_c;
 void (*bitmapExtrudeRGBA)(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth) = bitmapExtrudeRGBA_c;
+void (*bitmapExtrudeFPRGBA)(const void *srcMip, void *mip, U32 srcHeight, U32 srcWidth) = bitmapExtrudeFPRGBA_c;
 
 
 
 
 //--------------------------------------------------------------------------
 //--------------------------------------------------------------------------

+ 1 - 0
Engine/source/gfx/bitmap/bitmapUtils.h

@@ -30,6 +30,7 @@
 extern void (*bitmapExtrude5551)(const void *srcMip, void *mip, U32 height, U32 width);
 extern void (*bitmapExtrude5551)(const void *srcMip, void *mip, U32 height, U32 width);
 extern void (*bitmapExtrudeRGB)(const void *srcMip, void *mip, U32 height, U32 width);
 extern void (*bitmapExtrudeRGB)(const void *srcMip, void *mip, U32 height, U32 width);
 extern void (*bitmapExtrudeRGBA)(const void *srcMip, void *mip, U32 height, U32 width);
 extern void (*bitmapExtrudeRGBA)(const void *srcMip, void *mip, U32 height, U32 width);
+extern void(*bitmapExtrudeFPRGBA)(const void *srcMip, void *mip, U32 height, U32 width);
 extern void (*bitmapConvertRGB_to_5551)(U8 *src, U32 pixels);
 extern void (*bitmapConvertRGB_to_5551)(U8 *src, U32 pixels);
 extern void (*bitmapConvertRGB_to_1555)(U8 *src, U32 pixels);
 extern void (*bitmapConvertRGB_to_1555)(U8 *src, U32 pixels);
 extern void (*bitmapConvertRGB_to_RGBX)( U8 **src, U32 pixels );
 extern void (*bitmapConvertRGB_to_RGBX)( U8 **src, U32 pixels );

+ 28 - 1
Engine/source/gfx/bitmap/ddsFile.cpp

@@ -294,7 +294,34 @@ bool DDSFile::readHeader(Stream &s)
          mFlags.set(CompressedData);
          mFlags.set(CompressedData);
       else
       else
       {
       {
-         mBytesPerPixel = header.ddspf.bpp / 8;
+         switch (header.ddspf.fourCC)
+         {
+         case 36: // D3DFMT_A16B16G16R16
+            mBytesPerPixel = 8;
+            break;
+         case 110: // D3DFMT_Q16W16V16U16
+            mBytesPerPixel = 8;
+            break;
+         case 111: // D3DFMT_R16F
+            mBytesPerPixel = 2;
+            break;
+         case 112: // D3DFMT_G16R16F
+            mBytesPerPixel = 4;
+            break;
+         case 113: // D3DFMT_A16B16G16R16F
+            mBytesPerPixel = 8;
+            break;
+         case 114: // D3DFMT_R32F
+            mBytesPerPixel = 4;
+            break;
+         case 115: // D3DFMT_G32R32F
+            mBytesPerPixel = 8;
+            break;
+         case 116: // D3DFMT_A32B32G32R32F
+            mBytesPerPixel = 16;
+            break;
+         }
+
          mFlags.set(RGBData);
          mFlags.set(RGBData);
       }
       }
    }
    }

+ 6 - 3
Engine/source/gfx/bitmap/gBitmap.cpp

@@ -301,9 +301,12 @@ void GBitmap::allocateBitmap(const U32 in_width, const U32 in_height, const bool
      case GFXFormatR5G6B5:
      case GFXFormatR5G6B5:
      case GFXFormatR5G5B5A1:     mBytesPerPixel = 2;
      case GFXFormatR5G5B5A1:     mBytesPerPixel = 2;
       break;
       break;
-     default:
-      AssertFatal(false, "GBitmap::GBitmap: misunderstood format specifier");
-      break;
+     case GFXFormatR16G16B16A16F:
+      case GFXFormatR16G16B16A16: mBytesPerPixel = 8;
+         break;
+      default:
+         AssertFatal(false, "GBitmap::GBitmap: misunderstood format specifier");
+         break;
    }
    }
 
 
    // Set up the mip levels, if necessary...
    // Set up the mip levels, if necessary...