| 107 | } |
| 108 | |
| 109 | bool DDSLoader::Load(const char *pFilename, float cutOff, IMG_INFO *pInfo) |
| 110 | { |
| 111 | typedef enum RESOURCE_DIMENSION |
| 112 | { |
| 113 | RESOURCE_DIMENSION_UNKNOWN = 0, |
| 114 | RESOURCE_DIMENSION_BUFFER = 1, |
| 115 | RESOURCE_DIMENSION_TEXTURE1D = 2, |
| 116 | RESOURCE_DIMENSION_TEXTURE2D = 3, |
| 117 | RESOURCE_DIMENSION_TEXTURE3D = 4 |
| 118 | } RESOURCE_DIMENSION; |
| 119 | |
| 120 | typedef struct |
| 121 | { |
| 122 | DXGI_FORMAT dxgiFormat; |
| 123 | RESOURCE_DIMENSION resourceDimension; |
| 124 | UINT32 miscFlag; |
| 125 | UINT32 arraySize; |
| 126 | UINT32 reserved; |
| 127 | } DDS_HEADER_DXT10; |
| 128 | |
| 129 | if (GetFileAttributesA(pFilename) == 0xFFFFFFFF) |
| 130 | return false; |
| 131 | |
| 132 | m_handle = CreateFileA(pFilename, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL); |
| 133 | if (m_handle == INVALID_HANDLE_VALUE) |
| 134 | { |
| 135 | return false; |
| 136 | } |
| 137 | |
| 138 | LARGE_INTEGER largeFileSize; |
| 139 | GetFileSizeEx(m_handle, &largeFileSize); |
| 140 | assert(0 == largeFileSize.HighPart); |
| 141 | UINT32 fileSize = largeFileSize.LowPart; |
| 142 | UINT32 rawTextureSize = fileSize; |
| 143 | |
| 144 | // read the header |
| 145 | char headerData[4 + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10)]; |
| 146 | DWORD dwBytesRead = 0; |
| 147 | if (ReadFile(m_handle, headerData, 4 + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10), &dwBytesRead, NULL)) |
| 148 | { |
| 149 | char *pByteData = headerData; |
| 150 | UINT32 dwMagic = *reinterpret_cast<UINT32 *>(pByteData); |
| 151 | if (dwMagic != ' SDD') // "DDS " |
| 152 | { |
| 153 | return false; |
| 154 | } |
| 155 | |
| 156 | pByteData += 4; |
| 157 | rawTextureSize -= 4; |
| 158 | |
| 159 | DDS_HEADER *header = reinterpret_cast<DDS_HEADER *>(pByteData); |
| 160 | pByteData += sizeof(DDS_HEADER); |
| 161 | rawTextureSize -= sizeof(DDS_HEADER); |
| 162 | |
| 163 | pInfo->width = header->dwWidth; |
| 164 | pInfo->height = header->dwHeight; |
| 165 | pInfo->depth = header->dwDepth ? header->dwDepth : 1; |
| 166 | pInfo->mipMapCount = header->dwMipMapCount ? header->dwMipMapCount : 1; |
no test coverage detected