예제 #1
0
        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);
        }
예제 #2
0
        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");
            }
        }