internal Surface(DirectDrawSurface7 _handle) { this.surface = _handle; // compute the size of this surface DDSURFACEDESC2 desc = new DDSURFACEDESC2(); surface.GetSurfaceDesc(ref desc); this.size = new Size(desc.lWidth, desc.lHeight); resetClipRect(); // compute the bit shift width for color fill DDPIXELFORMAT pixelFormat = new DDPIXELFORMAT(); surface.GetPixelFormat(ref pixelFormat); widthR = countBitWidth(pixelFormat.lRBitMask); widthG = countBitWidth(pixelFormat.lGBitMask); widthB = countBitWidth(pixelFormat.lBBitMask); }
private void CalculateImageSettings( ref DDSURFACEDESC2 ddsd, out int compressionFactor, out int glPixelFormat, out int elementsPerPixel, out PixelFormatConverter converter) { converter = DoNothingConverter; DDPIXELFORMAT pixelFormat = ddsd.ddpfPixelFormat; if ((pixelFormat.dwFlags & DDPIXELFORMAT.DDPF_RGB) != 0) { // Uncompressed DXT switch (pixelFormat.dwRGBBitCount) { case 32: elementsPerPixel = 4; if (pixelFormat.HasAlphaRedGreenBlueMasks( 0xFF000000, 0x00FF0000, 0x0000FF00, 0x000000FF)) { glPixelFormat = Gl.GL_BGRA; //OpenGl's format tag is the reverse order } else if (pixelFormat.HasAlphaRedGreenBlueMasks( 0xFF000000, 0x000000FF, 0x0000FF00, 0x00FF0000)) { glPixelFormat = Gl.GL_RGBA; } else if (pixelFormat.HasRedGreenBlueMasks( 0x00FF0000, 0x0000FF00, 0x000000FF)) { glPixelFormat = Gl.GL_BGR; converter = Create32BitTo24BitConverter(0, 1, 2); elementsPerPixel = 3; } else if (pixelFormat.HasRedGreenBlueMasks( 0x000000FF, 0x0000FF00, 0x00FF0000)) { glPixelFormat = Gl.GL_RGB; converter = Create32BitTo24BitConverter(0, 1, 2); elementsPerPixel = 3; } else { glPixelFormat = Gl.GL_RGBA; } break; case 24: elementsPerPixel = 3; if (pixelFormat.HasRedGreenBlueMasks( 0x00FF0000, 0x0000FF00, 0x000000FF)) { glPixelFormat = Gl.GL_BGR; } else { glPixelFormat = Gl.GL_RGB; } break; default: throw new NotSupportedException("unhandled pixel format in dds file"); } compressionFactor = 0; return; } // compressed? switch (pixelFormat.dwFourCC) { case DDPIXELFORMAT.FOURCC_DXT1: // DXT1's compression ratio is 8:1 compressionFactor = 2; glPixelFormat = Gl.GL_COMPRESSED_RGBA_S3TC_DXT1_EXT; elementsPerPixel = 3; break; case DDPIXELFORMAT.FOURCC_DXT3: // DXT3's compression ratio is 4:1 compressionFactor = 4; glPixelFormat = Gl.GL_COMPRESSED_RGBA_S3TC_DXT3_EXT; elementsPerPixel = 4; break; case DDPIXELFORMAT.FOURCC_DXT5: // DXT5's compression ratio is 4:1 compressionFactor = 4; glPixelFormat = Gl.GL_COMPRESSED_RGBA_S3TC_DXT5_EXT; elementsPerPixel = 4; break; default: throw new NotSupportedException("Unsupported DXT format"); } }