| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228 |
- /*
- ** Command & Conquer Renegade(tm)
- ** Copyright 2025 Electronic Arts Inc.
- **
- ** This program is free software: you can redistribute it and/or modify
- ** it under the terms of the GNU General Public License as published by
- ** the Free Software Foundation, either version 3 of the License, or
- ** (at your option) any later version.
- **
- ** This program 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 for more details.
- **
- ** You should have received a copy of the GNU General Public License
- ** along with this program. If not, see <http://www.gnu.org/licenses/>.
- */
- #ifndef DDSFILE_H
- #define DDSFILE_H
- #if defined(_MSC_VER)
- #pragma once
- #endif
- #include "always.h"
- #include "ww3dformat.h"
- #include "wwstring.h"
- struct IDirect3DSurface8;
- // ----------------------------------------------------------------------------
- //
- // This structure represents the old DX7 color key structure. It is needed
- // LegacyDDSURFACEDESC which is needed when loading DDS files. DO NOT MODIFY!
- //
- // ----------------------------------------------------------------------------
- struct LegacyDDCOLORKEY
- {
- unsigned ColorSpaceLowValue;
- unsigned ColorSpaceHighValue;
- };
- // ----------------------------------------------------------------------------
- //
- // This structure represents the old DX7 CAPS2 structure. It is needed
- // LegacyDDSURFACEDESC which is needed when loading DDS files. DO NOT MODIFY!
- //
- // ----------------------------------------------------------------------------
- struct LegacyDDSCAPS2
- {
- unsigned Caps;
- unsigned Caps2;
- unsigned Caps3;
- unsigned Caps4;
- };
- // ----------------------------------------------------------------------------
- //
- // This structure represents the old DX7 pixel format structure. It is needed
- // LegacyDDSURFACEDESC which is needed when loading DDS files. DO NOT MODIFY!
- //
- // ----------------------------------------------------------------------------
- struct LegacyDDPIXELFORMAT
- {
- unsigned Size;
- unsigned Flags;
- unsigned FourCC;
- union
- {
- unsigned RGBBitCount;
- unsigned YUVBitCount;
- unsigned ZBufferBitDepth;
- unsigned AlphaBitDepth;
- unsigned LuminanceBitCount;
- unsigned BumpBitCount;
- };
- union
- {
- unsigned RBitMask;
- unsigned YBitMask;
- unsigned StencilBitDepth;
- unsigned LuminanceBitMask;
- unsigned BumpDuBitMask;
- };
- union
- {
- unsigned GBitMask;
- unsigned UBitMask;
- unsigned ZBitMask;
- unsigned BumpDvBitMask;
- };
- union
- {
- unsigned BBitMask;
- unsigned VBitMask;
- unsigned StencilBitMask;
- unsigned BumpLuminanceBitMask;
- };
- union
- {
- unsigned RGBAlphaBitMask;
- unsigned YUVAlphaBitMask;
- unsigned LuminanceAlphaBitMask;
- unsigned RGBZBitMask;
- unsigned YUVZBitMask;
- };
- };
- // ----------------------------------------------------------------------------
- //
- // This structure represents the old DX7 surface description structure.
- // It is needed when loading DDS files. DO NOT MODIFY!
- //
- // ----------------------------------------------------------------------------
- struct LegacyDDSURFACEDESC2 {
- unsigned Size;
- unsigned Flags;
- unsigned Height;
- unsigned Width;
- union
- {
- unsigned Pitch;
- unsigned LinearSize;
- };
- unsigned BackBufferCount;
- union
- {
- unsigned MipMapCount;
- unsigned RefreshRate;
- };
- unsigned AlphaBitDepth;
- unsigned Reserved;
- void* Surface;
- union
- {
- LegacyDDCOLORKEY CKDestOverlay;
- unsigned EmptyFaceColor;
- };
- LegacyDDCOLORKEY CKDestBlt;
- LegacyDDCOLORKEY CKSrcOverlay;
- LegacyDDCOLORKEY CKSrcBlt;
- LegacyDDPIXELFORMAT PixelFormat;
- LegacyDDSCAPS2 Caps;
- unsigned TextureStage;
- };
- // ----------------------------------------------------------------------------
- //
- // Utility class for loading DDS files. Simply create an instance of the class
- // locally, call Load() and use the copy functions to retrieve the surface.
- // The class handles conversion of the surface to equal compressed formats
- // and all non-compressed formats. the compressed DXTn formats can't be cross-
- // converted except for DXT1 which can be converted to DXT2 (this feature is
- // needed as the NVidia cards have problems with DXT1).
- //
- // ----------------------------------------------------------------------------
- class DDSFileClass
- {
- unsigned Width;
- unsigned Height;
- unsigned FullWidth;
- unsigned FullHeight;
- unsigned MipLevels;
- unsigned long DateTime;
- unsigned ReductionFactor;
- unsigned char* DDSMemory;
- WW3DFormat Format;
- unsigned* LevelSizes;
- unsigned* LevelOffsets;
- LegacyDDSURFACEDESC2 SurfaceDesc;
- char Name[256];
- static unsigned Calculate_DXTC_Surface_Size(unsigned width, unsigned height, WW3DFormat format);
- public:
- // You can pass the name in .tga or .dds format, the class will automatically try and load .dds file.
- // Note that creating the object will only give you image info - call Load() to load the surfaces.
- DDSFileClass(const char* name,unsigned reduction_factor);
- ~DDSFileClass();
- unsigned Get_Width(unsigned level) const;
- unsigned Get_Height(unsigned level) const;
- unsigned Get_Full_Width() const { return FullWidth; } // Get the width of level 0 of non-reduced texture
- unsigned Get_Full_Height() const { return FullHeight; } // Get the height of level 0 of non-reduced texture
- unsigned long Get_Date_Time() const { return DateTime; }
- unsigned Get_Mip_Level_Count() const { return MipLevels; }
- const unsigned char* Get_Memory_Pointer(unsigned level) const;
- unsigned Get_Level_Size(unsigned level) const;
- WW3DFormat Get_Format() const { return Format; }
- // Copy pixels to the destination surface.
- void Copy_Level_To_Surface(unsigned level,IDirect3DSurface8* d3d_surface);
- void Copy_Level_To_Surface(
- unsigned level,
- WW3DFormat dest_format,
- unsigned dest_width,
- unsigned dest_height,
- unsigned char* dest_surface,
- unsigned dest_pitch);
- // Get pixel in A8R8G8B8 format. This isn't the fastest possible way of reading data from DDS.
- unsigned Get_Pixel(unsigned level,unsigned x,unsigned y) const;
- // Uncompress one 4x4 block from the compressed image.
- // Returns: true if block contained alpha, false is not
- // Note: Destination can't be DXT or paletted surface!
- bool Get_4x4_Block(
- unsigned char* dest_ptr, // Destination surface pointer
- unsigned dest_pitch, // Destination surface pitch, in bytes
- WW3DFormat dest_format, // Destination surface format, A8R8G8B8 is fastest
- unsigned level, // DDS mipmap level to copy from
- unsigned source_x, // DDS x offset to copy from, must be aligned by 4!
- unsigned source_y) const; // DDS y offset to copy from, must be aligned by 4!
- bool Load();
- bool Is_Available() const { return !!LevelSizes; }
- };
- // ----------------------------------------------------------------------------
- #endif
|