diff --git a/.clang-format-ignore b/.clang-format-ignore new file mode 100644 index 00000000..7b94908b --- /dev/null +++ b/.clang-format-ignore @@ -0,0 +1,2 @@ +*/DDS.h +*/d3dx12.h diff --git a/.github/linters/.clang-format b/.github/linters/.clang-format new file mode 100644 index 00000000..842e0331 --- /dev/null +++ b/.github/linters/.clang-format @@ -0,0 +1,87 @@ +Language: Cpp +BasedOnStyle: LLVM +AccessModifierOffset: -4 +AlignAfterOpenBracket: false +AlignConsecutiveAssignments: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false +AlignConsecutiveDeclarations: + Enabled: true + AcrossEmptyLines: false + AcrossComments: false +AlignEscapedNewlines: Left +AlignOperands: true +AlignConsecutiveShortCaseStatements: + Enabled: true + AcrossEmptyLines: true + AcrossComments: true + AlignCaseColons: false +AlignTrailingComments: + Kind: Always + OverEmptyLines: 2 +AllowAllArgumentsOnNextLine: false +AllowAllParametersOfDeclarationOnNextLine: false +AllowShortBlocksOnASingleLine: Empty +AllowShortCaseLabelsOnASingleLine: true +AllowShortFunctionsOnASingleLine: Inline +AllowShortIfStatementsOnASingleLine: Never +AllowShortLambdasOnASingleLine: Empty +AllowShortLoopsOnASingleLine: false +AlwaysBreakAfterReturnType: None +AlwaysBreakBeforeMultilineStrings: true +BinPackArguments: false +BinPackParameters: false +BreakBeforeBraces: Custom +BraceWrapping: + AfterClass: true + AfterControlStatement: true + AfterEnum: true + AfterFunction: true + AfterNamespace: true + AfterStruct: true + AfterUnion: true + BeforeCatch: true + BeforeElse: true + BeforeLambdaBody: true + SplitEmptyFunction: false + SplitEmptyRecord: false +#requires clang-format 22 +#BreakAfterOpenBracketFunction: true +#BreakBeforeCloseBracketFunction: true +BreakBeforeBinaryOperators: All +BreakBeforeTernaryOperators: false +BreakConstructorInitializers: BeforeColon +BreakInheritanceList: BeforeColon +BreakTemplateDeclarations: Yes +ColumnLimit: 140 +ConstructorInitializerAllOnOneLineOrOnePerLine: true +Cpp11BracedListStyle: false +FixNamespaceComments: true +IndentCaseLabels: false +IndentExternBlock: Indent +IndentPPDirectives: None +IndentWidth: 4 +InsertNewlineAtEOF: true +LineEnding: CRLF +NamespaceIndentation: All +PackConstructorInitializers: Never +PointerAlignment: Left +ReflowComments: true +SortIncludes: false +SpaceAfterCStyleCast: false +#requires clang format 21 +#SpaceAfterOperatorKeyword: true +SpaceAfterTemplateKeyword: false +SpaceBeforeAssignmentOperators: true +SpaceBeforeCaseColon: false +SpaceBeforeCtorInitializerColon: true +SpaceBeforeParens: ControlStatements +SpaceInEmptyParentheses: false +SpacesInAngles: false +SpacesInCStyleCastParentheses: false +SpacesInContainerLiterals: false +SpacesInParentheses: false +Standard: c++17 +TabWidth: 4 +UseTab: Never diff --git a/.github/linters/.editorconfig-checker.json b/.github/linters/.editorconfig-checker.json index 990f826d..ad671738 100644 --- a/.github/linters/.editorconfig-checker.json +++ b/.github/linters/.editorconfig-checker.json @@ -5,5 +5,8 @@ "LICENSE", "Tests", "Common/d3dx12.h" - ] + ], + "Disable": { + "IndentSize": true + } } diff --git a/.github/workflows/clangcl.yml b/.github/workflows/clangcl.yml index 93f1c72c..f2d123a2 100644 --- a/.github/workflows/clangcl.yml +++ b/.github/workflows/clangcl.yml @@ -53,20 +53,17 @@ jobs: build_type: [x64-Debug-Clang, x64-Release-Clang] arch: [amd64] include: - - build_type: x86-Debug-Clang - arch: amd64_x86 - - build_type: x86-Release-Clang - arch: amd64_x86 + # We skip x86-Debug-Clang and x86-Release-Clang for VS 2022 currently due to an ICE in the openjph library via vcpkg which uses MSVC. - build_type: arm64-Debug-Clang arch: amd64_arm64 - build_type: arm64-Release-Clang arch: amd64_arm64 steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Clone test repository - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: repository: walbourn/directxtextest path: Tests @@ -179,7 +176,7 @@ jobs: arch: amd64_arm64 steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: 'Install Ninja' run: choco install ninja diff --git a/.github/workflows/lint.yml b/.github/workflows/lint.yml index 7ac9fea8..54928557 100644 --- a/.github/workflows/lint.yml +++ b/.github/workflows/lint.yml @@ -25,18 +25,19 @@ jobs: steps: - name: Checkout repository - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: fetch-depth: 0 - name: Lint Code Base - uses: super-linter/super-linter@4ce20838b8ab83717e78138c5b3a1407148e0918 # v8.7.0 + uses: super-linter/super-linter@4ce20838b8ab83717e78138c5b3a1407148e0918 # v8.7.0 env: DEFAULT_BRANCH: origin/main GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} IGNORE_GITIGNORED_FILES: true VALIDATE_ALL_CODEBASE: true VALIDATE_CHECKOV: true + VALIDATE_CLANG_FORMAT: true VALIDATE_EDITORCONFIG: true VALIDATE_GITHUB_ACTIONS: true VALIDATE_JSON: true diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml index f80c8cb0..32593043 100644 --- a/.github/workflows/test.yml +++ b/.github/workflows/test.yml @@ -55,18 +55,7 @@ jobs: build_type: [x64-Debug, x64-Release] arch: [amd64] include: - - toolver: '14.29' - build_type: x86-Debug - arch: amd64_x86 - - toolver: '14.29' - build_type: x86-Release - arch: amd64_x86 - - toolver: '14' - build_type: x86-Debug - arch: amd64_x86 - - toolver: '14' - build_type: x86-Release - arch: amd64_x86 + # We skip x86-Debug and x86-Release for VS 2022 currently due to an ICE in the openjph library via vcpkg. - toolver: '14' build_type: arm64-Debug arch: amd64_arm64 @@ -81,10 +70,10 @@ jobs: arch: amd64_arm64 steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Clone test repository - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: repository: walbourn/directxtextest path: Tests @@ -203,10 +192,10 @@ jobs: arch: amd64_arm64 steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: Clone test repository - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 with: repository: walbourn/directxtextest path: Tests diff --git a/.github/workflows/vcpkg.yml b/.github/workflows/vcpkg.yml index 38a83e68..f8e2cb82 100644 --- a/.github/workflows/vcpkg.yml +++ b/.github/workflows/vcpkg.yml @@ -50,14 +50,11 @@ jobs: arch: [amd64] shared: ['OFF'] include: + # We skip x86-Debug-VCPKG for VS 2022 currently due to an ICE in the openjph library via vcpkg. - toolver: '14' build_type: x64-Debug-Clang-VCPKG arch: amd64 shared: 'OFF' - - toolver: '14' - build_type: x86-Debug-VCPKG - arch: amd64_x86 - shared: 'OFF' - toolver: '14' build_type: arm64-Debug-VCPKG arch: amd64_arm64 @@ -68,7 +65,7 @@ jobs: shared: 'OFF' steps: - - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 - name: 'Install Ninja' run: choco install ninja @@ -141,3 +138,101 @@ jobs: - name: 'Build' working-directory: ${{ github.workspace }} run: cmake --build out\build\${{ matrix.build_type }} + + build2026: + runs-on: windows-2025-vs2026 + + strategy: + fail-fast: false + + matrix: + build_type: [x64-Debug-VCPKG] + arch: [amd64] + shared: ['OFF'] + include: + - build_type: x64-Debug-Clang-VCPKG + arch: amd64 + shared: 'OFF' + - build_type: x86-Debug-VCPKG + arch: amd64_x86 + shared: 'OFF' + - build_type: arm64-Debug-VCPKG + arch: amd64_arm64 + shared: 'OFF' + - build_type: arm64ec-Debug-VCPKG + arch: amd64_arm64 + shared: 'OFF' + + steps: + - uses: actions/checkout@3d3c42e5aac5ba805825da76410c181273ba90b1 # v7.0.1 + + - name: 'Install Ninja' + run: choco install ninja + + - uses: ilammy/msvc-dev-cmd@0b201ec74fa43914dc39ae48a89fd1d8cb592756 # v1.13.0 + with: + arch: ${{ matrix.arch }} + + - name: 'Set triplet' + shell: pwsh + run: | + if ("${{ matrix.arch }}" -eq "amd64") + { + echo "VCPKG_DEFAULT_TRIPLET=x64-windows" >> $env:GITHUB_ENV + } + elseif ("${{ matrix.arch }}" -eq "amd64_x86") + { + echo "VCPKG_DEFAULT_TRIPLET=x86-windows" >> $env:GITHUB_ENV + } + elseif ("${{ matrix.arch }}" -eq "amd64_arm64") + { + if ("${{ matrix.build_type }}" -match "^arm64ec") + { + echo "VCPKG_DEFAULT_TRIPLET=arm64ec-windows" >> $env:GITHUB_ENV + } + else + { + echo "VCPKG_DEFAULT_TRIPLET=arm64-windows" >> $env:GITHUB_ENV + } + } + else + { + echo "::error Unknown architecture/build-type triplet mapping" + } + + - name: Get vcpkg commit hash + shell: pwsh + run: | + if ($Env:vcpkgRelease) { + echo "Using vcpkg commit from repo variable..." + $VCPKG_COMMIT_ID = $Env:vcpkgRelease + } + else { + echo "Fetching latest vcpkg commit hash..." + $commit = (git ls-remote https://github.com/microsoft/vcpkg.git HEAD | Select-String -Pattern '([a-f0-9]{40})').Matches.Value + $VCPKG_COMMIT_ID = $commit + } + Write-Host "VCPKG_COMMIT_ID=$VCPKG_COMMIT_ID" + echo "VCPKG_COMMIT_ID=$VCPKG_COMMIT_ID" >> $env:GITHUB_ENV + env: + vcpkgRelease: '${{ vars.VCPKG_COMMIT_ID }}' + + - uses: lukka/run-vcpkg@5ad8bfa6267ef808f7d48cf4004c879bed752401 # v11 + with: + runVcpkgInstall: true + vcpkgJsonGlob: '**/build/vcpkg.json' + vcpkgGitCommitId: '${{ env.VCPKG_COMMIT_ID }}' + + - name: 'Configure CMake' + working-directory: ${{ github.workspace }} + run: > + cmake --preset=${{ matrix.build_type }} -DBUILD_TESTING=OFF + -DENABLE_OPENEXR_SUPPORT=ON -DENABLE_LIBJPEG_SUPPORT=ON -DENABLE_LIBPNG_SUPPORT=ON + -DBUILD_SHARED_LIBS=${{ matrix.shared }} + -DCMAKE_TOOLCHAIN_FILE="${{ github.workspace }}/vcpkg/scripts/buildsystems/vcpkg.cmake" + -DVCPKG_MANIFEST_DIR="${{ github.workspace }}/build" + -DVCPKG_TARGET_TRIPLET="${env:VCPKG_DEFAULT_TRIPLET}" + + - name: 'Build' + working-directory: ${{ github.workspace }} + run: cmake --build out\build\${{ matrix.build_type }} diff --git a/Auxiliary/DirectXTexEXR.cpp b/Auxiliary/DirectXTexEXR.cpp index 355a4287..2ab883e1 100644 --- a/Auxiliary/DirectXTexEXR.cpp +++ b/Auxiliary/DirectXTexEXR.cpp @@ -50,7 +50,7 @@ #include #pragma warning(pop) -#define COMBINED_OPENEXR_VERSION ((10000*OPENEXR_VERSION_MAJOR) + (100*OPENEXR_VERSION_MINOR) + OPENEXR_VERSION_PATCH) +#define COMBINED_OPENEXR_VERSION ((10000 * OPENEXR_VERSION_MAJOR) + (100 * OPENEXR_VERSION_MINOR) + OPENEXR_VERSION_PATCH) #ifdef __clang__ #pragma clang diagnostic pop @@ -67,10 +67,10 @@ namespace { public: InputStream(const uint8_t* data, size_t size) - : IStream("InputStream") - , m_DataPtr(data) - , m_DataSize(size) - , m_Position(0) + : IStream("InputStream"), + m_DataPtr(data), + m_DataSize(size), + m_Position(0) {} bool read(char c[], int n) override @@ -86,10 +86,7 @@ namespace return m_Position < m_DataSize; } - uint64_t tellg() override - { - return m_Position; - } + uint64_t tellg() override { return m_Position; } void seekg(uint64_t pos) override { @@ -101,24 +98,23 @@ namespace m_Position = static_cast(pos); } - #if COMBINED_OPENEXR_VERSION > 30300 - int64_t read(void *buf, uint64_t sz, uint64_t offset) override - { - return Imf::IStream::read(buf, sz, offset); - } - #endif +#if COMBINED_OPENEXR_VERSION > 30300 + int64_t read(void* buf, uint64_t sz, uint64_t offset) override { return Imf::IStream::read(buf, sz, offset); } +#endif private: const uint8_t* m_DataPtr; - size_t m_DataSize; - size_t m_Position; + size_t m_DataSize; + size_t m_Position; }; #ifdef _WIN32 class com_exception : public std::exception { public: - com_exception(HRESULT hr) noexcept : result(hr) {} + com_exception(HRESULT hr) noexcept + : result(hr) + {} const char* what() const noexcept override { @@ -136,11 +132,12 @@ namespace class InputFileStream : public Imf::IStream { public: - InputFileStream(HANDLE hFile, const char fileName[]) : - IStream(fileName), m_hFile(hFile) + InputFileStream(HANDLE hFile, const char fileName[]) + : IStream(fileName), + m_hFile(hFile) { const LARGE_INTEGER dist = {}; - LARGE_INTEGER result; + LARGE_INTEGER result; if (!SetFilePointerEx(m_hFile, dist, &result, FILE_END)) { throw com_exception(HRESULT_FROM_WIN32(GetLastError())); @@ -154,10 +151,10 @@ namespace } } - InputFileStream(const InputFileStream&) = delete; - InputFileStream& operator = (const InputFileStream&) = delete; + InputFileStream(const InputFileStream&) = delete; + InputFileStream& operator=(const InputFileStream&) = delete; - InputFileStream(InputFileStream&&) = delete; + InputFileStream(InputFileStream&&) = delete; InputFileStream& operator=(InputFileStream&&) = delete; bool read(char c[], int n) override @@ -169,7 +166,7 @@ namespace } const LARGE_INTEGER dist = {}; - LARGE_INTEGER result; + LARGE_INTEGER result; if (!SetFilePointerEx(m_hFile, dist, &result, FILE_CURRENT)) { throw com_exception(HRESULT_FROM_WIN32(GetLastError())); @@ -181,7 +178,7 @@ namespace uint64_t tellg() override { const LARGE_INTEGER dist = {}; - LARGE_INTEGER result; + LARGE_INTEGER result; if (!SetFilePointerEx(m_hFile, dist, &result, FILE_CURRENT)) { throw com_exception(HRESULT_FROM_WIN32(GetLastError())); @@ -199,34 +196,29 @@ namespace } } - void clear() override - { - SetLastError(0); - } + void clear() override { SetLastError(0); } - #if COMBINED_OPENEXR_VERSION > 30300 - int64_t read(void *buf, uint64_t sz, uint64_t offset) override - { - return Imf::IStream::read(buf, sz, offset); - } - #endif +#if COMBINED_OPENEXR_VERSION > 30300 + int64_t read(void* buf, uint64_t sz, uint64_t offset) override { return Imf::IStream::read(buf, sz, offset); } +#endif private: - HANDLE m_hFile; + HANDLE m_hFile; LONGLONG m_EOF; }; class OutputFileStream : public Imf::OStream { public: - OutputFileStream(HANDLE hFile, const char fileName[]) : - OStream(fileName), m_hFile(hFile) + OutputFileStream(HANDLE hFile, const char fileName[]) + : OStream(fileName), + m_hFile(hFile) {} - OutputFileStream(const OutputFileStream&) = delete; - OutputFileStream& operator = (const OutputFileStream&) = delete; + OutputFileStream(const OutputFileStream&) = delete; + OutputFileStream& operator=(const OutputFileStream&) = delete; - OutputFileStream(OutputFileStream&&) = delete; + OutputFileStream(OutputFileStream&&) = delete; OutputFileStream& operator=(OutputFileStream&&) = delete; void write(const char c[], int n) override @@ -241,7 +233,7 @@ namespace uint64_t tellp() override { const LARGE_INTEGER dist = {}; - LARGE_INTEGER result; + LARGE_INTEGER result; if (!SetFilePointerEx(m_hFile, dist, &result, FILE_CURRENT)) { throw com_exception(HRESULT_FROM_WIN32(GetLastError())); @@ -267,7 +259,7 @@ namespace //------------------------------------------------------------------------------------- // Load //------------------------------------------------------------------------------------- - template + template HRESULT LoadFromEXRCommon(StreamType stream, _Out_opt_ TexMetadata* metadata, ScratchImage& image) { image.Release(); @@ -285,9 +277,9 @@ namespace const auto dw = file.dataWindow(); - const int width = dw.max.x - dw.min.x + 1; - int height = dw.max.y - dw.min.y + 1; - size_t arraySize = 1; + const int width = dw.max.x - dw.min.x + 1; + int height = dw.max.y - dw.min.y + 1; + size_t arraySize = 1; if (width < 1 || height < 1) return E_FAIL; @@ -296,51 +288,52 @@ namespace { if (width == height / 6) { - height = width; + height = width; arraySize = 6; } } if (metadata) { - metadata->width = static_cast(width); + metadata->width = static_cast(width); metadata->height = static_cast(height); metadata->depth = metadata->mipLevels = 1; - metadata->arraySize = arraySize; - metadata->format = DXGI_FORMAT_R16G16B16A16_FLOAT; - metadata->dimension = TEX_DIMENSION_TEXTURE2D; + metadata->arraySize = arraySize; + metadata->format = DXGI_FORMAT_R16G16B16A16_FLOAT; + metadata->dimension = TEX_DIMENSION_TEXTURE2D; } - hr = image.Initialize2D(DXGI_FORMAT_R16G16B16A16_FLOAT, - static_cast(width), static_cast(height), arraySize, 1u); + hr = image.Initialize2D(DXGI_FORMAT_R16G16B16A16_FLOAT, static_cast(width), static_cast(height), arraySize, 1u); if (FAILED(hr)) return hr; - file.setFrameBuffer(reinterpret_cast(image.GetPixels()) - dw.min.x - dw.min.y * width, 1, static_cast(width)); + file.setFrameBuffer(reinterpret_cast(image.GetPixels()) - dw.min.x - dw.min.y * width, + 1, + static_cast(width)); file.readPixels(dw.min.y, dw.max.y); } - #ifdef _WIN32 +#ifdef _WIN32 catch (const com_exception& exc) { - #ifdef _DEBUG +#ifdef _DEBUG OutputDebugStringA(exc.what()); - #endif +#endif hr = exc.get_result(); } - #endif - #if defined(_WIN32) && defined(_DEBUG) +#endif +#if defined(_WIN32) && defined(_DEBUG) catch (const std::exception& exc) { OutputDebugStringA(exc.what()); hr = E_FAIL; } - #else +#else catch (const std::exception&) { hr = E_FAIL; } - #endif +#endif catch (...) { hr = E_UNEXPECTED; @@ -353,7 +346,7 @@ namespace return hr; } -} +} // namespace //===================================================================================== // Entry-points @@ -362,15 +355,14 @@ namespace //------------------------------------------------------------------------------------- // Obtain metadata from EXR file on disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromEXRFile(const wchar_t* szFile, TexMetadata& metadata) +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromEXRFile(const wchar_t* szFile, TexMetadata& metadata) { if (!szFile) return E_INVALIDARG; #ifdef _WIN32 std::string fileName; - const int nameLength = WideCharToMultiByte(CP_UTF8, 0, szFile, -1, nullptr, 0, nullptr, nullptr); + const int nameLength = WideCharToMultiByte(CP_UTF8, 0, szFile, -1, nullptr, 0, nullptr, nullptr); if (nameLength > 0) { fileName.resize(static_cast(nameLength)); @@ -381,10 +373,7 @@ HRESULT DirectX::GetMetadataFromEXRFile(const wchar_t* szFile, TexMetadata& meta } } - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -393,24 +382,24 @@ HRESULT DirectX::GetMetadataFromEXRFile(const wchar_t* szFile, TexMetadata& meta InputFileStream stream(hFile.get(), fileName.c_str()); #else std::wstring wFileName(szFile); - std::string fileName(wFileName.cbegin(), wFileName.cend()); + std::string fileName(wFileName.cbegin(), wFileName.cend()); #endif HRESULT hr = S_OK; try { - #ifdef _WIN32 +#ifdef _WIN32 Imf::RgbaInputFile file(stream); - #else +#else Imf::RgbaInputFile file(fileName.c_str()); - #endif +#endif const auto dw = file.dataWindow(); - const int width = dw.max.x - dw.min.x + 1; - int height = dw.max.y - dw.min.y + 1; - size_t arraySize = 1; + const int width = dw.max.x - dw.min.x + 1; + int height = dw.max.y - dw.min.y + 1; + size_t arraySize = 1; if (width < 1 || height < 1) return E_FAIL; @@ -419,25 +408,25 @@ HRESULT DirectX::GetMetadataFromEXRFile(const wchar_t* szFile, TexMetadata& meta { if (width == height / 6) { - height = width; + height = width; arraySize = 6; } } - metadata = {}; - metadata.width = static_cast(width); + metadata = {}; + metadata.width = static_cast(width); metadata.height = static_cast(height); metadata.depth = metadata.mipLevels = 1; - metadata.arraySize = arraySize; - metadata.format = DXGI_FORMAT_R16G16B16A16_FLOAT; - metadata.dimension = TEX_DIMENSION_TEXTURE2D; + metadata.arraySize = arraySize; + metadata.format = DXGI_FORMAT_R16G16B16A16_FLOAT; + metadata.dimension = TEX_DIMENSION_TEXTURE2D; } #ifdef _WIN32 catch (const com_exception& exc) { - #ifdef _DEBUG +#ifdef _DEBUG OutputDebugStringA(exc.what()); - #endif +#endif hr = exc.get_result(); } #endif @@ -464,8 +453,7 @@ HRESULT DirectX::GetMetadataFromEXRFile(const wchar_t* szFile, TexMetadata& meta //------------------------------------------------------------------------------------- // Load a EXR file from memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromEXRMemory(const uint8_t* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) +_Use_decl_annotations_ HRESULT DirectX::LoadFromEXRMemory(const uint8_t* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) { if (!pSource || !size) return E_INVALIDARG; @@ -476,15 +464,14 @@ HRESULT DirectX::LoadFromEXRMemory(const uint8_t* pSource, size_t size, TexMetad //------------------------------------------------------------------------------------- // Load a EXR file from disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromEXRFile(const wchar_t* szFile, TexMetadata* metadata, ScratchImage& image) +_Use_decl_annotations_ HRESULT DirectX::LoadFromEXRFile(const wchar_t* szFile, TexMetadata* metadata, ScratchImage& image) { if (!szFile) return E_INVALIDARG; #ifdef _WIN32 std::string fileName; - const int nameLength = WideCharToMultiByte(CP_UTF8, 0, szFile, -1, nullptr, 0, nullptr, nullptr); + const int nameLength = WideCharToMultiByte(CP_UTF8, 0, szFile, -1, nullptr, 0, nullptr, nullptr); if (nameLength > 0) { fileName.resize(static_cast(nameLength)); @@ -495,10 +482,7 @@ HRESULT DirectX::LoadFromEXRFile(const wchar_t* szFile, TexMetadata* metadata, S } } - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -507,17 +491,15 @@ HRESULT DirectX::LoadFromEXRFile(const wchar_t* szFile, TexMetadata* metadata, S return LoadFromEXRCommon(InputFileStream(hFile.get(), fileName.c_str()), metadata, image); #else std::wstring wFileName(szFile); - std::string fileName(wFileName.cbegin(), wFileName.cend()); + std::string fileName(wFileName.cbegin(), wFileName.cend()); return LoadFromEXRCommon(fileName.c_str(), metadata, image); #endif } - //------------------------------------------------------------------------------------- // Save a EXR file to disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveToEXRFile(const Image& image, const wchar_t* szFile) +_Use_decl_annotations_ HRESULT DirectX::SaveToEXRFile(const Image& image, const wchar_t* szFile) { if (!szFile) return E_INVALIDARG; @@ -536,16 +518,14 @@ HRESULT DirectX::SaveToEXRFile(const Image& image, const wchar_t* szFile) break; case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R32G32B32_FLOAT: - break; + case DXGI_FORMAT_R32G32B32_FLOAT: break; - default: - return /* HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) */ static_cast(0x80070032L); + default: return /* HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED) */ static_cast(0x80070032L); } #ifdef _WIN32 std::string fileName; - const int nameLength = WideCharToMultiByte(CP_UTF8, 0, szFile, -1, nullptr, 0, nullptr, nullptr); + const int nameLength = WideCharToMultiByte(CP_UTF8, 0, szFile, -1, nullptr, 0, nullptr, nullptr); if (nameLength > 0) { fileName.resize(static_cast(nameLength)); @@ -557,10 +537,7 @@ HRESULT DirectX::SaveToEXRFile(const Image& image, const wchar_t* szFile) } // Create file and write header - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_WRITE, 0, CREATE_ALWAYS, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -571,21 +548,21 @@ HRESULT DirectX::SaveToEXRFile(const Image& image, const wchar_t* szFile) OutputFileStream stream(hFile.get(), fileName.c_str()); #else std::wstring wFileName(szFile); - std::string fileName(wFileName.cbegin(), wFileName.cend()); + std::string fileName(wFileName.cbegin(), wFileName.cend()); #endif HRESULT hr = S_OK; try { - const auto width = static_cast(image.width); + const auto width = static_cast(image.width); const auto height = static_cast(image.height); - #ifdef _WIN32 +#ifdef _WIN32 Imf::RgbaOutputFile file(stream, Imf::Header(width, height), Imf::WRITE_RGBA); - #else +#else Imf::RgbaOutputFile file(fileName.c_str(), Imf::Header(width, height), Imf::WRITE_RGBA); - #endif +#endif if (image.format == DXGI_FORMAT_R16G16B16A16_FLOAT) { @@ -613,7 +590,7 @@ HRESULT DirectX::SaveToEXRFile(const Image& image, const wchar_t* szFile) { for (int j = 0; j < height; ++j) { - auto srcPtr = reinterpret_cast(sPtr); + auto srcPtr = reinterpret_cast(sPtr); auto destPtr = dPtr; for (int k = 0; k < width; ++k, ++srcPtr, ++destPtr) { @@ -633,12 +610,12 @@ HRESULT DirectX::SaveToEXRFile(const Image& image, const wchar_t* szFile) for (int j = 0; j < height; ++j) { - auto srcPtr = reinterpret_cast(sPtr); + auto srcPtr = reinterpret_cast(sPtr); auto destPtr = dPtr; for (int k = 0; k < width; ++k, ++srcPtr, ++destPtr) { XMVECTOR v = XMLoadFloat3(srcPtr); - v = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1110); + v = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1110); PackedVector::XMStoreHalf4(destPtr, v); } @@ -653,9 +630,9 @@ HRESULT DirectX::SaveToEXRFile(const Image& image, const wchar_t* szFile) #ifdef _WIN32 catch (const com_exception& exc) { - #ifdef _DEBUG +#ifdef _DEBUG OutputDebugStringA(exc.what()); - #endif +#endif hr = exc.get_result(); } #endif diff --git a/Auxiliary/DirectXTexEXR.h b/Auxiliary/DirectXTexEXR.h index 8ed9f12b..8a52f93f 100644 --- a/Auxiliary/DirectXTexEXR.h +++ b/Auxiliary/DirectXTexEXR.h @@ -11,22 +11,17 @@ #include "DirectXTex.h" - namespace DirectX { - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromEXRFile( - _In_z_ const wchar_t* szFile, - _Out_ TexMetadata& metadata); + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromEXRFile(_In_z_ const wchar_t* szFile, _Out_ TexMetadata& metadata); - DIRECTX_TEX_API HRESULT __cdecl LoadFromEXRMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image); + DIRECTX_TEX_API HRESULT __cdecl LoadFromEXRMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image); - DIRECTX_TEX_API HRESULT __cdecl LoadFromEXRFile( - _In_z_ const wchar_t* szFile, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image); + DIRECTX_TEX_API HRESULT __cdecl + LoadFromEXRFile(_In_z_ const wchar_t* szFile, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image); - DIRECTX_TEX_API HRESULT __cdecl SaveToEXRFile( - _In_ const Image& image, - _In_z_ const wchar_t* szFile); -} + DIRECTX_TEX_API HRESULT __cdecl SaveToEXRFile(_In_ const Image& image, _In_z_ const wchar_t* szFile); +} // namespace DirectX diff --git a/Auxiliary/DirectXTexJPEG.cpp b/Auxiliary/DirectXTexJPEG.cpp index 358aab81..1e890d8e 100644 --- a/Auxiliary/DirectXTexJPEG.cpp +++ b/Auxiliary/DirectXTexJPEG.cpp @@ -34,10 +34,9 @@ #include #include - using namespace DirectX; using std::filesystem::path; -using ScopedFILE = std::unique_ptr; +using ScopedFILE = std::unique_ptr; namespace { @@ -45,7 +44,7 @@ namespace ScopedFILE OpenFILE(const path& p) noexcept(false) { const std::wstring fpath = p.generic_wstring(); - FILE* fp = nullptr; + FILE* fp = nullptr; if (auto ec = _wfopen_s(&fp, fpath.c_str(), L"rb"); ec) throw std::system_error{ static_cast(_doserrno), std::system_category(), "_wfopen_s" }; return { fp, &fclose }; @@ -53,7 +52,7 @@ namespace ScopedFILE CreateFILE(const path& p) noexcept(false) { const std::wstring fpath = p.generic_wstring(); - FILE* fp = nullptr; + FILE* fp = nullptr; if (auto ec = _wfopen_s(&fp, fpath.c_str(), L"w+b"); ec) throw std::system_error{ static_cast(_doserrno), std::system_category(), "_wfopen_s" }; return { fp, &fclose }; @@ -62,7 +61,7 @@ namespace ScopedFILE OpenFILE(const path& p) noexcept(false) { const std::string fpath = p.generic_string(); - FILE* fp = fopen(fpath.c_str(), "rb"); + FILE* fp = fopen(fpath.c_str(), "rb"); if (!fp) throw std::system_error{ errno, std::system_category(), "fopen" }; return { fp, &fclose }; @@ -70,7 +69,7 @@ namespace ScopedFILE CreateFILE(const path& p) noexcept(false) { const std::string fpath = p.generic_string(); - FILE* fp = fopen(fpath.c_str(), "w+b"); + FILE* fp = fopen(fpath.c_str(), "w+b"); if (!fp) throw std::system_error{ errno, std::system_category(), "fopen" }; return { fp, &fclose }; @@ -89,27 +88,24 @@ namespace class JPEGDecompress final { - jpeg_error_mgr err; + jpeg_error_mgr err; jpeg_decompress_struct dec; - JPEG_FLAGS userFlags; + JPEG_FLAGS userFlags; public: - JPEGDecompress(JPEG_FLAGS flags) : err{}, dec{}, userFlags(flags) + JPEGDecompress(JPEG_FLAGS flags) + : err{}, + dec{}, + userFlags(flags) { jpeg_std_error(&err); err.error_exit = &OnJPEGError; - dec.err = &err; + dec.err = &err; jpeg_create_decompress(&dec); } - ~JPEGDecompress() noexcept - { - jpeg_destroy_decompress(&dec); - } + ~JPEGDecompress() noexcept { jpeg_destroy_decompress(&dec); } - void UseInput(FILE* fin) noexcept - { - jpeg_stdio_src(&dec, fin); - } + void UseInput(FILE* fin) noexcept { jpeg_stdio_src(&dec, fin); } DXGI_FORMAT TranslateColor(J_COLOR_SPACE colorspace) noexcept { @@ -117,29 +113,27 @@ namespace { case JCS_GRAYSCALE: // 1 component return DXGI_FORMAT_R8_UNORM; - case JCS_RGB: // 3 component, Standard RGB + case JCS_RGB: // 3 component, Standard RGB return (userFlags & JPEG_FLAGS_DEFAULT_LINEAR) ? DXGI_FORMAT_R8G8B8A8_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - case JCS_YCbCr: // 3 component, YCbCr - default: - return DXGI_FORMAT_UNKNOWN; + case JCS_YCbCr: // 3 component, YCbCr + default: return DXGI_FORMAT_UNKNOWN; } } void GetMetadata(TexMetadata& metadata) noexcept(false) { - metadata.width = dec.image_width; - metadata.height = dec.image_height; - metadata.depth = 1; + metadata.width = dec.image_width; + metadata.height = dec.image_height; + metadata.depth = 1; metadata.arraySize = 1; metadata.mipLevels = 1; metadata.dimension = TEX_DIMENSION_TEXTURE2D; - metadata.format = TranslateColor(dec.out_color_space); + metadata.format = TranslateColor(dec.out_color_space); if (metadata.format == DXGI_FORMAT_UNKNOWN) { throw std::runtime_error{ "unexpected out_color_space in jpeg_decompress_struct" }; } - if (metadata.format == DXGI_FORMAT_R8G8B8A8_UNORM - || metadata.format == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) + if (metadata.format == DXGI_FORMAT_R8G8B8A8_UNORM || metadata.format == DXGI_FORMAT_R8G8B8A8_UNORM_SRGB) { metadata.miscFlags2 |= TEX_ALPHA_MODE_OPAQUE; } @@ -150,18 +144,15 @@ namespace metadata = {}; switch (jpeg_read_header(&dec, false)) { - case JPEG_HEADER_TABLES_ONLY: - [[fallthrough]]; - case JPEG_HEADER_OK: - break; - case JPEG_SUSPENDED: - return E_FAIL; + case JPEG_HEADER_TABLES_ONLY: [[fallthrough]]; + case JPEG_HEADER_OK: break; + default: return E_FAIL; } GetMetadata(metadata); return S_OK; } - #ifndef LIBJPEG_TURBO_VERSION +#ifndef LIBJPEG_TURBO_VERSION // shift pixels with padding in reverse order (to make it work in-memory) void ShiftPixels(const Image& image) noexcept { @@ -170,41 +161,37 @@ namespace { for (size_t i = (image.width - 1); i > 0; i -= 1) { - scanline[4*i + 0] = scanline[3*i + 0]; - scanline[4*i + 1] = scanline[3*i + 1]; - scanline[4*i + 2] = scanline[3*i + 2]; - scanline[4*i + 3] = 0xff; + scanline[4 * i + 0] = scanline[3 * i + 0]; + scanline[4 * i + 1] = scanline[3 * i + 1]; + scanline[4 * i + 2] = scanline[3 * i + 2]; + scanline[4 * i + 3] = 0xff; } scanline += image.rowPitch; } } - #endif +#endif HRESULT GetImage(TexMetadata& metadata, ScratchImage& image) noexcept(false) { metadata = {}; switch (jpeg_read_header(&dec, true)) { - case JPEG_HEADER_TABLES_ONLY: - GetMetadata(metadata); - [[fallthrough]]; - case JPEG_SUSPENDED: - return E_FAIL; - case JPEG_HEADER_OK: - break; + case JPEG_HEADER_TABLES_ONLY: GetMetadata(metadata); [[fallthrough]]; + case JPEG_HEADER_OK: break; + default: return E_FAIL; } GetMetadata(metadata); if (auto hr = image.Initialize2D(metadata.format, metadata.width, metadata.height, 1u, 1u); FAILED(hr)) return hr; - #ifdef LIBJPEG_TURBO_VERSION +#ifdef LIBJPEG_TURBO_VERSION if (dec.out_color_space != JCS_GRAYSCALE) { dec.out_color_space = JCS_EXT_RGBA; } - #endif +#endif if (jpeg_start_decompress(&dec) == false) return E_FAIL; @@ -226,13 +213,13 @@ namespace if (jpeg_finish_decompress(&dec) == false) return E_FAIL; - #ifndef LIBJPEG_TURBO_VERSION +#ifndef LIBJPEG_TURBO_VERSION // if NOT TurboJPEG, we need to make 3 component images to 4 component image if (dec.out_color_space != JCS_GRAYSCALE) { ShiftPixels(img); } - #endif +#endif return S_OK; } @@ -246,27 +233,24 @@ namespace class JPEGCompress final { - jpeg_error_mgr err; + jpeg_error_mgr err; jpeg_compress_struct enc; - JPEG_FLAGS userFlags; + JPEG_FLAGS userFlags; public: - JPEGCompress(JPEG_FLAGS flags) : err{}, enc{}, userFlags(flags) + JPEGCompress(JPEG_FLAGS flags) + : err{}, + enc{}, + userFlags(flags) { jpeg_std_error(&err); err.error_exit = &OnJPEGError; - enc.err = &err; + enc.err = &err; jpeg_create_compress(&enc); } - ~JPEGCompress() noexcept - { - jpeg_destroy_compress(&enc); - } + ~JPEGCompress() noexcept { jpeg_destroy_compress(&enc); } - void UseOutput(FILE* fout) - { - jpeg_stdio_dest(&enc, fout); - } + void UseOutput(FILE* fout) { jpeg_stdio_dest(&enc, fout); } HRESULT WriteImage(const Image& image) noexcept(false) { @@ -274,39 +258,38 @@ namespace { case DXGI_FORMAT_R8_UNORM: enc.input_components = 1; - enc.in_color_space = JCS_GRAYSCALE; + enc.in_color_space = JCS_GRAYSCALE; break; - #ifdef LIBJPEG_TURBO_VERSION +#ifdef LIBJPEG_TURBO_VERSION case DXGI_FORMAT_R8G8B8A8_UNORM: case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: enc.input_components = 4; - enc.in_color_space = JCS_EXT_RGBA; + enc.in_color_space = JCS_EXT_RGBA; break; case DXGI_FORMAT_B8G8R8A8_UNORM: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: enc.input_components = 4; - enc.in_color_space = JCS_EXT_BGRA; + enc.in_color_space = JCS_EXT_BGRA; break; case DXGI_FORMAT_B8G8R8X8_UNORM: case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: enc.input_components = 4; - enc.in_color_space = JCS_EXT_BGRX; + enc.in_color_space = JCS_EXT_BGRX; break; - #else +#else case DXGI_FORMAT_R8G8B8A8_UNORM: case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: enc.input_components = 3; - enc.in_color_space = JCS_RGB; + enc.in_color_space = JCS_RGB; break; - #endif +#endif - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } // TODO: Add sRGB intent? - enc.image_width = static_cast(image.width); + enc.image_width = static_cast(image.width); enc.image_height = static_cast(image.height); jpeg_set_defaults(&enc); jpeg_set_quality(&enc, 100, true); @@ -314,30 +297,30 @@ namespace // we will write a row each time ... jpeg_start_compress(&enc, true); - #ifndef LIBJPEG_TURBO_VERSION +#ifndef LIBJPEG_TURBO_VERSION if (enc.input_components == 3) { - const size_t stride = enc.image_width * static_cast(enc.input_components); - auto scanline = std::make_unique(stride); - JSAMPROW rows[1]{ scanline.get() }; + const size_t stride = enc.image_width * static_cast(enc.input_components); + auto scanline = std::make_unique(stride); + JSAMPROW rows[1]{ scanline.get() }; while (enc.next_scanline < enc.image_height) { // Copy 4 to 3 components const uint8_t* src = image.pixels + enc.next_scanline * image.rowPitch; - uint8_t* dst = scanline.get(); - for(size_t i=0; i < image.width; ++i) + uint8_t* dst = scanline.get(); + for (size_t i = 0; i < image.width; ++i) { - dst[3*i + 0] = src[4*i + 0]; - dst[3*i + 1] = src[4*i + 1]; - dst[3*i + 2] = src[4*i + 2]; + dst[3 * i + 0] = src[4 * i + 0]; + dst[3 * i + 1] = src[4 * i + 1]; + dst[3 * i + 2] = src[4 * i + 2]; } jpeg_write_scanlines(&enc, rows, 1); } } else - #endif +#endif { while (enc.next_scanline < enc.image_height) { @@ -350,20 +333,16 @@ namespace return S_OK; } }; -} +} // namespace -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromJPEGFile( - const wchar_t* file, - JPEG_FLAGS flags, - TexMetadata& metadata) +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromJPEGFile(const wchar_t* file, JPEG_FLAGS flags, TexMetadata& metadata) { if (!file) return E_INVALIDARG; try { - auto fin = OpenFILE(file); + auto fin = OpenFILE(file); JPEGDecompress decoder(flags); decoder.UseInput(fin.get()); return decoder.GetHeader(metadata); @@ -374,11 +353,11 @@ HRESULT DirectX::GetMetadataFromJPEGFile( } catch (const std::system_error& ec) { - #ifdef _WIN32 +#ifdef _WIN32 return HRESULT_FROM_WIN32(static_cast(ec.code().value())); - #else +#else return (ec.code().value() == ENOENT) ? HRESULT_ERROR_FILE_NOT_FOUND : E_FAIL; - #endif +#endif } catch (const std::exception&) { @@ -386,12 +365,7 @@ HRESULT DirectX::GetMetadataFromJPEGFile( } } -_Use_decl_annotations_ -HRESULT DirectX::LoadFromJPEGFile( - const wchar_t* file, - JPEG_FLAGS flags, - TexMetadata* metadata, - ScratchImage&image) +_Use_decl_annotations_ HRESULT DirectX::LoadFromJPEGFile(const wchar_t* file, JPEG_FLAGS flags, TexMetadata* metadata, ScratchImage& image) { if (!file) return E_INVALIDARG; @@ -400,7 +374,7 @@ HRESULT DirectX::LoadFromJPEGFile( try { - auto fin = OpenFILE(file); + auto fin = OpenFILE(file); JPEGDecompress decoder(flags); decoder.UseInput(fin.get()); if (!metadata) @@ -415,11 +389,11 @@ HRESULT DirectX::LoadFromJPEGFile( catch (const std::system_error& ec) { image.Release(); - #ifdef _WIN32 +#ifdef _WIN32 return HRESULT_FROM_WIN32(static_cast(ec.code().value())); - #else +#else return (ec.code().value() == ENOENT) ? HRESULT_ERROR_FILE_NOT_FOUND : E_FAIL; - #endif +#endif } catch (const std::exception&) { @@ -428,18 +402,14 @@ HRESULT DirectX::LoadFromJPEGFile( } } -_Use_decl_annotations_ -HRESULT DirectX::SaveToJPEGFile( - const Image& image, - JPEG_FLAGS flags, - const wchar_t* file) +_Use_decl_annotations_ HRESULT DirectX::SaveToJPEGFile(const Image& image, JPEG_FLAGS flags, const wchar_t* file) { if (!file) return E_INVALIDARG; try { - auto fout = CreateFILE(file); + auto fout = CreateFILE(file); JPEGCompress encoder(flags); encoder.UseOutput(fout.get()); return encoder.WriteImage(image); @@ -450,11 +420,11 @@ HRESULT DirectX::SaveToJPEGFile( } catch (const std::system_error& ec) { - #ifdef _WIN32 +#ifdef _WIN32 return HRESULT_FROM_WIN32(static_cast(ec.code().value())); - #else +#else return (ec.code().value() == ENOENT) ? HRESULT_ERROR_FILE_NOT_FOUND : E_FAIL; - #endif +#endif } catch (const std::exception&) { diff --git a/Auxiliary/DirectXTexJPEG.h b/Auxiliary/DirectXTexJPEG.h index dc5de5e9..b1753905 100644 --- a/Auxiliary/DirectXTexJPEG.h +++ b/Auxiliary/DirectXTexJPEG.h @@ -15,7 +15,6 @@ #include "DirectXTex.h" - namespace DirectX { enum JPEG_FLAGS : uint32_t @@ -26,21 +25,12 @@ namespace DirectX // Return non-SRGB formats intead of sRGB }; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromJPEGFile( - _In_z_ const wchar_t* szFile, - JPEG_FLAGS flags, - _Out_ TexMetadata& metadata); + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromJPEGFile(_In_z_ const wchar_t* szFile, JPEG_FLAGS flags, _Out_ TexMetadata& metadata); - DIRECTX_TEX_API HRESULT __cdecl LoadFromJPEGFile( - _In_z_ const wchar_t* szFile, - JPEG_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image); + DIRECTX_TEX_API HRESULT __cdecl + LoadFromJPEGFile(_In_z_ const wchar_t* szFile, JPEG_FLAGS flags, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image); - DIRECTX_TEX_API HRESULT __cdecl SaveToJPEGFile( - _In_ const Image& image, - JPEG_FLAGS flags, - _In_z_ const wchar_t* szFile); + DIRECTX_TEX_API HRESULT __cdecl SaveToJPEGFile(_In_ const Image& image, JPEG_FLAGS flags, _In_z_ const wchar_t* szFile); #ifdef __clang__ #pragma clang diagnostic push @@ -48,9 +38,9 @@ namespace DirectX #pragma clang diagnostic ignored "-Wextra-semi-stmt" #endif -DEFINE_ENUM_FLAG_OPERATORS(JPEG_FLAGS); + DEFINE_ENUM_FLAG_OPERATORS(JPEG_FLAGS); #ifdef __clang__ #pragma clang diagnostic pop #endif -} +} // namespace DirectX diff --git a/Auxiliary/DirectXTexPNG.cpp b/Auxiliary/DirectXTexPNG.cpp index 8b242f41..f69d0013 100644 --- a/Auxiliary/DirectXTexPNG.cpp +++ b/Auxiliary/DirectXTexPNG.cpp @@ -29,10 +29,9 @@ #include - using namespace DirectX; using std::filesystem::path; -using ScopedFILE = std::unique_ptr; +using ScopedFILE = std::unique_ptr; namespace { @@ -40,7 +39,7 @@ namespace ScopedFILE OpenFILE(const path& p) noexcept(false) { const std::wstring fpath = p.generic_wstring(); - FILE* fp = nullptr; + FILE* fp = nullptr; if (auto ec = _wfopen_s(&fp, fpath.c_str(), L"rb"); ec) throw std::system_error{ static_cast(_doserrno), std::system_category(), "_wfopen_s" }; return { fp, &fclose }; @@ -48,7 +47,7 @@ namespace ScopedFILE CreateFILE(const path& p) noexcept(false) { const std::wstring fpath = p.generic_wstring(); - FILE* fp = nullptr; + FILE* fp = nullptr; if (auto ec = _wfopen_s(&fp, fpath.c_str(), L"w+b"); ec) throw std::system_error{ static_cast(_doserrno), std::system_category(), "_wfopen_s" }; return { fp, &fclose }; @@ -57,7 +56,7 @@ namespace ScopedFILE OpenFILE(const path& p) noexcept(false) { const std::string fpath = p.generic_string(); - FILE* fp = fopen(fpath.c_str(), "rb"); + FILE* fp = fopen(fpath.c_str(), "rb"); if (!fp) throw std::system_error{ errno, std::system_category(), "fopen" }; return { fp, &fclose }; @@ -65,7 +64,7 @@ namespace ScopedFILE CreateFILE(const path& p) noexcept(false) { const std::string fpath = p.generic_string(); - FILE* fp = fopen(fpath.c_str(), "w+b"); + FILE* fp = fopen(fpath.c_str(), "w+b"); if (!fp) throw std::system_error{ errno, std::system_category(), "fopen" }; return { fp, &fclose }; @@ -85,20 +84,21 @@ namespace /// @note If the PNG contains some extra chunks like EXIF, this will be used void OnPNGRead(png_structp st, png_bytep ptr, size_t len) { - FILE* fin = reinterpret_cast(png_get_io_ptr(st)); + FILE* fin = reinterpret_cast(png_get_io_ptr(st)); std::ignore = fread(ptr, len, 1, fin); } - /// @see http://www.libpng.org/pub/png/libpng.html /// @see http://www.libpng.org/pub/png/libpng-manual.txt class PNGDecompress final { png_structp st; - png_infop info; + png_infop info; public: - PNGDecompress() noexcept(false) : st{ nullptr }, info{ nullptr } + PNGDecompress() noexcept(false) + : st{ nullptr }, + info{ nullptr } { st = png_create_read_struct(PNG_LIBPNG_VER_STRING, this, &OnPNGError, &OnPNGWarning); if (!st) @@ -111,10 +111,7 @@ namespace } } - ~PNGDecompress() noexcept - { - png_destroy_read_struct(&st, &info, nullptr); - } + ~PNGDecompress() noexcept { png_destroy_read_struct(&st, &info, nullptr); } void UseInput(FILE* fin) noexcept { @@ -156,16 +153,16 @@ namespace png_set_alpha_mode(st, PNG_ALPHA_STANDARD, PNG_GAMMA_LINEAR); // Deal with custom color profiles - if( png_get_valid( st, info, PNG_INFO_gAMA ) ) + if (png_get_valid(st, info, PNG_INFO_gAMA)) { - double gamma = 0; + double gamma = 0; double screen_gamma = 2.2; - if( png_get_gAMA( st, info, &gamma ) ) + if (png_get_gAMA(st, info, &gamma)) { // If gamma == 1.0, then the data is internally linear. - if( abs( gamma - 1.0 ) > 1e-6 ) - png_set_gamma( st, screen_gamma, gamma ); + if (abs(gamma - 1.0) > 1e-6) + png_set_gamma(st, screen_gamma, gamma); } } @@ -195,12 +192,12 @@ namespace // RGB/BGR and sRGB or not DXGI_FORMAT linear = DXGI_FORMAT_R8G8B8A8_UNORM; - DXGI_FORMAT srgb = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + DXGI_FORMAT srgb = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; if (flags & PNG_FLAGS_BGR) { png_set_bgr(st); linear = DXGI_FORMAT_B8G8R8A8_UNORM; - srgb = DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + srgb = DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; } if (flags & PNG_FLAGS_IGNORE_SRGB) @@ -210,13 +207,13 @@ namespace if (png_get_sRGB(st, info, &intent) != 0) return srgb; - if( png_get_valid( st, info, PNG_INFO_gAMA ) ) + if (png_get_valid(st, info, PNG_INFO_gAMA)) { double gamma = 0; - if( png_get_gAMA( st, info, &gamma ) ) + if (png_get_gAMA(st, info, &gamma)) { // This PNG is explicitly linear. - if( abs( gamma - 1.0 ) <= 1e-6 ) + if (abs(gamma - 1.0) <= 1e-6) return linear; } } @@ -227,19 +224,17 @@ namespace /// @todo More correct DXGI_FORMAT mapping void GetHeader(PNG_FLAGS flags, TexMetadata& metadata) noexcept(false) { - metadata = {}; - metadata.width = png_get_image_width(st, info); - metadata.height = png_get_image_height(st, info); + metadata = {}; + metadata.width = png_get_image_width(st, info); + metadata.height = png_get_image_height(st, info); metadata.arraySize = 1; metadata.mipLevels = 1; - metadata.depth = 1; + metadata.depth = 1; metadata.dimension = TEX_DIMENSION_TEXTURE2D; - metadata.format = GuessFormat(flags); - auto color_type = png_get_color_type(st, info); - bool have_alpha = (color_type & PNG_COLOR_MASK_ALPHA); - if (have_alpha == false - && (metadata.format != DXGI_FORMAT_R8_UNORM) - && (metadata.format != DXGI_FORMAT_R16_UNORM)) + metadata.format = GuessFormat(flags); + auto color_type = png_get_color_type(st, info); + bool have_alpha = (color_type & PNG_COLOR_MASK_ALPHA); + if (have_alpha == false && (metadata.format != DXGI_FORMAT_R8_UNORM) && (metadata.format != DXGI_FORMAT_R16_UNORM)) { if (metadata.format == DXGI_FORMAT_B8G8R8A8_UNORM) metadata.format = DXGI_FORMAT_B8G8R8X8_UNORM; @@ -285,10 +280,12 @@ namespace class PNGCompress final { png_structp st; - png_infop info; + png_infop info; public: - PNGCompress() noexcept(false) : st{ nullptr }, info{ nullptr } + PNGCompress() noexcept(false) + : st{ nullptr }, + info{ nullptr } { st = png_create_write_struct(PNG_LIBPNG_VER_STRING, this, &OnPNGError, &OnPNGWarning); if (!st) @@ -302,44 +299,30 @@ namespace png_set_compression_level(st, 0); } - ~PNGCompress() noexcept - { - png_destroy_write_struct(&st, &info); - } + ~PNGCompress() noexcept { png_destroy_write_struct(&st, &info); } - void UseOutput(FILE* fout) noexcept - { - png_init_io(st, fout); - } + void UseOutput(FILE* fout) noexcept { png_init_io(st, fout); } HRESULT WriteImage(PNG_FLAGS flags, const Image& image) noexcept(false) { - int color_type = PNG_COLOR_TYPE_RGB; - bool using_bgr = false; - bool using_srgb = false; - int bit_depth = 8; + int color_type = PNG_COLOR_TYPE_RGB; + bool using_bgr = false; + bool using_srgb = false; + int bit_depth = 8; bool strip_alpha = false; switch (image.format) { - case DXGI_FORMAT_R8_UNORM: - color_type = PNG_COLOR_TYPE_GRAY; - break; + case DXGI_FORMAT_R8_UNORM: color_type = PNG_COLOR_TYPE_GRAY; break; case DXGI_FORMAT_R16_UNORM: color_type = PNG_COLOR_TYPE_GRAY; - bit_depth = 16; + bit_depth = 16; break; - case DXGI_FORMAT_B8G8R8A8_UNORM: - using_bgr = true; - [[fallthrough]]; - case DXGI_FORMAT_R8G8B8A8_UNORM: - color_type = PNG_COLOR_TYPE_RGBA; - break; + case DXGI_FORMAT_B8G8R8A8_UNORM: using_bgr = true; [[fallthrough]]; + case DXGI_FORMAT_R8G8B8A8_UNORM: color_type = PNG_COLOR_TYPE_RGBA; break; - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - using_bgr = true; - [[fallthrough]]; + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: using_bgr = true; [[fallthrough]]; case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: using_srgb = true; color_type = PNG_COLOR_TYPE_RGBA; @@ -347,23 +330,21 @@ namespace case DXGI_FORMAT_R16G16B16A16_UNORM: color_type = PNG_COLOR_TYPE_RGBA; - bit_depth = 16; + bit_depth = 16; break; - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - using_srgb = true; - [[fallthrough]]; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: using_srgb = true; [[fallthrough]]; case DXGI_FORMAT_B8G8R8X8_UNORM: - using_bgr = true; + using_bgr = true; strip_alpha = true; - color_type = PNG_COLOR_TYPE_RGB; + color_type = PNG_COLOR_TYPE_RGB; break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } - png_set_IHDR(st, info, + png_set_IHDR(st, + info, static_cast(image.width), static_cast(image.height), bit_depth, @@ -394,7 +375,7 @@ namespace } std::vector rows(image.height); - for (size_t i = 0u; i< image.height; ++i) + for (size_t i = 0u; i < image.height; ++i) { rows[i] = image.pixels + (image.rowPitch * i); } @@ -403,20 +384,16 @@ namespace return S_OK; } }; -} +} // namespace -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromPNGFile( - const wchar_t* file, - PNG_FLAGS flags, - TexMetadata& metadata) +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromPNGFile(const wchar_t* file, PNG_FLAGS flags, TexMetadata& metadata) { if (!file) return E_INVALIDARG; try { - auto fin = OpenFILE(file); + auto fin = OpenFILE(file); PNGDecompress decoder{}; decoder.UseInput(fin.get()); decoder.Update(flags); @@ -429,11 +406,11 @@ HRESULT DirectX::GetMetadataFromPNGFile( } catch (const std::system_error& ec) { - #ifdef _WIN32 +#ifdef _WIN32 return HRESULT_FROM_WIN32(static_cast(ec.code().value())); - #else +#else return (ec.code().value() == ENOENT) ? HRESULT_ERROR_FILE_NOT_FOUND : E_FAIL; - #endif +#endif } catch (const std::invalid_argument&) { @@ -445,12 +422,7 @@ HRESULT DirectX::GetMetadataFromPNGFile( } } -_Use_decl_annotations_ -HRESULT DirectX::LoadFromPNGFile( - const wchar_t* file, - PNG_FLAGS flags, - TexMetadata* metadata, - ScratchImage& image) +_Use_decl_annotations_ HRESULT DirectX::LoadFromPNGFile(const wchar_t* file, PNG_FLAGS flags, TexMetadata* metadata, ScratchImage& image) { if (!file) return E_INVALIDARG; @@ -459,7 +431,7 @@ HRESULT DirectX::LoadFromPNGFile( try { - auto fin = OpenFILE(file); + auto fin = OpenFILE(file); PNGDecompress decoder{}; decoder.UseInput(fin.get()); decoder.Update(flags); @@ -475,11 +447,11 @@ HRESULT DirectX::LoadFromPNGFile( catch (const std::system_error& ec) { image.Release(); - #ifdef _WIN32 +#ifdef _WIN32 return HRESULT_FROM_WIN32(static_cast(ec.code().value())); - #else +#else return (ec.code().value() == ENOENT) ? HRESULT_ERROR_FILE_NOT_FOUND : E_FAIL; - #endif +#endif } catch (const std::invalid_argument&) { @@ -492,18 +464,14 @@ HRESULT DirectX::LoadFromPNGFile( } } -_Use_decl_annotations_ -HRESULT DirectX::SaveToPNGFile( - const Image& image, - PNG_FLAGS flags, - const wchar_t* file) +_Use_decl_annotations_ HRESULT DirectX::SaveToPNGFile(const Image& image, PNG_FLAGS flags, const wchar_t* file) { if (!file) return E_INVALIDARG; try { - auto fout = CreateFILE(file); + auto fout = CreateFILE(file); PNGCompress encoder{}; encoder.UseOutput(fout.get()); return encoder.WriteImage(flags, image); @@ -514,11 +482,11 @@ HRESULT DirectX::SaveToPNGFile( } catch (const std::system_error& ec) { - #ifdef _WIN32 +#ifdef _WIN32 return HRESULT_FROM_WIN32(static_cast(ec.code().value())); - #else +#else return (ec.code().value() == ENOENT) ? HRESULT_ERROR_FILE_NOT_FOUND : E_FAIL; - #endif +#endif } catch (const std::exception&) { diff --git a/Auxiliary/DirectXTexPNG.h b/Auxiliary/DirectXTexPNG.h index e4ff0e8d..e14e365d 100644 --- a/Auxiliary/DirectXTexPNG.h +++ b/Auxiliary/DirectXTexPNG.h @@ -15,7 +15,6 @@ #include "DirectXTex.h" - namespace DirectX { enum PNG_FLAGS : uint32_t @@ -38,21 +37,12 @@ namespace DirectX // Writes linear gamma metadata into the file reguardless of format }; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromPNGFile( - _In_z_ const wchar_t* szFile, - PNG_FLAGS flags, - _Out_ TexMetadata& metadata); + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromPNGFile(_In_z_ const wchar_t* szFile, PNG_FLAGS flags, _Out_ TexMetadata& metadata); - DIRECTX_TEX_API HRESULT __cdecl LoadFromPNGFile( - _In_z_ const wchar_t* szFile, - PNG_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image); + DIRECTX_TEX_API HRESULT __cdecl + LoadFromPNGFile(_In_z_ const wchar_t* szFile, PNG_FLAGS flags, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image); - DIRECTX_TEX_API HRESULT __cdecl SaveToPNGFile( - _In_ const Image& image, - PNG_FLAGS flags, - _In_z_ const wchar_t* szFile); + DIRECTX_TEX_API HRESULT __cdecl SaveToPNGFile(_In_ const Image& image, PNG_FLAGS flags, _In_z_ const wchar_t* szFile); #ifdef __clang__ #pragma clang diagnostic push @@ -60,9 +50,9 @@ namespace DirectX #pragma clang diagnostic ignored "-Wextra-semi-stmt" #endif -DEFINE_ENUM_FLAG_OPERATORS(PNG_FLAGS); + DEFINE_ENUM_FLAG_OPERATORS(PNG_FLAGS); #ifdef __clang__ #pragma clang diagnostic pop #endif -} +} // namespace DirectX diff --git a/Auxiliary/DirectXTexXbox.h b/Auxiliary/DirectXTexXbox.h index 938326a4..b0a8aa4f 100644 --- a/Auxiliary/DirectXTexXbox.h +++ b/Auxiliary/DirectXTexXbox.h @@ -49,121 +49,135 @@ namespace Xbox { #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - using XboxTileMode = XG_SWIZZLE_MODE; + using XboxTileMode = XG_SWIZZLE_MODE; constexpr XboxTileMode c_XboxTileModeInvalid = XG_SWIZZLE_MODE_INVALID; - constexpr XboxTileMode c_XboxTileModeLinear = XG_SWIZZLE_MODE_LINEAR; + constexpr XboxTileMode c_XboxTileModeLinear = XG_SWIZZLE_MODE_LINEAR; #else - using XboxTileMode = XG_TILE_MODE; + using XboxTileMode = XG_TILE_MODE; constexpr XboxTileMode c_XboxTileModeInvalid = XG_TILE_MODE_INVALID; - constexpr XboxTileMode c_XboxTileModeLinear = XG_TILE_MODE_LINEAR; + constexpr XboxTileMode c_XboxTileModeLinear = XG_TILE_MODE_LINEAR; #endif class DIRECTX_TEX_API XboxImage { public: XboxImage() noexcept - : dataSize(0), baseAlignment(0), tilemode(c_XboxTileModeInvalid), metadata{}, memory(nullptr) + : dataSize(0), + baseAlignment(0), + tilemode(c_XboxTileModeInvalid), + metadata{}, + memory(nullptr) {} XboxImage(XboxImage&& moveFrom) noexcept - : dataSize(0), baseAlignment(0), tilemode(c_XboxTileModeInvalid), metadata{}, memory(nullptr) + : dataSize(0), + baseAlignment(0), + tilemode(c_XboxTileModeInvalid), + metadata{}, + memory(nullptr) { *this = std::move(moveFrom); } ~XboxImage() { Release(); } - XboxImage& __cdecl operator= (XboxImage&& moveFrom) noexcept; + XboxImage& __cdecl operator=(XboxImage&& moveFrom) noexcept; - XboxImage(const XboxImage&) = delete; + XboxImage(const XboxImage&) = delete; XboxImage& operator=(const XboxImage&) = delete; HRESULT __cdecl Initialize(_In_ const XG_TEXTURE1D_DESC& desc, _In_ const XG_RESOURCE_LAYOUT& layout, _In_ uint32_t miscFlags2 = 0); HRESULT __cdecl Initialize(_In_ const XG_TEXTURE2D_DESC& desc, _In_ const XG_RESOURCE_LAYOUT& layout, _In_ uint32_t miscFlags2 = 0); HRESULT __cdecl Initialize(_In_ const XG_TEXTURE3D_DESC& desc, _In_ const XG_RESOURCE_LAYOUT& layout, _In_ uint32_t miscFlags2 = 0); - HRESULT __cdecl Initialize(_In_ const DirectX::TexMetadata& mdata, _In_ XboxTileMode tm, _In_ uint32_t size, _In_ uint32_t alignment); + HRESULT __cdecl + Initialize(_In_ const DirectX::TexMetadata& mdata, _In_ XboxTileMode tm, _In_ uint32_t size, _In_ uint32_t alignment); void __cdecl Release(); const DirectX::TexMetadata& GetMetadata() const { return metadata; } - XboxTileMode GetTileMode() const { return tilemode; } + XboxTileMode GetTileMode() const { return tilemode; } uint32_t GetSize() const { return dataSize; } uint32_t GetAlignment() const { return baseAlignment; } uint8_t* GetPointer() const { return memory; } private: - uint32_t dataSize; - uint32_t baseAlignment; - XboxTileMode tilemode; - DirectX::TexMetadata metadata; - uint8_t* memory; + uint32_t dataSize; + uint32_t baseAlignment; + XboxTileMode tilemode; + DirectX::TexMetadata metadata; + uint8_t* memory; }; //--------------------------------------------------------------------------------- // Image I/O - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox); - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSFile( - _In_z_ const wchar_t* szFile, _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox); - - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemoryEx( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox, + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _Out_ DirectX::TexMetadata& metadata, + _Out_ bool& isXbox); + DIRECTX_TEX_API HRESULT __cdecl + GetMetadataFromDDSFile(_In_z_ const wchar_t* szFile, _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox); + + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemoryEx(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _Out_ DirectX::TexMetadata& metadata, + _Out_ bool& isXbox, _Out_opt_ DirectX::DDSMetaData* ddPixelFormat); - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSFileEx( - _In_z_ const wchar_t* szFile, _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox, + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSFileEx(_In_z_ const wchar_t* szFile, + _Out_ DirectX::TexMetadata& metadata, + _Out_ bool& isXbox, _Out_opt_ DirectX::DDSMetaData* ddPixelFormat); - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _Out_opt_ DirectX::TexMetadata* metadata, _Out_ XboxImage& image); - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSFile( - _In_z_ const wchar_t* szFile, - _Out_opt_ DirectX::TexMetadata* metadata, _Out_ XboxImage& image); + DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _Out_opt_ DirectX::TexMetadata* metadata, + _Out_ XboxImage& image); + DIRECTX_TEX_API HRESULT __cdecl + LoadFromDDSFile(_In_z_ const wchar_t* szFile, _Out_opt_ DirectX::TexMetadata* metadata, _Out_ XboxImage& image); - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemoryEx( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, + DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemoryEx(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, _Out_opt_ DirectX::TexMetadata* metadata, _Out_opt_ DirectX::DDSMetaData* ddPixelFormat, - _Out_ XboxImage& image); - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSFileEx( - _In_z_ const wchar_t* szFile, + _Out_ XboxImage& image); + DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSFileEx(_In_z_ const wchar_t* szFile, _Out_opt_ DirectX::TexMetadata* metadata, _Out_opt_ DirectX::DDSMetaData* ddPixelFormat, - _Out_ XboxImage& image); + _Out_ XboxImage& image); DIRECTX_TEX_API HRESULT __cdecl SaveToDDSMemory(_In_ const XboxImage& xbox, _Out_ DirectX::Blob& blob); DIRECTX_TEX_API HRESULT __cdecl SaveToDDSFile(_In_ const XboxImage& xbox, _In_z_ const wchar_t* szFile); #ifdef __cpp_lib_byte - inline HRESULT __cdecl GetMetadataFromDDSMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox) + inline HRESULT __cdecl GetMetadataFromDDSMemory(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _Out_ DirectX::TexMetadata& metadata, + _Out_ bool& isXbox) { return GetMetadataFromDDSMemory(reinterpret_cast(pSource), size, metadata, isXbox); } - inline HRESULT __cdecl GetMetadataFromDDSMemoryEx( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox, + inline HRESULT __cdecl GetMetadataFromDDSMemoryEx(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _Out_ DirectX::TexMetadata& metadata, + _Out_ bool& isXbox, _Out_opt_ DirectX::DDSMetaData* ddPixelFormat) { return GetMetadataFromDDSMemoryEx(reinterpret_cast(pSource), size, metadata, isXbox, ddPixelFormat); } - inline HRESULT __cdecl LoadFromDDSMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _Out_opt_ DirectX::TexMetadata* metadata, _Out_ XboxImage& image) + inline HRESULT __cdecl LoadFromDDSMemory(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _Out_opt_ DirectX::TexMetadata* metadata, + _Out_ XboxImage& image) { return LoadFromDDSMemory(reinterpret_cast(pSource), size, metadata, image); } - inline HRESULT __cdecl LoadFromDDSMemoryEx( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, + inline HRESULT __cdecl LoadFromDDSMemoryEx(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, _Out_opt_ DirectX::TexMetadata* metadata, _Out_opt_ DirectX::DDSMetaData* ddPixelFormat, - _Out_ XboxImage& image) + _Out_ XboxImage& image) { return LoadFromDDSMemoryEx(reinterpret_cast(pSource), size, metadata, ddPixelFormat, image); } @@ -172,10 +186,13 @@ namespace Xbox //--------------------------------------------------------------------------------- // Xbox Texture Tiling / Detiling (requires XG DLL to be present at runtime) - DIRECTX_TEX_API HRESULT __cdecl Tile(_In_ const DirectX::Image& srcImage, _Out_ XboxImage& xbox, _In_ XboxTileMode mode = c_XboxTileModeInvalid); - DIRECTX_TEX_API HRESULT __cdecl Tile( - _In_ const DirectX::Image* srcImages, _In_ size_t nimages, _In_ const DirectX::TexMetadata& metadata, - _Out_ XboxImage& xbox, _In_ XboxTileMode mode = c_XboxTileModeInvalid); + DIRECTX_TEX_API HRESULT __cdecl + Tile(_In_ const DirectX::Image& srcImage, _Out_ XboxImage& xbox, _In_ XboxTileMode mode = c_XboxTileModeInvalid); + DIRECTX_TEX_API HRESULT __cdecl Tile(_In_ const DirectX::Image* srcImages, + _In_ size_t nimages, + _In_ const DirectX::TexMetadata& metadata, + _Out_ XboxImage& xbox, + _In_ XboxTileMode mode = c_XboxTileModeInvalid); DIRECTX_TEX_API HRESULT __cdecl Detile(_In_ const XboxImage& xbox, _Out_ DirectX::ScratchImage& image); @@ -184,13 +201,15 @@ namespace Xbox #if defined(_XBOX_ONE) && defined(_TITLE) && defined(__d3d11_x_h__) - DIRECTX_TEX_API HRESULT __cdecl CreateTexture( - _In_ ID3D11DeviceX* d3dDevice, - _In_ const XboxImage& xbox, _Outptr_opt_ ID3D11Resource** ppResource, _Outptr_ void** grfxMemory); + DIRECTX_TEX_API HRESULT __cdecl CreateTexture(_In_ ID3D11DeviceX* d3dDevice, + _In_ const XboxImage& xbox, + _Outptr_opt_ ID3D11Resource** ppResource, + _Outptr_ void** grfxMemory); - DIRECTX_TEX_API HRESULT __cdecl CreateShaderResourceView( - _In_ ID3D11DeviceX* d3dDevice, - _In_ const XboxImage& xbox, _Outptr_opt_ ID3D11ShaderResourceView** ppSRV, _Outptr_ void** grfxMemory); + DIRECTX_TEX_API HRESULT __cdecl CreateShaderResourceView(_In_ ID3D11DeviceX* d3dDevice, + _In_ const XboxImage& xbox, + _Outptr_opt_ ID3D11ShaderResourceView** ppSRV, + _Outptr_ void** grfxMemory); DIRECTX_TEX_API void __cdecl FreeTextureMemory(_In_ ID3D11DeviceX* d3dDevice, _In_opt_ void* grfxMemory); @@ -201,9 +220,10 @@ namespace Xbox #if ((defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX)) && (defined(__d3d12_x_h__) || defined(__XBOX_D3D12_X__)) - DIRECTX_TEX_API HRESULT __cdecl CreateTexture( - _In_ ID3D12Device* d3dDevice, - _In_ const XboxImage& xbox, _Outptr_opt_ ID3D12Resource** ppResource, _Outptr_ void** grfxMemory); + DIRECTX_TEX_API HRESULT __cdecl CreateTexture(_In_ ID3D12Device* d3dDevice, + _In_ const XboxImage& xbox, + _Outptr_opt_ ID3D12Resource** ppResource, + _Outptr_ void** grfxMemory); DIRECTX_TEX_API void __cdecl FreeTextureMemory(_In_ ID3D12Device* d3dDevice, _In_opt_ void* grfxMemory); @@ -211,17 +231,15 @@ namespace Xbox //--------------------------------------------------------------------------------- // DDS helper functions - DIRECTX_TEX_API HRESULT __cdecl EncodeDDSHeader( - const XboxImage& xbox, - _Out_writes_bytes_(maxsize) uint8_t* pDestination, _In_ size_t maxsize) noexcept; + DIRECTX_TEX_API HRESULT __cdecl + EncodeDDSHeader(const XboxImage& xbox, _Out_writes_bytes_(maxsize) uint8_t* pDestination, _In_ size_t maxsize) noexcept; #ifdef __cpp_lib_byte - inline HRESULT __cdecl EncodeDDSHeader( - const XboxImage& xbox, - _Out_writes_bytes_(maxsize) std::byte* pDestination, _In_ size_t maxsize) noexcept + inline HRESULT __cdecl + EncodeDDSHeader(const XboxImage& xbox, _Out_writes_bytes_(maxsize) std::byte* pDestination, _In_ size_t maxsize) noexcept { return EncodeDDSHeader(xbox, reinterpret_cast(pDestination), maxsize); } #endif -} // namespace +} // namespace Xbox diff --git a/Auxiliary/DirectXTexXboxD3D11X.cpp b/Auxiliary/DirectXTexXboxD3D11X.cpp index b95c8cfa..d277dcd5 100644 --- a/Auxiliary/DirectXTexXboxD3D11X.cpp +++ b/Auxiliary/DirectXTexXboxD3D11X.cpp @@ -25,13 +25,12 @@ namespace //-------------------------------------------------------------------------------------- // Default XMemAlloc attributes for texture loading //-------------------------------------------------------------------------------------- - const uint64_t c_XMemAllocAttributes = MAKE_XALLOC_ATTRIBUTES( - eXALLOCAllocatorId_MiddlewareReservedMin, + const uint64_t c_XMemAllocAttributes = MAKE_XALLOC_ATTRIBUTES(eXALLOCAllocatorId_MiddlewareReservedMin, 0, XALLOC_MEMTYPE_GRAPHICS_WRITECOMBINE_GPU_READONLY, XALLOC_PAGESIZE_64KB, XALLOC_ALIGNMENT_64K); -} +} // namespace //===================================================================================== // Entry-points @@ -40,12 +39,10 @@ namespace //------------------------------------------------------------------------------------- // Create a texture resource //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::CreateTexture( - ID3D11DeviceX* d3dDevice, - const XboxImage& xbox, - ID3D11Resource** ppResource, - void** grfxMemory) +_Use_decl_annotations_ HRESULT Xbox::CreateTexture(ID3D11DeviceX* d3dDevice, + const XboxImage& xbox, + ID3D11Resource** ppResource, + void** grfxMemory) { if (!d3dDevice || !ppResource || !grfxMemory) return E_INVALIDARG; @@ -71,70 +68,65 @@ HRESULT Xbox::CreateTexture( switch (metadata.dimension) { - case DirectX::TEX_DIMENSION_TEXTURE1D: + case DirectX::TEX_DIMENSION_TEXTURE1D: { + D3D11_TEXTURE1D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.ArraySize = static_cast(metadata.arraySize); + desc.Format = metadata.format; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + ID3D11Texture1D* tex = nullptr; + hr = d3dDevice->CreatePlacementTexture1D(&desc, xbox.GetTileMode(), 0, *grfxMemory, &tex); + if (SUCCEEDED(hr) && tex) { - D3D11_TEXTURE1D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = metadata.format; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - - ID3D11Texture1D* tex = nullptr; - hr = d3dDevice->CreatePlacementTexture1D(&desc, xbox.GetTileMode(), 0, *grfxMemory, &tex); - if (SUCCEEDED(hr) && tex) - { - *ppResource = tex; - } + *ppResource = tex; } - break; - - case DirectX::TEX_DIMENSION_TEXTURE2D: + } + break; + + case DirectX::TEX_DIMENSION_TEXTURE2D: { + D3D11_TEXTURE2D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.ArraySize = static_cast(metadata.arraySize); + desc.Format = metadata.format; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.MiscFlags = (metadata.miscFlags & DirectX::TEX_MISC_TEXTURECUBE) ? D3D11_RESOURCE_MISC_TEXTURECUBE : 0; + + ID3D11Texture2D* tex = nullptr; + hr = d3dDevice->CreatePlacementTexture2D(&desc, xbox.GetTileMode(), 0, *grfxMemory, &tex); + if (SUCCEEDED(hr) && tex) { - D3D11_TEXTURE2D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = metadata.format; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - desc.MiscFlags = (metadata.miscFlags & DirectX::TEX_MISC_TEXTURECUBE) ? D3D11_RESOURCE_MISC_TEXTURECUBE : 0; - - ID3D11Texture2D* tex = nullptr; - hr = d3dDevice->CreatePlacementTexture2D(&desc, xbox.GetTileMode(), 0, *grfxMemory, &tex); - if (SUCCEEDED(hr) && tex) - { - *ppResource = tex; - } + *ppResource = tex; } - break; - - case DirectX::TEX_DIMENSION_TEXTURE3D: + } + break; + + case DirectX::TEX_DIMENSION_TEXTURE3D: { + D3D11_TEXTURE3D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.Depth = static_cast(metadata.depth); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.Format = metadata.format; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + + ID3D11Texture3D* tex = nullptr; + hr = d3dDevice->CreatePlacementTexture3D(&desc, xbox.GetTileMode(), 0, *grfxMemory, &tex); + if (SUCCEEDED(hr) && tex) { - D3D11_TEXTURE3D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.Depth = static_cast(metadata.depth); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.Format = metadata.format; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; - - ID3D11Texture3D* tex = nullptr; - hr = d3dDevice->CreatePlacementTexture3D(&desc, xbox.GetTileMode(), 0, *grfxMemory, &tex); - if (SUCCEEDED(hr) && tex) - { - *ppResource = tex; - } + *ppResource = tex; } - break; + } + break; - default: - hr = E_FAIL; - break; + default: hr = E_FAIL; break; } if (FAILED(hr)) @@ -146,16 +138,13 @@ HRESULT Xbox::CreateTexture( return hr; } - //------------------------------------------------------------------------------------- // Create a shader resource view and associated texture //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::CreateShaderResourceView( - ID3D11DeviceX* d3dDevice, - const XboxImage& xbox, - ID3D11ShaderResourceView** ppSRV, - void** grfxMemory) +_Use_decl_annotations_ HRESULT Xbox::CreateShaderResourceView(ID3D11DeviceX* d3dDevice, + const XboxImage& xbox, + ID3D11ShaderResourceView** ppSRV, + void** grfxMemory) { if (!ppSRV) return E_INVALIDARG; @@ -163,7 +152,7 @@ HRESULT Xbox::CreateShaderResourceView( *ppSRV = nullptr; ComPtr resource; - HRESULT hr = CreateTexture(d3dDevice, xbox, resource.GetAddressOf(), grfxMemory); + HRESULT hr = CreateTexture(d3dDevice, xbox, resource.GetAddressOf(), grfxMemory); if (FAILED(hr)) return hr; @@ -172,20 +161,20 @@ HRESULT Xbox::CreateShaderResourceView( auto& metadata = xbox.GetMetadata(); D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; - SRVDesc.Format = metadata.format; + SRVDesc.Format = metadata.format; switch (metadata.dimension) { case DirectX::TEX_DIMENSION_TEXTURE1D: if (metadata.arraySize > 1) { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; SRVDesc.Texture1DArray.MipLevels = static_cast(metadata.mipLevels); SRVDesc.Texture1DArray.ArraySize = static_cast(metadata.arraySize); } else { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; SRVDesc.Texture1D.MipLevels = static_cast(metadata.mipLevels); } break; @@ -196,32 +185,32 @@ HRESULT Xbox::CreateShaderResourceView( if (metadata.arraySize > 6) { assert((metadata.arraySize % 6) == 0); - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; SRVDesc.TextureCubeArray.MipLevels = static_cast(metadata.mipLevels); - SRVDesc.TextureCubeArray.NumCubes = static_cast(metadata.arraySize / 6); + SRVDesc.TextureCubeArray.NumCubes = static_cast(metadata.arraySize / 6); } else { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; SRVDesc.TextureCube.MipLevels = static_cast(metadata.mipLevels); } } else if (metadata.arraySize > 1) { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; SRVDesc.Texture2DArray.MipLevels = static_cast(metadata.mipLevels); SRVDesc.Texture2DArray.ArraySize = static_cast(metadata.arraySize); } else { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; SRVDesc.Texture2D.MipLevels = static_cast(metadata.mipLevels); } break; case DirectX::TEX_DIMENSION_TEXTURE3D: assert(metadata.arraySize == 1); - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; SRVDesc.Texture3D.MipLevels = static_cast(metadata.mipLevels); break; @@ -242,12 +231,10 @@ HRESULT Xbox::CreateShaderResourceView( return hr; } - //------------------------------------------------------------------------------------- // Free allocated graphics memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void Xbox::FreeTextureMemory(ID3D11DeviceX* d3dDevice, void* grfxMemory) +_Use_decl_annotations_ void Xbox::FreeTextureMemory(ID3D11DeviceX* d3dDevice, void* grfxMemory) { UNREFERENCED_PARAMETER(d3dDevice); // used only for overload resolution diff --git a/Auxiliary/DirectXTexXboxD3D12X.cpp b/Auxiliary/DirectXTexXboxD3D12X.cpp index 63e8534e..e2d0b64c 100644 --- a/Auxiliary/DirectXTexXboxD3D12X.cpp +++ b/Auxiliary/DirectXTexXboxD3D12X.cpp @@ -27,17 +27,17 @@ namespace //-------------------------------------------------------------------------------------- // Default XMemAlloc attributes for texture loading //-------------------------------------------------------------------------------------- - const uint64_t c_XMemAllocAttributes = MAKE_XALLOC_ATTRIBUTES( - eXALLOCAllocatorId_MiddlewareReservedMin, + const uint64_t c_XMemAllocAttributes = MAKE_XALLOC_ATTRIBUTES(eXALLOCAllocatorId_MiddlewareReservedMin, 0, XALLOC_MEMTYPE_GRAPHICS_WRITECOMBINE_GPU_READONLY, XALLOC_PAGESIZE_64KB, XALLOC_ALIGNMENT_64K - #ifdef _GAMING_XBOX - , 0 - #endif +#ifdef _GAMING_XBOX + , + 0 +#endif ); -} +} // namespace //===================================================================================== // Entry-points @@ -46,12 +46,10 @@ namespace //------------------------------------------------------------------------------------- // Create a texture resource //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::CreateTexture( - ID3D12Device* d3dDevice, - const XboxImage& xbox, - ID3D12Resource** ppResource, - void** grfxMemory) +_Use_decl_annotations_ HRESULT Xbox::CreateTexture(ID3D12Device* d3dDevice, + const XboxImage& xbox, + ID3D12Resource** ppResource, + void** grfxMemory) { if (!d3dDevice || !ppResource || !grfxMemory) return E_INVALIDARG; @@ -74,19 +72,19 @@ HRESULT Xbox::CreateTexture( auto& metadata = xbox.GetMetadata(); D3D12_RESOURCE_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.DepthOrArraySize = (metadata.dimension == DirectX::TEX_DIMENSION_TEXTURE3D) ? static_cast(metadata.depth) : static_cast(metadata.arraySize); - desc.Format = metadata.format; - desc.Flags = D3D12_RESOURCE_FLAG_NONE; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Dimension = static_cast(metadata.dimension); - desc.Layout = static_cast(0x100 | xbox.GetTileMode()); - - HRESULT hr = d3dDevice->CreatePlacedResourceX( - reinterpret_cast(*grfxMemory), + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.DepthOrArraySize = (metadata.dimension == DirectX::TEX_DIMENSION_TEXTURE3D) ? static_cast(metadata.depth) : + static_cast(metadata.arraySize); + desc.Format = metadata.format; + desc.Flags = D3D12_RESOURCE_FLAG_NONE; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Dimension = static_cast(metadata.dimension); + desc.Layout = static_cast(0x100 | xbox.GetTileMode()); + + HRESULT hr = d3dDevice->CreatePlacedResourceX(reinterpret_cast(*grfxMemory), &desc, D3D12_RESOURCE_STATE_PIXEL_SHADER_RESOURCE, nullptr, @@ -101,12 +99,10 @@ HRESULT Xbox::CreateTexture( return hr; } - //------------------------------------------------------------------------------------- // Free allocated graphics memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void Xbox::FreeTextureMemory(ID3D12Device* d3dDevice, void* grfxMemory) +_Use_decl_annotations_ void Xbox::FreeTextureMemory(ID3D12Device* d3dDevice, void* grfxMemory) { UNREFERENCED_PARAMETER(d3dDevice); // used only for overload resolution diff --git a/Auxiliary/DirectXTexXboxDDS.cpp b/Auxiliary/DirectXTexXboxDDS.cpp index b206d2f5..095f1364 100644 --- a/Auxiliary/DirectXTexXboxDDS.cpp +++ b/Auxiliary/DirectXTexXboxDDS.cpp @@ -26,14 +26,13 @@ namespace //------------------------------------------------------------------------------------- // Decodes DDS header using XBOX extended header (variant of DX10 header) //------------------------------------------------------------------------------------- - HRESULT DecodeDDSHeader( - _In_reads_bytes_(size) const uint8_t* pSource, - size_t size, - DirectX::TexMetadata& metadata, - _Out_opt_ DDSMetaData* ddPixelFormat, - _Out_opt_ XboxTileMode* tmode, - _Out_opt_ uint32_t* dataSize, - _Out_opt_ uint32_t* baseAlignment) + HRESULT DecodeDDSHeader(_In_reads_bytes_(size) const uint8_t* pSource, + size_t size, + DirectX::TexMetadata& metadata, + _Out_opt_ DDSMetaData* ddPixelFormat, + _Out_opt_ XboxTileMode* tmode, + _Out_opt_ uint32_t* dataSize, + _Out_opt_ uint32_t* baseAlignment) { if (!pSource) return E_INVALIDARG; @@ -73,8 +72,7 @@ namespace auto pHeader = reinterpret_cast(reinterpret_cast(pSource) + sizeof(uint32_t)); // Verify header to validate DDS file - if (pHeader->size != sizeof(DDS_HEADER) - || pHeader->ddspf.size != sizeof(DDS_PIXELFORMAT)) + if (pHeader->size != sizeof(DDS_HEADER) || pHeader->ddspf.size != sizeof(DDS_PIXELFORMAT)) { return E_FAIL; } @@ -84,8 +82,7 @@ namespace metadata.mipLevels = 1; // Check for XBOX extension - if (!(pHeader->ddspf.flags & DDS_FOURCC) - || (MAKEFOURCC('X', 'B', 'O', 'X') != pHeader->ddspf.fourCC)) + if (!(pHeader->ddspf.flags & DDS_FOURCC) || (MAKEFOURCC('X', 'B', 'O', 'X') != pHeader->ddspf.fourCC)) { // We know it's a DDS file, but it's not an XBOX extension return S_FALSE; @@ -97,8 +94,7 @@ namespace return E_FAIL; } - auto xboxext = reinterpret_cast( - reinterpret_cast(pSource) + DDS_MIN_HEADER_SIZE); + auto xboxext = reinterpret_cast(reinterpret_cast(pSource) + DDS_MIN_HEADER_SIZE); metadata.arraySize = xboxext->arraySize; if (metadata.arraySize == 0) @@ -125,9 +121,9 @@ namespace return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); } - metadata.width = pHeader->width; - metadata.height = 1; - metadata.depth = 1; + metadata.width = pHeader->width; + metadata.height = 1; + metadata.depth = 1; metadata.dimension = TEX_DIMENSION_TEXTURE1D; break; @@ -138,9 +134,9 @@ namespace metadata.arraySize *= 6; } - metadata.width = pHeader->width; - metadata.height = pHeader->height; - metadata.depth = 1; + metadata.width = pHeader->width; + metadata.height = pHeader->height; + metadata.depth = 1; metadata.dimension = TEX_DIMENSION_TEXTURE2D; break; @@ -153,14 +149,13 @@ namespace if (metadata.arraySize > 1) return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - metadata.width = pHeader->width; - metadata.height = pHeader->height; - metadata.depth = pHeader->depth; + metadata.width = pHeader->width; + metadata.height = pHeader->height; + metadata.depth = pHeader->depth; metadata.dimension = TEX_DIMENSION_TEXTURE3D; break; - default: - return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); + default: return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); } if (static_cast(xboxext->tileMode) == c_XboxTileModeInvalid) @@ -168,23 +163,25 @@ namespace return HRESULT_FROM_WIN32(ERROR_INVALID_DATA); } - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) else if (!(xboxext->tileMode & XBOX_TILEMODE_SCARLETT)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } - #else +#else else if (xboxext->tileMode & XBOX_TILEMODE_SCARLETT) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } - #endif +#endif - static_assert(static_cast(TEX_MISC2_ALPHA_MODE_MASK) == static_cast(DDS_MISC_FLAGS2_ALPHA_MODE_MASK), "DDS header mismatch"); + static_assert(static_cast(TEX_MISC2_ALPHA_MODE_MASK) == static_cast(DDS_MISC_FLAGS2_ALPHA_MODE_MASK), + "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_UNKNOWN) == static_cast(DDS_ALPHA_MODE_UNKNOWN), "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_STRAIGHT) == static_cast(DDS_ALPHA_MODE_STRAIGHT), "DDS header mismatch"); - static_assert(static_cast(TEX_ALPHA_MODE_PREMULTIPLIED) == static_cast(DDS_ALPHA_MODE_PREMULTIPLIED), "DDS header mismatch"); + static_assert(static_cast(TEX_ALPHA_MODE_PREMULTIPLIED) == static_cast(DDS_ALPHA_MODE_PREMULTIPLIED), + "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_OPAQUE) == static_cast(DDS_ALPHA_MODE_OPAQUE), "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_CUSTOM) == static_cast(DDS_ALPHA_MODE_CUSTOM), "DDS header mismatch"); @@ -204,20 +201,19 @@ namespace // Handle DDS-specific metadata if (ddPixelFormat) { - ddPixelFormat->size = pHeader->ddspf.size; - ddPixelFormat->flags = pHeader->ddspf.flags; - ddPixelFormat->fourCC = pHeader->ddspf.fourCC; + ddPixelFormat->size = pHeader->ddspf.size; + ddPixelFormat->flags = pHeader->ddspf.flags; + ddPixelFormat->fourCC = pHeader->ddspf.fourCC; ddPixelFormat->RGBBitCount = pHeader->ddspf.RGBBitCount; - ddPixelFormat->RBitMask = pHeader->ddspf.RBitMask; - ddPixelFormat->GBitMask = pHeader->ddspf.GBitMask; - ddPixelFormat->BBitMask = pHeader->ddspf.BBitMask; - ddPixelFormat->ABitMask = pHeader->ddspf.ABitMask; + ddPixelFormat->RBitMask = pHeader->ddspf.RBitMask; + ddPixelFormat->GBitMask = pHeader->ddspf.GBitMask; + ddPixelFormat->BBitMask = pHeader->ddspf.BBitMask; + ddPixelFormat->ABitMask = pHeader->ddspf.ABitMask; } return S_OK; } -} - +} // namespace //===================================================================================== // Entry-points @@ -226,11 +222,7 @@ namespace //------------------------------------------------------------------------------------- // Encodes DDS file header (magic value, header, XBOX extended header) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::EncodeDDSHeader( - const XboxImage& xbox, - uint8_t* pDestination, - size_t maxsize) noexcept +_Use_decl_annotations_ HRESULT Xbox::EncodeDDSHeader(const XboxImage& xbox, uint8_t* pDestination, size_t maxsize) noexcept { if (!pDestination) return E_INVALIDARG; @@ -243,9 +235,9 @@ HRESULT Xbox::EncodeDDSHeader( auto header = reinterpret_cast(reinterpret_cast(pDestination) + sizeof(uint32_t)); memset(header, 0, sizeof(DDS_HEADER)); - header->size = sizeof(DDS_HEADER); + header->size = sizeof(DDS_HEADER); header->flags = DDS_HEADER_FLAGS_TEXTURE; - header->caps = DDS_SURFACE_FLAGS_TEXTURE; + header->caps = DDS_SURFACE_FLAGS_TEXTURE; auto& metadata = xbox.GetMetadata(); @@ -268,18 +260,17 @@ HRESULT Xbox::EncodeDDSHeader( if (metadata.width > UINT32_MAX) return E_INVALIDARG; - header->width = static_cast(metadata.width); + header->width = static_cast(metadata.width); header->height = header->depth = 1; break; case TEX_DIMENSION_TEXTURE2D: - if (metadata.height > UINT32_MAX - || metadata.width > UINT32_MAX) + if (metadata.height > UINT32_MAX || metadata.width > UINT32_MAX) return E_INVALIDARG; header->height = static_cast(metadata.height); - header->width = static_cast(metadata.width); - header->depth = 1; + header->width = static_cast(metadata.width); + header->depth = 1; if (metadata.IsCubemap()) { @@ -289,27 +280,23 @@ HRESULT Xbox::EncodeDDSHeader( break; case TEX_DIMENSION_TEXTURE3D: - if (metadata.height > UINT32_MAX - || metadata.width > UINT32_MAX - || metadata.depth > UINT32_MAX) + if (metadata.height > UINT32_MAX || metadata.width > UINT32_MAX || metadata.depth > UINT32_MAX) return E_INVALIDARG; header->flags |= DDS_HEADER_FLAGS_VOLUME; header->caps2 |= DDS_FLAGS_VOLUME; header->height = static_cast(metadata.height); - header->width = static_cast(metadata.width); - header->depth = static_cast(metadata.depth); + header->width = static_cast(metadata.width); + header->depth = static_cast(metadata.depth); break; - default: - return E_FAIL; + default: return E_FAIL; } size_t rowPitch, slicePitch; ComputePitch(metadata.format, metadata.width, metadata.height, rowPitch, slicePitch, CP_FLAGS_NONE); - if (slicePitch > UINT32_MAX - || rowPitch > UINT32_MAX) + if (slicePitch > UINT32_MAX || rowPitch > UINT32_MAX) return E_FAIL; if (IsCompressed(metadata.format)) @@ -329,7 +316,7 @@ HRESULT Xbox::EncodeDDSHeader( auto xboxext = reinterpret_cast(reinterpret_cast(header) + sizeof(DDS_HEADER)); memset(xboxext, 0, sizeof(DDS_HEADER_XBOX)); - xboxext->dxgiFormat = metadata.format; + xboxext->dxgiFormat = metadata.format; xboxext->resourceDimension = metadata.dimension; if (metadata.arraySize > UINT32_MAX) @@ -366,7 +353,7 @@ HRESULT Xbox::EncodeDDSHeader( #endif xboxext->baseAlignment = xbox.GetAlignment(); - xboxext->dataSize = xbox.GetSize(); + xboxext->dataSize = xbox.GetSize(); #ifdef _GXDK_VER xboxext->xdkVer = _GXDK_VER; #elif defined(_XDK_VER) @@ -376,28 +363,17 @@ HRESULT Xbox::EncodeDDSHeader( return S_OK; } - //------------------------------------------------------------------------------------- // Obtain metadata from DDS file in memory/on disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::GetMetadataFromDDSMemory( - const uint8_t* pSource, - size_t size, - TexMetadata& metadata, - bool& isXbox) +_Use_decl_annotations_ HRESULT Xbox::GetMetadataFromDDSMemory(const uint8_t* pSource, size_t size, TexMetadata& metadata, bool& isXbox) { return Xbox::GetMetadataFromDDSMemoryEx(pSource, size, metadata, isXbox, nullptr); } -_Use_decl_annotations_ -HRESULT Xbox::GetMetadataFromDDSMemoryEx( - const uint8_t* pSource, - size_t size, - TexMetadata& metadata, - bool& isXbox, - DDSMetaData* ddPixelFormat) +_Use_decl_annotations_ HRESULT +Xbox::GetMetadataFromDDSMemoryEx(const uint8_t* pSource, size_t size, TexMetadata& metadata, bool& isXbox, DDSMetaData* ddPixelFormat) { if (!pSource || !size) return E_INVALIDARG; @@ -418,31 +394,22 @@ HRESULT Xbox::GetMetadataFromDDSMemoryEx( return hr; } -_Use_decl_annotations_ -HRESULT Xbox::GetMetadataFromDDSFile( - const wchar_t* szFile, - TexMetadata& metadata, - bool& isXbox) +_Use_decl_annotations_ HRESULT Xbox::GetMetadataFromDDSFile(const wchar_t* szFile, TexMetadata& metadata, bool& isXbox) { return Xbox::GetMetadataFromDDSFileEx(szFile, metadata, isXbox, nullptr); } -_Use_decl_annotations_ -HRESULT Xbox::GetMetadataFromDDSFileEx( - const wchar_t* szFile, - TexMetadata& metadata, - bool& isXbox, - DDSMetaData* ddPixelFormat) +_Use_decl_annotations_ HRESULT Xbox::GetMetadataFromDDSFileEx(const wchar_t* szFile, + TexMetadata& metadata, + bool& isXbox, + DDSMetaData* ddPixelFormat) { if (!szFile) return E_INVALIDARG; isXbox = false; - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -490,38 +457,27 @@ HRESULT Xbox::GetMetadataFromDDSFileEx( return hr; } - //------------------------------------------------------------------------------------- // Load a DDS file in memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::LoadFromDDSMemory( - const uint8_t* pSource, - size_t size, - TexMetadata* metadata, - XboxImage& xbox) +_Use_decl_annotations_ HRESULT Xbox::LoadFromDDSMemory(const uint8_t* pSource, size_t size, TexMetadata* metadata, XboxImage& xbox) { return Xbox::LoadFromDDSMemoryEx(pSource, size, metadata, nullptr, xbox); } -_Use_decl_annotations_ -HRESULT Xbox::LoadFromDDSMemoryEx( - const uint8_t* pSource, - size_t size, - TexMetadata* metadata, - DDSMetaData* ddPixelFormat, - XboxImage& xbox) +_Use_decl_annotations_ HRESULT +Xbox::LoadFromDDSMemoryEx(const uint8_t* pSource, size_t size, TexMetadata* metadata, DDSMetaData* ddPixelFormat, XboxImage& xbox) { if (!pSource || !size) return E_INVALIDARG; xbox.Release(); - TexMetadata mdata; - uint32_t dataSize; - uint32_t baseAlignment; + TexMetadata mdata; + uint32_t dataSize; + uint32_t baseAlignment; XboxTileMode tmode; - HRESULT hr = DecodeDDSHeader(pSource, size, mdata, ddPixelFormat, &tmode, &dataSize, &baseAlignment); + HRESULT hr = DecodeDDSHeader(pSource, size, mdata, ddPixelFormat, &tmode, &dataSize, &baseAlignment); if (hr == S_FALSE) { // It's a DDS, but not an XBOX variant @@ -564,35 +520,25 @@ HRESULT Xbox::LoadFromDDSMemoryEx( return S_OK; } - //------------------------------------------------------------------------------------- // Load a DDS file from disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::LoadFromDDSFile( - const wchar_t* szFile, - TexMetadata* metadata, - XboxImage& xbox) +_Use_decl_annotations_ HRESULT Xbox::LoadFromDDSFile(const wchar_t* szFile, TexMetadata* metadata, XboxImage& xbox) { return Xbox::LoadFromDDSFileEx(szFile, metadata, nullptr, xbox); } -_Use_decl_annotations_ -HRESULT Xbox::LoadFromDDSFileEx( - const wchar_t* szFile, - TexMetadata* metadata, - DDSMetaData* ddPixelFormat, - XboxImage& xbox) +_Use_decl_annotations_ HRESULT Xbox::LoadFromDDSFileEx(const wchar_t* szFile, + TexMetadata* metadata, + DDSMetaData* ddPixelFormat, + XboxImage& xbox) { if (!szFile) return E_INVALIDARG; xbox.Release(); - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -626,11 +572,11 @@ HRESULT Xbox::LoadFromDDSFileEx( return HRESULT_FROM_WIN32(GetLastError()); } - TexMetadata mdata; + TexMetadata mdata; XboxTileMode tmode; - uint32_t dataSize; - uint32_t baseAlignment; - HRESULT hr = DecodeDDSHeader(header, bytesRead, mdata, ddPixelFormat, &tmode, &dataSize, &baseAlignment); + uint32_t dataSize; + uint32_t baseAlignment; + HRESULT hr = DecodeDDSHeader(header, bytesRead, mdata, ddPixelFormat, &tmode, &dataSize, &baseAlignment); if (hr == S_FALSE) { // It's a DDS, but not an XBOX variant @@ -672,12 +618,10 @@ HRESULT Xbox::LoadFromDDSFileEx( return S_OK; } - //------------------------------------------------------------------------------------- // Save a DDS file to memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::SaveToDDSMemory(const XboxImage& xbox, Blob& blob) +_Use_decl_annotations_ HRESULT Xbox::SaveToDDSMemory(const XboxImage& xbox, Blob& blob) { if (!xbox.GetPointer() || !xbox.GetSize() || !xbox.GetAlignment()) return E_INVALIDARG; @@ -720,27 +664,22 @@ HRESULT Xbox::SaveToDDSMemory(const XboxImage& xbox, Blob& blob) return S_OK; } - //------------------------------------------------------------------------------------- // Save a DDS file to disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::SaveToDDSFile(const XboxImage& xbox, const wchar_t* szFile) +_Use_decl_annotations_ HRESULT Xbox::SaveToDDSFile(const XboxImage& xbox, const wchar_t* szFile) { if (!szFile || !xbox.GetPointer() || !xbox.GetSize() || !xbox.GetAlignment()) return E_INVALIDARG; // Create DDS Header uint8_t header[DDS_XBOX_HEADER_SIZE] = {}; - HRESULT hr = EncodeDDSHeader(xbox, header, DDS_XBOX_HEADER_SIZE); + HRESULT hr = EncodeDDSHeader(xbox, header, DDS_XBOX_HEADER_SIZE); if (FAILED(hr)) return hr; // Create file and write header - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_WRITE, 0, CREATE_ALWAYS, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -771,7 +710,6 @@ HRESULT Xbox::SaveToDDSFile(const XboxImage& xbox, const wchar_t* szFile) return S_OK; } - //-------------------------------------------------------------------------------------- // Adapters for /Zc:wchar_t- clients @@ -779,36 +717,28 @@ HRESULT Xbox::SaveToDDSFile(const XboxImage& xbox, const wchar_t* szFile) namespace Xbox { - HRESULT __cdecl GetMetadataFromDDSFile( - _In_z_ const __wchar_t* szFile, - _Out_ DirectX::TexMetadata& metadata, - _Out_ bool& isXbox) + HRESULT __cdecl GetMetadataFromDDSFile(_In_z_ const __wchar_t* szFile, _Out_ DirectX::TexMetadata& metadata, _Out_ bool& isXbox) { return GetMetadataFromDDSFile(reinterpret_cast(szFile), metadata, isXbox); } - HRESULT __cdecl GetMetadataFromDDSFileEx( - _In_z_ const __wchar_t* szFile, + HRESULT __cdecl GetMetadataFromDDSFileEx(_In_z_ const __wchar_t* szFile, _Out_ DirectX::TexMetadata& metadata, - _Out_ bool& isXbox, + _Out_ bool& isXbox, _Out_opt_ DirectX::DDSMetaData* ddPixelFormat) { return GetMetadataFromDDSFileEx(reinterpret_cast(szFile), metadata, isXbox, ddPixelFormat); } - HRESULT __cdecl LoadFromDDSFile( - _In_z_ const __wchar_t* szFile, - _Out_opt_ DirectX::TexMetadata* metadata, - _Out_ XboxImage& image) + HRESULT __cdecl LoadFromDDSFile(_In_z_ const __wchar_t* szFile, _Out_opt_ DirectX::TexMetadata* metadata, _Out_ XboxImage& image) { return LoadFromDDSFile(reinterpret_cast(szFile), metadata, image); } - HRESULT __cdecl LoadFromDDSFileEx( - _In_z_ const __wchar_t* szFile, + HRESULT __cdecl LoadFromDDSFileEx(_In_z_ const __wchar_t* szFile, _Out_opt_ DirectX::TexMetadata* metadata, _Out_opt_ DirectX::DDSMetaData* ddPixelFormat, - _Out_ XboxImage& image) + _Out_ XboxImage& image) { return LoadFromDDSFileEx(reinterpret_cast(szFile), metadata, ddPixelFormat, image); } @@ -817,6 +747,6 @@ namespace Xbox { return SaveToDDSFile(xbox, reinterpret_cast(szFile)); } -} +} // namespace Xbox #endif // !_NATIVE_WCHAR_T_DEFINED diff --git a/Auxiliary/DirectXTexXboxDetile.cpp b/Auxiliary/DirectXTexXboxDetile.cpp index 29807839..1600d8d2 100644 --- a/Auxiliary/DirectXTexXboxDetile.cpp +++ b/Auxiliary/DirectXTexXboxDetile.cpp @@ -18,18 +18,17 @@ using namespace Xbox; namespace { //---------------------------------------------------------------------------------- - inline HRESULT DetileByElement1D( - const XboxImage& xbox, - uint32_t level, - _In_ XGTextureAddressComputer* computer, - const XG_RESOURCE_LAYOUT& layout, - _In_reads_(nimages) const Image* const * result, - size_t nimages, - size_t bpp, - size_t w, - bool packed) + inline HRESULT DetileByElement1D(const XboxImage& xbox, + uint32_t level, + _In_ XGTextureAddressComputer* computer, + const XG_RESOURCE_LAYOUT& layout, + _In_reads_(nimages) const Image* const* result, + size_t nimages, + size_t bpp, + size_t w, + bool packed) { - const uint8_t* sptr = xbox.GetPointer(); + const uint8_t* sptr = xbox.GetPointer(); const uint8_t* endPtr = sptr + layout.SizeBytes; assert((nimages > 0) && (nimages <= UINT32_MAX)); @@ -49,12 +48,19 @@ namespace for (size_t x = 0; x < w; ++x) { - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) const UINT64 element = (packed) ? (x >> 1) : x; - const size_t offset = computer->GetTexelElementOffsetBytes(0, static_cast(level), element, 0, static_cast(item), 0, nullptr); - #else - const size_t offset = computer->GetTexelElementOffsetBytes(0, static_cast(level), x, 0, static_cast(item), 0); - #endif + const size_t offset = computer->GetTexelElementOffsetBytes(0, + static_cast(level), + element, + 0, + static_cast(item), + 0, + nullptr); +#else + const size_t offset + = computer->GetTexelElementOffsetBytes(0, static_cast(level), x, 0, static_cast(item), 0); +#endif if (offset == size_t(-1)) return E_FAIL; @@ -77,13 +83,12 @@ namespace //------------------------------------------------------------------------------------- // 1D Tiling //------------------------------------------------------------------------------------- - HRESULT Detile1D( - const XboxImage& xbox, - uint32_t level, - _In_ XGTextureAddressComputer* computer, - const XG_RESOURCE_LAYOUT& layout, + HRESULT Detile1D(const XboxImage& xbox, + uint32_t level, + _In_ XGTextureAddressComputer* computer, + const XG_RESOURCE_LAYOUT& layout, _In_reads_(nimages) const Image** result, - size_t nimages) + size_t nimages) { if (!nimages || nimages > UINT32_MAX) return E_INVALIDARG; @@ -100,10 +105,10 @@ namespace assert(!IsCompressed(format)); bool byelement = IsTypeless(format); - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) if (nimages > 1) byelement = true; - #endif +#endif if (IsPacked(format)) { @@ -137,14 +142,14 @@ namespace auto scanline = make_AlignedArrayXMVECTOR(tiledPixels + result[0]->width); XMVECTOR* target = scanline.get(); - XMVECTOR* tiled = target + result[0]->width; + XMVECTOR* tiled = target + result[0]->width; - #ifdef _DEBUG +#ifdef _DEBUG memset(target, 0xCD, sizeof(XMVECTOR) * result[0]->width); memset(tiled, 0xDD, sizeof(XMVECTOR) * tiledPixels); - #endif +#endif - // Load tiled texture + // Load tiled texture if ((xbox.GetSize() - mip.OffsetBytes) < mip.SizeBytes) return E_FAIL; @@ -165,11 +170,11 @@ namespace for (size_t x = 0; x < img->width; ++x) { - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0, nullptr); - #else +#else size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0); - #endif +#endif if (offset == size_t(-1)) return E_FAIL; @@ -190,16 +195,14 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // 2D Tiling //------------------------------------------------------------------------------------- - HRESULT Detile2D( - const XboxImage& xbox, - uint32_t level, - _In_ XGTextureAddressComputer* computer, + HRESULT Detile2D(const XboxImage& xbox, + uint32_t level, + _In_ XGTextureAddressComputer* computer, _In_reads_(nimages) const Image** result, - size_t nimages) + size_t nimages) { if (!nimages || nimages > UINT32_MAX) return E_INVALIDARG; @@ -209,7 +212,7 @@ namespace assert(xbox.GetMetadata().format == result[0]->format); - uint8_t* baseAddr = xbox.GetPointer(); + uint8_t* baseAddr = xbox.GetPointer(); const auto& metadata = xbox.GetMetadata(); for (size_t item = 0; item < nimages; ++item) @@ -223,13 +226,12 @@ namespace assert(img->rowPitch == result[0]->rowPitch); assert(img->format == result[0]->format); - HRESULT hr = computer->CopyFromSubresource( - img->pixels, + HRESULT hr = computer->CopyFromSubresource(img->pixels, 0u, metadata.CalculateSubresource(level, item), - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) 0u, - #endif +#endif baseAddr, static_cast(img->rowPitch), 0u); @@ -242,36 +244,30 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // 3D Tiling //------------------------------------------------------------------------------------- - HRESULT Detile3D( - const XboxImage& xbox, - uint32_t level, - _In_ XGTextureAddressComputer* computer, - const Image& result) + HRESULT Detile3D(const XboxImage& xbox, uint32_t level, _In_ XGTextureAddressComputer* computer, const Image& result) { if (!computer || !xbox.GetPointer() || !result.pixels) return E_POINTER; assert(xbox.GetMetadata().format == result.format); - uint8_t* baseAddr = xbox.GetPointer(); + uint8_t* baseAddr = xbox.GetPointer(); const auto& metadata = xbox.GetMetadata(); - return computer->CopyFromSubresource( - result.pixels, + return computer->CopyFromSubresource(result.pixels, 0u, metadata.CalculateSubresource(level, 0), - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) 0u, - #endif +#endif baseAddr, static_cast(result.rowPitch), static_cast(result.slicePitch)); } -} +} // namespace //===================================================================================== // Entry-points @@ -280,10 +276,7 @@ namespace //------------------------------------------------------------------------------------- // Detile image //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::Detile( - const XboxImage& xbox, - DirectX::ScratchImage& image) +_Use_decl_annotations_ HRESULT Xbox::Detile(const XboxImage& xbox, DirectX::ScratchImage& image) { if (!xbox.GetSize() || !xbox.GetPointer() || xbox.GetTileMode() == c_XboxTileModeInvalid) return E_INVALIDARG; @@ -292,8 +285,7 @@ HRESULT Xbox::Detile( auto& metadata = xbox.GetMetadata(); - if (metadata.format == DXGI_FORMAT_R1_UNORM - || IsVideo(metadata.format)) + if (metadata.format == DXGI_FORMAT_R1_UNORM || IsVideo(metadata.format)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } @@ -303,256 +295,242 @@ HRESULT Xbox::Detile( case DXGI_FORMAT_R32G32B32_TYPELESS: case DXGI_FORMAT_R32G32B32_FLOAT: case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + case DXGI_FORMAT_R32G32B32_SINT: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - default: - break; + default: break; } XG_RESOURCE_LAYOUT layout = {}; switch (metadata.dimension) { - case TEX_DIMENSION_TEXTURE1D: - { - if (metadata.width > D3D11_REQ_TEXTURE1D_U_DIMENSION - || metadata.mipLevels > D3D11_REQ_MIP_LEVELS - || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) - return E_INVALIDARG; - - XG_TEXTURE1D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = static_cast(metadata.format); - desc.Usage = XG_USAGE_DEFAULT; - desc.BindFlags = XG_BIND_SHADER_RESOURCE; - desc.MiscFlags = (metadata.IsCubemap()) ? XG_RESOURCE_MISC_TEXTURECUBE : 0; - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - desc.SwizzleMode = xbox.GetTileMode(); - #else - desc.TileMode = xbox.GetTileMode(); - #endif - - ComPtr computer; - HRESULT hr = XGCreateTexture1DComputer(&desc, computer.GetAddressOf()); - if (FAILED(hr)) - return hr; - - hr = computer->GetResourceLayout(&layout); - if (FAILED(hr)) - return hr; - - if (layout.Planes != 1) - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - - if (layout.SizeBytes != xbox.GetSize() - || layout.BaseAlignmentBytes != xbox.GetAlignment()) - return E_UNEXPECTED; - - hr = image.Initialize(metadata); - if (FAILED(hr)) - return hr; + case TEX_DIMENSION_TEXTURE1D: { + if (metadata.width > D3D11_REQ_TEXTURE1D_U_DIMENSION || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) + return E_INVALIDARG; - for (size_t level = 0; level < metadata.mipLevels; ++level) + XG_TEXTURE1D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.ArraySize = static_cast(metadata.arraySize); + desc.Format = static_cast(metadata.format); + desc.Usage = XG_USAGE_DEFAULT; + desc.BindFlags = XG_BIND_SHADER_RESOURCE; + desc.MiscFlags = (metadata.IsCubemap()) ? XG_RESOURCE_MISC_TEXTURECUBE : 0; +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + desc.SwizzleMode = xbox.GetTileMode(); +#else + desc.TileMode = xbox.GetTileMode(); +#endif + + ComPtr computer; + HRESULT hr = XGCreateTexture1DComputer(&desc, computer.GetAddressOf()); + if (FAILED(hr)) + return hr; + + hr = computer->GetResourceLayout(&layout); + if (FAILED(hr)) + return hr; + + if (layout.Planes != 1) + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + + if (layout.SizeBytes != xbox.GetSize() || layout.BaseAlignmentBytes != xbox.GetAlignment()) + return E_UNEXPECTED; + + hr = image.Initialize(metadata); + if (FAILED(hr)) + return hr; + + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + if (metadata.arraySize > 1) { - if (metadata.arraySize > 1) - { - std::vector images; - images.reserve(metadata.arraySize); - for (size_t item = 0; item < metadata.arraySize; ++item) - { - const Image* img = image.GetImage(level, item, 0); - if (!img) - { - image.Release(); - return E_FAIL; - } - - images.push_back(img); - } - - hr = Detile1D(xbox, static_cast(level), computer.Get(), layout, &images[0], images.size()); - } - else + std::vector images; + images.reserve(metadata.arraySize); + for (size_t item = 0; item < metadata.arraySize; ++item) { - const Image* img = image.GetImage(level, 0, 0); + const Image* img = image.GetImage(level, item, 0); if (!img) { image.Release(); return E_FAIL; } - hr = Detile1D(xbox, static_cast(level), computer.Get(), layout, &img, 1); + images.push_back(img); } - if (FAILED(hr)) + hr = Detile1D(xbox, static_cast(level), computer.Get(), layout, &images[0], images.size()); + } + else + { + const Image* img = image.GetImage(level, 0, 0); + if (!img) { image.Release(); - return hr; + return E_FAIL; } - } - } - break; - case TEX_DIMENSION_TEXTURE2D: - { - if (metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION - || metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION - || metadata.mipLevels > D3D11_REQ_MIP_LEVELS - || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) - return E_INVALIDARG; - - XG_TEXTURE2D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = static_cast(metadata.format); - desc.SampleDesc.Count = 1; - desc.Usage = XG_USAGE_DEFAULT; - desc.BindFlags = XG_BIND_SHADER_RESOURCE; - desc.MiscFlags = (metadata.miscFlags & TEX_MISC_TEXTURECUBE) ? XG_RESOURCE_MISC_TEXTURECUBE : 0; - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - desc.SwizzleMode = xbox.GetTileMode(); - #else - desc.TileMode = xbox.GetTileMode(); - #endif - - ComPtr computer; - HRESULT hr = XGCreateTexture2DComputer(&desc, computer.GetAddressOf()); - if (FAILED(hr)) - return hr; + hr = Detile1D(xbox, static_cast(level), computer.Get(), layout, &img, 1); + } - hr = computer->GetResourceLayout(&layout); if (FAILED(hr)) + { + image.Release(); return hr; + } + } + } + break; - if (layout.Planes != 1) - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - - if (layout.SizeBytes != xbox.GetSize() - || layout.BaseAlignmentBytes != xbox.GetAlignment()) - return E_UNEXPECTED; - - hr = image.Initialize(metadata); - if (FAILED(hr)) - return hr; + case TEX_DIMENSION_TEXTURE2D: { + if (metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION || metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION + || metadata.mipLevels > D3D11_REQ_MIP_LEVELS || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) + return E_INVALIDARG; - for (size_t level = 0; level < metadata.mipLevels; ++level) + XG_TEXTURE2D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.ArraySize = static_cast(metadata.arraySize); + desc.Format = static_cast(metadata.format); + desc.SampleDesc.Count = 1; + desc.Usage = XG_USAGE_DEFAULT; + desc.BindFlags = XG_BIND_SHADER_RESOURCE; + desc.MiscFlags = (metadata.miscFlags & TEX_MISC_TEXTURECUBE) ? XG_RESOURCE_MISC_TEXTURECUBE : 0; +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + desc.SwizzleMode = xbox.GetTileMode(); +#else + desc.TileMode = xbox.GetTileMode(); +#endif + + ComPtr computer; + HRESULT hr = XGCreateTexture2DComputer(&desc, computer.GetAddressOf()); + if (FAILED(hr)) + return hr; + + hr = computer->GetResourceLayout(&layout); + if (FAILED(hr)) + return hr; + + if (layout.Planes != 1) + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + + if (layout.SizeBytes != xbox.GetSize() || layout.BaseAlignmentBytes != xbox.GetAlignment()) + return E_UNEXPECTED; + + hr = image.Initialize(metadata); + if (FAILED(hr)) + return hr; + + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + if (metadata.arraySize > 1) { - if (metadata.arraySize > 1) - { - std::vector images; - images.reserve(metadata.arraySize); - for (size_t item = 0; item < metadata.arraySize; ++item) - { - const Image* img = image.GetImage(level, item, 0); - if (!img) - { - image.Release(); - return E_FAIL; - } - - images.push_back(img); - } - - hr = Detile2D(xbox, static_cast(level), computer.Get(), &images[0], images.size()); - } - else + std::vector images; + images.reserve(metadata.arraySize); + for (size_t item = 0; item < metadata.arraySize; ++item) { - const Image* img = image.GetImage(level, 0, 0); + const Image* img = image.GetImage(level, item, 0); if (!img) { image.Release(); return E_FAIL; } - hr = Detile2D(xbox, static_cast(level), computer.Get(), &img, 1); + images.push_back(img); } - if (FAILED(hr)) + hr = Detile2D(xbox, static_cast(level), computer.Get(), &images[0], images.size()); + } + else + { + const Image* img = image.GetImage(level, 0, 0); + if (!img) { image.Release(); - return hr; + return E_FAIL; } - } - } - break; - case TEX_DIMENSION_TEXTURE3D: - { - if (metadata.width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION - || metadata.height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION - || metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION - || metadata.mipLevels > D3D11_REQ_MIP_LEVELS - || metadata.arraySize != 1) - return E_INVALIDARG; - - XG_TEXTURE3D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.Depth = static_cast(metadata.depth); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.Format = static_cast(metadata.format); - desc.Usage = XG_USAGE_DEFAULT; - desc.BindFlags = XG_BIND_SHADER_RESOURCE; - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - desc.SwizzleMode = xbox.GetTileMode(); - #else - desc.TileMode = xbox.GetTileMode(); - #endif - - ComPtr computer; - HRESULT hr = XGCreateTexture3DComputer(&desc, computer.GetAddressOf()); - if (FAILED(hr)) - return hr; + hr = Detile2D(xbox, static_cast(level), computer.Get(), &img, 1); + } - hr = computer->GetResourceLayout(&layout); if (FAILED(hr)) + { + image.Release(); return hr; + } + } + } + break; - if (layout.Planes != 1) - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + case TEX_DIMENSION_TEXTURE3D: { + if (metadata.width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION || metadata.height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION + || metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + || metadata.arraySize != 1) + return E_INVALIDARG; - if (layout.SizeBytes != xbox.GetSize() - || layout.BaseAlignmentBytes != xbox.GetAlignment()) - return E_UNEXPECTED; + XG_TEXTURE3D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.Depth = static_cast(metadata.depth); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.Format = static_cast(metadata.format); + desc.Usage = XG_USAGE_DEFAULT; + desc.BindFlags = XG_BIND_SHADER_RESOURCE; +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + desc.SwizzleMode = xbox.GetTileMode(); +#else + desc.TileMode = xbox.GetTileMode(); +#endif + + ComPtr computer; + HRESULT hr = XGCreateTexture3DComputer(&desc, computer.GetAddressOf()); + if (FAILED(hr)) + return hr; + + hr = computer->GetResourceLayout(&layout); + if (FAILED(hr)) + return hr; + + if (layout.Planes != 1) + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + + if (layout.SizeBytes != xbox.GetSize() || layout.BaseAlignmentBytes != xbox.GetAlignment()) + return E_UNEXPECTED; + + hr = image.Initialize(metadata); + if (FAILED(hr)) + return hr; + + auto d = static_cast(metadata.depth); + + size_t index = 0; + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + if ((index + d) > image.GetImageCount()) + { + image.Release(); + return E_FAIL; + } - hr = image.Initialize(metadata); + // Relies on the fact that slices are contiguous + hr = Detile3D(xbox, static_cast(level), computer.Get(), image.GetImages()[index]); if (FAILED(hr)) - return hr; - - auto d = static_cast(metadata.depth); - - size_t index = 0; - for (size_t level = 0; level < metadata.mipLevels; ++level) { - if ((index + d) > image.GetImageCount()) - { - image.Release(); - return E_FAIL; - } - - // Relies on the fact that slices are contiguous - hr = Detile3D(xbox, static_cast(level), computer.Get(), image.GetImages()[index]); - if (FAILED(hr)) - { - image.Release(); - return hr; - } + image.Release(); + return hr; + } - index += d; + index += d; - if (d > 1) - d >>= 1; - } + if (d > 1) + d >>= 1; } - break; + } + break; - default: - return E_FAIL; + default: return E_FAIL; } return S_OK; diff --git a/Auxiliary/DirectXTexXboxImage.cpp b/Auxiliary/DirectXTexXboxImage.cpp index bbe41496..91c95e80 100644 --- a/Auxiliary/DirectXTexXboxImage.cpp +++ b/Auxiliary/DirectXTexXboxImage.cpp @@ -14,6 +14,7 @@ using namespace DirectX; using namespace Xbox; // Sanity check XG library values against DirectXTex's values +// clang-format off static_assert(static_cast(XG_FORMAT_UNKNOWN) == static_cast(DXGI_FORMAT_UNKNOWN), "XG vs. DXGI mismatch"); static_assert(static_cast(XG_FORMAT_R32G32B32A32_TYPELESS) == static_cast(DXGI_FORMAT_R32G32B32A32_TYPELESS), "XG vs. DXGI mismatch"); static_assert(static_cast(XG_FORMAT_R32G32B32A32_FLOAT) == static_cast(DXGI_FORMAT_R32G32B32A32_FLOAT), "XG vs. DXGI mismatch"); @@ -136,41 +137,40 @@ static_assert(static_cast(XG_RESOURCE_DIMENSION_TEXTURE2D) == static_cast(XG_RESOURCE_DIMENSION_TEXTURE3D) == static_cast(TEX_DIMENSION_TEXTURE3D), "XG vs. Direct3D 11 mismatch"); static_assert(static_cast(XG_RESOURCE_MISC_TEXTURECUBE) == static_cast(TEX_MISC_TEXTURECUBE), "XG vs. Direct3D 11 mismatch"); +// clang-format on //-------------------------------------------------------------------------------------- // Initialize memory //-------------------------------------------------------------------------------------- -XboxImage& XboxImage::operator= (XboxImage&& moveFrom) noexcept +XboxImage& XboxImage::operator=(XboxImage&& moveFrom) noexcept { if (this != &moveFrom) { Release(); - dataSize = moveFrom.dataSize; + dataSize = moveFrom.dataSize; baseAlignment = moveFrom.baseAlignment; - tilemode = moveFrom.tilemode; - metadata = moveFrom.metadata; - memory = moveFrom.memory; + tilemode = moveFrom.tilemode; + metadata = moveFrom.metadata; + memory = moveFrom.memory; - moveFrom.dataSize = 0; + moveFrom.dataSize = 0; moveFrom.baseAlignment = 0; - moveFrom.tilemode = c_XboxTileModeInvalid; - moveFrom.memory = nullptr; + moveFrom.tilemode = c_XboxTileModeInvalid; + moveFrom.memory = nullptr; } return *this; } -_Use_decl_annotations_ -HRESULT XboxImage::Initialize(const XG_TEXTURE1D_DESC& desc, const XG_RESOURCE_LAYOUT& layout, uint32_t miscFlags2) +_Use_decl_annotations_ HRESULT XboxImage::Initialize(const XG_TEXTURE1D_DESC& desc, const XG_RESOURCE_LAYOUT& layout, uint32_t miscFlags2) { if (!layout.SizeBytes || !layout.BaseAlignmentBytes) return E_INVALIDARG; Release(); - if (layout.SizeBytes > UINT32_MAX - || layout.BaseAlignmentBytes > UINT32_MAX) + if (layout.SizeBytes > UINT32_MAX || layout.BaseAlignmentBytes > UINT32_MAX) return E_FAIL; memory = reinterpret_cast(_aligned_malloc(layout.SizeBytes, 16)); @@ -180,16 +180,16 @@ HRESULT XboxImage::Initialize(const XG_TEXTURE1D_DESC& desc, const XG_RESOURCE_L memset(memory, 0, layout.SizeBytes); memset(&metadata, 0, sizeof(metadata)); - metadata.width = desc.Width; - metadata.height = 1; - metadata.depth = 1; - metadata.arraySize = desc.ArraySize; - metadata.mipLevels = layout.MipLevels; - metadata.format = static_cast(desc.Format); - metadata.dimension = TEX_DIMENSION_TEXTURE1D; + metadata.width = desc.Width; + metadata.height = 1; + metadata.depth = 1; + metadata.arraySize = desc.ArraySize; + metadata.mipLevels = layout.MipLevels; + metadata.format = static_cast(desc.Format); + metadata.dimension = TEX_DIMENSION_TEXTURE1D; metadata.miscFlags2 = miscFlags2; - dataSize = static_cast(layout.SizeBytes); + dataSize = static_cast(layout.SizeBytes); baseAlignment = static_cast(layout.BaseAlignmentBytes); #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) tilemode = desc.SwizzleMode; @@ -200,17 +200,14 @@ HRESULT XboxImage::Initialize(const XG_TEXTURE1D_DESC& desc, const XG_RESOURCE_L return S_OK; } - -_Use_decl_annotations_ -HRESULT XboxImage::Initialize(const XG_TEXTURE2D_DESC& desc, const XG_RESOURCE_LAYOUT& layout, uint32_t miscFlags2) +_Use_decl_annotations_ HRESULT XboxImage::Initialize(const XG_TEXTURE2D_DESC& desc, const XG_RESOURCE_LAYOUT& layout, uint32_t miscFlags2) { if (!layout.SizeBytes || !layout.BaseAlignmentBytes) return E_INVALIDARG; Release(); - if (layout.SizeBytes > UINT32_MAX - || layout.BaseAlignmentBytes > UINT32_MAX) + if (layout.SizeBytes > UINT32_MAX || layout.BaseAlignmentBytes > UINT32_MAX) return E_FAIL; memory = reinterpret_cast(_aligned_malloc(layout.SizeBytes, 16)); @@ -220,17 +217,17 @@ HRESULT XboxImage::Initialize(const XG_TEXTURE2D_DESC& desc, const XG_RESOURCE_L memset(memory, 0, layout.SizeBytes); memset(&metadata, 0, sizeof(metadata)); - metadata.width = desc.Width; - metadata.height = desc.Height; - metadata.depth = 1; - metadata.arraySize = desc.ArraySize; - metadata.mipLevels = layout.MipLevels; - metadata.miscFlags = (desc.MiscFlags & XG_RESOURCE_MISC_TEXTURECUBE) ? TEX_MISC_TEXTURECUBE : 0; - metadata.format = static_cast(desc.Format); - metadata.dimension = TEX_DIMENSION_TEXTURE2D; + metadata.width = desc.Width; + metadata.height = desc.Height; + metadata.depth = 1; + metadata.arraySize = desc.ArraySize; + metadata.mipLevels = layout.MipLevels; + metadata.miscFlags = (desc.MiscFlags & XG_RESOURCE_MISC_TEXTURECUBE) ? TEX_MISC_TEXTURECUBE : 0; + metadata.format = static_cast(desc.Format); + metadata.dimension = TEX_DIMENSION_TEXTURE2D; metadata.miscFlags2 = miscFlags2; - dataSize = static_cast(layout.SizeBytes); + dataSize = static_cast(layout.SizeBytes); baseAlignment = static_cast(layout.BaseAlignmentBytes); #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) tilemode = desc.SwizzleMode; @@ -241,17 +238,14 @@ HRESULT XboxImage::Initialize(const XG_TEXTURE2D_DESC& desc, const XG_RESOURCE_L return S_OK; } - -_Use_decl_annotations_ -HRESULT XboxImage::Initialize(const XG_TEXTURE3D_DESC& desc, const XG_RESOURCE_LAYOUT& layout, uint32_t miscFlags2) +_Use_decl_annotations_ HRESULT XboxImage::Initialize(const XG_TEXTURE3D_DESC& desc, const XG_RESOURCE_LAYOUT& layout, uint32_t miscFlags2) { if (!layout.SizeBytes || !layout.BaseAlignmentBytes) return E_INVALIDARG; Release(); - if (layout.SizeBytes > UINT32_MAX - || layout.BaseAlignmentBytes > UINT32_MAX) + if (layout.SizeBytes > UINT32_MAX || layout.BaseAlignmentBytes > UINT32_MAX) return E_FAIL; memory = reinterpret_cast(_aligned_malloc(layout.SizeBytes, 16)); @@ -261,16 +255,16 @@ HRESULT XboxImage::Initialize(const XG_TEXTURE3D_DESC& desc, const XG_RESOURCE_L memset(memory, 0, layout.SizeBytes); memset(&metadata, 0, sizeof(metadata)); - metadata.width = desc.Width; - metadata.height = desc.Height; - metadata.depth = desc.Depth; - metadata.arraySize = 1; - metadata.mipLevels = layout.MipLevels; - metadata.format = static_cast(desc.Format); - metadata.dimension = TEX_DIMENSION_TEXTURE3D; + metadata.width = desc.Width; + metadata.height = desc.Height; + metadata.depth = desc.Depth; + metadata.arraySize = 1; + metadata.mipLevels = layout.MipLevels; + metadata.format = static_cast(desc.Format); + metadata.dimension = TEX_DIMENSION_TEXTURE3D; metadata.miscFlags2 = miscFlags2; - dataSize = static_cast(layout.SizeBytes); + dataSize = static_cast(layout.SizeBytes); baseAlignment = static_cast(layout.BaseAlignmentBytes); #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) tilemode = desc.SwizzleMode; @@ -281,9 +275,7 @@ HRESULT XboxImage::Initialize(const XG_TEXTURE3D_DESC& desc, const XG_RESOURCE_L return S_OK; } - -_Use_decl_annotations_ -HRESULT XboxImage::Initialize(const DirectX::TexMetadata& mdata, XboxTileMode tm, uint32_t size, uint32_t alignment) +_Use_decl_annotations_ HRESULT XboxImage::Initialize(const DirectX::TexMetadata& mdata, XboxTileMode tm, uint32_t size, uint32_t alignment) { if (!size || !alignment || tm == c_XboxTileModeInvalid) return E_INVALIDARG; @@ -298,14 +290,13 @@ HRESULT XboxImage::Initialize(const DirectX::TexMetadata& mdata, XboxTileMode tm metadata = mdata; - dataSize = size; + dataSize = size; baseAlignment = alignment; - tilemode = tm; + tilemode = tm; return S_OK; } - //-------------------------------------------------------------------------------------- // Release memory //-------------------------------------------------------------------------------------- diff --git a/Auxiliary/DirectXTexXboxTile.cpp b/Auxiliary/DirectXTexXboxTile.cpp index ecd8b5b9..5154a267 100644 --- a/Auxiliary/DirectXTexXboxTile.cpp +++ b/Auxiliary/DirectXTexXboxTile.cpp @@ -10,7 +10,7 @@ #include "DirectXTexP.h" #include "DirectXTexXbox.h" -//#define VERBOSE +// #define VERBOSE using Microsoft::WRL::ComPtr; using namespace DirectX; @@ -20,18 +20,17 @@ using namespace Xbox; namespace { //---------------------------------------------------------------------------------- - inline HRESULT TileByElement1D( - _In_reads_(nimages) const Image* const * images, - size_t nimages, - uint32_t level, - _In_ XGTextureAddressComputer* computer, - _In_ const XG_RESOURCE_LAYOUT& layout, - const XboxImage& xbox, - size_t bpp, - size_t w, - bool packed) + inline HRESULT TileByElement1D(_In_reads_(nimages) const Image* const* images, + size_t nimages, + uint32_t level, + _In_ XGTextureAddressComputer* computer, + _In_ const XG_RESOURCE_LAYOUT& layout, + const XboxImage& xbox, + size_t bpp, + size_t w, + bool packed) { - uint8_t* dptr = xbox.GetPointer(); + uint8_t* dptr = xbox.GetPointer(); const uint8_t* endPtr = dptr + layout.SizeBytes; for (size_t item = 0; item < nimages; ++item) @@ -50,12 +49,12 @@ namespace for (size_t x = 0; x < w; ++x) { - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) UINT64 element = (packed) ? (x >> 1) : x; - size_t offset = computer->GetTexelElementOffsetBytes(0, level, element, 0, static_cast(item), 0, nullptr); - #else + size_t offset = computer->GetTexelElementOffsetBytes(0, level, element, 0, static_cast(item), 0, nullptr); +#else size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0); - #endif +#endif if (offset == size_t(-1)) return E_FAIL; @@ -80,13 +79,21 @@ namespace void DebugPrintDesc(const XG_TEXTURE1D_DESC& desc) { wchar_t buff[2048] = {}; - swprintf_s(buff, L"XG_TEXTURE1D_DESC = { %u, %u, %u, %u, %u, %u, %u, %u, %u, %u }\n", - desc.Width, desc.MipLevels, desc.ArraySize, desc.Format, desc.Usage, desc.BindFlags, desc.CPUAccessFlags, desc.MiscFlags, - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + swprintf_s(buff, + L"XG_TEXTURE1D_DESC = { %u, %u, %u, %u, %u, %u, %u, %u, %u, %u }\n", + desc.Width, + desc.MipLevels, + desc.ArraySize, + desc.Format, + desc.Usage, + desc.BindFlags, + desc.CPUAccessFlags, + desc.MiscFlags, +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) desc.SwizzleMode, - #else +#else desc.TileMode, - #endif +#endif desc.Pitch); OutputDebugStringW(buff); } @@ -94,13 +101,24 @@ namespace void DebugPrintDesc(const XG_TEXTURE2D_DESC& desc) { wchar_t buff[2048] = {}; - swprintf_s(buff, L"XG_TEXTURE2D_DESC = { %u, %u, %u, %u, %u, { %u, %u }, %u, %u, %u, %u, %u, %u }\n", - desc.Width, desc.Height, desc.MipLevels, desc.ArraySize, desc.Format, desc.SampleDesc.Count, desc.SampleDesc.Quality, desc.Usage, desc.BindFlags, desc.CPUAccessFlags, desc.MiscFlags, - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + swprintf_s(buff, + L"XG_TEXTURE2D_DESC = { %u, %u, %u, %u, %u, { %u, %u }, %u, %u, %u, %u, %u, %u }\n", + desc.Width, + desc.Height, + desc.MipLevels, + desc.ArraySize, + desc.Format, + desc.SampleDesc.Count, + desc.SampleDesc.Quality, + desc.Usage, + desc.BindFlags, + desc.CPUAccessFlags, + desc.MiscFlags, +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) desc.SwizzleMode, - #else +#else desc.TileMode, - #endif +#endif desc.Pitch); OutputDebugStringW(buff); } @@ -108,13 +126,22 @@ namespace void DebugPrintDesc(const XG_TEXTURE3D_DESC& desc) { wchar_t buff[2048] = {}; - swprintf_s(buff, L"XG_TEXTURE3D_DESC = { %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u }\n", - desc.Width, desc.Height, desc.Depth, desc.MipLevels, desc.Format, desc.Usage, desc.BindFlags, desc.CPUAccessFlags, desc.MiscFlags, - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + swprintf_s(buff, + L"XG_TEXTURE3D_DESC = { %u, %u, %u, %u, %u, %u, %u, %u, %u, %u, %u }\n", + desc.Width, + desc.Height, + desc.Depth, + desc.MipLevels, + desc.Format, + desc.Usage, + desc.BindFlags, + desc.CPUAccessFlags, + desc.MiscFlags, +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) desc.SwizzleMode, - #else +#else desc.TileMode, - #endif +#endif desc.Pitch); OutputDebugStringW(buff); } @@ -123,35 +150,59 @@ namespace { wchar_t buff[2048] = {}; - swprintf_s(buff, L"Layout %u planes, %uD, %u mips, %llu size, %llu alignment\n", layout.Planes, layout.Dimension - 1, layout.MipLevels, layout.SizeBytes, layout.BaseAlignmentBytes); + swprintf_s(buff, + L"Layout %u planes, %uD, %u mips, %llu size, %llu alignment\n", + layout.Planes, + layout.Dimension - 1, + layout.MipLevels, + layout.SizeBytes, + layout.BaseAlignmentBytes); OutputDebugStringW(buff); for (size_t p = 0; p < layout.Planes; ++p) { auto& plane = layout.Plane[p]; - swprintf_s(buff, L"Plane %zu: %u bpe, %llu size, %llu offset, %llu alignment\n", p, plane.BytesPerElement, plane.SizeBytes, plane.BaseOffsetBytes, plane.BaseAlignmentBytes); + swprintf_s(buff, + L"Plane %zu: %u bpe, %llu size, %llu offset, %llu alignment\n", + p, + plane.BytesPerElement, + plane.SizeBytes, + plane.BaseOffsetBytes, + plane.BaseAlignmentBytes); OutputDebugStringW(buff); for (size_t level = 0; level < layout.MipLevels; ++level) { auto& mip = plane.MipLayout[level]; - swprintf_s(buff, L"\tLevel %zu: %llu size, %llu slice2D, %llu offset, %u alignment\n", level, mip.SizeBytes, mip.Slice2DSizeBytes, mip.OffsetBytes, mip.AlignmentBytes); + swprintf_s(buff, + L"\tLevel %zu: %llu size, %llu slice2D, %llu offset, %u alignment\n", + level, + mip.SizeBytes, + mip.Slice2DSizeBytes, + mip.OffsetBytes, + mip.AlignmentBytes); OutputDebugStringW(buff); - swprintf_s(buff, L"\t\t%u x %u x %u (padded %u x %u x %u)\n", mip.WidthElements, mip.HeightElements, mip.DepthOrArraySize, - mip.PaddedWidthElements, mip.PaddedHeightElements, mip.PaddedDepthOrArraySize); + swprintf_s(buff, + L"\t\t%u x %u x %u (padded %u x %u x %u)\n", + mip.WidthElements, + mip.HeightElements, + mip.DepthOrArraySize, + mip.PaddedWidthElements, + mip.PaddedHeightElements, + mip.PaddedDepthOrArraySize); OutputDebugStringW(buff); swprintf_s(buff, L"\t\tpitch %u pixels (%u bytes)\n", mip.PitchPixels, mip.PitchBytes); OutputDebugStringW(buff); - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) swprintf_s(buff, L"\t\t\t%u samples, %u swizzlemode\n", mip.SampleCount, mip.SwizzleMode); - #else +#else swprintf_s(buff, L"\t\t\t%u samples, %u tilemode\n", mip.SampleCount, mip.TileMode); - #endif +#endif OutputDebugStringW(buff); } } @@ -161,13 +212,12 @@ namespace //------------------------------------------------------------------------------------- // 1D Tiling //------------------------------------------------------------------------------------- - HRESULT Tile1D( - _In_reads_(nimages) const Image** images, - size_t nimages, - uint32_t level, - _In_ XGTextureAddressComputer* computer, - const XG_RESOURCE_LAYOUT& layout, - const XboxImage& xbox) + HRESULT Tile1D(_In_reads_(nimages) const Image** images, + size_t nimages, + uint32_t level, + _In_ XGTextureAddressComputer* computer, + const XG_RESOURCE_LAYOUT& layout, + const XboxImage& xbox) { if (!nimages || nimages > UINT32_MAX) return E_INVALIDARG; @@ -184,10 +234,10 @@ namespace assert(!IsCompressed(format)); bool byelement = IsTypeless(format); - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) if (nimages > 1) byelement = true; - #endif +#endif if (IsPacked(format)) { @@ -220,12 +270,12 @@ namespace auto scanline = make_AlignedArrayXMVECTOR(images[0]->width + tiledPixels); - XMVECTOR* row = scanline.get(); + XMVECTOR* row = scanline.get(); XMVECTOR* tiled = row + images[0]->width; - #ifdef _DEBUG +#ifdef _DEBUG memset(row, 0xCD, sizeof(XMVECTOR) * images[0]->width); - #endif +#endif memset(tiled, 0, sizeof(XMVECTOR) * tiledPixels); @@ -247,11 +297,11 @@ namespace for (size_t x = 0; x < img->width; ++x) { - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0, nullptr); - #else +#else size_t offset = computer->GetTexelElementOffsetBytes(0, level, x, 0, static_cast(item), 0); - #endif +#endif if (offset == size_t(-1)) return E_FAIL; @@ -274,16 +324,14 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // 2D Tiling //------------------------------------------------------------------------------------- - HRESULT Tile2D( - _In_reads_(nimages) const Image** images, - size_t nimages, - uint32_t level, - _In_ XGTextureAddressComputer* computer, - const XboxImage& xbox) + HRESULT Tile2D(_In_reads_(nimages) const Image** images, + size_t nimages, + uint32_t level, + _In_ XGTextureAddressComputer* computer, + const XboxImage& xbox) { if (!nimages || nimages > UINT32_MAX) return E_INVALIDARG; @@ -291,7 +339,7 @@ namespace if (!images || !images[0] || !computer || !xbox.GetPointer()) return E_POINTER; - uint8_t* baseAddr = xbox.GetPointer(); + uint8_t* baseAddr = xbox.GetPointer(); const auto& metadata = xbox.GetMetadata(); for (size_t item = 0; item < nimages; ++item) @@ -306,8 +354,7 @@ namespace assert(img->rowPitch == images[0]->rowPitch); assert(img->format == images[0]->format); - HRESULT hr = computer->CopyIntoSubresource( - baseAddr, + HRESULT hr = computer->CopyIntoSubresource(baseAddr, 0u, metadata.CalculateSubresource(level, item), img->pixels, @@ -322,32 +369,25 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // 3D Tiling //------------------------------------------------------------------------------------- - HRESULT Tile3D( - const Image& image, - uint32_t level, - _In_ XGTextureAddressComputer* computer, - const XboxImage& xbox) + HRESULT Tile3D(const Image& image, uint32_t level, _In_ XGTextureAddressComputer* computer, const XboxImage& xbox) { if (!image.pixels || !computer || !xbox.GetPointer()) return E_POINTER; - uint8_t* baseAddr = xbox.GetPointer(); + uint8_t* baseAddr = xbox.GetPointer(); const auto& metadata = xbox.GetMetadata(); - return computer->CopyIntoSubresource( - baseAddr, + return computer->CopyIntoSubresource(baseAddr, 0u, metadata.CalculateSubresource(level, 0), image.pixels, static_cast(image.rowPitch), static_cast(image.slicePitch)); } -} - +} // namespace //===================================================================================== // Entry-points @@ -356,21 +396,14 @@ namespace //------------------------------------------------------------------------------------- // Tile image //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::Tile( - const DirectX::Image& srcImage, - XboxImage& xbox, - XboxTileMode mode) +_Use_decl_annotations_ HRESULT Xbox::Tile(const DirectX::Image& srcImage, XboxImage& xbox, XboxTileMode mode) { - if (!srcImage.pixels - || srcImage.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION - || srcImage.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION) + if (!srcImage.pixels || srcImage.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION || srcImage.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION) return E_INVALIDARG; xbox.Release(); - if (srcImage.format == DXGI_FORMAT_R1_UNORM - || IsVideo(srcImage.format)) + if (srcImage.format == DXGI_FORMAT_R1_UNORM || IsVideo(srcImage.format)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } @@ -378,26 +411,34 @@ HRESULT Xbox::Tile( if (mode == c_XboxTileModeInvalid) { // If no specific tile mode is given, assume the optimal default - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - mode = XGComputeOptimalSwizzleMode(XG_RESOURCE_DIMENSION_TEXTURE2D, static_cast(srcImage.format), - static_cast(srcImage.width), static_cast(srcImage.height), - 1, 1, XG_BIND_SHADER_RESOURCE); - #else - mode = XGComputeOptimalTileMode(XG_RESOURCE_DIMENSION_TEXTURE2D, static_cast(srcImage.format), - static_cast(srcImage.width), static_cast(srcImage.height), - 1, 1, XG_BIND_SHADER_RESOURCE); - #endif +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + mode = XGComputeOptimalSwizzleMode(XG_RESOURCE_DIMENSION_TEXTURE2D, + static_cast(srcImage.format), + static_cast(srcImage.width), + static_cast(srcImage.height), + 1, + 1, + XG_BIND_SHADER_RESOURCE); +#else + mode = XGComputeOptimalTileMode(XG_RESOURCE_DIMENSION_TEXTURE2D, + static_cast(srcImage.format), + static_cast(srcImage.width), + static_cast(srcImage.height), + 1, + 1, + XG_BIND_SHADER_RESOURCE); +#endif } XG_TEXTURE2D_DESC desc = {}; - desc.Width = static_cast(srcImage.width); - desc.Height = static_cast(srcImage.height); - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = static_cast(srcImage.format); - desc.SampleDesc.Count = 1; - desc.Usage = XG_USAGE_DEFAULT; - desc.BindFlags = XG_BIND_SHADER_RESOURCE; + desc.Width = static_cast(srcImage.width); + desc.Height = static_cast(srcImage.height); + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = static_cast(srcImage.format); + desc.SampleDesc.Count = 1; + desc.Usage = XG_USAGE_DEFAULT; + desc.BindFlags = XG_BIND_SHADER_RESOURCE; #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) desc.SwizzleMode = mode; #else @@ -405,7 +446,7 @@ HRESULT Xbox::Tile( #endif ComPtr computer; - HRESULT hr = XGCreateTexture2DComputer(&desc, computer.GetAddressOf()); + HRESULT hr = XGCreateTexture2DComputer(&desc, computer.GetAddressOf()); if (FAILED(hr)) return hr; @@ -422,7 +463,7 @@ HRESULT Xbox::Tile( return hr; const Image* images = &srcImage; - hr = Tile2D(&images, 1, 0, computer.Get(), xbox); + hr = Tile2D(&images, 1, 0, computer.Get(), xbox); if (FAILED(hr)) { xbox.Release(); @@ -432,17 +473,11 @@ HRESULT Xbox::Tile( return S_OK; } - //------------------------------------------------------------------------------------- // Tile image (complex) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT Xbox::Tile( - const DirectX::Image* srcImages, - size_t nimages, - const DirectX::TexMetadata& metadata, - XboxImage& xbox, - XboxTileMode mode) +_Use_decl_annotations_ HRESULT +Xbox::Tile(const DirectX::Image* srcImages, size_t nimages, const DirectX::TexMetadata& metadata, XboxImage& xbox, XboxTileMode mode) { if (!srcImages || !nimages || nimages > UINT32_MAX) return E_INVALIDARG; @@ -450,37 +485,30 @@ HRESULT Xbox::Tile( switch (metadata.dimension) { case TEX_DIMENSION_TEXTURE1D: - if (metadata.width > D3D11_REQ_TEXTURE1D_U_DIMENSION - || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + if (metadata.width > D3D11_REQ_TEXTURE1D_U_DIMENSION || metadata.mipLevels > D3D11_REQ_MIP_LEVELS || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) return E_INVALIDARG; break; case TEX_DIMENSION_TEXTURE2D: - if (metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION - || metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION - || metadata.mipLevels > D3D11_REQ_MIP_LEVELS - || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) + if (metadata.width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION || metadata.height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION + || metadata.mipLevels > D3D11_REQ_MIP_LEVELS || metadata.arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) return E_INVALIDARG; break; case TEX_DIMENSION_TEXTURE3D: - if (metadata.width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION - || metadata.height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION - || metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION - || metadata.mipLevels > D3D11_REQ_MIP_LEVELS + if (metadata.width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION || metadata.height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION + || metadata.depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION || metadata.mipLevels > D3D11_REQ_MIP_LEVELS || metadata.arraySize != 1) return E_INVALIDARG; break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } xbox.Release(); - if (metadata.format == DXGI_FORMAT_R1_UNORM - || IsVideo(metadata.format)) + if (metadata.format == DXGI_FORMAT_R1_UNORM || IsVideo(metadata.format)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } @@ -490,268 +518,268 @@ HRESULT Xbox::Tile( case DXGI_FORMAT_R32G32B32_TYPELESS: case DXGI_FORMAT_R32G32B32_FLOAT: case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + case DXGI_FORMAT_R32G32B32_SINT: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - default: - break; + default: break; } if (mode == c_XboxTileModeInvalid) { - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - mode = XGComputeOptimalSwizzleMode(static_cast(metadata.dimension), static_cast(metadata.format), - static_cast(metadata.width), static_cast(metadata.height), +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + mode = XGComputeOptimalSwizzleMode(static_cast(metadata.dimension), + static_cast(metadata.format), + static_cast(metadata.width), + static_cast(metadata.height), static_cast((metadata.dimension == TEX_DIMENSION_TEXTURE3D) ? metadata.depth : metadata.arraySize), - 1, XG_BIND_SHADER_RESOURCE); - #else - // If no specific tile mode is given, assume the optimal default - mode = XGComputeOptimalTileMode(static_cast(metadata.dimension), static_cast(metadata.format), - static_cast(metadata.width), static_cast(metadata.height), + 1, + XG_BIND_SHADER_RESOURCE); +#else + // If no specific tile mode is given, assume the optimal default + mode = XGComputeOptimalTileMode(static_cast(metadata.dimension), + static_cast(metadata.format), + static_cast(metadata.width), + static_cast(metadata.height), static_cast((metadata.dimension == TEX_DIMENSION_TEXTURE3D) ? metadata.depth : metadata.arraySize), - 1, XG_BIND_SHADER_RESOURCE); - #endif + 1, + XG_BIND_SHADER_RESOURCE); +#endif } XG_RESOURCE_LAYOUT layout = {}; switch (metadata.dimension) { - case TEX_DIMENSION_TEXTURE1D: - { - XG_TEXTURE1D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = static_cast(metadata.format); - desc.Usage = XG_USAGE_DEFAULT; - desc.BindFlags = XG_BIND_SHADER_RESOURCE; - desc.MiscFlags = (metadata.IsCubemap()) ? XG_RESOURCE_MISC_TEXTURECUBE : 0; - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - desc.SwizzleMode = mode; - #else - desc.TileMode = mode; - #endif - - #ifdef VERBOSE - DebugPrintDesc(desc); - #endif - - ComPtr computer; - HRESULT hr = XGCreateTexture1DComputer(&desc, computer.GetAddressOf()); - if (FAILED(hr)) - return hr; + case TEX_DIMENSION_TEXTURE1D: { + XG_TEXTURE1D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.ArraySize = static_cast(metadata.arraySize); + desc.Format = static_cast(metadata.format); + desc.Usage = XG_USAGE_DEFAULT; + desc.BindFlags = XG_BIND_SHADER_RESOURCE; + desc.MiscFlags = (metadata.IsCubemap()) ? XG_RESOURCE_MISC_TEXTURECUBE : 0; +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + desc.SwizzleMode = mode; +#else + desc.TileMode = mode; +#endif - hr = computer->GetResourceLayout(&layout); - if (FAILED(hr)) - return hr; +#ifdef VERBOSE + DebugPrintDesc(desc); +#endif - #ifdef VERBOSE - DebugPrintLayout(layout); - #endif + ComPtr computer; + HRESULT hr = XGCreateTexture1DComputer(&desc, computer.GetAddressOf()); + if (FAILED(hr)) + return hr; - if (layout.Planes != 1) - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + hr = computer->GetResourceLayout(&layout); + if (FAILED(hr)) + return hr; - hr = xbox.Initialize(desc, layout, metadata.miscFlags2); - if (FAILED(hr)) - return hr; +#ifdef VERBOSE + DebugPrintLayout(layout); +#endif - for (size_t level = 0; level < metadata.mipLevels; ++level) - { - if (metadata.arraySize > 1) - { - std::vector images; - images.reserve(metadata.arraySize); - for (size_t item = 0; item < metadata.arraySize; ++item) - { - const size_t index = metadata.ComputeIndex(level, item, 0); - if (index >= nimages) - { - xbox.Release(); - return E_FAIL; - } - - images.push_back(&srcImages[index]); - } + if (layout.Planes != 1) + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - hr = Tile1D(&images[0], images.size(), static_cast(level), computer.Get(), layout, xbox); - } - else + hr = xbox.Initialize(desc, layout, metadata.miscFlags2); + if (FAILED(hr)) + return hr; + + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + if (metadata.arraySize > 1) + { + std::vector images; + images.reserve(metadata.arraySize); + for (size_t item = 0; item < metadata.arraySize; ++item) { - const size_t index = metadata.ComputeIndex(level, 0, 0); + const size_t index = metadata.ComputeIndex(level, item, 0); if (index >= nimages) { xbox.Release(); return E_FAIL; } - const Image* images = &srcImages[index]; - hr = Tile1D(&images, 1, static_cast(level), computer.Get(), layout, xbox); + images.push_back(&srcImages[index]); } - if (FAILED(hr)) + hr = Tile1D(&images[0], images.size(), static_cast(level), computer.Get(), layout, xbox); + } + else + { + const size_t index = metadata.ComputeIndex(level, 0, 0); + if (index >= nimages) { xbox.Release(); - return hr; + return E_FAIL; } + + const Image* images = &srcImages[index]; + hr = Tile1D(&images, 1, static_cast(level), computer.Get(), layout, xbox); } - } - break; - case TEX_DIMENSION_TEXTURE2D: - { - XG_TEXTURE2D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = static_cast(metadata.format); - desc.SampleDesc.Count = 1; - desc.Usage = XG_USAGE_DEFAULT; - desc.BindFlags = XG_BIND_SHADER_RESOURCE; - desc.MiscFlags = (metadata.miscFlags & TEX_MISC_TEXTURECUBE) ? XG_RESOURCE_MISC_TEXTURECUBE : 0; - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - desc.SwizzleMode = mode; - #else - desc.TileMode = mode; - #endif - - #ifdef VERBOSE - DebugPrintDesc(desc); - #endif - - ComPtr computer; - HRESULT hr = XGCreateTexture2DComputer(&desc, computer.GetAddressOf()); if (FAILED(hr)) + { + xbox.Release(); return hr; + } + } + } + break; + + case TEX_DIMENSION_TEXTURE2D: { + XG_TEXTURE2D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.ArraySize = static_cast(metadata.arraySize); + desc.Format = static_cast(metadata.format); + desc.SampleDesc.Count = 1; + desc.Usage = XG_USAGE_DEFAULT; + desc.BindFlags = XG_BIND_SHADER_RESOURCE; + desc.MiscFlags = (metadata.miscFlags & TEX_MISC_TEXTURECUBE) ? XG_RESOURCE_MISC_TEXTURECUBE : 0; +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + desc.SwizzleMode = mode; +#else + desc.TileMode = mode; +#endif - hr = computer->GetResourceLayout(&layout); - if (FAILED(hr)) - return hr; +#ifdef VERBOSE + DebugPrintDesc(desc); +#endif - #ifdef VERBOSE - DebugPrintLayout(layout); - #endif + ComPtr computer; + HRESULT hr = XGCreateTexture2DComputer(&desc, computer.GetAddressOf()); + if (FAILED(hr)) + return hr; - if (layout.Planes != 1) - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + hr = computer->GetResourceLayout(&layout); + if (FAILED(hr)) + return hr; - hr = xbox.Initialize(desc, layout, metadata.miscFlags2); - if (FAILED(hr)) - return hr; +#ifdef VERBOSE + DebugPrintLayout(layout); +#endif - for (size_t level = 0; level < metadata.mipLevels; ++level) - { - if (metadata.arraySize > 1) - { - std::vector images; - images.reserve(metadata.arraySize); - for (size_t item = 0; item < metadata.arraySize; ++item) - { - const size_t index = metadata.ComputeIndex(level, item, 0); - if (index >= nimages) - { - xbox.Release(); - return E_FAIL; - } - - images.push_back(&srcImages[index]); - } + if (layout.Planes != 1) + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - hr = Tile2D(&images[0], images.size(), static_cast(level), computer.Get(), xbox); - } - else + hr = xbox.Initialize(desc, layout, metadata.miscFlags2); + if (FAILED(hr)) + return hr; + + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + if (metadata.arraySize > 1) + { + std::vector images; + images.reserve(metadata.arraySize); + for (size_t item = 0; item < metadata.arraySize; ++item) { - const size_t index = metadata.ComputeIndex(level, 0, 0); + const size_t index = metadata.ComputeIndex(level, item, 0); if (index >= nimages) { xbox.Release(); return E_FAIL; } - const Image* images = &srcImages[index]; - hr = Tile2D(&images, 1, static_cast(level), computer.Get(), xbox); + images.push_back(&srcImages[index]); } - if (FAILED(hr)) + hr = Tile2D(&images[0], images.size(), static_cast(level), computer.Get(), xbox); + } + else + { + const size_t index = metadata.ComputeIndex(level, 0, 0); + if (index >= nimages) { xbox.Release(); - return hr; + return E_FAIL; } + + const Image* images = &srcImages[index]; + hr = Tile2D(&images, 1, static_cast(level), computer.Get(), xbox); } - } - break; - case TEX_DIMENSION_TEXTURE3D: - { - XG_TEXTURE3D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.Depth = static_cast(metadata.depth); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.Format = static_cast(metadata.format); - desc.Usage = XG_USAGE_DEFAULT; - desc.BindFlags = XG_BIND_SHADER_RESOURCE; - #if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) - desc.SwizzleMode = mode; - #else - desc.TileMode = mode; - #endif - - #ifdef VERBOSE - DebugPrintDesc(desc); - #endif - - ComPtr computer; - HRESULT hr = XGCreateTexture3DComputer(&desc, computer.GetAddressOf()); if (FAILED(hr)) + { + xbox.Release(); return hr; + } + } + } + break; + + case TEX_DIMENSION_TEXTURE3D: { + XG_TEXTURE3D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.Depth = static_cast(metadata.depth); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.Format = static_cast(metadata.format); + desc.Usage = XG_USAGE_DEFAULT; + desc.BindFlags = XG_BIND_SHADER_RESOURCE; +#if defined(_GAMING_XBOX_SCARLETT) || defined(_USE_SCARLETT) + desc.SwizzleMode = mode; +#else + desc.TileMode = mode; +#endif - hr = computer->GetResourceLayout(&layout); - if (FAILED(hr)) - return hr; +#ifdef VERBOSE + DebugPrintDesc(desc); +#endif - #ifdef VERBOSE - DebugPrintLayout(layout); - #endif + ComPtr computer; + HRESULT hr = XGCreateTexture3DComputer(&desc, computer.GetAddressOf()); + if (FAILED(hr)) + return hr; - if (layout.Planes != 1) - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + hr = computer->GetResourceLayout(&layout); + if (FAILED(hr)) + return hr; - hr = xbox.Initialize(desc, layout, metadata.miscFlags2); - if (FAILED(hr)) - return hr; +#ifdef VERBOSE + DebugPrintLayout(layout); +#endif - auto d = static_cast(metadata.depth); + if (layout.Planes != 1) + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - size_t index = 0; - for (size_t level = 0; level < metadata.mipLevels; ++level) - { - if ((index + d) > nimages) - { - xbox.Release(); - return E_FAIL; - } + hr = xbox.Initialize(desc, layout, metadata.miscFlags2); + if (FAILED(hr)) + return hr; - // Relies on the fact that slices are contiguous - hr = Tile3D(srcImages[index], static_cast(level), computer.Get(), xbox); - if (FAILED(hr)) - { - xbox.Release(); - return hr; - } + auto d = static_cast(metadata.depth); - index += d; + size_t index = 0; + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + if ((index + d) > nimages) + { + xbox.Release(); + return E_FAIL; + } - if (d > 1) - d >>= 1; + // Relies on the fact that slices are contiguous + hr = Tile3D(srcImages[index], static_cast(level), computer.Get(), xbox); + if (FAILED(hr)) + { + xbox.Release(); + return hr; } + + index += d; + + if (d > 1) + d >>= 1; } - break; + } + break; - default: - return E_FAIL; + default: return E_FAIL; } return S_OK; diff --git a/Common/CmdLineHelpers.h b/Common/CmdLineHelpers.h index 06744c18..ca4779e7 100644 --- a/Common/CmdLineHelpers.h +++ b/Common/CmdLineHelpers.h @@ -27,16 +27,33 @@ #error Define TOOL_VERSION before including this header #endif - namespace Helpers { - struct handle_closer { void operator()(HANDLE h) { if (h) CloseHandle(h); } }; + struct handle_closer + { + void operator()(HANDLE h) + { + if (h) + CloseHandle(h); + } + }; using ScopedHandle = std::unique_ptr; - inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } + inline HANDLE safe_handle(HANDLE h) noexcept + { + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; + } - struct find_closer { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) FindClose(h); } }; + struct find_closer + { + void operator()(HANDLE h) noexcept + { + assert(h != INVALID_HANDLE_VALUE); + if (h) + FindClose(h); + } + }; using ScopedFindHandle = std::unique_ptr; @@ -53,12 +70,12 @@ namespace Helpers template struct SValue { - const wchar_t* name; - T value; + const wchar_t* name; + T value; }; template - T LookupByName(const wchar_t _In_z_ *pName, const SValue *pArray) noexcept + T LookupByName(const wchar_t _In_z_* pName, const SValue* pArray) noexcept { while (pArray->name) { @@ -72,7 +89,7 @@ namespace Helpers } template - const wchar_t* LookupByValue(T value, const SValue *pArray) noexcept + const wchar_t* LookupByValue(T value, const SValue* pArray) noexcept { while (pArray->name) { @@ -123,7 +140,7 @@ namespace Helpers } template - void PrintList(size_t cch, const SValue *pValue) noexcept + void PrintList(size_t cch, const SValue* pValue) noexcept { while (pValue->name) { @@ -156,8 +173,8 @@ namespace Helpers auto verInfo = std::make_unique(size); if (GetFileVersionInfoW(appName, 0, size, verInfo.get())) { - LPVOID lpstr = nullptr; - UINT strLen = 0; + LPVOID lpstr = nullptr; + UINT strLen = 0; if (VerQueryValueW(verInfo.get(), L"\\StringFileInfo\\040904B0\\ProductVersion", &lpstr, &strLen)) { wcsncpy_s(version, reinterpret_cast(lpstr), strLen); @@ -179,9 +196,9 @@ namespace Helpers { wprintf(L"%ls Version %ls\n", desc, version); wprintf(L"Copyright (C) Microsoft Corp.\n"); - #ifdef _DEBUG +#ifdef _DEBUG wprintf(L"*** Debug build ***\n"); - #endif +#endif wprintf(L"\n"); } } @@ -190,10 +207,8 @@ namespace Helpers { // Process files WIN32_FIND_DATAW findData = {}; - ScopedFindHandle hFile(safe_handle(FindFirstFileExW(path.c_str(), - FindExInfoBasic, &findData, - FindExSearchNameMatch, nullptr, - FIND_FIRST_EX_LARGE_FETCH))); + ScopedFindHandle hFile(safe_handle( + FindFirstFileExW(path.c_str(), FindExInfoBasic, &findData, FindExSearchNameMatch, nullptr, FIND_FIRST_EX_LARGE_FETCH))); if (hFile) { for (;;) @@ -201,7 +216,7 @@ namespace Helpers if (!(findData.dwFileAttributes & (FILE_ATTRIBUTE_HIDDEN | FILE_ATTRIBUTE_SYSTEM | FILE_ATTRIBUTE_DIRECTORY))) { SConversion conv = {}; - conv.szSrc = path.parent_path().append(findData.cFileName).native(); + conv.szSrc = path.parent_path().append(findData.cFileName).native(); if (folder) { conv.szFolder = folder; @@ -220,8 +235,10 @@ namespace Helpers auto searchDir = path.parent_path().append(L"*"); hFile.reset(safe_handle(FindFirstFileExW(searchDir.c_str(), - FindExInfoBasic, &findData, - FindExSearchLimitToDirectories, nullptr, + FindExInfoBasic, + &findData, + FindExSearchLimitToDirectories, + nullptr, FIND_FIRST_EX_LARGE_FETCH))); if (!hFile) return; @@ -232,9 +249,10 @@ namespace Helpers { if (findData.cFileName[0] != L'.') { - auto subfolder = (folder) - ? (std::wstring(folder) + std::wstring(findData.cFileName) + std::filesystem::path::preferred_separator) - : (std::wstring(findData.cFileName) + std::filesystem::path::preferred_separator); + auto subfolder + = (folder) ? + (std::wstring(folder) + std::wstring(findData.cFileName) + std::filesystem::path::preferred_separator) : + (std::wstring(findData.cFileName) + std::filesystem::path::preferred_separator); auto subdir = path.parent_path().append(findData.cFileName).append(path.filename().c_str()); @@ -273,7 +291,7 @@ namespace Helpers else { std::filesystem::path path(fname.c_str() + 1); - auto& npath = path.make_preferred(); + auto& npath = path.make_preferred(); if (wcspbrk(fname.c_str(), L"?*") != nullptr) { std::list removeFiles; @@ -301,7 +319,7 @@ namespace Helpers } else { - SConversion conv = {}; + SConversion conv = {}; std::filesystem::path path(fname.c_str()); conv.szSrc = path.make_preferred().native(); flist.push_back(conv); @@ -343,8 +361,12 @@ namespace Helpers LPWSTR errorText = nullptr; const DWORD result = FormatMessageW(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS | FORMAT_MESSAGE_ALLOCATE_BUFFER, - nullptr, static_cast(hr), - MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), reinterpret_cast(&errorText), 0, nullptr); + nullptr, + static_cast(hr), + MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), + reinterpret_cast(&errorText), + 0, + nullptr); *desc = 0; @@ -372,4 +394,4 @@ namespace Helpers return desc; } -} +} // namespace Helpers diff --git a/DDSTextureLoader/DDSTextureLoader11.cpp b/DDSTextureLoader/DDSTextureLoader11.cpp index 5c1bb18b..0ff54ca6 100644 --- a/DDSTextureLoader/DDSTextureLoader11.cpp +++ b/DDSTextureLoader/DDSTextureLoader11.cpp @@ -44,9 +44,8 @@ using namespace DirectX; // Macros //-------------------------------------------------------------------------------------- #ifndef MAKEFOURCC -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | \ - ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 )) +#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24)) #endif /* defined(MAKEFOURCC) */ //-------------------------------------------------------------------------------------- @@ -56,42 +55,42 @@ using namespace DirectX; //-------------------------------------------------------------------------------------- namespace { -#pragma pack(push,1) +#pragma pack(push, 1) constexpr uint32_t DDS_MAGIC = 0x20534444; // "DDS " struct DDS_PIXELFORMAT { - uint32_t size; - uint32_t flags; - uint32_t fourCC; - uint32_t RGBBitCount; - uint32_t RBitMask; - uint32_t GBitMask; - uint32_t BBitMask; - uint32_t ABitMask; + uint32_t size; + uint32_t flags; + uint32_t fourCC; + uint32_t RGBBitCount; + uint32_t RBitMask; + uint32_t GBitMask; + uint32_t BBitMask; + uint32_t ABitMask; }; -#define DDS_FOURCC 0x00000004 // DDPF_FOURCC -#define DDS_RGB 0x00000040 // DDPF_RGB -#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE -#define DDS_ALPHA 0x00000002 // DDPF_ALPHA -#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV +#define DDS_FOURCC 0x00000004 // DDPF_FOURCC +#define DDS_RGB 0x00000040 // DDPF_RGB +#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE +#define DDS_ALPHA 0x00000002 // DDPF_ALPHA +#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV -#define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH +#define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH -#define DDS_HEIGHT 0x00000002 // DDSD_HEIGHT +#define DDS_HEIGHT 0x00000002 // DDSD_HEIGHT -#define DDS_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX -#define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX -#define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY -#define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY -#define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ -#define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ +#define DDS_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX +#define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX +#define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY +#define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY +#define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ +#define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ -#define DDS_CUBEMAP_ALLFACES ( DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX |\ - DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY |\ - DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEZ ) +#define DDS_CUBEMAP_ALLFACES \ + (DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX | DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY | DDS_CUBEMAP_POSITIVEZ \ + | DDS_CUBEMAP_NEGATIVEZ) #define DDS_CUBEMAP 0x00000200 // DDSCAPS2_CUBEMAP @@ -120,11 +119,11 @@ namespace struct DDS_HEADER_DXT10 { - DXGI_FORMAT dxgiFormat; - uint32_t resourceDimension; - uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG - uint32_t arraySize; - uint32_t miscFlags2; + DXGI_FORMAT dxgiFormat; + uint32_t resourceDimension; + uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG + uint32_t arraySize; + uint32_t miscFlags2; }; #pragma pack(pop) @@ -133,36 +132,45 @@ namespace static_assert(sizeof(DDS_HEADER) == 124, "DDS Header size mismatch"); static_assert(sizeof(DDS_HEADER_DXT10) == 20, "DDS DX10 Extended Header size mismatch"); - constexpr size_t DDS_MIN_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); + constexpr size_t DDS_MIN_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); constexpr size_t DDS_DX10_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10); static_assert(DDS_DX10_HEADER_SIZE > DDS_MIN_HEADER_SIZE, "DDS DX10 Header should be larger than standard header"); //-------------------------------------------------------------------------------------- - struct handle_closer { void operator()(HANDLE h) noexcept { if (h) CloseHandle(h); } }; + struct handle_closer + { + void operator()(HANDLE h) noexcept + { + if (h) + CloseHandle(h); + } + }; using ScopedHandle = std::unique_ptr; - inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } + inline HANDLE safe_handle(HANDLE h) noexcept + { + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; + } #if defined(_DEBUG) || defined(PROFILE) template - inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_ const char(&name)[TNameLength]) noexcept + inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_ const char (&name)[TNameLength]) noexcept { resource->SetPrivateData(WKPDID_D3DDebugObjectName, TNameLength - 1, name); } #else template - inline void SetDebugObjectName(_In_ ID3D11DeviceChild*, _In_ const char(&)[TNameLength]) noexcept + inline void SetDebugObjectName(_In_ ID3D11DeviceChild*, _In_ const char (&)[TNameLength]) noexcept {} #endif -//-------------------------------------------------------------------------------------- - HRESULT LoadTextureDataFromMemory( - _In_reads_(ddsDataSize) const uint8_t* ddsData, - size_t ddsDataSize, - const DDS_HEADER** header, - const uint8_t** bitData, - size_t* bitSize) noexcept + //-------------------------------------------------------------------------------------- + HRESULT LoadTextureDataFromMemory(_In_reads_(ddsDataSize) const uint8_t* ddsData, + size_t ddsDataSize, + const DDS_HEADER** header, + const uint8_t** bitData, + size_t* bitSize) noexcept { if (!header || !bitData || !bitSize) { @@ -191,16 +199,14 @@ namespace auto hdr = reinterpret_cast(ddsData + sizeof(uint32_t)); // Verify header to validate DDS file - if (hdr->size != sizeof(DDS_HEADER) || - hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) + if (hdr->size != sizeof(DDS_HEADER) || hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) { return E_FAIL; } // Check for DX10 extension bool bDXT10Header = false; - if ((hdr->ddspf.flags & DDS_FOURCC) && - (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) + if ((hdr->ddspf.flags & DDS_FOURCC) && (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) { // Must be long enough for both headers and magic value if (ddsDataSize < DDS_DX10_HEADER_SIZE) @@ -212,23 +218,20 @@ namespace } // setup the pointers in the process request - *header = hdr; - auto offset = DDS_MIN_HEADER_SIZE - + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0u); - *bitData = ddsData + offset; - *bitSize = ddsDataSize - offset; + *header = hdr; + auto offset = DDS_MIN_HEADER_SIZE + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0u); + *bitData = ddsData + offset; + *bitSize = ddsDataSize - offset; return S_OK; } - //-------------------------------------------------------------------------------------- - HRESULT LoadTextureDataFromFile( - _In_z_ const wchar_t* fileName, - std::unique_ptr& ddsData, - const DDS_HEADER** header, - const uint8_t** bitData, - size_t* bitSize) noexcept + HRESULT LoadTextureDataFromFile(_In_z_ const wchar_t* fileName, + std::unique_ptr& ddsData, + const DDS_HEADER** header, + const uint8_t** bitData, + size_t* bitSize) noexcept { if (!header || !bitData || !bitSize) { @@ -238,10 +241,7 @@ namespace *bitSize = 0; // open the file - ScopedHandle hFile(safe_handle(CreateFile2( - fileName, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -275,12 +275,7 @@ namespace // read the data in DWORD bytesRead = 0; - if (!ReadFile(hFile.get(), - ddsData.get(), - fileInfo.EndOfFile.LowPart, - &bytesRead, - nullptr - )) + if (!ReadFile(hFile.get(), ddsData.get(), fileInfo.EndOfFile.LowPart, &bytesRead, nullptr)) { ddsData.reset(); return HRESULT_FROM_WIN32(GetLastError()); @@ -303,8 +298,7 @@ namespace auto hdr = reinterpret_cast(ddsData.get() + sizeof(uint32_t)); // Verify header to validate DDS file - if (hdr->size != sizeof(DDS_HEADER) || - hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) + if (hdr->size != sizeof(DDS_HEADER) || hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) { ddsData.reset(); return E_FAIL; @@ -312,8 +306,7 @@ namespace // Check for DX10 extension bool bDXT10Header = false; - if ((hdr->ddspf.flags & DDS_FOURCC) && - (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) + if ((hdr->ddspf.flags & DDS_FOURCC) && (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) { // Must be long enough for both headers and magic value if (fileInfo.EndOfFile.LowPart < DDS_DX10_HEADER_SIZE) @@ -326,16 +319,14 @@ namespace } // setup the pointers in the process request - *header = hdr; - auto offset = DDS_MIN_HEADER_SIZE - + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0u); - *bitData = ddsData.get() + offset; - *bitSize = fileInfo.EndOfFile.LowPart - offset; + *header = hdr; + auto offset = DDS_MIN_HEADER_SIZE + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0u); + *bitData = ddsData.get() + offset; + *bitSize = fileInfo.EndOfFile.LowPart - offset; return S_OK; } - //-------------------------------------------------------------------------------------- // Return the BPP for a particular format //-------------------------------------------------------------------------------------- @@ -346,14 +337,12 @@ namespace case DXGI_FORMAT_R32G32B32A32_TYPELESS: case DXGI_FORMAT_R32G32B32A32_FLOAT: case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - return 128; + case DXGI_FORMAT_R32G32B32A32_SINT: return 128; case DXGI_FORMAT_R32G32B32_TYPELESS: case DXGI_FORMAT_R32G32B32_FLOAT: case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return 96; + case DXGI_FORMAT_R32G32B32_SINT: return 96; case DXGI_FORMAT_R16G16B16A16_TYPELESS: case DXGI_FORMAT_R16G16B16A16_FLOAT: @@ -371,8 +360,7 @@ namespace case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: case DXGI_FORMAT_Y416: case DXGI_FORMAT_Y210: - case DXGI_FORMAT_Y216: - return 64; + case DXGI_FORMAT_Y216: return 64; case DXGI_FORMAT_R10G10B10A2_TYPELESS: case DXGI_FORMAT_R10G10B10A2_UNORM: @@ -411,12 +399,10 @@ namespace case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: case DXGI_FORMAT_AYUV: case DXGI_FORMAT_Y410: - case DXGI_FORMAT_YUY2: - return 32; + case DXGI_FORMAT_YUY2: return 32; case DXGI_FORMAT_P010: - case DXGI_FORMAT_P016: - return 24; + case DXGI_FORMAT_P016: return 24; case DXGI_FORMAT_R8G8_TYPELESS: case DXGI_FORMAT_R8G8_UNORM: @@ -433,13 +419,11 @@ namespace case DXGI_FORMAT_B5G6R5_UNORM: case DXGI_FORMAT_B5G5R5A1_UNORM: case DXGI_FORMAT_A8P8: - case DXGI_FORMAT_B4G4R4A4_UNORM: - return 16; + case DXGI_FORMAT_B4G4R4A4_UNORM: return 16; case DXGI_FORMAT_NV12: case DXGI_FORMAT_420_OPAQUE: - case DXGI_FORMAT_NV11: - return 12; + case DXGI_FORMAT_NV11: return 12; case DXGI_FORMAT_R8_TYPELESS: case DXGI_FORMAT_R8_UNORM: @@ -464,49 +448,42 @@ namespace case DXGI_FORMAT_BC7_UNORM_SRGB: case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: - case DXGI_FORMAT_P8: - return 8; + case DXGI_FORMAT_P8: return 8; - case DXGI_FORMAT_R1_UNORM: - return 1; + case DXGI_FORMAT_R1_UNORM: return 1; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - return 4; + case DXGI_FORMAT_BC4_SNORM: return 4; - default: - return 0; + default: return 0; } } - //-------------------------------------------------------------------------------------- // Get surface information for a particular format //-------------------------------------------------------------------------------------- - HRESULT GetSurfaceInfo( - _In_ size_t width, - _In_ size_t height, - _In_ DXGI_FORMAT fmt, - _Out_opt_ size_t* outNumBytes, - _Out_opt_ size_t* outRowBytes, - _Out_opt_ size_t* outNumRows) noexcept + HRESULT GetSurfaceInfo(_In_ size_t width, + _In_ size_t height, + _In_ DXGI_FORMAT fmt, + _Out_opt_ size_t* outNumBytes, + _Out_opt_ size_t* outRowBytes, + _Out_opt_ size_t* outNumRows) noexcept { uint64_t numBytes = 0; uint64_t rowBytes = 0; - uint64_t numRows = 0; + uint64_t numRows = 0; - bool bc = false; - bool packed = false; - bool planar = false; - size_t bpe = 0; + bool bc = false; + bool packed = false; + bool planar = false; + size_t bpe = 0; switch (fmt) { - case DXGI_FORMAT_UNKNOWN: - return E_INVALIDARG; + case DXGI_FORMAT_UNKNOWN: return E_INVALIDARG; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: @@ -514,7 +491,7 @@ namespace case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: case DXGI_FORMAT_BC4_SNORM: - bc = true; + bc = true; bpe = 8; break; @@ -533,7 +510,7 @@ namespace case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: case DXGI_FORMAT_BC7_UNORM_SRGB: - bc = true; + bc = true; bpe = 16; break; @@ -541,13 +518,13 @@ namespace case DXGI_FORMAT_G8R8_G8B8_UNORM: case DXGI_FORMAT_YUY2: packed = true; - bpe = 4; + bpe = 4; break; case DXGI_FORMAT_Y210: case DXGI_FORMAT_Y216: packed = true; - bpe = 8; + bpe = 8; break; case DXGI_FORMAT_NV12: @@ -558,17 +535,17 @@ namespace return E_INVALIDARG; } planar = true; - bpe = 2; + bpe = 2; break; - #if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) +#if (_WIN32_WINNT >= _WIN32_WINNT_WIN10) case DXGI_FORMAT_P208: planar = true; - bpe = 2; + bpe = 2; break; - #endif +#endif case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: @@ -578,11 +555,10 @@ namespace return E_INVALIDARG; } planar = true; - bpe = 4; + bpe = 4; break; - default: - break; + default: break; } if (bc) @@ -598,26 +574,26 @@ namespace numBlocksHigh = std::max(1u, (uint64_t(height) + 3u) / 4u); } rowBytes = numBlocksWide * bpe; - numRows = numBlocksHigh; + numRows = numBlocksHigh; numBytes = rowBytes * numBlocksHigh; } else if (packed) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } else if (fmt == DXGI_FORMAT_NV11) { rowBytes = ((uint64_t(width) + 3u) >> 2) * 4u; - numRows = uint64_t(height) * 2u; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data + numRows = uint64_t(height) * 2u; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data numBytes = rowBytes * numRows; } else if (planar) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; numBytes = (rowBytes * uint64_t(height)) + ((rowBytes * uint64_t(height) + 1u) >> 1); - numRows = height + ((uint64_t(height) + 1u) >> 1); + numRows = height + ((uint64_t(height) + 1u) >> 1); } else { @@ -626,17 +602,17 @@ namespace return E_INVALIDARG; rowBytes = (uint64_t(width) * bpp + 7u) / 8u; // round up to nearest byte - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } - #if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) +#if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) static_assert(sizeof(size_t) == 4, "Not a 32-bit platform!"); if (numBytes > UINT32_MAX || rowBytes > UINT32_MAX || numRows > UINT32_MAX) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - #else +#else static_assert(sizeof(size_t) == 8, "Not a 64-bit platform!"); - #endif +#endif if (outNumBytes) { @@ -654,9 +630,8 @@ namespace return S_OK; } - //-------------------------------------------------------------------------------------- -#define ISBITMASK( r,g,b,a ) ( ddpf.RBitMask == r && ddpf.GBitMask == g && ddpf.BBitMask == b && ddpf.ABitMask == a ) +#define ISBITMASK(r, g, b, a) (ddpf.RBitMask == r && ddpf.GBitMask == g && ddpf.BBitMask == b && ddpf.ABitMask == a) DXGI_FORMAT GetDXGIFormat(const DDS_PIXELFORMAT& ddpf) noexcept { @@ -756,8 +731,7 @@ namespace // No 3:3:2 or paletted DXGI formats aka D3DFMT_R3G3B2, D3DFMT_P8 break; - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } } else if (ddpf.flags & DDS_LUMINANCE) @@ -789,8 +763,7 @@ namespace } break; - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } } else if (ddpf.flags & DDS_ALPHA) @@ -824,8 +797,7 @@ namespace } break; - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } // No DXGI format maps to DDPF_BUMPLUMINANCE aka D3DFMT_L6V5U5, D3DFMT_X8L8V8U8 @@ -901,7 +873,7 @@ namespace // Check for D3DFORMAT enums being set here switch (ddpf.fourCC) { - case 36: // D3DFMT_A16B16G16R16 + case 36: // D3DFMT_A16B16G16R16 return DXGI_FORMAT_R16G16B16A16_UNORM; case 110: // D3DFMT_Q16W16V16U16 @@ -925,10 +897,9 @@ namespace case 116: // D3DFMT_A32B32G32R32F return DXGI_FORMAT_R32G32B32A32_FLOAT; - // No DXGI format maps to D3DFMT_CxV8U8 + // No DXGI format maps to D3DFMT_CxV8U8 - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } } @@ -937,87 +908,67 @@ namespace #undef ISBITMASK - //-------------------------------------------------------------------------------------- DXGI_FORMAT MakeSRGB(_In_ DXGI_FORMAT format) noexcept { switch (format) { - case DXGI_FORMAT_R8G8B8A8_UNORM: - return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + case DXGI_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - case DXGI_FORMAT_BC1_UNORM: - return DXGI_FORMAT_BC1_UNORM_SRGB; + case DXGI_FORMAT_BC1_UNORM: return DXGI_FORMAT_BC1_UNORM_SRGB; - case DXGI_FORMAT_BC2_UNORM: - return DXGI_FORMAT_BC2_UNORM_SRGB; + case DXGI_FORMAT_BC2_UNORM: return DXGI_FORMAT_BC2_UNORM_SRGB; - case DXGI_FORMAT_BC3_UNORM: - return DXGI_FORMAT_BC3_UNORM_SRGB; + case DXGI_FORMAT_BC3_UNORM: return DXGI_FORMAT_BC3_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8A8_UNORM: - return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8X8_UNORM: - return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8X8_UNORM: return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; - case DXGI_FORMAT_BC7_UNORM: - return DXGI_FORMAT_BC7_UNORM_SRGB; + case DXGI_FORMAT_BC7_UNORM: return DXGI_FORMAT_BC7_UNORM_SRGB; - default: - return format; + default: return format; } } - //-------------------------------------------------------------------------------------- inline DXGI_FORMAT MakeLinear(_In_ DXGI_FORMAT format) noexcept { switch (format) { - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - return DXGI_FORMAT_R8G8B8A8_UNORM; + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return DXGI_FORMAT_R8G8B8A8_UNORM; - case DXGI_FORMAT_BC1_UNORM_SRGB: - return DXGI_FORMAT_BC1_UNORM; + case DXGI_FORMAT_BC1_UNORM_SRGB: return DXGI_FORMAT_BC1_UNORM; - case DXGI_FORMAT_BC2_UNORM_SRGB: - return DXGI_FORMAT_BC2_UNORM; + case DXGI_FORMAT_BC2_UNORM_SRGB: return DXGI_FORMAT_BC2_UNORM; - case DXGI_FORMAT_BC3_UNORM_SRGB: - return DXGI_FORMAT_BC3_UNORM; + case DXGI_FORMAT_BC3_UNORM_SRGB: return DXGI_FORMAT_BC3_UNORM; - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - return DXGI_FORMAT_B8G8R8A8_UNORM; + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8A8_UNORM; - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - return DXGI_FORMAT_B8G8R8X8_UNORM; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8X8_UNORM; - case DXGI_FORMAT_BC7_UNORM_SRGB: - return DXGI_FORMAT_BC7_UNORM; + case DXGI_FORMAT_BC7_UNORM_SRGB: return DXGI_FORMAT_BC7_UNORM; - default: - return format; + default: return format; } } - //-------------------------------------------------------------------------------------- - HRESULT FillInitData( - _In_ size_t width, - _In_ size_t height, - _In_ size_t depth, - _In_ size_t mipCount, - _In_ size_t arraySize, - _In_ DXGI_FORMAT format, - _In_ size_t maxsize, - _In_ size_t bitSize, - _In_reads_bytes_(bitSize) const uint8_t* bitData, - _Out_ size_t& twidth, - _Out_ size_t& theight, - _Out_ size_t& tdepth, - _Out_ size_t& skipMip, - _Out_writes_(mipCount*arraySize) D3D11_SUBRESOURCE_DATA* initData) noexcept + HRESULT FillInitData(_In_ size_t width, + _In_ size_t height, + _In_ size_t depth, + _In_ size_t mipCount, + _In_ size_t arraySize, + _In_ DXGI_FORMAT format, + _In_ size_t maxsize, + _In_ size_t bitSize, + _In_reads_bytes_(bitSize) const uint8_t* bitData, + _Out_ size_t& twidth, + _Out_ size_t& theight, + _Out_ size_t& tdepth, + _Out_ size_t& skipMip, + _Out_writes_(mipCount* arraySize) D3D11_SUBRESOURCE_DATA* initData) noexcept { if (!bitData || !initData) { @@ -1025,12 +976,12 @@ namespace } skipMip = 0; - twidth = 0; + twidth = 0; theight = 0; - tdepth = 0; + tdepth = 0; - size_t NumBytes = 0; - size_t RowBytes = 0; + size_t NumBytes = 0; + size_t RowBytes = 0; const uint8_t* pSrcBits = bitData; const uint8_t* pEndBits = bitData + bitSize; @@ -1053,15 +1004,15 @@ namespace { if (!twidth) { - twidth = w; + twidth = w; theight = h; - tdepth = d; + tdepth = d; } assert(index < mipCount * arraySize); _Analysis_assume_(index < mipCount * arraySize); - initData[index].pSysMem = pSrcBits; - initData[index].SysMemPitch = static_cast(RowBytes); + initData[index].pSysMem = pSrcBits; + initData[index].SysMemPitch = static_cast(RowBytes); initData[index].SysMemSlicePitch = static_cast(NumBytes); ++index; } @@ -1071,7 +1022,7 @@ namespace ++skipMip; } - if (pSrcBits + (NumBytes*d) > pEndBits) + if (pSrcBits + (NumBytes * d) > pEndBits) { return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); } @@ -1099,26 +1050,24 @@ namespace return (index > 0) ? S_OK : E_FAIL; } - //-------------------------------------------------------------------------------------- - HRESULT CreateD3DResources( - _In_ ID3D11Device* d3dDevice, - _In_ uint32_t resDim, - _In_ size_t width, - _In_ size_t height, - _In_ size_t depth, - _In_ size_t mipCount, - _In_ size_t arraySize, - _In_ DXGI_FORMAT format, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ DDS_LOADER_FLAGS loadFlags, - _In_ bool isCubeMap, - _In_reads_opt_(mipCount*arraySize) const D3D11_SUBRESOURCE_DATA* initData, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept + HRESULT CreateD3DResources(_In_ ID3D11Device* d3dDevice, + _In_ uint32_t resDim, + _In_ size_t width, + _In_ size_t height, + _In_ size_t depth, + _In_ size_t mipCount, + _In_ size_t arraySize, + _In_ DXGI_FORMAT format, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ DDS_LOADER_FLAGS loadFlags, + _In_ bool isCubeMap, + _In_reads_opt_(mipCount* arraySize) const D3D11_SUBRESOURCE_DATA* initData, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept { if (!d3dDevice) return E_POINTER; @@ -1136,237 +1085,214 @@ namespace switch (resDim) { - case D3D11_RESOURCE_DIMENSION_TEXTURE1D: + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: { + D3D11_TEXTURE1D_DESC desc; + desc.Width = static_cast(width); + desc.MipLevels = static_cast(mipCount); + desc.ArraySize = static_cast(arraySize); + desc.Format = format; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); + + ID3D11Texture1D* tex = nullptr; + hr = d3dDevice->CreateTexture1D(&desc, initData, &tex); + if (SUCCEEDED(hr) && tex) { - D3D11_TEXTURE1D_DESC desc; - desc.Width = static_cast(width); - desc.MipLevels = static_cast(mipCount); - desc.ArraySize = static_cast(arraySize); - desc.Format = format; - desc.Usage = usage; - desc.BindFlags = bindFlags; - desc.CPUAccessFlags = cpuAccessFlags; - desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); - - ID3D11Texture1D* tex = nullptr; - hr = d3dDevice->CreateTexture1D(&desc, - initData, - &tex - ); - if (SUCCEEDED(hr) && tex) + if (textureView) { - if (textureView) - { - D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; - SRVDesc.Format = format; - - if (arraySize > 1) - { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; - SRVDesc.Texture1DArray.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - SRVDesc.Texture1DArray.ArraySize = static_cast(arraySize); - } - else - { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; - SRVDesc.Texture1D.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - } - - hr = d3dDevice->CreateShaderResourceView(tex, - &SRVDesc, - textureView - ); - if (FAILED(hr)) - { - tex->Release(); - return hr; - } - } + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; + SRVDesc.Format = format; - if (texture) + if (arraySize > 1) { - *texture = tex; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1DARRAY; + SRVDesc.Texture1DArray.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; + SRVDesc.Texture1DArray.ArraySize = static_cast(arraySize); } else { - SetDebugObjectName(tex, "DDSTextureLoader"); + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE1D; + SRVDesc.Texture1D.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; + } + + hr = d3dDevice->CreateShaderResourceView(tex, &SRVDesc, textureView); + if (FAILED(hr)) + { tex->Release(); + return hr; } } - } - break; - case D3D11_RESOURCE_DIMENSION_TEXTURE2D: - { - D3D11_TEXTURE2D_DESC desc; - desc.Width = static_cast(width); - desc.Height = static_cast(height); - desc.MipLevels = static_cast(mipCount); - desc.ArraySize = static_cast(arraySize); - desc.Format = format; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = usage; - desc.BindFlags = bindFlags; - desc.CPUAccessFlags = cpuAccessFlags; - if (isCubeMap) + if (texture) { - desc.MiscFlags = miscFlags | D3D11_RESOURCE_MISC_TEXTURECUBE; + *texture = tex; } else { - desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); + SetDebugObjectName(tex, "DDSTextureLoader"); + tex->Release(); } + } + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: { + D3D11_TEXTURE2D_DESC desc; + desc.Width = static_cast(width); + desc.Height = static_cast(height); + desc.MipLevels = static_cast(mipCount); + desc.ArraySize = static_cast(arraySize); + desc.Format = format; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + if (isCubeMap) + { + desc.MiscFlags = miscFlags | D3D11_RESOURCE_MISC_TEXTURECUBE; + } + else + { + desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); + } - ID3D11Texture2D* tex = nullptr; - hr = d3dDevice->CreateTexture2D(&desc, - initData, - &tex - ); - if (SUCCEEDED(hr) && tex) + ID3D11Texture2D* tex = nullptr; + hr = d3dDevice->CreateTexture2D(&desc, initData, &tex); + if (SUCCEEDED(hr) && tex) + { + if (textureView) { - if (textureView) - { - D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; - SRVDesc.Format = format; + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; + SRVDesc.Format = format; - if (isCubeMap) - { - if (arraySize > 6) - { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; - SRVDesc.TextureCubeArray.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - - // Earlier we set arraySize to (NumCubes * 6) - SRVDesc.TextureCubeArray.NumCubes = static_cast(arraySize / 6); - } - else - { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; - SRVDesc.TextureCube.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - } - } - else if (arraySize > 1) + if (isCubeMap) + { + if (arraySize > 6) { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; - SRVDesc.Texture2DArray.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - SRVDesc.Texture2DArray.ArraySize = static_cast(arraySize); + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBEARRAY; + SRVDesc.TextureCubeArray.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; + + // Earlier we set arraySize to (NumCubes * 6) + SRVDesc.TextureCubeArray.NumCubes = static_cast(arraySize / 6); } else { - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; - SRVDesc.Texture2D.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - } - - hr = d3dDevice->CreateShaderResourceView(tex, - &SRVDesc, - textureView - ); - if (FAILED(hr)) - { - tex->Release(); - return hr; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURECUBE; + SRVDesc.TextureCube.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; } } - - if (texture) + else if (arraySize > 1) { - *texture = tex; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2DARRAY; + SRVDesc.Texture2DArray.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; + SRVDesc.Texture2DArray.ArraySize = static_cast(arraySize); } else { - SetDebugObjectName(tex, "DDSTextureLoader"); + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.Texture2D.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; + } + + hr = d3dDevice->CreateShaderResourceView(tex, &SRVDesc, textureView); + if (FAILED(hr)) + { tex->Release(); + return hr; } } - } - break; - case D3D11_RESOURCE_DIMENSION_TEXTURE3D: + if (texture) + { + *texture = tex; + } + else + { + SetDebugObjectName(tex, "DDSTextureLoader"); + tex->Release(); + } + } + } + break; + + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: { + D3D11_TEXTURE3D_DESC desc; + desc.Width = static_cast(width); + desc.Height = static_cast(height); + desc.Depth = static_cast(depth); + desc.MipLevels = static_cast(mipCount); + desc.Format = format; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); + + ID3D11Texture3D* tex = nullptr; + hr = d3dDevice->CreateTexture3D(&desc, initData, &tex); + if (SUCCEEDED(hr) && tex) { - D3D11_TEXTURE3D_DESC desc; - desc.Width = static_cast(width); - desc.Height = static_cast(height); - desc.Depth = static_cast(depth); - desc.MipLevels = static_cast(mipCount); - desc.Format = format; - desc.Usage = usage; - desc.BindFlags = bindFlags; - desc.CPUAccessFlags = cpuAccessFlags; - desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); - - ID3D11Texture3D* tex = nullptr; - hr = d3dDevice->CreateTexture3D(&desc, - initData, - &tex - ); - if (SUCCEEDED(hr) && tex) + if (textureView) { - if (textureView) - { - D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; - SRVDesc.Format = format; + D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; + SRVDesc.Format = format; - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; - SRVDesc.Texture3D.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; + SRVDesc.Texture3D.MipLevels = (!mipCount) ? UINT(-1) : desc.MipLevels; - hr = d3dDevice->CreateShaderResourceView(tex, - &SRVDesc, - textureView - ); - if (FAILED(hr)) - { - tex->Release(); - return hr; - } - } - - if (texture) + hr = d3dDevice->CreateShaderResourceView(tex, &SRVDesc, textureView); + if (FAILED(hr)) { - *texture = tex; - } - else - { - SetDebugObjectName(tex, "DDSTextureLoader"); tex->Release(); + return hr; } } + + if (texture) + { + *texture = tex; + } + else + { + SetDebugObjectName(tex, "DDSTextureLoader"); + tex->Release(); + } } - break; + } + break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } return hr; } //-------------------------------------------------------------------------------------- - HRESULT CreateTextureFromDDS( - _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_ const DDS_HEADER* header, - _In_reads_bytes_(bitSize) const uint8_t* bitData, - _In_ size_t bitSize, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ DDS_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept + HRESULT CreateTextureFromDDS(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_ const DDS_HEADER* header, + _In_reads_bytes_(bitSize) const uint8_t* bitData, + _In_ size_t bitSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ DDS_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept { HRESULT hr = S_OK; - const UINT width = header->width; - UINT height = header->height; - UINT depth = header->depth; + const UINT width = header->width; + UINT height = header->height; + UINT depth = header->depth; - uint32_t resDim = D3D11_RESOURCE_DIMENSION_UNKNOWN; - UINT arraySize = 1; - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; - bool isCubeMap = false; + uint32_t resDim = D3D11_RESOURCE_DIMENSION_UNKNOWN; + UINT arraySize = 1; + DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; + bool isCubeMap = false; size_t mipCount = header->mipMapCount; if (0 == mipCount) @@ -1374,8 +1300,7 @@ namespace mipCount = 1; } - if ((header->ddspf.flags & DDS_FOURCC) && - (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC)) + if ((header->ddspf.flags & DDS_FOURCC) && (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC)) { auto d3d10ext = reinterpret_cast(reinterpret_cast(header) + sizeof(DDS_HEADER)); @@ -1391,8 +1316,7 @@ namespace case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: case DXGI_FORMAT_420_OPAQUE: - if ((d3d10ext->resourceDimension != D3D11_RESOURCE_DIMENSION_TEXTURE2D) - || (width % 2) != 0 || (height % 2) != 0) + if ((d3d10ext->resourceDimension != D3D11_RESOURCE_DIMENSION_TEXTURE2D) || (width % 2) != 0 || (height % 2) != 0) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } @@ -1418,8 +1342,7 @@ namespace case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: case DXGI_FORMAT_P8: - case DXGI_FORMAT_A8P8: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + case DXGI_FORMAT_A8P8: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); default: if (BitsPerPixel(d3d10ext->dxgiFormat) == 0) @@ -1462,8 +1385,7 @@ namespace } break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } resDim = d3d10ext->resourceDimension; @@ -1495,7 +1417,7 @@ namespace isCubeMap = true; } - depth = 1; + depth = 1; resDim = D3D11_RESOURCE_DIMENSION_TEXTURE2D; // Note there's no way for a legacy Direct3D 9 DDS to express a '1D' texture @@ -1513,8 +1435,7 @@ namespace switch (resDim) { case D3D11_RESOURCE_DIMENSION_TEXTURE1D: - if ((arraySize > D3D11_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) || - (width > D3D11_REQ_TEXTURE1D_U_DIMENSION)) + if ((arraySize > D3D11_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) || (width > D3D11_REQ_TEXTURE1D_U_DIMENSION)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } @@ -1524,33 +1445,28 @@ namespace if (isCubeMap) { // This is the right bound because we set arraySize to (NumCubes*6) above - if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || - (width > D3D11_REQ_TEXTURECUBE_DIMENSION) || - (height > D3D11_REQ_TEXTURECUBE_DIMENSION)) + if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (width > D3D11_REQ_TEXTURECUBE_DIMENSION) + || (height > D3D11_REQ_TEXTURECUBE_DIMENSION)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } } - else if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || - (width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION) || - (height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION)) + else if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (width > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION) + || (height > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } break; case D3D11_RESOURCE_DIMENSION_TEXTURE3D: - if ((arraySize > 1) || - (width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || - (height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || - (depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)) + if ((arraySize > 1) || (width > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (height > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) + || (depth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } bool autogen = false; @@ -1558,12 +1474,11 @@ namespace { // See if format is supported for auto-gen mipmaps (varies by feature level) UINT fmtSupport = 0; - hr = d3dDevice->CheckFormatSupport(format, &fmtSupport); + hr = d3dDevice->CheckFormatSupport(format, &fmtSupport); if (SUCCEEDED(hr) && (fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN)) { // 10level9 feature levels do not support auto-gen mipgen for volume textures - if ((resDim != D3D11_RESOURCE_DIMENSION_TEXTURE3D) - || (d3dDevice->GetFeatureLevel() >= D3D_FEATURE_LEVEL_10_0)) + if ((resDim != D3D11_RESOURCE_DIMENSION_TEXTURE3D) || (d3dDevice->GetFeatureLevel() >= D3D_FEATURE_LEVEL_10_0)) { autogen = true; } @@ -1574,8 +1489,13 @@ namespace { // Create texture with auto-generated mipmaps ID3D11Resource* tex = nullptr; - hr = CreateD3DResources(d3dDevice, - resDim, width, height, depth, 0, arraySize, + hr = CreateD3DResources(d3dDevice, + resDim, + width, + height, + depth, + 0, + arraySize, format, usage, bindFlags | D3D11_BIND_RENDER_TARGET, @@ -1584,12 +1504,13 @@ namespace loadFlags, isCubeMap, nullptr, - &tex, textureView); + &tex, + textureView); if (SUCCEEDED(hr)) { size_t numBytes = 0; size_t rowBytes = 0; - hr = GetSurfaceInfo(width, height, format, &numBytes, &rowBytes, nullptr); + hr = GetSurfaceInfo(width, height, format, &numBytes, &rowBytes, nullptr); if (FAILED(hr)) return hr; @@ -1611,13 +1532,13 @@ namespace switch (desc.ViewDimension) { - case D3D_SRV_DIMENSION_TEXTURE1D: mipLevels = desc.Texture1D.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURE1DARRAY: mipLevels = desc.Texture1DArray.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURE2D: mipLevels = desc.Texture2D.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURE2DARRAY: mipLevels = desc.Texture2DArray.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURECUBE: mipLevels = desc.TextureCube.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURECUBEARRAY:mipLevels = desc.TextureCubeArray.MipLevels; break; - case D3D_SRV_DIMENSION_TEXTURE3D: mipLevels = desc.Texture3D.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE1D: mipLevels = desc.Texture1D.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE1DARRAY: mipLevels = desc.Texture1DArray.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE2D: mipLevels = desc.Texture2D.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE2DARRAY: mipLevels = desc.Texture2DArray.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURECUBE: mipLevels = desc.TextureCube.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURECUBEARRAY: mipLevels = desc.TextureCubeArray.MipLevels; break; + case D3D_SRV_DIMENSION_TEXTURE3D: mipLevels = desc.Texture3D.MipLevels; break; default: (*textureView)->Release(); *textureView = nullptr; @@ -1640,7 +1561,8 @@ namespace } const UINT res = D3D11CalcSubresource(0, item, mipLevels); - d3dContext->UpdateSubresource(tex, res, nullptr, pSrcBits, static_cast(rowBytes), static_cast(numBytes)); + d3dContext + ->UpdateSubresource(tex, res, nullptr, pSrcBits, static_cast(rowBytes), static_cast(numBytes)); pSrcBits += numBytes; } } @@ -1671,23 +1593,43 @@ namespace } size_t skipMip = 0; - size_t twidth = 0; + size_t twidth = 0; size_t theight = 0; - size_t tdepth = 0; - hr = FillInitData(width, height, depth, mipCount, arraySize, - format, maxsize, bitSize, bitData, - twidth, theight, tdepth, skipMip, initData.get()); + size_t tdepth = 0; + hr = FillInitData(width, + height, + depth, + mipCount, + arraySize, + format, + maxsize, + bitSize, + bitData, + twidth, + theight, + tdepth, + skipMip, + initData.get()); if (SUCCEEDED(hr)) { hr = CreateD3DResources(d3dDevice, - resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, + resDim, + twidth, + theight, + tdepth, + mipCount - skipMip, + arraySize, format, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, isCubeMap, initData.get(), - texture, textureView); + texture, + textureView); if (FAILED(hr) && !maxsize && (mipCount > 1)) { @@ -1702,37 +1644,58 @@ namespace } else { - maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) - ? 256u /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ - : 2048u /*D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) ? 256u /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ + : + 2048u /*D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; } break; case D3D_FEATURE_LEVEL_9_3: - maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) - ? 256u /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ - : 4096u /*D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) ? 256u /*D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ + : + 4096u /*D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; break; - default: // D3D_FEATURE_LEVEL_10_0 & D3D_FEATURE_LEVEL_10_1 - maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) - ? 2048u /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ - : 8192u /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; + default: // D3D_FEATURE_LEVEL_10_0 & D3D_FEATURE_LEVEL_10_1 + maxsize = (resDim == D3D11_RESOURCE_DIMENSION_TEXTURE3D) ? 2048u /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/ + : + 8192u /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; break; } - hr = FillInitData(width, height, depth, mipCount, arraySize, format, maxsize, bitSize, bitData, - twidth, theight, tdepth, skipMip, initData.get()); + hr = FillInitData(width, + height, + depth, + mipCount, + arraySize, + format, + maxsize, + bitSize, + bitData, + twidth, + theight, + tdepth, + skipMip, + initData.get()); if (SUCCEEDED(hr)) { hr = CreateD3DResources(d3dDevice, - resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, + resDim, + twidth, + theight, + tdepth, + mipCount - skipMip, + arraySize, format, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, isCubeMap, initData.get(), - texture, textureView); + texture, + textureView); } } } @@ -1741,7 +1704,6 @@ namespace return hr; } - //-------------------------------------------------------------------------------------- DDS_ALPHA_MODE GetAlphaMode(_In_ const DDS_HEADER* header) noexcept { @@ -1749,23 +1711,20 @@ namespace { if (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC) { - auto d3d10ext = reinterpret_cast(reinterpret_cast(header) + sizeof(DDS_HEADER)); + auto d3d10ext = reinterpret_cast(reinterpret_cast(header) + sizeof(DDS_HEADER)); const auto mode = static_cast(d3d10ext->miscFlags2 & DDS_MISC_FLAGS2_ALPHA_MODE_MASK); switch (mode) { case DDS_ALPHA_MODE_STRAIGHT: case DDS_ALPHA_MODE_PREMULTIPLIED: case DDS_ALPHA_MODE_OPAQUE: - case DDS_ALPHA_MODE_CUSTOM: - return mode; + case DDS_ALPHA_MODE_CUSTOM: return mode; case DDS_ALPHA_MODE_UNKNOWN: - default: - break; + default: break; } } - else if ((MAKEFOURCC('D', 'X', 'T', '2') == header->ddspf.fourCC) - || (MAKEFOURCC('D', 'X', 'T', '4') == header->ddspf.fourCC)) + else if ((MAKEFOURCC('D', 'X', 'T', '2') == header->ddspf.fourCC) || (MAKEFOURCC('D', 'X', 'T', '4') == header->ddspf.fourCC)) { return DDS_ALPHA_MODE_PREMULTIPLIED; } @@ -1775,127 +1734,125 @@ namespace } //-------------------------------------------------------------------------------------- - void SetDebugTextureInfo( - _In_z_ const wchar_t* fileName, - _In_opt_ ID3D11Resource** texture, - _In_opt_ ID3D11ShaderResourceView** textureView) noexcept + void SetDebugTextureInfo(_In_z_ const wchar_t* fileName, + _In_opt_ ID3D11Resource** texture, + _In_opt_ ID3D11ShaderResourceView** textureView) noexcept { - #if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#if !defined(NO_D3D11_DEBUG_NAME) && (defined(_DEBUG) || defined(PROFILE)) if (texture || textureView) { - CHAR strFileA[MAX_PATH]; - const int result = WideCharToMultiByte(CP_UTF8, - WC_NO_BEST_FIT_CHARS, - fileName, - -1, - strFileA, - MAX_PATH, - nullptr, - nullptr - ); + CHAR strFileA[MAX_PATH]; + const int result = WideCharToMultiByte(CP_UTF8, WC_NO_BEST_FIT_CHARS, fileName, -1, strFileA, MAX_PATH, nullptr, nullptr); if (result > 0) { if (texture && *texture) { - (*texture)->SetPrivateData(WKPDID_D3DDebugObjectName, - static_cast(result), - strFileA - ); + (*texture)->SetPrivateData(WKPDID_D3DDebugObjectName, static_cast(result), strFileA); } if (textureView && *textureView) { - (*textureView)->SetPrivateData(WKPDID_D3DDebugObjectName, - static_cast(result), - strFileA - ); + (*textureView)->SetPrivateData(WKPDID_D3DDebugObjectName, static_cast(result), strFileA); } } } - #else +#else UNREFERENCED_PARAMETER(fileName); UNREFERENCED_PARAMETER(texture); UNREFERENCED_PARAMETER(textureView); - #endif +#endif } } // anonymous namespace //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemory( - ID3D11Device* d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - size_t maxsize, - DDS_ALPHA_MODE* alphaMode) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemory(ID3D11Device* d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode) noexcept { - return CreateDDSTextureFromMemoryEx(d3dDevice, nullptr, - ddsData, ddsDataSize, + return CreateDDSTextureFromMemoryEx(d3dDevice, + nullptr, + ddsData, + ddsDataSize, maxsize, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, DDS_LOADER_DEFAULT, - texture, textureView, alphaMode); + texture, + textureView, + alphaMode); } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemory( - ID3D11Device* d3dDevice, - ID3D11DeviceContext* d3dContext, - const uint8_t* ddsData, - size_t ddsDataSize, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - size_t maxsize, - DDS_ALPHA_MODE* alphaMode) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemory(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const uint8_t* ddsData, + size_t ddsDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode) noexcept { - return CreateDDSTextureFromMemoryEx(d3dDevice, d3dContext, - ddsData, ddsDataSize, + return CreateDDSTextureFromMemoryEx(d3dDevice, + d3dContext, + ddsData, + ddsDataSize, maxsize, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, DDS_LOADER_DEFAULT, - texture, textureView, alphaMode); + texture, + textureView, + alphaMode); } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemoryEx( - ID3D11Device* d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - size_t maxsize, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - DDS_LOADER_FLAGS loadFlags, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - DDS_ALPHA_MODE* alphaMode) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemoryEx(ID3D11Device* d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + DDS_LOADER_FLAGS loadFlags, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode) noexcept { - return CreateDDSTextureFromMemoryEx(d3dDevice, nullptr, - ddsData, ddsDataSize, + return CreateDDSTextureFromMemoryEx(d3dDevice, + nullptr, + ddsData, + ddsDataSize, maxsize, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, - texture, textureView, alphaMode); + texture, + textureView, + alphaMode); } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemoryEx( - ID3D11Device* d3dDevice, - ID3D11DeviceContext* d3dContext, - const uint8_t* ddsData, - size_t ddsDataSize, - size_t maxsize, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - DDS_LOADER_FLAGS loadFlags, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - DDS_ALPHA_MODE* alphaMode) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemoryEx(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const uint8_t* ddsData, + size_t ddsDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + DDS_LOADER_FLAGS loadFlags, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode) noexcept { if (texture) { @@ -1921,26 +1878,29 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( } // Validate DDS file in memory - const DDS_HEADER* header = nullptr; - const uint8_t* bitData = nullptr; - size_t bitSize = 0; - - HRESULT hr = LoadTextureDataFromMemory(ddsData, ddsDataSize, - &header, - &bitData, - &bitSize - ); + const DDS_HEADER* header = nullptr; + const uint8_t* bitData = nullptr; + size_t bitSize = 0; + + HRESULT hr = LoadTextureDataFromMemory(ddsData, ddsDataSize, &header, &bitData, &bitSize); if (FAILED(hr)) { return hr; } - hr = CreateTextureFromDDS(d3dDevice, d3dContext, - header, bitData, bitSize, + hr = CreateTextureFromDDS(d3dDevice, + d3dContext, + header, + bitData, + bitSize, maxsize, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, - texture, textureView); + texture, + textureView); if (SUCCEEDED(hr)) { if (texture && *texture) @@ -1961,76 +1921,87 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( } //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFile( - ID3D11Device* d3dDevice, - const wchar_t* fileName, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - size_t maxsize, - DDS_ALPHA_MODE* alphaMode) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFile(ID3D11Device* d3dDevice, + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode) noexcept { - return CreateDDSTextureFromFileEx(d3dDevice, nullptr, - fileName, maxsize, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + return CreateDDSTextureFromFileEx(d3dDevice, + nullptr, + fileName, + maxsize, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, DDS_LOADER_DEFAULT, - texture, textureView, alphaMode); + texture, + textureView, + alphaMode); } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFile( - ID3D11Device* d3dDevice, - ID3D11DeviceContext* d3dContext, - const wchar_t* fileName, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - size_t maxsize, - DDS_ALPHA_MODE* alphaMode) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFile(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode) noexcept { - return CreateDDSTextureFromFileEx(d3dDevice, d3dContext, + return CreateDDSTextureFromFileEx(d3dDevice, + d3dContext, fileName, maxsize, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, DDS_LOADER_DEFAULT, - texture, textureView, alphaMode); + texture, + textureView, + alphaMode); } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFileEx( - ID3D11Device* d3dDevice, - const wchar_t* fileName, - size_t maxsize, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - DDS_LOADER_FLAGS loadFlags, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - DDS_ALPHA_MODE* alphaMode) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFileEx(ID3D11Device* d3dDevice, + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + DDS_LOADER_FLAGS loadFlags, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode) noexcept { - return CreateDDSTextureFromFileEx(d3dDevice, nullptr, + return CreateDDSTextureFromFileEx(d3dDevice, + nullptr, fileName, maxsize, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, - texture, textureView, alphaMode); + texture, + textureView, + alphaMode); } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFileEx( - ID3D11Device* d3dDevice, - ID3D11DeviceContext* d3dContext, - const wchar_t* fileName, - size_t maxsize, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - DDS_LOADER_FLAGS loadFlags, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - DDS_ALPHA_MODE* alphaMode) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFileEx(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + DDS_LOADER_FLAGS loadFlags, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + DDS_ALPHA_MODE* alphaMode) noexcept { if (texture) { @@ -2055,28 +2026,30 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( return E_INVALIDARG; } - const DDS_HEADER* header = nullptr; - const uint8_t* bitData = nullptr; - size_t bitSize = 0; + const DDS_HEADER* header = nullptr; + const uint8_t* bitData = nullptr; + size_t bitSize = 0; std::unique_ptr ddsData; - HRESULT hr = LoadTextureDataFromFile(fileName, - ddsData, - &header, - &bitData, - &bitSize - ); + HRESULT hr = LoadTextureDataFromFile(fileName, ddsData, &header, &bitData, &bitSize); if (FAILED(hr)) { return hr; } - hr = CreateTextureFromDDS(d3dDevice, d3dContext, - header, bitData, bitSize, + hr = CreateTextureFromDDS(d3dDevice, + d3dContext, + header, + bitData, + bitSize, maxsize, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, - texture, textureView); + texture, + textureView); if (SUCCEEDED(hr)) { diff --git a/DDSTextureLoader/DDSTextureLoader11.h b/DDSTextureLoader/DDSTextureLoader11.h index 341d6cf2..e631f7ff 100644 --- a/DDSTextureLoader/DDSTextureLoader11.h +++ b/DDSTextureLoader/DDSTextureLoader11.h @@ -18,23 +18,22 @@ #include -#pragma comment(lib,"dxguid.lib") +#pragma comment(lib, "dxguid.lib") #include #include - namespace DirectX { #ifndef DDS_ALPHA_MODE_DEFINED #define DDS_ALPHA_MODE_DEFINED enum DDS_ALPHA_MODE : uint32_t { - DDS_ALPHA_MODE_UNKNOWN = 0, - DDS_ALPHA_MODE_STRAIGHT = 1, + DDS_ALPHA_MODE_UNKNOWN = 0, + DDS_ALPHA_MODE_STRAIGHT = 1, DDS_ALPHA_MODE_PREMULTIPLIED = 2, - DDS_ALPHA_MODE_OPAQUE = 3, - DDS_ALPHA_MODE_CUSTOM = 4, + DDS_ALPHA_MODE_OPAQUE = 3, + DDS_ALPHA_MODE_CUSTOM = 4, }; #endif @@ -43,8 +42,8 @@ namespace DirectX enum DDS_LOADER_FLAGS : uint32_t { - DDS_LOADER_DEFAULT = 0, - DDS_LOADER_FORCE_SRGB = 0x1, + DDS_LOADER_DEFAULT = 0, + DDS_LOADER_FORCE_SRGB = 0x1, DDS_LOADER_IGNORE_SRGB = 0x2, }; @@ -62,98 +61,90 @@ namespace DirectX #endif // Standard version - HRESULT CreateDDSTextureFromMemory( - _In_ ID3D11Device* d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _In_ size_t maxsize = 0, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; - - HRESULT CreateDDSTextureFromFile( - _In_ ID3D11Device* d3dDevice, - _In_z_ const wchar_t* szFileName, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _In_ size_t maxsize = 0, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; + HRESULT CreateDDSTextureFromMemory(_In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; + + HRESULT CreateDDSTextureFromFile(_In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; // Standard version with optional auto-gen mipmap support - HRESULT CreateDDSTextureFromMemory( - _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _In_ size_t maxsize = 0, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; - - HRESULT CreateDDSTextureFromFile( - _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_z_ const wchar_t* szFileName, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _In_ size_t maxsize = 0, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; + HRESULT CreateDDSTextureFromMemory(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; + + HRESULT CreateDDSTextureFromFile(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; // Extended version - HRESULT CreateDDSTextureFromMemoryEx( - _In_ ID3D11Device* d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ DDS_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; - - HRESULT CreateDDSTextureFromFileEx( - _In_ ID3D11Device* d3dDevice, - _In_z_ const wchar_t* szFileName, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ DDS_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; + HRESULT CreateDDSTextureFromMemoryEx(_In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ DDS_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; + + HRESULT CreateDDSTextureFromFileEx(_In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ DDS_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; // Extended version with optional auto-gen mipmap support - HRESULT CreateDDSTextureFromMemoryEx( - _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ DDS_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; - - HRESULT CreateDDSTextureFromFileEx( - _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_z_ const wchar_t* szFileName, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ DDS_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; -} + HRESULT CreateDDSTextureFromMemoryEx(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ DDS_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; + + HRESULT CreateDDSTextureFromFileEx(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ DDS_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr) noexcept; +} // namespace DirectX diff --git a/DDSTextureLoader/DDSTextureLoader12.cpp b/DDSTextureLoader/DDSTextureLoader12.cpp index 8239b74f..7fd42223 100644 --- a/DDSTextureLoader/DDSTextureLoader12.cpp +++ b/DDSTextureLoader/DDSTextureLoader12.cpp @@ -60,9 +60,8 @@ using namespace DirectX; // Macros //-------------------------------------------------------------------------------------- #ifndef MAKEFOURCC -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | \ - ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 )) +#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24)) #endif /* defined(MAKEFOURCC) */ // HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW) @@ -84,42 +83,42 @@ using namespace DirectX; //-------------------------------------------------------------------------------------- namespace { -#pragma pack(push,1) +#pragma pack(push, 1) constexpr uint32_t DDS_MAGIC = 0x20534444; // "DDS " struct DDS_PIXELFORMAT { - uint32_t size; - uint32_t flags; - uint32_t fourCC; - uint32_t RGBBitCount; - uint32_t RBitMask; - uint32_t GBitMask; - uint32_t BBitMask; - uint32_t ABitMask; + uint32_t size; + uint32_t flags; + uint32_t fourCC; + uint32_t RGBBitCount; + uint32_t RBitMask; + uint32_t GBitMask; + uint32_t BBitMask; + uint32_t ABitMask; }; -#define DDS_FOURCC 0x00000004 // DDPF_FOURCC -#define DDS_RGB 0x00000040 // DDPF_RGB -#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE -#define DDS_ALPHA 0x00000002 // DDPF_ALPHA -#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV +#define DDS_FOURCC 0x00000004 // DDPF_FOURCC +#define DDS_RGB 0x00000040 // DDPF_RGB +#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE +#define DDS_ALPHA 0x00000002 // DDPF_ALPHA +#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV -#define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH +#define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH -#define DDS_HEIGHT 0x00000002 // DDSD_HEIGHT +#define DDS_HEIGHT 0x00000002 // DDSD_HEIGHT -#define DDS_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX -#define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX -#define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY -#define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY -#define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ -#define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ +#define DDS_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX +#define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX +#define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY +#define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY +#define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ +#define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ -#define DDS_CUBEMAP_ALLFACES ( DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX |\ - DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY |\ - DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEZ ) +#define DDS_CUBEMAP_ALLFACES \ + (DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX | DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY | DDS_CUBEMAP_POSITIVEZ \ + | DDS_CUBEMAP_NEGATIVEZ) #define DDS_CUBEMAP 0x00000200 // DDSCAPS2_CUBEMAP @@ -148,11 +147,11 @@ namespace struct DDS_HEADER_DXT10 { - DXGI_FORMAT dxgiFormat; - uint32_t resourceDimension; - uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG - uint32_t arraySize; - uint32_t miscFlags2; + DXGI_FORMAT dxgiFormat; + uint32_t resourceDimension; + uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG + uint32_t arraySize; + uint32_t miscFlags2; }; #pragma pack(pop) @@ -161,28 +160,38 @@ namespace static_assert(sizeof(DDS_HEADER) == 124, "DDS Header size mismatch"); static_assert(sizeof(DDS_HEADER_DXT10) == 20, "DDS DX10 Extended Header size mismatch"); - constexpr size_t DDS_MIN_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); + constexpr size_t DDS_MIN_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); constexpr size_t DDS_DX10_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10); static_assert(DDS_DX10_HEADER_SIZE > DDS_MIN_HEADER_SIZE, "DDS DX10 Header should be larger than standard header"); //-------------------------------------------------------------------------------------- #ifdef _WIN32 - struct handle_closer { void operator()(HANDLE h) noexcept { if (h) CloseHandle(h); } }; + struct handle_closer + { + void operator()(HANDLE h) noexcept + { + if (h) + CloseHandle(h); + } + }; using ScopedHandle = std::unique_ptr; - inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } + inline HANDLE safe_handle(HANDLE h) noexcept + { + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; + } #endif -#if !defined(NO_D3D12_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#if !defined(NO_D3D12_DEBUG_NAME) && (defined(_DEBUG) || defined(PROFILE)) template - inline void SetDebugObjectName(_In_ ID3D12DeviceChild* resource, _In_z_ const wchar_t(&name)[TNameLength]) noexcept + inline void SetDebugObjectName(_In_ ID3D12DeviceChild* resource, _In_z_ const wchar_t (&name)[TNameLength]) noexcept { resource->SetName(name); } #else template - inline void SetDebugObjectName(_In_ ID3D12DeviceChild*, _In_z_ const wchar_t(&)[TNameLength]) noexcept + inline void SetDebugObjectName(_In_ ID3D12DeviceChild*, _In_z_ const wchar_t (&)[TNameLength]) noexcept {} #endif @@ -201,14 +210,12 @@ namespace return count; } - //-------------------------------------------------------------------------------------- - HRESULT LoadTextureDataFromMemory( - _In_reads_(ddsDataSize) const uint8_t* ddsData, - size_t ddsDataSize, - const DDS_HEADER** header, - const uint8_t** bitData, - size_t* bitSize) noexcept + HRESULT LoadTextureDataFromMemory(_In_reads_(ddsDataSize) const uint8_t* ddsData, + size_t ddsDataSize, + const DDS_HEADER** header, + const uint8_t** bitData, + size_t* bitSize) noexcept { if (!header || !bitData || !bitSize) { @@ -237,16 +244,14 @@ namespace auto hdr = reinterpret_cast(ddsData + sizeof(uint32_t)); // Verify header to validate DDS file - if (hdr->size != sizeof(DDS_HEADER) || - hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) + if (hdr->size != sizeof(DDS_HEADER) || hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) { return E_FAIL; } // Check for DX10 extension bool bDXT10Header = false; - if ((hdr->ddspf.flags & DDS_FOURCC) && - (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) + if ((hdr->ddspf.flags & DDS_FOURCC) && (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) { // Must be long enough for both headers and magic value if (ddsDataSize < DDS_DX10_HEADER_SIZE) @@ -258,23 +263,20 @@ namespace } // setup the pointers in the process request - *header = hdr; - auto offset = DDS_MIN_HEADER_SIZE - + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0u); - *bitData = ddsData + offset; - *bitSize = ddsDataSize - offset; + *header = hdr; + auto offset = DDS_MIN_HEADER_SIZE + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0u); + *bitData = ddsData + offset; + *bitSize = ddsDataSize - offset; return S_OK; } - //-------------------------------------------------------------------------------------- - HRESULT LoadTextureDataFromFile( - _In_z_ const wchar_t* fileName, - std::unique_ptr& ddsData, - const DDS_HEADER** header, - const uint8_t** bitData, - size_t* bitSize) noexcept + HRESULT LoadTextureDataFromFile(_In_z_ const wchar_t* fileName, + std::unique_ptr& ddsData, + const DDS_HEADER** header, + const uint8_t** bitData, + size_t* bitSize) noexcept { if (!header || !bitData || !bitSize) { @@ -283,12 +285,9 @@ namespace *bitSize = 0; - #ifdef _WIN32 - // open the file - ScopedHandle hFile(safe_handle(CreateFile2( - fileName, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); +#ifdef _WIN32 + // open the file + ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { @@ -323,12 +322,7 @@ namespace // read the data in DWORD bytesRead = 0; - if (!ReadFile(hFile.get(), - ddsData.get(), - fileInfo.EndOfFile.LowPart, - &bytesRead, - nullptr - )) + if (!ReadFile(hFile.get(), ddsData.get(), fileInfo.EndOfFile.LowPart, &bytesRead, nullptr)) { ddsData.reset(); return HRESULT_FROM_WIN32(GetLastError()); @@ -342,7 +336,7 @@ namespace size_t len = fileInfo.EndOfFile.LowPart; - #else // !WIN32 +#else // !WIN32 std::ifstream inFile(std::filesystem::path(fileName), std::ios::in | std::ios::binary | std::ios::ate); if (!inFile) return E_FAIL; @@ -376,7 +370,7 @@ namespace inFile.close(); size_t len = fileLen; - #endif +#endif // DDS files always start with the same magic number ("DDS ") const auto dwMagicNumber = *reinterpret_cast(ddsData.get()); @@ -389,8 +383,7 @@ namespace auto hdr = reinterpret_cast(ddsData.get() + sizeof(uint32_t)); // Verify header to validate DDS file - if (hdr->size != sizeof(DDS_HEADER) || - hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) + if (hdr->size != sizeof(DDS_HEADER) || hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) { ddsData.reset(); return E_FAIL; @@ -398,8 +391,7 @@ namespace // Check for DX10 extension bool bDXT10Header = false; - if ((hdr->ddspf.flags & DDS_FOURCC) && - (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) + if ((hdr->ddspf.flags & DDS_FOURCC) && (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) { // Must be long enough for both headers and magic value if (len < DDS_DX10_HEADER_SIZE) @@ -412,16 +404,14 @@ namespace } // setup the pointers in the process request - *header = hdr; - auto offset = DDS_MIN_HEADER_SIZE - + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0u); - *bitData = ddsData.get() + offset; - *bitSize = len - offset; + *header = hdr; + auto offset = DDS_MIN_HEADER_SIZE + (bDXT10Header ? sizeof(DDS_HEADER_DXT10) : 0u); + *bitData = ddsData.get() + offset; + *bitSize = len - offset; return S_OK; } - //-------------------------------------------------------------------------------------- // Return the BPP for a particular format //-------------------------------------------------------------------------------------- @@ -432,14 +422,12 @@ namespace case DXGI_FORMAT_R32G32B32A32_TYPELESS: case DXGI_FORMAT_R32G32B32A32_FLOAT: case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - return 128; + case DXGI_FORMAT_R32G32B32A32_SINT: return 128; case DXGI_FORMAT_R32G32B32_TYPELESS: case DXGI_FORMAT_R32G32B32_FLOAT: case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return 96; + case DXGI_FORMAT_R32G32B32_SINT: return 96; case DXGI_FORMAT_R16G16B16A16_TYPELESS: case DXGI_FORMAT_R16G16B16A16_FLOAT: @@ -457,8 +445,7 @@ namespace case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: case DXGI_FORMAT_Y416: case DXGI_FORMAT_Y210: - case DXGI_FORMAT_Y216: - return 64; + case DXGI_FORMAT_Y216: return 64; case DXGI_FORMAT_R10G10B10A2_TYPELESS: case DXGI_FORMAT_R10G10B10A2_UNORM: @@ -497,13 +484,11 @@ namespace case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: case DXGI_FORMAT_AYUV: case DXGI_FORMAT_Y410: - case DXGI_FORMAT_YUY2: - return 32; + case DXGI_FORMAT_YUY2: return 32; case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: - case DXGI_FORMAT_V408: - return 24; + case DXGI_FORMAT_V408: return 24; case DXGI_FORMAT_R8G8_TYPELESS: case DXGI_FORMAT_R8G8_UNORM: @@ -522,13 +507,11 @@ namespace case DXGI_FORMAT_A8P8: case DXGI_FORMAT_B4G4R4A4_UNORM: case DXGI_FORMAT_P208: - case DXGI_FORMAT_V208: - return 16; + case DXGI_FORMAT_V208: return 16; case DXGI_FORMAT_NV12: case DXGI_FORMAT_420_OPAQUE: - case DXGI_FORMAT_NV11: - return 12; + case DXGI_FORMAT_NV11: return 12; case DXGI_FORMAT_R8_TYPELESS: case DXGI_FORMAT_R8_UNORM: @@ -553,49 +536,42 @@ namespace case DXGI_FORMAT_BC7_UNORM_SRGB: case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: - case DXGI_FORMAT_P8: - return 8; + case DXGI_FORMAT_P8: return 8; - case DXGI_FORMAT_R1_UNORM: - return 1; + case DXGI_FORMAT_R1_UNORM: return 1; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - return 4; + case DXGI_FORMAT_BC4_SNORM: return 4; - default: - return 0; + default: return 0; } } - //-------------------------------------------------------------------------------------- // Get surface information for a particular format //-------------------------------------------------------------------------------------- - HRESULT GetSurfaceInfo( - _In_ size_t width, - _In_ size_t height, - _In_ DXGI_FORMAT fmt, - _Out_opt_ size_t* outNumBytes, - _Out_opt_ size_t* outRowBytes, - _Out_opt_ size_t* outNumRows) noexcept + HRESULT GetSurfaceInfo(_In_ size_t width, + _In_ size_t height, + _In_ DXGI_FORMAT fmt, + _Out_opt_ size_t* outNumBytes, + _Out_opt_ size_t* outRowBytes, + _Out_opt_ size_t* outNumRows) noexcept { uint64_t numBytes = 0; uint64_t rowBytes = 0; - uint64_t numRows = 0; + uint64_t numRows = 0; - bool bc = false; - bool packed = false; - bool planar = false; - size_t bpe = 0; + bool bc = false; + bool packed = false; + bool planar = false; + size_t bpe = 0; switch (fmt) { - case DXGI_FORMAT_UNKNOWN: - return E_INVALIDARG; + case DXGI_FORMAT_UNKNOWN: return E_INVALIDARG; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: @@ -603,7 +579,7 @@ namespace case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: case DXGI_FORMAT_BC4_SNORM: - bc = true; + bc = true; bpe = 8; break; @@ -622,7 +598,7 @@ namespace case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: case DXGI_FORMAT_BC7_UNORM_SRGB: - bc = true; + bc = true; bpe = 16; break; @@ -630,13 +606,13 @@ namespace case DXGI_FORMAT_G8R8_G8B8_UNORM: case DXGI_FORMAT_YUY2: packed = true; - bpe = 4; + bpe = 4; break; case DXGI_FORMAT_Y210: case DXGI_FORMAT_Y216: packed = true; - bpe = 8; + bpe = 8; break; case DXGI_FORMAT_NV12: @@ -647,12 +623,12 @@ namespace return E_INVALIDARG; } planar = true; - bpe = 2; + bpe = 2; break; case DXGI_FORMAT_P208: planar = true; - bpe = 2; + bpe = 2; break; case DXGI_FORMAT_P010: @@ -663,11 +639,10 @@ namespace return E_INVALIDARG; } planar = true; - bpe = 4; + bpe = 4; break; - default: - break; + default: break; } if (bc) @@ -683,26 +658,26 @@ namespace numBlocksHigh = std::max(1u, (uint64_t(height) + 3u) / 4u); } rowBytes = numBlocksWide * bpe; - numRows = numBlocksHigh; + numRows = numBlocksHigh; numBytes = rowBytes * numBlocksHigh; } else if (packed) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } else if (fmt == DXGI_FORMAT_NV11) { rowBytes = ((uint64_t(width) + 3u) >> 2) * 4u; - numRows = uint64_t(height) * 2u; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data + numRows = uint64_t(height) * 2u; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data numBytes = rowBytes * numRows; } else if (planar) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; numBytes = (rowBytes * uint64_t(height)) + ((rowBytes * uint64_t(height) + 1u) >> 1); - numRows = height + ((uint64_t(height) + 1u) >> 1); + numRows = height + ((uint64_t(height) + 1u) >> 1); } else { @@ -711,17 +686,17 @@ namespace return E_INVALIDARG; rowBytes = (uint64_t(width) * bpp + 7u) / 8u; // round up to nearest byte - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } - #if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) +#if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) static_assert(sizeof(size_t) == 4, "Not a 32-bit platform!"); if (numBytes > UINT32_MAX || rowBytes > UINT32_MAX || numRows > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; - #else +#else static_assert(sizeof(size_t) == 8, "Not a 64-bit platform!"); - #endif +#endif if (outNumBytes) { @@ -739,9 +714,8 @@ namespace return S_OK; } - //-------------------------------------------------------------------------------------- -#define ISBITMASK( r,g,b,a ) ( ddpf.RBitMask == r && ddpf.GBitMask == g && ddpf.BBitMask == b && ddpf.ABitMask == a ) +#define ISBITMASK(r, g, b, a) (ddpf.RBitMask == r && ddpf.GBitMask == g && ddpf.BBitMask == b && ddpf.ABitMask == a) DXGI_FORMAT GetDXGIFormat(const DDS_PIXELFORMAT& ddpf) noexcept { @@ -841,8 +815,7 @@ namespace // No 3:3:2 or paletted DXGI formats aka D3DFMT_R3G3B2, D3DFMT_P8 break; - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } } else if (ddpf.flags & DDS_LUMINANCE) @@ -874,8 +847,7 @@ namespace } break; - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } } else if (ddpf.flags & DDS_ALPHA) @@ -909,8 +881,7 @@ namespace } break; - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } // No DXGI format maps to DDPF_BUMPLUMINANCE aka D3DFMT_L6V5U5, D3DFMT_X8L8V8U8 @@ -986,7 +957,7 @@ namespace // Check for D3DFORMAT enums being set here switch (ddpf.fourCC) { - case 36: // D3DFMT_A16B16G16R16 + case 36: // D3DFMT_A16B16G16R16 return DXGI_FORMAT_R16G16B16A16_UNORM; case 110: // D3DFMT_Q16W16V16U16 @@ -1010,10 +981,9 @@ namespace case 116: // D3DFMT_A32B32G32R32F return DXGI_FORMAT_R32G32B32A32_FLOAT; - // No DXGI format maps to D3DFMT_CxV8U8 + // No DXGI format maps to D3DFMT_CxV8U8 - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } } @@ -1022,71 +992,52 @@ namespace #undef ISBITMASK - //-------------------------------------------------------------------------------------- DXGI_FORMAT MakeSRGB(_In_ DXGI_FORMAT format) noexcept { switch (format) { - case DXGI_FORMAT_R8G8B8A8_UNORM: - return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + case DXGI_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - case DXGI_FORMAT_BC1_UNORM: - return DXGI_FORMAT_BC1_UNORM_SRGB; + case DXGI_FORMAT_BC1_UNORM: return DXGI_FORMAT_BC1_UNORM_SRGB; - case DXGI_FORMAT_BC2_UNORM: - return DXGI_FORMAT_BC2_UNORM_SRGB; + case DXGI_FORMAT_BC2_UNORM: return DXGI_FORMAT_BC2_UNORM_SRGB; - case DXGI_FORMAT_BC3_UNORM: - return DXGI_FORMAT_BC3_UNORM_SRGB; + case DXGI_FORMAT_BC3_UNORM: return DXGI_FORMAT_BC3_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8A8_UNORM: - return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8X8_UNORM: - return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8X8_UNORM: return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; - case DXGI_FORMAT_BC7_UNORM: - return DXGI_FORMAT_BC7_UNORM_SRGB; + case DXGI_FORMAT_BC7_UNORM: return DXGI_FORMAT_BC7_UNORM_SRGB; - default: - return format; + default: return format; } } - //-------------------------------------------------------------------------------------- inline DXGI_FORMAT MakeLinear(_In_ DXGI_FORMAT format) noexcept { switch (format) { - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - return DXGI_FORMAT_R8G8B8A8_UNORM; + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return DXGI_FORMAT_R8G8B8A8_UNORM; - case DXGI_FORMAT_BC1_UNORM_SRGB: - return DXGI_FORMAT_BC1_UNORM; + case DXGI_FORMAT_BC1_UNORM_SRGB: return DXGI_FORMAT_BC1_UNORM; - case DXGI_FORMAT_BC2_UNORM_SRGB: - return DXGI_FORMAT_BC2_UNORM; + case DXGI_FORMAT_BC2_UNORM_SRGB: return DXGI_FORMAT_BC2_UNORM; - case DXGI_FORMAT_BC3_UNORM_SRGB: - return DXGI_FORMAT_BC3_UNORM; + case DXGI_FORMAT_BC3_UNORM_SRGB: return DXGI_FORMAT_BC3_UNORM; - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - return DXGI_FORMAT_B8G8R8A8_UNORM; + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8A8_UNORM; - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - return DXGI_FORMAT_B8G8R8X8_UNORM; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8X8_UNORM; - case DXGI_FORMAT_BC7_UNORM_SRGB: - return DXGI_FORMAT_BC7_UNORM; + case DXGI_FORMAT_BC7_UNORM_SRGB: return DXGI_FORMAT_BC7_UNORM; - default: - return format; + default: return format; } } - //-------------------------------------------------------------------------------------- inline bool IsDepthStencil(DXGI_FORMAT fmt) noexcept { @@ -1101,21 +1052,15 @@ namespace case DXGI_FORMAT_D24_UNORM_S8_UINT: case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - case DXGI_FORMAT_D16_UNORM: - return true; + case DXGI_FORMAT_D16_UNORM: return true; - default: - return false; + default: return false; } } - //-------------------------------------------------------------------------------------- - inline void AdjustPlaneResource( - _In_ DXGI_FORMAT fmt, - _In_ size_t height, - _In_ size_t slicePlane, - _Inout_ D3D12_SUBRESOURCE_DATA& res) noexcept + inline void + AdjustPlaneResource(_In_ DXGI_FORMAT fmt, _In_ size_t height, _In_ size_t slicePlane, _Inout_ D3D12_SUBRESOURCE_DATA& res) noexcept { switch (fmt) { @@ -1130,7 +1075,7 @@ namespace else { // Plane 1 - res.pData = reinterpret_cast(res.pData) + uintptr_t(res.RowPitch) * height; + res.pData = reinterpret_cast(res.pData) + uintptr_t(res.RowPitch) * height; res.SlicePitch = res.RowPitch * ((static_cast(height) + 1) >> 1); } break; @@ -1144,34 +1089,32 @@ namespace else { // Plane 1 - res.pData = reinterpret_cast(res.pData) + uintptr_t(res.RowPitch) * height; - res.RowPitch = (res.RowPitch >> 1); + res.pData = reinterpret_cast(res.pData) + uintptr_t(res.RowPitch) * height; + res.RowPitch = (res.RowPitch >> 1); res.SlicePitch = res.RowPitch * static_cast(height); } break; - default: - break; + default: break; } } - //-------------------------------------------------------------------------------------- - HRESULT FillInitData(_In_ size_t width, - _In_ size_t height, - _In_ size_t depth, - _In_ size_t mipCount, - _In_ size_t arraySize, - _In_ size_t numberOfPlanes, - _In_ DXGI_FORMAT format, - _In_ size_t maxsize, - _In_ size_t bitSize, + HRESULT FillInitData(_In_ size_t width, + _In_ size_t height, + _In_ size_t depth, + _In_ size_t mipCount, + _In_ size_t arraySize, + _In_ size_t numberOfPlanes, + _In_ DXGI_FORMAT format, + _In_ size_t maxsize, + _In_ size_t bitSize, _In_reads_bytes_(bitSize) const uint8_t* bitData, - _Out_ size_t& twidth, - _Out_ size_t& theight, - _Out_ size_t& tdepth, - _Out_ size_t& skipMip, - std::vector& initData) + _Out_ size_t& twidth, + _Out_ size_t& theight, + _Out_ size_t& tdepth, + _Out_ size_t& skipMip, + std::vector& initData) { if (!bitData) { @@ -1179,12 +1122,12 @@ namespace } skipMip = 0; - twidth = 0; + twidth = 0; theight = 0; - tdepth = 0; + tdepth = 0; - size_t NumBytes = 0; - size_t RowBytes = 0; + size_t NumBytes = 0; + size_t RowBytes = 0; const uint8_t* pEndBits = bitData + bitSize; initData.clear(); @@ -1211,17 +1154,12 @@ namespace { if (!twidth) { - twidth = w; + twidth = w; theight = h; - tdepth = d; + tdepth = d; } - D3D12_SUBRESOURCE_DATA res = - { - pSrcBits, - static_cast(RowBytes), - static_cast(NumBytes) - }; + D3D12_SUBRESOURCE_DATA res = { pSrcBits, static_cast(RowBytes), static_cast(NumBytes) }; AdjustPlaneResource(format, h, p, res); @@ -1233,7 +1171,7 @@ namespace ++skipMip; } - if (pSrcBits + (NumBytes*d) > pEndBits) + if (pSrcBits + (NumBytes * d) > pEndBits) { return HRESULT_E_HANDLE_EOF; } @@ -1262,20 +1200,18 @@ namespace return initData.empty() ? E_FAIL : S_OK; } - //-------------------------------------------------------------------------------------- - HRESULT CreateTextureResource( - _In_ ID3D12Device* d3dDevice, - D3D12_RESOURCE_DIMENSION resDim, - size_t width, - size_t height, - size_t depth, - size_t mipCount, - size_t arraySize, - DXGI_FORMAT format, - D3D12_RESOURCE_FLAGS resFlags, - DDS_LOADER_FLAGS loadFlags, - _Outptr_ ID3D12Resource** texture) noexcept + HRESULT CreateTextureResource(_In_ ID3D12Device* d3dDevice, + D3D12_RESOURCE_DIMENSION resDim, + size_t width, + size_t height, + size_t depth, + size_t mipCount, + size_t arraySize, + DXGI_FORMAT format, + D3D12_RESOURCE_FLAGS resFlags, + DDS_LOADER_FLAGS loadFlags, + _Outptr_ ID3D12Resource** texture) noexcept { if (!d3dDevice) return E_POINTER; @@ -1292,25 +1228,26 @@ namespace } D3D12_RESOURCE_DESC desc = {}; - desc.Width = static_cast(width); - desc.Height = static_cast(height); - desc.MipLevels = static_cast(mipCount); - desc.DepthOrArraySize = (resDim == D3D12_RESOURCE_DIMENSION_TEXTURE3D) ? static_cast(depth) : static_cast(arraySize); - desc.Format = format; - desc.Flags = resFlags; - desc.SampleDesc.Count = 1; + desc.Width = static_cast(width); + desc.Height = static_cast(height); + desc.MipLevels = static_cast(mipCount); + desc.DepthOrArraySize + = (resDim == D3D12_RESOURCE_DIMENSION_TEXTURE3D) ? static_cast(depth) : static_cast(arraySize); + desc.Format = format; + desc.Flags = resFlags; + desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; - desc.Dimension = resDim; + desc.Dimension = resDim; const CD3DX12_HEAP_PROPERTIES defaultHeapProperties(D3D12_HEAP_TYPE_DEFAULT); - hr = d3dDevice->CreateCommittedResource( - &defaultHeapProperties, + hr = d3dDevice->CreateCommittedResource(&defaultHeapProperties, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_COMMON, nullptr, - IID_ID3D12Resource, reinterpret_cast(texture)); + IID_ID3D12Resource, + reinterpret_cast(texture)); if (SUCCEEDED(hr)) { assert(texture != nullptr && *texture != nullptr); @@ -1324,26 +1261,26 @@ namespace //-------------------------------------------------------------------------------------- HRESULT CreateTextureFromDDS(_In_ ID3D12Device* d3dDevice, - _In_ const DDS_HEADER* header, - _In_reads_bytes_(bitSize) const uint8_t* bitData, - size_t bitSize, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - DDS_LOADER_FLAGS loadFlags, - _Outptr_ ID3D12Resource** texture, - std::vector& subresources, - _Out_opt_ bool* outIsCubeMap) noexcept(false) + _In_ const DDS_HEADER* header, + _In_reads_bytes_(bitSize) const uint8_t* bitData, + size_t bitSize, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + DDS_LOADER_FLAGS loadFlags, + _Outptr_ ID3D12Resource** texture, + std::vector& subresources, + _Out_opt_ bool* outIsCubeMap) noexcept(false) { HRESULT hr = S_OK; - const UINT width = header->width; - UINT height = header->height; - UINT depth = header->depth; + const UINT width = header->width; + UINT height = header->height; + UINT depth = header->depth; - D3D12_RESOURCE_DIMENSION resDim = D3D12_RESOURCE_DIMENSION_UNKNOWN; - UINT arraySize = 1; - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; - bool isCubeMap = false; + D3D12_RESOURCE_DIMENSION resDim = D3D12_RESOURCE_DIMENSION_UNKNOWN; + UINT arraySize = 1; + DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; + bool isCubeMap = false; size_t mipCount = header->mipMapCount; if (0 == mipCount) @@ -1351,8 +1288,7 @@ namespace mipCount = 1; } - if ((header->ddspf.flags & DDS_FOURCC) && - (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC)) + if ((header->ddspf.flags & DDS_FOURCC) && (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC)) { auto d3d10ext = reinterpret_cast(reinterpret_cast(header) + sizeof(DDS_HEADER)); @@ -1368,8 +1304,7 @@ namespace case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: case DXGI_FORMAT_420_OPAQUE: - if ((d3d10ext->resourceDimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D) - || (width % 2) != 0 || (height % 2) != 0) + if ((d3d10ext->resourceDimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D) || (width % 2) != 0 || (height % 2) != 0) { return HRESULT_E_NOT_SUPPORTED; } @@ -1395,12 +1330,10 @@ namespace case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: case DXGI_FORMAT_P8: - case DXGI_FORMAT_A8P8: - return HRESULT_E_NOT_SUPPORTED; + case DXGI_FORMAT_A8P8: return HRESULT_E_NOT_SUPPORTED; case DXGI_FORMAT_V208: - if ((d3d10ext->resourceDimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D) - || (height % 2) != 0) + if ((d3d10ext->resourceDimension != D3D12_RESOURCE_DIMENSION_TEXTURE2D) || (height % 2) != 0) { return HRESULT_E_NOT_SUPPORTED; } @@ -1447,8 +1380,7 @@ namespace } break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } resDim = static_cast(d3d10ext->resourceDimension); @@ -1480,7 +1412,7 @@ namespace isCubeMap = true; } - depth = 1; + depth = 1; resDim = D3D12_RESOURCE_DIMENSION_TEXTURE2D; // Note there's no way for a legacy Direct3D 9 DDS to express a '1D' texture @@ -1498,8 +1430,7 @@ namespace switch (resDim) { case D3D12_RESOURCE_DIMENSION_TEXTURE1D: - if ((arraySize > D3D12_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) || - (width > D3D12_REQ_TEXTURE1D_U_DIMENSION)) + if ((arraySize > D3D12_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) || (width > D3D12_REQ_TEXTURE1D_U_DIMENSION)) { return HRESULT_E_NOT_SUPPORTED; } @@ -1509,33 +1440,28 @@ namespace if (isCubeMap) { // This is the right bound because we set arraySize to (NumCubes*6) above - if ((arraySize > D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || - (width > D3D12_REQ_TEXTURECUBE_DIMENSION) || - (height > D3D12_REQ_TEXTURECUBE_DIMENSION)) + if ((arraySize > D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (width > D3D12_REQ_TEXTURECUBE_DIMENSION) + || (height > D3D12_REQ_TEXTURECUBE_DIMENSION)) { return HRESULT_E_NOT_SUPPORTED; } } - else if ((arraySize > D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || - (width > D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION) || - (height > D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION)) + else if ((arraySize > D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (width > D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION) + || (height > D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION)) { return HRESULT_E_NOT_SUPPORTED; } break; case D3D12_RESOURCE_DIMENSION_TEXTURE3D: - if ((arraySize > 1) || - (width > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || - (height > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || - (depth > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)) + if ((arraySize > 1) || (width > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (height > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) + || (depth > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)) { return HRESULT_E_NOT_SUPPORTED; } break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } const UINT numberOfPlanes = D3D12GetFormatPlaneCount(d3dDevice, format); @@ -1554,8 +1480,7 @@ namespace } // Create the texture - size_t numberOfResources = (resDim == D3D12_RESOURCE_DIMENSION_TEXTURE3D) - ? 1 : arraySize; + size_t numberOfResources = (resDim == D3D12_RESOURCE_DIMENSION_TEXTURE3D) ? 1 : arraySize; numberOfResources *= mipCount; numberOfResources *= numberOfPlanes; @@ -1565,43 +1490,80 @@ namespace subresources.reserve(numberOfResources); size_t skipMip = 0; - size_t twidth = 0; + size_t twidth = 0; size_t theight = 0; - size_t tdepth = 0; - hr = FillInitData(width, height, depth, mipCount, arraySize, - numberOfPlanes, format, - maxsize, bitSize, bitData, - twidth, theight, tdepth, skipMip, subresources); + size_t tdepth = 0; + hr = FillInitData(width, + height, + depth, + mipCount, + arraySize, + numberOfPlanes, + format, + maxsize, + bitSize, + bitData, + twidth, + theight, + tdepth, + skipMip, + subresources); if (SUCCEEDED(hr)) { size_t reservedMips = mipCount; if (loadFlags & DDS_LOADER_MIP_RESERVE) { - reservedMips = std::min(D3D12_REQ_MIP_LEVELS, - CountMips(width, height)); + reservedMips = std::min(D3D12_REQ_MIP_LEVELS, CountMips(width, height)); } - hr = CreateTextureResource(d3dDevice, resDim, twidth, theight, tdepth, reservedMips - skipMip, arraySize, - format, resFlags, loadFlags, texture); + hr = CreateTextureResource(d3dDevice, + resDim, + twidth, + theight, + tdepth, + reservedMips - skipMip, + arraySize, + format, + resFlags, + loadFlags, + texture); if (FAILED(hr) && !maxsize && (mipCount > 1)) { subresources.clear(); - maxsize = static_cast( - (resDim == D3D12_RESOURCE_DIMENSION_TEXTURE3D) - ? D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION - : D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION); - - hr = FillInitData(width, height, depth, mipCount, arraySize, - numberOfPlanes, format, - maxsize, bitSize, bitData, - twidth, theight, tdepth, skipMip, subresources); + maxsize = static_cast((resDim == D3D12_RESOURCE_DIMENSION_TEXTURE3D) ? D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION : + D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION); + + hr = FillInitData(width, + height, + depth, + mipCount, + arraySize, + numberOfPlanes, + format, + maxsize, + bitSize, + bitData, + twidth, + theight, + tdepth, + skipMip, + subresources); if (SUCCEEDED(hr)) { - hr = CreateTextureResource(d3dDevice, resDim, twidth, theight, tdepth, mipCount - skipMip, arraySize, - format, resFlags, loadFlags, texture); + hr = CreateTextureResource(d3dDevice, + resDim, + twidth, + theight, + tdepth, + mipCount - skipMip, + arraySize, + format, + resFlags, + loadFlags, + texture); } } } @@ -1621,23 +1583,20 @@ namespace { if (MAKEFOURCC('D', 'X', '1', '0') == header->ddspf.fourCC) { - auto d3d10ext = reinterpret_cast(reinterpret_cast(header) + sizeof(DDS_HEADER)); + auto d3d10ext = reinterpret_cast(reinterpret_cast(header) + sizeof(DDS_HEADER)); const auto mode = static_cast(d3d10ext->miscFlags2 & DDS_MISC_FLAGS2_ALPHA_MODE_MASK); switch (mode) { case DDS_ALPHA_MODE_STRAIGHT: case DDS_ALPHA_MODE_PREMULTIPLIED: case DDS_ALPHA_MODE_OPAQUE: - case DDS_ALPHA_MODE_CUSTOM: - return mode; + case DDS_ALPHA_MODE_CUSTOM: return mode; case DDS_ALPHA_MODE_UNKNOWN: - default: - break; + default: break; } } - else if ((MAKEFOURCC('D', 'X', 'T', '2') == header->ddspf.fourCC) - || (MAKEFOURCC('D', 'X', 'T', '4') == header->ddspf.fourCC)) + else if ((MAKEFOURCC('D', 'X', 'T', '2') == header->ddspf.fourCC) || (MAKEFOURCC('D', 'X', 'T', '4') == header->ddspf.fourCC)) { return DDS_ALPHA_MODE_PREMULTIPLIED; } @@ -1647,11 +1606,9 @@ namespace } //-------------------------------------------------------------------------------------- - void SetDebugTextureInfo( - _In_z_ const wchar_t* fileName, - _In_ ID3D12Resource* texture) noexcept + void SetDebugTextureInfo(_In_z_ const wchar_t* fileName, _In_ ID3D12Resource* texture) noexcept { - #if !defined(NO_D3D12_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#if !defined(NO_D3D12_DEBUG_NAME) && (defined(_DEBUG) || defined(PROFILE)) const wchar_t* pstrName = wcsrchr(fileName, '\\'); if (!pstrName) { @@ -1662,28 +1619,24 @@ namespace pstrName++; } texture->SetName(pstrName); - #else +#else UNREFERENCED_PARAMETER(fileName); UNREFERENCED_PARAMETER(texture); - #endif +#endif } } // anonymous namespace - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadDDSTextureFromMemory( - ID3D12Device* d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - ID3D12Resource** texture, - std::vector& subresources, - size_t maxsize, - DDS_ALPHA_MODE* alphaMode, - bool* isCubeMap) +_Use_decl_annotations_ HRESULT DirectX::LoadDDSTextureFromMemory(ID3D12Device* d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + ID3D12Resource** texture, + std::vector& subresources, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode, + bool* isCubeMap) { - return LoadDDSTextureFromMemoryEx( - d3dDevice, + return LoadDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, maxsize, @@ -1695,19 +1648,16 @@ HRESULT DirectX::LoadDDSTextureFromMemory( isCubeMap); } - -_Use_decl_annotations_ -HRESULT DirectX::LoadDDSTextureFromMemoryEx( - ID3D12Device* d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - DDS_LOADER_FLAGS loadFlags, - ID3D12Resource** texture, - std::vector& subresources, - DDS_ALPHA_MODE* alphaMode, - bool* isCubeMap) +_Use_decl_annotations_ HRESULT DirectX::LoadDDSTextureFromMemoryEx(ID3D12Device* d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + DDS_LOADER_FLAGS loadFlags, + ID3D12Resource** texture, + std::vector& subresources, + DDS_ALPHA_MODE* alphaMode, + bool* isCubeMap) { if (texture) { @@ -1728,25 +1678,17 @@ HRESULT DirectX::LoadDDSTextureFromMemoryEx( } // Validate DDS file in memory - const DDS_HEADER* header = nullptr; - const uint8_t* bitData = nullptr; - size_t bitSize = 0; + const DDS_HEADER* header = nullptr; + const uint8_t* bitData = nullptr; + size_t bitSize = 0; - HRESULT hr = LoadTextureDataFromMemory(ddsData, - ddsDataSize, - &header, - &bitData, - &bitSize - ); + HRESULT hr = LoadTextureDataFromMemory(ddsData, ddsDataSize, &header, &bitData, &bitSize); if (FAILED(hr)) { return hr; } - hr = CreateTextureFromDDS(d3dDevice, - header, bitData, bitSize, maxsize, - resFlags, loadFlags, - texture, subresources, isCubeMap); + hr = CreateTextureFromDDS(d3dDevice, header, bitData, bitSize, maxsize, resFlags, loadFlags, texture, subresources, isCubeMap); if (SUCCEEDED(hr)) { SetDebugObjectName(*texture, L"DDSTextureLoader"); @@ -1758,21 +1700,17 @@ HRESULT DirectX::LoadDDSTextureFromMemoryEx( return hr; } - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadDDSTextureFromFile( - ID3D12Device* d3dDevice, - const wchar_t* fileName, - ID3D12Resource** texture, - std::unique_ptr& ddsData, - std::vector& subresources, - size_t maxsize, - DDS_ALPHA_MODE* alphaMode, - bool* isCubeMap) +_Use_decl_annotations_ HRESULT DirectX::LoadDDSTextureFromFile(ID3D12Device* d3dDevice, + const wchar_t* fileName, + ID3D12Resource** texture, + std::unique_ptr& ddsData, + std::vector& subresources, + size_t maxsize, + DDS_ALPHA_MODE* alphaMode, + bool* isCubeMap) { - return LoadDDSTextureFromFileEx( - d3dDevice, + return LoadDDSTextureFromFileEx(d3dDevice, fileName, maxsize, D3D12_RESOURCE_FLAG_NONE, @@ -1784,18 +1722,16 @@ HRESULT DirectX::LoadDDSTextureFromFile( isCubeMap); } -_Use_decl_annotations_ -HRESULT DirectX::LoadDDSTextureFromFileEx( - ID3D12Device* d3dDevice, - const wchar_t* fileName, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - DDS_LOADER_FLAGS loadFlags, - ID3D12Resource** texture, - std::unique_ptr& ddsData, - std::vector& subresources, - DDS_ALPHA_MODE* alphaMode, - bool* isCubeMap) +_Use_decl_annotations_ HRESULT DirectX::LoadDDSTextureFromFileEx(ID3D12Device* d3dDevice, + const wchar_t* fileName, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + DDS_LOADER_FLAGS loadFlags, + ID3D12Resource** texture, + std::unique_ptr& ddsData, + std::vector& subresources, + DDS_ALPHA_MODE* alphaMode, + bool* isCubeMap) { if (texture) { @@ -1815,25 +1751,17 @@ HRESULT DirectX::LoadDDSTextureFromFileEx( return E_INVALIDARG; } - const DDS_HEADER* header = nullptr; - const uint8_t* bitData = nullptr; - size_t bitSize = 0; + const DDS_HEADER* header = nullptr; + const uint8_t* bitData = nullptr; + size_t bitSize = 0; - HRESULT hr = LoadTextureDataFromFile(fileName, - ddsData, - &header, - &bitData, - &bitSize - ); + HRESULT hr = LoadTextureDataFromFile(fileName, ddsData, &header, &bitData, &bitSize); if (FAILED(hr)) { return hr; } - hr = CreateTextureFromDDS(d3dDevice, - header, bitData, bitSize, maxsize, - resFlags, loadFlags, - texture, subresources, isCubeMap); + hr = CreateTextureFromDDS(d3dDevice, header, bitData, bitSize, maxsize, resFlags, loadFlags, texture, subresources, isCubeMap); if (SUCCEEDED(hr)) { diff --git a/DDSTextureLoader/DDSTextureLoader12.h b/DDSTextureLoader/DDSTextureLoader12.h index a431d5cb..325e4067 100644 --- a/DDSTextureLoader/DDSTextureLoader12.h +++ b/DDSTextureLoader/DDSTextureLoader12.h @@ -30,7 +30,7 @@ #include #else #include -#pragma comment(lib,"dxguid.lib") +#pragma comment(lib, "dxguid.lib") #endif #include @@ -38,18 +38,17 @@ #include #include - namespace DirectX { #ifndef DDS_ALPHA_MODE_DEFINED #define DDS_ALPHA_MODE_DEFINED enum DDS_ALPHA_MODE : uint32_t { - DDS_ALPHA_MODE_UNKNOWN = 0, - DDS_ALPHA_MODE_STRAIGHT = 1, + DDS_ALPHA_MODE_UNKNOWN = 0, + DDS_ALPHA_MODE_STRAIGHT = 1, DDS_ALPHA_MODE_PREMULTIPLIED = 2, - DDS_ALPHA_MODE_OPAQUE = 3, - DDS_ALPHA_MODE_CUSTOM = 4, + DDS_ALPHA_MODE_OPAQUE = 3, + DDS_ALPHA_MODE_CUSTOM = 4, }; #endif @@ -59,8 +58,8 @@ namespace DirectX enum DDS_LOADER_FLAGS : uint32_t { - DDS_LOADER_DEFAULT = 0, - DDS_LOADER_FORCE_SRGB = 0x1, + DDS_LOADER_DEFAULT = 0, + DDS_LOADER_FORCE_SRGB = 0x1, DDS_LOADER_IGNORE_SRGB = 0x2, DDS_LOADER_MIP_RESERVE = 0x8, }; @@ -79,48 +78,44 @@ namespace DirectX #endif // Standard version - HRESULT __cdecl LoadDDSTextureFromMemory( - _In_ ID3D12Device* d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - size_t ddsDataSize, - _Outptr_ ID3D12Resource** texture, - std::vector& subresources, - size_t maxsize = 0, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, - _Out_opt_ bool* isCubeMap = nullptr); - - HRESULT __cdecl LoadDDSTextureFromFile( - _In_ ID3D12Device* d3dDevice, - _In_z_ const wchar_t* szFileName, - _Outptr_ ID3D12Resource** texture, - std::unique_ptr& ddsData, - std::vector& subresources, - size_t maxsize = 0, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, - _Out_opt_ bool* isCubeMap = nullptr); + HRESULT __cdecl LoadDDSTextureFromMemory(_In_ ID3D12Device* d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + size_t ddsDataSize, + _Outptr_ ID3D12Resource** texture, + std::vector& subresources, + size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, + _Out_opt_ bool* isCubeMap = nullptr); + + HRESULT __cdecl LoadDDSTextureFromFile(_In_ ID3D12Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _Outptr_ ID3D12Resource** texture, + std::unique_ptr& ddsData, + std::vector& subresources, + size_t maxsize = 0, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, + _Out_opt_ bool* isCubeMap = nullptr); // Extended version - HRESULT __cdecl LoadDDSTextureFromMemoryEx( - _In_ ID3D12Device* d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - size_t ddsDataSize, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - DDS_LOADER_FLAGS loadFlags, - _Outptr_ ID3D12Resource** texture, - std::vector& subresources, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, - _Out_opt_ bool* isCubeMap = nullptr); - - HRESULT __cdecl LoadDDSTextureFromFileEx( - _In_ ID3D12Device* d3dDevice, - _In_z_ const wchar_t* szFileName, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - DDS_LOADER_FLAGS loadFlags, - _Outptr_ ID3D12Resource** texture, - std::unique_ptr& ddsData, - std::vector& subresources, - _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, - _Out_opt_ bool* isCubeMap = nullptr); -} + HRESULT __cdecl LoadDDSTextureFromMemoryEx(_In_ ID3D12Device* d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + size_t ddsDataSize, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + DDS_LOADER_FLAGS loadFlags, + _Outptr_ ID3D12Resource** texture, + std::vector& subresources, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, + _Out_opt_ bool* isCubeMap = nullptr); + + HRESULT __cdecl LoadDDSTextureFromFileEx(_In_ ID3D12Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + DDS_LOADER_FLAGS loadFlags, + _Outptr_ ID3D12Resource** texture, + std::unique_ptr& ddsData, + std::vector& subresources, + _Out_opt_ DDS_ALPHA_MODE* alphaMode = nullptr, + _Out_opt_ bool* isCubeMap = nullptr); +} // namespace DirectX diff --git a/DDSTextureLoader/DDSTextureLoader9.cpp b/DDSTextureLoader/DDSTextureLoader9.cpp index 1039586d..4957ec23 100644 --- a/DDSTextureLoader/DDSTextureLoader9.cpp +++ b/DDSTextureLoader/DDSTextureLoader9.cpp @@ -48,9 +48,8 @@ using Microsoft::WRL::ComPtr; // Macros //-------------------------------------------------------------------------------------- #ifndef MAKEFOURCC -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | \ - ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 )) +#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24)) #endif /* defined(MAKEFOURCC) */ //-------------------------------------------------------------------------------------- @@ -60,41 +59,41 @@ using Microsoft::WRL::ComPtr; //-------------------------------------------------------------------------------------- namespace { -#pragma pack(push,1) +#pragma pack(push, 1) constexpr uint32_t DDS_MAGIC = 0x20534444; // "DDS " struct DDS_PIXELFORMAT { - uint32_t size; - uint32_t flags; - uint32_t fourCC; - uint32_t RGBBitCount; - uint32_t RBitMask; - uint32_t GBitMask; - uint32_t BBitMask; - uint32_t ABitMask; + uint32_t size; + uint32_t flags; + uint32_t fourCC; + uint32_t RGBBitCount; + uint32_t RBitMask; + uint32_t GBitMask; + uint32_t BBitMask; + uint32_t ABitMask; }; -#define DDS_FOURCC 0x00000004 // DDPF_FOURCC -#define DDS_RGB 0x00000040 // DDPF_RGB -#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE -#define DDS_ALPHA 0x00000002 // DDPF_ALPHA -#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV -#define DDS_BUMPLUMINANCE 0x00040000 // DDPF_BUMPLUMINANCE +#define DDS_FOURCC 0x00000004 // DDPF_FOURCC +#define DDS_RGB 0x00000040 // DDPF_RGB +#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE +#define DDS_ALPHA 0x00000002 // DDPF_ALPHA +#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV +#define DDS_BUMPLUMINANCE 0x00040000 // DDPF_BUMPLUMINANCE -#define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH +#define DDS_HEADER_FLAGS_VOLUME 0x00800000 // DDSD_DEPTH -#define DDS_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX -#define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX -#define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY -#define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY -#define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ -#define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ +#define DDS_CUBEMAP_POSITIVEX 0x00000600 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEX +#define DDS_CUBEMAP_NEGATIVEX 0x00000a00 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEX +#define DDS_CUBEMAP_POSITIVEY 0x00001200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEY +#define DDS_CUBEMAP_NEGATIVEY 0x00002200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEY +#define DDS_CUBEMAP_POSITIVEZ 0x00004200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_POSITIVEZ +#define DDS_CUBEMAP_NEGATIVEZ 0x00008200 // DDSCAPS2_CUBEMAP | DDSCAPS2_CUBEMAP_NEGATIVEZ -#define DDS_CUBEMAP_ALLFACES ( DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX |\ - DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY |\ - DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEZ ) +#define DDS_CUBEMAP_ALLFACES \ + (DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_NEGATIVEX | DDS_CUBEMAP_POSITIVEY | DDS_CUBEMAP_NEGATIVEY | DDS_CUBEMAP_POSITIVEZ \ + | DDS_CUBEMAP_NEGATIVEZ) #define DDS_CUBEMAP 0x00000200 // DDSCAPS2_CUBEMAP @@ -124,19 +123,28 @@ namespace constexpr size_t DDS_DX9_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); //-------------------------------------------------------------------------------------- - struct handle_closer { void operator()(HANDLE h) noexcept { if (h) CloseHandle(h); } }; + struct handle_closer + { + void operator()(HANDLE h) noexcept + { + if (h) + CloseHandle(h); + } + }; using ScopedHandle = std::unique_ptr; - inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } + inline HANDLE safe_handle(HANDLE h) noexcept + { + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; + } //-------------------------------------------------------------------------------------- - HRESULT LoadTextureDataFromMemory( - _In_reads_(ddsDataSize) const uint8_t* ddsData, - size_t ddsDataSize, - const DDS_HEADER** header, - const uint8_t** bitData, - size_t* bitSize) noexcept + HRESULT LoadTextureDataFromMemory(_In_reads_(ddsDataSize) const uint8_t* ddsData, + size_t ddsDataSize, + const DDS_HEADER** header, + const uint8_t** bitData, + size_t* bitSize) noexcept { if (!header || !bitData || !bitSize) { @@ -165,36 +173,32 @@ namespace auto hdr = reinterpret_cast(ddsData + sizeof(uint32_t)); // Verify header to validate DDS file - if (hdr->size != sizeof(DDS_HEADER) || - hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) + if (hdr->size != sizeof(DDS_HEADER) || hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) { return E_FAIL; } // Check for DX10 extension - if ((hdr->ddspf.flags & DDS_FOURCC) && - (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) + if ((hdr->ddspf.flags & DDS_FOURCC) && (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) { // We don't support the new DX10 header for Direct3D 9 return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } // setup the pointers in the process request - *header = hdr; + *header = hdr; *bitData = ddsData + DDS_DX9_HEADER_SIZE; *bitSize = ddsDataSize - DDS_DX9_HEADER_SIZE; return S_OK; } - //-------------------------------------------------------------------------------------- - HRESULT LoadTextureDataFromFile( - _In_z_ const wchar_t* fileName, - std::unique_ptr& ddsData, - const DDS_HEADER** header, - const uint8_t** bitData, - size_t* bitSize) noexcept + HRESULT LoadTextureDataFromFile(_In_z_ const wchar_t* fileName, + std::unique_ptr& ddsData, + const DDS_HEADER** header, + const uint8_t** bitData, + size_t* bitSize) noexcept { if (!header || !bitData || !bitSize) { @@ -204,10 +208,7 @@ namespace *bitSize = 0; // open the file - ScopedHandle hFile(safe_handle(CreateFile2( - fileName, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -241,12 +242,7 @@ namespace // read the data in DWORD bytesRead = 0; - if (!ReadFile(hFile.get(), - ddsData.get(), - fileInfo.EndOfFile.LowPart, - &bytesRead, - nullptr - )) + if (!ReadFile(hFile.get(), ddsData.get(), fileInfo.EndOfFile.LowPart, &bytesRead, nullptr)) { ddsData.reset(); return HRESULT_FROM_WIN32(GetLastError()); @@ -269,16 +265,14 @@ namespace auto hdr = reinterpret_cast(ddsData.get() + sizeof(uint32_t)); // Verify header to validate DDS file - if (hdr->size != sizeof(DDS_HEADER) || - hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) + if (hdr->size != sizeof(DDS_HEADER) || hdr->ddspf.size != sizeof(DDS_PIXELFORMAT)) { ddsData.reset(); return E_FAIL; } // Check for DX10 extension - if ((hdr->ddspf.flags & DDS_FOURCC) && - (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) + if ((hdr->ddspf.flags & DDS_FOURCC) && (MAKEFOURCC('D', 'X', '1', '0') == hdr->ddspf.fourCC)) { // We don't support the new DX10 header for Direct3D 9 ddsData.reset(); @@ -286,14 +280,13 @@ namespace } // setup the pointers in the process request - *header = hdr; + *header = hdr; *bitData = ddsData.get() + DDS_DX9_HEADER_SIZE; *bitSize = fileInfo.EndOfFile.LowPart - DDS_DX9_HEADER_SIZE; return S_OK; } - //-------------------------------------------------------------------------------------- // Return the BPP for a particular format //-------------------------------------------------------------------------------------- @@ -301,14 +294,12 @@ namespace { switch (static_cast(fmt)) { - case D3DFMT_A32B32G32R32F: - return 128; + case D3DFMT_A32B32G32R32F: return 128; case D3DFMT_A16B16G16R16: case D3DFMT_Q16W16V16U16: case D3DFMT_A16B16G16R16F: - case D3DFMT_G32R32F: - return 64; + case D3DFMT_G32R32F: return 64; case D3DFMT_A8R8G8B8: case D3DFMT_X8R8G8B8: @@ -330,13 +321,12 @@ namespace case D3DFMT_INDEX32: case D3DFMT_G16R16F: case D3DFMT_R32F: - #if !defined(D3D_DISABLE_9EX) +#if !defined(D3D_DISABLE_9EX) case D3DFMT_D32_LOCKABLE: - #endif +#endif return 32; - case D3DFMT_R8G8B8: - return 24; + case D3DFMT_R8G8B8: return 24; case D3DFMT_A4R4G4B4: case D3DFMT_X4R4G4B4: @@ -359,8 +349,7 @@ namespace case D3DFMT_YUY2: // From DX docs, reference/d3d/enums/d3dformat.asp // (note how it says that D3DFMT_R8G8_B8G8 is "A 16-bit packed RGB format analogous to UYVY (U0Y0, V0Y1, U2Y2, and so on)") - case D3DFMT_UYVY: - return 16; + case D3DFMT_UYVY: return 16; case D3DFMT_R3G3B2: case D3DFMT_A8: @@ -375,53 +364,46 @@ namespace // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directshow/htm/directxvideoaccelerationdxvavideosubtypes.asp case MAKEFOURCC('A', 'I', '4', '4'): case MAKEFOURCC('I', 'A', '4', '4'): - #if !defined(D3D_DISABLE_9EX) +#if !defined(D3D_DISABLE_9EX) case D3DFMT_S8_LOCKABLE: - #endif +#endif return 8; - case D3DFMT_DXT1: - return 4; + case D3DFMT_DXT1: return 4; - case MAKEFOURCC('Y', 'V', '1', '2'): - return 12; + case MAKEFOURCC('Y', 'V', '1', '2'): return 12; - #if !defined(D3D_DISABLE_9EX) - case D3DFMT_A1: - return 1; - #endif +#if !defined(D3D_DISABLE_9EX) + case D3DFMT_A1: return 1; +#endif - default: - return 0; + default: return 0; } } - //-------------------------------------------------------------------------------------- // Get surface information for a particular format //-------------------------------------------------------------------------------------- - HRESULT GetSurfaceInfo( - _In_ size_t width, - _In_ size_t height, - _In_ D3DFORMAT fmt, - _Out_opt_ size_t* outNumBytes, - _Out_opt_ size_t* outRowBytes, - _Out_opt_ size_t* outNumRows) noexcept + HRESULT GetSurfaceInfo(_In_ size_t width, + _In_ size_t height, + _In_ D3DFORMAT fmt, + _Out_opt_ size_t* outNumBytes, + _Out_opt_ size_t* outRowBytes, + _Out_opt_ size_t* outNumRows) noexcept { uint64_t numBytes = 0; uint64_t rowBytes = 0; - uint64_t numRows = 0; + uint64_t numRows = 0; - bool bc = false; - bool packed = false; - size_t bpe = 0; + bool bc = false; + bool packed = false; + size_t bpe = 0; switch (static_cast(fmt)) { - case D3DFMT_UNKNOWN: - return E_INVALIDARG; + case D3DFMT_UNKNOWN: return E_INVALIDARG; case D3DFMT_DXT1: - bc = true; + bc = true; bpe = 8; break; @@ -429,7 +411,7 @@ namespace case D3DFMT_DXT3: case D3DFMT_DXT4: case D3DFMT_DXT5: - bc = true; + bc = true; bpe = 16; break; @@ -438,11 +420,10 @@ namespace case D3DFMT_UYVY: case D3DFMT_YUY2: packed = true; - bpe = 4; + bpe = 4; break; - default: - break; + default: break; } if (bc) @@ -458,13 +439,13 @@ namespace numBlocksHigh = std::max(1u, (uint64_t(height) + 3u) / 4u); } rowBytes = numBlocksWide * bpe; - numRows = numBlocksHigh; + numRows = numBlocksHigh; numBytes = rowBytes * numBlocksHigh; } else if (packed) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } else @@ -474,17 +455,17 @@ namespace return E_INVALIDARG; rowBytes = (uint64_t(width) * bpp + 7u) / 8u; // round up to nearest byte - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } - #if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) +#if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) static_assert(sizeof(size_t) == 4, "Not a 32-bit platform!"); if (numBytes > UINT32_MAX || rowBytes > UINT32_MAX || numRows > UINT32_MAX) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - #else +#else static_assert(sizeof(size_t) == 8, "Not a 64-bit platform!"); - #endif +#endif if (outNumBytes) { @@ -502,9 +483,8 @@ namespace return S_OK; } - //-------------------------------------------------------------------------------------- -#define ISBITMASK( r,g,b,a ) ( ddpf.RBitMask == r && ddpf.GBitMask == g && ddpf.BBitMask == b && ddpf.ABitMask == a ) +#define ISBITMASK(r, g, b, a) (ddpf.RBitMask == r && ddpf.GBitMask == g && ddpf.BBitMask == b && ddpf.ABitMask == a) D3DFORMAT GetD3D9Format(const DDS_PIXELFORMAT& ddpf) noexcept { @@ -616,8 +596,7 @@ namespace // Paletted texture formats are typically not supported on modern video cards aka D3DFMT_P8, D3DFMT_A8P8 break; - default: - return D3DFMT_UNKNOWN; + default: return D3DFMT_UNKNOWN; } } else if (ddpf.flags & DDS_LUMINANCE) @@ -650,8 +629,7 @@ namespace } break; - default: - return D3DFMT_UNKNOWN; + default: return D3DFMT_UNKNOWN; } } else if (ddpf.flags & DDS_ALPHA) @@ -687,8 +665,7 @@ namespace } break; - default: - return D3DFMT_UNKNOWN; + default: return D3DFMT_UNKNOWN; } } else if (ddpf.flags & DDS_BUMPLUMINANCE) @@ -709,8 +686,7 @@ namespace } break; - default: - return D3DFMT_UNKNOWN; + default: return D3DFMT_UNKNOWN; } } else if (ddpf.flags & DDS_FOURCC) @@ -765,11 +741,9 @@ namespace case D3DFMT_R32F: case D3DFMT_G32R32F: case D3DFMT_A32B32G32R32F: - case D3DFMT_CxV8U8: - return static_cast(ddpf.fourCC); + case D3DFMT_CxV8U8: return static_cast(ddpf.fourCC); - default: - return D3DFMT_UNKNOWN; + default: return D3DFMT_UNKNOWN; } } @@ -778,21 +752,19 @@ namespace #undef ISBITMASK - -//-------------------------------------------------------------------------------------- - HRESULT CreateTextureFromDDS( - _In_ LPDIRECT3DDEVICE9 device, - _In_ const DDS_HEADER* header, - _In_reads_bytes_(bitSize) const uint8_t* bitData, - _In_ size_t bitSize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - _Outptr_ LPDIRECT3DBASETEXTURE9* texture, - bool generateMipsIfMissing) noexcept + //-------------------------------------------------------------------------------------- + HRESULT CreateTextureFromDDS(_In_ LPDIRECT3DDEVICE9 device, + _In_ const DDS_HEADER* header, + _In_reads_bytes_(bitSize) const uint8_t* bitData, + _In_ size_t bitSize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + _Outptr_ LPDIRECT3DBASETEXTURE9* texture, + bool generateMipsIfMissing) noexcept { HRESULT hr = S_OK; - UINT iWidth = header->width; + UINT iWidth = header->width; UINT iHeight = header->height; UINT iMipCount = header->mipMapCount; @@ -820,8 +792,7 @@ namespace { UINT iDepth = header->depth; - if ((iWidth > 2048u /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/) - || (iHeight > 2048u /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/) + if ((iWidth > 2048u /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/) || (iHeight > 2048u /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/) || (iDepth > 2048u /*D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION*/)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); @@ -829,16 +800,22 @@ namespace // Create the volume texture (let the runtime do the validation) ComPtr pTexture; - hr = device->CreateVolumeTexture(iWidth, iHeight, iDepth, iMipCount, - usage, fmt, pool, pTexture.GetAddressOf(), nullptr); + hr = device->CreateVolumeTexture(iWidth, iHeight, iDepth, iMipCount, usage, fmt, pool, pTexture.GetAddressOf(), nullptr); if (FAILED(hr)) return hr; ComPtr pStagingTexture; if (pool == D3DPOOL_DEFAULT) { - hr = device->CreateVolumeTexture(iWidth, iHeight, iDepth, iMipCount, - 0u, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr); + hr = device->CreateVolumeTexture(iWidth, + iHeight, + iDepth, + iMipCount, + 0u, + fmt, + D3DPOOL_SYSTEMMEM, + pStagingTexture.GetAddressOf(), + nullptr); if (FAILED(hr)) return hr; } @@ -848,12 +825,12 @@ namespace } // Lock, fill, unlock - size_t NumBytes = 0; - size_t RowBytes = 0; - size_t NumRows = 0; - const uint8_t* pSrcBits = bitData; - const uint8_t* pEndBits = bitData + bitSize; - D3DLOCKED_BOX LockedBox = {}; + size_t NumBytes = 0; + size_t RowBytes = 0; + size_t NumRows = 0; + const uint8_t* pSrcBits = bitData; + const uint8_t* pEndBits = bitData + bitSize; + D3DLOCKED_BOX LockedBox = {}; for (UINT i = 0; i < iMipCount; ++i) { @@ -873,7 +850,7 @@ namespace for (UINT j = 0; j < iDepth; ++j) { - uint8_t* dptr = pDestBits; + uint8_t* dptr = pDestBits; const uint8_t* sptr = pSrcBits; // Copy stride line by line @@ -891,9 +868,9 @@ namespace pStagingTexture->UnlockBox(i); } - iWidth = iWidth >> 1; + iWidth = iWidth >> 1; iHeight = iHeight >> 1; - iDepth = iDepth >> 1; + iDepth = iDepth >> 1; if (iWidth == 0) iWidth = 1; if (iHeight == 0) @@ -913,8 +890,7 @@ namespace } else if (header->caps2 & DDS_CUBEMAP) { - if ((iWidth > 8192u /*D3D10_REQ_TEXTURECUBE_DIMENSION*/) - || (iHeight > 8192u /*D3D10_REQ_TEXTURECUBE_DIMENSION*/)) + if ((iWidth > 8192u /*D3D10_REQ_TEXTURECUBE_DIMENSION*/) || (iHeight > 8192u /*D3D10_REQ_TEXTURECUBE_DIMENSION*/)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } @@ -927,16 +903,14 @@ namespace // Create the cubemap (let the runtime do the validation) ComPtr pTexture; - hr = device->CreateCubeTexture(iWidth, iMipCount, - usage, fmt, pool, pTexture.GetAddressOf(), nullptr); + hr = device->CreateCubeTexture(iWidth, iMipCount, usage, fmt, pool, pTexture.GetAddressOf(), nullptr); if (FAILED(hr)) return hr; ComPtr pStagingTexture; if (pool == D3DPOOL_DEFAULT) { - hr = device->CreateCubeTexture(iWidth, iMipCount, - 0u, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr); + hr = device->CreateCubeTexture(iWidth, iMipCount, 0u, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr); if (FAILED(hr)) return hr; } @@ -946,11 +920,11 @@ namespace } // Lock, fill, unlock - size_t NumBytes = 0; - size_t RowBytes = 0; - size_t NumRows = 0; - const uint8_t* pSrcBits = bitData; - const uint8_t* pEndBits = bitData + bitSize; + size_t NumBytes = 0; + size_t RowBytes = 0; + size_t NumRows = 0; + const uint8_t* pSrcBits = bitData; + const uint8_t* pEndBits = bitData + bitSize; D3DLOCKED_RECT LockedRect = {}; UINT mask = DDS_CUBEMAP_POSITIVEX & ~DDS_CUBEMAP; @@ -1008,8 +982,7 @@ namespace } else { - if ((iWidth > 8192u /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/) - || (iHeight > 8192u /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/)) + if ((iWidth > 8192u /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/) || (iHeight > 8192u /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/)) { return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } @@ -1019,17 +992,14 @@ namespace usage |= D3DUSAGE_AUTOGENMIPMAP; ComPtr pTexture; - hr = device->CreateTexture(iWidth, iHeight, iMipCount, - usage, fmt, pool, - pTexture.GetAddressOf(), nullptr); + hr = device->CreateTexture(iWidth, iHeight, iMipCount, usage, fmt, pool, pTexture.GetAddressOf(), nullptr); if (FAILED(hr)) return hr; ComPtr pStagingTexture; if (pool == D3DPOOL_DEFAULT) { - hr = device->CreateTexture(iWidth, iHeight, iMipCount, - 0u, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr); + hr = device->CreateTexture(iWidth, iHeight, iMipCount, 0u, fmt, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr); if (FAILED(hr)) return hr; } @@ -1039,11 +1009,11 @@ namespace } // Lock, fill, unlock - size_t NumBytes = 0; - size_t RowBytes = 0; - size_t NumRows = 0; - const uint8_t* pSrcBits = bitData; - const uint8_t* pEndBits = bitData + bitSize; + size_t NumBytes = 0; + size_t RowBytes = 0; + size_t NumRows = 0; + const uint8_t* pSrcBits = bitData; + const uint8_t* pEndBits = bitData + bitSize; D3DLOCKED_RECT LockedRect = {}; for (UINT i = 0; i < iMipCount; ++i) @@ -1073,7 +1043,7 @@ namespace pStagingTexture->UnlockRect(i); } - iWidth = iWidth >> 1; + iWidth = iWidth >> 1; iHeight = iHeight >> 1; if (iWidth == 0) iWidth = 1; @@ -1096,26 +1066,22 @@ namespace } // anonymous namespace //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemory( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - LPDIRECT3DBASETEXTURE9* texture, - bool generateMipsIfMissing) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemory(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + LPDIRECT3DBASETEXTURE9* texture, + bool generateMipsIfMissing) noexcept { return CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, 0u, D3DPOOL_DEFAULT, generateMipsIfMissing, texture); } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemoryEx( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - bool generateMipsIfMissing, - LPDIRECT3DBASETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemoryEx(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + bool generateMipsIfMissing, + LPDIRECT3DBASETEXTURE9* texture) noexcept { if (texture) { @@ -1128,37 +1094,23 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( } // Validate DDS file in memory - const DDS_HEADER* header = nullptr; - const uint8_t* bitData = nullptr; - size_t bitSize = 0; - - HRESULT hr = LoadTextureDataFromMemory(ddsData, ddsDataSize, - &header, - &bitData, - &bitSize - ); + const DDS_HEADER* header = nullptr; + const uint8_t* bitData = nullptr; + size_t bitSize = 0; + + HRESULT hr = LoadTextureDataFromMemory(ddsData, ddsDataSize, &header, &bitData, &bitSize); if (FAILED(hr)) return hr; - return CreateTextureFromDDS( - d3dDevice, - header, - bitData, - bitSize, - usage, - pool, - texture, - generateMipsIfMissing); + return CreateTextureFromDDS(d3dDevice, header, bitData, bitSize, usage, pool, texture, generateMipsIfMissing); } // Type-specific standard versions -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemory( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - LPDIRECT3DTEXTURE9* texture, - bool generateMipsIfMissing) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemory(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + LPDIRECT3DTEXTURE9* texture, + bool generateMipsIfMissing) noexcept { if (texture) { @@ -1169,7 +1121,8 @@ HRESULT DirectX::CreateDDSTextureFromMemory( return E_INVALIDARG; ComPtr tex; - HRESULT hr = CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, 0u, D3DPOOL_DEFAULT, generateMipsIfMissing, tex.GetAddressOf()); + HRESULT hr + = CreateDDSTextureFromMemoryEx(d3dDevice, ddsData, ddsDataSize, 0u, D3DPOOL_DEFAULT, generateMipsIfMissing, tex.GetAddressOf()); if (SUCCEEDED(hr)) { hr = E_FAIL; @@ -1183,12 +1136,10 @@ HRESULT DirectX::CreateDDSTextureFromMemory( return hr; } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemory( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - LPDIRECT3DCUBETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemory(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + LPDIRECT3DCUBETEXTURE9* texture) noexcept { if (texture) { @@ -1213,12 +1164,10 @@ HRESULT DirectX::CreateDDSTextureFromMemory( return hr; } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemory( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - LPDIRECT3DVOLUMETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemory(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + LPDIRECT3DVOLUMETEXTURE9* texture) noexcept { if (texture) { @@ -1244,15 +1193,13 @@ HRESULT DirectX::CreateDDSTextureFromMemory( } // Type-specific extended versions -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemoryEx( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - DWORD usage, - D3DPOOL pool, - bool generateMipsIfMissing, - LPDIRECT3DTEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemoryEx(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + DWORD usage, + D3DPOOL pool, + bool generateMipsIfMissing, + LPDIRECT3DTEXTURE9* texture) noexcept { if (texture) { @@ -1277,14 +1224,12 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( return hr; } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemoryEx( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - DWORD usage, - D3DPOOL pool, - LPDIRECT3DCUBETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemoryEx(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + DWORD usage, + D3DPOOL pool, + LPDIRECT3DCUBETEXTURE9* texture) noexcept { if (texture) { @@ -1309,14 +1254,12 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( return hr; } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromMemoryEx( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* ddsData, - size_t ddsDataSize, - DWORD usage, - D3DPOOL pool, - LPDIRECT3DVOLUMETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromMemoryEx(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* ddsData, + size_t ddsDataSize, + DWORD usage, + D3DPOOL pool, + LPDIRECT3DVOLUMETEXTURE9* texture) noexcept { if (texture) { @@ -1341,26 +1284,21 @@ HRESULT DirectX::CreateDDSTextureFromMemoryEx( return hr; } - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFile( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* fileName, - LPDIRECT3DBASETEXTURE9* texture, - bool generateMipsIfMissing) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFile(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* fileName, + LPDIRECT3DBASETEXTURE9* texture, + bool generateMipsIfMissing) noexcept { return CreateDDSTextureFromFileEx(d3dDevice, fileName, 0u, D3DPOOL_DEFAULT, generateMipsIfMissing, texture); } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFileEx( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* fileName, - _In_ DWORD usage, - _In_ D3DPOOL pool, - bool generateMipsIfMissing, - LPDIRECT3DBASETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFileEx(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* fileName, + _In_ DWORD usage, + _In_ D3DPOOL pool, + bool generateMipsIfMissing, + LPDIRECT3DBASETEXTURE9* texture) noexcept { if (texture) { @@ -1370,40 +1308,25 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( if (!d3dDevice || !fileName || !texture) return E_INVALIDARG; - const DDS_HEADER* header = nullptr; - const uint8_t* bitData = nullptr; - size_t bitSize = 0; + const DDS_HEADER* header = nullptr; + const uint8_t* bitData = nullptr; + size_t bitSize = 0; std::unique_ptr ddsData; - HRESULT hr = LoadTextureDataFromFile(fileName, - ddsData, - &header, - &bitData, - &bitSize - ); + HRESULT hr = LoadTextureDataFromFile(fileName, ddsData, &header, &bitData, &bitSize); if (FAILED(hr)) { return hr; } - return CreateTextureFromDDS( - d3dDevice, - header, - bitData, - bitSize, - usage, - pool, - texture, - generateMipsIfMissing); + return CreateTextureFromDDS(d3dDevice, header, bitData, bitSize, usage, pool, texture, generateMipsIfMissing); } // Type-specific standard versions -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFile( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* fileName, - LPDIRECT3DTEXTURE9* texture, - bool generateMipsIfMissing) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFile(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* fileName, + LPDIRECT3DTEXTURE9* texture, + bool generateMipsIfMissing) noexcept { if (texture) { @@ -1428,11 +1351,9 @@ HRESULT DirectX::CreateDDSTextureFromFile( return hr; } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFile( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* fileName, - LPDIRECT3DCUBETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFile(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* fileName, + LPDIRECT3DCUBETEXTURE9* texture) noexcept { if (texture) { @@ -1443,7 +1364,7 @@ HRESULT DirectX::CreateDDSTextureFromFile( return E_INVALIDARG; ComPtr tex; - HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, fileName, 0u, D3DPOOL_DEFAULT, false, tex.GetAddressOf()); + HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, fileName, 0u, D3DPOOL_DEFAULT, false, tex.GetAddressOf()); if (SUCCEEDED(hr)) { hr = E_FAIL; @@ -1457,11 +1378,9 @@ HRESULT DirectX::CreateDDSTextureFromFile( return hr; } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFile( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* szFileName, - LPDIRECT3DVOLUMETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFile(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* szFileName, + LPDIRECT3DVOLUMETEXTURE9* texture) noexcept { if (texture) { @@ -1472,7 +1391,7 @@ HRESULT DirectX::CreateDDSTextureFromFile( return E_INVALIDARG; ComPtr tex; - HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, szFileName, 0u, D3DPOOL_DEFAULT, false, tex.GetAddressOf()); + HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, szFileName, 0u, D3DPOOL_DEFAULT, false, tex.GetAddressOf()); if (SUCCEEDED(hr)) { hr = E_FAIL; @@ -1487,14 +1406,12 @@ HRESULT DirectX::CreateDDSTextureFromFile( } // Type-specific extended versions -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFileEx( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* fileName, - DWORD usage, - D3DPOOL pool, - bool generateMipsIfMissing, - LPDIRECT3DTEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFileEx(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* fileName, + DWORD usage, + D3DPOOL pool, + bool generateMipsIfMissing, + LPDIRECT3DTEXTURE9* texture) noexcept { if (texture) { @@ -1519,13 +1436,11 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( return hr; } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFileEx( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* fileName, - DWORD usage, - D3DPOOL pool, - LPDIRECT3DCUBETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFileEx(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* fileName, + DWORD usage, + D3DPOOL pool, + LPDIRECT3DCUBETEXTURE9* texture) noexcept { if (texture) { @@ -1536,7 +1451,7 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( return E_INVALIDARG; ComPtr tex; - HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, fileName, usage, pool, false, tex.GetAddressOf()); + HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, fileName, usage, pool, false, tex.GetAddressOf()); if (SUCCEEDED(hr)) { hr = E_FAIL; @@ -1550,13 +1465,11 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( return hr; } -_Use_decl_annotations_ -HRESULT DirectX::CreateDDSTextureFromFileEx( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* szFileName, - DWORD usage, - D3DPOOL pool, - LPDIRECT3DVOLUMETEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateDDSTextureFromFileEx(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* szFileName, + DWORD usage, + D3DPOOL pool, + LPDIRECT3DVOLUMETEXTURE9* texture) noexcept { if (texture) { @@ -1567,7 +1480,7 @@ HRESULT DirectX::CreateDDSTextureFromFileEx( return E_INVALIDARG; ComPtr tex; - HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, szFileName, usage, pool, false, tex.GetAddressOf()); + HRESULT hr = CreateDDSTextureFromFileEx(d3dDevice, szFileName, usage, pool, false, tex.GetAddressOf()); if (SUCCEEDED(hr)) { hr = E_FAIL; diff --git a/DDSTextureLoader/DDSTextureLoader9.h b/DDSTextureLoader/DDSTextureLoader9.h index f2c474df..b53c53c9 100644 --- a/DDSTextureLoader/DDSTextureLoader9.h +++ b/DDSTextureLoader/DDSTextureLoader9.h @@ -24,122 +24,105 @@ #include #include - namespace DirectX { // Standard version - HRESULT CreateDDSTextureFromMemory( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _Outptr_ LPDIRECT3DBASETEXTURE9* texture, - bool generateMipsIfMissing = false) noexcept; - - HRESULT CreateDDSTextureFromFile( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _Outptr_ LPDIRECT3DBASETEXTURE9* texture, - bool generateMipsIfMissing = false) noexcept; + HRESULT CreateDDSTextureFromMemory(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_ LPDIRECT3DBASETEXTURE9* texture, + bool generateMipsIfMissing = false) noexcept; + + HRESULT CreateDDSTextureFromFile(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _Outptr_ LPDIRECT3DBASETEXTURE9* texture, + bool generateMipsIfMissing = false) noexcept; // Extended version - HRESULT CreateDDSTextureFromMemoryEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - bool generateMipsIfMissing, - _Outptr_ LPDIRECT3DBASETEXTURE9* texture) noexcept; - - HRESULT CreateDDSTextureFromFileEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _In_ DWORD usage, - _In_ D3DPOOL pool, - bool generateMipsIfMissing, - _Outptr_ LPDIRECT3DBASETEXTURE9* texture) noexcept; + HRESULT CreateDDSTextureFromMemoryEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + bool generateMipsIfMissing, + _Outptr_ LPDIRECT3DBASETEXTURE9* texture) noexcept; + + HRESULT CreateDDSTextureFromFileEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _In_ DWORD usage, + _In_ D3DPOOL pool, + bool generateMipsIfMissing, + _Outptr_ LPDIRECT3DBASETEXTURE9* texture) noexcept; // Type-specific standard versions - HRESULT CreateDDSTextureFromMemory( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _Outptr_ LPDIRECT3DTEXTURE9* texture, - bool generateMipsIfMissing = false) noexcept; - - HRESULT CreateDDSTextureFromFile( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _Outptr_ LPDIRECT3DTEXTURE9* texture, - bool generateMipsIfMissing = false) noexcept; - - HRESULT CreateDDSTextureFromMemory( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept; - - HRESULT CreateDDSTextureFromFile( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept; - - HRESULT CreateDDSTextureFromMemory( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept; - - HRESULT CreateDDSTextureFromFile( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept; + HRESULT CreateDDSTextureFromMemory(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_ LPDIRECT3DTEXTURE9* texture, + bool generateMipsIfMissing = false) noexcept; + + HRESULT CreateDDSTextureFromFile(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _Outptr_ LPDIRECT3DTEXTURE9* texture, + bool generateMipsIfMissing = false) noexcept; + + HRESULT CreateDDSTextureFromMemory(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept; + + HRESULT CreateDDSTextureFromFile(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept; + + HRESULT CreateDDSTextureFromMemory(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept; + + HRESULT CreateDDSTextureFromFile(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept; // Type-specific extended versions - HRESULT CreateDDSTextureFromMemoryEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - bool generateMipsIfMissing, - _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept; - - HRESULT CreateDDSTextureFromFileEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _In_ DWORD usage, - _In_ D3DPOOL pool, - bool generateMipsIfMissing, - _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept; - - HRESULT CreateDDSTextureFromMemoryEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - _Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept; - - HRESULT CreateDDSTextureFromFileEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _In_ DWORD usage, - _In_ D3DPOOL pool, - _Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept; - - HRESULT CreateDDSTextureFromMemoryEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, - _In_ size_t ddsDataSize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - _Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept; - - HRESULT CreateDDSTextureFromFileEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _In_ DWORD usage, - _In_ D3DPOOL pool, - _Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept; -} + HRESULT CreateDDSTextureFromMemoryEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + bool generateMipsIfMissing, + _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept; + + HRESULT CreateDDSTextureFromFileEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _In_ DWORD usage, + _In_ D3DPOOL pool, + bool generateMipsIfMissing, + _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept; + + HRESULT CreateDDSTextureFromMemoryEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + _Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept; + + HRESULT CreateDDSTextureFromFileEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _In_ DWORD usage, + _In_ D3DPOOL pool, + _Outptr_ LPDIRECT3DCUBETEXTURE9* texture) noexcept; + + HRESULT CreateDDSTextureFromMemoryEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(ddsDataSize) const uint8_t* ddsData, + _In_ size_t ddsDataSize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + _Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept; + + HRESULT CreateDDSTextureFromFileEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _In_ DWORD usage, + _In_ D3DPOOL pool, + _Outptr_ LPDIRECT3DVOLUMETEXTURE9* texture) noexcept; +} // namespace DirectX diff --git a/DDSView/ddsview.cpp b/DDSView/ddsview.cpp index 93233501..17ed72cf 100644 --- a/DDSView/ddsview.cpp +++ b/DDSView/ddsview.cpp @@ -39,7 +39,7 @@ using namespace DirectX; #define IDI_MAIN_ICON 100 //-------------------------------------------------------------------------------------- -#pragma pack(push,1) +#pragma pack(push, 1) struct SimpleVertex { XMFLOAT4 Pos; @@ -64,55 +64,51 @@ namespace #include "ddsview_ps2Darray.inc" #include "ddsview_ps3D.inc" #include "ddsview_psCube.inc" -} +} // namespace //-------------------------------------------------------------------------------------- namespace { - HINSTANCE g_hInst = nullptr; - HWND g_hWnd = nullptr; - D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL; - D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0; - ID3D11Device* g_pd3dDevice = nullptr; - ID3D11DeviceContext* g_pImmediateContext = nullptr; - IDXGISwapChain* g_pSwapChain = nullptr; - ID3D11RenderTargetView* g_pRenderTargetView = nullptr; - ID3D11Texture2D* g_pDepthStencil = nullptr; - ID3D11DepthStencilView* g_pDepthStencilView = nullptr; - ID3D11VertexShader* g_pVertexShader = nullptr; - ID3D11PixelShader* g_pPixelShader = nullptr; - ID3D11InputLayout* g_pVertexLayout = nullptr; - ID3D11Buffer* g_pVertexBuffer = nullptr; - ID3D11Buffer* g_pIndexBuffer = nullptr; - ID3D11Buffer* g_pCBArrayControl = nullptr; - ID3D11ShaderResourceView* g_pSRV = nullptr; - ID3D11BlendState* g_AlphaBlendState = nullptr; - ID3D11SamplerState* g_pSamplerLinear = nullptr; - - UINT g_iCurrentIndex = 0; - UINT g_iMaxIndex = 1; - - UINT g_iIndices = 0; - - LPCWSTR g_szAppName = L"DDSView"; -} + HINSTANCE g_hInst = nullptr; + HWND g_hWnd = nullptr; + D3D_DRIVER_TYPE g_driverType = D3D_DRIVER_TYPE_NULL; + D3D_FEATURE_LEVEL g_featureLevel = D3D_FEATURE_LEVEL_11_0; + ID3D11Device* g_pd3dDevice = nullptr; + ID3D11DeviceContext* g_pImmediateContext = nullptr; + IDXGISwapChain* g_pSwapChain = nullptr; + ID3D11RenderTargetView* g_pRenderTargetView = nullptr; + ID3D11Texture2D* g_pDepthStencil = nullptr; + ID3D11DepthStencilView* g_pDepthStencilView = nullptr; + ID3D11VertexShader* g_pVertexShader = nullptr; + ID3D11PixelShader* g_pPixelShader = nullptr; + ID3D11InputLayout* g_pVertexLayout = nullptr; + ID3D11Buffer* g_pVertexBuffer = nullptr; + ID3D11Buffer* g_pIndexBuffer = nullptr; + ID3D11Buffer* g_pCBArrayControl = nullptr; + ID3D11ShaderResourceView* g_pSRV = nullptr; + ID3D11BlendState* g_AlphaBlendState = nullptr; + ID3D11SamplerState* g_pSamplerLinear = nullptr; + + UINT g_iCurrentIndex = 0; + UINT g_iMaxIndex = 1; + + UINT g_iIndices = 0; + + LPCWSTR g_szAppName = L"DDSView"; +} // namespace //-------------------------------------------------------------------------------------- -HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow, const TexMetadata& mdata); -HRESULT InitDevice(const TexMetadata& mdata); -void CleanupDevice(); +HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow, const TexMetadata& mdata); +HRESULT InitDevice(const TexMetadata& mdata); +void CleanupDevice(); LRESULT CALLBACK WndProc(HWND, UINT, WPARAM, LPARAM); -void Render(); +void Render(); //-------------------------------------------------------------------------------------- #ifdef _MSC_VER -#pragma warning( suppress : 6262 ) +#pragma warning(suppress : 6262) #endif -int WINAPI wWinMain( - _In_ HINSTANCE hInstance, - _In_opt_ HINSTANCE /*hPrevInstance*/, - _In_ LPWSTR lpCmdLine, - _In_ int nCmdShow) +int WINAPI wWinMain(_In_ HINSTANCE hInstance, _In_opt_ HINSTANCE /*hPrevInstance*/, _In_ LPWSTR lpCmdLine, _In_ int nCmdShow) { static const wchar_t* c_usage = L"Usage: ddsview [-forcesrgb] "; @@ -122,16 +118,16 @@ int WINAPI wWinMain( return 0; } - int argc = 0; + int argc = 0; auto argList = CommandLineToArgvW(lpCmdLine, &argc); - const wchar_t* filename = nullptr; - bool forceSRGB = false; - for(int i = 0; i < argc; ++i) + const wchar_t* filename = nullptr; + bool forceSRGB = false; + for (int i = 0; i < argc; ++i) { if (*argList[i] == '-' || *argList[i] == '/') { - if (_wcsicmp(argList[i]+1, L"forcesrgb") == 0) + if (_wcsicmp(argList[i] + 1, L"forcesrgb") == 0) { forceSRGB = true; } @@ -149,7 +145,7 @@ int WINAPI wWinMain( } TexMetadata mdata; - HRESULT hr = GetMetadataFromDDSFile(filename, DDS_FLAGS_NONE, mdata); + HRESULT hr = GetMetadataFromDDSFile(filename, DDS_FLAGS_NONE, mdata); if (FAILED(hr)) { wchar_t buff[2048] = {}; @@ -186,7 +182,10 @@ int WINAPI wWinMain( if (g_featureLevel < D3D_FEATURE_LEVEL_10_0) { wchar_t buff[2048] = {}; - swprintf_s(buff, L"Texture arrays require DirectX 10 hardware or later\n\nFilename = %ls\nArray size %zu", filename, mdata.arraySize); + swprintf_s(buff, + L"Texture arrays require DirectX 10 hardware or later\n\nFilename = %ls\nArray size %zu", + filename, + mdata.arraySize); MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 1; } @@ -205,7 +204,11 @@ int WINAPI wWinMain( if (g_featureLevel < D3D_FEATURE_LEVEL_10_0) { wchar_t buff[2048] = {}; - swprintf_s(buff, L"BC4/BC5 requires DirectX 10 hardware or later\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d", filename, mdata.format, g_featureLevel); + swprintf_s(buff, + L"BC4/BC5 requires DirectX 10 hardware or later\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d", + filename, + mdata.format, + g_featureLevel); MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 1; } @@ -220,26 +223,34 @@ int WINAPI wWinMain( if (g_featureLevel < D3D_FEATURE_LEVEL_11_0) { wchar_t buff[2048] = {}; - swprintf_s(buff, L"BC6H/BC7 requires DirectX 11 hardware or later\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d", filename, mdata.format, g_featureLevel); + swprintf_s(buff, + L"BC6H/BC7 requires DirectX 11 hardware or later\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d", + filename, + mdata.format, + g_featureLevel); MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); return 1; } break; - default: + default: { + UINT flags = 0; + hr = g_pd3dDevice->CheckFormatSupport(mdata.format, &flags); + constexpr UINT required = D3D11_FORMAT_SUPPORT_TEXTURE1D | D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURE3D; + if (FAILED(hr) || !(flags & required)) { - UINT flags = 0; - hr = g_pd3dDevice->CheckFormatSupport(mdata.format, &flags); - constexpr UINT required = D3D11_FORMAT_SUPPORT_TEXTURE1D | D3D11_FORMAT_SUPPORT_TEXTURE2D | D3D11_FORMAT_SUPPORT_TEXTURE3D; - if (FAILED(hr) || !(flags & required)) - { - wchar_t buff[2048] = {}; - swprintf_s(buff, L"Format not supported by this DirectX hardware\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d\nHRESULT = %08X", filename, mdata.format, g_featureLevel, static_cast(hr)); - MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); - return 1; - } + wchar_t buff[2048] = {}; + swprintf_s(buff, + L"Format not supported by this DirectX hardware\n\nFilename = %ls\nDXGI Format %d\nFeature Level %d\nHRESULT = %08X", + filename, + mdata.format, + g_featureLevel, + static_cast(hr)); + MessageBoxW(nullptr, buff, g_szAppName, MB_OK | MB_ICONEXCLAMATION); + return 1; } - break; + } + break; } ScratchImage image; @@ -291,22 +302,19 @@ int WINAPI wWinMain( } //-------------------------------------------------------------------------------------- -HRESULT InitWindow( - HINSTANCE hInstance, - int nCmdShow, - const TexMetadata& mdata) +HRESULT InitWindow(HINSTANCE hInstance, int nCmdShow, const TexMetadata& mdata) { // Register class - WNDCLASSEXW wcex = {}; - wcex.cbSize = sizeof(WNDCLASSEXW); - wcex.style = CS_HREDRAW | CS_VREDRAW; - wcex.lpfnWndProc = WndProc; - wcex.hInstance = hInstance; - wcex.hIcon = LoadIconW(hInstance, reinterpret_cast(IDI_MAIN_ICON)); - wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); + WNDCLASSEXW wcex = {}; + wcex.cbSize = sizeof(WNDCLASSEXW); + wcex.style = CS_HREDRAW | CS_VREDRAW; + wcex.lpfnWndProc = WndProc; + wcex.hInstance = hInstance; + wcex.hIcon = LoadIconW(hInstance, reinterpret_cast(IDI_MAIN_ICON)); + wcex.hCursor = LoadCursor(nullptr, IDC_ARROW); wcex.hbrBackground = reinterpret_cast(COLOR_WINDOW + 1); wcex.lpszClassName = L"DDSViewWindowClass"; - wcex.hIconSm = LoadIconW(wcex.hInstance, reinterpret_cast(IDI_MAIN_ICON)); + wcex.hIconSm = LoadIconW(wcex.hInstance, reinterpret_cast(IDI_MAIN_ICON)); if (!RegisterClassExW(&wcex)) return E_FAIL; @@ -315,24 +323,32 @@ HRESULT InitWindow( RECT rc = { 0, 0, 640, 480 }; int cxborder = GetSystemMetrics(SM_CXBORDER); - int cxedge = GetSystemMetrics(SM_CXEDGE); - int screenX = GetSystemMetrics(SM_CXSCREEN) - std::max(cxborder, cxedge); + int cxedge = GetSystemMetrics(SM_CXEDGE); + int screenX = GetSystemMetrics(SM_CXSCREEN) - std::max(cxborder, cxedge); if (rc.right < static_cast(mdata.width)) rc.right = static_cast(mdata.width); if (rc.right > screenX) rc.right = screenX; int cyborder = GetSystemMetrics(SM_CYBORDER); - int cyedge = GetSystemMetrics(SM_CYEDGE); - int screenY = GetSystemMetrics(SM_CYSCREEN) - std::max(cyborder, cyedge); + int cyedge = GetSystemMetrics(SM_CYEDGE); + int screenY = GetSystemMetrics(SM_CYSCREEN) - std::max(cyborder, cyedge); if (rc.bottom < static_cast(mdata.height)) rc.bottom = static_cast(mdata.height); if (rc.bottom > screenY) rc.bottom = screenY; AdjustWindowRect(&rc, WS_OVERLAPPEDWINDOW, FALSE); - g_hWnd = CreateWindowW(L"DDSViewWindowClass", g_szAppName, WS_OVERLAPPEDWINDOW, - CW_USEDEFAULT, CW_USEDEFAULT, rc.right - rc.left, rc.bottom - rc.top, nullptr, nullptr, hInstance, + g_hWnd = CreateWindowW(L"DDSViewWindowClass", + g_szAppName, + WS_OVERLAPPEDWINDOW, + CW_USEDEFAULT, + CW_USEDEFAULT, + rc.right - rc.left, + rc.bottom - rc.top, + nullptr, + nullptr, + hInstance, nullptr); if (!g_hWnd) return E_FAIL; @@ -342,23 +358,19 @@ HRESULT InitWindow( return S_OK; } - //-------------------------------------------------------------------------------------- LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) { switch (message) { - case WM_PAINT: - { - PAINTSTRUCT ps; - std::ignore = BeginPaint(hWnd, &ps); - EndPaint(hWnd, &ps); - } - break; + case WM_PAINT: { + PAINTSTRUCT ps; + std::ignore = BeginPaint(hWnd, &ps); + EndPaint(hWnd, &ps); + } + break; - case WM_DESTROY: - PostQuitMessage(0); - break; + case WM_DESTROY: PostQuitMessage(0); break; case WM_KEYDOWN: if (wParam == VK_RIGHT) @@ -382,14 +394,12 @@ LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam) InvalidateRect(hWnd, nullptr, FALSE); break; - default: - return DefWindowProc(hWnd, message, wParam, lParam); + default: return DefWindowProc(hWnd, message, wParam, lParam); } return 0; } - //-------------------------------------------------------------------------------------- HRESULT InitDevice(const TexMetadata& mdata) { @@ -397,51 +407,57 @@ HRESULT InitDevice(const TexMetadata& mdata) RECT rc; GetClientRect(g_hWnd, &rc); - auto width = static_cast(rc.right - rc.left); + auto width = static_cast(rc.right - rc.left); auto height = static_cast(rc.bottom - rc.top); UINT createDeviceFlags = 0; -#if defined( DEBUG ) || defined( _DEBUG ) +#if defined(DEBUG) || defined(_DEBUG) createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; #endif - D3D_DRIVER_TYPE driverTypes[] = - { + D3D_DRIVER_TYPE driverTypes[] = { D3D_DRIVER_TYPE_HARDWARE, D3D_DRIVER_TYPE_WARP, D3D_DRIVER_TYPE_REFERENCE, }; constexpr UINT numDriverTypes = static_cast(std::size(driverTypes)); - D3D_FEATURE_LEVEL featureLevels[] = - { + D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, }; constexpr UINT numFeatureLevels = static_cast(std::size(featureLevels)); - DXGI_SWAP_CHAIN_DESC sd = {}; - sd.BufferCount = 1; - sd.BufferDesc.Width = width; - sd.BufferDesc.Height = height; - sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; - sd.BufferDesc.RefreshRate.Numerator = 60; + DXGI_SWAP_CHAIN_DESC sd = {}; + sd.BufferCount = 1; + sd.BufferDesc.Width = width; + sd.BufferDesc.Height = height; + sd.BufferDesc.Format = DXGI_FORMAT_R8G8B8A8_UNORM; + sd.BufferDesc.RefreshRate.Numerator = 60; sd.BufferDesc.RefreshRate.Denominator = 1; - sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; - sd.OutputWindow = g_hWnd; - sd.SampleDesc.Count = 1; - sd.Windowed = TRUE; + sd.BufferUsage = DXGI_USAGE_RENDER_TARGET_OUTPUT; + sd.OutputWindow = g_hWnd; + sd.SampleDesc.Count = 1; + sd.Windowed = TRUE; for (UINT driverTypeIndex = 0; driverTypeIndex < numDriverTypes; driverTypeIndex++) { g_driverType = driverTypes[driverTypeIndex]; // See https://walbourn.github.io/anatomy-of-direct3d-11-create-device/ - hr = D3D11CreateDeviceAndSwapChain(nullptr, g_driverType, nullptr, - createDeviceFlags, featureLevels, numFeatureLevels, - D3D11_SDK_VERSION, &sd, - &g_pSwapChain, &g_pd3dDevice, &g_featureLevel, &g_pImmediateContext); + hr = D3D11CreateDeviceAndSwapChain(nullptr, + g_driverType, + nullptr, + createDeviceFlags, + featureLevels, + numFeatureLevels, + D3D11_SDK_VERSION, + &sd, + &g_pSwapChain, + &g_pd3dDevice, + &g_featureLevel, + &g_pImmediateContext); if (SUCCEEDED(hr)) break; } @@ -450,38 +466,38 @@ HRESULT InitDevice(const TexMetadata& mdata) // Create a render target view ID3D11Texture2D* pBackBuffer = nullptr; - hr = g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); + hr = g_pSwapChain->GetBuffer(0, IID_PPV_ARGS(&pBackBuffer)); if (FAILED(hr)) return hr; D3D11_RENDER_TARGET_VIEW_DESC vd = {}; - vd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; - vd.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - hr = g_pd3dDevice->CreateRenderTargetView(pBackBuffer, &vd, &g_pRenderTargetView); + vd.ViewDimension = D3D11_RTV_DIMENSION_TEXTURE2D; + vd.Format = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + hr = g_pd3dDevice->CreateRenderTargetView(pBackBuffer, &vd, &g_pRenderTargetView); pBackBuffer->Release(); if (FAILED(hr)) return hr; // Create depth stencil texture D3D11_TEXTURE2D_DESC descDepth = {}; - descDepth.Width = width; - descDepth.Height = height; - descDepth.MipLevels = 1; - descDepth.ArraySize = 1; - descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; - descDepth.SampleDesc.Count = 1; - descDepth.Usage = D3D11_USAGE_DEFAULT; - descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; - hr = g_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &g_pDepthStencil); + descDepth.Width = width; + descDepth.Height = height; + descDepth.MipLevels = 1; + descDepth.ArraySize = 1; + descDepth.Format = DXGI_FORMAT_D24_UNORM_S8_UINT; + descDepth.SampleDesc.Count = 1; + descDepth.Usage = D3D11_USAGE_DEFAULT; + descDepth.BindFlags = D3D11_BIND_DEPTH_STENCIL; + hr = g_pd3dDevice->CreateTexture2D(&descDepth, nullptr, &g_pDepthStencil); if (FAILED(hr)) return hr; // Create the depth stencil view D3D11_DEPTH_STENCIL_VIEW_DESC descDSV = {}; - descDSV.Format = descDepth.Format; - descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; - descDSV.Texture2D.MipSlice = 0; - hr = g_pd3dDevice->CreateDepthStencilView(g_pDepthStencil, &descDSV, &g_pDepthStencilView); + descDSV.Format = descDepth.Format; + descDSV.ViewDimension = D3D11_DSV_DIMENSION_TEXTURE2D; + descDSV.Texture2D.MipSlice = 0; + hr = g_pd3dDevice->CreateDepthStencilView(g_pDepthStencil, &descDSV, &g_pDepthStencilView); if (FAILED(hr)) return hr; @@ -497,8 +513,7 @@ HRESULT InitDevice(const TexMetadata& mdata) return hr; // Define the input layout - D3D11_INPUT_ELEMENT_DESC layout[] = - { + D3D11_INPUT_ELEMENT_DESC layout[] = { { "POSITION", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, 0, D3D11_INPUT_PER_VERTEX_DATA, 0 }, { "TEXCOORD", 0, DXGI_FORMAT_R32G32B32A32_FLOAT, 0, sizeof(XMFLOAT4), D3D11_INPUT_PER_VERTEX_DATA, 0 }, }; @@ -513,22 +528,22 @@ HRESULT InitDevice(const TexMetadata& mdata) g_pImmediateContext->IASetInputLayout(g_pVertexLayout); // Select the pixel shader - bool isCubeMap = false; - bool is1D = false; - const BYTE* pshader = nullptr; - size_t pshader_size = 0; + bool isCubeMap = false; + bool is1D = false; + const BYTE* pshader = nullptr; + size_t pshader_size = 0; switch (mdata.dimension) { case TEX_DIMENSION_TEXTURE1D: if (mdata.arraySize > 1) { - pshader = g_PS_1DArray; + pshader = g_PS_1DArray; pshader_size = sizeof(g_PS_1DArray); } else { - pshader = g_PS_1D; + pshader = g_PS_1D; pshader_size = sizeof(g_PS_1D); } is1D = true; @@ -537,29 +552,28 @@ HRESULT InitDevice(const TexMetadata& mdata) case TEX_DIMENSION_TEXTURE2D: if (mdata.miscFlags & TEX_MISC_TEXTURECUBE) { - pshader = g_PS_Cube; + pshader = g_PS_Cube; pshader_size = sizeof(g_PS_Cube); - isCubeMap = true; + isCubeMap = true; } else if (mdata.arraySize > 1) { - pshader = g_PS_2DArray; + pshader = g_PS_2DArray; pshader_size = sizeof(g_PS_2DArray); } else { - pshader = g_PS_2D; + pshader = g_PS_2D; pshader_size = sizeof(g_PS_2D); } break; case TEX_DIMENSION_TEXTURE3D: - pshader = g_PS_3D; + pshader = g_PS_3D; pshader_size = sizeof(g_PS_3D); break; - default: - return E_FAIL; + default: return E_FAIL; } assert(pshader && pshader_size > 0); @@ -570,11 +584,10 @@ HRESULT InitDevice(const TexMetadata& mdata) return hr; // Create vertex buffer - UINT nverts; + UINT nverts; D3D11_SUBRESOURCE_DATA InitData = {}; - static const SimpleVertex verticesCube[] = - { + static const SimpleVertex verticesCube[] = { // Render cubemaps as horizontal cross // XPOS @@ -614,16 +627,14 @@ HRESULT InitDevice(const TexMetadata& mdata) { XMFLOAT4(-.5f, -.25f, 0.f, 1.f), XMFLOAT4(1.f, 1.f, 5.f, 0.f) }, }; - static const SimpleVertex vertices[] = - { + static const SimpleVertex vertices[] = { { XMFLOAT4(-1.f, 1.f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 0.f, 0.f) }, { XMFLOAT4(1.f, 1.f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 0.f, 0.f) }, { XMFLOAT4(-1.f, -1.f, 0.f, 1.f), XMFLOAT4(0.f, 1.f, 0.f, 0.f) }, { XMFLOAT4(1.f, -1.f, 0.f, 1.f), XMFLOAT4(1.f, 1.f, 0.f, 0.f) }, }; - static const SimpleVertex vertices1D[] = - { + static const SimpleVertex vertices1D[] = { { XMFLOAT4(-1.f, .05f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 0.f, 0.f) }, { XMFLOAT4(1.f, .05f, 0.f, 1.f), XMFLOAT4(1.f, 0.f, 0.f, 0.f) }, { XMFLOAT4(-1.f, -.05f, 0.f, 1.f), XMFLOAT4(0.f, 0.f, 0.f, 0.f) }, @@ -632,26 +643,26 @@ HRESULT InitDevice(const TexMetadata& mdata) if (isCubeMap) { - nverts = static_cast(std::size(verticesCube)); + nverts = static_cast(std::size(verticesCube)); InitData.pSysMem = verticesCube; } else if (is1D) { - nverts = static_cast(std::size(vertices1D)); + nverts = static_cast(std::size(vertices1D)); InitData.pSysMem = vertices1D; } else { - nverts = static_cast(std::size(vertices)); + nverts = static_cast(std::size(vertices)); InitData.pSysMem = vertices; } D3D11_BUFFER_DESC bd = {}; - bd.Usage = D3D11_USAGE_DEFAULT; - bd.ByteWidth = sizeof(SimpleVertex) * nverts; - bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; - bd.CPUAccessFlags = 0; - hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer); + bd.Usage = D3D11_USAGE_DEFAULT; + bd.ByteWidth = sizeof(SimpleVertex) * nverts; + bd.BindFlags = D3D11_BIND_VERTEX_BUFFER; + bd.CPUAccessFlags = 0; + hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pVertexBuffer); if (FAILED(hr)) return hr; @@ -661,44 +672,46 @@ HRESULT InitDevice(const TexMetadata& mdata) g_pImmediateContext->IASetVertexBuffers(0, 1, &g_pVertexBuffer, &stride, &offset); // Create index buffer - static const WORD indicesCube[] = - { - 0, 1, 2, - 2, 1, 3, - 4, 5, 6, - 6, 5, 7, - 8, 9, 10, - 10, 9, 11, - 12, 13, 14, - 14, 13, 15, - 16, 17, 18, - 18, 17, 19, - 20, 21, 22, - 22, 21, 23 + static const WORD indicesCube[] = { + // clang-format off + 0, 1, 2, + 2, 1, 3, + 4, 5, 6, + 6, 5, 7, + 8, 9, 10, + 10, 9, 11, + 12, 13, 14, + 14, 13, 15, + 16, 17, 18, + 18, 17, 19, + 20, 21, 22, + 22, 21, 23 + // clang-format on }; - static const WORD indices[] = - { - 0, 1, 2, - 2, 1, 3 + static const WORD indices[] = { + // clang-format off + 0, 1, 2, + 2, 1, 3 + // clang-format on }; if (isCubeMap) { - g_iIndices = static_cast(std::size(indicesCube)); + g_iIndices = static_cast(std::size(indicesCube)); InitData.pSysMem = indicesCube; } else { - g_iIndices = static_cast(std::size(indices)); + g_iIndices = static_cast(std::size(indices)); InitData.pSysMem = indices; } - bd.Usage = D3D11_USAGE_DEFAULT; - bd.ByteWidth = g_iIndices * sizeof(WORD); - bd.BindFlags = D3D11_BIND_INDEX_BUFFER; + bd.Usage = D3D11_USAGE_DEFAULT; + bd.ByteWidth = g_iIndices * sizeof(WORD); + bd.BindFlags = D3D11_BIND_INDEX_BUFFER; bd.CPUAccessFlags = 0; - hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pIndexBuffer); + hr = g_pd3dDevice->CreateBuffer(&bd, &InitData, &g_pIndexBuffer); if (FAILED(hr)) return hr; @@ -709,57 +722,51 @@ HRESULT InitDevice(const TexMetadata& mdata) g_pImmediateContext->IASetPrimitiveTopology(D3D11_PRIMITIVE_TOPOLOGY_TRIANGLELIST); // Create the constant buffers - bd.Usage = D3D11_USAGE_DEFAULT; - bd.ByteWidth = sizeof(CBArrayControl); - bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + bd.Usage = D3D11_USAGE_DEFAULT; + bd.ByteWidth = sizeof(CBArrayControl); + bd.BindFlags = D3D11_BIND_CONSTANT_BUFFER; bd.CPUAccessFlags = 0; - hr = g_pd3dDevice->CreateBuffer(&bd, nullptr, &g_pCBArrayControl); + hr = g_pd3dDevice->CreateBuffer(&bd, nullptr, &g_pCBArrayControl); if (FAILED(hr)) return hr; // Create the state objects D3D11_SAMPLER_DESC sampDesc = {}; - sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; - sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; - sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; - sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; - sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; - sampDesc.MinLOD = 0; - sampDesc.MaxLOD = D3D11_FLOAT32_MAX; - hr = g_pd3dDevice->CreateSamplerState(&sampDesc, &g_pSamplerLinear); + sampDesc.Filter = D3D11_FILTER_MIN_MAG_MIP_POINT; + sampDesc.AddressU = D3D11_TEXTURE_ADDRESS_WRAP; + sampDesc.AddressV = D3D11_TEXTURE_ADDRESS_WRAP; + sampDesc.AddressW = D3D11_TEXTURE_ADDRESS_WRAP; + sampDesc.ComparisonFunc = D3D11_COMPARISON_NEVER; + sampDesc.MinLOD = 0; + sampDesc.MaxLOD = D3D11_FLOAT32_MAX; + hr = g_pd3dDevice->CreateSamplerState(&sampDesc, &g_pSamplerLinear); if (FAILED(hr)) return hr; - D3D11_BLEND_DESC dsc = - { - false, + D3D11_BLEND_DESC dsc = { false, false, { - { - true, - D3D11_BLEND_SRC_ALPHA, - D3D11_BLEND_INV_SRC_ALPHA, - D3D11_BLEND_OP_ADD, - D3D11_BLEND_ZERO, - D3D11_BLEND_ZERO, - D3D11_BLEND_OP_ADD, - D3D11_COLOR_WRITE_ENABLE_ALL - }, - // ... - } - }; - hr = g_pd3dDevice->CreateBlendState(&dsc, &g_AlphaBlendState); + { true, + D3D11_BLEND_SRC_ALPHA, + D3D11_BLEND_INV_SRC_ALPHA, + D3D11_BLEND_OP_ADD, + D3D11_BLEND_ZERO, + D3D11_BLEND_ZERO, + D3D11_BLEND_OP_ADD, + D3D11_COLOR_WRITE_ENABLE_ALL }, + // ... + } }; + hr = g_pd3dDevice->CreateBlendState(&dsc, &g_AlphaBlendState); if (FAILED(hr)) return hr; return S_OK; } - //-------------------------------------------------------------------------------------- void Render() { - float ClearColor[4] = { 0.f, 1.f, 1.f, 1.0f }; //red,green,blue,alpha + float ClearColor[4] = { 0.f, 1.f, 1.f, 1.0f }; // red,green,blue,alpha g_pImmediateContext->ClearRenderTargetView(g_pRenderTargetView, ClearColor); g_pImmediateContext->ClearDepthStencilView(g_pDepthStencilView, D3D11_CLEAR_DEPTH, 1.0f, 0); @@ -767,7 +774,7 @@ void Render() g_pImmediateContext->OMSetBlendState(g_AlphaBlendState, bf, 0xffffffff); CBArrayControl cb = {}; - cb.Index = static_cast(g_iCurrentIndex); + cb.Index = static_cast(g_iCurrentIndex); g_pImmediateContext->UpdateSubresource(g_pCBArrayControl, 0, nullptr, &cb, 0, 0); g_pImmediateContext->VSSetShader(g_pVertexShader, nullptr, 0); @@ -780,25 +787,40 @@ void Render() g_pSwapChain->Present(0, 0); } - //-------------------------------------------------------------------------------------- void CleanupDevice() { - if (g_pImmediateContext) g_pImmediateContext->ClearState(); - - if (g_pSamplerLinear) g_pSamplerLinear->Release(); - if (g_AlphaBlendState) g_AlphaBlendState->Release(); - if (g_pSRV) g_pSRV->Release(); - if (g_pVertexBuffer) g_pVertexBuffer->Release(); - if (g_pIndexBuffer) g_pIndexBuffer->Release(); - if (g_pCBArrayControl) g_pCBArrayControl->Release(); - if (g_pVertexLayout) g_pVertexLayout->Release(); - if (g_pVertexShader) g_pVertexShader->Release(); - if (g_pPixelShader) g_pPixelShader->Release(); - if (g_pDepthStencil) g_pDepthStencil->Release(); - if (g_pDepthStencilView) g_pDepthStencilView->Release(); - if (g_pRenderTargetView) g_pRenderTargetView->Release(); - if (g_pSwapChain) g_pSwapChain->Release(); - if (g_pImmediateContext) g_pImmediateContext->Release(); - if (g_pd3dDevice) g_pd3dDevice->Release(); + if (g_pImmediateContext) + g_pImmediateContext->ClearState(); + + if (g_pSamplerLinear) + g_pSamplerLinear->Release(); + if (g_AlphaBlendState) + g_AlphaBlendState->Release(); + if (g_pSRV) + g_pSRV->Release(); + if (g_pVertexBuffer) + g_pVertexBuffer->Release(); + if (g_pIndexBuffer) + g_pIndexBuffer->Release(); + if (g_pCBArrayControl) + g_pCBArrayControl->Release(); + if (g_pVertexLayout) + g_pVertexLayout->Release(); + if (g_pVertexShader) + g_pVertexShader->Release(); + if (g_pPixelShader) + g_pPixelShader->Release(); + if (g_pDepthStencil) + g_pDepthStencil->Release(); + if (g_pDepthStencilView) + g_pDepthStencilView->Release(); + if (g_pRenderTargetView) + g_pRenderTargetView->Release(); + if (g_pSwapChain) + g_pSwapChain->Release(); + if (g_pImmediateContext) + g_pImmediateContext->Release(); + if (g_pd3dDevice) + g_pd3dDevice->Release(); } diff --git a/DirectXTex/BC.cpp b/DirectXTex/BC.cpp index c912f2f4..89f6b2ab 100644 --- a/DirectXTex/BC.cpp +++ b/DirectXTex/BC.cpp @@ -12,8 +12,8 @@ #include "DirectXTexP.h" // Experiemental encoding variants, not enabled by default -//#define COLOR_WEIGHTS -//#define COLOR_AVG_0WEIGHTS +// #define COLOR_WEIGHTS +// #define COLOR_AVG_0WEIGHTS #include "BC.h" @@ -33,7 +33,7 @@ namespace //------------------------------------------------------------------------------------- // Decode/Encode RGB 5/6/5 colors //------------------------------------------------------------------------------------- - inline void Decode565(_Out_ HDRColorA *pColor, _In_ const uint16_t w565) noexcept + inline void Decode565(_Out_ HDRColorA* pColor, _In_ const uint16_t w565) noexcept { pColor->r = static_cast((w565 >> 11) & 31) * (1.0f / 31.0f); pColor->g = static_cast((w565 >> 5) & 63) * (1.0f / 63.0f); @@ -41,7 +41,7 @@ namespace pColor->a = 1.0f; } - inline uint16_t Encode565(_In_ const HDRColorA *pColor) noexcept + inline uint16_t Encode565(_In_ const HDRColorA* pColor) noexcept { HDRColorA Color; @@ -52,31 +52,27 @@ namespace uint16_t w; - w = static_cast( - (static_cast(Color.r * 31.0f + 0.5f) << 11) - | (static_cast(Color.g * 63.0f + 0.5f) << 5) - | (static_cast(Color.b * 31.0f + 0.5f) << 0)); + w = static_cast((static_cast(Color.r * 31.0f + 0.5f) << 11) | (static_cast(Color.g * 63.0f + 0.5f) << 5) + | (static_cast(Color.b * 31.0f + 0.5f) << 0)); return w; } - //------------------------------------------------------------------------------------- - void OptimizeRGB( - _Out_ HDRColorA *pX, - _Out_ HDRColorA *pY, - _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA *pPoints, - uint32_t cSteps, - uint32_t flags) noexcept + void OptimizeRGB(_Out_ HDRColorA* pX, + _Out_ HDRColorA* pY, + _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA* pPoints, + uint32_t cSteps, + uint32_t flags) noexcept { - constexpr float fEpsilon = (0.25f / 64.0f) * (0.25f / 64.0f); - static const float pC3[] = { 2.0f / 2.0f, 1.0f / 2.0f, 0.0f / 2.0f }; - static const float pD3[] = { 0.0f / 2.0f, 1.0f / 2.0f, 2.0f / 2.0f }; - static const float pC4[] = { 3.0f / 3.0f, 2.0f / 3.0f, 1.0f / 3.0f, 0.0f / 3.0f }; - static const float pD4[] = { 0.0f / 3.0f, 1.0f / 3.0f, 2.0f / 3.0f, 3.0f / 3.0f }; + constexpr float fEpsilon = (0.25f / 64.0f) * (0.25f / 64.0f); + static const float pC3[] = { 2.0f / 2.0f, 1.0f / 2.0f, 0.0f / 2.0f }; + static const float pD3[] = { 0.0f / 2.0f, 1.0f / 2.0f, 2.0f / 2.0f }; + static const float pC4[] = { 3.0f / 3.0f, 2.0f / 3.0f, 1.0f / 3.0f, 0.0f / 3.0f }; + static const float pD4[] = { 0.0f / 3.0f, 1.0f / 3.0f, 2.0f / 3.0f, 3.0f / 3.0f }; - const float *pC = (3 == cSteps) ? pC3 : pC4; - const float *pD = (3 == cSteps) ? pD3 : pD4; + const float* pC = (3 == cSteps) ? pC3 : pC4; + const float* pD = (3 == cSteps) ? pD3 : pD4; // Find Min and Max points, as starting point HDRColorA X = (flags & BC_FLAGS_UNIFORM) ? HDRColorA(1.f, 1.f, 1.f, 1.f) : g_Luminance; @@ -84,9 +80,9 @@ namespace for (size_t iPoint = 0; iPoint < NUM_PIXELS_PER_BLOCK; iPoint++) { - #ifdef COLOR_WEIGHTS +#ifdef COLOR_WEIGHTS if (pPoints[iPoint].a > 0.0f) - #endif // COLOR_WEIGHTS +#endif // COLOR_WEIGHTS { if (pPoints[iPoint].r < X.r) X.r = pPoints[iPoint].r; @@ -116,8 +112,14 @@ namespace // Single color block.. no need to root-find if (fAB < FLT_MIN) { - pX->r = X.r; pX->g = X.g; pX->b = X.b; pX->a = 1.0f; - pY->r = Y.r; pY->g = Y.g; pY->b = Y.b; pY->a = 1.0f; + pX->r = X.r; + pX->g = X.g; + pX->b = X.b; + pX->a = 1.0f; + pY->r = Y.r; + pY->g = Y.g; + pY->b = Y.b; + pY->a = 1.0f; return; } @@ -126,11 +128,7 @@ namespace HDRColorA Dir(AB.r * fABInv, AB.g * fABInv, AB.b * fABInv, 0.0f); - const HDRColorA Mid( - (X.r + Y.r) * 0.5f, - (X.g + Y.g) * 0.5f, - (X.b + Y.b) * 0.5f, - 0.0f); + const HDRColorA Mid((X.r + Y.r) * 0.5f, (X.g + Y.g) * 0.5f, (X.b + Y.b) * 0.5f, 0.0f); float fDir[4] = {}; @@ -144,7 +142,7 @@ namespace float f; - #ifdef COLOR_WEIGHTS +#ifdef COLOR_WEIGHTS f = Pt.r + Pt.g + Pt.b; fDir[0] += pPoints[iPoint].a * f * f; @@ -156,7 +154,7 @@ namespace f = Pt.r - Pt.g - Pt.b; fDir[3] += pPoints[iPoint].a * f * f; - #else +#else f = Pt.r + Pt.g + Pt.b; fDir[0] += f * f; @@ -168,11 +166,11 @@ namespace f = Pt.r - Pt.g - Pt.b; fDir[3] += f * f; - #endif // COLOR_WEIGHTS +#endif // COLOR_WEIGHTS } - float fDirMax = fDir[0]; - size_t iDirMax = 0; + float fDirMax = fDir[0]; + size_t iDirMax = 0; for (size_t iDir = 1; iDir < 4; iDir++) { @@ -185,20 +183,29 @@ namespace if (iDirMax & 2) { - const float f = X.g; X.g = Y.g; Y.g = f; + const float f = X.g; + X.g = Y.g; + Y.g = f; } if (iDirMax & 1) { - const float f = X.b; X.b = Y.b; Y.b = f; + const float f = X.b; + X.b = Y.b; + Y.b = f; } - // Two color block.. no need to root-find if (fAB < 1.0f / 4096.0f) { - pX->r = X.r; pX->g = X.g; pX->b = X.b; pX->a = 1.0f; - pY->r = Y.r; pY->g = Y.g; pY->b = Y.b; pY->a = 1.0f; + pX->r = X.r; + pX->g = X.g; + pX->b = X.b; + pX->a = 1.0f; + pY->r = Y.r; + pY->g = Y.g; + pY->b = Y.b; + pY->a = 1.0f; return; } @@ -218,7 +225,6 @@ namespace pSteps[iStep].a = 1.0f; } - // Calculate color direction Dir.r = Y.r - X.r; Dir.g = Y.g - X.g; @@ -235,19 +241,16 @@ namespace Dir.g *= fScale; Dir.b *= fScale; - // Evaluate function, and derivatives - float d2X = 0.f; - float d2Y = 0.f; - HDRColorA dX = {}; - HDRColorA dY = {}; + float d2X = 0.f; + float d2Y = 0.f; + HDRColorA dX = {}; + HDRColorA dY = {}; for (size_t iPoint = 0; iPoint < NUM_PIXELS_PER_BLOCK; iPoint++) { - const float fDot = (pPoints[iPoint].r - X.r) * Dir.r + - (pPoints[iPoint].g - X.g) * Dir.g + - (pPoints[iPoint].b - X.b) * Dir.b; - + const float fDot + = (pPoints[iPoint].r - X.r) * Dir.r + (pPoints[iPoint].g - X.g) * Dir.g + (pPoints[iPoint].b - X.b) * Dir.b; uint32_t iStep; if (fDot <= 0.0f) @@ -257,20 +260,19 @@ namespace else iStep = uint32_t(fDot + 0.5f); - HDRColorA Diff; Diff.r = pSteps[iStep].r - pPoints[iPoint].r; Diff.g = pSteps[iStep].g - pPoints[iPoint].g; Diff.b = pSteps[iStep].b - pPoints[iPoint].b; Diff.a = 0.0f; - #ifdef COLOR_WEIGHTS +#ifdef COLOR_WEIGHTS const float fC = pC[iStep] * pPoints[iPoint].a * (1.0f / 8.0f); const float fD = pD[iStep] * pPoints[iPoint].a * (1.0f / 8.0f); - #else +#else const float fC = pC[iStep] * (1.0f / 8.0f); const float fD = pD[iStep] * (1.0f / 8.0f); - #endif // COLOR_WEIGHTS +#endif // COLOR_WEIGHTS d2X += fC * pC[iStep]; dX.r += fC * Diff.r; @@ -302,23 +304,25 @@ namespace Y.b += dY.b * f; } - if ((dX.r * dX.r < fEpsilon) && (dX.g * dX.g < fEpsilon) && (dX.b * dX.b < fEpsilon) && - (dY.r * dY.r < fEpsilon) && (dY.g * dY.g < fEpsilon) && (dY.b * dY.b < fEpsilon)) + if ((dX.r * dX.r < fEpsilon) && (dX.g * dX.g < fEpsilon) && (dX.b * dX.b < fEpsilon) && (dY.r * dY.r < fEpsilon) + && (dY.g * dY.g < fEpsilon) && (dY.b * dY.b < fEpsilon)) { break; } } - pX->r = X.r; pX->g = X.g; pX->b = X.b; pX->a = 1.0f; - pY->r = Y.r; pY->g = Y.g; pY->b = Y.b; pY->a = 1.0f; + pX->r = X.r; + pX->g = X.g; + pX->b = X.b; + pX->a = 1.0f; + pY->r = Y.r; + pY->g = Y.g; + pY->b = Y.b; + pY->a = 1.0f; } - //------------------------------------------------------------------------------------- - inline void DecodeBC1( - _Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, - _In_ const D3DX_BC1 *pBC, - bool isbc1) noexcept + inline void DecodeBC1(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_ const D3DX_BC1* pBC, bool isbc1) noexcept { assert(pColor && pBC); static_assert(sizeof(D3DX_BC1) == 8, "D3DX_BC1 should be 8 bytes"); @@ -341,7 +345,7 @@ namespace if (isbc1 && (pBC->rgb[0] <= pBC->rgb[1])) { clr2 = XMVectorLerp(clr0, clr1, 0.5f); - clr3 = XMVectorZero(); // Alpha of 0 + clr3 = XMVectorZero(); // Alpha of 0 } else { @@ -355,9 +359,9 @@ namespace { switch (dw & 3) { - case 0: pColor[i] = clr0; break; - case 1: pColor[i] = clr1; break; - case 2: pColor[i] = clr2; break; + case 0: pColor[i] = clr0; break; + case 1: pColor[i] = clr1; break; + case 2: pColor[i] = clr2; break; case 3: default: pColor[i] = clr3; break; @@ -365,14 +369,12 @@ namespace } } - //------------------------------------------------------------------------------------- - void EncodeBC1( - _Out_ D3DX_BC1 *pBC, - _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA *pColor, - bool bColorKey, - float threshold, - uint32_t flags) noexcept + void EncodeBC1(_Out_ D3DX_BC1* pBC, + _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA* pColor, + bool bColorKey, + float threshold, + uint32_t flags) noexcept { assert(pBC && pColor); static_assert(sizeof(D3DX_BC1) == 8, "D3DX_BC1 should be 8 bytes"); @@ -434,11 +436,11 @@ namespace Color[i].g = static_cast(static_cast(Clr.g * 63.0f + 0.5f)) * (1.0f / 63.0f); Color[i].b = static_cast(static_cast(Clr.b * 31.0f + 0.5f)) * (1.0f / 31.0f); - #ifdef COLOR_WEIGHTS +#ifdef COLOR_WEIGHTS Color[i].a = pColor[i].a; - #else +#else Color[i].a = 1.0f; - #endif // COLOR_WEIGHTS +#endif // COLOR_WEIGHTS if (flags & BC_FLAGS_DITHER_RGB) { @@ -565,7 +567,7 @@ namespace static const size_t pSteps3[] = { 0, 2, 1 }; static const size_t pSteps4[] = { 0, 2, 3, 1 }; - const size_t *pSteps; + const size_t* pSteps; if (3 == uSteps) { @@ -588,7 +590,7 @@ namespace Dir.b = Step[1].b - Step[0].b; Dir.a = 0.0f; - const auto fSteps = static_cast(uSteps - 1); + const auto fSteps = static_cast(uSteps - 1); const float fScale = (wColorA != wColorB) ? (fSteps / (Dir.r * Dir.r + Dir.g * Dir.g + Dir.b * Dir.b)) : 0.0f; Dir.r *= fScale; @@ -686,9 +688,9 @@ namespace //------------------------------------------------------------------------------------- #ifdef COLOR_WEIGHTS - void EncodeSolidBC1(_Out_ D3DX_BC1 *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA *pColor) + void EncodeSolidBC1(_Out_ D3DX_BC1* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA* pColor) { - #ifdef COLOR_AVG_0WEIGHTS +#ifdef COLOR_AVG_0WEIGHTS // Compute avg color HDRColorA Color; Color.r = pColor[0].r; @@ -707,9 +709,9 @@ namespace Color.b *= 1.0f / 16.0f; const uint16_t wColor = Encode565(&Color); - #else +#else const uint16_t wColor = 0x0000; - #endif // COLOR_AVG_0WEIGHTS +#endif // COLOR_AVG_0WEIGHTS // Encode solid block pBC->rgb[0] = wColor; @@ -717,8 +719,7 @@ namespace pBC->bitmap = 0x00000000; } #endif // COLOR_WEIGHTS -} - +} // namespace //===================================================================================== // Entry points @@ -727,15 +728,13 @@ namespace //------------------------------------------------------------------------------------- // BC1 Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC1(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC1(XMVECTOR* pColor, const uint8_t* pBC) noexcept { - auto pBC1 = reinterpret_cast(pBC); + auto pBC1 = reinterpret_cast(pBC); DecodeBC1(pColor, pBC1, true); } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC1(uint8_t *pBC, const XMVECTOR *pColor, float threshold, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC1(uint8_t* pBC, const XMVECTOR* pColor, float threshold, uint32_t flags) noexcept { assert(pBC && pColor); @@ -790,21 +789,19 @@ void DirectX::D3DXEncodeBC1(uint8_t *pBC, const XMVECTOR *pColor, float threshol } } - auto pBC1 = reinterpret_cast(pBC); + auto pBC1 = reinterpret_cast(pBC); EncodeBC1(pBC1, Color, true, threshold, flags); } - //------------------------------------------------------------------------------------- // BC2 Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC2(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC2(XMVECTOR* pColor, const uint8_t* pBC) noexcept { assert(pColor && pBC); static_assert(sizeof(D3DX_BC2) == 16, "D3DX_BC2 should be 16 bytes"); - auto pBC2 = reinterpret_cast(pBC); + auto pBC2 = reinterpret_cast(pBC); // RGB part DecodeBC1(pColor, &pBC2->bc1, false); @@ -814,7 +811,7 @@ void DirectX::D3DXDecodeBC2(XMVECTOR *pColor, const uint8_t *pBC) noexcept for (size_t i = 0; i < 8; ++i, dw >>= 4) { - #pragma prefast(suppress:22103, "writing blocks in two halves confuses tool") +#pragma prefast(suppress : 22103, "writing blocks in two halves confuses tool") pColor[i] = XMVectorSetW(pColor[i], static_cast(dw & 0xf) * (1.0f / 15.0f)); } @@ -824,8 +821,7 @@ void DirectX::D3DXDecodeBC2(XMVECTOR *pColor, const uint8_t *pBC) noexcept pColor[i] = XMVectorSetW(pColor[i], static_cast(dw & 0xf) * (1.0f / 15.0f)); } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC2(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC2(uint8_t* pBC, const XMVECTOR* pColor, uint32_t flags) noexcept { assert(pBC && pColor); static_assert(sizeof(D3DX_BC2) == 16, "D3DX_BC2 should be 16 bytes"); @@ -836,7 +832,7 @@ void DirectX::D3DXEncodeBC2(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags XMStoreFloat4(reinterpret_cast(&Color[i]), pColor[i]); } - auto pBC2 = reinterpret_cast(pBC); + auto pBC2 = reinterpret_cast(pBC); // 4-bit alpha part. Dithered using Floyd Stienberg error diffusion. pBC2->bitmap[0] = 0; @@ -894,17 +890,15 @@ void DirectX::D3DXEncodeBC2(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags EncodeBC1(&pBC2->bc1, Color, false, 0.f, flags); } - //------------------------------------------------------------------------------------- // BC3 Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC3(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC3(XMVECTOR* pColor, const uint8_t* pBC) noexcept { assert(pColor && pBC); static_assert(sizeof(D3DX_BC3) == 16, "D3DX_BC3 should be 16 bytes"); - auto pBC3 = reinterpret_cast(pBC); + auto pBC3 = reinterpret_cast(pBC); // RGB part DecodeBC1(pColor, &pBC3->bc1, false); @@ -940,8 +934,7 @@ void DirectX::D3DXDecodeBC3(XMVECTOR *pColor, const uint8_t *pBC) noexcept pColor[i] = XMVectorSetW(pColor[i], fAlpha[dw & 0x7]); } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC3(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC3(uint8_t* pBC, const XMVECTOR* pColor, uint32_t flags) noexcept { assert(pBC && pColor); static_assert(sizeof(D3DX_BC3) == 16, "D3DX_BC3 should be 16 bytes"); @@ -952,7 +945,7 @@ void DirectX::D3DXEncodeBC3(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags XMStoreFloat4(reinterpret_cast(&Color[i]), pColor[i]); } - auto pBC3 = reinterpret_cast(pBC); + auto pBC3 = reinterpret_cast(pBC); // Quantize block to A8, using Floyd Stienberg error diffusion. This // increases the chance that colors will map directly to the quantized @@ -1050,8 +1043,8 @@ void DirectX::D3DXEncodeBC3(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags static const size_t pSteps6[] = { 0, 2, 3, 4, 5, 1 }; static const size_t pSteps8[] = { 0, 2, 3, 4, 5, 6, 7, 1 }; - const size_t *pSteps; - float fStep[8] = {}; + const size_t* pSteps; + float fStep[8] = {}; if (6 == uSteps) { @@ -1084,7 +1077,7 @@ void DirectX::D3DXEncodeBC3(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags } // Encode alpha bitmap - const auto fSteps = static_cast(uSteps - 1); + const auto fSteps = static_cast(uSteps - 1); const float fScale = (fStep[0] != fStep[1]) ? (fSteps / (fStep[1] - fStep[0])) : 0.0f; if (flags & BC_FLAGS_DITHER_A) @@ -1134,8 +1127,8 @@ void DirectX::D3DXEncodeBC3(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags } } - pBC3->bitmap[0 + iSet * 3] = reinterpret_cast(&dw)[0]; - pBC3->bitmap[1 + iSet * 3] = reinterpret_cast(&dw)[1]; - pBC3->bitmap[2 + iSet * 3] = reinterpret_cast(&dw)[2]; + pBC3->bitmap[0 + iSet * 3] = reinterpret_cast(&dw)[0]; + pBC3->bitmap[1 + iSet * 3] = reinterpret_cast(&dw)[1]; + pBC3->bitmap[2 + iSet * 3] = reinterpret_cast(&dw)[2]; } } diff --git a/DirectXTex/BC.h b/DirectXTex/BC.h index 9d61ab95..396b24d8 100644 --- a/DirectXTex/BC.h +++ b/DirectXTex/BC.h @@ -23,9 +23,9 @@ namespace DirectX // Because these are used in SAL annotations, they need to remain macros rather than const values #define NUM_PIXELS_PER_BLOCK 16 -//------------------------------------------------------------------------------------- -// Constants -//------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------- + // Constants + //------------------------------------------------------------------------------------- enum BC_FLAGS : uint32_t { @@ -59,43 +59,36 @@ namespace DirectX public: HDRColorA() = default; - HDRColorA(float _r, float _g, float _b, float _a) noexcept : r(_r), g(_g), b(_b), a(_a) {} + HDRColorA(float _r, float _g, float _b, float _a) noexcept + : r(_r), + g(_g), + b(_b), + a(_a) + {} - HDRColorA(HDRColorA const&) = default; - HDRColorA& operator= (const HDRColorA&) = default; + HDRColorA(HDRColorA const&) = default; + HDRColorA& operator=(const HDRColorA&) = default; - HDRColorA(HDRColorA&&) = default; - HDRColorA& operator= (HDRColorA&&) = default; + HDRColorA(HDRColorA&&) = default; + HDRColorA& operator=(HDRColorA&&) = default; // binary operators - HDRColorA operator + (const HDRColorA& c) const noexcept - { - return HDRColorA(r + c.r, g + c.g, b + c.b, a + c.a); - } + HDRColorA operator+(const HDRColorA& c) const noexcept { return HDRColorA(r + c.r, g + c.g, b + c.b, a + c.a); } - HDRColorA operator - (const HDRColorA& c) const noexcept - { - return HDRColorA(r - c.r, g - c.g, b - c.b, a - c.a); - } + HDRColorA operator-(const HDRColorA& c) const noexcept { return HDRColorA(r - c.r, g - c.g, b - c.b, a - c.a); } - HDRColorA operator * (float f) const noexcept - { - return HDRColorA(r * f, g * f, b * f, a * f); - } + HDRColorA operator*(float f) const noexcept { return HDRColorA(r * f, g * f, b * f, a * f); } - HDRColorA operator / (float f) const noexcept + HDRColorA operator/(float f) const noexcept { const float fInv = 1.0f / f; return HDRColorA(r * fInv, g * fInv, b * fInv, a * fInv); } - float operator * (const HDRColorA& c) const noexcept - { - return r * c.r + g * c.g + b * c.b + a * c.a; - } + float operator*(const HDRColorA& c) const noexcept { return r * c.r + g * c.g + b * c.b + a * c.a; } // assignment operators - HDRColorA& operator += (const HDRColorA& c) noexcept + HDRColorA& operator+=(const HDRColorA& c) noexcept { r += c.r; g += c.g; @@ -104,7 +97,7 @@ namespace DirectX return *this; } - HDRColorA& operator -= (const HDRColorA& c) noexcept + HDRColorA& operator-=(const HDRColorA& c) noexcept { r -= c.r; g -= c.g; @@ -113,7 +106,7 @@ namespace DirectX return *this; } - HDRColorA& operator *= (float f) noexcept + HDRColorA& operator*=(float f) noexcept { r *= f; g *= f; @@ -122,7 +115,7 @@ namespace DirectX return *this; } - HDRColorA& operator /= (float f) noexcept + HDRColorA& operator/=(float f) noexcept { const float fInv = 1.0f / f; r *= fInv; @@ -142,11 +135,11 @@ namespace DirectX } HDRColorA(const LDRColorA& c) noexcept; - HDRColorA& operator = (const LDRColorA& c) noexcept; - LDRColorA ToLDRColorA() const noexcept; + HDRColorA& operator=(const LDRColorA& c) noexcept; + LDRColorA ToLDRColorA() const noexcept; }; - inline HDRColorA* HDRColorALerp(_Out_ HDRColorA *pOut, _In_ const HDRColorA *pC1, _In_ const HDRColorA *pC2, _In_ float s) noexcept + inline HDRColorA* HDRColorALerp(_Out_ HDRColorA* pOut, _In_ const HDRColorA* pC1, _In_ const HDRColorA* pC2, _In_ float s) noexcept { pOut->r = pC1->r + s * (pC2->r - pC1->r); pOut->g = pC1->g + s * (pC2->g - pC1->g); @@ -155,27 +148,27 @@ namespace DirectX return pOut; } -#pragma pack(push,1) -// BC1/DXT1 compression (4 bits per texel) +#pragma pack(push, 1) + // BC1/DXT1 compression (4 bits per texel) struct D3DX_BC1 { - uint16_t rgb[2]; // 565 colors - uint32_t bitmap; // 2bpp rgb bitmap + uint16_t rgb[2]; // 565 colors + uint32_t bitmap; // 2bpp rgb bitmap }; // BC2/DXT2/3 compression (8 bits per texel) struct D3DX_BC2 { - uint32_t bitmap[2]; // 4bpp alpha bitmap - D3DX_BC1 bc1; // BC1 rgb data + uint32_t bitmap[2]; // 4bpp alpha bitmap + D3DX_BC1 bc1; // BC1 rgb data }; // BC3/DXT4/5 compression (8 bits per texel) struct D3DX_BC3 { - uint8_t alpha[2]; // alpha values - uint8_t bitmap[6]; // 3bpp alpha bitmap - D3DX_BC1 bc1; // BC1 rgb data + uint8_t alpha[2]; // alpha values + uint8_t bitmap[6]; // 3bpp alpha bitmap + D3DX_BC1 bc1; // BC1 rgb data }; #pragma pack(pop) @@ -184,15 +177,18 @@ namespace DirectX //------------------------------------------------------------------------------------- #pragma warning(push) #pragma warning(disable : 4127) - template void OptimizeAlpha(float *pX, float *pY, const float *pPoints, uint32_t cSteps) noexcept + template + void OptimizeAlpha(float* pX, float* pY, const float* pPoints, uint32_t cSteps) noexcept { static const float pC6[] = { 5.0f / 5.0f, 4.0f / 5.0f, 3.0f / 5.0f, 2.0f / 5.0f, 1.0f / 5.0f, 0.0f / 5.0f }; static const float pD6[] = { 0.0f / 5.0f, 1.0f / 5.0f, 2.0f / 5.0f, 3.0f / 5.0f, 4.0f / 5.0f, 5.0f / 5.0f }; - static const float pC8[] = { 7.0f / 7.0f, 6.0f / 7.0f, 5.0f / 7.0f, 4.0f / 7.0f, 3.0f / 7.0f, 2.0f / 7.0f, 1.0f / 7.0f, 0.0f / 7.0f }; - static const float pD8[] = { 0.0f / 7.0f, 1.0f / 7.0f, 2.0f / 7.0f, 3.0f / 7.0f, 4.0f / 7.0f, 5.0f / 7.0f, 6.0f / 7.0f, 7.0f / 7.0f }; + static const float pC8[] + = { 7.0f / 7.0f, 6.0f / 7.0f, 5.0f / 7.0f, 4.0f / 7.0f, 3.0f / 7.0f, 2.0f / 7.0f, 1.0f / 7.0f, 0.0f / 7.0f }; + static const float pD8[] + = { 0.0f / 7.0f, 1.0f / 7.0f, 2.0f / 7.0f, 3.0f / 7.0f, 4.0f / 7.0f, 5.0f / 7.0f, 6.0f / 7.0f, 7.0f / 7.0f }; - const float *pC = (6 == cSteps) ? pC6 : pC8; - const float *pD = (6 == cSteps) ? pD6 : pD8; + const float* pC = (6 == cSteps) ? pC6 : pC8; + const float* pD = (6 == cSteps) ? pD6 : pD8; constexpr float MAX_VALUE = 1.0f; constexpr float MIN_VALUE = (bRange) ? -1.0f : 0.0f; @@ -252,8 +248,8 @@ namespace DirectX } // Evaluate function, and derivatives - float dX = 0.0f; - float dY = 0.0f; + float dX = 0.0f; + float dY = 0.0f; float d2X = 0.0f; float d2Y = 0.0f; @@ -299,7 +295,9 @@ namespace DirectX if (fX > fY) { - const float f = fX; fX = fY; fY = f; + const float f = fX; + fX = fY; + fY = f; } if ((dX * dX < (1.0f / 64.0f)) && (dY * dY < (1.0f / 64.0f))) @@ -311,35 +309,47 @@ namespace DirectX } #pragma warning(pop) -//------------------------------------------------------------------------------------- -// Functions -//------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------- + // Functions + //------------------------------------------------------------------------------------- - typedef void (*BC_DECODE)(XMVECTOR *pColor, const uint8_t *pBC); - typedef void (*BC_ENCODE)(uint8_t *pDXT, const XMVECTOR *pColor, uint32_t flags); - - void D3DXDecodeBC1(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(8) const uint8_t *pBC) noexcept; - void D3DXDecodeBC2(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(16) const uint8_t *pBC) noexcept; - void D3DXDecodeBC3(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(16) const uint8_t *pBC) noexcept; - void D3DXDecodeBC4U(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(8) const uint8_t *pBC) noexcept; - void D3DXDecodeBC4S(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(8) const uint8_t *pBC) noexcept; - void D3DXDecodeBC5U(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(16) const uint8_t *pBC) noexcept; - void D3DXDecodeBC5S(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(16) const uint8_t *pBC) noexcept; - void D3DXDecodeBC6HU(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(16) const uint8_t *pBC) noexcept; - void D3DXDecodeBC6HS(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(16) const uint8_t *pBC) noexcept; - void D3DXDecodeBC7(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR *pColor, _In_reads_(16) const uint8_t *pBC) noexcept; - - void D3DXEncodeBC1(_Out_writes_(8) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ float threshold, _In_ uint32_t flags) noexcept; - // BC1 requires one additional parameter, so it doesn't match signature of BC_ENCODE above - - void D3DXEncodeBC2(_Out_writes_(16) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ uint32_t flags) noexcept; - void D3DXEncodeBC3(_Out_writes_(16) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ uint32_t flags) noexcept; - void D3DXEncodeBC4U(_Out_writes_(8) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ uint32_t flags) noexcept; - void D3DXEncodeBC4S(_Out_writes_(8) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ uint32_t flags) noexcept; - void D3DXEncodeBC5U(_Out_writes_(16) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ uint32_t flags) noexcept; - void D3DXEncodeBC5S(_Out_writes_(16) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ uint32_t flags) noexcept; - void D3DXEncodeBC6HU(_Out_writes_(16) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ uint32_t flags) noexcept; - void D3DXEncodeBC6HS(_Out_writes_(16) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ uint32_t flags) noexcept; - void D3DXEncodeBC7(_Out_writes_(16) uint8_t *pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR *pColor, _In_ uint32_t flags) noexcept; - -} // namespace + typedef void (*BC_DECODE)(XMVECTOR* pColor, const uint8_t* pBC); + typedef void (*BC_ENCODE)(uint8_t* pDXT, const XMVECTOR* pColor, uint32_t flags); + + void D3DXDecodeBC1(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(8) const uint8_t* pBC) noexcept; + void D3DXDecodeBC2(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(16) const uint8_t* pBC) noexcept; + void D3DXDecodeBC3(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(16) const uint8_t* pBC) noexcept; + void D3DXDecodeBC4U(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(8) const uint8_t* pBC) noexcept; + void D3DXDecodeBC4S(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(8) const uint8_t* pBC) noexcept; + void D3DXDecodeBC5U(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(16) const uint8_t* pBC) noexcept; + void D3DXDecodeBC5S(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(16) const uint8_t* pBC) noexcept; + void D3DXDecodeBC6HU(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(16) const uint8_t* pBC) noexcept; + void D3DXDecodeBC6HS(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(16) const uint8_t* pBC) noexcept; + void D3DXDecodeBC7(_Out_writes_(NUM_PIXELS_PER_BLOCK) XMVECTOR* pColor, _In_reads_(16) const uint8_t* pBC) noexcept; + + void D3DXEncodeBC1(_Out_writes_(8) uint8_t* pBC, + _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, + _In_ float threshold, + _In_ uint32_t flags) noexcept; + // BC1 requires one additional parameter, so it doesn't match signature of BC_ENCODE above + + void + D3DXEncodeBC2(_Out_writes_(16) uint8_t* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, _In_ uint32_t flags) noexcept; + void + D3DXEncodeBC3(_Out_writes_(16) uint8_t* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, _In_ uint32_t flags) noexcept; + void + D3DXEncodeBC4U(_Out_writes_(8) uint8_t* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, _In_ uint32_t flags) noexcept; + void + D3DXEncodeBC4S(_Out_writes_(8) uint8_t* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, _In_ uint32_t flags) noexcept; + void + D3DXEncodeBC5U(_Out_writes_(16) uint8_t* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, _In_ uint32_t flags) noexcept; + void + D3DXEncodeBC5S(_Out_writes_(16) uint8_t* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, _In_ uint32_t flags) noexcept; + void + D3DXEncodeBC6HU(_Out_writes_(16) uint8_t* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, _In_ uint32_t flags) noexcept; + void + D3DXEncodeBC6HS(_Out_writes_(16) uint8_t* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, _In_ uint32_t flags) noexcept; + void + D3DXEncodeBC7(_Out_writes_(16) uint8_t* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const XMVECTOR* pColor, _In_ uint32_t flags) noexcept; + +} // namespace DirectX diff --git a/DirectXTex/BC4BC5.cpp b/DirectXTex/BC4BC5.cpp index d8cf8f23..3c4e0572 100644 --- a/DirectXTex/BC4BC5.cpp +++ b/DirectXTex/BC4BC5.cpp @@ -68,10 +68,7 @@ namespace } } - size_t GetIndex(size_t uOffset) const noexcept - { - return static_cast((data >> (3 * uOffset + 16)) & 0x07); - } + size_t GetIndex(size_t uOffset) const noexcept { return static_cast((data >> (3 * uOffset + 16)) & 0x07); } void SetIndex(size_t uOffset, size_t uIndex) noexcept { @@ -127,10 +124,7 @@ namespace } } - size_t GetIndex(size_t uOffset) const noexcept - { - return static_cast((data >> (3 * uOffset + 16)) & 0x07); - } + size_t GetIndex(size_t uOffset) const noexcept { return static_cast((data >> (3 * uOffset + 16)) & 0x07); } void SetIndex(size_t uOffset, size_t uIndex) noexcept { @@ -142,8 +136,8 @@ namespace { struct { - int8_t red_0; - int8_t red_1; + int8_t red_0; + int8_t red_1; uint8_t indices[6]; }; uint64_t data; @@ -155,18 +149,16 @@ namespace //------------------------------------------------------------------------------------- // Convert a floating point value to an 8-bit SNORM //------------------------------------------------------------------------------------- - void inline FloatToSNorm(_In_ float fVal, _Out_ int8_t *piSNorm) noexcept + void inline FloatToSNorm(_In_ float fVal, _Out_ int8_t* piSNorm) noexcept { constexpr uint32_t dwMostNeg = (1 << (8 * sizeof(int8_t) - 1)); if (isnan(fVal)) fVal = 0; - else - if (fVal > 1) - fVal = 1; // Clamp to 1 - else - if (fVal < -1) - fVal = -1; // Clamp to -1 + else if (fVal > 1) + fVal = 1; // Clamp to 1 + else if (fVal < -1) + fVal = -1; // Clamp to -1 fVal = fVal * static_cast(dwMostNeg - 1); @@ -178,12 +170,8 @@ namespace *piSNorm = static_cast(fVal); } - //------------------------------------------------------------------------------ - void FindEndPointsBC4U( - _In_reads_(BLOCK_SIZE) const float theTexelsU[], - _Out_ uint8_t &endpointU_0, - _Out_ uint8_t &endpointU_1) noexcept + void FindEndPointsBC4U(_In_reads_(BLOCK_SIZE) const float theTexelsU[], _Out_ uint8_t& endpointU_0, _Out_ uint8_t& endpointU_1) noexcept { // The boundary of codec for signed/unsigned format constexpr float MIN_NORM = 0.f; @@ -217,7 +205,7 @@ namespace OptimizeAlpha(&fStart, &fEnd, theTexelsU, 8); auto iStart = static_cast(fStart * 255.0f); - auto iEnd = static_cast(fEnd * 255.0f); + auto iEnd = static_cast(fEnd * 255.0f); endpointU_0 = iEnd; endpointU_1 = iStart; @@ -228,17 +216,14 @@ namespace OptimizeAlpha(&fStart, &fEnd, theTexelsU, 6); auto iStart = static_cast(fStart * 255.0f); - auto iEnd = static_cast(fEnd * 255.0f); + auto iEnd = static_cast(fEnd * 255.0f); endpointU_1 = iEnd; endpointU_0 = iStart; } } - void FindEndPointsBC4S( - _In_reads_(BLOCK_SIZE) const float theTexelsU[], - _Out_ int8_t &endpointU_0, - _Out_ int8_t &endpointU_1) noexcept + void FindEndPointsBC4S(_In_reads_(BLOCK_SIZE) const float theTexelsU[], _Out_ int8_t& endpointU_0, _Out_ int8_t& endpointU_1) noexcept { // The boundary of codec for signed/unsigned format constexpr float MIN_NORM = -1.f; @@ -292,39 +277,33 @@ namespace } } - //------------------------------------------------------------------------------ - inline void FindEndPointsBC5U( - _In_reads_(BLOCK_SIZE) const float theTexelsU[], - _In_reads_(BLOCK_SIZE) const float theTexelsV[], - _Out_ uint8_t &endpointU_0, - _Out_ uint8_t &endpointU_1, - _Out_ uint8_t &endpointV_0, - _Out_ uint8_t &endpointV_1) noexcept + inline void FindEndPointsBC5U(_In_reads_(BLOCK_SIZE) const float theTexelsU[], + _In_reads_(BLOCK_SIZE) const float theTexelsV[], + _Out_ uint8_t& endpointU_0, + _Out_ uint8_t& endpointU_1, + _Out_ uint8_t& endpointV_0, + _Out_ uint8_t& endpointV_1) noexcept { - //Encoding the U and V channel by BC4 codec separately. + // Encoding the U and V channel by BC4 codec separately. FindEndPointsBC4U(theTexelsU, endpointU_0, endpointU_1); FindEndPointsBC4U(theTexelsV, endpointV_0, endpointV_1); } - inline void FindEndPointsBC5S( - _In_reads_(BLOCK_SIZE) const float theTexelsU[], - _In_reads_(BLOCK_SIZE) const float theTexelsV[], - _Out_ int8_t &endpointU_0, - _Out_ int8_t &endpointU_1, - _Out_ int8_t &endpointV_0, - _Out_ int8_t &endpointV_1) noexcept + inline void FindEndPointsBC5S(_In_reads_(BLOCK_SIZE) const float theTexelsU[], + _In_reads_(BLOCK_SIZE) const float theTexelsV[], + _Out_ int8_t& endpointU_0, + _Out_ int8_t& endpointU_1, + _Out_ int8_t& endpointV_0, + _Out_ int8_t& endpointV_1) noexcept { - //Encoding the U and V channel by BC4 codec separately. + // Encoding the U and V channel by BC4 codec separately. FindEndPointsBC4S(theTexelsU, endpointU_0, endpointU_1); FindEndPointsBC4S(theTexelsV, endpointV_0, endpointV_1); } - //------------------------------------------------------------------------------ - void FindClosestUNORM( - _Inout_ BC4_UNORM* pBC, - _In_reads_(NUM_PIXELS_PER_BLOCK) const float theTexelsU[]) noexcept + void FindClosestUNORM(_Inout_ BC4_UNORM* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const float theTexelsU[]) noexcept { float rGradient[8]; for (size_t i = 0; i < 8; ++i) @@ -335,7 +314,7 @@ namespace for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { size_t uBestIndex = 0; - float fBestDelta = 100000; + float fBestDelta = 100000; for (size_t uIndex = 0; uIndex < 8; uIndex++) { const float fCurrentDelta = fabsf(rGradient[uIndex] - theTexelsU[i]); @@ -349,9 +328,7 @@ namespace } } - void FindClosestSNORM( - _Inout_ BC4_SNORM* pBC, - _In_reads_(NUM_PIXELS_PER_BLOCK) const float theTexelsU[]) noexcept + void FindClosestSNORM(_Inout_ BC4_SNORM* pBC, _In_reads_(NUM_PIXELS_PER_BLOCK) const float theTexelsU[]) noexcept { float rGradient[8]; for (size_t i = 0; i < 8; ++i) @@ -362,7 +339,7 @@ namespace for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { size_t uBestIndex = 0; - float fBestDelta = 100000; + float fBestDelta = 100000; for (size_t uIndex = 0; uIndex < 8; uIndex++) { const float fCurrentDelta = fabsf(rGradient[uIndex] - theTexelsU[i]); @@ -375,8 +352,7 @@ namespace pBC->SetIndex(i, uBestIndex); } } -} - +} // namespace //===================================================================================== // Entry points @@ -385,8 +361,7 @@ namespace //------------------------------------------------------------------------------------- // BC4 Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC4U(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC4U(XMVECTOR* pColor, const uint8_t* pBC) noexcept { assert(pColor && pBC); static_assert(sizeof(BC4_UNORM) == 8, "BC4_UNORM should be 8 bytes"); @@ -395,13 +370,12 @@ void DirectX::D3DXDecodeBC4U(XMVECTOR *pColor, const uint8_t *pBC) noexcept for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { - #pragma prefast(suppress:22103, "writing blocks in two halves confuses tool") +#pragma prefast(suppress : 22103, "writing blocks in two halves confuses tool") pColor[i] = XMVectorSet(pBC4->R(i), 0, 0, 1.0f); } } -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC4S(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC4S(XMVECTOR* pColor, const uint8_t* pBC) noexcept { assert(pColor && pBC); static_assert(sizeof(BC4_SNORM) == 8, "BC4_SNORM should be 8 bytes"); @@ -410,13 +384,12 @@ void DirectX::D3DXDecodeBC4S(XMVECTOR *pColor, const uint8_t *pBC) noexcept for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { - #pragma prefast(suppress:22103, "writing blocks in two halves confuses tool") +#pragma prefast(suppress : 22103, "writing blocks in two halves confuses tool") pColor[i] = XMVectorSet(pBC4->R(i), 0, 0, 1.0f); } } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC4U(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC4U(uint8_t* pBC, const XMVECTOR* pColor, uint32_t flags) noexcept { UNREFERENCED_PARAMETER(flags); @@ -424,7 +397,7 @@ void DirectX::D3DXEncodeBC4U(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flag static_assert(sizeof(BC4_UNORM) == 8, "BC4_UNORM should be 8 bytes"); memset(pBC, 0, sizeof(BC4_UNORM)); - auto pBC4 = reinterpret_cast(pBC); + auto pBC4 = reinterpret_cast(pBC); float theTexelsU[NUM_PIXELS_PER_BLOCK]; for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) @@ -436,8 +409,7 @@ void DirectX::D3DXEncodeBC4U(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flag FindClosestUNORM(pBC4, theTexelsU); } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC4S(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC4S(uint8_t* pBC, const XMVECTOR* pColor, uint32_t flags) noexcept { UNREFERENCED_PARAMETER(flags); @@ -445,7 +417,7 @@ void DirectX::D3DXEncodeBC4S(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flag static_assert(sizeof(BC4_SNORM) == 8, "BC4_SNORM should be 8 bytes"); memset(pBC, 0, sizeof(BC4_UNORM)); - auto pBC4 = reinterpret_cast(pBC); + auto pBC4 = reinterpret_cast(pBC); float theTexelsU[NUM_PIXELS_PER_BLOCK]; for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) @@ -457,12 +429,10 @@ void DirectX::D3DXEncodeBC4S(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flag FindClosestSNORM(pBC4, theTexelsU); } - //------------------------------------------------------------------------------------- // BC5 Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC5U(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC5U(XMVECTOR* pColor, const uint8_t* pBC) noexcept { assert(pColor && pBC); static_assert(sizeof(BC4_UNORM) == 8, "BC4_UNORM should be 8 bytes"); @@ -472,13 +442,12 @@ void DirectX::D3DXDecodeBC5U(XMVECTOR *pColor, const uint8_t *pBC) noexcept for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { - #pragma prefast(suppress:22103, "writing blocks in two halves confuses tool") +#pragma prefast(suppress : 22103, "writing blocks in two halves confuses tool") pColor[i] = XMVectorSet(pBCR->R(i), pBCG->R(i), 0, 1.0f); } } -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC5S(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC5S(XMVECTOR* pColor, const uint8_t* pBC) noexcept { assert(pColor && pBC); static_assert(sizeof(BC4_SNORM) == 8, "BC4_SNORM should be 8 bytes"); @@ -488,13 +457,12 @@ void DirectX::D3DXDecodeBC5S(XMVECTOR *pColor, const uint8_t *pBC) noexcept for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { - #pragma prefast(suppress:22103, "writing blocks in two halves confuses tool") +#pragma prefast(suppress : 22103, "writing blocks in two halves confuses tool") pColor[i] = XMVectorSet(pBCR->R(i), pBCG->R(i), 0, 1.0f); } } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC5U(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC5U(uint8_t* pBC, const XMVECTOR* pColor, uint32_t flags) noexcept { UNREFERENCED_PARAMETER(flags); @@ -502,8 +470,8 @@ void DirectX::D3DXEncodeBC5U(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flag static_assert(sizeof(BC4_UNORM) == 8, "BC4_UNORM should be 8 bytes"); memset(pBC, 0, sizeof(BC4_UNORM) * 2); - auto pBCR = reinterpret_cast(pBC); - auto pBCG = reinterpret_cast(pBC + sizeof(BC4_UNORM)); + auto pBCR = reinterpret_cast(pBC); + auto pBCG = reinterpret_cast(pBC + sizeof(BC4_UNORM)); float theTexelsU[NUM_PIXELS_PER_BLOCK]; float theTexelsV[NUM_PIXELS_PER_BLOCK]; @@ -515,20 +483,13 @@ void DirectX::D3DXEncodeBC5U(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flag theTexelsV[i] = clr.y; } - FindEndPointsBC5U( - theTexelsU, - theTexelsV, - pBCR->red_0, - pBCR->red_1, - pBCG->red_0, - pBCG->red_1); + FindEndPointsBC5U(theTexelsU, theTexelsV, pBCR->red_0, pBCR->red_1, pBCG->red_0, pBCG->red_1); FindClosestUNORM(pBCR, theTexelsU); FindClosestUNORM(pBCG, theTexelsV); } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC5S(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC5S(uint8_t* pBC, const XMVECTOR* pColor, uint32_t flags) noexcept { UNREFERENCED_PARAMETER(flags); @@ -536,8 +497,8 @@ void DirectX::D3DXEncodeBC5S(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flag static_assert(sizeof(BC4_SNORM) == 8, "BC4_SNORM should be 8 bytes"); memset(pBC, 0, sizeof(BC4_UNORM) * 2); - auto pBCR = reinterpret_cast(pBC); - auto pBCG = reinterpret_cast(pBC + sizeof(BC4_SNORM)); + auto pBCR = reinterpret_cast(pBC); + auto pBCG = reinterpret_cast(pBC + sizeof(BC4_SNORM)); float theTexelsU[NUM_PIXELS_PER_BLOCK]; float theTexelsV[NUM_PIXELS_PER_BLOCK]; @@ -549,13 +510,7 @@ void DirectX::D3DXEncodeBC5S(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flag theTexelsV[i] = clr.y; } - FindEndPointsBC5S( - theTexelsU, - theTexelsV, - pBCR->red_0, - pBCR->red_1, - pBCG->red_0, - pBCG->red_1); + FindEndPointsBC5S(theTexelsU, theTexelsV, pBCR->red_0, pBCR->red_1, pBCG->red_0, pBCG->red_1); FindClosestSNORM(pBCR, theTexelsU); FindClosestSNORM(pBCG, theTexelsV); diff --git a/DirectXTex/BC6HBC7.cpp b/DirectXTex/BC6HBC7.cpp index 1f5d0058..21fb670b 100644 --- a/DirectXTex/BC6HBC7.cpp +++ b/DirectXTex/BC6HBC7.cpp @@ -20,7 +20,7 @@ using namespace DirectX::PackedVector; // Macros //------------------------------------------------------------------------------------- -#define SIGN_EXTEND(x,nb) ((((x)&(1<<((nb)-1)))?((~0)^((1<<(nb))-1)):0)|(x)) +#define SIGN_EXTEND(x, nb) ((((x) & (1 << ((nb) - 1))) ? ((~0) ^ ((1 << (nb)) - 1)) : 0) | (x)) // Because these are used in SAL annotations, they need to remain macros rather than const values #define BC6H_MAX_REGIONS 2 @@ -34,29 +34,29 @@ namespace // Constants //------------------------------------------------------------------------------------- - constexpr uint16_t F16S_MASK = 0x8000; // f16 sign mask - constexpr uint16_t F16EM_MASK = 0x7fff; // f16 exp & mantissa mask - constexpr uint16_t F16MAX = 0x7bff; // MAXFLT bit pattern for XMHALF + constexpr uint16_t F16S_MASK = 0x8000; // f16 sign mask + constexpr uint16_t F16EM_MASK = 0x7fff; // f16 exp & mantissa mask + constexpr uint16_t F16MAX = 0x7bff; // MAXFLT bit pattern for XMHALF constexpr size_t BC6H_NUM_CHANNELS = 3; - constexpr size_t BC6H_MAX_SHAPES = 32; + constexpr size_t BC6H_MAX_SHAPES = 32; constexpr size_t BC7_NUM_CHANNELS = 4; - constexpr size_t BC7_MAX_SHAPES = 64; + constexpr size_t BC7_MAX_SHAPES = 64; - constexpr int32_t BC67_WEIGHT_MAX = 64; + constexpr int32_t BC67_WEIGHT_MAX = 64; constexpr uint32_t BC67_WEIGHT_SHIFT = 6; - constexpr int32_t BC67_WEIGHT_ROUND = 32; + constexpr int32_t BC67_WEIGHT_ROUND = 32; constexpr float fEpsilon = (0.25f / 64.0f) * (0.25f / 64.0f); - constexpr float pC3[] = { 2.0f / 2.0f, 1.0f / 2.0f, 0.0f / 2.0f }; - constexpr float pD3[] = { 0.0f / 2.0f, 1.0f / 2.0f, 2.0f / 2.0f }; - constexpr float pC4[] = { 3.0f / 3.0f, 2.0f / 3.0f, 1.0f / 3.0f, 0.0f / 3.0f }; - constexpr float pD4[] = { 0.0f / 3.0f, 1.0f / 3.0f, 2.0f / 3.0f, 3.0f / 3.0f }; + constexpr float pC3[] = { 2.0f / 2.0f, 1.0f / 2.0f, 0.0f / 2.0f }; + constexpr float pD3[] = { 0.0f / 2.0f, 1.0f / 2.0f, 2.0f / 2.0f }; + constexpr float pC4[] = { 3.0f / 3.0f, 2.0f / 3.0f, 1.0f / 3.0f, 0.0f / 3.0f }; + constexpr float pD4[] = { 0.0f / 3.0f, 1.0f / 3.0f, 2.0f / 3.0f, 3.0f / 3.0f }; // Partition, Shape, Pixel (index into 4x4 block) - const uint8_t g_aPartitionTable[3][64][16] = - { + const uint8_t g_aPartitionTable[3][64][16] = { + // clang-format off { // 1 Region case has no subsets (all 0) { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 }, @@ -259,11 +259,12 @@ namespace { 0, 1, 0, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2 }, // Shape 62 { 0, 1, 1, 1, 2, 0, 1, 1, 2, 2, 0, 1, 2, 2, 2, 0 } // Shape 63 } + // clang-format on }; // Partition, Shape, Fixup - const uint8_t g_aFixUp[3][64][3] = - { + const uint8_t g_aFixUp[3][64][3] = { + // clang-format off { // No fix-ups for 1st subset for BC6H or BC7 { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, @@ -322,12 +323,13 @@ namespace { 0, 5,15 },{ 0,10,15 },{ 0, 8,15 },{ 0,13,15 }, { 0,15, 3 },{ 0,12,15 },{ 0, 3,15 },{ 0, 3, 8 } } + // clang-format on }; const int g_aWeights2[] = { 0, 21, 43, 64 }; const int g_aWeights3[] = { 0, 9, 18, 27, 37, 46, 55, 64 }; const int g_aWeights4[] = { 0, 4, 9, 13, 17, 21, 26, 30, 34, 38, 43, 47, 51, 55, 60, 64 }; -} +} // namespace namespace DirectX { @@ -337,43 +339,48 @@ namespace DirectX uint8_t r, g, b, a; LDRColorA() = default; - LDRColorA(uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _a) noexcept : r(_r), g(_g), b(_b), a(_a) {} + LDRColorA(uint8_t _r, uint8_t _g, uint8_t _b, uint8_t _a) noexcept + : r(_r), + g(_g), + b(_b), + a(_a) + {} - LDRColorA(LDRColorA const&) = default; - LDRColorA& operator= (const LDRColorA&) = default; + LDRColorA(LDRColorA const&) = default; + LDRColorA& operator=(const LDRColorA&) = default; - LDRColorA(LDRColorA&&) = default; - LDRColorA& operator= (LDRColorA&&) = default; + LDRColorA(LDRColorA&&) = default; + LDRColorA& operator=(LDRColorA&&) = default; - const uint8_t& operator [] (_In_range_(0, 3) size_t uElement) const noexcept + const uint8_t& operator[](_In_range_(0, 3) size_t uElement) const noexcept { switch (uElement) { - case 0: return r; - case 1: return g; - case 2: return b; - case 3: return a; + case 0: return r; + case 1: return g; + case 2: return b; + case 3: return a; default: assert(false); return r; } } - uint8_t& operator [] (_In_range_(0, 3) size_t uElement) noexcept + uint8_t& operator[](_In_range_(0, 3) size_t uElement) noexcept { switch (uElement) { - case 0: return r; - case 1: return g; - case 2: return b; - case 3: return a; + case 0: return r; + case 1: return g; + case 2: return b; + case 3: return a; default: assert(false); return r; } } - LDRColorA operator = (_In_ const HDRColorA& c) noexcept + LDRColorA operator=(_In_ const HDRColorA& c) noexcept { LDRColorA ret; HDRColorA tmp(c); - tmp = tmp.Clamp(0.0f, 1.0f) * 255.0f; + tmp = tmp.Clamp(0.0f, 1.0f) * 255.0f; ret.r = uint8_t(tmp.r + 0.001f); ret.g = uint8_t(tmp.g + 0.001f); ret.b = uint8_t(tmp.b + 0.001f); @@ -381,35 +388,87 @@ namespace DirectX return ret; } - static void InterpolateRGB(_In_ const LDRColorA& c0, _In_ const LDRColorA& c1, _In_ size_t wc, _In_ _In_range_(2, 4) size_t wcprec, _Out_ LDRColorA& out) noexcept + static void InterpolateRGB(_In_ const LDRColorA& c0, + _In_ const LDRColorA& c1, + _In_ size_t wc, + _In_ _In_range_(2, 4) size_t wcprec, + _Out_ LDRColorA& out) noexcept { const int* aWeights = nullptr; switch (wcprec) { - case 2: aWeights = g_aWeights2; assert(wc < 4); _Analysis_assume_(wc < 4); break; - case 3: aWeights = g_aWeights3; assert(wc < 8); _Analysis_assume_(wc < 8); break; - case 4: aWeights = g_aWeights4; assert(wc < 16); _Analysis_assume_(wc < 16); break; - default: assert(false); out.r = out.g = out.b = 0; return; + case 2: + aWeights = g_aWeights2; + assert(wc < 4); + _Analysis_assume_(wc < 4); + break; + case 3: + aWeights = g_aWeights3; + assert(wc < 8); + _Analysis_assume_(wc < 8); + break; + case 4: + aWeights = g_aWeights4; + assert(wc < 16); + _Analysis_assume_(wc < 16); + break; + default: + assert(false); + out.r = out.g = out.b = 0; + return; } - out.r = uint8_t((uint32_t(c0.r) * uint32_t(BC67_WEIGHT_MAX - aWeights[wc]) + uint32_t(c1.r) * uint32_t(aWeights[wc]) + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT); - out.g = uint8_t((uint32_t(c0.g) * uint32_t(BC67_WEIGHT_MAX - aWeights[wc]) + uint32_t(c1.g) * uint32_t(aWeights[wc]) + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT); - out.b = uint8_t((uint32_t(c0.b) * uint32_t(BC67_WEIGHT_MAX - aWeights[wc]) + uint32_t(c1.b) * uint32_t(aWeights[wc]) + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT); + out.r = uint8_t( + (uint32_t(c0.r) * uint32_t(BC67_WEIGHT_MAX - aWeights[wc]) + uint32_t(c1.r) * uint32_t(aWeights[wc]) + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT); + out.g = uint8_t( + (uint32_t(c0.g) * uint32_t(BC67_WEIGHT_MAX - aWeights[wc]) + uint32_t(c1.g) * uint32_t(aWeights[wc]) + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT); + out.b = uint8_t( + (uint32_t(c0.b) * uint32_t(BC67_WEIGHT_MAX - aWeights[wc]) + uint32_t(c1.b) * uint32_t(aWeights[wc]) + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT); } - static void InterpolateA(_In_ const LDRColorA& c0, _In_ const LDRColorA& c1, _In_ size_t wa, _In_range_(2, 4) _In_ size_t waprec, _Out_ LDRColorA& out) noexcept + static void InterpolateA(_In_ const LDRColorA& c0, + _In_ const LDRColorA& c1, + _In_ size_t wa, + _In_range_(2, 4) _In_ size_t waprec, + _Out_ LDRColorA& out) noexcept { const int* aWeights = nullptr; switch (waprec) { - case 2: aWeights = g_aWeights2; assert(wa < 4); _Analysis_assume_(wa < 4); break; - case 3: aWeights = g_aWeights3; assert(wa < 8); _Analysis_assume_(wa < 8); break; - case 4: aWeights = g_aWeights4; assert(wa < 16); _Analysis_assume_(wa < 16); break; - default: assert(false); out.a = 0; return; + case 2: + aWeights = g_aWeights2; + assert(wa < 4); + _Analysis_assume_(wa < 4); + break; + case 3: + aWeights = g_aWeights3; + assert(wa < 8); + _Analysis_assume_(wa < 8); + break; + case 4: + aWeights = g_aWeights4; + assert(wa < 16); + _Analysis_assume_(wa < 16); + break; + default: + assert(false); + out.a = 0; + return; } - out.a = uint8_t((uint32_t(c0.a) * uint32_t(BC67_WEIGHT_MAX - aWeights[wa]) + uint32_t(c1.a) * uint32_t(aWeights[wa]) + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT); + out.a = uint8_t( + (uint32_t(c0.a) * uint32_t(BC67_WEIGHT_MAX - aWeights[wa]) + uint32_t(c1.a) * uint32_t(aWeights[wa]) + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT); } - static void Interpolate(_In_ const LDRColorA& c0, _In_ const LDRColorA& c1, _In_ size_t wc, _In_ size_t wa, _In_ _In_range_(2, 4) size_t wcprec, _In_ _In_range_(2, 4) size_t waprec, _Out_ LDRColorA& out) noexcept + static void Interpolate(_In_ const LDRColorA& c0, + _In_ const LDRColorA& c1, + _In_ size_t wc, + _In_ size_t wa, + _In_ _In_range_(2, 4) size_t wcprec, + _In_ _In_range_(2, 4) size_t waprec, + _Out_ LDRColorA& out) noexcept { InterpolateRGB(c0, c1, wc, wcprec, out); InterpolateA(c0, c1, wa, waprec, out); @@ -432,7 +491,7 @@ namespace DirectX a = float(c.a) * (1.0f / 255.0f); } - inline HDRColorA& HDRColorA::operator = (const LDRColorA& c) noexcept + inline HDRColorA& HDRColorA::operator=(const LDRColorA& c) noexcept { r = static_cast(c.r); g = static_cast(c.g); @@ -443,9 +502,12 @@ namespace DirectX inline LDRColorA HDRColorA::ToLDRColorA() const noexcept { - return LDRColorA(static_cast(r + 0.01f), static_cast(g + 0.01f), static_cast(b + 0.01f), static_cast(a + 0.01f)); + return LDRColorA(static_cast(r + 0.01f), + static_cast(g + 0.01f), + static_cast(b + 0.01f), + static_cast(a + 0.01f)); } -} +} // namespace DirectX namespace { @@ -456,15 +518,20 @@ namespace int pad; INTColor() = default; - INTColor(int nr, int ng, int nb) noexcept : r(nr), g(ng), b(nb), pad(0) {} + INTColor(int nr, int ng, int nb) noexcept + : r(nr), + g(ng), + b(nb), + pad(0) + {} - INTColor(INTColor const&) = default; - INTColor& operator= (const INTColor&) = default; + INTColor(INTColor const&) = default; + INTColor& operator=(const INTColor&) = default; - INTColor(INTColor&&) = default; - INTColor& operator= (INTColor&&) = default; + INTColor(INTColor&&) = default; + INTColor& operator=(INTColor&&) = default; - INTColor& operator += (_In_ const INTColor& c) noexcept + INTColor& operator+=(_In_ const INTColor& c) noexcept { r += c.r; g += c.g; @@ -472,7 +539,7 @@ namespace return *this; } - INTColor& operator -= (_In_ const INTColor& c) noexcept + INTColor& operator-=(_In_ const INTColor& c) noexcept { r -= c.r; g -= c.g; @@ -480,7 +547,7 @@ namespace return *this; } - INTColor& operator &= (_In_ const INTColor& c) noexcept + INTColor& operator&=(_In_ const INTColor& c) noexcept { r &= c.r; g &= c.g; @@ -488,7 +555,7 @@ namespace return *this; } - int& operator [] (_In_ uint8_t i) noexcept + int& operator[](_In_ uint8_t i) noexcept { assert(i < sizeof(INTColor) / sizeof(int)); _Analysis_assume_(i < sizeof(INTColor) / sizeof(int)); @@ -534,19 +601,23 @@ namespace static int F16ToINT(_In_ const PackedVector::HALF& f, _In_ bool bSigned) noexcept { uint16_t input = *reinterpret_cast(&f); - int out, s; + int out, s; if (bSigned) { s = input & F16S_MASK; input &= F16EM_MASK; - if (input > F16MAX) out = F16MAX; - else out = input; + if (input > F16MAX) + out = F16MAX; + else + out = input; out = s ? -out : out; } else { - if (input & F16S_MASK) out = 0; - else out = input; + if (input & F16S_MASK) + out = 0; + else + out = input; } return out; } @@ -554,13 +625,13 @@ namespace static PackedVector::HALF INT2F16(_In_ int input, _In_ bool bSigned) noexcept { PackedVector::HALF h; - uint16_t out; + uint16_t out; if (bSigned) { int s = 0; if (input < 0) { - s = F16S_MASK; + s = F16S_MASK; input = -input; } out = uint16_t(s | input); @@ -584,7 +655,7 @@ namespace INTColor B; }; - template< size_t SizeInBytes > + template class CBits { public: @@ -593,24 +664,26 @@ namespace assert(uStartBit < 128); _Analysis_assume_(uStartBit < 128); const size_t uIndex = uStartBit >> 3; - const auto ret = static_cast((m_uBits[uIndex] >> (uStartBit - (uIndex << 3))) & 0x01); + const auto ret = static_cast((m_uBits[uIndex] >> (uStartBit - (uIndex << 3))) & 0x01); uStartBit++; return ret; } uint8_t GetBits(_Inout_ size_t& uStartBit, _In_ size_t uNumBits) const noexcept { - if (uNumBits == 0) return 0; + if (uNumBits == 0) + return 0; assert(uStartBit + uNumBits <= 128 && uNumBits <= 8); _Analysis_assume_(uStartBit + uNumBits <= 128 && uNumBits <= 8); - uint8_t ret; + uint8_t ret; const size_t uIndex = uStartBit >> 3; - const size_t uBase = uStartBit - (uIndex << 3); + const size_t uBase = uStartBit - (uIndex << 3); if (uBase + uNumBits > 8) { const size_t uFirstIndexBits = 8 - uBase; - const size_t uNextIndexBits = uNumBits - uFirstIndexBits; - ret = static_cast((unsigned(m_uBits[uIndex]) >> uBase) | ((unsigned(m_uBits[uIndex + 1]) & ((1u << uNextIndexBits) - 1)) << uFirstIndexBits)); + const size_t uNextIndexBits = uNumBits - uFirstIndexBits; + ret = static_cast((unsigned(m_uBits[uIndex]) >> uBase) + | ((unsigned(m_uBits[uIndex + 1]) & ((1u << uNextIndexBits) - 1)) << uFirstIndexBits)); } else { @@ -625,8 +698,8 @@ namespace { assert(uStartBit < 128 && uValue < 2); _Analysis_assume_(uStartBit < 128 && uValue < 2); - size_t uIndex = uStartBit >> 3; - const size_t uBase = uStartBit - (uIndex << 3); + size_t uIndex = uStartBit >> 3; + const size_t uBase = uStartBit - (uIndex << 3); m_uBits[uIndex] &= ~(1 << uBase); m_uBits[uIndex] |= uValue << uBase; uStartBit++; @@ -639,12 +712,12 @@ namespace assert(uStartBit + uNumBits <= 128 && uNumBits <= 8); _Analysis_assume_(uStartBit + uNumBits <= 128 && uNumBits <= 8); assert(uValue < (1 << uNumBits)); - size_t uIndex = uStartBit >> 3; - const size_t uBase = uStartBit - (uIndex << 3); + size_t uIndex = uStartBit >> 3; + const size_t uBase = uStartBit - (uIndex << 3); if (uBase + uNumBits > 8) { const size_t uFirstIndexBits = 8 - uBase; - const size_t uNextIndexBits = uNumBits - uFirstIndexBits; + const size_t uNextIndexBits = uNumBits - uFirstIndexBits; m_uBits[uIndex] &= ~(((1 << uFirstIndexBits) - 1) << uBase); m_uBits[uIndex] |= uValue << uBase; m_uBits[uIndex + 1] &= ~((1 << uNextIndexBits) - 1); @@ -663,15 +736,15 @@ namespace }; // BC6H compression (16 bits per texel) - class D3DX_BC6H : private CBits< 16 > + class D3DX_BC6H : private CBits<16> { public: void Decode(_In_ bool bSigned, _Out_writes_(NUM_PIXELS_PER_BLOCK) HDRColorA* pOut) const noexcept; void Encode(_In_ bool bSigned, _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA* const pIn) noexcept; private: - #pragma warning(push) - #pragma warning(disable : 4480) +#pragma warning(push) +#pragma warning(disable : 4480) enum EField : uint8_t { NA, // N/A @@ -690,37 +763,43 @@ namespace BY, BZ, }; - #pragma warning(pop) +#pragma warning(pop) struct ModeDescriptor { - EField m_eField; - uint8_t m_uBit; + EField m_eField; + uint8_t m_uBit; }; struct ModeInfo { - uint8_t uMode; - uint8_t uPartitions; - bool bTransformed; - uint8_t uIndexPrec; + uint8_t uMode; + uint8_t uPartitions; + bool bTransformed; + uint8_t uIndexPrec; LDRColorA RGBAPrec[BC6H_MAX_REGIONS][2]; }; - #pragma warning(push) - #pragma warning(disable : 4512) +#pragma warning(push) +#pragma warning(disable : 4512) struct EncodeParams { - float fBestErr; - const bool bSigned; - uint8_t uMode; - uint8_t uShape; + float fBestErr; + const bool bSigned; + uint8_t uMode; + uint8_t uShape; const HDRColorA* const aHDRPixels; - INTEndPntPair aUnqEndPts[BC6H_MAX_SHAPES][BC6H_MAX_REGIONS]; - INTColor aIPixels[NUM_PIXELS_PER_BLOCK]; - - EncodeParams(const HDRColorA* const aOriginal, bool bSignedFormat) noexcept : - fBestErr(FLT_MAX), bSigned(bSignedFormat), uMode(0), uShape(0), aHDRPixels(aOriginal), aUnqEndPts{}, aIPixels{} + INTEndPntPair aUnqEndPts[BC6H_MAX_SHAPES][BC6H_MAX_REGIONS]; + INTColor aIPixels[NUM_PIXELS_PER_BLOCK]; + + EncodeParams(const HDRColorA* const aOriginal, bool bSignedFormat) noexcept + : fBestErr(FLT_MAX), + bSigned(bSignedFormat), + uMode(0), + uShape(0), + aHDRPixels(aOriginal), + aUnqEndPts{}, + aIPixels{} { for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { @@ -728,7 +807,7 @@ namespace } } }; - #pragma warning(pop) +#pragma warning(pop) static int Quantize(_In_ int iValue, _In_ int prec, _In_ bool bSigned) noexcept; static int Unquantize(_In_ int comp, _In_ uint8_t uBitsPerComp, _In_ bool bSigned) noexcept; @@ -736,41 +815,62 @@ namespace static bool EndPointsFit(_In_ const EncodeParams* pEP, _In_reads_(BC6H_MAX_REGIONS) const INTEndPntPair aEndPts[]) noexcept; - void GeneratePaletteQuantized(_In_ const EncodeParams* pEP, _In_ const INTEndPntPair& endPts, - _Out_writes_(BC6H_MAX_INDICES) INTColor aPalette[]) const noexcept; - float MapColorsQuantized(_In_ const EncodeParams* pEP, _In_reads_(np) const INTColor aColors[], _In_ size_t np, _In_ const INTEndPntPair &endPts) const noexcept; - float PerturbOne(_In_ const EncodeParams* pEP, _In_reads_(np) const INTColor aColors[], _In_ size_t np, _In_ uint8_t ch, - _In_ const INTEndPntPair& oldEndPts, _Out_ INTEndPntPair& newEndPts, _In_ float fOldErr, _In_ int do_b) const noexcept; - void OptimizeOne(_In_ const EncodeParams* pEP, _In_reads_(np) const INTColor aColors[], _In_ size_t np, _In_ float aOrgErr, - _In_ const INTEndPntPair &aOrgEndPts, _Out_ INTEndPntPair &aOptEndPts) const noexcept; - void OptimizeEndPoints(_In_ const EncodeParams* pEP, _In_reads_(BC6H_MAX_REGIONS) const float aOrgErr[], - _In_reads_(BC6H_MAX_REGIONS) const INTEndPntPair aOrgEndPts[], - _Out_writes_all_(BC6H_MAX_REGIONS) INTEndPntPair aOptEndPts[]) const noexcept; - static void SwapIndices(_In_ const EncodeParams* pEP, _Inout_updates_all_(BC6H_MAX_REGIONS) INTEndPntPair aEndPts[], - _In_reads_(NUM_PIXELS_PER_BLOCK) size_t aIndices[]) noexcept; - void AssignIndices(_In_ const EncodeParams* pEP, _In_reads_(BC6H_MAX_REGIONS) const INTEndPntPair aEndPts[], - _Out_writes_(NUM_PIXELS_PER_BLOCK) size_t aIndices[], - _Out_writes_(BC6H_MAX_REGIONS) float aTotErr[]) const noexcept; - void QuantizeEndPts(_In_ const EncodeParams* pEP, _Out_writes_(BC6H_MAX_REGIONS) INTEndPntPair* qQntEndPts) const noexcept; - void EmitBlock(_In_ const EncodeParams* pEP, _In_reads_(BC6H_MAX_REGIONS) const INTEndPntPair aEndPts[], - _In_reads_(NUM_PIXELS_PER_BLOCK) const size_t aIndices[]) noexcept; - void Refine(_Inout_ EncodeParams* pEP) noexcept; - - static void GeneratePaletteUnquantized(_In_ const EncodeParams* pEP, _In_ size_t uRegion, _Out_writes_(BC6H_MAX_INDICES) INTColor aPalette[]) noexcept; - float MapColors(_In_ const EncodeParams* pEP, _In_ size_t uRegion, _In_ size_t np, _In_reads_(np) const size_t* auIndex) const noexcept; + void GeneratePaletteQuantized(_In_ const EncodeParams* pEP, + _In_ const INTEndPntPair& endPts, + _Out_writes_(BC6H_MAX_INDICES) INTColor aPalette[]) const noexcept; + float MapColorsQuantized(_In_ const EncodeParams* pEP, + _In_reads_(np) const INTColor aColors[], + _In_ size_t np, + _In_ const INTEndPntPair& endPts) const noexcept; + float PerturbOne(_In_ const EncodeParams* pEP, + _In_reads_(np) const INTColor aColors[], + _In_ size_t np, + _In_ uint8_t ch, + _In_ const INTEndPntPair& oldEndPts, + _Out_ INTEndPntPair& newEndPts, + _In_ float fOldErr, + _In_ int do_b) const noexcept; + void OptimizeOne(_In_ const EncodeParams* pEP, + _In_reads_(np) const INTColor aColors[], + _In_ size_t np, + _In_ float aOrgErr, + _In_ const INTEndPntPair& aOrgEndPts, + _Out_ INTEndPntPair& aOptEndPts) const noexcept; + void OptimizeEndPoints(_In_ const EncodeParams* pEP, + _In_reads_(BC6H_MAX_REGIONS) const float aOrgErr[], + _In_reads_(BC6H_MAX_REGIONS) const INTEndPntPair aOrgEndPts[], + _Out_writes_all_(BC6H_MAX_REGIONS) INTEndPntPair aOptEndPts[]) const noexcept; + static void SwapIndices(_In_ const EncodeParams* pEP, + _Inout_updates_all_(BC6H_MAX_REGIONS) INTEndPntPair aEndPts[], + _In_reads_(NUM_PIXELS_PER_BLOCK) size_t aIndices[]) noexcept; + void AssignIndices(_In_ const EncodeParams* pEP, + _In_reads_(BC6H_MAX_REGIONS) const INTEndPntPair aEndPts[], + _Out_writes_(NUM_PIXELS_PER_BLOCK) size_t aIndices[], + _Out_writes_(BC6H_MAX_REGIONS) float aTotErr[]) const noexcept; + void QuantizeEndPts(_In_ const EncodeParams* pEP, _Out_writes_(BC6H_MAX_REGIONS) INTEndPntPair* qQntEndPts) const noexcept; + void EmitBlock(_In_ const EncodeParams* pEP, + _In_reads_(BC6H_MAX_REGIONS) const INTEndPntPair aEndPts[], + _In_reads_(NUM_PIXELS_PER_BLOCK) const size_t aIndices[]) noexcept; + void Refine(_Inout_ EncodeParams* pEP) noexcept; + + static void GeneratePaletteUnquantized(_In_ const EncodeParams* pEP, + _In_ size_t uRegion, + _Out_writes_(BC6H_MAX_INDICES) INTColor aPalette[]) noexcept; + float + MapColors(_In_ const EncodeParams* pEP, _In_ size_t uRegion, _In_ size_t np, _In_reads_(np) const size_t* auIndex) const noexcept; float RoughMSE(_Inout_ EncodeParams* pEP) const noexcept; private: - static constexpr uint8_t c_NumModes = 14; + static constexpr uint8_t c_NumModes = 14; static constexpr uint8_t c_NumModeInfo = 32; static const ModeDescriptor ms_aDesc[c_NumModes][82]; - static const ModeInfo ms_aInfo[c_NumModes]; - static const int ms_aModeToInfo[c_NumModeInfo]; + static const ModeInfo ms_aInfo[c_NumModes]; + static const int ms_aModeToInfo[c_NumModeInfo]; }; // BC67 compression (16b bits per texel) - class D3DX_BC7 : private CBits< 16 > + class D3DX_BC7 : private CBits<16> { public: void Decode(_Out_writes_(NUM_PIXELS_PER_BLOCK) HDRColorA* pOut) const noexcept; @@ -779,29 +879,34 @@ namespace private: struct ModeInfo { - uint8_t uPartitions; - uint8_t uPartitionBits; - uint8_t uPBits; - uint8_t uRotationBits; - uint8_t uIndexModeBits; - uint8_t uIndexPrec; - uint8_t uIndexPrec2; + uint8_t uPartitions; + uint8_t uPartitionBits; + uint8_t uPBits; + uint8_t uRotationBits; + uint8_t uIndexModeBits; + uint8_t uIndexPrec; + uint8_t uIndexPrec2; LDRColorA RGBAPrec; LDRColorA RGBAPrecWithP; }; - #pragma warning(push) - #pragma warning(disable : 4512) +#pragma warning(push) +#pragma warning(disable : 4512) struct EncodeParams { - uint8_t uMode; - LDREndPntPair aEndPts[BC7_MAX_SHAPES][BC7_MAX_REGIONS]; - LDRColorA aLDRPixels[NUM_PIXELS_PER_BLOCK]; + uint8_t uMode; + LDREndPntPair aEndPts[BC7_MAX_SHAPES][BC7_MAX_REGIONS]; + LDRColorA aLDRPixels[NUM_PIXELS_PER_BLOCK]; const HDRColorA* const aHDRPixels; - EncodeParams(const HDRColorA* const aOriginal) noexcept : uMode(0), aEndPts{}, aLDRPixels{}, aHDRPixels(aOriginal) {} + EncodeParams(const HDRColorA* const aOriginal) noexcept + : uMode(0), + aEndPts{}, + aLDRPixels{}, + aHDRPixels(aOriginal) + {} }; - #pragma warning(pop) +#pragma warning(pop) static uint8_t Quantize(_In_ uint8_t comp, _In_ uint8_t uPrec) noexcept { @@ -840,32 +945,64 @@ namespace return q; } - void GeneratePaletteQuantized(_In_ const EncodeParams* pEP, _In_ size_t uIndexMode, _In_ const LDREndPntPair& endpts, - _Out_writes_(BC7_MAX_INDICES) LDRColorA aPalette[]) const noexcept; - float PerturbOne(_In_ const EncodeParams* pEP, _In_reads_(np) const LDRColorA colors[], _In_ size_t np, _In_ size_t uIndexMode, - _In_ size_t ch, _In_ const LDREndPntPair &old_endpts, - _Out_ LDREndPntPair &new_endpts, _In_ float old_err, _In_ uint8_t do_b) const noexcept; - void Exhaustive(_In_ const EncodeParams* pEP, _In_reads_(np) const LDRColorA aColors[], _In_ size_t np, _In_ size_t uIndexMode, - _In_ size_t ch, _Inout_ float& fOrgErr, _Inout_ LDREndPntPair& optEndPt) const noexcept; - void OptimizeOne(_In_ const EncodeParams* pEP, _In_reads_(np) const LDRColorA colors[], _In_ size_t np, _In_ size_t uIndexMode, - _In_ float orig_err, _In_ const LDREndPntPair &orig_endpts, _Out_ LDREndPntPair &opt_endpts) const noexcept; - void OptimizeEndPoints(_In_ const EncodeParams* pEP, _In_ size_t uShape, _In_ size_t uIndexMode, - _In_reads_(BC7_MAX_REGIONS) const float orig_err[], - _In_reads_(BC7_MAX_REGIONS) const LDREndPntPair orig_endpts[], - _Out_writes_(BC7_MAX_REGIONS) LDREndPntPair opt_endpts[]) const noexcept; - void AssignIndices(_In_ const EncodeParams* pEP, _In_ size_t uShape, _In_ size_t uIndexMode, - _In_reads_(BC7_MAX_REGIONS) LDREndPntPair endpts[], - _Out_writes_(NUM_PIXELS_PER_BLOCK) size_t aIndices[], _Out_writes_(NUM_PIXELS_PER_BLOCK) size_t aIndices2[], - _Out_writes_(BC7_MAX_REGIONS) float afTotErr[]) const noexcept; - void EmitBlock(_In_ const EncodeParams* pEP, _In_ size_t uShape, _In_ size_t uRotation, _In_ size_t uIndexMode, - _In_reads_(BC7_MAX_REGIONS) const LDREndPntPair aEndPts[], - _In_reads_(NUM_PIXELS_PER_BLOCK) const size_t aIndex[], - _In_reads_(NUM_PIXELS_PER_BLOCK) const size_t aIndex2[]) noexcept; - void FixEndpointPBits(_In_ const EncodeParams* pEP, _In_reads_(BC7_MAX_REGIONS) const LDREndPntPair *pOrigEndpoints, _Out_writes_(BC7_MAX_REGIONS) LDREndPntPair *pFixedEndpoints) noexcept; + void GeneratePaletteQuantized(_In_ const EncodeParams* pEP, + _In_ size_t uIndexMode, + _In_ const LDREndPntPair& endpts, + _Out_writes_(BC7_MAX_INDICES) LDRColorA aPalette[]) const noexcept; + float PerturbOne(_In_ const EncodeParams* pEP, + _In_reads_(np) const LDRColorA colors[], + _In_ size_t np, + _In_ size_t uIndexMode, + _In_ size_t ch, + _In_ const LDREndPntPair& old_endpts, + _Out_ LDREndPntPair& new_endpts, + _In_ float old_err, + _In_ uint8_t do_b) const noexcept; + void Exhaustive(_In_ const EncodeParams* pEP, + _In_reads_(np) const LDRColorA aColors[], + _In_ size_t np, + _In_ size_t uIndexMode, + _In_ size_t ch, + _Inout_ float& fOrgErr, + _Inout_ LDREndPntPair& optEndPt) const noexcept; + void OptimizeOne(_In_ const EncodeParams* pEP, + _In_reads_(np) const LDRColorA colors[], + _In_ size_t np, + _In_ size_t uIndexMode, + _In_ float orig_err, + _In_ const LDREndPntPair& orig_endpts, + _Out_ LDREndPntPair& opt_endpts) const noexcept; + void OptimizeEndPoints(_In_ const EncodeParams* pEP, + _In_ size_t uShape, + _In_ size_t uIndexMode, + _In_reads_(BC7_MAX_REGIONS) const float orig_err[], + _In_reads_(BC7_MAX_REGIONS) const LDREndPntPair orig_endpts[], + _Out_writes_(BC7_MAX_REGIONS) LDREndPntPair opt_endpts[]) const noexcept; + void AssignIndices(_In_ const EncodeParams* pEP, + _In_ size_t uShape, + _In_ size_t uIndexMode, + _In_reads_(BC7_MAX_REGIONS) LDREndPntPair endpts[], + _Out_writes_(NUM_PIXELS_PER_BLOCK) size_t aIndices[], + _Out_writes_(NUM_PIXELS_PER_BLOCK) size_t aIndices2[], + _Out_writes_(BC7_MAX_REGIONS) float afTotErr[]) const noexcept; + void EmitBlock(_In_ const EncodeParams* pEP, + _In_ size_t uShape, + _In_ size_t uRotation, + _In_ size_t uIndexMode, + _In_reads_(BC7_MAX_REGIONS) const LDREndPntPair aEndPts[], + _In_reads_(NUM_PIXELS_PER_BLOCK) const size_t aIndex[], + _In_reads_(NUM_PIXELS_PER_BLOCK) const size_t aIndex2[]) noexcept; + void FixEndpointPBits(_In_ const EncodeParams* pEP, + _In_reads_(BC7_MAX_REGIONS) const LDREndPntPair* pOrigEndpoints, + _Out_writes_(BC7_MAX_REGIONS) LDREndPntPair* pFixedEndpoints) noexcept; float Refine(_In_ const EncodeParams* pEP, _In_ size_t uShape, _In_ size_t uRotation, _In_ size_t uIndexMode) noexcept; - float MapColors(_In_ const EncodeParams* pEP, _In_reads_(np) const LDRColorA aColors[], _In_ size_t np, _In_ size_t uIndexMode, - _In_ const LDREndPntPair& endPts, _In_ float fMinErr) const noexcept; + float MapColors(_In_ const EncodeParams* pEP, + _In_reads_(np) const LDRColorA aColors[], + _In_ size_t np, + _In_ size_t uIndexMode, + _In_ const LDREndPntPair& endPts, + _In_ float fMinErr) const noexcept; static float RoughMSE(_Inout_ EncodeParams* pEP, _In_ size_t uShape, _In_ size_t uIndexMode) noexcept; private: @@ -873,11 +1010,11 @@ namespace static const ModeInfo ms_aInfo[c_NumModes]; }; -} +} // namespace // BC6H Compression -const D3DX_BC6H::ModeDescriptor D3DX_BC6H::ms_aDesc[D3DX_BC6H::c_NumModes][82] = -{ +const D3DX_BC6H::ModeDescriptor D3DX_BC6H::ms_aDesc[D3DX_BC6H::c_NumModes][82] = { + // clang-format off { // Mode 1 (0x00) - 10 5 5 5 { M, 0}, { M, 1}, {GY, 4}, {BY, 4}, {BZ, 4}, {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9}, {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, @@ -1045,11 +1182,12 @@ const D3DX_BC6H::ModeDescriptor D3DX_BC6H::ms_aDesc[D3DX_BC6H::c_NumModes][82] = {NA, 0}, {NA, 0}, {NA, 0}, {NA, 0}, {NA, 0}, {NA, 0}, {NA, 0}, {NA, 0}, {NA, 0}, {NA, 0}, {NA, 0}, {NA, 0}, }, + // clang-format on }; // Mode, Partitions, Transformed, IndexPrec, RGBAPrec -const D3DX_BC6H::ModeInfo D3DX_BC6H::ms_aInfo[D3DX_BC6H::c_NumModes] = -{ +const D3DX_BC6H::ModeInfo D3DX_BC6H::ms_aInfo[D3DX_BC6H::c_NumModes] = { + // clang-format off {0x00, 1, true, 3, { { LDRColorA(10,10,10,0), LDRColorA(5, 5, 5,0) }, { LDRColorA(5,5,5,0), LDRColorA(5,5,5,0) } } }, // Mode 1 {0x01, 1, true, 3, { { LDRColorA(7, 7, 7,0), LDRColorA(6, 6, 6,0) }, { LDRColorA(6,6,6,0), LDRColorA(6,6,6,0) } } }, // Mode 2 {0x02, 1, true, 3, { { LDRColorA(11,11,11,0), LDRColorA(5, 4, 4,0) }, { LDRColorA(5,4,4,0), LDRColorA(5,4,4,0) } } }, // Mode 3 @@ -1064,10 +1202,10 @@ const D3DX_BC6H::ModeInfo D3DX_BC6H::ms_aInfo[D3DX_BC6H::c_NumModes] = {0x07, 0, true, 4, { { LDRColorA(11,11,11,0), LDRColorA(9, 9, 9,0) }, { LDRColorA(0,0,0,0), LDRColorA(0,0,0,0) } } }, // Mode 12 {0x0b, 0, true, 4, { { LDRColorA(12,12,12,0), LDRColorA(8, 8, 8,0) }, { LDRColorA(0,0,0,0), LDRColorA(0,0,0,0) } } }, // Mode 13 {0x0f, 0, true, 4, { { LDRColorA(16,16,16,0), LDRColorA(4, 4, 4,0) }, { LDRColorA(0,0,0,0), LDRColorA(0,0,0,0) } } }, // Mode 14 + // clang-format on }; -const int D3DX_BC6H::ms_aModeToInfo[D3DX_BC6H::c_NumModeInfo] = -{ +const int D3DX_BC6H::ms_aModeToInfo[D3DX_BC6H::c_NumModeInfo] = { 0, // Mode 1 - 0x00 1, // Mode 2 - 0x01 2, // Mode 3 - 0x02 @@ -1103,8 +1241,8 @@ const int D3DX_BC6H::ms_aModeToInfo[D3DX_BC6H::c_NumModeInfo] = }; // BC7 compression: uPartitions, uPartitionBits, uPBits, uRotationBits, uIndexModeBits, uIndexPrec, uIndexPrec2, RGBAPrec, RGBAPrecWithP -const D3DX_BC7::ModeInfo D3DX_BC7::ms_aInfo[D3DX_BC7::c_NumModes] = -{ +const D3DX_BC7::ModeInfo D3DX_BC7::ms_aInfo[D3DX_BC7::c_NumModes] = { + // clang-format off {2, 4, 6, 0, 0, 3, 0, LDRColorA(4,4,4,0), LDRColorA(5,5,5,0)}, // Mode 0: Color only, 3 Subsets, RGBP 4441 (unique P-bit), 3-bit indecies, 16 partitions {1, 6, 2, 0, 0, 3, 0, LDRColorA(6,6,6,0), LDRColorA(7,7,7,0)}, @@ -1121,15 +1259,16 @@ const D3DX_BC7::ModeInfo D3DX_BC7::ms_aInfo[D3DX_BC7::c_NumModes] = // Mode 6: Color+Alpha, 1 Subset, RGBAP 77771 (unique P-bit), 16x4-bit indecies {1, 6, 4, 0, 0, 2, 0, LDRColorA(5,5,5,5), LDRColorA(6,6,6,6)} // Mode 7: Color+Alpha, 2 Subsets, RGBAP 55551 (unique P-bit), 2-bit indices, 64 partitions + // clang-format on }; - namespace { //------------------------------------------------------------------------------------- // Helper functions //------------------------------------------------------------------------------------- - inline bool IsFixUpOffset(_In_range_(0, 2) size_t uPartitions, _In_range_(0, 63) size_t uShape, _In_range_(0, 15) size_t uOffset) noexcept + inline bool + IsFixUpOffset(_In_range_(0, 2) size_t uPartitions, _In_range_(0, 63) size_t uShape, _In_range_(0, 15) size_t uOffset) noexcept { assert(uPartitions < 3 && uShape < 64 && uOffset < 16); _Analysis_assume_(uPartitions < 3 && uShape < 64 && uOffset < 16); @@ -1150,12 +1289,16 @@ namespace aEndPts[1].B -= aEndPts[0].A; } - inline void TransformInverse(_Inout_updates_all_(BC6H_MAX_REGIONS) INTEndPntPair aEndPts[], _In_ const LDRColorA& Prec, _In_ bool bSigned) noexcept + inline void + TransformInverse(_Inout_updates_all_(BC6H_MAX_REGIONS) INTEndPntPair aEndPts[], _In_ const LDRColorA& Prec, _In_ bool bSigned) noexcept { const INTColor WrapMask((1 << Prec.r) - 1, (1 << Prec.g) - 1, (1 << Prec.b) - 1); - aEndPts[0].B += aEndPts[0].A; aEndPts[0].B &= WrapMask; - aEndPts[1].A += aEndPts[0].A; aEndPts[1].A &= WrapMask; - aEndPts[1].B += aEndPts[0].A; aEndPts[1].B &= WrapMask; + aEndPts[0].B += aEndPts[0].A; + aEndPts[0].B &= WrapMask; + aEndPts[1].A += aEndPts[0].A; + aEndPts[1].A &= WrapMask; + aEndPts[1].B += aEndPts[0].A; + aEndPts[1].B &= WrapMask; if (bSigned) { aEndPts[0].B.SignExtend(Prec); @@ -1178,33 +1321,33 @@ namespace int nb; if (n == 0) { - return 0; // no bits needed for 0, signed or not + return 0; // no bits needed for 0, signed or not } else if (n > 0) { - for (nb = 0; n; ++nb, n >>= 1); + for (nb = 0; n; ++nb, n >>= 1) + ; return nb + (bIsSigned ? 1 : 0); } else { assert(bIsSigned); - for (nb = 0; n < -1; ++nb, n >>= 1); + for (nb = 0; n < -1; ++nb, n >>= 1) + ; return nb + 1; } } - //------------------------------------------------------------------------------------- - void OptimizeRGB( - _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA* const pPoints, - _Out_ HDRColorA* pX, - _Out_ HDRColorA* pY, - _In_range_(3, 4) uint32_t cSteps, - size_t cPixels, - _In_reads_(cPixels) const size_t* pIndex) noexcept + void OptimizeRGB(_In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA* const pPoints, + _Out_ HDRColorA* pX, + _Out_ HDRColorA* pY, + _In_range_(3, 4) uint32_t cSteps, + size_t cPixels, + _In_reads_(cPixels) const size_t* pIndex) noexcept { - const float *pC = (3 == cSteps) ? pC3 : pC4; - const float *pD = (3 == cSteps) ? pD3 : pD4; + const float* pC = (3 == cSteps) ? pC3 : pC4; + const float* pD = (3 == cSteps) ? pD3 : pD4; // Find Min and Max points, as starting point HDRColorA X(FLT_MAX, FLT_MAX, FLT_MAX, 0.0f); @@ -1212,12 +1355,18 @@ namespace for (size_t iPoint = 0; iPoint < cPixels; iPoint++) { - if (pPoints[pIndex[iPoint]].r < X.r) X.r = pPoints[pIndex[iPoint]].r; - if (pPoints[pIndex[iPoint]].g < X.g) X.g = pPoints[pIndex[iPoint]].g; - if (pPoints[pIndex[iPoint]].b < X.b) X.b = pPoints[pIndex[iPoint]].b; - if (pPoints[pIndex[iPoint]].r > Y.r) Y.r = pPoints[pIndex[iPoint]].r; - if (pPoints[pIndex[iPoint]].g > Y.g) Y.g = pPoints[pIndex[iPoint]].g; - if (pPoints[pIndex[iPoint]].b > Y.b) Y.b = pPoints[pIndex[iPoint]].b; + if (pPoints[pIndex[iPoint]].r < X.r) + X.r = pPoints[pIndex[iPoint]].r; + if (pPoints[pIndex[iPoint]].g < X.g) + X.g = pPoints[pIndex[iPoint]].g; + if (pPoints[pIndex[iPoint]].b < X.b) + X.b = pPoints[pIndex[iPoint]].b; + if (pPoints[pIndex[iPoint]].r > Y.r) + Y.r = pPoints[pIndex[iPoint]].r; + if (pPoints[pIndex[iPoint]].g > Y.g) + Y.g = pPoints[pIndex[iPoint]].g; + if (pPoints[pIndex[iPoint]].b > Y.b) + Y.b = pPoints[pIndex[iPoint]].b; } // Diagonal axis @@ -1231,8 +1380,12 @@ namespace // Single color block.. no need to root-find if (fAB < FLT_MIN) { - pX->r = X.r; pX->g = X.g; pX->b = X.b; - pY->r = Y.r; pY->g = Y.g; pY->b = Y.b; + pX->r = X.r; + pX->g = X.g; + pX->b = X.b; + pY->r = Y.r; + pY->g = Y.g; + pY->b = Y.b; return; } @@ -1260,14 +1413,18 @@ namespace Pt.b = (pPoints[pIndex[iPoint]].b - Mid.b) * Dir.b; float f; - f = Pt.r + Pt.g + Pt.b; fDir[0] += f * f; - f = Pt.r + Pt.g - Pt.b; fDir[1] += f * f; - f = Pt.r - Pt.g + Pt.b; fDir[2] += f * f; - f = Pt.r - Pt.g - Pt.b; fDir[3] += f * f; + f = Pt.r + Pt.g + Pt.b; + fDir[0] += f * f; + f = Pt.r + Pt.g - Pt.b; + fDir[1] += f * f; + f = Pt.r - Pt.g + Pt.b; + fDir[2] += f * f; + f = Pt.r - Pt.g - Pt.b; + fDir[3] += f * f; } - float fDirMax = fDir[0]; - size_t iDirMax = 0; + float fDirMax = fDir[0]; + size_t iDirMax = 0; for (size_t iDir = 1; iDir < 4; iDir++) { @@ -1278,14 +1435,20 @@ namespace } } - if (iDirMax & 2) std::swap(X.g, Y.g); - if (iDirMax & 1) std::swap(X.b, Y.b); + if (iDirMax & 2) + std::swap(X.g, Y.g); + if (iDirMax & 1) + std::swap(X.b, Y.b); // Two color block.. no need to root-find if (fAB < 1.0f / 4096.0f) { - pX->r = X.r; pX->g = X.g; pX->b = X.b; - pY->r = Y.r; pY->g = Y.g; pY->b = Y.b; + pX->r = X.r; + pX->g = X.g; + pX->b = X.b; + pY->r = Y.r; + pY->g = Y.g; + pY->b = Y.b; return; } @@ -1321,14 +1484,13 @@ namespace Dir.b *= fScale; // Evaluate function, and derivatives - float d2X = 0.0f, d2Y = 0.0f; + float d2X = 0.0f, d2Y = 0.0f; HDRColorA dX(0.0f, 0.0f, 0.0f, 0.0f), dY(0.0f, 0.0f, 0.0f, 0.0f); for (size_t iPoint = 0; iPoint < cPixels; iPoint++) { - const float fDot = (pPoints[pIndex[iPoint]].r - X.r) * Dir.r + - (pPoints[pIndex[iPoint]].g - X.g) * Dir.g + - (pPoints[pIndex[iPoint]].b - X.b) * Dir.b; + const float fDot = (pPoints[pIndex[iPoint]].r - X.r) * Dir.r + (pPoints[pIndex[iPoint]].g - X.g) * Dir.g + + (pPoints[pIndex[iPoint]].b - X.b) * Dir.b; uint32_t iStep; if (fDot <= 0.0f) @@ -1376,29 +1538,31 @@ namespace Y.b += dY.b * f; } - if ((dX.r * dX.r < fEpsilon) && (dX.g * dX.g < fEpsilon) && (dX.b * dX.b < fEpsilon) && - (dY.r * dY.r < fEpsilon) && (dY.g * dY.g < fEpsilon) && (dY.b * dY.b < fEpsilon)) + if ((dX.r * dX.r < fEpsilon) && (dX.g * dX.g < fEpsilon) && (dX.b * dX.b < fEpsilon) && (dY.r * dY.r < fEpsilon) + && (dY.g * dY.g < fEpsilon) && (dY.b * dY.b < fEpsilon)) { break; } } - pX->r = X.r; pX->g = X.g; pX->b = X.b; - pY->r = Y.r; pY->g = Y.g; pY->b = Y.b; + pX->r = X.r; + pX->g = X.g; + pX->b = X.b; + pY->r = Y.r; + pY->g = Y.g; + pY->b = Y.b; } - //------------------------------------------------------------------------------------- - void OptimizeRGBA( - _In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA* const pPoints, - _Out_ HDRColorA* pX, - _Out_ HDRColorA* pY, - _In_range_(3, 4) uint32_t cSteps, - size_t cPixels, - _In_reads_(cPixels) const size_t* pIndex) noexcept + void OptimizeRGBA(_In_reads_(NUM_PIXELS_PER_BLOCK) const HDRColorA* const pPoints, + _Out_ HDRColorA* pX, + _Out_ HDRColorA* pY, + _In_range_(3, 4) uint32_t cSteps, + size_t cPixels, + _In_reads_(cPixels) const size_t* pIndex) noexcept { - const float *pC = (3 == cSteps) ? pC3 : pC4; - const float *pD = (3 == cSteps) ? pD3 : pD4; + const float* pC = (3 == cSteps) ? pC3 : pC4; + const float* pD = (3 == cSteps) ? pD3 : pD4; // Find Min and Max points, as starting point HDRColorA X(1.0f, 1.0f, 1.0f, 1.0f); @@ -1406,19 +1570,27 @@ namespace for (size_t iPoint = 0; iPoint < cPixels; iPoint++) { - if (pPoints[pIndex[iPoint]].r < X.r) X.r = pPoints[pIndex[iPoint]].r; - if (pPoints[pIndex[iPoint]].g < X.g) X.g = pPoints[pIndex[iPoint]].g; - if (pPoints[pIndex[iPoint]].b < X.b) X.b = pPoints[pIndex[iPoint]].b; - if (pPoints[pIndex[iPoint]].a < X.a) X.a = pPoints[pIndex[iPoint]].a; - if (pPoints[pIndex[iPoint]].r > Y.r) Y.r = pPoints[pIndex[iPoint]].r; - if (pPoints[pIndex[iPoint]].g > Y.g) Y.g = pPoints[pIndex[iPoint]].g; - if (pPoints[pIndex[iPoint]].b > Y.b) Y.b = pPoints[pIndex[iPoint]].b; - if (pPoints[pIndex[iPoint]].a > Y.a) Y.a = pPoints[pIndex[iPoint]].a; + if (pPoints[pIndex[iPoint]].r < X.r) + X.r = pPoints[pIndex[iPoint]].r; + if (pPoints[pIndex[iPoint]].g < X.g) + X.g = pPoints[pIndex[iPoint]].g; + if (pPoints[pIndex[iPoint]].b < X.b) + X.b = pPoints[pIndex[iPoint]].b; + if (pPoints[pIndex[iPoint]].a < X.a) + X.a = pPoints[pIndex[iPoint]].a; + if (pPoints[pIndex[iPoint]].r > Y.r) + Y.r = pPoints[pIndex[iPoint]].r; + if (pPoints[pIndex[iPoint]].g > Y.g) + Y.g = pPoints[pIndex[iPoint]].g; + if (pPoints[pIndex[iPoint]].b > Y.b) + Y.b = pPoints[pIndex[iPoint]].b; + if (pPoints[pIndex[iPoint]].a > Y.a) + Y.a = pPoints[pIndex[iPoint]].a; } // Diagonal axis - const HDRColorA AB = Y - X; - const float fAB = AB * AB; + const HDRColorA AB = Y - X; + const float fAB = AB * AB; // Single color block.. no need to root-find if (fAB < FLT_MIN) @@ -1429,9 +1601,9 @@ namespace } // Try all four axis directions, to determine which diagonal best fits data - const float fABInv = 1.0f / fAB; - HDRColorA Dir = AB * fABInv; - const HDRColorA Mid = (X + Y) * 0.5f; + const float fABInv = 1.0f / fAB; + HDRColorA Dir = AB * fABInv; + const HDRColorA Mid = (X + Y) * 0.5f; float fDir[8]; fDir[0] = fDir[1] = fDir[2] = fDir[3] = fDir[4] = fDir[5] = fDir[6] = fDir[7] = 0.0f; @@ -1445,18 +1617,26 @@ namespace Pt.a = (pPoints[pIndex[iPoint]].a - Mid.a) * Dir.a; float f; - f = Pt.r + Pt.g + Pt.b + Pt.a; fDir[0] += f * f; - f = Pt.r + Pt.g + Pt.b - Pt.a; fDir[1] += f * f; - f = Pt.r + Pt.g - Pt.b + Pt.a; fDir[2] += f * f; - f = Pt.r + Pt.g - Pt.b - Pt.a; fDir[3] += f * f; - f = Pt.r - Pt.g + Pt.b + Pt.a; fDir[4] += f * f; - f = Pt.r - Pt.g + Pt.b - Pt.a; fDir[5] += f * f; - f = Pt.r - Pt.g - Pt.b + Pt.a; fDir[6] += f * f; - f = Pt.r - Pt.g - Pt.b - Pt.a; fDir[7] += f * f; - } - - float fDirMax = fDir[0]; - size_t iDirMax = 0; + f = Pt.r + Pt.g + Pt.b + Pt.a; + fDir[0] += f * f; + f = Pt.r + Pt.g + Pt.b - Pt.a; + fDir[1] += f * f; + f = Pt.r + Pt.g - Pt.b + Pt.a; + fDir[2] += f * f; + f = Pt.r + Pt.g - Pt.b - Pt.a; + fDir[3] += f * f; + f = Pt.r - Pt.g + Pt.b + Pt.a; + fDir[4] += f * f; + f = Pt.r - Pt.g + Pt.b - Pt.a; + fDir[5] += f * f; + f = Pt.r - Pt.g - Pt.b + Pt.a; + fDir[6] += f * f; + f = Pt.r - Pt.g - Pt.b - Pt.a; + fDir[7] += f * f; + } + + float fDirMax = fDir[0]; + size_t iDirMax = 0; for (size_t iDir = 1; iDir < 8; iDir++) { @@ -1467,9 +1647,12 @@ namespace } } - if (iDirMax & 4) std::swap(X.g, Y.g); - if (iDirMax & 2) std::swap(X.b, Y.b); - if (iDirMax & 1) std::swap(X.a, Y.a); + if (iDirMax & 4) + std::swap(X.g, Y.g); + if (iDirMax & 2) + std::swap(X.b, Y.b); + if (iDirMax & 1) + std::swap(X.a, Y.a); // Two color block.. no need to root-find if (fAB < 1.0f / 4096.0f) @@ -1494,11 +1677,11 @@ namespace for (size_t iStep = 0; iStep < cSteps; iStep++) { pSteps[iStep] = X * pC[iStep] + Y * pD[iStep]; - //LDRColorA::Interpolate(lX, lY, i, i, wcprec, waprec, aSteps[i]); + // LDRColorA::Interpolate(lX, lY, i, i, wcprec, waprec, aSteps[i]); } // Calculate color direction - Dir = Y - X; + Dir = Y - X; const float fLen = Dir * Dir; if (fLen < (1.0f / 4096.0f)) break; @@ -1507,7 +1690,7 @@ namespace Dir *= fScale; // Evaluate function, and derivatives - float d2X = 0.0f, d2Y = 0.0f; + float d2X = 0.0f, d2Y = 0.0f; HDRColorA dX(0.0f, 0.0f, 0.0f, 0.0f), dY(0.0f, 0.0f, 0.0f, 0.0f); for (size_t iPoint = 0; iPoint < cPixels; ++iPoint) @@ -1523,8 +1706,8 @@ namespace iStep = uint32_t(fDot + 0.5f); const HDRColorA Diff = pSteps[iStep] - pPoints[pIndex[iPoint]]; - const float fC = pC[iStep] * (1.0f / 8.0f); - const float fD = pD[iStep] * (1.0f / 8.0f); + const float fC = pC[iStep] * (1.0f / 8.0f); + const float fD = pD[iStep] * (1.0f / 8.0f); d2X += fC * pC[iStep]; dX += Diff * fC; @@ -1554,20 +1737,18 @@ namespace *pY = Y; } - //------------------------------------------------------------------------------------- - float ComputeError( - _Inout_ const LDRColorA& pixel, + float ComputeError(_Inout_ const LDRColorA& pixel, _In_reads_(1 << uIndexPrec) const LDRColorA aPalette[], - uint8_t uIndexPrec, - uint8_t uIndexPrec2, - _Out_opt_ size_t* pBestIndex = nullptr, - _Out_opt_ size_t* pBestIndex2 = nullptr) noexcept + uint8_t uIndexPrec, + uint8_t uIndexPrec2, + _Out_opt_ size_t* pBestIndex = nullptr, + _Out_opt_ size_t* pBestIndex2 = nullptr) noexcept { - const size_t uNumIndices = size_t(1) << uIndexPrec; + const size_t uNumIndices = size_t(1) << uIndexPrec; const size_t uNumIndices2 = size_t(1) << uIndexPrec2; - float fTotalErr = 0; - float fBestErr = FLT_MAX; + float fTotalErr = 0; + float fBestErr = FLT_MAX; if (pBestIndex) *pBestIndex = 0; @@ -1582,9 +1763,9 @@ namespace { XMVECTOR tpixel = XMLoadUByte4(reinterpret_cast(&aPalette[i])); // Compute ErrorMetric - tpixel = XMVectorSubtract(vpixel, tpixel); + tpixel = XMVectorSubtract(vpixel, tpixel); const float fErr = XMVectorGetX(XMVector4Dot(tpixel, tpixel)); - if (fErr > fBestErr) // error increased, so we're done searching + if (fErr > fBestErr) // error increased, so we're done searching break; if (fErr < fBestErr) { @@ -1601,9 +1782,9 @@ namespace { XMVECTOR tpixel = XMLoadUByte4(reinterpret_cast(&aPalette[i])); // Compute ErrorMetricRGB - tpixel = XMVectorSubtract(vpixel, tpixel); + tpixel = XMVectorSubtract(vpixel, tpixel); const float fErr = XMVectorGetX(XMVector3Dot(tpixel, tpixel)); - if (fErr > fBestErr) // error increased, so we're done searching + if (fErr > fBestErr) // error increased, so we're done searching break; if (fErr < fBestErr) { @@ -1617,9 +1798,9 @@ namespace for (size_t i = 0; i < uNumIndices2 && fBestErr > 0; i++) { // Compute ErrorMetricAlpha - const float ea = float(pixel.a) - float(aPalette[i].a); - const float fErr = ea*ea; - if (fErr > fBestErr) // error increased, so we're done searching + const float ea = float(pixel.a) - float(aPalette[i].a); + const float fErr = ea * ea; + if (fErr > fBestErr) // error increased, so we're done searching break; if (fErr < fBestErr) { @@ -1634,33 +1815,30 @@ namespace return fTotalErr; } - void FillWithErrorColors(_Out_writes_(NUM_PIXELS_PER_BLOCK) HDRColorA* pOut) noexcept { for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { - #ifdef _DEBUG +#ifdef _DEBUG // Use Magenta in debug as a highly-visible error color pOut[i] = HDRColorA(1.0f, 0.0f, 1.0f, 1.0f); - #else +#else // In production use, default to black pOut[i] = HDRColorA(0.0f, 0.0f, 0.0f, 1.0f); - #endif +#endif } } -} - +} // namespace //------------------------------------------------------------------------------------- // BC6H Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void D3DX_BC6H::Decode(bool bSigned, HDRColorA* pOut) const noexcept +_Use_decl_annotations_ void D3DX_BC6H::Decode(bool bSigned, HDRColorA* pOut) const noexcept { assert(pOut); - size_t uStartBit = 0; - uint8_t uMode = GetBits(uStartBit, 2u); + size_t uStartBit = 0; + uint8_t uMode = GetBits(uStartBit, 2u); if (uMode != 0x00 && uMode != 0x01) { uMode = static_cast((unsigned(GetBits(uStartBit, 3)) << 2) | uMode); @@ -1674,10 +1852,10 @@ void D3DX_BC6H::Decode(bool bSigned, HDRColorA* pOut) const noexcept assert(static_cast(ms_aModeToInfo[uMode]) < c_NumModes); _Analysis_assume_(ms_aModeToInfo[uMode] < c_NumModes); const ModeDescriptor* desc = ms_aDesc[ms_aModeToInfo[uMode]]; - const ModeInfo& info = ms_aInfo[ms_aModeToInfo[uMode]]; + const ModeInfo& info = ms_aInfo[ms_aModeToInfo[uMode]]; INTEndPntPair aEndPts[BC6H_MAX_REGIONS] = {}; - uint32_t uShape = 0; + uint32_t uShape = 0; // Read header const size_t uHeaderBits = info.uPartitions > 0 ? 82u : 65u; @@ -1701,14 +1879,13 @@ void D3DX_BC6H::Decode(bool bSigned, HDRColorA* pOut) const noexcept case BX: aEndPts[0].B.b |= 1 << uint32_t(desc[uCurBit].m_uBit); break; case BY: aEndPts[1].A.b |= 1 << uint32_t(desc[uCurBit].m_uBit); break; case BZ: aEndPts[1].B.b |= 1 << uint32_t(desc[uCurBit].m_uBit); break; - default: - { - #if defined(_WIN32) && defined(_DEBUG) - OutputDebugStringA("BC6H: Invalid header bits encountered during decoding\n"); - #endif - FillWithErrorColors(pOut); - return; - } + default: { +#if defined(_WIN32) && defined(_DEBUG) + OutputDebugStringA("BC6H: Invalid header bits encountered during decoding\n"); +#endif + FillWithErrorColors(pOut); + return; + } } } } @@ -1747,9 +1924,9 @@ void D3DX_BC6H::Decode(bool bSigned, HDRColorA* pOut) const noexcept const size_t uNumBits = IsFixUpOffset(info.uPartitions, uShape, i) ? info.uIndexPrec - 1u : info.uIndexPrec; if (uStartBit + uNumBits > 128) { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC6H: Invalid block encountered during decoding\n"); - #endif +#endif FillWithErrorColors(pOut); return; } @@ -1757,9 +1934,9 @@ void D3DX_BC6H::Decode(bool bSigned, HDRColorA* pOut) const noexcept if (uIndex >= ((info.uPartitions > 0) ? 8 : 16)) { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC6H: Invalid index encountered during decoding\n"); - #endif +#endif FillWithErrorColors(pOut); return; } @@ -1769,17 +1946,23 @@ void D3DX_BC6H::Decode(bool bSigned, HDRColorA* pOut) const noexcept _Analysis_assume_(uRegion < BC6H_MAX_REGIONS); // Unquantize endpoints and interpolate - const int r1 = Unquantize(aEndPts[uRegion].A.r, info.RGBAPrec[0][0].r, bSigned); - const int g1 = Unquantize(aEndPts[uRegion].A.g, info.RGBAPrec[0][0].g, bSigned); - const int b1 = Unquantize(aEndPts[uRegion].A.b, info.RGBAPrec[0][0].b, bSigned); - const int r2 = Unquantize(aEndPts[uRegion].B.r, info.RGBAPrec[0][0].r, bSigned); - const int g2 = Unquantize(aEndPts[uRegion].B.g, info.RGBAPrec[0][0].g, bSigned); - const int b2 = Unquantize(aEndPts[uRegion].B.b, info.RGBAPrec[0][0].b, bSigned); + const int r1 = Unquantize(aEndPts[uRegion].A.r, info.RGBAPrec[0][0].r, bSigned); + const int g1 = Unquantize(aEndPts[uRegion].A.g, info.RGBAPrec[0][0].g, bSigned); + const int b1 = Unquantize(aEndPts[uRegion].A.b, info.RGBAPrec[0][0].b, bSigned); + const int r2 = Unquantize(aEndPts[uRegion].B.r, info.RGBAPrec[0][0].r, bSigned); + const int g2 = Unquantize(aEndPts[uRegion].B.g, info.RGBAPrec[0][0].g, bSigned); + const int b2 = Unquantize(aEndPts[uRegion].B.b, info.RGBAPrec[0][0].b, bSigned); const int* aWeights = info.uPartitions > 0 ? g_aWeights3 : g_aWeights4; - INTColor fc; - fc.r = FinishUnquantize((r1 * (BC67_WEIGHT_MAX - aWeights[uIndex]) + r2 * aWeights[uIndex] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT, bSigned); - fc.g = FinishUnquantize((g1 * (BC67_WEIGHT_MAX - aWeights[uIndex]) + g2 * aWeights[uIndex] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT, bSigned); - fc.b = FinishUnquantize((b1 * (BC67_WEIGHT_MAX - aWeights[uIndex]) + b2 * aWeights[uIndex] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT, bSigned); + INTColor fc; + fc.r = FinishUnquantize((r1 * (BC67_WEIGHT_MAX - aWeights[uIndex]) + r2 * aWeights[uIndex] + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT, + bSigned); + fc.g = FinishUnquantize((g1 * (BC67_WEIGHT_MAX - aWeights[uIndex]) + g2 * aWeights[uIndex] + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT, + bSigned); + fc.b = FinishUnquantize((b1 * (BC67_WEIGHT_MAX - aWeights[uIndex]) + b2 * aWeights[uIndex] + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT, + bSigned); HALF rgb[3]; fc.ToF16(rgb, bSigned); @@ -1792,18 +1975,18 @@ void D3DX_BC6H::Decode(bool bSigned, HDRColorA* pOut) const noexcept } else { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) const char* warnstr = "BC6H: Invalid mode encountered during decoding\n"; switch (uMode) { - case 0x13: warnstr = "BC6H: Reserved mode 10011 encountered during decoding\n"; break; - case 0x17: warnstr = "BC6H: Reserved mode 10111 encountered during decoding\n"; break; - case 0x1B: warnstr = "BC6H: Reserved mode 11011 encountered during decoding\n"; break; - case 0x1F: warnstr = "BC6H: Reserved mode 11111 encountered during decoding\n"; break; - default: break; + case 0x13: warnstr = "BC6H: Reserved mode 10011 encountered during decoding\n"; break; + case 0x17: warnstr = "BC6H: Reserved mode 10111 encountered during decoding\n"; break; + case 0x1B: warnstr = "BC6H: Reserved mode 11011 encountered during decoding\n"; break; + case 0x1F: warnstr = "BC6H: Reserved mode 11111 encountered during decoding\n"; break; + default: break; } OutputDebugStringA(warnstr); - #endif +#endif // Per the BC6H format spec, we must return opaque black for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { @@ -1812,9 +1995,7 @@ void D3DX_BC6H::Decode(bool bSigned, HDRColorA* pOut) const noexcept } } - -_Use_decl_annotations_ -void D3DX_BC6H::Encode(bool bSigned, const HDRColorA* const pIn) noexcept +_Use_decl_annotations_ void D3DX_BC6H::Encode(bool bSigned, const HDRColorA* const pIn) noexcept { assert(pIn); @@ -1826,15 +2007,15 @@ void D3DX_BC6H::Encode(bool bSigned, const HDRColorA* const pIn) noexcept // Number of rough cases to look at. reasonable values of this are 1, uShapes/4, and uShapes // uShapes/4 gets nearly all the cases; you can increase that a bit (say by 3 or 4) if you really want to squeeze the last bit out const size_t uItems = std::max(1u, size_t(uShapes >> 2)); - float afRoughMSE[BC6H_MAX_SHAPES]; - uint8_t auShape[BC6H_MAX_SHAPES]; + float afRoughMSE[BC6H_MAX_SHAPES]; + uint8_t auShape[BC6H_MAX_SHAPES]; // pick the best uItems shapes and refine these. for (EP.uShape = 0; EP.uShape < uShapes; ++EP.uShape) { - size_t uShape = EP.uShape; + size_t uShape = EP.uShape; afRoughMSE[uShape] = RoughMSE(&EP); - auShape[uShape] = static_cast(uShape); + auShape[uShape] = static_cast(uShape); } // Bubble up the first uItems items @@ -1858,19 +2039,17 @@ void D3DX_BC6H::Encode(bool bSigned, const HDRColorA* const pIn) noexcept } } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -int D3DX_BC6H::Quantize(int iValue, int prec, bool bSigned) noexcept +_Use_decl_annotations_ int D3DX_BC6H::Quantize(int iValue, int prec, bool bSigned) noexcept { - assert(prec > 1); // didn't bother to make it work for 1 + assert(prec > 1); // didn't bother to make it work for 1 int q, s = 0; if (bSigned) { assert(iValue >= -F16MAX && iValue <= F16MAX); if (iValue < 0) { - s = 1; + s = 1; iValue = -iValue; } q = (prec >= 16) ? iValue : (iValue << (prec - 1)) / (F16MAX + 1); @@ -1888,9 +2067,7 @@ int D3DX_BC6H::Quantize(int iValue, int prec, bool bSigned) noexcept return q; } - -_Use_decl_annotations_ -int D3DX_BC6H::Unquantize(int comp, uint8_t uBitsPerComp, bool bSigned) noexcept +_Use_decl_annotations_ int D3DX_BC6H::Unquantize(int comp, uint8_t uBitsPerComp, bool bSigned) noexcept { int unq = 0, s = 0; if (bSigned) @@ -1903,57 +2080,61 @@ int D3DX_BC6H::Unquantize(int comp, uint8_t uBitsPerComp, bool bSigned) noexcept { if (comp < 0) { - s = 1; + s = 1; comp = -comp; } - if (comp == 0) unq = 0; - else if (comp >= ((1 << (uBitsPerComp - 1)) - 1)) unq = 0x7FFF; - else unq = ((comp << 15) + 0x4000) >> (uBitsPerComp - 1); + if (comp == 0) + unq = 0; + else if (comp >= ((1 << (uBitsPerComp - 1)) - 1)) + unq = 0x7FFF; + else + unq = ((comp << 15) + 0x4000) >> (uBitsPerComp - 1); - if (s) unq = -unq; + if (s) + unq = -unq; } } else { - if (uBitsPerComp >= 15) unq = comp; - else if (comp == 0) unq = 0; - else if (comp == ((1 << uBitsPerComp) - 1)) unq = 0xFFFF; - else unq = ((comp << 16) + 0x8000) >> uBitsPerComp; + if (uBitsPerComp >= 15) + unq = comp; + else if (comp == 0) + unq = 0; + else if (comp == ((1 << uBitsPerComp) - 1)) + unq = 0xFFFF; + else + unq = ((comp << 16) + 0x8000) >> uBitsPerComp; } return unq; } - -_Use_decl_annotations_ -int D3DX_BC6H::FinishUnquantize(int comp, bool bSigned) noexcept +_Use_decl_annotations_ int D3DX_BC6H::FinishUnquantize(int comp, bool bSigned) noexcept { if (bSigned) { - return (comp < 0) ? -(((-comp) * 31) >> 5) : (comp * 31) >> 5; // scale the magnitude by 31/32 + return (comp < 0) ? -(((-comp) * 31) >> 5) : (comp * 31) >> 5; // scale the magnitude by 31/32 } else { - return (comp * 31) >> 6; // scale the magnitude by 31/64 + return (comp * 31) >> 6; // scale the magnitude by 31/64 } } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool D3DX_BC6H::EndPointsFit(const EncodeParams* pEP, const INTEndPntPair aEndPts[]) noexcept +_Use_decl_annotations_ bool D3DX_BC6H::EndPointsFit(const EncodeParams* pEP, const INTEndPntPair aEndPts[]) noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const bool bTransformed = ms_aInfo[pEP->uMode].bTransformed; - const bool bIsSigned = pEP->bSigned; - const LDRColorA& Prec0 = ms_aInfo[pEP->uMode].RGBAPrec[0][0]; - const LDRColorA& Prec1 = ms_aInfo[pEP->uMode].RGBAPrec[0][1]; - const LDRColorA& Prec2 = ms_aInfo[pEP->uMode].RGBAPrec[1][0]; - const LDRColorA& Prec3 = ms_aInfo[pEP->uMode].RGBAPrec[1][1]; + const bool bTransformed = ms_aInfo[pEP->uMode].bTransformed; + const bool bIsSigned = pEP->bSigned; + const LDRColorA& Prec0 = ms_aInfo[pEP->uMode].RGBAPrec[0][0]; + const LDRColorA& Prec1 = ms_aInfo[pEP->uMode].RGBAPrec[0][1]; + const LDRColorA& Prec2 = ms_aInfo[pEP->uMode].RGBAPrec[1][0]; + const LDRColorA& Prec3 = ms_aInfo[pEP->uMode].RGBAPrec[1][1]; INTColor aBits[4]; aBits[0].r = NBits(aEndPts[0].A.r, bIsSigned); @@ -1962,9 +2143,8 @@ bool D3DX_BC6H::EndPointsFit(const EncodeParams* pEP, const INTEndPntPair aEndPt aBits[1].r = NBits(aEndPts[0].B.r, bTransformed || bIsSigned); aBits[1].g = NBits(aEndPts[0].B.g, bTransformed || bIsSigned); aBits[1].b = NBits(aEndPts[0].B.b, bTransformed || bIsSigned); - if (aBits[0].r > Prec0.r || aBits[1].r > Prec1.r || - aBits[0].g > Prec0.g || aBits[1].g > Prec1.g || - aBits[0].b > Prec0.b || aBits[1].b > Prec1.b) + if (aBits[0].r > Prec0.r || aBits[1].r > Prec1.r || aBits[0].g > Prec0.g || aBits[1].g > Prec1.g || aBits[0].b > Prec0.b + || aBits[1].b > Prec1.b) return false; if (ms_aInfo[pEP->uMode].uPartitions) @@ -1976,24 +2156,22 @@ bool D3DX_BC6H::EndPointsFit(const EncodeParams* pEP, const INTEndPntPair aEndPt aBits[3].g = NBits(aEndPts[1].B.g, bTransformed || bIsSigned); aBits[3].b = NBits(aEndPts[1].B.b, bTransformed || bIsSigned); - if (aBits[2].r > Prec2.r || aBits[3].r > Prec3.r || - aBits[2].g > Prec2.g || aBits[3].g > Prec3.g || - aBits[2].b > Prec2.b || aBits[3].b > Prec3.b) + if (aBits[2].r > Prec2.r || aBits[3].r > Prec3.r || aBits[2].g > Prec2.g || aBits[3].g > Prec3.g || aBits[2].b > Prec2.b + || aBits[3].b > Prec3.b) return false; } return true; } - -_Use_decl_annotations_ -void D3DX_BC6H::GeneratePaletteQuantized(const EncodeParams* pEP, const INTEndPntPair& endPts, INTColor aPalette[]) const noexcept +_Use_decl_annotations_ void +D3DX_BC6H::GeneratePaletteQuantized(const EncodeParams* pEP, const INTEndPntPair& endPts, INTColor aPalette[]) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const size_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; + const size_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; const size_t uNumIndices = size_t(1) << uIndexPrec; assert(uNumIndices > 0); _Analysis_assume_(uNumIndices > 0); @@ -2012,13 +2190,21 @@ void D3DX_BC6H::GeneratePaletteQuantized(const EncodeParams* pEP, const INTEndPn const int* aWeights = nullptr; switch (uIndexPrec) { - case 3: aWeights = g_aWeights3; assert(uNumIndices <= 8); _Analysis_assume_(uNumIndices <= 8); break; - case 4: aWeights = g_aWeights4; assert(uNumIndices <= 16); _Analysis_assume_(uNumIndices <= 16); break; + case 3: + aWeights = g_aWeights3; + assert(uNumIndices <= 8); + _Analysis_assume_(uNumIndices <= 8); + break; + case 4: + aWeights = g_aWeights4; + assert(uNumIndices <= 16); + _Analysis_assume_(uNumIndices <= 16); + break; default: assert(false); for (size_t i = 0; i < uNumIndices; ++i) { - #pragma prefast(suppress:22102 22103, "writing blocks in two halves confuses tool") +#pragma prefast(suppress : 22102 22103, "writing blocks in two halves confuses tool") aPalette[i] = INTColor(0, 0, 0); } return; @@ -2026,30 +2212,29 @@ void D3DX_BC6H::GeneratePaletteQuantized(const EncodeParams* pEP, const INTEndPn for (size_t i = 0; i < uNumIndices; ++i) { - aPalette[i].r = FinishUnquantize( - (unqEndPts.A.r * (BC67_WEIGHT_MAX - aWeights[i]) + unqEndPts.B.r * aWeights[i] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT, + aPalette[i].r = FinishUnquantize((unqEndPts.A.r * (BC67_WEIGHT_MAX - aWeights[i]) + unqEndPts.B.r * aWeights[i] + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT, pEP->bSigned); - aPalette[i].g = FinishUnquantize( - (unqEndPts.A.g * (BC67_WEIGHT_MAX - aWeights[i]) + unqEndPts.B.g * aWeights[i] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT, + aPalette[i].g = FinishUnquantize((unqEndPts.A.g * (BC67_WEIGHT_MAX - aWeights[i]) + unqEndPts.B.g * aWeights[i] + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT, pEP->bSigned); - aPalette[i].b = FinishUnquantize( - (unqEndPts.A.b * (BC67_WEIGHT_MAX - aWeights[i]) + unqEndPts.B.b * aWeights[i] + BC67_WEIGHT_ROUND) >> BC67_WEIGHT_SHIFT, + aPalette[i].b = FinishUnquantize((unqEndPts.A.b * (BC67_WEIGHT_MAX - aWeights[i]) + unqEndPts.B.b * aWeights[i] + BC67_WEIGHT_ROUND) + >> BC67_WEIGHT_SHIFT, pEP->bSigned); } } - // given a collection of colors and quantized endpoints, generate a palette, choose best entries, and return a single toterr -_Use_decl_annotations_ -float D3DX_BC6H::MapColorsQuantized(const EncodeParams* pEP, const INTColor aColors[], size_t np, const INTEndPntPair &endPts) const noexcept +_Use_decl_annotations_ float +D3DX_BC6H::MapColorsQuantized(const EncodeParams* pEP, const INTColor aColors[], size_t np, const INTEndPntPair& endPts) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const uint8_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; - const auto uNumIndices = static_cast(1u << uIndexPrec); - INTColor aPalette[BC6H_MAX_INDICES]; + const uint8_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; + const auto uNumIndices = static_cast(1u << uIndexPrec); + INTColor aPalette[BC6H_MAX_INDICES]; GeneratePaletteQuantized(pEP, endPts, aPalette); float fTotErr = 0; @@ -2058,28 +2243,34 @@ float D3DX_BC6H::MapColorsQuantized(const EncodeParams* pEP, const INTColor aCol const XMVECTOR vcolors = XMLoadSInt4(reinterpret_cast(&aColors[i])); // Compute ErrorMetricRGB - XMVECTOR tpal = XMLoadSInt4(reinterpret_cast(&aPalette[0])); - tpal = XMVectorSubtract(vcolors, tpal); + XMVECTOR tpal = XMLoadSInt4(reinterpret_cast(&aPalette[0])); + tpal = XMVectorSubtract(vcolors, tpal); float fBestErr = XMVectorGetX(XMVector3Dot(tpal, tpal)); for (int j = 1; j < uNumIndices && fBestErr > 0; ++j) { // Compute ErrorMetricRGB - tpal = XMLoadSInt4(reinterpret_cast(&aPalette[j])); - tpal = XMVectorSubtract(vcolors, tpal); + tpal = XMLoadSInt4(reinterpret_cast(&aPalette[j])); + tpal = XMVectorSubtract(vcolors, tpal); const float fErr = XMVectorGetX(XMVector3Dot(tpal, tpal)); - if (fErr > fBestErr) break; // error increased, so we're done searching - if (fErr < fBestErr) fBestErr = fErr; + if (fErr > fBestErr) + break; // error increased, so we're done searching + if (fErr < fBestErr) + fBestErr = fErr; } fTotErr += fBestErr; } return fTotErr; } - -_Use_decl_annotations_ -float D3DX_BC6H::PerturbOne(const EncodeParams* pEP, const INTColor aColors[], size_t np, uint8_t ch, - const INTEndPntPair& oldEndPts, INTEndPntPair& newEndPts, float fOldErr, int do_b) const noexcept +_Use_decl_annotations_ float D3DX_BC6H::PerturbOne(const EncodeParams* pEP, + const INTColor aColors[], + size_t np, + uint8_t ch, + const INTEndPntPair& oldEndPts, + INTEndPntPair& newEndPts, + float fOldErr, + int do_b) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); @@ -2091,11 +2282,14 @@ float D3DX_BC6H::PerturbOne(const EncodeParams* pEP, const INTColor aColors[], s case 0: uPrec = ms_aInfo[pEP->uMode].RGBAPrec[0][0].r; break; case 1: uPrec = ms_aInfo[pEP->uMode].RGBAPrec[0][0].g; break; case 2: uPrec = ms_aInfo[pEP->uMode].RGBAPrec[0][0].b; break; - default: assert(false); newEndPts = oldEndPts; return FLT_MAX; + default: + assert(false); + newEndPts = oldEndPts; + return FLT_MAX; } INTEndPntPair tmpEndPts; - float fMinErr = fOldErr; - int beststep = 0; + float fMinErr = fOldErr; + int beststep = 0; // copy real endpoints so we can perturb them tmpEndPts = newEndPts = oldEndPts; @@ -2124,8 +2318,8 @@ float D3DX_BC6H::PerturbOne(const EncodeParams* pEP, const INTColor aColors[], s if (fErr < fMinErr) { bImproved = true; - fMinErr = fErr; - beststep = sign * step; + fMinErr = fErr; + beststep = sign * step; } } // if this was an improvement, move the endpoint and continue search from there @@ -2140,41 +2334,45 @@ float D3DX_BC6H::PerturbOne(const EncodeParams* pEP, const INTColor aColors[], s return fMinErr; } - -_Use_decl_annotations_ -void D3DX_BC6H::OptimizeOne(const EncodeParams* pEP, const INTColor aColors[], size_t np, float aOrgErr, - const INTEndPntPair &aOrgEndPts, INTEndPntPair &aOptEndPts) const noexcept +_Use_decl_annotations_ void D3DX_BC6H::OptimizeOne(const EncodeParams* pEP, + const INTColor aColors[], + size_t np, + float aOrgErr, + const INTEndPntPair& aOrgEndPts, + INTEndPntPair& aOptEndPts) const noexcept { assert(pEP); float aOptErr = aOrgErr; - aOptEndPts.A = aOrgEndPts.A; - aOptEndPts.B = aOrgEndPts.B; + aOptEndPts.A = aOrgEndPts.A; + aOptEndPts.B = aOrgEndPts.B; INTEndPntPair new_a, new_b; INTEndPntPair newEndPts; - int do_b; + int do_b; // now optimize each channel separately for (uint8_t ch = 0; ch < BC6H_NUM_CHANNELS; ++ch) { // figure out which endpoint when perturbed gives the most improvement and start there // if we just alternate, we can easily end up in a local minima - const float fErr0 = PerturbOne(pEP, aColors, np, ch, aOptEndPts, new_a, aOptErr, 0); // perturb endpt A - const float fErr1 = PerturbOne(pEP, aColors, np, ch, aOptEndPts, new_b, aOptErr, 1); // perturb endpt B + const float fErr0 = PerturbOne(pEP, aColors, np, ch, aOptEndPts, new_a, aOptErr, 0); // perturb endpt A + const float fErr1 = PerturbOne(pEP, aColors, np, ch, aOptEndPts, new_b, aOptErr, 1); // perturb endpt B if (fErr0 < fErr1) { - if (fErr0 >= aOptErr) continue; + if (fErr0 >= aOptErr) + continue; aOptEndPts.A[ch] = new_a.A[ch]; - aOptErr = fErr0; - do_b = 1; // do B next + aOptErr = fErr0; + do_b = 1; // do B next } else { - if (fErr1 >= aOptErr) continue; + if (fErr1 >= aOptErr) + continue; aOptEndPts.B[ch] = new_b.B[ch]; - aOptErr = fErr1; - do_b = 0; // do A next + aOptErr = fErr1; + do_b = 0; // do A next } // now alternate endpoints and keep trying until there is no improvement @@ -2188,14 +2386,15 @@ void D3DX_BC6H::OptimizeOne(const EncodeParams* pEP, const INTColor aColors[], s else aOptEndPts.B[ch] = newEndPts.B[ch]; aOptErr = fErr; - do_b = 1 - do_b; // now move the other endpoint + do_b = 1 - do_b; // now move the other endpoint } } } - -_Use_decl_annotations_ -void D3DX_BC6H::OptimizeEndPoints(const EncodeParams* pEP, const float aOrgErr[], const INTEndPntPair aOrgEndPts[], INTEndPntPair aOptEndPts[]) const noexcept +_Use_decl_annotations_ void D3DX_BC6H::OptimizeEndPoints(const EncodeParams* pEP, + const float aOrgErr[], + const INTEndPntPair aOrgEndPts[], + INTEndPntPair aOptEndPts[]) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); @@ -2222,17 +2421,15 @@ void D3DX_BC6H::OptimizeEndPoints(const EncodeParams* pEP, const float aOrgErr[] } } - // Swap endpoints as needed to ensure that the indices at fix up have a 0 high-order bit -_Use_decl_annotations_ -void D3DX_BC6H::SwapIndices(const EncodeParams* pEP, INTEndPntPair aEndPts[], size_t aIndices[]) noexcept +_Use_decl_annotations_ void D3DX_BC6H::SwapIndices(const EncodeParams* pEP, INTEndPntPair aEndPts[], size_t aIndices[]) noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const size_t uPartitions = ms_aInfo[pEP->uMode].uPartitions; - const size_t uNumIndices = size_t(1) << ms_aInfo[pEP->uMode].uIndexPrec; + const size_t uPartitions = ms_aInfo[pEP->uMode].uPartitions; + const size_t uNumIndices = size_t(1) << ms_aInfo[pEP->uMode].uIndexPrec; const size_t uHighIndexBit = uNumIndices >> 1; assert(uPartitions < BC6H_MAX_REGIONS && pEP->uShape < BC6H_MAX_SHAPES); @@ -2254,17 +2451,16 @@ void D3DX_BC6H::SwapIndices(const EncodeParams* pEP, INTEndPntPair aEndPts[], si } } - // assign indices given a tile, shape, and quantized endpoints, return toterr for each region -_Use_decl_annotations_ -void D3DX_BC6H::AssignIndices(const EncodeParams* pEP, const INTEndPntPair aEndPts[], size_t aIndices[], float aTotErr[]) const noexcept +_Use_decl_annotations_ void +D3DX_BC6H::AssignIndices(const EncodeParams* pEP, const INTEndPntPair aEndPts[], size_t aIndices[], float aTotErr[]) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); const uint8_t uPartitions = ms_aInfo[pEP->uMode].uPartitions; - const auto uNumIndices = static_cast(1u << ms_aInfo[pEP->uMode].uIndexPrec); + const auto uNumIndices = static_cast(1u << ms_aInfo[pEP->uMode].uIndexPrec); assert(uPartitions < BC6H_MAX_REGIONS && pEP->uShape < BC6H_MAX_SHAPES); _Analysis_assume_(uPartitions < BC6H_MAX_REGIONS && pEP->uShape < BC6H_MAX_SHAPES); @@ -2284,15 +2480,16 @@ void D3DX_BC6H::AssignIndices(const EncodeParams* pEP, const INTEndPntPair aEndP assert(uRegion < BC6H_MAX_REGIONS); _Analysis_assume_(uRegion < BC6H_MAX_REGIONS); float fBestErr = Norm(pEP->aIPixels[i], aPalette[uRegion][0]); - aIndices[i] = 0; + aIndices[i] = 0; for (uint8_t j = 1; j < uNumIndices && fBestErr > 0; ++j) { const float fErr = Norm(pEP->aIPixels[i], aPalette[uRegion][j]); - if (fErr > fBestErr) break; // error increased, so we're done searching + if (fErr > fBestErr) + break; // error increased, so we're done searching if (fErr < fBestErr) { - fBestErr = fErr; + fBestErr = fErr; aIndices[i] = j; } } @@ -2300,17 +2497,15 @@ void D3DX_BC6H::AssignIndices(const EncodeParams* pEP, const INTEndPntPair aEndP } } - -_Use_decl_annotations_ -void D3DX_BC6H::QuantizeEndPts(const EncodeParams* pEP, INTEndPntPair* aQntEndPts) const noexcept +_Use_decl_annotations_ void D3DX_BC6H::QuantizeEndPts(const EncodeParams* pEP, INTEndPntPair* aQntEndPts) const noexcept { assert(pEP && aQntEndPts); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const INTEndPntPair* aUnqEndPts = pEP->aUnqEndPts[pEP->uShape]; - const LDRColorA& Prec = ms_aInfo[pEP->uMode].RGBAPrec[0][0]; - const uint8_t uPartitions = ms_aInfo[pEP->uMode].uPartitions; + const INTEndPntPair* aUnqEndPts = pEP->aUnqEndPts[pEP->uShape]; + const LDRColorA& Prec = ms_aInfo[pEP->uMode].RGBAPrec[0][0]; + const uint8_t uPartitions = ms_aInfo[pEP->uMode].uPartitions; assert(uPartitions < BC6H_MAX_REGIONS); _Analysis_assume_(uPartitions < BC6H_MAX_REGIONS); @@ -2325,20 +2520,18 @@ void D3DX_BC6H::QuantizeEndPts(const EncodeParams* pEP, INTEndPntPair* aQntEndPt } } - -_Use_decl_annotations_ -void D3DX_BC6H::EmitBlock(const EncodeParams* pEP, const INTEndPntPair aEndPts[], const size_t aIndices[]) noexcept +_Use_decl_annotations_ void D3DX_BC6H::EmitBlock(const EncodeParams* pEP, const INTEndPntPair aEndPts[], const size_t aIndices[]) noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const uint8_t uRealMode = ms_aInfo[pEP->uMode].uMode; - const uint8_t uPartitions = ms_aInfo[pEP->uMode].uPartitions; - const uint8_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; - const size_t uHeaderBits = uPartitions > 0 ? 82u : 65u; - const ModeDescriptor* desc = ms_aDesc[pEP->uMode]; - size_t uStartBit = 0; + const uint8_t uRealMode = ms_aInfo[pEP->uMode].uMode; + const uint8_t uPartitions = ms_aInfo[pEP->uMode].uPartitions; + const uint8_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; + const size_t uHeaderBits = uPartitions > 0 ? 82u : 65u; + const ModeDescriptor* desc = ms_aDesc[pEP->uMode]; + size_t uStartBit = 0; while (uStartBit < uHeaderBits) { @@ -2372,9 +2565,7 @@ void D3DX_BC6H::EmitBlock(const EncodeParams* pEP, const INTEndPntPair aEndPts[] assert(uStartBit == 128); } - -_Use_decl_annotations_ -void D3DX_BC6H::Refine(EncodeParams* pEP) noexcept +_Use_decl_annotations_ void D3DX_BC6H::Refine(EncodeParams* pEP) noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); @@ -2384,19 +2575,21 @@ void D3DX_BC6H::Refine(EncodeParams* pEP) noexcept assert(uPartitions < BC6H_MAX_REGIONS); _Analysis_assume_(uPartitions < BC6H_MAX_REGIONS); - const bool bTransformed = ms_aInfo[pEP->uMode].bTransformed; - float aOrgErr[BC6H_MAX_REGIONS], aOptErr[BC6H_MAX_REGIONS]; + const bool bTransformed = ms_aInfo[pEP->uMode].bTransformed; + float aOrgErr[BC6H_MAX_REGIONS], aOptErr[BC6H_MAX_REGIONS]; INTEndPntPair aOrgEndPts[BC6H_MAX_REGIONS], aOptEndPts[BC6H_MAX_REGIONS]; - size_t aOrgIdx[NUM_PIXELS_PER_BLOCK], aOptIdx[NUM_PIXELS_PER_BLOCK]; + size_t aOrgIdx[NUM_PIXELS_PER_BLOCK], aOptIdx[NUM_PIXELS_PER_BLOCK]; QuantizeEndPts(pEP, aOrgEndPts); AssignIndices(pEP, aOrgEndPts, aOrgIdx, aOrgErr); SwapIndices(pEP, aOrgEndPts, aOrgIdx); - if (bTransformed) TransformForward(aOrgEndPts); + if (bTransformed) + TransformForward(aOrgEndPts); if (EndPointsFit(pEP, aOrgEndPts)) { - if (bTransformed) TransformInverse(aOrgEndPts, ms_aInfo[pEP->uMode].RGBAPrec[0][0], pEP->bSigned); + if (bTransformed) + TransformInverse(aOrgEndPts, ms_aInfo[pEP->uMode].RGBAPrec[0][0], pEP->bSigned); OptimizeEndPoints(pEP, aOrgErr, aOrgEndPts, aOptEndPts); AssignIndices(pEP, aOptEndPts, aOptIdx, aOptErr); SwapIndices(pEP, aOptEndPts, aOptIdx); @@ -2408,7 +2601,8 @@ void D3DX_BC6H::Refine(EncodeParams* pEP) noexcept fOptTotErr += aOptErr[p]; } - if (bTransformed) TransformForward(aOptEndPts); + if (bTransformed) + TransformForward(aOptEndPts); if (EndPointsFit(pEP, aOptEndPts) && fOptTotErr < fOrgTotErr && fOptTotErr < pEP->fBestErr) { pEP->fBestErr = fOptTotErr; @@ -2418,16 +2612,15 @@ void D3DX_BC6H::Refine(EncodeParams* pEP) noexcept { // either it stopped fitting when we optimized it, or there was no improvement // so go back to the unoptimized endpoints which we know will fit - if (bTransformed) TransformForward(aOrgEndPts); + if (bTransformed) + TransformForward(aOrgEndPts); pEP->fBestErr = fOrgTotErr; EmitBlock(pEP, aOrgEndPts, aOrgIdx); } } } - -_Use_decl_annotations_ -void D3DX_BC6H::GeneratePaletteUnquantized(const EncodeParams* pEP, size_t uRegion, INTColor aPalette[]) noexcept +_Use_decl_annotations_ void D3DX_BC6H::GeneratePaletteUnquantized(const EncodeParams* pEP, size_t uRegion, INTColor aPalette[]) noexcept { assert(pEP); assert(uRegion < BC6H_MAX_REGIONS && pEP->uShape < BC6H_MAX_SHAPES); @@ -2435,22 +2628,30 @@ void D3DX_BC6H::GeneratePaletteUnquantized(const EncodeParams* pEP, size_t uRegi assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const INTEndPntPair& endPts = pEP->aUnqEndPts[pEP->uShape][uRegion]; - const uint8_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; - const auto uNumIndices = static_cast(1u << uIndexPrec); + const INTEndPntPair& endPts = pEP->aUnqEndPts[pEP->uShape][uRegion]; + const uint8_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; + const auto uNumIndices = static_cast(1u << uIndexPrec); assert(uNumIndices > 0); _Analysis_assume_(uNumIndices > 0); const int* aWeights = nullptr; switch (uIndexPrec) { - case 3: aWeights = g_aWeights3; assert(uNumIndices <= 8); _Analysis_assume_(uNumIndices <= 8); break; - case 4: aWeights = g_aWeights4; assert(uNumIndices <= 16); _Analysis_assume_(uNumIndices <= 16); break; + case 3: + aWeights = g_aWeights3; + assert(uNumIndices <= 8); + _Analysis_assume_(uNumIndices <= 8); + break; + case 4: + aWeights = g_aWeights4; + assert(uNumIndices <= 16); + _Analysis_assume_(uNumIndices <= 16); + break; default: assert(false); for (size_t i = 0; i < uNumIndices; ++i) { - #pragma prefast(suppress:22102 22103, "writing blocks in two halves confuses tool") +#pragma prefast(suppress : 22102 22103, "writing blocks in two halves confuses tool") aPalette[i] = INTColor(0, 0, 0); } return; @@ -2464,17 +2665,15 @@ void D3DX_BC6H::GeneratePaletteUnquantized(const EncodeParams* pEP, size_t uRegi } } - -_Use_decl_annotations_ -float D3DX_BC6H::MapColors(const EncodeParams* pEP, size_t uRegion, size_t np, const size_t* auIndex) const noexcept +_Use_decl_annotations_ float D3DX_BC6H::MapColors(const EncodeParams* pEP, size_t uRegion, size_t np, const size_t* auIndex) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const uint8_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; - const auto uNumIndices = static_cast(1u << uIndexPrec); - INTColor aPalette[BC6H_MAX_INDICES]; + const uint8_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; + const auto uNumIndices = static_cast(1u << uIndexPrec); + INTColor aPalette[BC6H_MAX_INDICES]; GeneratePaletteUnquantized(pEP, uRegion, aPalette); float fTotalErr = 0.0f; @@ -2484,8 +2683,10 @@ float D3DX_BC6H::MapColors(const EncodeParams* pEP, size_t uRegion, size_t np, c for (uint8_t j = 1; j < uNumIndices && fBestErr > 0.0f; ++j) { const float fErr = Norm(pEP->aIPixels[auIndex[i]], aPalette[j]); - if (fErr > fBestErr) break; // error increased, so we're done searching - if (fErr < fBestErr) fBestErr = fErr; + if (fErr > fBestErr) + break; // error increased, so we're done searching + if (fErr < fBestErr) + fBestErr = fErr; } fTotalErr += fBestErr; } @@ -2493,8 +2694,7 @@ float D3DX_BC6H::MapColors(const EncodeParams* pEP, size_t uRegion, size_t np, c return fTotalErr; } -_Use_decl_annotations_ -float D3DX_BC6H::RoughMSE(EncodeParams* pEP) const noexcept +_Use_decl_annotations_ float D3DX_BC6H::RoughMSE(EncodeParams* pEP) const noexcept { assert(pEP); assert(pEP->uShape < BC6H_MAX_SHAPES); @@ -2558,17 +2758,16 @@ float D3DX_BC6H::RoughMSE(EncodeParams* pEP) const noexcept return fError; } - //------------------------------------------------------------------------------------- // BC7 Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept +_Use_decl_annotations_ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept { assert(pOut); size_t uFirst = 0; - while (uFirst < 128 && !GetBit(uFirst)) {} + while (uFirst < 128 && !GetBit(uFirst)) + {} const uint8_t uMode = uint8_t(uFirst - 1); if (uMode < 8) @@ -2577,12 +2776,12 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept assert(uPartitions < BC7_MAX_REGIONS); _Analysis_assume_(uPartitions < BC7_MAX_REGIONS); - const auto uNumEndPts = static_cast((unsigned(uPartitions) + 1u) << 1); - const uint8_t uIndexPrec = ms_aInfo[uMode].uIndexPrec; + const auto uNumEndPts = static_cast((unsigned(uPartitions) + 1u) << 1); + const uint8_t uIndexPrec = ms_aInfo[uMode].uIndexPrec; const uint8_t uIndexPrec2 = ms_aInfo[uMode].uIndexPrec2; - size_t i; - size_t uStartBit = size_t(uMode) + 1; - uint8_t P[6]; + size_t i; + size_t uStartBit = size_t(uMode) + 1; + uint8_t P[6]; const uint8_t uShape = GetBits(uStartBit, ms_aInfo[uMode].uPartitionBits); assert(uShape < BC7_MAX_SHAPES); _Analysis_assume_(uShape < BC7_MAX_SHAPES); @@ -2593,8 +2792,8 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept const uint8_t uIndexMode = GetBits(uStartBit, ms_aInfo[uMode].uIndexModeBits); assert(uIndexMode < 2); - LDRColorA c[BC7_MAX_REGIONS << 1]; - const LDRColorA RGBAPrec = ms_aInfo[uMode].RGBAPrec; + LDRColorA c[BC7_MAX_REGIONS << 1]; + const LDRColorA RGBAPrec = ms_aInfo[uMode].RGBAPrec; const LDRColorA RGBAPrecWithP = ms_aInfo[uMode].RGBAPrecWithP; assert(uNumEndPts <= (BC7_MAX_REGIONS << 1)); @@ -2604,9 +2803,9 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept { if (uStartBit + RGBAPrec.r > 128) { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC7: Invalid block encountered during decoding\n"); - #endif +#endif FillWithErrorColors(pOut); return; } @@ -2619,9 +2818,9 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept { if (uStartBit + RGBAPrec.g > 128) { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC7: Invalid block encountered during decoding\n"); - #endif +#endif FillWithErrorColors(pOut); return; } @@ -2634,9 +2833,9 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept { if (uStartBit + RGBAPrec.b > 128) { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC7: Invalid block encountered during decoding\n"); - #endif +#endif FillWithErrorColors(pOut); return; } @@ -2649,9 +2848,9 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept { if (uStartBit + RGBAPrec.a > 128) { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC7: Invalid block encountered during decoding\n"); - #endif +#endif FillWithErrorColors(pOut); return; } @@ -2666,9 +2865,9 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept { if (uStartBit > 127) { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC7: Invalid block encountered during decoding\n"); - #endif +#endif FillWithErrorColors(pOut); return; } @@ -2693,14 +2892,14 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept for (i = 0; i < uNumEndPts; i++) { - #ifdef __GNUC__ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wstringop-overflow" - #endif +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif c[i] = Unquantize(c[i], RGBAPrecWithP); - #ifdef __GNUC_ - #pragma GCC diagnostic pop - #endif +#ifdef __GNUC_ +#pragma GCC diagnostic pop +#endif } uint8_t w1[NUM_PIXELS_PER_BLOCK], w2[NUM_PIXELS_PER_BLOCK]; @@ -2711,9 +2910,9 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept const size_t uNumBits = IsFixUpOffset(ms_aInfo[uMode].uPartitions, uShape, i) ? uIndexPrec - 1u : uIndexPrec; if (uStartBit + uNumBits > 128) { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC7: Invalid block encountered during decoding\n"); - #endif +#endif FillWithErrorColors(pOut); return; } @@ -2728,9 +2927,9 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept const size_t uNumBits = i ? uIndexPrec2 : uIndexPrec2 - 1u; if (uStartBit + uNumBits > 128) { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC7: Invalid block encountered during decoding\n"); - #endif +#endif FillWithErrorColors(pOut); return; } @@ -2741,7 +2940,7 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept for (i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { const uint8_t uRegion = g_aPartitionTable[uPartitions][uShape][i]; - LDRColorA outPixel; + LDRColorA outPixel; if (uIndexPrec2 == 0) { LDRColorA::Interpolate(c[uRegion << 1], c[(uRegion << 1) + 1], w1[i], w1[i], uIndexPrec, uIndexPrec, outPixel); @@ -2760,9 +2959,9 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept switch (uRotation) { - case 1: std::swap(outPixel.r, outPixel.a); break; - case 2: std::swap(outPixel.g, outPixel.a); break; - case 3: std::swap(outPixel.b, outPixel.a); break; + case 1: std::swap(outPixel.r, outPixel.a); break; + case 2: std::swap(outPixel.g, outPixel.a); break; + case 3: std::swap(outPixel.b, outPixel.a); break; default: break; } @@ -2771,23 +2970,22 @@ void D3DX_BC7::Decode(HDRColorA* pOut) const noexcept } else { - #if defined(_WIN32) && defined(_DEBUG) +#if defined(_WIN32) && defined(_DEBUG) OutputDebugStringA("BC7: Reserved mode 8 encountered during decoding\n"); - #endif +#endif // Per the BC7 format spec, we must return transparent black memset(pOut, 0, sizeof(HDRColorA) * NUM_PIXELS_PER_BLOCK); } } -_Use_decl_annotations_ -void D3DX_BC7::Encode(uint32_t flags, const HDRColorA* const pIn) noexcept +_Use_decl_annotations_ void D3DX_BC7::Encode(uint32_t flags, const HDRColorA* const pIn) noexcept { assert(pIn); - D3DX_BC7 final = *this; + D3DX_BC7 final = *this; EncodeParams EP(pIn); - float fMSEBest = FLT_MAX; - uint32_t alphaMask = 0xFF; + float fMSEBest = FLT_MAX; + uint32_t alphaMask = 0xFF; for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; ++i) { @@ -2816,7 +3014,8 @@ void D3DX_BC7::Encode(uint32_t flags, const HDRColorA* const pIn) noexcept if ((!bHasAlpha) && (EP.uMode == 7)) { - // There is no value in using mode 7 for completely opaque blocks (the other 2 subset modes handle this case for opaque blocks), so skip it for a small perf win. + // There is no value in using mode 7 for completely opaque blocks (the other 2 subset modes handle this case for opaque blocks), + // so skip it for a small perf win. continue; } @@ -2824,21 +3023,30 @@ void D3DX_BC7::Encode(uint32_t flags, const HDRColorA* const pIn) noexcept assert(uShapes <= BC7_MAX_SHAPES); _Analysis_assume_(uShapes <= BC7_MAX_SHAPES); - const size_t uNumRots = size_t(1) << ms_aInfo[EP.uMode].uRotationBits; + const size_t uNumRots = size_t(1) << ms_aInfo[EP.uMode].uRotationBits; const size_t uNumIdxMode = size_t(1) << ms_aInfo[EP.uMode].uIndexModeBits; // Number of rough cases to look at. reasonable values of this are 1, uShapes/4, and uShapes // uShapes/4 gets nearly all the cases; you can increase that a bit (say by 3 or 4) if you really want to squeeze the last bit out const size_t uItems = std::max(1, uShapes >> 2); - float afRoughMSE[BC7_MAX_SHAPES]; - size_t auShape[BC7_MAX_SHAPES]; + float afRoughMSE[BC7_MAX_SHAPES]; + size_t auShape[BC7_MAX_SHAPES]; for (size_t r = 0; r < uNumRots && fMSEBest > 0; ++r) { switch (r) { - case 1: for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) std::swap(EP.aLDRPixels[i].r, EP.aLDRPixels[i].a); break; - case 2: for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) std::swap(EP.aLDRPixels[i].g, EP.aLDRPixels[i].a); break; - case 3: for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) std::swap(EP.aLDRPixels[i].b, EP.aLDRPixels[i].a); break; + case 1: + for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) + std::swap(EP.aLDRPixels[i].r, EP.aLDRPixels[i].a); + break; + case 2: + for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) + std::swap(EP.aLDRPixels[i].g, EP.aLDRPixels[i].a); + break; + case 3: + for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) + std::swap(EP.aLDRPixels[i].b, EP.aLDRPixels[i].a); + break; default: break; } @@ -2848,7 +3056,7 @@ void D3DX_BC7::Encode(uint32_t flags, const HDRColorA* const pIn) noexcept for (size_t s = 0; s < uShapes; s++) { afRoughMSE[s] = RoughMSE(&EP, s, im); - auShape[s] = s; + auShape[s] = s; } // Bubble up the first uItems items @@ -2869,7 +3077,7 @@ void D3DX_BC7::Encode(uint32_t flags, const HDRColorA* const pIn) noexcept const float fMSE = Refine(&EP, auShape[i], r, im); if (fMSE < fMSEBest) { - final = *this; + final = *this; fMSEBest = fMSE; } } @@ -2877,9 +3085,18 @@ void D3DX_BC7::Encode(uint32_t flags, const HDRColorA* const pIn) noexcept switch (r) { - case 1: for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) std::swap(EP.aLDRPixels[i].r, EP.aLDRPixels[i].a); break; - case 2: for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) std::swap(EP.aLDRPixels[i].g, EP.aLDRPixels[i].a); break; - case 3: for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) std::swap(EP.aLDRPixels[i].b, EP.aLDRPixels[i].a); break; + case 1: + for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) + std::swap(EP.aLDRPixels[i].r, EP.aLDRPixels[i].a); + break; + case 2: + for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) + std::swap(EP.aLDRPixels[i].g, EP.aLDRPixels[i].a); + break; + case 3: + for (size_t i = 0; i < NUM_PIXELS_PER_BLOCK; i++) + std::swap(EP.aLDRPixels[i].b, EP.aLDRPixels[i].a); + break; default: break; } } @@ -2888,18 +3105,19 @@ void D3DX_BC7::Encode(uint32_t flags, const HDRColorA* const pIn) noexcept *this = final; } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void D3DX_BC7::GeneratePaletteQuantized(const EncodeParams* pEP, size_t uIndexMode, const LDREndPntPair& endPts, LDRColorA aPalette[]) const noexcept +_Use_decl_annotations_ void D3DX_BC7::GeneratePaletteQuantized(const EncodeParams* pEP, + size_t uIndexMode, + const LDREndPntPair& endPts, + LDRColorA aPalette[]) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const size_t uIndexPrec = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec2 : ms_aInfo[pEP->uMode].uIndexPrec; - const size_t uIndexPrec2 = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec : ms_aInfo[pEP->uMode].uIndexPrec2; - const size_t uNumIndices = size_t(1) << uIndexPrec; + const size_t uIndexPrec = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec2 : ms_aInfo[pEP->uMode].uIndexPrec; + const size_t uIndexPrec2 = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec : ms_aInfo[pEP->uMode].uIndexPrec2; + const size_t uNumIndices = size_t(1) << uIndexPrec; const size_t uNumIndices2 = size_t(1) << uIndexPrec2; assert(uNumIndices > 0 && uNumIndices2 > 0); _Analysis_assume_(uNumIndices > 0 && uNumIndices2 > 0); @@ -2922,25 +3140,31 @@ void D3DX_BC7::GeneratePaletteQuantized(const EncodeParams* pEP, size_t uIndexMo } } -_Use_decl_annotations_ -float D3DX_BC7::PerturbOne(const EncodeParams* pEP, const LDRColorA aColors[], size_t np, size_t uIndexMode, size_t ch, - const LDREndPntPair &oldEndPts, LDREndPntPair &newEndPts, float fOldErr, uint8_t do_b) const noexcept +_Use_decl_annotations_ float D3DX_BC7::PerturbOne(const EncodeParams* pEP, + const LDRColorA aColors[], + size_t np, + size_t uIndexMode, + size_t ch, + const LDREndPntPair& oldEndPts, + LDREndPntPair& newEndPts, + float fOldErr, + uint8_t do_b) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const int prec = ms_aInfo[pEP->uMode].RGBAPrecWithP[ch]; + const int prec = ms_aInfo[pEP->uMode].RGBAPrecWithP[ch]; LDREndPntPair tmp_endPts = newEndPts = oldEndPts; - float fMinErr = fOldErr; - uint8_t* pnew_c = (do_b ? &newEndPts.B[ch] : &newEndPts.A[ch]); - uint8_t* ptmp_c = (do_b ? &tmp_endPts.B[ch] : &tmp_endPts.A[ch]); + float fMinErr = fOldErr; + uint8_t* pnew_c = (do_b ? &newEndPts.B[ch] : &newEndPts.A[ch]); + uint8_t* ptmp_c = (do_b ? &tmp_endPts.B[ch] : &tmp_endPts.A[ch]); // do a logarithmic search for the best error for this endpoint (which) for (int step = 1 << (prec - 1); step; step >>= 1) { bool bImproved = false; - int beststep = 0; + int beststep = 0; for (int sign = -1; sign <= 1; sign += 2) { int tmp = int(*pnew_c) + sign * step; @@ -2953,8 +3177,8 @@ float D3DX_BC7::PerturbOne(const EncodeParams* pEP, const LDRColorA aColors[], s if (fTotalErr < fMinErr) { bImproved = true; - fMinErr = fTotalErr; - beststep = sign * step; + fMinErr = fTotalErr; + beststep = sign * step; } } @@ -2967,9 +3191,13 @@ float D3DX_BC7::PerturbOne(const EncodeParams* pEP, const LDRColorA aColors[], s // perturb the endpoints at least -3 to 3. // always ensure endpoint ordering is preserved (no need to overlap the scan) -_Use_decl_annotations_ -void D3DX_BC7::Exhaustive(const EncodeParams* pEP, const LDRColorA aColors[], size_t np, size_t uIndexMode, size_t ch, - float& fOrgErr, LDREndPntPair& optEndPt) const noexcept +_Use_decl_annotations_ void D3DX_BC7::Exhaustive(const EncodeParams* pEP, + const LDRColorA aColors[], + size_t np, + size_t uIndexMode, + size_t ch, + float& fOrgErr, + LDREndPntPair& optEndPt) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); @@ -2983,13 +3211,13 @@ void D3DX_BC7::Exhaustive(const EncodeParams* pEP, const LDRColorA aColors[], si constexpr int delta = 5; // ok figure out the range of A and B - tmpEndPt = optEndPt; - const int alow = std::max(0, int(optEndPt.A[ch]) - delta); + tmpEndPt = optEndPt; + const int alow = std::max(0, int(optEndPt.A[ch]) - delta); const int ahigh = std::min((1 << uPrec) - 1, int(optEndPt.A[ch]) + delta); - const int blow = std::max(0, int(optEndPt.B[ch]) - delta); + const int blow = std::max(0, int(optEndPt.B[ch]) - delta); const int bhigh = std::min((1 << uPrec) - 1, int(optEndPt.B[ch]) + delta); - int amin = 0; - int bmin = 0; + int amin = 0; + int bmin = 0; float fBestErr = fOrgErr; if (optEndPt.A[ch] <= optEndPt.B[ch]) @@ -3005,8 +3233,8 @@ void D3DX_BC7::Exhaustive(const EncodeParams* pEP, const LDRColorA aColors[], si const float fErr = MapColors(pEP, aColors, np, uIndexMode, tmpEndPt, fBestErr); if (fErr < fBestErr) { - amin = a; - bmin = b; + amin = a; + bmin = b; fBestErr = fErr; } } @@ -3025,8 +3253,8 @@ void D3DX_BC7::Exhaustive(const EncodeParams* pEP, const LDRColorA aColors[], si const float fErr = MapColors(pEP, aColors, np, uIndexMode, tmpEndPt, fBestErr); if (fErr < fBestErr) { - amin = a; - bmin = b; + amin = a; + bmin = b; fBestErr = fErr; } } @@ -3037,24 +3265,28 @@ void D3DX_BC7::Exhaustive(const EncodeParams* pEP, const LDRColorA aColors[], si { optEndPt.A[ch] = static_cast(amin); optEndPt.B[ch] = static_cast(bmin); - fOrgErr = fBestErr; + fOrgErr = fBestErr; } } -_Use_decl_annotations_ -void D3DX_BC7::OptimizeOne(const EncodeParams* pEP, const LDRColorA aColors[], size_t np, size_t uIndexMode, - float fOrgErr, const LDREndPntPair& org, LDREndPntPair& opt) const noexcept +_Use_decl_annotations_ void D3DX_BC7::OptimizeOne(const EncodeParams* pEP, + const LDRColorA aColors[], + size_t np, + size_t uIndexMode, + float fOrgErr, + const LDREndPntPair& org, + LDREndPntPair& opt) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); float fOptErr = fOrgErr; - opt = org; + opt = org; LDREndPntPair new_a, new_b; LDREndPntPair newEndPts; - uint8_t do_b; + uint8_t do_b; // now optimize each channel separately for (size_t ch = 0; ch < BC7_NUM_CHANNELS; ++ch) @@ -3064,8 +3296,8 @@ void D3DX_BC7::OptimizeOne(const EncodeParams* pEP, const LDRColorA aColors[], s // figure out which endpoint when perturbed gives the most improvement and start there // if we just alternate, we can easily end up in a local minima - const float fErr0 = PerturbOne(pEP, aColors, np, uIndexMode, ch, opt, new_a, fOptErr, 0); // perturb endpt A - const float fErr1 = PerturbOne(pEP, aColors, np, uIndexMode, ch, opt, new_b, fOptErr, 1); // perturb endpt B + const float fErr0 = PerturbOne(pEP, aColors, np, uIndexMode, ch, opt, new_a, fOptErr, 0); // perturb endpt A + const float fErr1 = PerturbOne(pEP, aColors, np, uIndexMode, ch, opt, new_b, fOptErr, 1); // perturb endpt B uint8_t& copt_a = opt.A[ch]; uint8_t& copt_b = opt.B[ch]; @@ -3076,21 +3308,21 @@ void D3DX_BC7::OptimizeOne(const EncodeParams* pEP, const LDRColorA aColors[], s { if (fErr0 >= fOptErr) continue; - copt_a = cnew_a; + copt_a = cnew_a; fOptErr = fErr0; - do_b = 1; // do B next + do_b = 1; // do B next } else { if (fErr1 >= fOptErr) continue; - copt_b = cnew_b; + copt_b = cnew_b; fOptErr = fErr1; - do_b = 0; // do A next + do_b = 0; // do A next } // now alternate endpoints and keep trying until there is no improvement - for (; ; ) + for (;;) { const float fErr = PerturbOne(pEP, aColors, np, uIndexMode, ch, opt, newEndPts, fOptErr, do_b); if (fErr >= fOptErr) @@ -3100,7 +3332,7 @@ void D3DX_BC7::OptimizeOne(const EncodeParams* pEP, const LDRColorA aColors[], s else copt_b = cnew_b; fOptErr = fErr; - do_b = 1u - do_b; // now move the other endpoint + do_b = 1u - do_b; // now move the other endpoint } } @@ -3109,9 +3341,12 @@ void D3DX_BC7::OptimizeOne(const EncodeParams* pEP, const LDRColorA aColors[], s Exhaustive(pEP, aColors, np, uIndexMode, ch, fOptErr, opt); } -_Use_decl_annotations_ -void D3DX_BC7::OptimizeEndPoints(const EncodeParams* pEP, size_t uShape, size_t uIndexMode, const float afOrgErr[], - const LDREndPntPair aOrgEndPts[], LDREndPntPair aOptEndPts[]) const noexcept +_Use_decl_annotations_ void D3DX_BC7::OptimizeEndPoints(const EncodeParams* pEP, + size_t uShape, + size_t uIndexMode, + const float afOrgErr[], + const LDREndPntPair aOrgEndPts[], + LDREndPntPair aOptEndPts[]) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); @@ -3135,9 +3370,13 @@ void D3DX_BC7::OptimizeEndPoints(const EncodeParams* pEP, size_t uShape, size_t } } -_Use_decl_annotations_ -void D3DX_BC7::AssignIndices(const EncodeParams* pEP, size_t uShape, size_t uIndexMode, LDREndPntPair endPts[], size_t aIndices[], size_t aIndices2[], - float afTotErr[]) const noexcept +_Use_decl_annotations_ void D3DX_BC7::AssignIndices(const EncodeParams* pEP, + size_t uShape, + size_t uIndexMode, + LDREndPntPair endPts[], + size_t aIndices[], + size_t aIndices2[], + float afTotErr[]) const noexcept { assert(pEP); assert(uShape < BC7_MAX_SHAPES); @@ -3149,17 +3388,17 @@ void D3DX_BC7::AssignIndices(const EncodeParams* pEP, size_t uShape, size_t uInd assert(uPartitions < BC7_MAX_REGIONS); _Analysis_assume_(uPartitions < BC7_MAX_REGIONS); - const uint8_t uIndexPrec = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec2 : ms_aInfo[pEP->uMode].uIndexPrec; - const uint8_t uIndexPrec2 = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec : ms_aInfo[pEP->uMode].uIndexPrec2; - const auto uNumIndices = static_cast(1u << uIndexPrec); - const auto uNumIndices2 = static_cast(1u << uIndexPrec2); + const uint8_t uIndexPrec = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec2 : ms_aInfo[pEP->uMode].uIndexPrec; + const uint8_t uIndexPrec2 = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec : ms_aInfo[pEP->uMode].uIndexPrec2; + const auto uNumIndices = static_cast(1u << uIndexPrec); + const auto uNumIndices2 = static_cast(1u << uIndexPrec2); assert((uNumIndices <= BC7_MAX_INDICES) && (uNumIndices2 <= BC7_MAX_INDICES)); _Analysis_assume_((uNumIndices <= BC7_MAX_INDICES) && (uNumIndices2 <= BC7_MAX_INDICES)); - const uint8_t uHighestIndexBit = uint8_t(uNumIndices >> 1); + const uint8_t uHighestIndexBit = uint8_t(uNumIndices >> 1); const uint8_t uHighestIndexBit2 = uint8_t(uNumIndices2 >> 1); - LDRColorA aPalette[BC7_MAX_REGIONS][BC7_MAX_INDICES]; + LDRColorA aPalette[BC7_MAX_REGIONS][BC7_MAX_INDICES]; // build list of possibles for (size_t p = 0; p <= uPartitions; p++) @@ -3217,8 +3456,13 @@ void D3DX_BC7::AssignIndices(const EncodeParams* pEP, size_t uShape, size_t uInd } } -_Use_decl_annotations_ -void D3DX_BC7::EmitBlock(const EncodeParams* pEP, size_t uShape, size_t uRotation, size_t uIndexMode, const LDREndPntPair aEndPts[], const size_t aIndex[], const size_t aIndex2[]) noexcept +_Use_decl_annotations_ void D3DX_BC7::EmitBlock(const EncodeParams* pEP, + size_t uShape, + size_t uRotation, + size_t uIndexMode, + const LDREndPntPair aEndPts[], + const size_t aIndex[], + const size_t aIndex2[]) noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); @@ -3228,13 +3472,13 @@ void D3DX_BC7::EmitBlock(const EncodeParams* pEP, size_t uShape, size_t uRotatio assert(uPartitions < BC7_MAX_REGIONS); _Analysis_assume_(uPartitions < BC7_MAX_REGIONS); - const size_t uPBits = ms_aInfo[pEP->uMode].uPBits; - const size_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; - const size_t uIndexPrec2 = ms_aInfo[pEP->uMode].uIndexPrec2; - const LDRColorA RGBAPrec = ms_aInfo[pEP->uMode].RGBAPrec; + const size_t uPBits = ms_aInfo[pEP->uMode].uPBits; + const size_t uIndexPrec = ms_aInfo[pEP->uMode].uIndexPrec; + const size_t uIndexPrec2 = ms_aInfo[pEP->uMode].uIndexPrec2; + const LDRColorA RGBAPrec = ms_aInfo[pEP->uMode].RGBAPrec; const LDRColorA RGBAPrecWithP = ms_aInfo[pEP->uMode].RGBAPrecWithP; - size_t i; - size_t uStartBit = 0; + size_t i; + size_t uStartBit = 0; SetBits(uStartBit, pEP->uMode, 0); SetBits(uStartBit, 1, 1); SetBits(uStartBit, ms_aInfo[pEP->uMode].uRotationBits, static_cast(uRotation)); @@ -3243,9 +3487,9 @@ void D3DX_BC7::EmitBlock(const EncodeParams* pEP, size_t uShape, size_t uRotatio if (uPBits) { - const size_t uNumEP = (size_t(uPartitions) + 1) << 1; - uint8_t aPVote[BC7_MAX_REGIONS << 1] = { 0,0,0,0,0,0 }; - uint8_t aCount[BC7_MAX_REGIONS << 1] = { 0,0,0,0,0,0 }; + const size_t uNumEP = (size_t(uPartitions) + 1) << 1; + uint8_t aPVote[BC7_MAX_REGIONS << 1] = { 0, 0, 0, 0, 0, 0 }; + uint8_t aCount[BC7_MAX_REGIONS << 1] = { 0, 0, 0, 0, 0, 0 }; for (uint8_t ch = 0; ch < BC7_NUM_CHANNELS; ch++) { uint8_t ep = 0; @@ -3276,7 +3520,7 @@ void D3DX_BC7::EmitBlock(const EncodeParams* pEP, size_t uShape, size_t uRotatio for (i = 0; i < uPBits; i++) { - SetBits(uStartBit, 1, (aPVote[i] >(aCount[i] >> 1)) ? 1u : 0u); + SetBits(uStartBit, 1, (aPVote[i] > (aCount[i] >> 1)) ? 1u : 0u); } } else @@ -3307,8 +3551,8 @@ void D3DX_BC7::EmitBlock(const EncodeParams* pEP, size_t uShape, size_t uRotatio assert(uStartBit == 128); } -_Use_decl_annotations_ -void D3DX_BC7::FixEndpointPBits(const EncodeParams* pEP, const LDREndPntPair *pOrigEndpoints, LDREndPntPair *pFixedEndpoints) noexcept +_Use_decl_annotations_ void +D3DX_BC7::FixEndpointPBits(const EncodeParams* pEP, const LDREndPntPair* pOrigEndpoints, LDREndPntPair* pFixedEndpoints) noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); @@ -3326,11 +3570,11 @@ void D3DX_BC7::FixEndpointPBits(const EncodeParams* pEP, const LDREndPntPair *pO if (uPBits) { - const size_t uNumEP = size_t(1 + uPartitions) << 1; - uint8_t aPVote[BC7_MAX_REGIONS << 1] = { 0,0,0,0,0,0 }; - uint8_t aCount[BC7_MAX_REGIONS << 1] = { 0,0,0,0,0,0 }; + const size_t uNumEP = size_t(1 + uPartitions) << 1; + uint8_t aPVote[BC7_MAX_REGIONS << 1] = { 0, 0, 0, 0, 0, 0 }; + uint8_t aCount[BC7_MAX_REGIONS << 1] = { 0, 0, 0, 0, 0, 0 }; - const LDRColorA RGBAPrec = ms_aInfo[pEP->uMode].RGBAPrec; + const LDRColorA RGBAPrec = ms_aInfo[pEP->uMode].RGBAPrec; const LDRColorA RGBAPrecWithP = ms_aInfo[pEP->uMode].RGBAPrecWithP; for (uint8_t ch = 0; ch < BC7_NUM_CHANNELS; ch++) @@ -3366,7 +3610,7 @@ void D3DX_BC7::FixEndpointPBits(const EncodeParams* pEP, const LDREndPntPair *pO // rounding the component indices correctly in cases the pbits != a component's LSB. int pbits[BC7_MAX_REGIONS << 1]; for (size_t i = 0; i < uPBits; i++) - pbits[i] = aPVote[i] >(aCount[i] >> 1) ? 1 : 0; + pbits[i] = aPVote[i] > (aCount[i] >> 1) ? 1 : 0; // Now calculate the actual endpoints with proper pbits, so error calculations are accurate. if (pEP->uMode == 1) @@ -3395,8 +3639,7 @@ void D3DX_BC7::FixEndpointPBits(const EncodeParams* pEP, const LDREndPntPair *pO } } -_Use_decl_annotations_ -float D3DX_BC7::Refine(const EncodeParams* pEP, size_t uShape, size_t uRotation, size_t uIndexMode) noexcept +_Use_decl_annotations_ float D3DX_BC7::Refine(const EncodeParams* pEP, size_t uShape, size_t uRotation, size_t uIndexMode) noexcept { assert(pEP); assert(uShape < BC7_MAX_SHAPES); @@ -3410,26 +3653,26 @@ float D3DX_BC7::Refine(const EncodeParams* pEP, size_t uShape, size_t uRotation, LDREndPntPair aOrgEndPts[BC7_MAX_REGIONS]; LDREndPntPair aOptEndPts[BC7_MAX_REGIONS]; - size_t aOrgIdx[NUM_PIXELS_PER_BLOCK]; - size_t aOrgIdx2[NUM_PIXELS_PER_BLOCK]; - size_t aOptIdx[NUM_PIXELS_PER_BLOCK]; - size_t aOptIdx2[NUM_PIXELS_PER_BLOCK]; - float aOrgErr[BC7_MAX_REGIONS]; - float aOptErr[BC7_MAX_REGIONS]; + size_t aOrgIdx[NUM_PIXELS_PER_BLOCK]; + size_t aOrgIdx2[NUM_PIXELS_PER_BLOCK]; + size_t aOptIdx[NUM_PIXELS_PER_BLOCK]; + size_t aOptIdx2[NUM_PIXELS_PER_BLOCK]; + float aOrgErr[BC7_MAX_REGIONS]; + float aOptErr[BC7_MAX_REGIONS]; const LDREndPntPair* aEndPts = &pEP->aEndPts[uShape][0]; for (size_t p = 0; p <= uPartitions; p++) { - #ifdef __GNUC__ - #pragma GCC diagnostic push - #pragma GCC diagnostic ignored "-Wstringop-overflow" - #endif +#ifdef __GNUC__ +#pragma GCC diagnostic push +#pragma GCC diagnostic ignored "-Wstringop-overflow" +#endif aOrgEndPts[p].A = Quantize(aEndPts[p].A, ms_aInfo[pEP->uMode].RGBAPrecWithP); aOrgEndPts[p].B = Quantize(aEndPts[p].B, ms_aInfo[pEP->uMode].RGBAPrecWithP); - #ifdef __GNUC_ - #pragma GCC diagnostic pop - #endif +#ifdef __GNUC_ +#pragma GCC diagnostic pop +#endif } LDREndPntPair newEndPts1[BC7_MAX_REGIONS]; @@ -3462,23 +3705,27 @@ float D3DX_BC7::Refine(const EncodeParams* pEP, size_t uShape, size_t uRotation, } } -_Use_decl_annotations_ -float D3DX_BC7::MapColors(const EncodeParams* pEP, const LDRColorA aColors[], size_t np, size_t uIndexMode, const LDREndPntPair& endPts, float fMinErr) const noexcept +_Use_decl_annotations_ float D3DX_BC7::MapColors(const EncodeParams* pEP, + const LDRColorA aColors[], + size_t np, + size_t uIndexMode, + const LDREndPntPair& endPts, + float fMinErr) const noexcept { assert(pEP); assert(pEP->uMode < c_NumModes); _Analysis_assume_(pEP->uMode < c_NumModes); - const uint8_t uIndexPrec = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec2 : ms_aInfo[pEP->uMode].uIndexPrec; + const uint8_t uIndexPrec = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec2 : ms_aInfo[pEP->uMode].uIndexPrec; const uint8_t uIndexPrec2 = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec : ms_aInfo[pEP->uMode].uIndexPrec2; - LDRColorA aPalette[BC7_MAX_INDICES]; - float fTotalErr = 0; + LDRColorA aPalette[BC7_MAX_INDICES]; + float fTotalErr = 0; GeneratePaletteQuantized(pEP, uIndexMode, endPts, aPalette); for (size_t i = 0; i < np; ++i) { fTotalErr += ComputeError(aColors[i], aPalette, uIndexPrec, uIndexPrec2); - if (fTotalErr > fMinErr) // check for early exit + if (fTotalErr > fMinErr) // check for early exit { fTotalErr = FLT_MAX; break; @@ -3488,8 +3735,7 @@ float D3DX_BC7::MapColors(const EncodeParams* pEP, const LDRColorA aColors[], si return fTotalErr; } -_Use_decl_annotations_ -float D3DX_BC7::RoughMSE(EncodeParams* pEP, size_t uShape, size_t uIndexMode) noexcept +_Use_decl_annotations_ float D3DX_BC7::RoughMSE(EncodeParams* pEP, size_t uShape, size_t uIndexMode) noexcept { assert(pEP); assert(uShape < BC7_MAX_SHAPES); @@ -3503,12 +3749,12 @@ float D3DX_BC7::RoughMSE(EncodeParams* pEP, size_t uShape, size_t uIndexMode) no assert(uPartitions < BC7_MAX_REGIONS); _Analysis_assume_(uPartitions < BC7_MAX_REGIONS); - const uint8_t uIndexPrec = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec2 : ms_aInfo[pEP->uMode].uIndexPrec; - const uint8_t uIndexPrec2 = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec : ms_aInfo[pEP->uMode].uIndexPrec2; - const auto uNumIndices = static_cast(1u << uIndexPrec); - const auto uNumIndices2 = static_cast(1u << uIndexPrec2); - size_t auPixIdx[NUM_PIXELS_PER_BLOCK]; - LDRColorA aPalette[BC7_MAX_REGIONS][BC7_MAX_INDICES]; + const uint8_t uIndexPrec = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec2 : ms_aInfo[pEP->uMode].uIndexPrec; + const uint8_t uIndexPrec2 = uIndexMode ? ms_aInfo[pEP->uMode].uIndexPrec : ms_aInfo[pEP->uMode].uIndexPrec2; + const auto uNumIndices = static_cast(1u << uIndexPrec); + const auto uNumIndices2 = static_cast(1u << uIndexPrec2); + size_t auPixIdx[NUM_PIXELS_PER_BLOCK]; + LDRColorA aPalette[BC7_MAX_REGIONS][BC7_MAX_INDICES]; for (size_t p = 0; p <= uPartitions; p++) { @@ -3562,8 +3808,8 @@ float D3DX_BC7::RoughMSE(EncodeParams* pEP, size_t uShape, size_t uIndexMode) no epB.Clamp(0.0f, 1.0f); epA *= 255.0f; epB *= 255.0f; - aEndPts[p].A = epA.ToLDRColorA(); - aEndPts[p].B = epB.ToLDRColorA(); + aEndPts[p].A = epA.ToLDRColorA(); + aEndPts[p].B = epB.ToLDRColorA(); aEndPts[p].A.a = uMinAlpha; aEndPts[p].B.a = uMaxAlpha; } @@ -3596,7 +3842,6 @@ float D3DX_BC7::RoughMSE(EncodeParams* pEP, size_t uShape, size_t uIndexMode) no return fTotalErr; } - //===================================================================================== // Entry points //===================================================================================== @@ -3604,24 +3849,21 @@ float D3DX_BC7::RoughMSE(EncodeParams* pEP, size_t uShape, size_t uIndexMode) no //------------------------------------------------------------------------------------- // BC6H Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC6HU(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC6HU(XMVECTOR* pColor, const uint8_t* pBC) noexcept { assert(pColor && pBC); static_assert(sizeof(D3DX_BC6H) == 16, "D3DX_BC6H should be 16 bytes"); reinterpret_cast(pBC)->Decode(false, reinterpret_cast(pColor)); } -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC6HS(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC6HS(XMVECTOR* pColor, const uint8_t* pBC) noexcept { assert(pColor && pBC); static_assert(sizeof(D3DX_BC6H) == 16, "D3DX_BC6H should be 16 bytes"); reinterpret_cast(pBC)->Decode(true, reinterpret_cast(pColor)); } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC6HU(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC6HU(uint8_t* pBC, const XMVECTOR* pColor, uint32_t flags) noexcept { UNREFERENCED_PARAMETER(flags); assert(pBC && pColor); @@ -3629,8 +3871,7 @@ void DirectX::D3DXEncodeBC6HU(uint8_t *pBC, const XMVECTOR *pColor, uint32_t fla reinterpret_cast(pBC)->Encode(false, reinterpret_cast(pColor)); } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC6HS(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC6HS(uint8_t* pBC, const XMVECTOR* pColor, uint32_t flags) noexcept { UNREFERENCED_PARAMETER(flags); assert(pBC && pColor); @@ -3638,20 +3879,17 @@ void DirectX::D3DXEncodeBC6HS(uint8_t *pBC, const XMVECTOR *pColor, uint32_t fla reinterpret_cast(pBC)->Encode(true, reinterpret_cast(pColor)); } - //------------------------------------------------------------------------------------- // BC7 Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void DirectX::D3DXDecodeBC7(XMVECTOR *pColor, const uint8_t *pBC) noexcept +_Use_decl_annotations_ void DirectX::D3DXDecodeBC7(XMVECTOR* pColor, const uint8_t* pBC) noexcept { assert(pColor && pBC); static_assert(sizeof(D3DX_BC7) == 16, "D3DX_BC7 should be 16 bytes"); reinterpret_cast(pBC)->Decode(reinterpret_cast(pColor)); } -_Use_decl_annotations_ -void DirectX::D3DXEncodeBC7(uint8_t *pBC, const XMVECTOR *pColor, uint32_t flags) noexcept +_Use_decl_annotations_ void DirectX::D3DXEncodeBC7(uint8_t* pBC, const XMVECTOR* pColor, uint32_t flags) noexcept { assert(pBC && pColor); static_assert(sizeof(D3DX_BC7) == 16, "D3DX_BC7 should be 16 bytes"); diff --git a/DirectXTex/BCDirectCompute.cpp b/DirectXTex/BCDirectCompute.cpp index 7dc18c41..0b3ea85b 100644 --- a/DirectXTex/BCDirectCompute.cpp +++ b/DirectXTex/BCDirectCompute.cpp @@ -12,7 +12,7 @@ #include "BCDirectCompute.h" #if defined(_DEBUG) || defined(PROFILE) -#pragma comment(lib,"dxguid.lib") +#pragma comment(lib, "dxguid.lib") #endif using namespace DirectX; @@ -22,25 +22,25 @@ namespace { namespace cs5 { - #include "BC7Encode_EncodeBlockCS.inc" - #include "BC7Encode_TryMode02CS.inc" - #include "BC7Encode_TryMode137CS.inc" - #include "BC7Encode_TryMode456CS.inc" - #include "BC6HEncode_EncodeBlockCS.inc" - #include "BC6HEncode_TryModeG10CS.inc" - #include "BC6HEncode_TryModeLE10CS.inc" - } +#include "BC7Encode_EncodeBlockCS.inc" +#include "BC7Encode_TryMode02CS.inc" +#include "BC7Encode_TryMode137CS.inc" +#include "BC7Encode_TryMode456CS.inc" +#include "BC6HEncode_EncodeBlockCS.inc" +#include "BC6HEncode_TryModeG10CS.inc" +#include "BC6HEncode_TryModeLE10CS.inc" + } // namespace cs5 namespace cs4 { - #include "BC7Encode_EncodeBlockCS_cs40.inc" - #include "BC7Encode_TryMode02CS_cs40.inc" - #include "BC7Encode_TryMode137CS_cs40.inc" - #include "BC7Encode_TryMode456CS_cs40.inc" - #include "BC6HEncode_EncodeBlockCS_cs40.inc" - #include "BC6HEncode_TryModeG10CS_cs40.inc" - #include "BC6HEncode_TryModeLE10CS_cs40.inc" - } +#include "BC7Encode_EncodeBlockCS_cs40.inc" +#include "BC7Encode_TryMode02CS_cs40.inc" +#include "BC7Encode_TryMode137CS_cs40.inc" +#include "BC7Encode_TryMode456CS_cs40.inc" +#include "BC6HEncode_EncodeBlockCS_cs40.inc" +#include "BC6HEncode_TryModeG10CS_cs40.inc" +#include "BC6HEncode_TryModeLE10CS_cs40.inc" + } // namespace cs4 struct BufferBC6HBC7 { @@ -49,25 +49,25 @@ namespace struct ConstantsBC6HBC7 { - UINT tex_width; - UINT num_block_x; - UINT format; - UINT mode_id; - UINT start_block_id; - UINT num_total_blocks; - float alpha_weight; - UINT reserved; + UINT tex_width; + UINT num_block_x; + UINT format; + UINT mode_id; + UINT start_block_id; + UINT num_total_blocks; + float alpha_weight; + UINT reserved; }; static_assert(sizeof(ConstantsBC6HBC7) == sizeof(UINT) * 8, "Constant buffer size mismatch"); inline void RunComputeShader(ID3D11DeviceContext* pContext, - ID3D11ComputeShader* shader, - ID3D11ShaderResourceView** pSRVs, - UINT srvCount, - ID3D11Buffer* pCB, - ID3D11UnorderedAccessView* pUAV, - UINT X) + ID3D11ComputeShader* shader, + ID3D11ShaderResourceView** pSRVs, + UINT srvCount, + ID3D11Buffer* pCB, + ID3D11UnorderedAccessView* pUAV, + UINT X) { // Force UAV to nullptr before setting SRV since we are swapping buffers ID3D11UnorderedAccessView* nullUAV = nullptr; @@ -91,22 +91,20 @@ namespace ID3D11Buffer* nullBuffer[1] = { nullptr }; pContext->CSSetConstantBuffers(0, 1, nullBuffer); } -}; - -GPUCompressBC::GPUCompressBC() noexcept : - m_bcformat(DXGI_FORMAT_UNKNOWN), - m_srcformat(DXGI_FORMAT_UNKNOWN), - m_alphaWeight(1.f), - m_bc7_mode02(false), - m_bc7_mode137(false), - m_width(0), - m_height(0) +}; // namespace + +GPUCompressBC::GPUCompressBC() noexcept + : m_bcformat(DXGI_FORMAT_UNKNOWN), + m_srcformat(DXGI_FORMAT_UNKNOWN), + m_alphaWeight(1.f), + m_bc7_mode02(false), + m_bc7_mode137(false), + m_width(0), + m_height(0) {} - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT GPUCompressBC::Initialize(ID3D11Device* pDevice) +_Use_decl_annotations_ HRESULT GPUCompressBC::Initialize(ID3D11Device* pDevice) { if (!pDevice) return E_INVALIDARG; @@ -145,60 +143,59 @@ HRESULT GPUCompressBC::Initialize(ID3D11Device* pDevice) //--- Create compute shader library: BC6H ----------------------------------------- // Modes 11-14 - auto blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC6HEncode_TryModeG10CS : cs4::BC6HEncode_TryModeG10CS; - auto blobSize = (fl >= D3D_FEATURE_LEVEL_11_0) ? sizeof(cs5::BC6HEncode_TryModeG10CS) : sizeof(cs4::BC6HEncode_TryModeG10CS); - HRESULT hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC6H_tryModeG10CS.ReleaseAndGetAddressOf()); + auto blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC6HEncode_TryModeG10CS : cs4::BC6HEncode_TryModeG10CS; + auto blobSize = (fl >= D3D_FEATURE_LEVEL_11_0) ? sizeof(cs5::BC6HEncode_TryModeG10CS) : sizeof(cs4::BC6HEncode_TryModeG10CS); + HRESULT hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC6H_tryModeG10CS.ReleaseAndGetAddressOf()); if (FAILED(hr)) return hr; // Modes 1-10 - blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC6HEncode_TryModeLE10CS : cs4::BC6HEncode_TryModeLE10CS; + blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC6HEncode_TryModeLE10CS : cs4::BC6HEncode_TryModeLE10CS; blobSize = (fl >= D3D_FEATURE_LEVEL_11_0) ? sizeof(cs5::BC6HEncode_TryModeLE10CS) : sizeof(cs4::BC6HEncode_TryModeLE10CS); - hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC6H_tryModeLE10CS.ReleaseAndGetAddressOf()); + hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC6H_tryModeLE10CS.ReleaseAndGetAddressOf()); if (FAILED(hr)) return hr; // Encode - blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC6HEncode_EncodeBlockCS : cs4::BC6HEncode_EncodeBlockCS; + blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC6HEncode_EncodeBlockCS : cs4::BC6HEncode_EncodeBlockCS; blobSize = (fl >= D3D_FEATURE_LEVEL_11_0) ? sizeof(cs5::BC6HEncode_EncodeBlockCS) : sizeof(cs4::BC6HEncode_EncodeBlockCS); - hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC6H_encodeBlockCS.ReleaseAndGetAddressOf()); + hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC6H_encodeBlockCS.ReleaseAndGetAddressOf()); if (FAILED(hr)) return hr; //--- Create compute shader library: BC7 ------------------------------------------ // Modes 4, 5, 6 - blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC7Encode_TryMode456CS : cs4::BC7Encode_TryMode456CS; + blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC7Encode_TryMode456CS : cs4::BC7Encode_TryMode456CS; blobSize = (fl >= D3D_FEATURE_LEVEL_11_0) ? sizeof(cs5::BC7Encode_TryMode456CS) : sizeof(cs4::BC7Encode_TryMode456CS); - hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC7_tryMode456CS.ReleaseAndGetAddressOf()); + hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC7_tryMode456CS.ReleaseAndGetAddressOf()); if (FAILED(hr)) return hr; // Modes 1, 3, 7 - blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC7Encode_TryMode137CS : cs4::BC7Encode_TryMode137CS; + blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC7Encode_TryMode137CS : cs4::BC7Encode_TryMode137CS; blobSize = (fl >= D3D_FEATURE_LEVEL_11_0) ? sizeof(cs5::BC7Encode_TryMode137CS) : sizeof(cs4::BC7Encode_TryMode137CS); - hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC7_tryMode137CS.ReleaseAndGetAddressOf()); + hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC7_tryMode137CS.ReleaseAndGetAddressOf()); if (FAILED(hr)) return hr; // Modes 0, 2 - blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC7Encode_TryMode02CS : cs4::BC7Encode_TryMode02CS; + blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC7Encode_TryMode02CS : cs4::BC7Encode_TryMode02CS; blobSize = (fl >= D3D_FEATURE_LEVEL_11_0) ? sizeof(cs5::BC7Encode_TryMode02CS) : sizeof(cs4::BC7Encode_TryMode02CS); - hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC7_tryMode02CS.ReleaseAndGetAddressOf()); + hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC7_tryMode02CS.ReleaseAndGetAddressOf()); if (FAILED(hr)) return hr; // Encode - blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC7Encode_EncodeBlockCS : cs4::BC7Encode_EncodeBlockCS; + blob = (fl >= D3D_FEATURE_LEVEL_11_0) ? cs5::BC7Encode_EncodeBlockCS : cs4::BC7Encode_EncodeBlockCS; blobSize = (fl >= D3D_FEATURE_LEVEL_11_0) ? sizeof(cs5::BC7Encode_EncodeBlockCS) : sizeof(cs4::BC7Encode_EncodeBlockCS); - hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC7_encodeBlockCS.ReleaseAndGetAddressOf()); + hr = pDevice->CreateComputeShader(blob, blobSize, nullptr, m_BC7_encodeBlockCS.ReleaseAndGetAddressOf()); if (FAILED(hr)) return hr; return S_OK; } - //------------------------------------------------------------------------------------- HRESULT GPUCompressBC::Prepare(size_t width, size_t height, uint32_t flags, DXGI_FORMAT format, float alphaWeight) { @@ -208,24 +205,24 @@ HRESULT GPUCompressBC::Prepare(size_t width, size_t height, uint32_t flags, DXGI if ((width > UINT32_MAX) || (height > UINT32_MAX)) return E_INVALIDARG; - m_width = width; + m_width = width; m_height = height; m_alphaWeight = alphaWeight; if (flags & TEX_COMPRESS_BC7_QUICK) { - m_bc7_mode02 = false; + m_bc7_mode02 = false; m_bc7_mode137 = false; } else { - m_bc7_mode02 = (flags & TEX_COMPRESS_BC7_USE_3SUBSETS) != 0; + m_bc7_mode02 = (flags & TEX_COMPRESS_BC7_USE_3SUBSETS) != 0; m_bc7_mode137 = true; } - const size_t xblocks = std::max(1, (width + 3) >> 2); - const size_t yblocks = std::max(1, (height + 3) >> 2); + const size_t xblocks = std::max(1, (width + 3) >> 2); + const size_t yblocks = std::max(1, (height + 3) >> 2); const size_t num_blocks = xblocks * yblocks; switch (format) @@ -239,17 +236,11 @@ HRESULT GPUCompressBC::Prepare(size_t width, size_t height, uint32_t flags, DXGI // BC7 GPU compressor takes RGBA32 as input case DXGI_FORMAT_BC7_TYPELESS: - case DXGI_FORMAT_BC7_UNORM: - m_srcformat = DXGI_FORMAT_R8G8B8A8_UNORM; - break; + case DXGI_FORMAT_BC7_UNORM: m_srcformat = DXGI_FORMAT_R8G8B8A8_UNORM; break; - case DXGI_FORMAT_BC7_UNORM_SRGB: - m_srcformat = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - break; + case DXGI_FORMAT_BC7_UNORM_SRGB: m_srcformat = DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; break; - default: - m_bcformat = m_srcformat = DXGI_FORMAT_UNKNOWN; - return HRESULT_E_NOT_SUPPORTED; + default: m_bcformat = m_srcformat = DXGI_FORMAT_UNKNOWN; return HRESULT_E_NOT_SUPPORTED; } m_bcformat = format; @@ -266,12 +257,12 @@ HRESULT GPUCompressBC::Prepare(size_t width, size_t height, uint32_t flags, DXGI const auto bufferSize = static_cast(sizeInBytes); { - D3D11_BUFFER_DESC desc = {}; - desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; + D3D11_BUFFER_DESC desc = {}; + desc.BindFlags = D3D11_BIND_UNORDERED_ACCESS | D3D11_BIND_SHADER_RESOURCE; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.MiscFlags = D3D11_RESOURCE_MISC_BUFFER_STRUCTURED; desc.StructureByteStride = sizeof(BufferBC6HBC7); - desc.ByteWidth = static_cast(bufferSize); + desc.ByteWidth = static_cast(bufferSize); HRESULT hr = pDevice->CreateBuffer(&desc, nullptr, m_output.ReleaseAndGetAddressOf()); if (FAILED(hr)) @@ -295,9 +286,9 @@ HRESULT GPUCompressBC::Prepare(size_t width, size_t height, uint32_t flags, DXGI // Create staging output buffer { D3D11_BUFFER_DESC desc = {}; - desc.Usage = D3D11_USAGE_STAGING; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - desc.ByteWidth = static_cast(bufferSize); + desc.Usage = D3D11_USAGE_STAGING; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + desc.ByteWidth = static_cast(bufferSize); HRESULT hr = pDevice->CreateBuffer(&desc, nullptr, m_outputCPU.ReleaseAndGetAddressOf()); if (FAILED(hr)) @@ -309,10 +300,10 @@ HRESULT GPUCompressBC::Prepare(size_t width, size_t height, uint32_t flags, DXGI // Create constant buffer { D3D11_BUFFER_DESC desc = {}; - desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; - desc.Usage = D3D11_USAGE_DYNAMIC; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; - desc.ByteWidth = sizeof(ConstantsBC6HBC7); + desc.BindFlags = D3D11_BIND_CONSTANT_BUFFER; + desc.Usage = D3D11_USAGE_DYNAMIC; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE; + desc.ByteWidth = sizeof(ConstantsBC6HBC7); HRESULT hr = pDevice->CreateBuffer(&desc, nullptr, m_constBuffer.ReleaseAndGetAddressOf()); if (FAILED(hr)) @@ -324,8 +315,8 @@ HRESULT GPUCompressBC::Prepare(size_t width, size_t height, uint32_t flags, DXGI // Create shader resource views { D3D11_SHADER_RESOURCE_VIEW_DESC desc = {}; - desc.Buffer.NumElements = static_cast(num_blocks); - desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; + desc.Buffer.NumElements = static_cast(num_blocks); + desc.ViewDimension = D3D11_SRV_DIMENSION_BUFFER; HRESULT hr = pDevice->CreateShaderResourceView(m_err1.Get(), &desc, m_err1SRV.ReleaseAndGetAddressOf()); if (FAILED(hr)) @@ -343,8 +334,8 @@ HRESULT GPUCompressBC::Prepare(size_t width, size_t height, uint32_t flags, DXGI // Create unordered access views { D3D11_UNORDERED_ACCESS_VIEW_DESC desc = {}; - desc.Buffer.NumElements = static_cast(num_blocks); - desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; + desc.Buffer.NumElements = static_cast(num_blocks); + desc.ViewDimension = D3D11_UAV_DIMENSION_BUFFER; HRESULT hr = pDevice->CreateUnorderedAccessView(m_output.Get(), &desc, m_outputUAV.ReleaseAndGetAddressOf()); if (FAILED(hr)) @@ -368,17 +359,13 @@ HRESULT GPUCompressBC::Prepare(size_t width, size_t height, uint32_t flags, DXGI return S_OK; } - //------------------------------------------------------------------------------------- HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) { if (!srcImage.pixels || !destImage.pixels) return E_INVALIDARG; - if (srcImage.width != destImage.width - || srcImage.height != destImage.height - || srcImage.width != m_width - || srcImage.height != m_height + if (srcImage.width != destImage.width || srcImage.height != destImage.height || srcImage.width != m_width || srcImage.height != m_height || destImage.format != m_bcformat) { return E_UNEXPECTED; @@ -395,18 +382,18 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) ComPtr sourceTex; { D3D11_TEXTURE2D_DESC desc = {}; - desc.Width = static_cast(srcImage.width); - desc.Height = static_cast(srcImage.height); - desc.MipLevels = 1; - desc.ArraySize = 1; - desc.Format = inputFormat; - desc.SampleDesc.Count = 1; - desc.Usage = D3D11_USAGE_DEFAULT; - desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; + desc.Width = static_cast(srcImage.width); + desc.Height = static_cast(srcImage.height); + desc.MipLevels = 1; + desc.ArraySize = 1; + desc.Format = inputFormat; + desc.SampleDesc.Count = 1; + desc.Usage = D3D11_USAGE_DEFAULT; + desc.BindFlags = D3D11_BIND_SHADER_RESOURCE; D3D11_SUBRESOURCE_DATA initData; - initData.pSysMem = srcImage.pixels; - initData.SysMemPitch = static_cast(srcImage.rowPitch); + initData.pSysMem = srcImage.pixels; + initData.SysMemPitch = static_cast(srcImage.rowPitch); initData.SysMemSlicePitch = static_cast(srcImage.slicePitch); HRESULT hr = pDevice->CreateTexture2D(&desc, &initData, sourceTex.GetAddressOf()); @@ -419,9 +406,9 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) ComPtr sourceSRV; { D3D11_SHADER_RESOURCE_VIEW_DESC desc = {}; - desc.Texture2D.MipLevels = 1; - desc.Format = inputFormat; - desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + desc.Texture2D.MipLevels = 1; + desc.Format = inputFormat; + desc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; HRESULT hr = pDevice->CreateShaderResourceView(sourceTex.Get(), &desc, sourceSRV.GetAddressOf()); if (FAILED(hr)) @@ -436,17 +423,13 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) { case DXGI_FORMAT_BC6H_TYPELESS: case DXGI_FORMAT_BC6H_UF16: - case DXGI_FORMAT_BC6H_SF16: - break; + case DXGI_FORMAT_BC6H_SF16: break; case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - isbc7 = true; - break; + case DXGI_FORMAT_BC7_UNORM_SRGB: isbc7 = true; break; - default: - return E_UNEXPECTED; + default: return E_UNEXPECTED; } constexpr UINT MAX_BLOCK_BATCH = 64u; @@ -459,27 +442,27 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) const size_t yblocks = std::max(1, (m_height + 3) >> 2); const auto num_total_blocks = static_cast(xblocks * yblocks); - UINT num_blocks = num_total_blocks; - UINT start_block_id = 0; + UINT num_blocks = num_total_blocks; + UINT start_block_id = 0; while (num_blocks > 0) { - const UINT n = std::min(num_blocks, MAX_BLOCK_BATCH); + const UINT n = std::min(num_blocks, MAX_BLOCK_BATCH); const UINT uThreadGroupCount = n; { D3D11_MAPPED_SUBRESOURCE mapped; - HRESULT hr = pContext->Map(m_constBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); + HRESULT hr = pContext->Map(m_constBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); if (FAILED(hr)) return hr; ConstantsBC6HBC7 param; - param.tex_width = static_cast(srcImage.width); - param.num_block_x = static_cast(xblocks); - param.format = static_cast(m_bcformat); - param.mode_id = 0; - param.start_block_id = start_block_id; + param.tex_width = static_cast(srcImage.width); + param.num_block_x = static_cast(xblocks); + param.format = static_cast(m_bcformat); + param.mode_id = 0; + param.start_block_id = start_block_id; param.num_total_blocks = num_total_blocks; - param.alpha_weight = m_alphaWeight; + param.alpha_weight = m_alphaWeight; memcpy(mapped.pData, ¶m, sizeof(param)); pContext->Unmap(m_constBuffer.Get(), 0); @@ -489,8 +472,13 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) { //--- BC7 ----------------------------------------------------------------- ID3D11ShaderResourceView* pSRVs[] = { sourceSRV.Get(), nullptr }; - RunComputeShader(pContext, m_BC7_tryMode456CS.Get(), pSRVs, 2, m_constBuffer.Get(), - m_err1UAV.Get(), std::max((uThreadGroupCount + 3) / 4, 1)); + RunComputeShader(pContext, + m_BC7_tryMode456CS.Get(), + pSRVs, + 2, + m_constBuffer.Get(), + m_err1UAV.Get(), + std::max((uThreadGroupCount + 3) / 4, 1)); if (m_bc7_mode137) { @@ -503,7 +491,7 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) // Mode 7: err1 -> err2 { D3D11_MAPPED_SUBRESOURCE mapped; - HRESULT hr = pContext->Map(m_constBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); + HRESULT hr = pContext->Map(m_constBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); if (FAILED(hr)) { ResetContext(pContext); @@ -511,20 +499,25 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) } ConstantsBC6HBC7 param; - param.tex_width = static_cast(srcImage.width); - param.num_block_x = static_cast(xblocks); - param.format = static_cast(m_bcformat); - param.mode_id = modes[i]; - param.start_block_id = start_block_id; + param.tex_width = static_cast(srcImage.width); + param.num_block_x = static_cast(xblocks); + param.format = static_cast(m_bcformat); + param.mode_id = modes[i]; + param.start_block_id = start_block_id; param.num_total_blocks = num_total_blocks; - param.alpha_weight = m_alphaWeight; + param.alpha_weight = m_alphaWeight; memcpy(mapped.pData, ¶m, sizeof(param)); pContext->Unmap(m_constBuffer.Get(), 0); } pSRVs[1] = (i & 1) ? m_err2SRV.Get() : m_err1SRV.Get(); - RunComputeShader(pContext, m_BC7_tryMode137CS.Get(), pSRVs, 2, m_constBuffer.Get(), - (i & 1) ? m_err1UAV.Get() : m_err2UAV.Get(), uThreadGroupCount); + RunComputeShader(pContext, + m_BC7_tryMode137CS.Get(), + pSRVs, + 2, + m_constBuffer.Get(), + (i & 1) ? m_err1UAV.Get() : m_err2UAV.Get(), + uThreadGroupCount); } } @@ -538,7 +531,7 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) // Mode 2: err1 -> err2 { D3D11_MAPPED_SUBRESOURCE mapped; - HRESULT hr = pContext->Map(m_constBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); + HRESULT hr = pContext->Map(m_constBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); if (FAILED(hr)) { ResetContext(pContext); @@ -546,39 +539,54 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) } ConstantsBC6HBC7 param; - param.tex_width = static_cast(srcImage.width); - param.num_block_x = static_cast(xblocks); - param.format = static_cast(m_bcformat); - param.mode_id = modes[i]; - param.start_block_id = start_block_id; + param.tex_width = static_cast(srcImage.width); + param.num_block_x = static_cast(xblocks); + param.format = static_cast(m_bcformat); + param.mode_id = modes[i]; + param.start_block_id = start_block_id; param.num_total_blocks = num_total_blocks; - param.alpha_weight = m_alphaWeight; + param.alpha_weight = m_alphaWeight; memcpy(mapped.pData, ¶m, sizeof(param)); pContext->Unmap(m_constBuffer.Get(), 0); } pSRVs[1] = (i & 1) ? m_err1SRV.Get() : m_err2SRV.Get(); - RunComputeShader(pContext, m_BC7_tryMode02CS.Get(), pSRVs, 2, m_constBuffer.Get(), - (i & 1) ? m_err2UAV.Get() : m_err1UAV.Get(), uThreadGroupCount); + RunComputeShader(pContext, + m_BC7_tryMode02CS.Get(), + pSRVs, + 2, + m_constBuffer.Get(), + (i & 1) ? m_err2UAV.Get() : m_err1UAV.Get(), + uThreadGroupCount); } } pSRVs[1] = (m_bc7_mode02 || m_bc7_mode137) ? m_err2SRV.Get() : m_err1SRV.Get(); - RunComputeShader(pContext, m_BC7_encodeBlockCS.Get(), pSRVs, 2, m_constBuffer.Get(), - m_outputUAV.Get(), std::max((uThreadGroupCount + 3) / 4, 1)); + RunComputeShader(pContext, + m_BC7_encodeBlockCS.Get(), + pSRVs, + 2, + m_constBuffer.Get(), + m_outputUAV.Get(), + std::max((uThreadGroupCount + 3) / 4, 1)); } else { //--- BC6H ---------------------------------------------------------------- ID3D11ShaderResourceView* pSRVs[] = { sourceSRV.Get(), nullptr }; - RunComputeShader(pContext, m_BC6H_tryModeG10CS.Get(), pSRVs, 2, m_constBuffer.Get(), - m_err1UAV.Get(), std::max((uThreadGroupCount + 3) / 4, 1)); + RunComputeShader(pContext, + m_BC6H_tryModeG10CS.Get(), + pSRVs, + 2, + m_constBuffer.Get(), + m_err1UAV.Get(), + std::max((uThreadGroupCount + 3) / 4, 1)); for (UINT i = 0; i < 10; ++i) { { D3D11_MAPPED_SUBRESOURCE mapped; - HRESULT hr = pContext->Map(m_constBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); + HRESULT hr = pContext->Map(m_constBuffer.Get(), 0, D3D11_MAP_WRITE_DISCARD, 0, &mapped); if (FAILED(hr)) { ResetContext(pContext); @@ -586,24 +594,34 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) } ConstantsBC6HBC7 param; - param.tex_width = static_cast(srcImage.width); - param.num_block_x = static_cast(xblocks); - param.format = static_cast(m_bcformat); - param.mode_id = i; - param.start_block_id = start_block_id; + param.tex_width = static_cast(srcImage.width); + param.num_block_x = static_cast(xblocks); + param.format = static_cast(m_bcformat); + param.mode_id = i; + param.start_block_id = start_block_id; param.num_total_blocks = num_total_blocks; memcpy(mapped.pData, ¶m, sizeof(param)); pContext->Unmap(m_constBuffer.Get(), 0); } pSRVs[1] = (i & 1) ? m_err2SRV.Get() : m_err1SRV.Get(); - RunComputeShader(pContext, m_BC6H_tryModeLE10CS.Get(), pSRVs, 2, m_constBuffer.Get(), - (i & 1) ? m_err1UAV.Get() : m_err2UAV.Get(), std::max((uThreadGroupCount + 1) / 2, 1)); + RunComputeShader(pContext, + m_BC6H_tryModeLE10CS.Get(), + pSRVs, + 2, + m_constBuffer.Get(), + (i & 1) ? m_err1UAV.Get() : m_err2UAV.Get(), + std::max((uThreadGroupCount + 1) / 2, 1)); } pSRVs[1] = m_err1SRV.Get(); - RunComputeShader(pContext, m_BC6H_encodeBlockCS.Get(), pSRVs, 2, m_constBuffer.Get(), - m_outputUAV.Get(), std::max((uThreadGroupCount + 1) / 2, 1)); + RunComputeShader(pContext, + m_BC6H_encodeBlockCS.Get(), + pSRVs, + 2, + m_constBuffer.Get(), + m_outputUAV.Get(), + std::max((uThreadGroupCount + 1) / 2, 1)); } start_block_id += n; @@ -617,11 +635,11 @@ HRESULT GPUCompressBC::Compress(const Image& srcImage, const Image& destImage) pContext->CopyResource(m_outputCPU.Get(), m_output.Get()); D3D11_MAPPED_SUBRESOURCE mapped; - HRESULT hr = pContext->Map(m_outputCPU.Get(), 0, D3D11_MAP_READ, 0, &mapped); + HRESULT hr = pContext->Map(m_outputCPU.Get(), 0, D3D11_MAP_READ, 0, &mapped); if (SUCCEEDED(hr)) { - auto pSrc = static_cast(mapped.pData); - uint8_t *pDest = destImage.pixels; + auto pSrc = static_cast(mapped.pData); + uint8_t* pDest = destImage.pixels; const size_t pitch = xblocks * sizeof(BufferBC6HBC7); diff --git a/DirectXTex/BCDirectCompute.h b/DirectXTex/BCDirectCompute.h index ae025b5d..7adf64c5 100644 --- a/DirectXTex/BCDirectCompute.h +++ b/DirectXTex/BCDirectCompute.h @@ -17,11 +17,11 @@ namespace DirectX public: GPUCompressBC() noexcept; - GPUCompressBC(GPUCompressBC&&) = default; - GPUCompressBC& operator= (GPUCompressBC&&) = default; + GPUCompressBC(GPUCompressBC&&) = default; + GPUCompressBC& operator=(GPUCompressBC&&) = default; - GPUCompressBC(GPUCompressBC const&) = delete; - GPUCompressBC& operator= (GPUCompressBC const&) = delete; + GPUCompressBC(GPUCompressBC const&) = delete; + GPUCompressBC& operator=(GPUCompressBC const&) = delete; HRESULT Initialize(_In_ ID3D11Device* pDevice); @@ -32,39 +32,39 @@ namespace DirectX DXGI_FORMAT GetSourceFormat() const noexcept { return m_srcformat; } private: - DXGI_FORMAT m_bcformat; - DXGI_FORMAT m_srcformat; - float m_alphaWeight; - bool m_bc7_mode02; - bool m_bc7_mode137; - size_t m_width; - size_t m_height; - - Microsoft::WRL::ComPtr m_device; - Microsoft::WRL::ComPtr m_context; - - Microsoft::WRL::ComPtr m_err1; - Microsoft::WRL::ComPtr m_err1UAV; - Microsoft::WRL::ComPtr m_err1SRV; - - Microsoft::WRL::ComPtr m_err2; - Microsoft::WRL::ComPtr m_err2UAV; - Microsoft::WRL::ComPtr m_err2SRV; - - Microsoft::WRL::ComPtr m_output; - Microsoft::WRL::ComPtr m_outputCPU; - Microsoft::WRL::ComPtr m_outputUAV; - Microsoft::WRL::ComPtr m_constBuffer; + DXGI_FORMAT m_bcformat; + DXGI_FORMAT m_srcformat; + float m_alphaWeight; + bool m_bc7_mode02; + bool m_bc7_mode137; + size_t m_width; + size_t m_height; + + Microsoft::WRL::ComPtr m_device; + Microsoft::WRL::ComPtr m_context; + + Microsoft::WRL::ComPtr m_err1; + Microsoft::WRL::ComPtr m_err1UAV; + Microsoft::WRL::ComPtr m_err1SRV; + + Microsoft::WRL::ComPtr m_err2; + Microsoft::WRL::ComPtr m_err2UAV; + Microsoft::WRL::ComPtr m_err2SRV; + + Microsoft::WRL::ComPtr m_output; + Microsoft::WRL::ComPtr m_outputCPU; + Microsoft::WRL::ComPtr m_outputUAV; + Microsoft::WRL::ComPtr m_constBuffer; // Compute shader library - Microsoft::WRL::ComPtr m_BC6H_tryModeG10CS; - Microsoft::WRL::ComPtr m_BC6H_tryModeLE10CS; - Microsoft::WRL::ComPtr m_BC6H_encodeBlockCS; - - Microsoft::WRL::ComPtr m_BC7_tryMode456CS; - Microsoft::WRL::ComPtr m_BC7_tryMode137CS; - Microsoft::WRL::ComPtr m_BC7_tryMode02CS; - Microsoft::WRL::ComPtr m_BC7_encodeBlockCS; + Microsoft::WRL::ComPtr m_BC6H_tryModeG10CS; + Microsoft::WRL::ComPtr m_BC6H_tryModeLE10CS; + Microsoft::WRL::ComPtr m_BC6H_encodeBlockCS; + + Microsoft::WRL::ComPtr m_BC7_tryMode456CS; + Microsoft::WRL::ComPtr m_BC7_tryMode137CS; + Microsoft::WRL::ComPtr m_BC7_tryMode02CS; + Microsoft::WRL::ComPtr m_BC7_encodeBlockCS; }; -} // namespace +} // namespace DirectX diff --git a/DirectXTex/DirectXTex.h b/DirectXTex/DirectXTex.h index f77691d7..1d90cae4 100644 --- a/DirectXTex/DirectXTex.h +++ b/DirectXTex/DirectXTex.h @@ -51,13 +51,13 @@ struct IWICMetadataQueryReader; #if defined(_WIN32) && defined(DIRECTX_TEX_EXPORT) #ifdef __GNUC__ -#define DIRECTX_TEX_API __attribute__ ((dllexport)) +#define DIRECTX_TEX_API __attribute__((dllexport)) #else #define DIRECTX_TEX_API __declspec(dllexport) #endif #elif defined(_WIN32) && defined(DIRECTX_TEX_IMPORT) #ifdef __GNUC__ -#define DIRECTX_TEX_API __attribute__ ((dllimport)) +#define DIRECTX_TEX_API __attribute__((dllimport)) #else #define DIRECTX_TEX_API __declspec(dllimport) #endif @@ -71,15 +71,15 @@ namespace DirectX //--------------------------------------------------------------------------------- // DXGI Format Utilities DIRECTX_TEX_API constexpr bool __cdecl IsValid(_In_ DXGI_FORMAT fmt) noexcept; - DIRECTX_TEX_API bool __cdecl IsCompressed(_In_ DXGI_FORMAT fmt) noexcept; - DIRECTX_TEX_API bool __cdecl IsPacked(_In_ DXGI_FORMAT fmt) noexcept; - DIRECTX_TEX_API bool __cdecl IsVideo(_In_ DXGI_FORMAT fmt) noexcept; - DIRECTX_TEX_API bool __cdecl IsPlanar(_In_ DXGI_FORMAT fmt, _In_ bool isd3d12 = false) noexcept; - DIRECTX_TEX_API bool __cdecl IsPalettized(_In_ DXGI_FORMAT fmt) noexcept; - DIRECTX_TEX_API bool __cdecl IsDepthStencil(_In_ DXGI_FORMAT fmt) noexcept; - DIRECTX_TEX_API bool __cdecl IsSRGB(_In_ DXGI_FORMAT fmt) noexcept; - DIRECTX_TEX_API bool __cdecl IsBGR(_In_ DXGI_FORMAT fmt) noexcept; - DIRECTX_TEX_API bool __cdecl IsTypeless(_In_ DXGI_FORMAT fmt, _In_ bool partialTypeless = true) noexcept; + DIRECTX_TEX_API bool __cdecl IsCompressed(_In_ DXGI_FORMAT fmt) noexcept; + DIRECTX_TEX_API bool __cdecl IsPacked(_In_ DXGI_FORMAT fmt) noexcept; + DIRECTX_TEX_API bool __cdecl IsVideo(_In_ DXGI_FORMAT fmt) noexcept; + DIRECTX_TEX_API bool __cdecl IsPlanar(_In_ DXGI_FORMAT fmt, _In_ bool isd3d12 = false) noexcept; + DIRECTX_TEX_API bool __cdecl IsPalettized(_In_ DXGI_FORMAT fmt) noexcept; + DIRECTX_TEX_API bool __cdecl IsDepthStencil(_In_ DXGI_FORMAT fmt) noexcept; + DIRECTX_TEX_API bool __cdecl IsSRGB(_In_ DXGI_FORMAT fmt) noexcept; + DIRECTX_TEX_API bool __cdecl IsBGR(_In_ DXGI_FORMAT fmt) noexcept; + DIRECTX_TEX_API bool __cdecl IsTypeless(_In_ DXGI_FORMAT fmt, _In_ bool partialTypeless = true) noexcept; DIRECTX_TEX_API bool __cdecl HasAlpha(_In_ DXGI_FORMAT fmt) noexcept; @@ -137,15 +137,18 @@ namespace DirectX // Don't allow pixel allocations in excess of 4GB (always true for 32-bit) }; - DIRECTX_TEX_API HRESULT __cdecl ComputePitch( - _In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, - _Out_ size_t& rowPitch, _Out_ size_t& slicePitch, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; + DIRECTX_TEX_API HRESULT __cdecl ComputePitch(_In_ DXGI_FORMAT fmt, + _In_ size_t width, + _In_ size_t height, + _Out_ size_t& rowPitch, + _Out_ size_t& slicePitch, + _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; DIRECTX_TEX_API size_t __cdecl ComputeScanlines(_In_ DXGI_FORMAT fmt, _In_ size_t height) noexcept; DIRECTX_TEX_API bool __cdecl CalculateMipLevels(_In_ size_t width, _In_ size_t height, _Inout_ size_t& mipLevels) noexcept; - DIRECTX_TEX_API bool __cdecl CalculateMipLevels3D(_In_ size_t width, _In_ size_t height, _In_ size_t depth, - _Inout_ size_t& mipLevels) noexcept; + DIRECTX_TEX_API bool __cdecl + CalculateMipLevels3D(_In_ size_t width, _In_ size_t height, _In_ size_t depth, _Inout_ size_t& mipLevels) noexcept; DIRECTX_TEX_API DXGI_FORMAT __cdecl MakeSRGB(_In_ DXGI_FORMAT fmt) noexcept; DIRECTX_TEX_API DXGI_FORMAT __cdecl MakeLinear(_In_ DXGI_FORMAT fmt) noexcept; @@ -156,7 +159,7 @@ namespace DirectX //--------------------------------------------------------------------------------- // Texture metadata enum TEX_DIMENSION : uint32_t - // Subset here matches D3D10_RESOURCE_DIMENSION and D3D11_RESOURCE_DIMENSION + // Subset here matches D3D10_RESOURCE_DIMENSION and D3D11_RESOURCE_DIMENSION { TEX_DIMENSION_TEXTURE1D = 2, TEX_DIMENSION_TEXTURE2D = 3, @@ -164,7 +167,7 @@ namespace DirectX }; enum TEX_MISC_FLAG : uint32_t - // Subset here matches D3D10_RESOURCE_MISC_FLAG and D3D11_RESOURCE_MISC_FLAG + // Subset here matches D3D10_RESOURCE_MISC_FLAG and D3D11_RESOURCE_MISC_FLAG { TEX_MISC_TEXTURECUBE = 0x4L, }; @@ -175,56 +178,59 @@ namespace DirectX }; enum TEX_ALPHA_MODE : uint32_t - // Matches DDS_ALPHA_MODE, encoded in MISC_FLAGS2 + // Matches DDS_ALPHA_MODE, encoded in MISC_FLAGS2 { - TEX_ALPHA_MODE_UNKNOWN = 0, - TEX_ALPHA_MODE_STRAIGHT = 1, + TEX_ALPHA_MODE_UNKNOWN = 0, + TEX_ALPHA_MODE_STRAIGHT = 1, TEX_ALPHA_MODE_PREMULTIPLIED = 2, - TEX_ALPHA_MODE_OPAQUE = 3, - TEX_ALPHA_MODE_CUSTOM = 4, + TEX_ALPHA_MODE_OPAQUE = 3, + TEX_ALPHA_MODE_CUSTOM = 4, }; struct DIRECTX_TEX_API TexMetadata { - size_t width; - size_t height; // Should be 1 for 1D textures - size_t depth; // Should be 1 for 1D or 2D textures - size_t arraySize; // For cubemap, this is a multiple of 6 - size_t mipLevels; - uint32_t miscFlags; - uint32_t miscFlags2; - DXGI_FORMAT format; - TEX_DIMENSION dimension; + size_t width; + size_t height; // Should be 1 for 1D textures + size_t depth; // Should be 1 for 1D or 2D textures + size_t arraySize; // For cubemap, this is a multiple of 6 + size_t mipLevels; + uint32_t miscFlags; + uint32_t miscFlags2; + DXGI_FORMAT format; + TEX_DIMENSION dimension; size_t __cdecl ComputeIndex(size_t mip, size_t item, size_t slice) const noexcept; - // Returns size_t(-1) to indicate an out-of-range error + // Returns size_t(-1) to indicate an out-of-range error bool __cdecl IsCubemap() const noexcept { return (miscFlags & TEX_MISC_TEXTURECUBE) != 0; } - // Helper for miscFlags + // Helper for miscFlags bool __cdecl IsPMAlpha() const noexcept { return ((miscFlags2 & TEX_MISC2_ALPHA_MODE_MASK) == TEX_ALPHA_MODE_PREMULTIPLIED) != 0; } - void __cdecl SetAlphaMode(TEX_ALPHA_MODE mode) noexcept { miscFlags2 = (miscFlags2 & ~static_cast(TEX_MISC2_ALPHA_MODE_MASK)) | static_cast(mode); } + void __cdecl SetAlphaMode(TEX_ALPHA_MODE mode) noexcept + { + miscFlags2 = (miscFlags2 & ~static_cast(TEX_MISC2_ALPHA_MODE_MASK)) | static_cast(mode); + } TEX_ALPHA_MODE __cdecl GetAlphaMode() const noexcept { return static_cast(miscFlags2 & TEX_MISC2_ALPHA_MODE_MASK); } - // Helpers for miscFlags2 + // Helpers for miscFlags2 bool __cdecl IsVolumemap() const noexcept { return (dimension == TEX_DIMENSION_TEXTURE3D); } - // Helper for dimension + // Helper for dimension uint32_t __cdecl CalculateSubresource(size_t mip, size_t item) const noexcept; uint32_t __cdecl CalculateSubresource(size_t mip, size_t item, size_t plane) const noexcept; - // Returns size_t(-1) to indicate an out-of-range error + // Returns size_t(-1) to indicate an out-of-range error }; struct DIRECTX_TEX_API DDSMetaData { - uint32_t size; // DDPIXELFORMAT.dwSize - uint32_t flags; // DDPIXELFORMAT.dwFlags - uint32_t fourCC; // DDPIXELFORMAT.dwFourCC - uint32_t RGBBitCount; // DDPIXELFORMAT.dwRGBBitCount/dwYUVBitCount/dwAlphaBitDepth/dwLuminanceBitCount/dwBumpBitCount - uint32_t RBitMask; // DDPIXELFORMAT.dwRBitMask/dwYBitMask/dwLuminanceBitMask/dwBumpDuBitMask - uint32_t GBitMask; // DDPIXELFORMAT.dwGBitMask/dwUBitMask/dwBumpDvBitMask - uint32_t BBitMask; // DDPIXELFORMAT.dwBBitMask/dwVBitMask/dwBumpLuminanceBitMask - uint32_t ABitMask; // DDPIXELFORMAT.dwRGBAlphaBitMask/dwYUVAlphaBitMask/dwLuminanceAlphaBitMask + uint32_t size; // DDPIXELFORMAT.dwSize + uint32_t flags; // DDPIXELFORMAT.dwFlags + uint32_t fourCC; // DDPIXELFORMAT.dwFourCC + uint32_t RGBBitCount; // DDPIXELFORMAT.dwRGBBitCount/dwYUVBitCount/dwAlphaBitDepth/dwLuminanceBitCount/dwBumpBitCount + uint32_t RBitMask; // DDPIXELFORMAT.dwRBitMask/dwYBitMask/dwLuminanceBitMask/dwBumpDuBitMask + uint32_t GBitMask; // DDPIXELFORMAT.dwGBitMask/dwUBitMask/dwBumpDvBitMask + uint32_t BBitMask; // DDPIXELFORMAT.dwBBitMask/dwVBitMask/dwBumpLuminanceBitMask + uint32_t ABitMask; // DDPIXELFORMAT.dwRGBAlphaBitMask/dwYUVAlphaBitMask/dwLuminanceAlphaBitMask bool __cdecl IsDX10() const noexcept { return (fourCC == 0x30315844); } }; @@ -339,99 +345,86 @@ namespace DirectX WIC_FLAGS_DITHER_DIFFUSION = 0x20000, // Use error-diffusion dithering for any required conversions - WIC_FLAGS_FILTER_POINT = 0x100000, + WIC_FLAGS_FILTER_POINT = 0x100000, WIC_FLAGS_FILTER_LINEAR = 0x200000, - WIC_FLAGS_FILTER_CUBIC = 0x300000, - WIC_FLAGS_FILTER_FANT = 0x400000, // Combination of Linear and Box filter - // Filtering mode to use for any required image resizing (only needed when loading arrays of differently sized images; defaults to Fant) + WIC_FLAGS_FILTER_CUBIC = 0x300000, + WIC_FLAGS_FILTER_FANT = 0x400000, // Combination of Linear and Box filter + // Filtering mode to use for any required image resizing (only needed when loading arrays of + // differently sized images; defaults to Fant) }; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _In_ DDS_FLAGS flags, - _Out_ TexMetadata& metadata) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSFile( - _In_z_ const wchar_t* szFile, - _In_ DDS_FLAGS flags, - _Out_ TexMetadata& metadata) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemoryEx( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _In_ DDS_FLAGS flags, - _Out_ TexMetadata& metadata, - _Out_opt_ DDSMetaData* ddPixelFormat) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSFileEx( - _In_z_ const wchar_t* szFile, - _In_ DDS_FLAGS flags, - _Out_ TexMetadata& metadata, - _Out_opt_ DDSMetaData* ddPixelFormat) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromHDRMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _Out_ TexMetadata& metadata) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromHDRFile( - _In_z_ const wchar_t* szFile, - _Out_ TexMetadata& metadata) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromTGAMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _In_ TGA_FLAGS flags, - _Out_ TexMetadata& metadata) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromTGAFile( - _In_z_ const wchar_t* szFile, - _In_ TGA_FLAGS flags, - _Out_ TexMetadata& metadata) noexcept; + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _In_ DDS_FLAGS flags, + _Out_ TexMetadata& metadata) noexcept; + DIRECTX_TEX_API HRESULT __cdecl + GetMetadataFromDDSFile(_In_z_ const wchar_t* szFile, _In_ DDS_FLAGS flags, _Out_ TexMetadata& metadata) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemoryEx(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _In_ DDS_FLAGS flags, + _Out_ TexMetadata& metadata, + _Out_opt_ DDSMetaData* ddPixelFormat) noexcept; + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSFileEx(_In_z_ const wchar_t* szFile, + _In_ DDS_FLAGS flags, + _Out_ TexMetadata& metadata, + _Out_opt_ DDSMetaData* ddPixelFormat) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl + GetMetadataFromHDRMemory(_In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, _Out_ TexMetadata& metadata) noexcept; + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromHDRFile(_In_z_ const wchar_t* szFile, _Out_ TexMetadata& metadata) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromTGAMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _In_ TGA_FLAGS flags, + _Out_ TexMetadata& metadata) noexcept; + DIRECTX_TEX_API HRESULT __cdecl + GetMetadataFromTGAFile(_In_z_ const wchar_t* szFile, _In_ TGA_FLAGS flags, _Out_ TexMetadata& metadata) noexcept; #ifdef _WIN32 - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromWICMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _In_ WIC_FLAGS flags, - _Out_ TexMetadata& metadata, + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromWICMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _In_ WIC_FLAGS flags, + _Out_ TexMetadata& metadata, _In_ std::function getMQR = nullptr); - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromWICFile( - _In_z_ const wchar_t* szFile, - _In_ WIC_FLAGS flags, - _Out_ TexMetadata& metadata, + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromWICFile(_In_z_ const wchar_t* szFile, + _In_ WIC_FLAGS flags, + _Out_ TexMetadata& metadata, _In_ std::function getMQR = nullptr); #endif // Compatability helpers - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromTGAMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _Out_ TexMetadata& metadata) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromTGAFile( - _In_z_ const wchar_t* szFile, - _Out_ TexMetadata& metadata) noexcept; + DIRECTX_TEX_API HRESULT __cdecl + GetMetadataFromTGAMemory(_In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, _Out_ TexMetadata& metadata) noexcept; + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromTGAFile(_In_z_ const wchar_t* szFile, _Out_ TexMetadata& metadata) noexcept; #ifdef __cpp_lib_byte - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _In_ DDS_FLAGS flags, - _Out_ TexMetadata& metadata) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemoryEx( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _In_ DDS_FLAGS flags, - _Out_ TexMetadata& metadata, - _Out_opt_ DDSMetaData* ddPixelFormat) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromHDRMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _Out_ TexMetadata& metadata) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromTGAMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _In_ TGA_FLAGS flags, - _Out_ TexMetadata& metadata) noexcept; + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemory(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _In_ DDS_FLAGS flags, + _Out_ TexMetadata& metadata) noexcept; + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromDDSMemoryEx(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _In_ DDS_FLAGS flags, + _Out_ TexMetadata& metadata, + _Out_opt_ DDSMetaData* ddPixelFormat) noexcept; + DIRECTX_TEX_API HRESULT __cdecl + GetMetadataFromHDRMemory(_In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, _Out_ TexMetadata& metadata) noexcept; + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromTGAMemory(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _In_ TGA_FLAGS flags, + _Out_ TexMetadata& metadata) noexcept; #ifdef _WIN32 - DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromWICMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _In_ WIC_FLAGS flags, - _Out_ TexMetadata& metadata, + DIRECTX_TEX_API HRESULT __cdecl GetMetadataFromWICMemory(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _In_ WIC_FLAGS flags, + _Out_ TexMetadata& metadata, _In_ std::function getMQR = nullptr); #endif #endif // __cpp_lib_byte - //--------------------------------------------------------------------------------- // Bitmap image container struct Image @@ -448,44 +441,78 @@ namespace DirectX { public: ScratchImage() noexcept - : m_nimages(0), m_size(0), m_metadata{}, m_image(nullptr), m_memory(nullptr) + : m_nimages(0), + m_size(0), + m_metadata{}, + m_image(nullptr), + m_memory(nullptr) {} ScratchImage(ScratchImage&& moveFrom) noexcept - : m_nimages(0), m_size(0), m_metadata{}, m_image(nullptr), m_memory(nullptr) + : m_nimages(0), + m_size(0), + m_metadata{}, + m_image(nullptr), + m_memory(nullptr) { *this = std::move(moveFrom); } ~ScratchImage() { Release(); } - ScratchImage& __cdecl operator= (ScratchImage&& moveFrom) noexcept; + ScratchImage& __cdecl operator=(ScratchImage&& moveFrom) noexcept; - ScratchImage(const ScratchImage&) = delete; + ScratchImage(const ScratchImage&) = delete; ScratchImage& operator=(const ScratchImage&) = delete; HRESULT __cdecl Initialize(_In_ const TexMetadata& mdata, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; - HRESULT __cdecl Initialize1D(_In_ DXGI_FORMAT fmt, _In_ size_t length, _In_ size_t arraySize, _In_ size_t mipLevels, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; - HRESULT __cdecl Initialize2D(_In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, _In_ size_t arraySize, _In_ size_t mipLevels, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; - HRESULT __cdecl Initialize3D(_In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, _In_ size_t depth, _In_ size_t mipLevels, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; - HRESULT __cdecl InitializeCube(_In_ DXGI_FORMAT fmt, _In_ size_t width, _In_ size_t height, _In_ size_t nCubes, _In_ size_t mipLevels, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; - - HRESULT __cdecl InitializeFromImage(_In_ const Image& srcImage, _In_ bool allow1D = false, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; - HRESULT __cdecl InitializeArrayFromImages(_In_reads_(nImages) const Image* images, _In_ size_t nImages, _In_ bool allow1D = false, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; - HRESULT __cdecl InitializeCubeFromImages(_In_reads_(nImages) const Image* images, _In_ size_t nImages, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; - HRESULT __cdecl Initialize3DFromImages(_In_reads_(depth) const Image* images, _In_ size_t depth, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; + HRESULT __cdecl Initialize1D(_In_ DXGI_FORMAT fmt, + _In_ size_t length, + _In_ size_t arraySize, + _In_ size_t mipLevels, + _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; + HRESULT __cdecl Initialize2D(_In_ DXGI_FORMAT fmt, + _In_ size_t width, + _In_ size_t height, + _In_ size_t arraySize, + _In_ size_t mipLevels, + _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; + HRESULT __cdecl Initialize3D(_In_ DXGI_FORMAT fmt, + _In_ size_t width, + _In_ size_t height, + _In_ size_t depth, + _In_ size_t mipLevels, + _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; + HRESULT __cdecl InitializeCube(_In_ DXGI_FORMAT fmt, + _In_ size_t width, + _In_ size_t height, + _In_ size_t nCubes, + _In_ size_t mipLevels, + _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; + + HRESULT __cdecl + InitializeFromImage(_In_ const Image& srcImage, _In_ bool allow1D = false, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; + HRESULT __cdecl InitializeArrayFromImages(_In_reads_(nImages) const Image* images, + _In_ size_t nImages, + _In_ bool allow1D = false, + _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; + HRESULT __cdecl InitializeCubeFromImages(_In_reads_(nImages) const Image* images, + _In_ size_t nImages, + _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; + HRESULT __cdecl + Initialize3DFromImages(_In_reads_(depth) const Image* images, _In_ size_t depth, _In_ CP_FLAGS flags = CP_FLAGS_NONE) noexcept; void __cdecl Release() noexcept; bool __cdecl OverrideFormat(_In_ DXGI_FORMAT f) noexcept; const TexMetadata& __cdecl GetMetadata() const noexcept { return m_metadata; } - const Image* __cdecl GetImage(_In_ size_t mip, _In_ size_t item, _In_ size_t slice) const noexcept; + const Image* __cdecl GetImage(_In_ size_t mip, _In_ size_t item, _In_ size_t slice) const noexcept; const Image* __cdecl GetImages() const noexcept { return m_image; } - size_t __cdecl GetImageCount() const noexcept { return m_nimages; } + size_t __cdecl GetImageCount() const noexcept { return m_nimages; } uint8_t* __cdecl GetPixels() const noexcept { return m_memory; } - size_t __cdecl GetPixelsSize() const noexcept { return m_size; } + size_t __cdecl GetPixelsSize() const noexcept { return m_size; } bool __cdecl IsAlphaAllOpaque() const noexcept; @@ -502,13 +529,21 @@ namespace DirectX class DIRECTX_TEX_API Blob { public: - Blob() noexcept : m_buffer(nullptr), m_size(0) {} - Blob(Blob&& moveFrom) noexcept : m_buffer(nullptr), m_size(0) { *this = std::move(moveFrom); } + Blob() noexcept + : m_buffer(nullptr), + m_size(0) + {} + Blob(Blob&& moveFrom) noexcept + : m_buffer(nullptr), + m_size(0) + { + *this = std::move(moveFrom); + } ~Blob() { Release(); } - Blob& __cdecl operator= (Blob&& moveFrom) noexcept; + Blob& __cdecl operator=(Blob&& moveFrom) noexcept; - Blob(const Blob&) = delete; + Blob(const Blob&) = delete; Blob& operator=(const Blob&) = delete; HRESULT __cdecl Initialize(_In_ size_t size) noexcept; @@ -522,10 +557,10 @@ namespace DirectX size_t __cdecl GetBufferSize() const noexcept { return m_size; } HRESULT __cdecl Resize(size_t size) noexcept; - // Reallocate for a new size + // Reallocate for a new size HRESULT __cdecl Trim(size_t size) noexcept; - // Shorten size without reallocation + // Shorten size without reallocation private: uint8_t* m_buffer; @@ -543,176 +578,194 @@ namespace DirectX TileShape() = default; - #if defined(__d3d11_2_h__) || defined(__d3d11_x_h__) - TileShape(const D3D11_TILE_SHAPE& tile) : - width(tile.WidthInTexels), - height(tile.HeightInTexels), - depth(tile.DepthInTexels) +#if defined(__d3d11_2_h__) || defined(__d3d11_x_h__) + TileShape(const D3D11_TILE_SHAPE& tile) + : width(tile.WidthInTexels), + height(tile.HeightInTexels), + depth(tile.DepthInTexels) {} void GetTileShape11(D3D11_TILE_SHAPE& tile) const { - tile.WidthInTexels = static_cast(width); + tile.WidthInTexels = static_cast(width); tile.HeightInTexels = static_cast(height); - tile.DepthInTexels = static_cast(depth); + tile.DepthInTexels = static_cast(depth); } - #endif +#endif - #if defined(__d3d12_h__) || defined(__d3d12_x_h__) || defined(__XBOX_D3D12_X__) - TileShape(const D3D12_TILE_SHAPE& tile) : - width(tile.WidthInTexels), - height(tile.HeightInTexels), - depth(tile.DepthInTexels) +#if defined(__d3d12_h__) || defined(__d3d12_x_h__) || defined(__XBOX_D3D12_X__) + TileShape(const D3D12_TILE_SHAPE& tile) + : width(tile.WidthInTexels), + height(tile.HeightInTexels), + depth(tile.DepthInTexels) {} void GetTileShape12(D3D12_TILE_SHAPE& tile) const { - tile.WidthInTexels = static_cast(width); + tile.WidthInTexels = static_cast(width); tile.HeightInTexels = static_cast(height); - tile.DepthInTexels = static_cast(depth); + tile.DepthInTexels = static_cast(depth); } - #endif +#endif }; - DIRECTX_TEX_API HRESULT __cdecl ComputeTileShape(_In_ DXGI_FORMAT fmt, _In_ TEX_DIMENSION dimension, - _Out_ TileShape& tiling) noexcept; + DIRECTX_TEX_API HRESULT __cdecl ComputeTileShape(_In_ DXGI_FORMAT fmt, _In_ TEX_DIMENSION dimension, _Out_ TileShape& tiling) noexcept; //--------------------------------------------------------------------------------- // Image I/O // DDS operations - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _In_ DDS_FLAGS flags, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSFile( - _In_z_ const wchar_t* szFile, - _In_ DDS_FLAGS flags, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemoryEx( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _In_ DDS_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_opt_ DDSMetaData* ddPixelFormat, - _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSFileEx( - _In_z_ const wchar_t* szFile, - _In_ DDS_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_opt_ DDSMetaData* ddPixelFormat, - _Out_ ScratchImage& image) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl SaveToDDSMemory( - _In_ const Image& image, - _In_ DDS_FLAGS flags, - _Out_ Blob& blob) noexcept; - DIRECTX_TEX_API HRESULT __cdecl SaveToDDSMemory( - _In_reads_(nimages) const Image* images, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DDS_FLAGS flags, - _Out_ Blob& blob) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _In_ DDS_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSFile(_In_z_ const wchar_t* szFile, + _In_ DDS_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemoryEx(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _In_ DDS_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_opt_ DDSMetaData* ddPixelFormat, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSFileEx(_In_z_ const wchar_t* szFile, + _In_ DDS_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_opt_ DDSMetaData* ddPixelFormat, + _Out_ ScratchImage& image) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl SaveToDDSMemory(_In_ const Image& image, _In_ DDS_FLAGS flags, _Out_ Blob& blob) noexcept; + DIRECTX_TEX_API HRESULT __cdecl SaveToDDSMemory(_In_reads_(nimages) const Image* images, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DDS_FLAGS flags, + _Out_ Blob& blob) noexcept; DIRECTX_TEX_API HRESULT __cdecl SaveToDDSFile(_In_ const Image& image, _In_ DDS_FLAGS flags, _In_z_ const wchar_t* szFile) noexcept; - DIRECTX_TEX_API HRESULT __cdecl SaveToDDSFile( - _In_reads_(nimages) const Image* images, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DDS_FLAGS flags, _In_z_ const wchar_t* szFile) noexcept; + DIRECTX_TEX_API HRESULT __cdecl SaveToDDSFile(_In_reads_(nimages) const Image* images, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DDS_FLAGS flags, + _In_z_ const wchar_t* szFile) noexcept; // HDR operations - DIRECTX_TEX_API HRESULT __cdecl LoadFromHDRMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl LoadFromHDRFile( - _In_z_ const wchar_t* szFile, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromHDRMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl + LoadFromHDRFile(_In_z_ const wchar_t* szFile, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; DIRECTX_TEX_API HRESULT __cdecl SaveToHDRMemory(_In_ const Image& image, _Out_ Blob& blob) noexcept; DIRECTX_TEX_API HRESULT __cdecl SaveToHDRFile(_In_ const Image& image, _In_z_ const wchar_t* szFile) noexcept; // TGA operations - DIRECTX_TEX_API HRESULT __cdecl LoadFromTGAMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _In_ TGA_FLAGS flags, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl LoadFromTGAFile( - _In_z_ const wchar_t* szFile, - _In_ TGA_FLAGS flags, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromTGAMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _In_ TGA_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromTGAFile(_In_z_ const wchar_t* szFile, + _In_ TGA_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept; DIRECTX_TEX_API HRESULT __cdecl SaveToTGAMemory(_In_ const Image& image, - _In_ TGA_FLAGS flags, - _Out_ Blob& blob, _In_opt_ const TexMetadata* metadata = nullptr) noexcept; + _In_ TGA_FLAGS flags, + _Out_ Blob& blob, + _In_opt_ const TexMetadata* metadata = nullptr) noexcept; DIRECTX_TEX_API HRESULT __cdecl SaveToTGAFile(_In_ const Image& image, - _In_ TGA_FLAGS flags, - _In_z_ const wchar_t* szFile, _In_opt_ const TexMetadata* metadata = nullptr) noexcept; + _In_ TGA_FLAGS flags, + _In_z_ const wchar_t* szFile, + _In_opt_ const TexMetadata* metadata = nullptr) noexcept; // WIC operations #ifdef _WIN32 - DIRECTX_TEX_API HRESULT __cdecl LoadFromWICMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _In_ WIC_FLAGS flags, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image, + DIRECTX_TEX_API HRESULT __cdecl LoadFromWICMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _In_ WIC_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image, _In_ std::function getMQR = nullptr); - DIRECTX_TEX_API HRESULT __cdecl LoadFromWICFile( - _In_z_ const wchar_t* szFile, _In_ WIC_FLAGS flags, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image, + DIRECTX_TEX_API HRESULT __cdecl LoadFromWICFile(_In_z_ const wchar_t* szFile, + _In_ WIC_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image, _In_ std::function getMQR = nullptr); - DIRECTX_TEX_API HRESULT __cdecl SaveToWICMemory( - _In_ const Image& image, _In_ WIC_FLAGS flags, _In_ REFGUID guidContainerFormat, - _Out_ Blob& blob, _In_opt_ const GUID* targetFormat = nullptr, - _In_ std::function setCustomProps = nullptr); - DIRECTX_TEX_API HRESULT __cdecl SaveToWICMemory( - _In_count_(nimages) const Image* images, _In_ size_t nimages, - _In_ WIC_FLAGS flags, _In_ REFGUID guidContainerFormat, - _Out_ Blob& blob, _In_opt_ const GUID* targetFormat = nullptr, - _In_ std::function setCustomProps = nullptr); - - DIRECTX_TEX_API HRESULT __cdecl SaveToWICFile( - _In_ const Image& image, _In_ WIC_FLAGS flags, _In_ REFGUID guidContainerFormat, - _In_z_ const wchar_t* szFile, _In_opt_ const GUID* targetFormat = nullptr, - _In_ std::function setCustomProps = nullptr); - DIRECTX_TEX_API HRESULT __cdecl SaveToWICFile( - _In_count_(nimages) const Image* images, _In_ size_t nimages, - _In_ WIC_FLAGS flags, _In_ REFGUID guidContainerFormat, - _In_z_ const wchar_t* szFile, _In_opt_ const GUID* targetFormat = nullptr, - _In_ std::function setCustomProps = nullptr); + DIRECTX_TEX_API HRESULT __cdecl SaveToWICMemory(_In_ const Image& image, + _In_ WIC_FLAGS flags, + _In_ REFGUID guidContainerFormat, + _Out_ Blob& blob, + _In_opt_ const GUID* targetFormat = nullptr, + _In_ std::function setCustomProps = nullptr); + DIRECTX_TEX_API HRESULT __cdecl SaveToWICMemory(_In_count_(nimages) const Image* images, + _In_ size_t nimages, + _In_ WIC_FLAGS flags, + _In_ REFGUID guidContainerFormat, + _Out_ Blob& blob, + _In_opt_ const GUID* targetFormat = nullptr, + _In_ std::function setCustomProps = nullptr); + + DIRECTX_TEX_API HRESULT __cdecl SaveToWICFile(_In_ const Image& image, + _In_ WIC_FLAGS flags, + _In_ REFGUID guidContainerFormat, + _In_z_ const wchar_t* szFile, + _In_opt_ const GUID* targetFormat = nullptr, + _In_ std::function setCustomProps = nullptr); + DIRECTX_TEX_API HRESULT __cdecl SaveToWICFile(_In_count_(nimages) const Image* images, + _In_ size_t nimages, + _In_ WIC_FLAGS flags, + _In_ REFGUID guidContainerFormat, + _In_z_ const wchar_t* szFile, + _In_opt_ const GUID* targetFormat = nullptr, + _In_ std::function setCustomProps = nullptr); #endif // WIN32 // Compatability helpers - DIRECTX_TEX_API HRESULT __cdecl LoadFromTGAMemory( - _In_reads_bytes_(size) const uint8_t* pSource, _In_ size_t size, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl LoadFromTGAFile( - _In_z_ const wchar_t* szFile, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl SaveToTGAMemory(_In_ const Image& image, _Out_ Blob& blob, _In_opt_ const TexMetadata* metadata = nullptr) noexcept; - DIRECTX_TEX_API HRESULT __cdecl SaveToTGAFile(_In_ const Image& image, _In_z_ const wchar_t* szFile, _In_opt_ const TexMetadata* metadata = nullptr) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromTGAMemory(_In_reads_bytes_(size) const uint8_t* pSource, + _In_ size_t size, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl + LoadFromTGAFile(_In_z_ const wchar_t* szFile, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl + SaveToTGAMemory(_In_ const Image& image, _Out_ Blob& blob, _In_opt_ const TexMetadata* metadata = nullptr) noexcept; + DIRECTX_TEX_API HRESULT __cdecl + SaveToTGAFile(_In_ const Image& image, _In_z_ const wchar_t* szFile, _In_opt_ const TexMetadata* metadata = nullptr) noexcept; #ifdef __cpp_lib_byte - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _In_ DDS_FLAGS flags, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemoryEx( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _In_ DDS_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_opt_ DDSMetaData* ddPixelFormat, - _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl LoadFromHDRMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl LoadFromTGAMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _In_ TGA_FLAGS flags, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemory(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _In_ DDS_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromDDSMemoryEx(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _In_ DDS_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_opt_ DDSMetaData* ddPixelFormat, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromHDRMemory(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl LoadFromTGAMemory(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _In_ TGA_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept; #ifdef _WIN32 - DIRECTX_TEX_API HRESULT __cdecl LoadFromWICMemory( - _In_reads_bytes_(size) const std::byte* pSource, _In_ size_t size, - _In_ WIC_FLAGS flags, - _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image, + DIRECTX_TEX_API HRESULT __cdecl LoadFromWICMemory(_In_reads_bytes_(size) const std::byte* pSource, + _In_ size_t size, + _In_ WIC_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image, _In_ std::function getMQR = nullptr); #endif #endif // __cpp_lib_byte @@ -722,34 +775,36 @@ namespace DirectX enum TEX_FR_FLAGS : uint32_t { - TEX_FR_ROTATE0 = 0, - TEX_FR_ROTATE90 = 0x1, - TEX_FR_ROTATE180 = 0x2, - TEX_FR_ROTATE270 = 0x3, + TEX_FR_ROTATE0 = 0, + TEX_FR_ROTATE90 = 0x1, + TEX_FR_ROTATE180 = 0x2, + TEX_FR_ROTATE270 = 0x3, TEX_FR_FLIP_HORIZONTAL = 0x08, - TEX_FR_FLIP_VERTICAL = 0x10, + TEX_FR_FLIP_VERTICAL = 0x10, }; #ifdef _WIN32 DIRECTX_TEX_API HRESULT __cdecl FlipRotate(_In_ const Image& srcImage, _In_ TEX_FR_FLAGS flags, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl FlipRotate( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ TEX_FR_FLAGS flags, _Out_ ScratchImage& result) noexcept; - // Flip and/or rotate image + DIRECTX_TEX_API HRESULT __cdecl FlipRotate(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ TEX_FR_FLAGS flags, + _Out_ ScratchImage& result) noexcept; + // Flip and/or rotate image #endif enum TEX_FILTER_FLAGS : uint32_t { TEX_FILTER_DEFAULT = 0, - TEX_FILTER_WRAP_U = 0x1, - TEX_FILTER_WRAP_V = 0x2, - TEX_FILTER_WRAP_W = 0x4, - TEX_FILTER_WRAP = (TEX_FILTER_WRAP_U | TEX_FILTER_WRAP_V | TEX_FILTER_WRAP_W), + TEX_FILTER_WRAP_U = 0x1, + TEX_FILTER_WRAP_V = 0x2, + TEX_FILTER_WRAP_W = 0x4, + TEX_FILTER_WRAP = (TEX_FILTER_WRAP_U | TEX_FILTER_WRAP_V | TEX_FILTER_WRAP_W), TEX_FILTER_MIRROR_U = 0x10, TEX_FILTER_MIRROR_V = 0x20, TEX_FILTER_MIRROR_W = 0x40, - TEX_FILTER_MIRROR = (TEX_FILTER_MIRROR_U | TEX_FILTER_MIRROR_V | TEX_FILTER_MIRROR_W), + TEX_FILTER_MIRROR = (TEX_FILTER_MIRROR_U | TEX_FILTER_MIRROR_V | TEX_FILTER_MIRROR_W), // Wrap vs. Mirror vs. Clamp filtering options TEX_FILTER_SEPARATE_ALPHA = 0x100, @@ -758,9 +813,9 @@ namespace DirectX TEX_FILTER_FLOAT_X2BIAS = 0x200, // Enable *2 - 1 conversion cases for unorm<->float and positive-only float formats - TEX_FILTER_RGB_COPY_RED = 0x1000, + TEX_FILTER_RGB_COPY_RED = 0x1000, TEX_FILTER_RGB_COPY_GREEN = 0x2000, - TEX_FILTER_RGB_COPY_BLUE = 0x4000, + TEX_FILTER_RGB_COPY_BLUE = 0x4000, TEX_FILTER_RGB_COPY_ALPHA = 0x8000, // When converting RGB(A) to R, defaults to using grayscale. These flags indicate copying a specific channel instead // When converting RGB(A) to RG, defaults to copying RED | GREEN. These flags control which channels are selected instead. @@ -770,17 +825,17 @@ namespace DirectX TEX_FILTER_DITHER_DIFFUSION = 0x20000, // Use error-diffusion dithering for any required conversions - TEX_FILTER_POINT = 0x100000, - TEX_FILTER_LINEAR = 0x200000, - TEX_FILTER_CUBIC = 0x300000, - TEX_FILTER_BOX = 0x400000, - TEX_FILTER_FANT = 0x400000, // Equiv to Box filtering for mipmap generation + TEX_FILTER_POINT = 0x100000, + TEX_FILTER_LINEAR = 0x200000, + TEX_FILTER_CUBIC = 0x300000, + TEX_FILTER_BOX = 0x400000, + TEX_FILTER_FANT = 0x400000, // Equiv to Box filtering for mipmap generation TEX_FILTER_TRIANGLE = 0x500000, // Filtering mode to use for any required image resizing - TEX_FILTER_SRGB_IN = 0x1000000, + TEX_FILTER_SRGB_IN = 0x1000000, TEX_FILTER_SRGB_OUT = 0x2000000, - TEX_FILTER_SRGB = (TEX_FILTER_SRGB_IN | TEX_FILTER_SRGB_OUT), + TEX_FILTER_SRGB = (TEX_FILTER_SRGB_IN | TEX_FILTER_SRGB_OUT), // sRGB <-> RGB for use in conversion operations // if the input format type is IsSRGB(), then SRGB_IN is on by default // if the output format type is IsSRGB(), then SRGB_OUT is on by default @@ -793,21 +848,26 @@ namespace DirectX }; constexpr uint32_t TEX_FILTER_DITHER_MASK = 0xF0000; - constexpr uint32_t TEX_FILTER_MODE_MASK = 0xF00000; - constexpr uint32_t TEX_FILTER_SRGB_MASK = 0xF000000; - - DIRECTX_TEX_API HRESULT __cdecl Resize( - _In_ const Image& srcImage, _In_ size_t width, _In_ size_t height, - _In_ TEX_FILTER_FLAGS filter, - _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl Resize( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ size_t width, _In_ size_t height, _In_ TEX_FILTER_FLAGS filter, _Out_ ScratchImage& result) noexcept; - // Resize the image to width x height. Defaults to Fant filtering. - // Note for a complex resize, the result will always have mipLevels == 1 + constexpr uint32_t TEX_FILTER_MODE_MASK = 0xF00000; + constexpr uint32_t TEX_FILTER_SRGB_MASK = 0xF000000; + + DIRECTX_TEX_API HRESULT __cdecl Resize(_In_ const Image& srcImage, + _In_ size_t width, + _In_ size_t height, + _In_ TEX_FILTER_FLAGS filter, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl Resize(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ size_t width, + _In_ size_t height, + _In_ TEX_FILTER_FLAGS filter, + _Out_ ScratchImage& result) noexcept; + // Resize the image to width x height. Defaults to Fant filtering. + // Note for a complex resize, the result will always have mipLevels == 1 constexpr float TEX_THRESHOLD_DEFAULT = 0.5f; - // Default value for alpha threshold used when converting to 1-bit alpha + // Default value for alpha threshold used when converting to 1-bit alpha struct ConvertOptions { @@ -815,51 +875,74 @@ namespace DirectX float threshold; }; - DIRECTX_TEX_API HRESULT __cdecl Convert( - _In_ const Image& srcImage, _In_ DXGI_FORMAT format, _In_ TEX_FILTER_FLAGS filter, _In_ float threshold, - _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl Convert( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DXGI_FORMAT format, _In_ TEX_FILTER_FLAGS filter, _In_ float threshold, _Out_ ScratchImage& result) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl ConvertEx( - _In_ const Image& srcImage, _In_ DXGI_FORMAT format, _In_ const ConvertOptions& options, - _Out_ ScratchImage& image, + DIRECTX_TEX_API HRESULT __cdecl Convert(_In_ const Image& srcImage, + _In_ DXGI_FORMAT format, + _In_ TEX_FILTER_FLAGS filter, + _In_ float threshold, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl Convert(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DXGI_FORMAT format, + _In_ TEX_FILTER_FLAGS filter, + _In_ float threshold, + _Out_ ScratchImage& result) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl ConvertEx(_In_ const Image& srcImage, + _In_ DXGI_FORMAT format, + _In_ const ConvertOptions& options, + _Out_ ScratchImage& image, _In_ std::function statusCallBack = nullptr); - DIRECTX_TEX_API HRESULT __cdecl ConvertEx( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DXGI_FORMAT format, _In_ const ConvertOptions& options, _Out_ ScratchImage& result, + DIRECTX_TEX_API HRESULT __cdecl ConvertEx(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DXGI_FORMAT format, + _In_ const ConvertOptions& options, + _Out_ ScratchImage& result, _In_ std::function statusCallBack = nullptr); - // Convert the image to a new format + // Convert the image to a new format DIRECTX_TEX_API HRESULT __cdecl ConvertToSinglePlane(_In_ const Image& srcImage, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl ConvertToSinglePlane( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _Out_ ScratchImage& image) noexcept; - // Converts the image from a planar format to an equivalent non-planar format - - DIRECTX_TEX_API HRESULT __cdecl GenerateMipMaps( - _In_ const Image& baseImage, _In_ TEX_FILTER_FLAGS filter, _In_ size_t levels, - _Inout_ ScratchImage& mipChain, _In_ bool allow1D = false) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GenerateMipMaps( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ TEX_FILTER_FLAGS filter, _In_ size_t levels, _Inout_ ScratchImage& mipChain); - // levels of '0' indicates a full mipchain, otherwise is generates that number of total levels (including the source base image) - // Defaults to Fant filtering which is equivalent to a box filter - - DIRECTX_TEX_API HRESULT __cdecl GenerateMipMaps3D( - _In_reads_(depth) const Image* baseImages, _In_ size_t depth, _In_ TEX_FILTER_FLAGS filter, _In_ size_t levels, - _Out_ ScratchImage& mipChain) noexcept; - DIRECTX_TEX_API HRESULT __cdecl GenerateMipMaps3D( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ TEX_FILTER_FLAGS filter, _In_ size_t levels, _Out_ ScratchImage& mipChain); - // levels of '0' indicates a full mipchain, otherwise is generates that number of total levels (including the source base image) - // Defaults to Fant filtering which is equivalent to a box filter - - DIRECTX_TEX_API HRESULT __cdecl ScaleMipMapsAlphaForCoverage( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, _In_ size_t item, - _In_ float alphaReference, _Inout_ ScratchImage& mipChain) noexcept; - + DIRECTX_TEX_API HRESULT __cdecl ConvertToSinglePlane(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _Out_ ScratchImage& image) noexcept; + // Converts the image from a planar format to an equivalent non-planar format + + DIRECTX_TEX_API HRESULT __cdecl GenerateMipMaps(_In_ const Image& baseImage, + _In_ TEX_FILTER_FLAGS filter, + _In_ size_t levels, + _Inout_ ScratchImage& mipChain, + _In_ bool allow1D = false) noexcept; + DIRECTX_TEX_API HRESULT __cdecl GenerateMipMaps(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ TEX_FILTER_FLAGS filter, + _In_ size_t levels, + _Inout_ ScratchImage& mipChain); + // levels of '0' indicates a full mipchain, otherwise is generates that number of total levels (including the source base image) + // Defaults to Fant filtering which is equivalent to a box filter + + DIRECTX_TEX_API HRESULT __cdecl GenerateMipMaps3D(_In_reads_(depth) const Image* baseImages, + _In_ size_t depth, + _In_ TEX_FILTER_FLAGS filter, + _In_ size_t levels, + _Out_ ScratchImage& mipChain) noexcept; + DIRECTX_TEX_API HRESULT __cdecl GenerateMipMaps3D(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ TEX_FILTER_FLAGS filter, + _In_ size_t levels, + _Out_ ScratchImage& mipChain); + // levels of '0' indicates a full mipchain, otherwise is generates that number of total levels (including the source base image) + // Defaults to Fant filtering which is equivalent to a box filter + + DIRECTX_TEX_API HRESULT __cdecl ScaleMipMapsAlphaForCoverage(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ size_t item, + _In_ float alphaReference, + _Inout_ ScratchImage& mipChain) noexcept; enum TEX_PMALPHA_FLAGS : uint32_t { @@ -871,18 +954,21 @@ namespace DirectX TEX_PMALPHA_REVERSE = 0x2, // converts from premultiplied alpha back to straight alpha - TEX_PMALPHA_SRGB_IN = 0x1000000, + TEX_PMALPHA_SRGB_IN = 0x1000000, TEX_PMALPHA_SRGB_OUT = 0x2000000, - TEX_PMALPHA_SRGB = (TEX_PMALPHA_SRGB_IN | TEX_PMALPHA_SRGB_OUT), + TEX_PMALPHA_SRGB = (TEX_PMALPHA_SRGB_IN | TEX_PMALPHA_SRGB_OUT), // if the input format type is IsSRGB(), then SRGB_IN is on by default // if the output format type is IsSRGB(), then SRGB_OUT is on by default }; - DIRECTX_TEX_API HRESULT __cdecl PremultiplyAlpha(_In_ const Image& srcImage, _In_ TEX_PMALPHA_FLAGS flags, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl PremultiplyAlpha( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ TEX_PMALPHA_FLAGS flags, _Out_ ScratchImage& result) noexcept; - // Converts to/from a premultiplied alpha version of the texture + DIRECTX_TEX_API HRESULT __cdecl + PremultiplyAlpha(_In_ const Image& srcImage, _In_ TEX_PMALPHA_FLAGS flags, _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl PremultiplyAlpha(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ TEX_PMALPHA_FLAGS flags, + _Out_ ScratchImage& result) noexcept; + // Converts to/from a premultiplied alpha version of the texture enum TEX_COMPRESS_FLAGS : uint32_t { @@ -906,9 +992,9 @@ namespace DirectX TEX_COMPRESS_BC7_QUICK = 0x100000, // Minimal modes (usually mode 6) for BC7 compression - TEX_COMPRESS_SRGB_IN = 0x1000000, + TEX_COMPRESS_SRGB_IN = 0x1000000, TEX_COMPRESS_SRGB_OUT = 0x2000000, - TEX_COMPRESS_SRGB = (TEX_COMPRESS_SRGB_IN | TEX_COMPRESS_SRGB_OUT), + TEX_COMPRESS_SRGB = (TEX_COMPRESS_SRGB_IN | TEX_COMPRESS_SRGB_OUT), // if the input format type is IsSRGB(), then SRGB_IN is on by default // if the output format type is IsSRGB(), then SRGB_OUT is on by default @@ -917,7 +1003,7 @@ namespace DirectX }; constexpr float TEX_ALPHA_WEIGHT_DEFAULT = 1.0f; - // Default value for alpha weight used for GPU BC7 compression + // Default value for alpha weight used for GPU BC7 compression struct CompressOptions { @@ -926,46 +1012,72 @@ namespace DirectX float alphaWeight; }; - DIRECTX_TEX_API HRESULT __cdecl Compress( - _In_ const Image& srcImage, _In_ DXGI_FORMAT format, _In_ TEX_COMPRESS_FLAGS compress, _In_ float threshold, - _Out_ ScratchImage& cImage) noexcept; - DIRECTX_TEX_API HRESULT __cdecl Compress( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DXGI_FORMAT format, _In_ TEX_COMPRESS_FLAGS compress, _In_ float threshold, _Out_ ScratchImage& cImages) noexcept; - // Note that threshold is only used by BC1. TEX_THRESHOLD_DEFAULT is a typical value to use - - DIRECTX_TEX_API HRESULT __cdecl CompressEx( - _In_ const Image& srcImage, _In_ DXGI_FORMAT format, _In_ const CompressOptions& options, - _Out_ ScratchImage& cImage, + DIRECTX_TEX_API HRESULT __cdecl Compress(_In_ const Image& srcImage, + _In_ DXGI_FORMAT format, + _In_ TEX_COMPRESS_FLAGS compress, + _In_ float threshold, + _Out_ ScratchImage& cImage) noexcept; + DIRECTX_TEX_API HRESULT __cdecl Compress(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DXGI_FORMAT format, + _In_ TEX_COMPRESS_FLAGS compress, + _In_ float threshold, + _Out_ ScratchImage& cImages) noexcept; + // Note that threshold is only used by BC1. TEX_THRESHOLD_DEFAULT is a typical value to use + + DIRECTX_TEX_API HRESULT __cdecl CompressEx(_In_ const Image& srcImage, + _In_ DXGI_FORMAT format, + _In_ const CompressOptions& options, + _Out_ ScratchImage& cImage, _In_ std::function statusCallBack = nullptr); - DIRECTX_TEX_API HRESULT __cdecl CompressEx( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DXGI_FORMAT format, _In_ const CompressOptions& options, _Out_ ScratchImage& cImages, + DIRECTX_TEX_API HRESULT __cdecl CompressEx(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DXGI_FORMAT format, + _In_ const CompressOptions& options, + _Out_ ScratchImage& cImages, _In_ std::function statusCallBack = nullptr); #if defined(__d3d11_h__) || defined(__d3d11_x_h__) - DIRECTX_TEX_API HRESULT __cdecl Compress( - _In_ ID3D11Device* pDevice, _In_ const Image& srcImage, _In_ DXGI_FORMAT format, _In_ TEX_COMPRESS_FLAGS compress, - _In_ float alphaWeight, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl Compress( - _In_ ID3D11Device* pDevice, _In_ const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DXGI_FORMAT format, _In_ TEX_COMPRESS_FLAGS compress, _In_ float alphaWeight, _Out_ ScratchImage& cImages) noexcept; - // DirectCompute-based compression (alphaWeight is only used by BC7. 1.0 is the typical value to use) - - DIRECTX_TEX_API HRESULT __cdecl CompressEx( - _In_ ID3D11Device* pDevice, _In_ const Image& srcImage, _In_ DXGI_FORMAT format, _In_ const CompressOptions& options, - _Out_ ScratchImage& image, + DIRECTX_TEX_API HRESULT __cdecl Compress(_In_ ID3D11Device* pDevice, + _In_ const Image& srcImage, + _In_ DXGI_FORMAT format, + _In_ TEX_COMPRESS_FLAGS compress, + _In_ float alphaWeight, + _Out_ ScratchImage& image) noexcept; + DIRECTX_TEX_API HRESULT __cdecl Compress(_In_ ID3D11Device* pDevice, + _In_ const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DXGI_FORMAT format, + _In_ TEX_COMPRESS_FLAGS compress, + _In_ float alphaWeight, + _Out_ ScratchImage& cImages) noexcept; + // DirectCompute-based compression (alphaWeight is only used by BC7. 1.0 is the typical value to use) + + DIRECTX_TEX_API HRESULT __cdecl CompressEx(_In_ ID3D11Device* pDevice, + _In_ const Image& srcImage, + _In_ DXGI_FORMAT format, + _In_ const CompressOptions& options, + _Out_ ScratchImage& image, _In_ std::function statusCallBack = nullptr); - DIRECTX_TEX_API HRESULT __cdecl CompressEx( - _In_ ID3D11Device* pDevice, _In_ const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DXGI_FORMAT format, _In_ const CompressOptions& options, _Out_ ScratchImage& cImages, + DIRECTX_TEX_API HRESULT __cdecl CompressEx(_In_ ID3D11Device* pDevice, + _In_ const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DXGI_FORMAT format, + _In_ const CompressOptions& options, + _Out_ ScratchImage& cImages, _In_ std::function statusCallBack = nullptr); #endif DIRECTX_TEX_API HRESULT __cdecl Decompress(_In_ const Image& cImage, _In_ DXGI_FORMAT format, _Out_ ScratchImage& image) noexcept; - DIRECTX_TEX_API HRESULT __cdecl Decompress( - _In_reads_(nimages) const Image* cImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DXGI_FORMAT format, _Out_ ScratchImage& images) noexcept; + DIRECTX_TEX_API HRESULT __cdecl Decompress(_In_reads_(nimages) const Image* cImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DXGI_FORMAT format, + _Out_ ScratchImage& images) noexcept; //--------------------------------------------------------------------------------- // Normal map operations @@ -974,17 +1086,17 @@ namespace DirectX { CNMAP_DEFAULT = 0, - CNMAP_CHANNEL_RED = 0x1, - CNMAP_CHANNEL_GREEN = 0x2, - CNMAP_CHANNEL_BLUE = 0x3, - CNMAP_CHANNEL_ALPHA = 0x4, + CNMAP_CHANNEL_RED = 0x1, + CNMAP_CHANNEL_GREEN = 0x2, + CNMAP_CHANNEL_BLUE = 0x3, + CNMAP_CHANNEL_ALPHA = 0x4, CNMAP_CHANNEL_LUMINANCE = 0x5, // Channel selection when evaluting color value for height // Luminance is a combination of red, green, and blue CNMAP_MIRROR_U = 0x1000, CNMAP_MIRROR_V = 0x2000, - CNMAP_MIRROR = 0x3000, + CNMAP_MIRROR = 0x3000, // Use mirror semantics for scanline references (defaults to wrap) CNMAP_INVERT_SIGN = 0x4000, @@ -994,12 +1106,18 @@ namespace DirectX // Computes a crude occlusion term stored in the alpha channel }; - DIRECTX_TEX_API HRESULT __cdecl ComputeNormalMap( - _In_ const Image& srcImage, _In_ CNMAP_FLAGS flags, _In_ float amplitude, - _In_ DXGI_FORMAT format, _Out_ ScratchImage& normalMap) noexcept; - DIRECTX_TEX_API HRESULT __cdecl ComputeNormalMap( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ CNMAP_FLAGS flags, _In_ float amplitude, _In_ DXGI_FORMAT format, _Out_ ScratchImage& normalMaps) noexcept; + DIRECTX_TEX_API HRESULT __cdecl ComputeNormalMap(_In_ const Image& srcImage, + _In_ CNMAP_FLAGS flags, + _In_ float amplitude, + _In_ DXGI_FORMAT format, + _Out_ ScratchImage& normalMap) noexcept; + DIRECTX_TEX_API HRESULT __cdecl ComputeNormalMap(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ CNMAP_FLAGS flags, + _In_ float amplitude, + _In_ DXGI_FORMAT format, + _Out_ ScratchImage& normalMaps) noexcept; //--------------------------------------------------------------------------------- // Misc image operations @@ -1012,12 +1130,20 @@ namespace DirectX size_t h; Rect() = default; - Rect(size_t _x, size_t _y, size_t _w, size_t _h) noexcept : x(_x), y(_y), w(_w), h(_h) {} + Rect(size_t _x, size_t _y, size_t _w, size_t _h) noexcept + : x(_x), + y(_y), + w(_w), + h(_h) + {} }; - DIRECTX_TEX_API HRESULT __cdecl CopyRectangle( - _In_ const Image& srcImage, _In_ const Rect& srcRect, _In_ const Image& dstImage, - _In_ TEX_FILTER_FLAGS filter, _In_ size_t xOffset, _In_ size_t yOffset) noexcept; + DIRECTX_TEX_API HRESULT __cdecl CopyRectangle(_In_ const Image& srcImage, + _In_ const Rect& srcRect, + _In_ const Image& dstImage, + _In_ TEX_FILTER_FLAGS filter, + _In_ size_t xOffset, + _In_ size_t yOffset) noexcept; enum CMSE_FLAGS : uint32_t { @@ -1027,9 +1153,9 @@ namespace DirectX CMSE_IMAGE2_SRGB = 0x2, // Indicates that image needs gamma correction before comparision - CMSE_IGNORE_RED = 0x10, + CMSE_IGNORE_RED = 0x10, CMSE_IGNORE_GREEN = 0x20, - CMSE_IGNORE_BLUE = 0x40, + CMSE_IGNORE_BLUE = 0x40, CMSE_IGNORE_ALPHA = 0x80, // Ignore the channel when computing MSE @@ -1038,24 +1164,30 @@ namespace DirectX // Indicates that image should be scaled and biased before comparison (i.e. UNORM -> SNORM) }; - DIRECTX_TEX_API HRESULT __cdecl ComputeMSE(_In_ const Image& image1, _In_ const Image& image2, _Out_ float& mse, _Out_writes_opt_(4) float* mseV, _In_ CMSE_FLAGS flags = CMSE_DEFAULT) noexcept; + DIRECTX_TEX_API HRESULT __cdecl ComputeMSE(_In_ const Image& image1, + _In_ const Image& image2, + _Out_ float& mse, + _Out_writes_opt_(4) float* mseV, + _In_ CMSE_FLAGS flags = CMSE_DEFAULT) noexcept; - DIRECTX_TEX_API HRESULT __cdecl EvaluateImage( - _In_ const Image& image, + DIRECTX_TEX_API HRESULT __cdecl EvaluateImage(_In_ const Image& image, _In_ std::function pixelFunc); - DIRECTX_TEX_API HRESULT __cdecl EvaluateImage( - _In_reads_(nimages) const Image* images, _In_ size_t nimages, _In_ const TexMetadata& metadata, + DIRECTX_TEX_API HRESULT __cdecl EvaluateImage(_In_reads_(nimages) const Image* images, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, _In_ std::function pixelFunc); - DIRECTX_TEX_API HRESULT __cdecl TransformImage( - _In_ const Image& image, - _In_ std::function pixelFunc, + DIRECTX_TEX_API HRESULT __cdecl TransformImage(_In_ const Image& image, + _In_ std::function< + void __cdecl(_Out_writes_(width) XMVECTOR* outPixels, _In_reads_(width) const XMVECTOR* inPixels, size_t width, size_t y)> + pixelFunc, ScratchImage& result); - DIRECTX_TEX_API HRESULT __cdecl TransformImage( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ std::function pixelFunc, + DIRECTX_TEX_API HRESULT __cdecl TransformImage(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ std::function< + void __cdecl(_Out_writes_(width) XMVECTOR* outPixels, _In_reads_(width) const XMVECTOR* inPixels, size_t width, size_t y)> + pixelFunc, ScratchImage& result); //--------------------------------------------------------------------------------- @@ -1063,39 +1195,42 @@ namespace DirectX #ifdef _WIN32 enum WICCodecs : uint32_t { - WIC_CODEC_BMP = 1, // Windows Bitmap (.bmp) - WIC_CODEC_JPEG, // Joint Photographic Experts Group (.jpg, .jpeg) - WIC_CODEC_PNG, // Portable Network Graphics (.png) - WIC_CODEC_TIFF, // Tagged Image File Format (.tif, .tiff) - WIC_CODEC_GIF, // Graphics Interchange Format (.gif) - WIC_CODEC_WMP, // Windows Media Photo / HD Photo / JPEG XR (.hdp, .jxr, .wdp) - WIC_CODEC_ICO, // Windows Icon (.ico) - WIC_CODEC_HEIF, // High Efficiency Image File (.heif, .heic) + WIC_CODEC_BMP = 1, // Windows Bitmap (.bmp) + WIC_CODEC_JPEG, // Joint Photographic Experts Group (.jpg, .jpeg) + WIC_CODEC_PNG, // Portable Network Graphics (.png) + WIC_CODEC_TIFF, // Tagged Image File Format (.tif, .tiff) + WIC_CODEC_GIF, // Graphics Interchange Format (.gif) + WIC_CODEC_WMP, // Windows Media Photo / HD Photo / JPEG XR (.hdp, .jxr, .wdp) + WIC_CODEC_ICO, // Windows Icon (.ico) + WIC_CODEC_HEIF, // High Efficiency Image File (.heif, .heic) }; DIRECTX_TEX_API REFGUID __cdecl GetWICCodec(_In_ WICCodecs codec) noexcept; DIRECTX_TEX_API IWICImagingFactory* __cdecl GetWICFactory(bool& iswic2) noexcept; - DIRECTX_TEX_API void __cdecl SetWICFactory(_In_opt_ IWICImagingFactory* pWIC) noexcept; + DIRECTX_TEX_API void __cdecl SetWICFactory(_In_opt_ IWICImagingFactory* pWIC) noexcept; #endif //--------------------------------------------------------------------------------- // DDS helper functions - DIRECTX_TEX_API HRESULT __cdecl EncodeDDSHeader( - _In_ const TexMetadata& metadata, DDS_FLAGS flags, - _Out_writes_bytes_to_opt_(maxsize, required) uint8_t* pDestination, _In_ size_t maxsize, - _Out_ size_t& required) noexcept; + DIRECTX_TEX_API HRESULT __cdecl EncodeDDSHeader(_In_ const TexMetadata& metadata, + DDS_FLAGS flags, + _Out_writes_bytes_to_opt_(maxsize, required) uint8_t* pDestination, + _In_ size_t maxsize, + _Out_ size_t& required) noexcept; #ifdef __cpp_lib_byte - DIRECTX_TEX_API HRESULT __cdecl EncodeDDSHeader( - _In_ const TexMetadata& metadata, DDS_FLAGS flags, - _Out_writes_bytes_to_opt_(maxsize, required) std::byte* pDestination, _In_ size_t maxsize, - _Out_ size_t& required) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl EncodeDDSHeader( - _In_ const TexMetadata& metadata, DDS_FLAGS flags, - _Reserved_ std::nullptr_t, _In_ size_t maxsize, - _Out_ size_t& required) noexcept; + DIRECTX_TEX_API HRESULT __cdecl EncodeDDSHeader(_In_ const TexMetadata& metadata, + DDS_FLAGS flags, + _Out_writes_bytes_to_opt_(maxsize, required) std::byte* pDestination, + _In_ size_t maxsize, + _Out_ size_t& required) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl EncodeDDSHeader(_In_ const TexMetadata& metadata, + DDS_FLAGS flags, + _Reserved_ std::nullptr_t, + _In_ size_t maxsize, + _Out_ size_t& required) noexcept; #endif //--------------------------------------------------------------------------------- @@ -1103,8 +1238,8 @@ namespace DirectX enum CREATETEX_FLAGS : uint32_t { - CREATETEX_DEFAULT = 0, - CREATETEX_FORCE_SRGB = 0x1, + CREATETEX_DEFAULT = 0, + CREATETEX_FORCE_SRGB = 0x1, CREATETEX_IGNORE_SRGB = 0x2, }; @@ -1112,50 +1247,71 @@ namespace DirectX #if defined(__d3d11_h__) || defined(__d3d11_x_h__) DIRECTX_TEX_API bool __cdecl IsSupportedTexture(_In_ ID3D11Device* pDevice, _In_ const TexMetadata& metadata) noexcept; - DIRECTX_TEX_API HRESULT __cdecl CreateTexture( - _In_ ID3D11Device* pDevice, _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _Outptr_ ID3D11Resource** ppResource) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl CreateShaderResourceView( - _In_ ID3D11Device* pDevice, _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _Outptr_ ID3D11ShaderResourceView** ppSRV) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl CreateTextureEx( - _In_ ID3D11Device* pDevice, _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ D3D11_USAGE usage, _In_ unsigned int bindFlags, _In_ unsigned int cpuAccessFlags, _In_ unsigned int miscFlags, _In_ CREATETEX_FLAGS flags, - _Outptr_ ID3D11Resource** ppResource) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl CreateShaderResourceViewEx( - _In_ ID3D11Device* pDevice, _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ D3D11_USAGE usage, _In_ unsigned int bindFlags, _In_ unsigned int cpuAccessFlags, _In_ unsigned int miscFlags, _In_ CREATETEX_FLAGS flags, - _Outptr_ ID3D11ShaderResourceView** ppSRV) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl CaptureTexture(_In_ ID3D11Device* pDevice, _In_ ID3D11DeviceContext* pContext, _In_ ID3D11Resource* pSource, _Out_ ScratchImage& result) noexcept; + DIRECTX_TEX_API HRESULT __cdecl CreateTexture(_In_ ID3D11Device* pDevice, + _In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _Outptr_ ID3D11Resource** ppResource) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl CreateShaderResourceView(_In_ ID3D11Device* pDevice, + _In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _Outptr_ ID3D11ShaderResourceView** ppSRV) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl CreateTextureEx(_In_ ID3D11Device* pDevice, + _In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ CREATETEX_FLAGS flags, + _Outptr_ ID3D11Resource** ppResource) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl CreateShaderResourceViewEx(_In_ ID3D11Device* pDevice, + _In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ CREATETEX_FLAGS flags, + _Outptr_ ID3D11ShaderResourceView** ppSRV) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl CaptureTexture(_In_ ID3D11Device* pDevice, + _In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + _Out_ ScratchImage& result) noexcept; #endif // Direct3D 12 functions #if defined(__d3d12_h__) || defined(__d3d12_x_h__) || defined(__XBOX_D3D12_X__) DIRECTX_TEX_API bool __cdecl IsSupportedTexture(_In_ ID3D12Device* pDevice, _In_ const TexMetadata& metadata) noexcept; - DIRECTX_TEX_API HRESULT __cdecl CreateTexture( - _In_ ID3D12Device* pDevice, _In_ const TexMetadata& metadata, - _Outptr_ ID3D12Resource** ppResource) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl CreateTextureEx( - _In_ ID3D12Device* pDevice, _In_ const TexMetadata& metadata, - _In_ D3D12_RESOURCE_FLAGS resFlags, _In_ CREATETEX_FLAGS flags, - _Outptr_ ID3D12Resource** ppResource) noexcept; - - DIRECTX_TEX_API HRESULT __cdecl PrepareUpload( - _In_ ID3D12Device* pDevice, - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - std::vector& subresources); - - DIRECTX_TEX_API HRESULT __cdecl CaptureTexture( - _In_ ID3D12CommandQueue* pCommandQueue, _In_ ID3D12Resource* pSource, _In_ bool isCubeMap, - _Out_ ScratchImage& result, - _In_ D3D12_RESOURCE_STATES beforeState = D3D12_RESOURCE_STATE_RENDER_TARGET, - _In_ D3D12_RESOURCE_STATES afterState = D3D12_RESOURCE_STATE_RENDER_TARGET) noexcept; + DIRECTX_TEX_API HRESULT __cdecl + CreateTexture(_In_ ID3D12Device* pDevice, _In_ const TexMetadata& metadata, _Outptr_ ID3D12Resource** ppResource) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl CreateTextureEx(_In_ ID3D12Device* pDevice, + _In_ const TexMetadata& metadata, + _In_ D3D12_RESOURCE_FLAGS resFlags, + _In_ CREATETEX_FLAGS flags, + _Outptr_ ID3D12Resource** ppResource) noexcept; + + DIRECTX_TEX_API HRESULT __cdecl PrepareUpload(_In_ ID3D12Device* pDevice, + _In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + std::vector& subresources); + + DIRECTX_TEX_API HRESULT __cdecl CaptureTexture(_In_ ID3D12CommandQueue* pCommandQueue, + _In_ ID3D12Resource* pSource, + _In_ bool isCubeMap, + _Out_ ScratchImage& result, + _In_ D3D12_RESOURCE_STATES beforeState = D3D12_RESOURCE_STATE_RENDER_TARGET, + _In_ D3D12_RESOURCE_STATES afterState = D3D12_RESOURCE_STATE_RENDER_TARGET) noexcept; #endif #ifdef __clang__ @@ -1165,14 +1321,14 @@ namespace DirectX #pragma clang diagnostic ignored "-Wswitch-enum" #endif -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4619 4616 4061) #endif #include "DirectXTex.inl" -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(pop) #endif @@ -1180,4 +1336,4 @@ namespace DirectX #pragma clang diagnostic pop #endif -} // namespace +} // namespace DirectX diff --git a/DirectXTex/DirectXTex.inl b/DirectXTex/DirectXTex.inl index 65e10814..743bc632 100644 --- a/DirectXTex/DirectXTex.inl +++ b/DirectXTex/DirectXTex.inl @@ -37,30 +37,45 @@ DEFINE_ENUM_FLAG_OPERATORS(CREATETEX_FLAGS); #endif // WIC_FILTER modes match TEX_FILTER modes -constexpr WIC_FLAGS operator|(WIC_FLAGS a, TEX_FILTER_FLAGS b) { return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_MODE_MASK)); } -constexpr WIC_FLAGS operator|(TEX_FILTER_FLAGS a, WIC_FLAGS b) { return static_cast(static_cast(a & TEX_FILTER_MODE_MASK) | static_cast(b)); } +constexpr WIC_FLAGS operator|(WIC_FLAGS a, TEX_FILTER_FLAGS b) +{ + return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_MODE_MASK)); +} +constexpr WIC_FLAGS operator|(TEX_FILTER_FLAGS a, WIC_FLAGS b) +{ + return static_cast(static_cast(a & TEX_FILTER_MODE_MASK) | static_cast(b)); +} // TEX_PMALPHA_SRGB match TEX_FILTER_SRGB -constexpr TEX_PMALPHA_FLAGS operator|(TEX_PMALPHA_FLAGS a, TEX_FILTER_FLAGS b) { return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_SRGB_MASK)); } -constexpr TEX_PMALPHA_FLAGS operator|(TEX_FILTER_FLAGS a, TEX_PMALPHA_FLAGS b) { return static_cast(static_cast(a & TEX_FILTER_SRGB_MASK) | static_cast(b)); } +constexpr TEX_PMALPHA_FLAGS operator|(TEX_PMALPHA_FLAGS a, TEX_FILTER_FLAGS b) +{ + return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_SRGB_MASK)); +} +constexpr TEX_PMALPHA_FLAGS operator|(TEX_FILTER_FLAGS a, TEX_PMALPHA_FLAGS b) +{ + return static_cast(static_cast(a & TEX_FILTER_SRGB_MASK) | static_cast(b)); +} // TEX_COMPRESS_SRGB match TEX_FILTER_SRGB -constexpr TEX_COMPRESS_FLAGS operator|(TEX_COMPRESS_FLAGS a, TEX_FILTER_FLAGS b) { return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_SRGB_MASK)); } -constexpr TEX_COMPRESS_FLAGS operator|(TEX_FILTER_FLAGS a, TEX_COMPRESS_FLAGS b) { return static_cast(static_cast(a & TEX_FILTER_SRGB_MASK) | static_cast(b)); } - +constexpr TEX_COMPRESS_FLAGS operator|(TEX_COMPRESS_FLAGS a, TEX_FILTER_FLAGS b) +{ + return static_cast(static_cast(a) | static_cast(b & TEX_FILTER_SRGB_MASK)); +} +constexpr TEX_COMPRESS_FLAGS operator|(TEX_FILTER_FLAGS a, TEX_COMPRESS_FLAGS b) +{ + return static_cast(static_cast(a & TEX_FILTER_SRGB_MASK) | static_cast(b)); +} //===================================================================================== // DXGI Format Utilities //===================================================================================== -_Use_decl_annotations_ -constexpr bool __cdecl IsValid(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ constexpr bool __cdecl IsValid(DXGI_FORMAT fmt) noexcept { return (static_cast(fmt) >= 1 && static_cast(fmt) <= 191); } -_Use_decl_annotations_ -inline bool __cdecl IsCompressed(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ inline bool __cdecl IsCompressed(DXGI_FORMAT fmt) noexcept { switch (fmt) { @@ -84,32 +99,26 @@ inline bool __cdecl IsCompressed(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return true; + case DXGI_FORMAT_BC7_UNORM_SRGB: return true; - default: - return false; + default: return false; } } -_Use_decl_annotations_ -inline bool __cdecl IsPalettized(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ inline bool __cdecl IsPalettized(DXGI_FORMAT fmt) noexcept { switch (fmt) { case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: case DXGI_FORMAT_P8: - case DXGI_FORMAT_A8P8: - return true; + case DXGI_FORMAT_A8P8: return true; - default: - return false; + default: return false; } } -_Use_decl_annotations_ -inline bool __cdecl IsSRGB(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ inline bool __cdecl IsSRGB(DXGI_FORMAT fmt) noexcept { switch (fmt) { @@ -119,163 +128,165 @@ inline bool __cdecl IsSRGB(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_BC3_UNORM_SRGB: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return true; + case DXGI_FORMAT_BC7_UNORM_SRGB: return true; - default: - return false; + default: return false; } } - //===================================================================================== // Image I/O //===================================================================================== -_Use_decl_annotations_ -inline HRESULT __cdecl SaveToDDSMemory(const Image& image, DDS_FLAGS flags, Blob& blob) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl SaveToDDSMemory(const Image& image, DDS_FLAGS flags, Blob& blob) noexcept { TexMetadata mdata = {}; - mdata.width = image.width; - mdata.height = image.height; - mdata.depth = 1; - mdata.arraySize = 1; - mdata.mipLevels = 1; - mdata.format = image.format; - mdata.dimension = TEX_DIMENSION_TEXTURE2D; + mdata.width = image.width; + mdata.height = image.height; + mdata.depth = 1; + mdata.arraySize = 1; + mdata.mipLevels = 1; + mdata.format = image.format; + mdata.dimension = TEX_DIMENSION_TEXTURE2D; return SaveToDDSMemory(&image, 1, mdata, flags, blob); } -_Use_decl_annotations_ -inline HRESULT __cdecl SaveToDDSFile(const Image& image, DDS_FLAGS flags, const wchar_t* szFile) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl SaveToDDSFile(const Image& image, DDS_FLAGS flags, const wchar_t* szFile) noexcept { TexMetadata mdata = {}; - mdata.width = image.width; - mdata.height = image.height; - mdata.depth = 1; - mdata.arraySize = 1; - mdata.mipLevels = 1; - mdata.format = image.format; - mdata.dimension = TEX_DIMENSION_TEXTURE2D; + mdata.width = image.width; + mdata.height = image.height; + mdata.depth = 1; + mdata.arraySize = 1; + mdata.mipLevels = 1; + mdata.format = image.format; + mdata.dimension = TEX_DIMENSION_TEXTURE2D; return SaveToDDSFile(&image, 1, mdata, flags, szFile); } - //===================================================================================== // Compatability helpers //===================================================================================== -_Use_decl_annotations_ -inline HRESULT __cdecl GetMetadataFromTGAMemory(const uint8_t* pSource, size_t size, TexMetadata& metadata) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl GetMetadataFromTGAMemory(const uint8_t* pSource, size_t size, TexMetadata& metadata) noexcept { return GetMetadataFromTGAMemory(pSource, size, TGA_FLAGS_NONE, metadata); } -_Use_decl_annotations_ -inline HRESULT __cdecl GetMetadataFromTGAFile(const wchar_t* szFile, TexMetadata& metadata) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl GetMetadataFromTGAFile(const wchar_t* szFile, TexMetadata& metadata) noexcept { return GetMetadataFromTGAFile(szFile, TGA_FLAGS_NONE, metadata); } -_Use_decl_annotations_ -inline HRESULT __cdecl LoadFromTGAMemory(const uint8_t* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl +LoadFromTGAMemory(const uint8_t* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) noexcept { return LoadFromTGAMemory(pSource, size, TGA_FLAGS_NONE, metadata, image); } -_Use_decl_annotations_ -inline HRESULT __cdecl LoadFromTGAFile(const wchar_t* szFile, TexMetadata* metadata, ScratchImage& image) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl LoadFromTGAFile(const wchar_t* szFile, TexMetadata* metadata, ScratchImage& image) noexcept { return LoadFromTGAFile(szFile, TGA_FLAGS_NONE, metadata, image); } -_Use_decl_annotations_ -inline HRESULT __cdecl SaveToTGAMemory(const Image& image, Blob& blob, const TexMetadata* metadata) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl SaveToTGAMemory(const Image& image, Blob& blob, const TexMetadata* metadata) noexcept { return SaveToTGAMemory(image, TGA_FLAGS_NONE, blob, metadata); } -_Use_decl_annotations_ -inline HRESULT __cdecl SaveToTGAFile(const Image& image, const wchar_t* szFile, const TexMetadata* metadata) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl SaveToTGAFile(const Image& image, const wchar_t* szFile, const TexMetadata* metadata) noexcept { return SaveToTGAFile(image, TGA_FLAGS_NONE, szFile, metadata); } - //===================================================================================== // C++17 helpers //===================================================================================== #ifdef __cpp_lib_byte -_Use_decl_annotations_ -inline HRESULT __cdecl GetMetadataFromDDSMemory(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata& metadata) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl +GetMetadataFromDDSMemory(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata& metadata) noexcept { return GetMetadataFromDDSMemory(reinterpret_cast(pSource), size, flags, metadata); } -_Use_decl_annotations_ -inline HRESULT __cdecl LoadFromDDSMemory(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl +LoadFromDDSMemory(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept { return LoadFromDDSMemory(reinterpret_cast(pSource), size, flags, metadata, image); } -_Use_decl_annotations_ -inline HRESULT __cdecl GetMetadataFromDDSMemoryEx(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata& metadata, DDSMetaData* ddPixelFormat) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl GetMetadataFromDDSMemoryEx(const std::byte* pSource, + size_t size, + DDS_FLAGS flags, + TexMetadata& metadata, + DDSMetaData* ddPixelFormat) noexcept { return GetMetadataFromDDSMemoryEx(reinterpret_cast(pSource), size, flags, metadata, ddPixelFormat); } -_Use_decl_annotations_ -inline HRESULT __cdecl LoadFromDDSMemoryEx(const std::byte* pSource, size_t size, DDS_FLAGS flags, TexMetadata* metadata, DDSMetaData* ddPixelFormat, ScratchImage& image) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl LoadFromDDSMemoryEx(const std::byte* pSource, + size_t size, + DDS_FLAGS flags, + TexMetadata* metadata, + DDSMetaData* ddPixelFormat, + ScratchImage& image) noexcept { return LoadFromDDSMemoryEx(reinterpret_cast(pSource), size, flags, metadata, ddPixelFormat, image); } -_Use_decl_annotations_ -inline HRESULT __cdecl GetMetadataFromHDRMemory(const std::byte* pSource, size_t size, TexMetadata& metadata) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl +GetMetadataFromHDRMemory(const std::byte* pSource, size_t size, TexMetadata& metadata) noexcept { return GetMetadataFromHDRMemory(reinterpret_cast(pSource), size, metadata); } -_Use_decl_annotations_ -inline HRESULT __cdecl LoadFromHDRMemory(const std::byte* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl +LoadFromHDRMemory(const std::byte* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) noexcept { return LoadFromHDRMemory(reinterpret_cast(pSource), size, metadata, image); } -_Use_decl_annotations_ -inline HRESULT __cdecl GetMetadataFromTGAMemory(const std::byte* pSource, size_t size, TGA_FLAGS flags, TexMetadata& metadata) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl +GetMetadataFromTGAMemory(const std::byte* pSource, size_t size, TGA_FLAGS flags, TexMetadata& metadata) noexcept { return GetMetadataFromTGAMemory(reinterpret_cast(pSource), size, flags, metadata); } -_Use_decl_annotations_ -inline HRESULT __cdecl LoadFromTGAMemory(const std::byte* pSource, size_t size, TGA_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl +LoadFromTGAMemory(const std::byte* pSource, size_t size, TGA_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept { return LoadFromTGAMemory(reinterpret_cast(pSource), size, flags, metadata, image); } -_Use_decl_annotations_ -inline HRESULT __cdecl EncodeDDSHeader(const TexMetadata& metadata, DDS_FLAGS flags, std::byte* pDestination, size_t maxsize, size_t& required) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl +EncodeDDSHeader(const TexMetadata& metadata, DDS_FLAGS flags, std::byte* pDestination, size_t maxsize, size_t& required) noexcept { return EncodeDDSHeader(metadata, flags, reinterpret_cast(pDestination), maxsize, required); } -_Use_decl_annotations_ -inline HRESULT __cdecl EncodeDDSHeader(const TexMetadata& metadata, DDS_FLAGS flags, std::nullptr_t, size_t maxsize, size_t& required) noexcept +_Use_decl_annotations_ inline HRESULT __cdecl +EncodeDDSHeader(const TexMetadata& metadata, DDS_FLAGS flags, std::nullptr_t, size_t maxsize, size_t& required) noexcept { return EncodeDDSHeader(metadata, flags, static_cast(nullptr), maxsize, required); } #ifdef _WIN32 -_Use_decl_annotations_ -inline HRESULT __cdecl GetMetadataFromWICMemory(const std::byte* pSource, size_t size, WIC_FLAGS flags, TexMetadata& metadata, std::function getMQR) +_Use_decl_annotations_ inline HRESULT __cdecl GetMetadataFromWICMemory(const std::byte* pSource, + size_t size, + WIC_FLAGS flags, + TexMetadata& metadata, + std::function getMQR) { return GetMetadataFromWICMemory(reinterpret_cast(pSource), size, flags, metadata, getMQR); } -_Use_decl_annotations_ -inline HRESULT __cdecl LoadFromWICMemory(const std::byte* pSource, size_t size, WIC_FLAGS flags, TexMetadata* metadata, ScratchImage& image, std::function getMQR) +_Use_decl_annotations_ inline HRESULT __cdecl LoadFromWICMemory(const std::byte* pSource, + size_t size, + WIC_FLAGS flags, + TexMetadata* metadata, + ScratchImage& image, + std::function getMQR) { return LoadFromWICMemory(reinterpret_cast(pSource), size, flags, metadata, image, getMQR); } diff --git a/DirectXTex/DirectXTexCompress.cpp b/DirectXTex/DirectXTexCompress.cpp index bb87f649..b8d4557a 100644 --- a/DirectXTex/DirectXTexCompress.cpp +++ b/DirectXTex/DirectXTexCompress.cpp @@ -25,56 +25,110 @@ namespace { constexpr uint32_t GetBCFlags(_In_ TEX_COMPRESS_FLAGS compress) noexcept { - static_assert(static_cast(TEX_COMPRESS_RGB_DITHER) == static_cast(BC_FLAGS_DITHER_RGB), "TEX_COMPRESS_* flags should match BC_FLAGS_*"); - static_assert(static_cast(TEX_COMPRESS_A_DITHER) == static_cast(BC_FLAGS_DITHER_A), "TEX_COMPRESS_* flags should match BC_FLAGS_*"); - static_assert(static_cast(TEX_COMPRESS_DITHER) == static_cast(BC_FLAGS_DITHER_RGB | BC_FLAGS_DITHER_A), "TEX_COMPRESS_* flags should match BC_FLAGS_*"); - static_assert(static_cast(TEX_COMPRESS_UNIFORM) == static_cast(BC_FLAGS_UNIFORM), "TEX_COMPRESS_* flags should match BC_FLAGS_*"); - static_assert(static_cast(TEX_COMPRESS_BC7_USE_3SUBSETS) == static_cast(BC_FLAGS_USE_3SUBSETS), "TEX_COMPRESS_* flags should match BC_FLAGS_*"); - static_assert(static_cast(TEX_COMPRESS_BC7_QUICK) == static_cast(BC_FLAGS_FORCE_BC7_MODE6), "TEX_COMPRESS_* flags should match BC_FLAGS_*"); + static_assert(static_cast(TEX_COMPRESS_RGB_DITHER) == static_cast(BC_FLAGS_DITHER_RGB), + "TEX_COMPRESS_* flags should match BC_FLAGS_*"); + static_assert(static_cast(TEX_COMPRESS_A_DITHER) == static_cast(BC_FLAGS_DITHER_A), + "TEX_COMPRESS_* flags should match BC_FLAGS_*"); + static_assert(static_cast(TEX_COMPRESS_DITHER) == static_cast(BC_FLAGS_DITHER_RGB | BC_FLAGS_DITHER_A), + "TEX_COMPRESS_* flags should match BC_FLAGS_*"); + static_assert(static_cast(TEX_COMPRESS_UNIFORM) == static_cast(BC_FLAGS_UNIFORM), + "TEX_COMPRESS_* flags should match BC_FLAGS_*"); + static_assert(static_cast(TEX_COMPRESS_BC7_USE_3SUBSETS) == static_cast(BC_FLAGS_USE_3SUBSETS), + "TEX_COMPRESS_* flags should match BC_FLAGS_*"); + static_assert(static_cast(TEX_COMPRESS_BC7_QUICK) == static_cast(BC_FLAGS_FORCE_BC7_MODE6), + "TEX_COMPRESS_* flags should match BC_FLAGS_*"); return (compress & (BC_FLAGS_DITHER_RGB | BC_FLAGS_DITHER_A | BC_FLAGS_UNIFORM | BC_FLAGS_USE_3SUBSETS | BC_FLAGS_FORCE_BC7_MODE6)); } constexpr TEX_FILTER_FLAGS GetSRGBFlags(_In_ TEX_COMPRESS_FLAGS compress) noexcept { static_assert(TEX_FILTER_SRGB_IN == 0x1000000, "TEX_FILTER_SRGB flag values don't match TEX_FILTER_SRGB_MASK"); - static_assert(static_cast(TEX_COMPRESS_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_COMPRESS_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_COMPRESS_SRGB) == static_cast(TEX_FILTER_SRGB), "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_COMPRESS_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), + "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_COMPRESS_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), + "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_COMPRESS_SRGB) == static_cast(TEX_FILTER_SRGB), + "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); return static_cast(compress & TEX_FILTER_SRGB_MASK); } - inline bool DetermineEncoderSettings(_In_ DXGI_FORMAT format, _Out_ BC_ENCODE& pfEncode, _Out_ size_t& blocksize, _Out_ TEX_FILTER_FLAGS& cflags) noexcept + inline bool DetermineEncoderSettings(_In_ DXGI_FORMAT format, + _Out_ BC_ENCODE& pfEncode, + _Out_ size_t& blocksize, + _Out_ TEX_FILTER_FLAGS& cflags) noexcept { switch (format) { case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: pfEncode = nullptr; blocksize = 8; cflags = TEX_FILTER_DEFAULT; break; + case DXGI_FORMAT_BC1_UNORM_SRGB: + pfEncode = nullptr; + blocksize = 8; + cflags = TEX_FILTER_DEFAULT; + break; case DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT_BC2_UNORM_SRGB: pfEncode = D3DXEncodeBC2; blocksize = 16; cflags = TEX_FILTER_DEFAULT; break; + case DXGI_FORMAT_BC2_UNORM_SRGB: + pfEncode = D3DXEncodeBC2; + blocksize = 16; + cflags = TEX_FILTER_DEFAULT; + break; case DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT_BC3_UNORM_SRGB: pfEncode = D3DXEncodeBC3; blocksize = 16; cflags = TEX_FILTER_DEFAULT; break; - case DXGI_FORMAT_BC4_UNORM: pfEncode = D3DXEncodeBC4U; blocksize = 8; cflags = TEX_FILTER_RGB_COPY_RED; break; - case DXGI_FORMAT_BC4_SNORM: pfEncode = D3DXEncodeBC4S; blocksize = 8; cflags = TEX_FILTER_RGB_COPY_RED; break; - case DXGI_FORMAT_BC5_UNORM: pfEncode = D3DXEncodeBC5U; blocksize = 16; cflags = TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN; break; - case DXGI_FORMAT_BC5_SNORM: pfEncode = D3DXEncodeBC5S; blocksize = 16; cflags = TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN; break; - case DXGI_FORMAT_BC6H_UF16: pfEncode = D3DXEncodeBC6HU; blocksize = 16; cflags = TEX_FILTER_DEFAULT; break; - case DXGI_FORMAT_BC6H_SF16: pfEncode = D3DXEncodeBC6HS; blocksize = 16; cflags = TEX_FILTER_DEFAULT; break; + case DXGI_FORMAT_BC3_UNORM_SRGB: + pfEncode = D3DXEncodeBC3; + blocksize = 16; + cflags = TEX_FILTER_DEFAULT; + break; + case DXGI_FORMAT_BC4_UNORM: + pfEncode = D3DXEncodeBC4U; + blocksize = 8; + cflags = TEX_FILTER_RGB_COPY_RED; + break; + case DXGI_FORMAT_BC4_SNORM: + pfEncode = D3DXEncodeBC4S; + blocksize = 8; + cflags = TEX_FILTER_RGB_COPY_RED; + break; + case DXGI_FORMAT_BC5_UNORM: + pfEncode = D3DXEncodeBC5U; + blocksize = 16; + cflags = TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN; + break; + case DXGI_FORMAT_BC5_SNORM: + pfEncode = D3DXEncodeBC5S; + blocksize = 16; + cflags = TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN; + break; + case DXGI_FORMAT_BC6H_UF16: + pfEncode = D3DXEncodeBC6HU; + blocksize = 16; + cflags = TEX_FILTER_DEFAULT; + break; + case DXGI_FORMAT_BC6H_SF16: + pfEncode = D3DXEncodeBC6HS; + blocksize = 16; + cflags = TEX_FILTER_DEFAULT; + break; case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: pfEncode = D3DXEncodeBC7; blocksize = 16; cflags = TEX_FILTER_DEFAULT; break; - default: pfEncode = nullptr; blocksize = 0; cflags = TEX_FILTER_DEFAULT; return false; + case DXGI_FORMAT_BC7_UNORM_SRGB: + pfEncode = D3DXEncodeBC7; + blocksize = 16; + cflags = TEX_FILTER_DEFAULT; + break; + default: + pfEncode = nullptr; + blocksize = 0; + cflags = TEX_FILTER_DEFAULT; + return false; } return true; } - //------------------------------------------------------------------------------------- - HRESULT CompressBC( - const Image& image, - const Image& result, - uint32_t bcflags, - TEX_FILTER_FLAGS srgb, - float threshold, + HRESULT CompressBC(const Image& image, + const Image& result, + uint32_t bcflags, + TEX_FILTER_FLAGS srgb, + float threshold, const std::function& statusCallback) noexcept { if (!image.pixels || !result.pixels) @@ -84,7 +138,7 @@ namespace assert(image.height == result.height); const DXGI_FORMAT format = image.format; - size_t sbpp = BitsPerPixel(format); + size_t sbpp = BitsPerPixel(format); if (!sbpp) return E_FAIL; @@ -97,19 +151,19 @@ namespace // Round to bytes sbpp = (sbpp + 7) / 8; - uint8_t *pDest = result.pixels; + uint8_t* pDest = result.pixels; // Determine BC format encoder - BC_ENCODE pfEncode; - size_t blocksize; + BC_ENCODE pfEncode; + size_t blocksize; TEX_FILTER_FLAGS cflags; if (!DetermineEncoderSettings(result.format, pfEncode, blocksize, cflags)) return HRESULT_E_NOT_SUPPORTED; XM_ALIGNED_DATA(16) XMVECTOR temp[16]; - const uint8_t *pSrc = image.pixels; - const uint8_t *pEnd = image.pixels + image.slicePitch; - const size_t rowPitch = image.rowPitch; + const uint8_t* pSrc = image.pixels; + const uint8_t* pEnd = image.pixels + image.slicePitch; + const size_t rowPitch = image.rowPitch; for (size_t h = 0; h < image.height; h += 4) { if (statusCallback) @@ -120,10 +174,10 @@ namespace } } - const uint8_t *sptr = pSrc; - uint8_t* dptr = pDest; - const size_t ph = std::min(4, image.height - h); - size_t w = 0; + const uint8_t* sptr = pSrc; + uint8_t* dptr = pDest; + const size_t ph = std::min(4, image.height - h); + size_t w = 0; for (size_t count = 0; (count < result.rowPitch) && (w < image.width); count += blocksize, w += 4) { const size_t pw = std::min(4, image.width - w); @@ -167,7 +221,7 @@ namespace { for (size_t s = pw; s < 4; ++s) { - #pragma prefast(suppress: 26000, "PREFAST false positive") +#pragma prefast(suppress : 26000, "PREFAST false positive") temp[(t << 2) | s] = temp[(t << 2) | uSrc[s]]; } } @@ -179,7 +233,7 @@ namespace { for (size_t s = 0; s < 4; ++s) { - #pragma prefast(suppress: 26000, "PREFAST false positive") +#pragma prefast(suppress : 26000, "PREFAST false positive") temp[(t << 2) | s] = temp[(uSrc[t] << 2) | s]; } } @@ -204,15 +258,13 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- #ifdef _OPENMP - HRESULT CompressBC_Parallel( - const Image& image, - const Image& result, - uint32_t bcflags, - TEX_FILTER_FLAGS srgb, - float threshold, + HRESULT CompressBC_Parallel(const Image& image, + const Image& result, + uint32_t bcflags, + TEX_FILTER_FLAGS srgb, + float threshold, const std::function& statusCallback) noexcept { if (!image.pixels || !result.pixels) @@ -222,7 +274,7 @@ namespace assert(image.height == result.height); const DXGI_FORMAT format = image.format; - size_t sbpp = BitsPerPixel(format); + size_t sbpp = BitsPerPixel(format); if (!sbpp) return E_FAIL; @@ -235,11 +287,11 @@ namespace // Round to bytes sbpp = (sbpp + 7) / 8; - const uint8_t *pEnd = image.pixels + image.slicePitch; + const uint8_t* pEnd = image.pixels + image.slicePitch; // Determine BC format encoder - BC_ENCODE pfEncode; - size_t blocksize; + BC_ENCODE pfEncode; + size_t blocksize; TEX_FILTER_FLAGS cflags; if (!DetermineEncoderSettings(result.format, pfEncode, blocksize, cflags)) return HRESULT_E_NOT_SUPPORTED; @@ -250,14 +302,14 @@ namespace bool fail = false; size_t progress = 0; - bool abort = false; + bool abort = false; const size_t progressTotal = std::max(1, (image.height + 3) / 4); - #pragma omp parallel for shared(progress) +#pragma omp parallel for shared(progress) for (int nb = 0; nb < static_cast(nBlocks); ++nb) { - #pragma omp flush (abort) +#pragma omp flush(abort) if (abort) { // Short circuit the loop body if an abort is requested. @@ -267,17 +319,17 @@ namespace const int nbWidth = std::max(1, int((image.width + 3) / 4)); - int y = nb / nbWidth; - const int x = (nb - (y*nbWidth)) * 4; + int y = nb / nbWidth; + const int x = (nb - (y * nbWidth)) * 4; y *= 4; assert((x >= 0) && (x < int(image.width))); assert((y >= 0) && (y < int(image.height))); - const size_t rowPitch = image.rowPitch; - const uint8_t *pSrc = image.pixels + (size_t(y)*rowPitch) + (size_t(x)*sbpp); + const size_t rowPitch = image.rowPitch; + const uint8_t* pSrc = image.pixels + (size_t(y) * rowPitch) + (size_t(x) * sbpp); - uint8_t *pDest = result.pixels + (size_t(nb)*blocksize); + uint8_t* pDest = result.pixels + (size_t(nb) * blocksize); const size_t ph = std::min(4, image.height - size_t(y)); const size_t pw = std::min(4, image.width - size_t(x)); @@ -350,13 +402,13 @@ namespace // Report progress when a new row is reached. if (x == 0 && statusCallback) { - #pragma omp atomic +#pragma omp atomic progress += 4; if (!statusCallback(progress, progressTotal)) { abort = true; - #pragma omp flush (abort) +#pragma omp flush(abort) } } } @@ -372,7 +424,6 @@ namespace } #endif // _OPENMP - //------------------------------------------------------------------------------------- DXGI_FORMAT DefaultDecompress(_In_ DXGI_FORMAT format) noexcept { @@ -385,28 +436,22 @@ namespace case DXGI_FORMAT_BC3_TYPELESS: case DXGI_FORMAT_BC3_UNORM: case DXGI_FORMAT_BC7_TYPELESS: - case DXGI_FORMAT_BC7_UNORM: - return DXGI_FORMAT_R8G8B8A8_UNORM; + case DXGI_FORMAT_BC7_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM; case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC2_UNORM_SRGB: case DXGI_FORMAT_BC3_UNORM_SRGB: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + case DXGI_FORMAT_BC7_UNORM_SRGB: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; case DXGI_FORMAT_BC4_TYPELESS: - case DXGI_FORMAT_BC4_UNORM: - return DXGI_FORMAT_R8_UNORM; + case DXGI_FORMAT_BC4_UNORM: return DXGI_FORMAT_R8_UNORM; - case DXGI_FORMAT_BC4_SNORM: - return DXGI_FORMAT_R8_SNORM; + case DXGI_FORMAT_BC4_SNORM: return DXGI_FORMAT_R8_SNORM; case DXGI_FORMAT_BC5_TYPELESS: - case DXGI_FORMAT_BC5_UNORM: - return DXGI_FORMAT_R8G8_UNORM; + case DXGI_FORMAT_BC5_UNORM: return DXGI_FORMAT_R8G8_UNORM; - case DXGI_FORMAT_BC5_SNORM: - return DXGI_FORMAT_R8G8_SNORM; + case DXGI_FORMAT_BC5_SNORM: return DXGI_FORMAT_R8G8_SNORM; case DXGI_FORMAT_BC6H_TYPELESS: case DXGI_FORMAT_BC6H_UF16: @@ -415,12 +460,10 @@ namespace // but this format is more supported by viewers return DXGI_FORMAT_R32G32B32A32_FLOAT; - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } } - //------------------------------------------------------------------------------------- HRESULT DecompressBC(_In_ const Image& cImage, _In_ const Image& result) noexcept { @@ -431,7 +474,7 @@ namespace assert(cImage.height == result.height); const DXGI_FORMAT format = result.format; - size_t dbpp = BitsPerPixel(format); + size_t dbpp = BitsPerPixel(format); if (!dbpp) return E_FAIL; @@ -444,7 +487,7 @@ namespace // Round to bytes dbpp = (dbpp + 7) / 8; - uint8_t *pDest = result.pixels; + uint8_t* pDest = result.pixels; if (!pDest) return E_POINTER; @@ -459,41 +502,70 @@ namespace case DXGI_FORMAT_BC5_TYPELESS: cformat = DXGI_FORMAT_BC5_UNORM; break; case DXGI_FORMAT_BC6H_TYPELESS: cformat = DXGI_FORMAT_BC6H_UF16; break; case DXGI_FORMAT_BC7_TYPELESS: cformat = DXGI_FORMAT_BC7_UNORM; break; - default: cformat = cImage.format; break; + default: cformat = cImage.format; break; } // Determine BC format decoder BC_DECODE pfDecode; - size_t sbpp; + size_t sbpp; switch (cformat) { case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: pfDecode = D3DXDecodeBC1; sbpp = 8; break; + case DXGI_FORMAT_BC1_UNORM_SRGB: + pfDecode = D3DXDecodeBC1; + sbpp = 8; + break; case DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT_BC2_UNORM_SRGB: pfDecode = D3DXDecodeBC2; sbpp = 16; break; + case DXGI_FORMAT_BC2_UNORM_SRGB: + pfDecode = D3DXDecodeBC2; + sbpp = 16; + break; case DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT_BC3_UNORM_SRGB: pfDecode = D3DXDecodeBC3; sbpp = 16; break; - case DXGI_FORMAT_BC4_UNORM: pfDecode = D3DXDecodeBC4U; sbpp = 8; break; - case DXGI_FORMAT_BC4_SNORM: pfDecode = D3DXDecodeBC4S; sbpp = 8; break; - case DXGI_FORMAT_BC5_UNORM: pfDecode = D3DXDecodeBC5U; sbpp = 16; break; - case DXGI_FORMAT_BC5_SNORM: pfDecode = D3DXDecodeBC5S; sbpp = 16; break; - case DXGI_FORMAT_BC6H_UF16: pfDecode = D3DXDecodeBC6HU; sbpp = 16; break; - case DXGI_FORMAT_BC6H_SF16: pfDecode = D3DXDecodeBC6HS; sbpp = 16; break; + case DXGI_FORMAT_BC3_UNORM_SRGB: + pfDecode = D3DXDecodeBC3; + sbpp = 16; + break; + case DXGI_FORMAT_BC4_UNORM: + pfDecode = D3DXDecodeBC4U; + sbpp = 8; + break; + case DXGI_FORMAT_BC4_SNORM: + pfDecode = D3DXDecodeBC4S; + sbpp = 8; + break; + case DXGI_FORMAT_BC5_UNORM: + pfDecode = D3DXDecodeBC5U; + sbpp = 16; + break; + case DXGI_FORMAT_BC5_SNORM: + pfDecode = D3DXDecodeBC5S; + sbpp = 16; + break; + case DXGI_FORMAT_BC6H_UF16: + pfDecode = D3DXDecodeBC6HU; + sbpp = 16; + break; + case DXGI_FORMAT_BC6H_SF16: + pfDecode = D3DXDecodeBC6HS; + sbpp = 16; + break; case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: pfDecode = D3DXDecodeBC7; sbpp = 16; break; - default: - return HRESULT_E_NOT_SUPPORTED; + case DXGI_FORMAT_BC7_UNORM_SRGB: + pfDecode = D3DXDecodeBC7; + sbpp = 16; + break; + default: return HRESULT_E_NOT_SUPPORTED; } XM_ALIGNED_DATA(16) XMVECTOR temp[16]; - const uint8_t *pSrc = cImage.pixels; - const size_t rowPitch = result.rowPitch; + const uint8_t* pSrc = cImage.pixels; + const size_t rowPitch = result.rowPitch; for (size_t h = 0; h < cImage.height; h += 4) { - const uint8_t *sptr = pSrc; - uint8_t* dptr = pDest; - const size_t ph = std::min(4, cImage.height - h); - size_t w = 0; + const uint8_t* sptr = pSrc; + uint8_t* dptr = pDest; + const size_t ph = std::min(4, cImage.height - h); + size_t w = 0; for (size_t count = 0; (count < cImage.rowPitch) && (w < cImage.width); count += sbpp, w += 4) { pfDecode(temp, sptr); @@ -533,7 +605,7 @@ namespace return S_OK; } -} +} // namespace //------------------------------------------------------------------------------------- bool DirectX::Internal::IsAlphaAllOpaqueBC(_In_ const Image& cImage) noexcept @@ -545,26 +617,38 @@ bool DirectX::Internal::IsAlphaAllOpaqueBC(_In_ const Image& cImage) noexcept DXGI_FORMAT cformat; switch (cImage.format) { - case DXGI_FORMAT_BC1_TYPELESS: cformat = DXGI_FORMAT_BC1_UNORM; break; - case DXGI_FORMAT_BC2_TYPELESS: cformat = DXGI_FORMAT_BC2_UNORM; break; - case DXGI_FORMAT_BC3_TYPELESS: cformat = DXGI_FORMAT_BC3_UNORM; break; - case DXGI_FORMAT_BC7_TYPELESS: cformat = DXGI_FORMAT_BC7_UNORM; break; - default: cformat = cImage.format; break; + case DXGI_FORMAT_BC1_TYPELESS: cformat = DXGI_FORMAT_BC1_UNORM; break; + case DXGI_FORMAT_BC2_TYPELESS: cformat = DXGI_FORMAT_BC2_UNORM; break; + case DXGI_FORMAT_BC3_TYPELESS: cformat = DXGI_FORMAT_BC3_UNORM; break; + case DXGI_FORMAT_BC7_TYPELESS: cformat = DXGI_FORMAT_BC7_UNORM; break; + default: cformat = cImage.format; break; } // Determine BC format decoder BC_DECODE pfDecode; - size_t sbpp; + size_t sbpp; switch (cformat) { case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: pfDecode = D3DXDecodeBC1; sbpp = 8; break; + case DXGI_FORMAT_BC1_UNORM_SRGB: + pfDecode = D3DXDecodeBC1; + sbpp = 8; + break; case DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT_BC2_UNORM_SRGB: pfDecode = D3DXDecodeBC2; sbpp = 16; break; + case DXGI_FORMAT_BC2_UNORM_SRGB: + pfDecode = D3DXDecodeBC2; + sbpp = 16; + break; case DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT_BC3_UNORM_SRGB: pfDecode = D3DXDecodeBC3; sbpp = 16; break; + case DXGI_FORMAT_BC3_UNORM_SRGB: + pfDecode = D3DXDecodeBC3; + sbpp = 16; + break; case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: pfDecode = D3DXDecodeBC7; sbpp = 16; break; + case DXGI_FORMAT_BC7_UNORM_SRGB: + pfDecode = D3DXDecodeBC7; + sbpp = 16; + break; default: // BC4, BC5, and BC6 don't have alpha channels return false; @@ -574,12 +658,12 @@ bool DirectX::Internal::IsAlphaAllOpaqueBC(_In_ const Image& cImage) noexcept static const XMVECTORF32 threshold = { { { 0.99f, 0.99f, 0.99f, 0.99f } } }; XM_ALIGNED_DATA(16) XMVECTOR temp[16]; - const uint8_t* pPixels = cImage.pixels; + const uint8_t* pPixels = cImage.pixels; for (size_t h = 0; h < cImage.height; h += 4) { const uint8_t* ptr = pPixels; - const size_t ph = std::min(4, cImage.height - h); - size_t w = 0; + const size_t ph = std::min(4, cImage.height - h); + size_t w = 0; for (size_t count = 0; (count < cImage.rowPitch) && (w < cImage.width); count += sbpp, w += 4) { pfDecode(temp, ptr); @@ -620,7 +704,6 @@ bool DirectX::Internal::IsAlphaAllOpaqueBC(_In_ const Image& cImage) noexcept return true; } - //===================================================================================== // Entry-points //===================================================================================== @@ -628,51 +711,41 @@ bool DirectX::Internal::IsAlphaAllOpaqueBC(_In_ const Image& cImage) noexcept //------------------------------------------------------------------------------------- // Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Compress( - const Image& srcImage, - DXGI_FORMAT format, - TEX_COMPRESS_FLAGS compress, - float threshold, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT +DirectX::Compress(const Image& srcImage, DXGI_FORMAT format, TEX_COMPRESS_FLAGS compress, float threshold, ScratchImage& image) noexcept { CompressOptions options = {}; - options.flags = compress; - options.threshold = threshold; + options.flags = compress; + options.threshold = threshold; return CompressEx(srcImage, format, options, image, nullptr); } -_Use_decl_annotations_ -HRESULT DirectX::Compress( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - DXGI_FORMAT format, - TEX_COMPRESS_FLAGS compress, - float threshold, - ScratchImage& cImages) noexcept +_Use_decl_annotations_ HRESULT DirectX::Compress(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + DXGI_FORMAT format, + TEX_COMPRESS_FLAGS compress, + float threshold, + ScratchImage& cImages) noexcept { CompressOptions options = {}; - options.flags = compress; - options.threshold = threshold; + options.flags = compress; + options.threshold = threshold; return CompressEx(srcImages, nimages, metadata, format, options, cImages, nullptr); } -_Use_decl_annotations_ -HRESULT DirectX::CompressEx( - const Image& srcImage, - DXGI_FORMAT format, - const CompressOptions& options, - ScratchImage& image, - std::function statusCallback) +_Use_decl_annotations_ HRESULT DirectX::CompressEx(const Image& srcImage, + DXGI_FORMAT format, + const CompressOptions& options, + ScratchImage& image, + std::function statusCallback) { if (IsCompressed(srcImage.format) || !IsCompressed(format) || !IsValid(srcImage.format)) return E_INVALIDARG; - if (IsTypeless(format) - || IsTypeless(srcImage.format) || IsPlanar(srcImage.format) || IsPalettized(srcImage.format)) + if (IsTypeless(format) || IsTypeless(srcImage.format) || IsPlanar(srcImage.format) || IsPalettized(srcImage.format)) return HRESULT_E_NOT_SUPPORTED; // Create compressed image @@ -680,7 +753,7 @@ HRESULT DirectX::CompressEx( if (FAILED(hr)) return hr; - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) { image.Release(); @@ -699,11 +772,11 @@ HRESULT DirectX::CompressEx( // Compress single image if (options.flags & TEX_COMPRESS_PARALLEL) { - #ifndef _OPENMP +#ifndef _OPENMP hr = E_NOTIMPL; - #else +#else hr = CompressBC_Parallel(srcImage, *img, GetBCFlags(options.flags), GetSRGBFlags(options.flags), options.threshold, statusCallback); - #endif // _OPENMP +#endif // _OPENMP } else { @@ -728,15 +801,13 @@ HRESULT DirectX::CompressEx( return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::CompressEx( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - DXGI_FORMAT format, - const CompressOptions& options, - ScratchImage& cImages, - std::function statusCallback) +_Use_decl_annotations_ HRESULT DirectX::CompressEx(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + DXGI_FORMAT format, + const CompressOptions& options, + ScratchImage& cImages, + std::function statusCallback) { if (!srcImages || !nimages || !IsValid(metadata.format)) return E_INVALIDARG; @@ -744,17 +815,12 @@ HRESULT DirectX::CompressEx( if (IsCompressed(metadata.format) || !IsCompressed(format)) return E_INVALIDARG; - if (IsTypeless(format) - || IsTypeless(metadata.format) || IsPlanar(metadata.format) || IsPalettized(metadata.format)) + if (IsTypeless(format) || IsTypeless(metadata.format) || IsPlanar(metadata.format) || IsPalettized(metadata.format)) return HRESULT_E_NOT_SUPPORTED; cImages.Release(); - if (statusCallback - && nimages == 1 - && !metadata.IsVolumemap() - && metadata.mipLevels == 1 - && metadata.arraySize == 1) + if (statusCallback && nimages == 1 && !metadata.IsVolumemap() && metadata.mipLevels == 1 && metadata.arraySize == 1) { // If progress reporting is requested when compressing a single 1D or 2D image, call // the CompressEx overload that takes a single image. @@ -764,8 +830,8 @@ HRESULT DirectX::CompressEx( } TexMetadata mdata2 = metadata; - mdata2.format = format; - HRESULT hr = cImages.Initialize(mdata2); + mdata2.format = format; + HRESULT hr = cImages.Initialize(mdata2); if (FAILED(hr)) return hr; @@ -805,11 +871,11 @@ HRESULT DirectX::CompressEx( if (options.flags & TEX_COMPRESS_PARALLEL) { - #ifndef _OPENMP +#ifndef _OPENMP hr = E_NOTIMPL; - #else +#else hr = CompressBC_Parallel(src, dest[index], GetBCFlags(options.flags), GetSRGBFlags(options.flags), options.threshold, nullptr); - #endif // _OPENMP +#endif // _OPENMP } else { @@ -844,15 +910,10 @@ HRESULT DirectX::CompressEx( return S_OK; } - //------------------------------------------------------------------------------------- // Decompression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Decompress( - const Image& cImage, - DXGI_FORMAT format, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::Decompress(const Image& cImage, DXGI_FORMAT format, ScratchImage& image) noexcept { if (!IsCompressed(cImage.format) || IsCompressed(format)) return E_INVALIDARG; @@ -881,7 +942,7 @@ HRESULT DirectX::Decompress( if (FAILED(hr)) return hr; - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) { image.Release(); @@ -896,13 +957,8 @@ HRESULT DirectX::Decompress( return hr; } -_Use_decl_annotations_ -HRESULT DirectX::Decompress( - const Image* cImages, - size_t nimages, - const TexMetadata& metadata, - DXGI_FORMAT format, - ScratchImage& images) noexcept +_Use_decl_annotations_ HRESULT +DirectX::Decompress(const Image* cImages, size_t nimages, const TexMetadata& metadata, DXGI_FORMAT format, ScratchImage& images) noexcept { if (!cImages || !nimages) return E_INVALIDARG; @@ -932,8 +988,8 @@ HRESULT DirectX::Decompress( images.Release(); TexMetadata mdata2 = metadata; - mdata2.format = format; - HRESULT hr = images.Initialize(mdata2); + mdata2.format = format; + HRESULT hr = images.Initialize(mdata2); if (FAILED(hr)) return hr; diff --git a/DirectXTex/DirectXTexCompressGPU.cpp b/DirectXTex/DirectXTexCompressGPU.cpp index f0b87504..dbbea36c 100644 --- a/DirectXTex/DirectXTexCompressGPU.cpp +++ b/DirectXTex/DirectXTexCompressGPU.cpp @@ -21,21 +21,19 @@ namespace constexpr TEX_FILTER_FLAGS GetSRGBFlags(_In_ TEX_COMPRESS_FLAGS compress) noexcept { static_assert(TEX_FILTER_SRGB_IN == 0x1000000, "TEX_FILTER_SRGB flag values don't match TEX_FILTER_SRGB_MASK"); - static_assert(static_cast(TEX_COMPRESS_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_COMPRESS_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_COMPRESS_SRGB) == static_cast(TEX_FILTER_SRGB), "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_COMPRESS_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), + "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_COMPRESS_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), + "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_COMPRESS_SRGB) == static_cast(TEX_FILTER_SRGB), + "TEX_COMPRESS_SRGB* should match TEX_FILTER_SRGB*"); return static_cast(compress & TEX_FILTER_SRGB_MASK); } - //------------------------------------------------------------------------------------- // Converts to R8G8B8A8_UNORM or R8G8B8A8_UNORM_SRGB doing any conversion logic needed //------------------------------------------------------------------------------------- - HRESULT ConvertToRGBA32( - const Image& srcImage, - ScratchImage& image, - bool srgb, - TEX_FILTER_FLAGS filter) noexcept + HRESULT ConvertToRGBA32(const Image& srcImage, ScratchImage& image, bool srgb, TEX_FILTER_FLAGS filter) noexcept { if (!srcImage.pixels) return E_POINTER; @@ -46,7 +44,7 @@ namespace if (FAILED(hr)) return hr; - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) { image.Release(); @@ -67,7 +65,7 @@ namespace return E_OUTOFMEMORY; } - const uint8_t *pSrc = srcImage.pixels; + const uint8_t* pSrc = srcImage.pixels; for (size_t h = 0; h < srcImage.height; ++h) { if (!LoadScanline(scanline.get(), srcImage.width, pSrc, srcImage.rowPitch, srcImage.format)) @@ -91,14 +89,10 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Converts to DXGI_FORMAT_R32G32B32A32_FLOAT doing any conversion logic needed //------------------------------------------------------------------------------------- - HRESULT ConvertToRGBAF32( - const Image& srcImage, - ScratchImage& image, - TEX_FILTER_FLAGS filter) noexcept + HRESULT ConvertToRGBAF32(const Image& srcImage, ScratchImage& image, TEX_FILTER_FLAGS filter) noexcept { if (!srcImage.pixels) return E_POINTER; @@ -107,7 +101,7 @@ namespace if (FAILED(hr)) return hr; - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) { image.Release(); @@ -121,7 +115,7 @@ namespace return E_POINTER; } - const uint8_t *pSrc = srcImage.pixels; + const uint8_t* pSrc = srcImage.pixels; for (size_t h = 0; h < srcImage.height; ++h) { if (!LoadScanline(reinterpret_cast(pDest), srcImage.width, pSrc, srcImage.rowPitch, srcImage.format)) @@ -139,15 +133,10 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Compress using GPU, converting to the proper input format for the shader if needed //------------------------------------------------------------------------------------- - inline HRESULT GPUCompress( - _In_ GPUCompressBC* gpubc, - const Image& srcImage, - const Image& destImage, - TEX_COMPRESS_FLAGS compress) + inline HRESULT GPUCompress(_In_ GPUCompressBC* gpubc, const Image& srcImage, const Image& destImage, TEX_COMPRESS_FLAGS compress) { if (!gpubc) return E_POINTER; @@ -170,39 +159,32 @@ namespace { // Convert format and then use as the source image ScratchImage image; - HRESULT hr = E_UNEXPECTED; + HRESULT hr = E_UNEXPECTED; const auto srgb = GetSRGBFlags(compress); switch (tformat) { - case DXGI_FORMAT_R8G8B8A8_UNORM: - hr = ConvertToRGBA32(srcImage, image, false, srgb); - break; + case DXGI_FORMAT_R8G8B8A8_UNORM: hr = ConvertToRGBA32(srcImage, image, false, srgb); break; - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - hr = ConvertToRGBA32(srcImage, image, true, srgb); - break; + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: hr = ConvertToRGBA32(srcImage, image, true, srgb); break; - case DXGI_FORMAT_R32G32B32A32_FLOAT: - hr = ConvertToRGBAF32(srcImage, image, srgb); - break; + case DXGI_FORMAT_R32G32B32A32_FLOAT: hr = ConvertToRGBAF32(srcImage, image, srgb); break; - default: - break; + default: break; } if (FAILED(hr)) return hr; - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) return E_POINTER; return gpubc->Compress(*img, destImage); } } -}; +}; // namespace //===================================================================================== // Entry-points @@ -211,54 +193,47 @@ namespace //------------------------------------------------------------------------------------- // Compression //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Compress( - ID3D11Device* pDevice, - const Image& srcImage, - DXGI_FORMAT format, - TEX_COMPRESS_FLAGS compress, - float alphaWeight, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::Compress(ID3D11Device* pDevice, + const Image& srcImage, + DXGI_FORMAT format, + TEX_COMPRESS_FLAGS compress, + float alphaWeight, + ScratchImage& image) noexcept { CompressOptions options = {}; - options.flags = compress; - options.alphaWeight = alphaWeight; + options.flags = compress; + options.alphaWeight = alphaWeight; return CompressEx(pDevice, srcImage, format, options, image, nullptr); } -_Use_decl_annotations_ -HRESULT DirectX::Compress( - ID3D11Device* pDevice, - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - DXGI_FORMAT format, - TEX_COMPRESS_FLAGS compress, - float alphaWeight, - ScratchImage& cImages) noexcept +_Use_decl_annotations_ HRESULT DirectX::Compress(ID3D11Device* pDevice, + const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + DXGI_FORMAT format, + TEX_COMPRESS_FLAGS compress, + float alphaWeight, + ScratchImage& cImages) noexcept { CompressOptions options = {}; - options.flags = compress; - options.alphaWeight = alphaWeight; + options.flags = compress; + options.alphaWeight = alphaWeight; return CompressEx(pDevice, srcImages, nimages, metadata, format, options, cImages); } -_Use_decl_annotations_ -HRESULT DirectX::CompressEx( - ID3D11Device* pDevice, - const Image& srcImage, - DXGI_FORMAT format, - const CompressOptions& options, - ScratchImage& image, - std::function statusCallback) +_Use_decl_annotations_ HRESULT DirectX::CompressEx(ID3D11Device* pDevice, + const Image& srcImage, + DXGI_FORMAT format, + const CompressOptions& options, + ScratchImage& image, + std::function statusCallback) { if (!pDevice || IsCompressed(srcImage.format) || !IsCompressed(format) || !IsValid(srcImage.format)) return E_INVALIDARG; - if (IsTypeless(format) - || IsTypeless(srcImage.format) || IsPlanar(srcImage.format) || IsPalettized(srcImage.format)) + if (IsTypeless(format) || IsTypeless(srcImage.format) || IsPlanar(srcImage.format) || IsPalettized(srcImage.format)) return HRESULT_E_NOT_SUPPORTED; if (!srcImage.pixels) @@ -282,7 +257,7 @@ HRESULT DirectX::CompressEx( if (FAILED(hr)) return hr; - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) { image.Release(); @@ -318,16 +293,14 @@ HRESULT DirectX::CompressEx( return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::CompressEx( - ID3D11Device* pDevice, - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - DXGI_FORMAT format, - const CompressOptions& options, - ScratchImage& cImages, - std::function statusCallback) +_Use_decl_annotations_ HRESULT DirectX::CompressEx(ID3D11Device* pDevice, + const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + DXGI_FORMAT format, + const CompressOptions& options, + ScratchImage& cImages, + std::function statusCallback) { if (!pDevice || !srcImages || !nimages || !IsValid(metadata.format)) return E_INVALIDARG; @@ -335,8 +308,7 @@ HRESULT DirectX::CompressEx( if (IsCompressed(metadata.format) || !IsCompressed(format)) return E_INVALIDARG; - if (IsTypeless(format) - || IsTypeless(metadata.format) || IsPlanar(metadata.format) || IsPalettized(metadata.format)) + if (IsTypeless(format) || IsTypeless(metadata.format) || IsPlanar(metadata.format) || IsPalettized(metadata.format)) return HRESULT_E_NOT_SUPPORTED; cImages.Release(); @@ -352,8 +324,8 @@ HRESULT DirectX::CompressEx( // Create workspace for result TexMetadata mdata2 = metadata; - mdata2.format = format; - hr = cImages.Initialize(mdata2); + mdata2.format = format; + hr = cImages.Initialize(mdata2); if (FAILED(hr)) return hr; @@ -383,132 +355,129 @@ HRESULT DirectX::CompressEx( switch (metadata.dimension) { case TEX_DIMENSION_TEXTURE1D: - case TEX_DIMENSION_TEXTURE2D: + case TEX_DIMENSION_TEXTURE2D: { + size_t w = metadata.width; + size_t h = metadata.height; + size_t progress = 0; + + for (size_t level = 0; level < metadata.mipLevels; ++level) { - size_t w = metadata.width; - size_t h = metadata.height; - size_t progress = 0; + hr = gpubc->Prepare(w, h, options.flags, format, options.alphaWeight); + if (FAILED(hr)) + { + cImages.Release(); + return hr; + } - for (size_t level = 0; level < metadata.mipLevels; ++level) + for (size_t item = 0; item < metadata.arraySize; ++item) { - hr = gpubc->Prepare(w, h, options.flags, format, options.alphaWeight); - if (FAILED(hr)) + const size_t index = metadata.ComputeIndex(level, item, 0); + if (index >= nimages) { cImages.Release(); - return hr; + return E_FAIL; } - for (size_t item = 0; item < metadata.arraySize; ++item) - { - const size_t index = metadata.ComputeIndex(level, item, 0); - if (index >= nimages) - { - cImages.Release(); - return E_FAIL; - } + assert(dest[index].format == format); - assert(dest[index].format == format); + const Image& src = srcImages[index]; - const Image& src = srcImages[index]; + if (src.width != dest[index].width || src.height != dest[index].height) + { + cImages.Release(); + return E_FAIL; + } - if (src.width != dest[index].width || src.height != dest[index].height) - { - cImages.Release(); - return E_FAIL; - } + hr = GPUCompress(gpubc.get(), src, dest[index], options.flags); + if (FAILED(hr)) + { + cImages.Release(); + return hr; + } - hr = GPUCompress(gpubc.get(), src, dest[index], options.flags); - if (FAILED(hr)) + if (statusCallback) + { + if (!statusCallback(progress++, nimages)) { cImages.Release(); - return hr; - } - - if (statusCallback) - { - if (!statusCallback(progress++, nimages)) - { - cImages.Release(); - return E_ABORT; - } + return E_ABORT; } } + } - if (h > 1) - h >>= 1; + if (h > 1) + h >>= 1; - if (w > 1) - w >>= 1; - } + if (w > 1) + w >>= 1; } - break; + } + break; + + case TEX_DIMENSION_TEXTURE3D: { + size_t w = metadata.width; + size_t h = metadata.height; + size_t d = metadata.depth; + size_t progress = 0; - case TEX_DIMENSION_TEXTURE3D: + for (size_t level = 0; level < metadata.mipLevels; ++level) { - size_t w = metadata.width; - size_t h = metadata.height; - size_t d = metadata.depth; - size_t progress = 0; + hr = gpubc->Prepare(w, h, options.flags, format, options.alphaWeight); + if (FAILED(hr)) + { + cImages.Release(); + return hr; + } - for (size_t level = 0; level < metadata.mipLevels; ++level) + for (size_t slice = 0; slice < d; ++slice) { - hr = gpubc->Prepare(w, h, options.flags, format, options.alphaWeight); - if (FAILED(hr)) + const size_t index = metadata.ComputeIndex(level, 0, slice); + if (index >= nimages) { cImages.Release(); - return hr; + return E_FAIL; } - for (size_t slice = 0; slice < d; ++slice) - { - const size_t index = metadata.ComputeIndex(level, 0, slice); - if (index >= nimages) - { - cImages.Release(); - return E_FAIL; - } + assert(dest[index].format == format); - assert(dest[index].format == format); + const Image& src = srcImages[index]; - const Image& src = srcImages[index]; + if (src.width != dest[index].width || src.height != dest[index].height) + { + cImages.Release(); + return E_FAIL; + } - if (src.width != dest[index].width || src.height != dest[index].height) - { - cImages.Release(); - return E_FAIL; - } + hr = GPUCompress(gpubc.get(), src, dest[index], options.flags); + if (FAILED(hr)) + { + cImages.Release(); + return hr; + } - hr = GPUCompress(gpubc.get(), src, dest[index], options.flags); - if (FAILED(hr)) + if (statusCallback) + { + if (!statusCallback(progress++, nimages)) { cImages.Release(); - return hr; - } - - if (statusCallback) - { - if (!statusCallback(progress++, nimages)) - { - cImages.Release(); - return E_ABORT; - } + return E_ABORT; } } + } - if (h > 1) - h >>= 1; + if (h > 1) + h >>= 1; - if (w > 1) - w >>= 1; + if (w > 1) + w >>= 1; - if (d > 1) - d >>= 1; - } + if (d > 1) + d >>= 1; } - break; + } + break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } if (statusCallback) diff --git a/DirectXTex/DirectXTexConvert.cpp b/DirectXTex/DirectXTexConvert.cpp index 17a8a19e..886a8e05 100644 --- a/DirectXTex/DirectXTexConvert.cpp +++ b/DirectXTex/DirectXTexConvert.cpp @@ -20,7 +20,7 @@ namespace { inline uint32_t FloatTo7e3(float Value) noexcept { - uint32_t IValue = reinterpret_cast(&Value)[0]; + uint32_t IValue = reinterpret_cast(&Value)[0]; if (IValue & 0x80000000U) { @@ -39,7 +39,7 @@ namespace // The number is too small to be represented as a normalized 7e3. // Convert it to a denormalized value. const uint32_t Shift = std::min(125U - (IValue >> 23U), 24U); - IValue = (0x800000U | (IValue & 0x7FFFFFU)) >> Shift; + IValue = (0x800000U | (IValue & 0x7FFFFFU)) >> Shift; } else { @@ -56,11 +56,11 @@ namespace auto Mantissa = static_cast(Value & 0x7F); uint32_t Exponent = (Value & 0x380); - if (Exponent != 0) // The value is normalized + if (Exponent != 0) // The value is normalized { Exponent = static_cast((Value >> 7) & 0x7); } - else if (Mantissa != 0) // The value is denormalized + else if (Mantissa != 0) // The value is denormalized { // Normalize the value in the resulting float Exponent = 1; @@ -69,25 +69,24 @@ namespace { Exponent--; Mantissa <<= 1; - } - while ((Mantissa & 0x80) == 0); + } while ((Mantissa & 0x80) == 0); Mantissa &= 0x7F; } - else // The value is zero + else // The value is zero { Exponent = uint32_t(-124); } const uint32_t Result = ((Exponent + 124) << 23) | // Exponent - (Mantissa << 16); // Mantissa + (Mantissa << 16); // Mantissa return reinterpret_cast(&Result)[0]; } inline uint32_t FloatTo6e4(float Value) noexcept { - uint32_t IValue = reinterpret_cast(&Value)[0]; + uint32_t IValue = reinterpret_cast(&Value)[0]; if (IValue & 0x80000000U) { @@ -106,7 +105,7 @@ namespace // The number is too small to be represented as a normalized 6e4. // Convert it to a denormalized value. const uint32_t Shift = std::min(121U - (IValue >> 23U), 24U); - IValue = (0x800000U | (IValue & 0x7FFFFFU)) >> Shift; + IValue = (0x800000U | (IValue & 0x7FFFFFU)) >> Shift; } else { @@ -123,11 +122,11 @@ namespace uint32_t Mantissa = static_cast(Value & 0x3F); uint32_t Exponent = (Value & 0x3C0); - if (Exponent != 0) // The value is normalized + if (Exponent != 0) // The value is normalized { Exponent = static_cast((Value >> 6) & 0xF); } - else if (Mantissa != 0) // The value is denormalized + else if (Mantissa != 0) // The value is denormalized { // Normalize the value in the resulting float Exponent = 1; @@ -136,18 +135,17 @@ namespace { Exponent--; Mantissa <<= 1; - } - while ((Mantissa & 0x40) == 0); + } while ((Mantissa & 0x40) == 0); Mantissa &= 0x3F; } - else // The value is zero + else // The value is zero { Exponent = uint32_t(-120); } const uint32_t Result = ((Exponent + 120) << 23) | // Exponent - (Mantissa << 17); // Mantissa + (Mantissa << 17); // Mantissa return reinterpret_cast(&Result)[0]; } @@ -169,20 +167,24 @@ namespace float y = (tmp.y >= 0.f) ? ((tmp.y > maxf9) ? maxf9 : tmp.y) : 0.f; float z = (tmp.z >= 0.f) ? ((tmp.z > maxf9) ? maxf9 : tmp.z) : 0.f; - const float max_xy = (x > y) ? x : y; + const float max_xy = (x > y) ? x : y; const float max_xyz = (max_xy > z) ? max_xy : z; const float maxColor = (max_xyz > minf9) ? max_xyz : minf9; - union { float f; int32_t i; } fi; + union + { + float f; + int32_t i; + } fi; fi.f = maxColor; fi.i += 0x00004000; // round up leaving 9 bits in fraction (including assumed 1) // Fix applied from DirectXMath 3.10 - uint32_t exp = fi.i >> 23; + uint32_t exp = fi.i >> 23; pDestination->e = exp - 0x6f; - fi.i = 0x83000000 - (exp << 23); + fi.i = 0x83000000 - (exp << 23); float ScaleR = fi.f; pDestination->xm = static_cast(lroundf(x * ScaleR)); @@ -192,25 +194,23 @@ namespace #endif const XMVECTORF32 g_Grayscale = { { { 0.2125f, 0.7154f, 0.0721f, 0.0f } } }; - const XMVECTORF32 g_HalfMin = { { { -65504.f, -65504.f, -65504.f, -65504.f } } }; - const XMVECTORF32 g_HalfMax = { { { 65504.f, 65504.f, 65504.f, 65504.f } } }; + const XMVECTORF32 g_HalfMin = { { { -65504.f, -65504.f, -65504.f, -65504.f } } }; + const XMVECTORF32 g_HalfMax = { { { 65504.f, 65504.f, 65504.f, 65504.f } } }; - constexpr float g_8BitBias = 0.5f / 255.f; + constexpr float g_8BitBias = 0.5f / 255.f; const XMVECTORF32 g_8BitBiasV = { { { g_8BitBias, g_8BitBias, g_8BitBias, g_8BitBias } } }; -} +} // namespace //------------------------------------------------------------------------------------- // Copies an image row with optional clearing of alpha value to 1.0 // (can be used in place as well) otherwise copies the image row unmodified. //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void DirectX::Internal::CopyScanline( - void* pDestination, - size_t outSize, - const void* pSource, - size_t inSize, - DXGI_FORMAT format, - uint32_t tflags) noexcept +_Use_decl_annotations_ void DirectX::Internal::CopyScanline(void* pDestination, + size_t outSize, + const void* pSource, + size_t inSize, + DXGI_FORMAT format, + uint32_t tflags) noexcept { assert(pDestination && outSize > 0); assert(pSource && inSize > 0); @@ -246,9 +246,9 @@ void DirectX::Internal::CopyScanline( } else { - const uint32_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); - const size_t size = std::min(outSize, inSize); + const uint32_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); + const size_t size = std::min(outSize, inSize); for (size_t count = 0; count < (size - 15); count += 16) { *(dPtr++) = *(sPtr++); @@ -290,9 +290,9 @@ void DirectX::Internal::CopyScanline( } else { - const uint16_t * __restrict sPtr = static_cast(pSource); - uint16_t * __restrict dPtr = static_cast(pDestination); - const size_t size = std::min(outSize, inSize); + const uint16_t* __restrict sPtr = static_cast(pSource); + uint16_t* __restrict dPtr = static_cast(pDestination); + const size_t size = std::min(outSize, inSize); for (size_t count = 0; count < (size - 7); count += 8) { *(dPtr++) = *(sPtr++); @@ -327,9 +327,9 @@ void DirectX::Internal::CopyScanline( } else { - const uint32_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); - const size_t size = std::min(outSize, inSize); + const uint32_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); + const size_t size = std::min(outSize, inSize); for (size_t count = 0; count < (size - 3); count += 4) { *(dPtr++) = *(sPtr++) | 0xC0000000; @@ -351,7 +351,8 @@ void DirectX::Internal::CopyScanline( case DXGI_FORMAT_AYUV: if (inSize >= 4 && outSize >= 4) { - const uint32_t alpha = (format == DXGI_FORMAT_R8G8B8A8_SNORM || format == DXGI_FORMAT_R8G8B8A8_SINT) ? 0x7f000000 : 0xff000000; + const uint32_t alpha + = (format == DXGI_FORMAT_R8G8B8A8_SNORM || format == DXGI_FORMAT_R8G8B8A8_SINT) ? 0x7f000000 : 0xff000000; if (pDestination == pSource) { @@ -365,9 +366,9 @@ void DirectX::Internal::CopyScanline( } else { - const uint32_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); - const size_t size = std::min(outSize, inSize); + const uint32_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); + const size_t size = std::min(outSize, inSize); for (size_t count = 0; count < (size - 3); count += 4) { uint32_t t = *(sPtr++) & 0xFFFFFF; @@ -402,9 +403,9 @@ void DirectX::Internal::CopyScanline( } else { - const uint16_t * __restrict sPtr = static_cast(pSource); - uint16_t * __restrict dPtr = static_cast(pDestination); - const size_t size = std::min(outSize, inSize); + const uint16_t* __restrict sPtr = static_cast(pSource); + uint16_t* __restrict dPtr = static_cast(pDestination); + const size_t size = std::min(outSize, inSize); for (size_t count = 0; count < (size - 1); count += 2) { *(dPtr++) = uint16_t(*(sPtr++) | alpha); @@ -414,12 +415,9 @@ void DirectX::Internal::CopyScanline( return; //----------------------------------------------------------------------------- - case DXGI_FORMAT_A8_UNORM: - memset(pDestination, 0xff, outSize); - return; + case DXGI_FORMAT_A8_UNORM: memset(pDestination, 0xff, outSize); return; - default: - break; + default: break; } } @@ -431,19 +429,16 @@ void DirectX::Internal::CopyScanline( memcpy(pDestination, pSource, size); } - //------------------------------------------------------------------------------------- // Swizzles (RGB <-> BGR) an image row with optional clearing of alpha value to 1.0 // (can be used in place as well) otherwise copies the image row unmodified. //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -void DirectX::Internal::SwizzleScanline( - void* pDestination, - size_t outSize, - const void* pSource, - size_t inSize, - DXGI_FORMAT format, - uint32_t tflags) noexcept +_Use_decl_annotations_ void DirectX::Internal::SwizzleScanline(void* pDestination, + size_t outSize, + const void* pSource, + size_t inSize, + DXGI_FORMAT format, + uint32_t tflags) noexcept { assert(pDestination && outSize > 0); assert(pSource && inSize > 0); @@ -479,9 +474,9 @@ void DirectX::Internal::SwizzleScanline( } else { - const uint32_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); - const size_t size = std::min(outSize, inSize); + const uint32_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); + const size_t size = std::min(outSize, inSize); for (size_t count = 0; count < (size - 3); count += 4) { const uint32_t t = *(sPtr++); @@ -529,9 +524,9 @@ void DirectX::Internal::SwizzleScanline( } else { - const uint32_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); - const size_t size = std::min(outSize, inSize); + const uint32_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); + const size_t size = std::min(outSize, inSize); for (size_t count = 0; count < (size - 3); count += 4) { const uint32_t t = *(sPtr++); @@ -572,9 +567,9 @@ void DirectX::Internal::SwizzleScanline( } else { - const uint32_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); - const size_t size = std::min(outSize, inSize); + const uint32_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); + const size_t size = std::min(outSize, inSize); for (size_t count = 0; count < (size - 3); count += 4) { const uint32_t t = *(sPtr++); @@ -592,8 +587,7 @@ void DirectX::Internal::SwizzleScanline( } break; - default: - break; + default: break; } // Fall-through case is to just use memcpy (assuming this is not an in-place operation) @@ -604,20 +598,17 @@ void DirectX::Internal::SwizzleScanline( memcpy(pDestination, pSource, size); } - //------------------------------------------------------------------------------------- // Converts an image row with optional clearing of alpha value to 1.0 // Returns true if supported, false if expansion case not supported //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::Internal::ExpandScanline( - void* pDestination, - size_t outSize, - DXGI_FORMAT outFormat, - const void* pSource, - size_t inSize, - DXGI_FORMAT inFormat, - uint32_t tflags) noexcept +_Use_decl_annotations_ bool DirectX::Internal::ExpandScanline(void* pDestination, + size_t outSize, + DXGI_FORMAT outFormat, + const void* pSource, + size_t inSize, + DXGI_FORMAT inFormat, + uint32_t tflags) noexcept { assert(pDestination && outSize > 0); assert(pSource && inSize > 0); @@ -633,8 +624,8 @@ bool DirectX::Internal::ExpandScanline( // DXGI_FORMAT_B5G6R5_UNORM -> DXGI_FORMAT_R8G8B8A8_UNORM if (inSize >= 2 && outSize >= 4) { - const uint16_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + const uint16_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 3))); icount += 2, ocount += 4) { @@ -657,8 +648,8 @@ bool DirectX::Internal::ExpandScanline( // DXGI_FORMAT_B5G5R5A1_UNORM -> DXGI_FORMAT_R8G8B8A8_UNORM if (inSize >= 2 && outSize >= 4) { - const uint16_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + const uint16_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 3))); icount += 2, ocount += 4) { @@ -682,8 +673,8 @@ bool DirectX::Internal::ExpandScanline( // DXGI_FORMAT_B4G4R4A4_UNORM -> DXGI_FORMAT_R8G8B8A8_UNORM if (inSize >= 2 && outSize >= 4) { - const uint16_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + const uint16_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 3))); icount += 2, ocount += 4) { @@ -707,8 +698,8 @@ bool DirectX::Internal::ExpandScanline( // DXGI_FORMAT_A4B4G4R4_UNORM -> DXGI_FORMAT_R8G8B8A8_UNORM if (inSize >= 2 && outSize >= 4) { - const uint16_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + const uint16_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 3))); icount += 2, ocount += 4) { @@ -725,63 +716,60 @@ bool DirectX::Internal::ExpandScanline( } return false; - default: - return false; + default: return false; } } - //------------------------------------------------------------------------------------- // Loads an image row into standard RGBA XMVECTOR (aligned) array //------------------------------------------------------------------------------------- -#define LOAD_SCANLINE( type, func )\ - if (size >= sizeof(type))\ - {\ - const type * __restrict sPtr = reinterpret_cast(pSource);\ - for(size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type))\ - {\ - if (dPtr >= ePtr) break;\ - *(dPtr++) = func(sPtr++);\ - }\ - return true;\ - }\ - return false; +#define LOAD_SCANLINE(type, func) \ + if (size >= sizeof(type)) \ + { \ + const type* __restrict sPtr = reinterpret_cast(pSource); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + if (dPtr >= ePtr) \ + break; \ + *(dPtr++) = func(sPtr++); \ + } \ + return true; \ + } \ + return false; -#define LOAD_SCANLINE3( type, func, defvec )\ - if (size >= sizeof(type))\ - {\ - const type * __restrict sPtr = reinterpret_cast(pSource);\ - for(size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type))\ - {\ - const XMVECTOR v = func(sPtr++);\ - if (dPtr >= ePtr) break;\ - *(dPtr++) = XMVectorSelect(defvec, v, g_XMSelect1110);\ - }\ - return true;\ - }\ - return false; +#define LOAD_SCANLINE3(type, func, defvec) \ + if (size >= sizeof(type)) \ + { \ + const type* __restrict sPtr = reinterpret_cast(pSource); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + const XMVECTOR v = func(sPtr++); \ + if (dPtr >= ePtr) \ + break; \ + *(dPtr++) = XMVectorSelect(defvec, v, g_XMSelect1110); \ + } \ + return true; \ + } \ + return false; -#define LOAD_SCANLINE2( type, func, defvec )\ - if (size >= sizeof(type))\ - {\ - const type * __restrict sPtr = reinterpret_cast(pSource);\ - for(size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type))\ - {\ - const XMVECTOR v = func(sPtr++);\ - if (dPtr >= ePtr) break;\ - *(dPtr++) = XMVectorSelect(defvec, v, g_XMSelect1100);\ - }\ - return true;\ - }\ - return false; +#define LOAD_SCANLINE2(type, func, defvec) \ + if (size >= sizeof(type)) \ + { \ + const type* __restrict sPtr = reinterpret_cast(pSource); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + const XMVECTOR v = func(sPtr++); \ + if (dPtr >= ePtr) \ + break; \ + *(dPtr++) = XMVectorSelect(defvec, v, g_XMSelect1100); \ + } \ + return true; \ + } \ + return false; -#pragma warning(suppress: 6101) -_Use_decl_annotations_ bool DirectX::Internal::LoadScanline( - XMVECTOR* pDestination, - size_t count, - const void* pSource, - size_t size, - DXGI_FORMAT format) noexcept +#pragma warning(suppress : 6101) +_Use_decl_annotations_ bool +DirectX::Internal::LoadScanline(XMVECTOR* pDestination, size_t count, const void* pSource, size_t size, DXGI_FORMAT format) noexcept { assert(pDestination && count > 0 && ((reinterpret_cast(pDestination) & 0xF) == 0)); assert(pSource && size > 0); @@ -795,144 +783,117 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( switch (static_cast(format)) { - case DXGI_FORMAT_R32G32B32A32_FLOAT: - { - const size_t msize = (size > (sizeof(XMVECTOR)*count)) ? (sizeof(XMVECTOR)*count) : size; - memcpy(dPtr, pSource, msize); - } + case DXGI_FORMAT_R32G32B32A32_FLOAT: { + const size_t msize = (size > (sizeof(XMVECTOR) * count)) ? (sizeof(XMVECTOR) * count) : size; + memcpy(dPtr, pSource, msize); + } return true; - case DXGI_FORMAT_R32G32B32A32_UINT: - LOAD_SCANLINE(XMUINT4, XMLoadUInt4) + case DXGI_FORMAT_R32G32B32A32_UINT: LOAD_SCANLINE(XMUINT4, XMLoadUInt4) - case DXGI_FORMAT_R32G32B32A32_SINT: - LOAD_SCANLINE(XMINT4, XMLoadSInt4) + case DXGI_FORMAT_R32G32B32A32_SINT: LOAD_SCANLINE(XMINT4, XMLoadSInt4) - case DXGI_FORMAT_R32G32B32_FLOAT: - LOAD_SCANLINE3(XMFLOAT3, XMLoadFloat3, g_XMIdentityR3) + case DXGI_FORMAT_R32G32B32_FLOAT: LOAD_SCANLINE3(XMFLOAT3, XMLoadFloat3, g_XMIdentityR3) - case DXGI_FORMAT_R32G32B32_UINT: - LOAD_SCANLINE3(XMUINT3, XMLoadUInt3, g_XMIdentityR3) + case DXGI_FORMAT_R32G32B32_UINT: LOAD_SCANLINE3(XMUINT3, XMLoadUInt3, g_XMIdentityR3) - case DXGI_FORMAT_R32G32B32_SINT: - LOAD_SCANLINE3(XMINT3, XMLoadSInt3, g_XMIdentityR3) + case DXGI_FORMAT_R32G32B32_SINT: LOAD_SCANLINE3(XMINT3, XMLoadSInt3, g_XMIdentityR3) - case DXGI_FORMAT_R16G16B16A16_FLOAT: - LOAD_SCANLINE(XMHALF4, XMLoadHalf4) + case DXGI_FORMAT_R16G16B16A16_FLOAT: LOAD_SCANLINE(XMHALF4, XMLoadHalf4) - case DXGI_FORMAT_R16G16B16A16_UNORM: - LOAD_SCANLINE(XMUSHORTN4, XMLoadUShortN4) + case DXGI_FORMAT_R16G16B16A16_UNORM: LOAD_SCANLINE(XMUSHORTN4, XMLoadUShortN4) - case DXGI_FORMAT_R16G16B16A16_UINT: - LOAD_SCANLINE(XMUSHORT4, XMLoadUShort4) + case DXGI_FORMAT_R16G16B16A16_UINT: LOAD_SCANLINE(XMUSHORT4, XMLoadUShort4) - case DXGI_FORMAT_R16G16B16A16_SNORM: - LOAD_SCANLINE(XMSHORTN4, XMLoadShortN4) + case DXGI_FORMAT_R16G16B16A16_SNORM: LOAD_SCANLINE(XMSHORTN4, XMLoadShortN4) - case DXGI_FORMAT_R16G16B16A16_SINT: - LOAD_SCANLINE(XMSHORT4, XMLoadShort4) + case DXGI_FORMAT_R16G16B16A16_SINT: LOAD_SCANLINE(XMSHORT4, XMLoadShort4) - case DXGI_FORMAT_R32G32_FLOAT: - LOAD_SCANLINE2(XMFLOAT2, XMLoadFloat2, g_XMIdentityR3) + case DXGI_FORMAT_R32G32_FLOAT: LOAD_SCANLINE2(XMFLOAT2, XMLoadFloat2, g_XMIdentityR3) - case DXGI_FORMAT_R32G32_UINT: - LOAD_SCANLINE2(XMUINT2, XMLoadUInt2, g_XMIdentityR3) + case DXGI_FORMAT_R32G32_UINT: LOAD_SCANLINE2(XMUINT2, XMLoadUInt2, g_XMIdentityR3) - case DXGI_FORMAT_R32G32_SINT: - LOAD_SCANLINE2(XMINT2, XMLoadSInt2, g_XMIdentityR3) + case DXGI_FORMAT_R32G32_SINT: LOAD_SCANLINE2(XMINT2, XMLoadSInt2, g_XMIdentityR3) - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: { + constexpr size_t psize = sizeof(float) + sizeof(uint32_t); + if (size >= psize) + { + auto sPtr = static_cast(pSource); + for (size_t icount = 0; icount < (size - psize + 1); icount += psize) { - constexpr size_t psize = sizeof(float) + sizeof(uint32_t); - if (size >= psize) - { - auto sPtr = static_cast(pSource); - for (size_t icount = 0; icount < (size - psize + 1); icount += psize) - { - auto ps8 = reinterpret_cast(&sPtr[1]); - if (dPtr >= ePtr) break; - *(dPtr++) = XMVectorSet(sPtr[0], static_cast(*ps8), 0.f, 1.f); - sPtr += 2; - } - return true; - } + auto ps8 = reinterpret_cast(&sPtr[1]); + if (dPtr >= ePtr) + break; + *(dPtr++) = XMVectorSet(sPtr[0], static_cast(*ps8), 0.f, 1.f); + sPtr += 2; } - return false; + return true; + } + } + return false; - case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: + case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: { + constexpr size_t psize = sizeof(float) + sizeof(uint32_t); + if (size >= psize) { - constexpr size_t psize = sizeof(float) + sizeof(uint32_t); - if (size >= psize) + auto sPtr = static_cast(pSource); + for (size_t icount = 0; icount < (size - psize + 1); icount += psize) { - auto sPtr = static_cast(pSource); - for (size_t icount = 0; icount < (size - psize + 1); icount += psize) - { - if (dPtr >= ePtr) break; - *(dPtr++) = XMVectorSet(sPtr[0], 0.f /* typeless component assumed zero */, 0.f, 1.f); - sPtr += 2; - } - return true; + if (dPtr >= ePtr) + break; + *(dPtr++) = XMVectorSet(sPtr[0], 0.f /* typeless component assumed zero */, 0.f, 1.f); + sPtr += 2; } + return true; } + } return false; - case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: + case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: { + constexpr size_t psize = sizeof(float) + sizeof(uint32_t); + if (size >= psize) { - constexpr size_t psize = sizeof(float) + sizeof(uint32_t); - if (size >= psize) + auto sPtr = static_cast(pSource); + for (size_t icount = 0; icount < (size - psize + 1); icount += psize) { - auto sPtr = static_cast(pSource); - for (size_t icount = 0; icount < (size - psize + 1); icount += psize) - { - auto pg8 = reinterpret_cast(&sPtr[1]); - if (dPtr >= ePtr) break; - *(dPtr++) = XMVectorSet(0.f /* typeless component assumed zero */, static_cast(*pg8), 0.f, 1.f); - sPtr += 2; - } - return true; + auto pg8 = reinterpret_cast(&sPtr[1]); + if (dPtr >= ePtr) + break; + *(dPtr++) = XMVectorSet(0.f /* typeless component assumed zero */, static_cast(*pg8), 0.f, 1.f); + sPtr += 2; } + return true; } + } return false; - case DXGI_FORMAT_R10G10B10A2_UNORM: - LOAD_SCANLINE(XMUDECN4, XMLoadUDecN4) + case DXGI_FORMAT_R10G10B10A2_UNORM: LOAD_SCANLINE(XMUDECN4, XMLoadUDecN4) - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - LOAD_SCANLINE(XMUDECN4, XMLoadUDecN4_XR) + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: LOAD_SCANLINE(XMUDECN4, XMLoadUDecN4_XR) - case DXGI_FORMAT_R10G10B10A2_UINT: - LOAD_SCANLINE(XMUDEC4, XMLoadUDec4) + case DXGI_FORMAT_R10G10B10A2_UINT: LOAD_SCANLINE(XMUDEC4, XMLoadUDec4) - case DXGI_FORMAT_R11G11B10_FLOAT: - LOAD_SCANLINE3(XMFLOAT3PK, XMLoadFloat3PK, g_XMIdentityR3) + case DXGI_FORMAT_R11G11B10_FLOAT: LOAD_SCANLINE3(XMFLOAT3PK, XMLoadFloat3PK, g_XMIdentityR3) case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - LOAD_SCANLINE(XMUBYTEN4, XMLoadUByteN4) + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: LOAD_SCANLINE(XMUBYTEN4, XMLoadUByteN4) - case DXGI_FORMAT_R8G8B8A8_UINT: - LOAD_SCANLINE(XMUBYTE4, XMLoadUByte4) + case DXGI_FORMAT_R8G8B8A8_UINT: LOAD_SCANLINE(XMUBYTE4, XMLoadUByte4) - case DXGI_FORMAT_R8G8B8A8_SNORM: - LOAD_SCANLINE(XMBYTEN4, XMLoadByteN4) + case DXGI_FORMAT_R8G8B8A8_SNORM: LOAD_SCANLINE(XMBYTEN4, XMLoadByteN4) - case DXGI_FORMAT_R8G8B8A8_SINT: - LOAD_SCANLINE(XMBYTE4, XMLoadByte4) + case DXGI_FORMAT_R8G8B8A8_SINT: LOAD_SCANLINE(XMBYTE4, XMLoadByte4) - case DXGI_FORMAT_R16G16_FLOAT: - LOAD_SCANLINE2(XMHALF2, XMLoadHalf2, g_XMIdentityR3) + case DXGI_FORMAT_R16G16_FLOAT: LOAD_SCANLINE2(XMHALF2, XMLoadHalf2, g_XMIdentityR3) - case DXGI_FORMAT_R16G16_UNORM: - LOAD_SCANLINE2(XMUSHORTN2, XMLoadUShortN2, g_XMIdentityR3) + case DXGI_FORMAT_R16G16_UNORM: LOAD_SCANLINE2(XMUSHORTN2, XMLoadUShortN2, g_XMIdentityR3) - case DXGI_FORMAT_R16G16_UINT: - LOAD_SCANLINE2(XMUSHORT2, XMLoadUShort2, g_XMIdentityR3) + case DXGI_FORMAT_R16G16_UINT: LOAD_SCANLINE2(XMUSHORT2, XMLoadUShort2, g_XMIdentityR3) - case DXGI_FORMAT_R16G16_SNORM: - LOAD_SCANLINE2(XMSHORTN2, XMLoadShortN2, g_XMIdentityR3) + case DXGI_FORMAT_R16G16_SNORM: LOAD_SCANLINE2(XMSHORTN2, XMLoadShortN2, g_XMIdentityR3) - case DXGI_FORMAT_R16G16_SINT: - LOAD_SCANLINE2(XMSHORT2, XMLoadShort2, g_XMIdentityR3) + case DXGI_FORMAT_R16G16_SINT: LOAD_SCANLINE2(XMSHORT2, XMLoadShort2, g_XMIdentityR3) case DXGI_FORMAT_D32_FLOAT: case DXGI_FORMAT_R32_FLOAT: @@ -942,7 +903,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( for (size_t icount = 0; icount < (size - sizeof(float) + 1); icount += sizeof(float)) { const XMVECTOR v = XMLoadFloat(sPtr++); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1000); } return true; @@ -956,8 +918,9 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( for (size_t icount = 0; icount < (size - sizeof(uint32_t) + 1); icount += sizeof(uint32_t)) { XMVECTOR v = XMLoadInt(sPtr++); - v = XMConvertVectorUIntToFloat(v, 0); - if (dPtr >= ePtr) break; + v = XMConvertVectorUIntToFloat(v, 0); + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1000); } return true; @@ -967,12 +930,13 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_R32_SINT: if (size >= sizeof(int32_t)) { - const int32_t * __restrict sPtr = static_cast(pSource); + const int32_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(int32_t) + 1); icount += sizeof(int32_t)) { XMVECTOR v = XMLoadInt(reinterpret_cast(sPtr++)); - v = XMConvertVectorIntToFloat(v, 0); - if (dPtr >= ePtr) break; + v = XMConvertVectorIntToFloat(v, 0); + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1000); } return true; @@ -988,7 +952,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( const auto d = static_cast(*sPtr & 0xFFFFFF) / 16777215.f; const auto s = static_cast((*sPtr & 0xFF000000) >> 24); ++sPtr; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(d, s, 0.f, 1.f); } return true; @@ -1003,7 +968,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( { const auto r = static_cast(*sPtr & 0xFFFFFF) / 16777215.f; ++sPtr; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(r, 0.f /* typeless component assumed zero */, 0.f, 1.f); } return true; @@ -1018,32 +984,30 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( { const auto g = static_cast((*sPtr & 0xFF000000) >> 24); ++sPtr; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(0.f /* typeless component assumed zero */, g, 0.f, 1.f); } return true; } return false; - case DXGI_FORMAT_R8G8_UNORM: - LOAD_SCANLINE2(XMUBYTEN2, XMLoadUByteN2, g_XMIdentityR3) + case DXGI_FORMAT_R8G8_UNORM: LOAD_SCANLINE2(XMUBYTEN2, XMLoadUByteN2, g_XMIdentityR3) - case DXGI_FORMAT_R8G8_UINT: - LOAD_SCANLINE2(XMUBYTE2, XMLoadUByte2, g_XMIdentityR3) + case DXGI_FORMAT_R8G8_UINT: LOAD_SCANLINE2(XMUBYTE2, XMLoadUByte2, g_XMIdentityR3) - case DXGI_FORMAT_R8G8_SNORM: - LOAD_SCANLINE2(XMBYTEN2, XMLoadByteN2, g_XMIdentityR3) + case DXGI_FORMAT_R8G8_SNORM: LOAD_SCANLINE2(XMBYTEN2, XMLoadByteN2, g_XMIdentityR3) - case DXGI_FORMAT_R8G8_SINT: - LOAD_SCANLINE2(XMBYTE2, XMLoadByte2, g_XMIdentityR3) + case DXGI_FORMAT_R8G8_SINT: LOAD_SCANLINE2(XMBYTE2, XMLoadByte2, g_XMIdentityR3) case DXGI_FORMAT_R16_FLOAT: if (size >= sizeof(HALF)) { - const HALF * __restrict sPtr = static_cast(pSource); + const HALF* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(HALF) + 1); icount += sizeof(HALF)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(XMConvertHalfToFloat(*sPtr++), 0.f, 0.f, 1.f); } return true; @@ -1057,7 +1021,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( const uint16_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(uint16_t) + 1); icount += sizeof(uint16_t)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(static_cast(*sPtr++) / 65535.f, 0.f, 0.f, 1.f); } return true; @@ -1067,10 +1032,11 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_R16_UINT: if (size >= sizeof(uint16_t)) { - const uint16_t * __restrict sPtr = static_cast(pSource); + const uint16_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(uint16_t) + 1); icount += sizeof(uint16_t)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(static_cast(*sPtr++), 0.f, 0.f, 1.f); } return true; @@ -1080,10 +1046,11 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_R16_SNORM: if (size >= sizeof(int16_t)) { - const int16_t * __restrict sPtr = static_cast(pSource); + const int16_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(int16_t) + 1); icount += sizeof(int16_t)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(static_cast(*sPtr++) / 32767.f, 0.f, 0.f, 1.f); } return true; @@ -1093,10 +1060,11 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_R16_SINT: if (size >= sizeof(int16_t)) { - const int16_t * __restrict sPtr = static_cast(pSource); + const int16_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(int16_t) + 1); icount += sizeof(int16_t)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(static_cast(*sPtr++), 0.f, 0.f, 1.f); } return true; @@ -1106,10 +1074,11 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_R8_UNORM: if (size >= sizeof(uint8_t)) { - const uint8_t * __restrict sPtr = static_cast(pSource); + const uint8_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < size; icount += sizeof(uint8_t)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(static_cast(*sPtr++) / 255.f, 0.f, 0.f, 1.f); } return true; @@ -1119,10 +1088,11 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_R8_UINT: if (size >= sizeof(uint8_t)) { - const uint8_t * __restrict sPtr = static_cast(pSource); + const uint8_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < size; icount += sizeof(uint8_t)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(static_cast(*sPtr++), 0.f, 0.f, 1.f); } return true; @@ -1132,10 +1102,11 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_R8_SNORM: if (size >= sizeof(int8_t)) { - const int8_t * __restrict sPtr = static_cast(pSource); + const int8_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < size; icount += sizeof(int8_t)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(static_cast(*sPtr++) / 127.f, 0.f, 0.f, 1.f); } return true; @@ -1145,10 +1116,11 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_R8_SINT: if (size >= sizeof(int8_t)) { - const int8_t * __restrict sPtr = static_cast(pSource); + const int8_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < size; icount += sizeof(int8_t)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(static_cast(*sPtr++), 0.f, 0.f, 1.f); } return true; @@ -1158,10 +1130,11 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_A8_UNORM: if (size >= sizeof(uint8_t)) { - const uint8_t * __restrict sPtr = static_cast(pSource); + const uint8_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < size; icount += sizeof(uint8_t)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(0.f, 0.f, 0.f, static_cast(*sPtr++) / 255.f); } return true; @@ -1171,12 +1144,13 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_R1_UNORM: if (size >= sizeof(uint8_t)) { - const uint8_t * __restrict sPtr = static_cast(pSource); + const uint8_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < size; icount += sizeof(uint8_t)) { for (size_t bcount = 8; bcount > 0; --bcount) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet((((*sPtr >> (bcount - 1)) & 0x1) ? 1.f : 0.f), 0.f, 0.f, 1.f); } @@ -1186,20 +1160,21 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( } return false; - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - LOAD_SCANLINE3(XMFLOAT3SE, XMLoadFloat3SE, g_XMIdentityR3) + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: LOAD_SCANLINE3(XMFLOAT3SE, XMLoadFloat3SE, g_XMIdentityR3) case DXGI_FORMAT_R8G8_B8G8_UNORM: if (size >= sizeof(XMUBYTEN4)) { - const XMUBYTEN4 * __restrict sPtr = static_cast(pSource); + const XMUBYTEN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - const XMVECTOR v = XMLoadUByteN4(sPtr++); + const XMVECTOR v = XMLoadUByteN4(sPtr++); const XMVECTOR v1 = XMVectorSwizzle<0, 3, 2, 1>(v); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1110); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v1, g_XMSelect1110); } return true; @@ -1209,15 +1184,17 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_G8R8_G8B8_UNORM: if (size >= sizeof(XMUBYTEN4)) { - const XMUBYTEN4 * __restrict sPtr = static_cast(pSource); + const XMUBYTEN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - const XMVECTOR v = XMLoadUByteN4(sPtr++); + const XMVECTOR v = XMLoadUByteN4(sPtr++); const XMVECTOR v0 = XMVectorSwizzle<1, 0, 3, 2>(v); const XMVECTOR v1 = XMVectorSwizzle<1, 2, 3, 0>(v); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v0, g_XMSelect1110); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v1, g_XMSelect1110); } return true; @@ -1228,13 +1205,14 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( if (size >= sizeof(XMU565)) { static const XMVECTORF32 s_Scale = { { { 1.f / 31.f, 1.f / 63.f, 1.f / 31.f, 1.f } } }; - const XMU565 * __restrict sPtr = static_cast(pSource); + const XMU565* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMU565) + 1); icount += sizeof(XMU565)) { XMVECTOR v = XMLoadU565(sPtr++); - v = XMVectorMultiply(v, s_Scale); - v = XMVectorSwizzle<2, 1, 0, 3>(v); - if (dPtr >= ePtr) break; + v = XMVectorMultiply(v, s_Scale); + v = XMVectorSwizzle<2, 1, 0, 3>(v); + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1110); } return true; @@ -1245,12 +1223,13 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( if (size >= sizeof(XMU555)) { static const XMVECTORF32 s_Scale = { { { 1.f / 31.f, 1.f / 31.f, 1.f / 31.f, 1.f } } }; - const XMU555 * __restrict sPtr = static_cast(pSource); + const XMU555* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMU555) + 1); icount += sizeof(XMU555)) { XMVECTOR v = XMLoadU555(sPtr++); - v = XMVectorMultiply(v, s_Scale); - if (dPtr >= ePtr) break; + v = XMVectorMultiply(v, s_Scale); + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSwizzle<2, 1, 0, 3>(v); } return true; @@ -1261,11 +1240,12 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: if (size >= sizeof(XMUBYTEN4)) { - const XMUBYTEN4 * __restrict sPtr = static_cast(pSource); + const XMUBYTEN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { const XMVECTOR v = XMLoadUByteN4(sPtr++); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSwizzle<2, 1, 0, 3>(v); } return true; @@ -1276,12 +1256,13 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: if (size >= sizeof(XMUBYTEN4)) { - const XMUBYTEN4 * __restrict sPtr = static_cast(pSource); + const XMUBYTEN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { XMVECTOR v = XMLoadUByteN4(sPtr++); - v = XMVectorSwizzle<2, 1, 0, 3>(v); - if (dPtr >= ePtr) break; + v = XMVectorSwizzle<2, 1, 0, 3>(v); + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1110); } return true; @@ -1291,12 +1272,12 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_AYUV: if (size >= sizeof(XMUBYTEN4)) { - const XMUBYTEN4 * __restrict sPtr = static_cast(pSource); + const XMUBYTEN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - const int v = int(sPtr->x) - 128; - const int u = int(sPtr->y) - 128; - const int y = int(sPtr->z) - 16; + const int v = int(sPtr->x) - 128; + const int u = int(sPtr->y) - 128; + const int y = int(sPtr->z) - 16; const unsigned int a = sPtr->w; ++sPtr; @@ -1314,7 +1295,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( const int g = (298 * y - 100 * u - 208 * v + 128) >> 8; const int b = (298 * y + 516 * u + 128) >> 8; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(float(std::min(std::max(r, 0), 255)) / 255.f, float(std::min(std::max(g, 0), 255)) / 255.f, float(std::min(std::max(b, 0), 255)) / 255.f, @@ -1327,12 +1309,12 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_Y410: if (size >= sizeof(XMUDECN4)) { - const XMUDECN4 * __restrict sPtr = static_cast(pSource); + const XMUDECN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUDECN4) + 1); icount += sizeof(XMUDECN4)) { - const int64_t u = int(sPtr->x) - 512; - const int64_t y = int(sPtr->y) - 64; - const int64_t v = int(sPtr->z) - 512; + const int64_t u = int(sPtr->x) - 512; + const int64_t y = int(sPtr->y) - 64; + const int64_t v = int(sPtr->z) - 512; const unsigned int a = sPtr->w; ++sPtr; @@ -1350,7 +1332,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( const auto g = static_cast((76533 * y - 25747 * u - 53425 * v + 32768) >> 16); const auto b = static_cast((76533 * y + 132590 * u + 32768) >> 16); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(float(std::min(std::max(r, 0), 1023)) / 1023.f, float(std::min(std::max(g, 0), 1023)) / 1023.f, float(std::min(std::max(b, 0), 1023)) / 1023.f, @@ -1363,13 +1346,13 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_Y416: if (size >= sizeof(XMUSHORTN4)) { - const XMUSHORTN4 * __restrict sPtr = static_cast(pSource); + const XMUSHORTN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUSHORTN4) + 1); icount += sizeof(XMUSHORTN4)) { const int64_t u = int64_t(sPtr->x) - 32768; const int64_t y = int64_t(sPtr->y) - 4096; const int64_t v = int64_t(sPtr->z) - 32768; - const auto a = static_cast(sPtr->w); + const auto a = static_cast(sPtr->w); ++sPtr; // http://msdn.microsoft.com/en-us/library/windows/desktop/bb970578.aspx @@ -1386,7 +1369,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( const auto g = static_cast((76607 * y - 25772 * u - 53477 * v + 32768) >> 16); const auto b = static_cast((76607 * y + 132718 * u + 32768) >> 16); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(float(std::min(std::max(r, 0), 65535)) / 65535.f, float(std::min(std::max(g, 0), 65535)) / 65535.f, float(std::min(std::max(b, 0), 65535)) / 65535.f, @@ -1399,13 +1383,13 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_YUY2: if (size >= sizeof(XMUBYTEN4)) { - const XMUBYTEN4 * __restrict sPtr = static_cast(pSource); + const XMUBYTEN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { const int y0 = int(sPtr->x) - 16; - const int u = int(sPtr->y) - 128; + const int u = int(sPtr->y) - 128; const int y1 = int(sPtr->z) - 16; - const int v = int(sPtr->w) - 128; + const int v = int(sPtr->w) - 128; ++sPtr; // See AYUV @@ -1413,7 +1397,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( int g = (298 * y0 - 100 * u - 208 * v + 128) >> 8; int b = (298 * y0 + 516 * u + 128) >> 8; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(float(std::min(std::max(r, 0), 255)) / 255.f, float(std::min(std::max(g, 0), 255)) / 255.f, float(std::min(std::max(b, 0), 255)) / 255.f, @@ -1423,7 +1408,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( g = (298 * y1 - 100 * u - 208 * v + 128) >> 8; b = (298 * y1 + 516 * u + 128) >> 8; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(float(std::min(std::max(r, 0), 255)) / 255.f, float(std::min(std::max(g, 0), 255)) / 255.f, float(std::min(std::max(b, 0), 255)) / 255.f, @@ -1437,13 +1423,13 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( // Same as Y216 with least significant 6 bits set to zero if (size >= sizeof(XMUSHORTN4)) { - const XMUSHORTN4 * __restrict sPtr = static_cast(pSource); + const XMUSHORTN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUSHORTN4) + 1); icount += sizeof(XMUSHORTN4)) { const int64_t y0 = int64_t(sPtr->x >> 6) - 64; - const int64_t u = int64_t(sPtr->y >> 6) - 512; + const int64_t u = int64_t(sPtr->y >> 6) - 512; const int64_t y1 = int64_t(sPtr->z >> 6) - 64; - const int64_t v = int64_t(sPtr->w >> 6) - 512; + const int64_t v = int64_t(sPtr->w >> 6) - 512; ++sPtr; // See Y410 @@ -1451,7 +1437,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( auto g = static_cast((76533 * y0 - 25747 * u - 53425 * v + 32768) >> 16); auto b = static_cast((76533 * y0 + 132590 * u + 32768) >> 16); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(float(std::min(std::max(r, 0), 1023)) / 1023.f, float(std::min(std::max(g, 0), 1023)) / 1023.f, float(std::min(std::max(b, 0), 1023)) / 1023.f, @@ -1461,7 +1448,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( g = static_cast((76533 * y1 - 25747 * u - 53425 * v + 32768) >> 16); b = static_cast((76533 * y1 + 132590 * u + 32768) >> 16); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(float(std::min(std::max(r, 0), 1023)) / 1023.f, float(std::min(std::max(g, 0), 1023)) / 1023.f, float(std::min(std::max(b, 0), 1023)) / 1023.f, @@ -1474,13 +1462,13 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_Y216: if (size >= sizeof(XMUSHORTN4)) { - const XMUSHORTN4 * __restrict sPtr = static_cast(pSource); + const XMUSHORTN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUSHORTN4) + 1); icount += sizeof(XMUSHORTN4)) { const int64_t y0 = int64_t(sPtr->x) - 4096; - const int64_t u = int64_t(sPtr->y) - 32768; + const int64_t u = int64_t(sPtr->y) - 32768; const int64_t y1 = int64_t(sPtr->z) - 4096; - const int64_t v = int64_t(sPtr->w) - 32768; + const int64_t v = int64_t(sPtr->w) - 32768; ++sPtr; // See Y416 @@ -1488,7 +1476,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( auto g = static_cast((76607 * y0 - 25772 * u - 53477 * v + 32768) >> 16); auto b = static_cast((76607 * y0 + 132718 * u + 32768) >> 16); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(float(std::min(std::max(r, 0), 65535)) / 65535.f, float(std::min(std::max(g, 0), 65535)) / 65535.f, float(std::min(std::max(b, 0), 65535)) / 65535.f, @@ -1498,7 +1487,8 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( g = static_cast((76607 * y1 - 25772 * u - 53477 * v + 32768) >> 16); b = static_cast((76607 * y1 + 132718 * u + 32768) >> 16); - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSet(float(std::min(std::max(r, 0), 65535)) / 65535.f, float(std::min(std::max(g, 0), 65535)) / 65535.f, float(std::min(std::max(b, 0), 65535)) / 65535.f, @@ -1511,13 +1501,14 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case DXGI_FORMAT_B4G4R4A4_UNORM: if (size >= sizeof(XMUNIBBLE4)) { - static const XMVECTORF32 s_Scale = { { { 1.f / 15.f, 1.f / 15.f, 1.f / 15.f, 1.f / 15.f } } }; - const XMUNIBBLE4 * __restrict sPtr = static_cast(pSource); + static const XMVECTORF32 s_Scale = { { { 1.f / 15.f, 1.f / 15.f, 1.f / 15.f, 1.f / 15.f } } }; + const XMUNIBBLE4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUNIBBLE4) + 1); icount += sizeof(XMUNIBBLE4)) { XMVECTOR v = XMLoadUNibble4(sPtr++); - v = XMVectorMultiply(v, s_Scale); - if (dPtr >= ePtr) break; + v = XMVectorMultiply(v, s_Scale); + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSwizzle<2, 1, 0, 3>(v); } return true; @@ -1527,13 +1518,14 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: if (size >= sizeof(XMUNIBBLE4)) { - static const XMVECTORF32 s_Scale = { { { 1.f / 15.f, 1.f / 15.f, 1.f / 15.f, 1.f / 15.f } } }; - const XMUNIBBLE4 * __restrict sPtr = static_cast(pSource); + static const XMVECTORF32 s_Scale = { { { 1.f / 15.f, 1.f / 15.f, 1.f / 15.f, 1.f / 15.f } } }; + const XMUNIBBLE4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUNIBBLE4) + 1); icount += sizeof(XMUNIBBLE4)) { XMVECTOR v = XMLoadUNibble4(sPtr++); - v = XMVectorMultiply(v, s_Scale); - if (dPtr >= ePtr) break; + v = XMVectorMultiply(v, s_Scale); + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSwizzle<3, 2, 1, 0>(v); } return true; @@ -1544,17 +1536,15 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( // Xbox One specific 7e3 format if (size >= sizeof(XMUDECN4)) { - const XMUDECN4 * __restrict sPtr = static_cast(pSource); + const XMUDECN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUDECN4) + 1); icount += sizeof(XMUDECN4)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; - XMVECTORF32 vResult = { { { - FloatFrom7e3(sPtr->x), - FloatFrom7e3(sPtr->y), - FloatFrom7e3(sPtr->z), - static_cast(sPtr->v >> 30) / 3.0f - } } }; + XMVECTORF32 vResult = { + { { FloatFrom7e3(sPtr->x), FloatFrom7e3(sPtr->y), FloatFrom7e3(sPtr->z), static_cast(sPtr->v >> 30) / 3.0f } } + }; ++sPtr; @@ -1568,17 +1558,15 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( // Xbox One specific 6e4 format if (size >= sizeof(XMUDECN4)) { - const XMUDECN4 * __restrict sPtr = static_cast(pSource); + const XMUDECN4* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(XMUDECN4) + 1); icount += sizeof(XMUDECN4)) { - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; - XMVECTORF32 vResult = { { { - FloatFrom6e4(sPtr->x), - FloatFrom6e4(sPtr->y), - FloatFrom6e4(sPtr->z), - static_cast(sPtr->v >> 30) / 3.0f - } } }; + XMVECTORF32 vResult = { + { { FloatFrom6e4(sPtr->x), FloatFrom6e4(sPtr->y), FloatFrom6e4(sPtr->z), static_cast(sPtr->v >> 30) / 3.0f } } + }; ++sPtr; @@ -1597,14 +1585,15 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( if (size >= sizeof(uint8_t)) { static const XMVECTORF32 s_Scale = { { { 1.f / 15.f, 1.f / 15.f, 0.f, 0.f } } }; - const uint8_t * __restrict sPtr = static_cast(pSource); + const uint8_t* __restrict sPtr = static_cast(pSource); for (size_t icount = 0; icount < (size - sizeof(uint8_t) + 1); icount += sizeof(uint8_t)) { XMUNIBBLE4 nibble; - nibble.v = static_cast(*sPtr++); + nibble.v = static_cast(*sPtr++); XMVECTOR v = XMLoadUNibble4(&nibble); - v = XMVectorMultiply(v, s_Scale); - if (dPtr >= ePtr) break; + v = XMVectorMultiply(v, s_Scale); + if (dPtr >= ePtr) + break; *(dPtr++) = XMVectorSelect(g_XMIdentityR3, v, g_XMSelect1100); } return true; @@ -1613,8 +1602,7 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( // We don't support the planar or palettized formats - default: - return false; + default: return false; } } @@ -1622,31 +1610,29 @@ _Use_decl_annotations_ bool DirectX::Internal::LoadScanline( #undef LOAD_SCANLINE3 #undef LOAD_SCANLINE2 - //------------------------------------------------------------------------------------- // Stores an image row from standard RGBA XMVECTOR (aligned) array //------------------------------------------------------------------------------------- -#define STORE_SCANLINE( type, func )\ - if (size >= sizeof(type))\ - {\ - type * __restrict dPtr = reinterpret_cast(pDestination);\ - for(size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type))\ - {\ - if (sPtr >= ePtr) break;\ - func(dPtr++, *sPtr++);\ - }\ - return true; \ - }\ - return false; +#define STORE_SCANLINE(type, func) \ + if (size >= sizeof(type)) \ + { \ + type* __restrict dPtr = reinterpret_cast(pDestination); \ + for (size_t icount = 0; icount < (size - sizeof(type) + 1); icount += sizeof(type)) \ + { \ + if (sPtr >= ePtr) \ + break; \ + func(dPtr++, *sPtr++); \ + } \ + return true; \ + } \ + return false; -_Use_decl_annotations_ -bool DirectX::Internal::StoreScanline( - void* pDestination, - size_t size, - DXGI_FORMAT format, - const XMVECTOR* pSource, - size_t count, - float threshold) noexcept +_Use_decl_annotations_ bool DirectX::Internal::StoreScanline(void* pDestination, + size_t size, + DXGI_FORMAT format, + const XMVECTOR* pSource, + size_t count, + float threshold) noexcept { assert(pDestination != nullptr); assert(IsValid(format) && !IsTypeless(format) && !IsCompressed(format) && !IsPlanar(format) && !IsPalettized(format)); @@ -1668,23 +1654,17 @@ bool DirectX::Internal::StoreScanline( switch (static_cast(format)) { - case DXGI_FORMAT_R32G32B32A32_FLOAT: - STORE_SCANLINE(XMFLOAT4, XMStoreFloat4) + case DXGI_FORMAT_R32G32B32A32_FLOAT: STORE_SCANLINE(XMFLOAT4, XMStoreFloat4) - case DXGI_FORMAT_R32G32B32A32_UINT: - STORE_SCANLINE(XMUINT4, XMStoreUInt4) + case DXGI_FORMAT_R32G32B32A32_UINT: STORE_SCANLINE(XMUINT4, XMStoreUInt4) - case DXGI_FORMAT_R32G32B32A32_SINT: - STORE_SCANLINE(XMINT4, XMStoreSInt4) + case DXGI_FORMAT_R32G32B32A32_SINT: STORE_SCANLINE(XMINT4, XMStoreSInt4) - case DXGI_FORMAT_R32G32B32_FLOAT: - STORE_SCANLINE(XMFLOAT3, XMStoreFloat3) + case DXGI_FORMAT_R32G32B32_FLOAT: STORE_SCANLINE(XMFLOAT3, XMStoreFloat3) - case DXGI_FORMAT_R32G32B32_UINT: - STORE_SCANLINE(XMUINT3, XMStoreUInt3) + case DXGI_FORMAT_R32G32B32_UINT: STORE_SCANLINE(XMUINT3, XMStoreUInt3) - case DXGI_FORMAT_R32G32B32_SINT: - STORE_SCANLINE(XMINT3, XMStoreSInt3) + case DXGI_FORMAT_R32G32B32_SINT: STORE_SCANLINE(XMINT3, XMStoreSInt3) case DXGI_FORMAT_R16G16B16A16_FLOAT: if (size >= sizeof(XMHALF4)) @@ -1692,78 +1672,69 @@ bool DirectX::Internal::StoreScanline( XMHALF4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMHALF4) + 1); icount += sizeof(XMHALF4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR v = *sPtr++; - v = XMVectorClamp(v, g_HalfMin, g_HalfMax); + v = XMVectorClamp(v, g_HalfMin, g_HalfMax); XMStoreHalf4(dPtr++, v); } return true; } return false; - case DXGI_FORMAT_R16G16B16A16_UNORM: - STORE_SCANLINE(XMUSHORTN4, XMStoreUShortN4) + case DXGI_FORMAT_R16G16B16A16_UNORM: STORE_SCANLINE(XMUSHORTN4, XMStoreUShortN4) - case DXGI_FORMAT_R16G16B16A16_UINT: - STORE_SCANLINE(XMUSHORT4, XMStoreUShort4) + case DXGI_FORMAT_R16G16B16A16_UINT: STORE_SCANLINE(XMUSHORT4, XMStoreUShort4) - case DXGI_FORMAT_R16G16B16A16_SNORM: - STORE_SCANLINE(XMSHORTN4, XMStoreShortN4) + case DXGI_FORMAT_R16G16B16A16_SNORM: STORE_SCANLINE(XMSHORTN4, XMStoreShortN4) - case DXGI_FORMAT_R16G16B16A16_SINT: - STORE_SCANLINE(XMSHORT4, XMStoreShort4) + case DXGI_FORMAT_R16G16B16A16_SINT: STORE_SCANLINE(XMSHORT4, XMStoreShort4) - case DXGI_FORMAT_R32G32_FLOAT: - STORE_SCANLINE(XMFLOAT2, XMStoreFloat2) + case DXGI_FORMAT_R32G32_FLOAT: STORE_SCANLINE(XMFLOAT2, XMStoreFloat2) - case DXGI_FORMAT_R32G32_UINT: - STORE_SCANLINE(XMUINT2, XMStoreUInt2) + case DXGI_FORMAT_R32G32_UINT: STORE_SCANLINE(XMUINT2, XMStoreUInt2) - case DXGI_FORMAT_R32G32_SINT: - STORE_SCANLINE(XMINT2, XMStoreSInt2) + case DXGI_FORMAT_R32G32_SINT: STORE_SCANLINE(XMINT2, XMStoreSInt2) - case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: + case DXGI_FORMAT_D32_FLOAT_S8X24_UINT: { + constexpr size_t psize = sizeof(float) + sizeof(uint32_t); + if (size >= psize) + { + auto dPtr = static_cast(pDestination); + for (size_t icount = 0; icount < (size - psize + 1); icount += psize) { - constexpr size_t psize = sizeof(float) + sizeof(uint32_t); - if (size >= psize) - { - auto dPtr = static_cast(pDestination); - for (size_t icount = 0; icount < (size - psize + 1); icount += psize) - { - if (sPtr >= ePtr) break; - XMFLOAT4 f; - XMStoreFloat4(&f, *sPtr++); - dPtr[0] = f.x; - auto ps8 = reinterpret_cast(&dPtr[1]); - ps8[0] = static_cast(std::min(255.f, std::max(0.f, f.y))); - ps8[1] = ps8[2] = ps8[3] = 0; - dPtr += 2; - } - return true; - } + if (sPtr >= ePtr) + break; + XMFLOAT4 f; + XMStoreFloat4(&f, *sPtr++); + dPtr[0] = f.x; + auto ps8 = reinterpret_cast(&dPtr[1]); + ps8[0] = static_cast(std::min(255.f, std::max(0.f, f.y))); + ps8[1] = ps8[2] = ps8[3] = 0; + dPtr += 2; } - return false; + return true; + } + } + return false; - case DXGI_FORMAT_R10G10B10A2_UNORM: - STORE_SCANLINE(XMUDECN4, XMStoreUDecN4) + case DXGI_FORMAT_R10G10B10A2_UNORM: STORE_SCANLINE(XMUDECN4, XMStoreUDecN4) - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - STORE_SCANLINE(XMUDECN4, XMStoreUDecN4_XR) + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: STORE_SCANLINE(XMUDECN4, XMStoreUDecN4_XR) - case DXGI_FORMAT_R10G10B10A2_UINT: - STORE_SCANLINE(XMUDEC4, XMStoreUDec4) + case DXGI_FORMAT_R10G10B10A2_UINT: STORE_SCANLINE(XMUDEC4, XMStoreUDec4) - case DXGI_FORMAT_R11G11B10_FLOAT: - STORE_SCANLINE(XMFLOAT3PK, XMStoreFloat3PK) + case DXGI_FORMAT_R11G11B10_FLOAT: STORE_SCANLINE(XMFLOAT3PK, XMStoreFloat3PK) case DXGI_FORMAT_R8G8B8A8_UNORM: case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: if (size >= sizeof(XMUBYTEN4)) { - XMUBYTEN4 * __restrict dPtr = static_cast(pDestination); + XMUBYTEN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; const XMVECTOR v = XMVectorAdd(*sPtr++, g_8BitBiasV); XMStoreUByteN4(dPtr++, v); } @@ -1771,14 +1742,11 @@ bool DirectX::Internal::StoreScanline( } return false; - case DXGI_FORMAT_R8G8B8A8_UINT: - STORE_SCANLINE(XMUBYTE4, XMStoreUByte4) + case DXGI_FORMAT_R8G8B8A8_UINT: STORE_SCANLINE(XMUBYTE4, XMStoreUByte4) - case DXGI_FORMAT_R8G8B8A8_SNORM: - STORE_SCANLINE(XMBYTEN4, XMStoreByteN4) + case DXGI_FORMAT_R8G8B8A8_SNORM: STORE_SCANLINE(XMBYTEN4, XMStoreByteN4) - case DXGI_FORMAT_R8G8B8A8_SINT: - STORE_SCANLINE(XMBYTE4, XMStoreByte4) + case DXGI_FORMAT_R8G8B8A8_SINT: STORE_SCANLINE(XMBYTE4, XMStoreByte4) case DXGI_FORMAT_R16G16_FLOAT: if (size >= sizeof(XMHALF2)) @@ -1786,35 +1754,33 @@ bool DirectX::Internal::StoreScanline( XMHALF2* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMHALF2) + 1); icount += sizeof(XMHALF2)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR v = *sPtr++; - v = XMVectorClamp(v, g_HalfMin, g_HalfMax); + v = XMVectorClamp(v, g_HalfMin, g_HalfMax); XMStoreHalf2(dPtr++, v); } return true; } return false; - case DXGI_FORMAT_R16G16_UNORM: - STORE_SCANLINE(XMUSHORTN2, XMStoreUShortN2) + case DXGI_FORMAT_R16G16_UNORM: STORE_SCANLINE(XMUSHORTN2, XMStoreUShortN2) - case DXGI_FORMAT_R16G16_UINT: - STORE_SCANLINE(XMUSHORT2, XMStoreUShort2) + case DXGI_FORMAT_R16G16_UINT: STORE_SCANLINE(XMUSHORT2, XMStoreUShort2) - case DXGI_FORMAT_R16G16_SNORM: - STORE_SCANLINE(XMSHORTN2, XMStoreShortN2) + case DXGI_FORMAT_R16G16_SNORM: STORE_SCANLINE(XMSHORTN2, XMStoreShortN2) - case DXGI_FORMAT_R16G16_SINT: - STORE_SCANLINE(XMSHORT2, XMStoreShort2) + case DXGI_FORMAT_R16G16_SINT: STORE_SCANLINE(XMSHORT2, XMStoreShort2) case DXGI_FORMAT_D32_FLOAT: case DXGI_FORMAT_R32_FLOAT: if (size >= sizeof(float)) { - float * __restrict dPtr = static_cast(pDestination); + float* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(float) + 1); icount += sizeof(float)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMStoreFloat(dPtr++, *(sPtr++)); } return true; @@ -1824,10 +1790,11 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R32_UINT: if (size >= sizeof(uint32_t)) { - uint32_t * __restrict dPtr = static_cast(pDestination); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(uint32_t) + 1); icount += sizeof(uint32_t)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; const XMVECTOR v = XMConvertVectorFloatToUInt(*(sPtr++), 0); XMStoreInt(dPtr++, v); } @@ -1838,10 +1805,11 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R32_SINT: if (size >= sizeof(int32_t)) { - uint32_t * __restrict dPtr = static_cast(pDestination); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(int32_t) + 1); icount += sizeof(int32_t)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; const XMVECTOR v = XMConvertVectorFloatToInt(*(sPtr++), 0); XMStoreInt(dPtr++, v); } @@ -1853,41 +1821,38 @@ bool DirectX::Internal::StoreScanline( if (size >= sizeof(uint32_t)) { static const XMVECTORF32 clamp = { { { 1.f, 255.f, 0.f, 0.f } } }; - const XMVECTOR zero = XMVectorZero(); - auto dPtr = static_cast(pDestination); + const XMVECTOR zero = XMVectorZero(); + auto dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(uint32_t) + 1); icount += sizeof(uint32_t)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMFLOAT4 f; XMStoreFloat4(&f, XMVectorClamp(*sPtr++, zero, clamp)); - *dPtr++ = (static_cast(f.x * 16777215.f) & 0xFFFFFF) - | ((static_cast(f.y) & 0xFF) << 24); + *dPtr++ = (static_cast(f.x * 16777215.f) & 0xFFFFFF) | ((static_cast(f.y) & 0xFF) << 24); } return true; } return false; - case DXGI_FORMAT_R8G8_UNORM: - STORE_SCANLINE(XMUBYTEN2, XMStoreUByteN2) + case DXGI_FORMAT_R8G8_UNORM: STORE_SCANLINE(XMUBYTEN2, XMStoreUByteN2) - case DXGI_FORMAT_R8G8_UINT: - STORE_SCANLINE(XMUBYTE2, XMStoreUByte2) + case DXGI_FORMAT_R8G8_UINT: STORE_SCANLINE(XMUBYTE2, XMStoreUByte2) - case DXGI_FORMAT_R8G8_SNORM: - STORE_SCANLINE(XMBYTEN2, XMStoreByteN2) + case DXGI_FORMAT_R8G8_SNORM: STORE_SCANLINE(XMBYTEN2, XMStoreByteN2) - case DXGI_FORMAT_R8G8_SINT: - STORE_SCANLINE(XMBYTE2, XMStoreByte2) + case DXGI_FORMAT_R8G8_SINT: STORE_SCANLINE(XMBYTE2, XMStoreByte2) case DXGI_FORMAT_R16_FLOAT: if (size >= sizeof(HALF)) { - HALF * __restrict dPtr = static_cast(pDestination); + HALF* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(HALF) + 1); icount += sizeof(HALF)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetX(*sPtr++); - v = std::max(std::min(v, 65504.f), -65504.f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetX(*sPtr++); + v = std::max(std::min(v, 65504.f), -65504.f); *(dPtr++) = XMConvertFloatToHalf(v); } return true; @@ -1898,13 +1863,14 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R16_UNORM: if (size >= sizeof(uint16_t)) { - uint16_t * __restrict dPtr = static_cast(pDestination); + uint16_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(uint16_t) + 1); icount += sizeof(uint16_t)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetX(*sPtr++); - v = std::max(std::min(v, 1.f), 0.f); - *(dPtr++) = static_cast(v*65535.f + 0.5f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetX(*sPtr++); + v = std::max(std::min(v, 1.f), 0.f); + *(dPtr++) = static_cast(v * 65535.f + 0.5f); } return true; } @@ -1913,12 +1879,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R16_UINT: if (size >= sizeof(uint16_t)) { - uint16_t * __restrict dPtr = static_cast(pDestination); + uint16_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(uint16_t) + 1); icount += sizeof(uint16_t)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetX(*sPtr++); - v = std::max(std::min(v, 65535.f), 0.f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetX(*sPtr++); + v = std::max(std::min(v, 65535.f), 0.f); *(dPtr++) = static_cast(v); } return true; @@ -1928,12 +1895,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R16_SNORM: if (size >= sizeof(int16_t)) { - int16_t * __restrict dPtr = static_cast(pDestination); + int16_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(int16_t) + 1); icount += sizeof(int16_t)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetX(*sPtr++); - v = std::max(std::min(v, 1.f), -1.f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetX(*sPtr++); + v = std::max(std::min(v, 1.f), -1.f); *(dPtr++) = static_cast(lroundf(v * 32767.f)); } return true; @@ -1943,12 +1911,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R16_SINT: if (size >= sizeof(int16_t)) { - int16_t * __restrict dPtr = static_cast(pDestination); + int16_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(int16_t) + 1); icount += sizeof(int16_t)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetX(*sPtr++); - v = std::max(std::min(v, 32767.f), -32767.f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetX(*sPtr++); + v = std::max(std::min(v, 32767.f), -32767.f); *(dPtr++) = static_cast(v); } return true; @@ -1958,12 +1927,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R8_UNORM: if (size >= sizeof(uint8_t)) { - uint8_t * __restrict dPtr = static_cast(pDestination); + uint8_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < size; icount += sizeof(uint8_t)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetX(*sPtr++) + g_8BitBias; - v = std::max(std::min(v, 1.f), 0.f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetX(*sPtr++) + g_8BitBias; + v = std::max(std::min(v, 1.f), 0.f); *(dPtr++) = static_cast(v * 255.f); } return true; @@ -1973,12 +1943,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R8_UINT: if (size >= sizeof(uint8_t)) { - uint8_t * __restrict dPtr = static_cast(pDestination); + uint8_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < size; icount += sizeof(uint8_t)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetX(*sPtr++); - v = std::max(std::min(v, 255.f), 0.f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetX(*sPtr++); + v = std::max(std::min(v, 255.f), 0.f); *(dPtr++) = static_cast(v); } return true; @@ -1988,12 +1959,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R8_SNORM: if (size >= sizeof(int8_t)) { - int8_t * __restrict dPtr = static_cast(pDestination); + int8_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < size; icount += sizeof(int8_t)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetX(*sPtr++); - v = std::max(std::min(v, 1.f), -1.f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetX(*sPtr++); + v = std::max(std::min(v, 1.f), -1.f); *(dPtr++) = static_cast(lroundf(v * 127.f)); } return true; @@ -2003,12 +1975,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R8_SINT: if (size >= sizeof(int8_t)) { - int8_t * __restrict dPtr = static_cast(pDestination); + int8_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < size; icount += sizeof(int8_t)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetX(*sPtr++); - v = std::max(std::min(v, 127.f), -127.f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetX(*sPtr++); + v = std::max(std::min(v, 127.f), -127.f); *(dPtr++) = static_cast(v); } return true; @@ -2018,12 +1991,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_A8_UNORM: if (size >= sizeof(uint8_t)) { - uint8_t * __restrict dPtr = static_cast(pDestination); + uint8_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < size; icount += sizeof(uint8_t)) { - if (sPtr >= ePtr) break; - float v = XMVectorGetW(*sPtr++) + g_8BitBias; - v = std::max(std::min(v, 1.f), 0.f); + if (sPtr >= ePtr) + break; + float v = XMVectorGetW(*sPtr++) + g_8BitBias; + v = std::max(std::min(v, 1.f), 0.f); *(dPtr++) = static_cast(v * 255.f); } return true; @@ -2033,13 +2007,14 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_R1_UNORM: if (size >= sizeof(uint8_t)) { - uint8_t * __restrict dPtr = static_cast(pDestination); + uint8_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < size; icount += sizeof(uint8_t)) { uint8_t pixels = 0; for (size_t bcount = 8; bcount > 0; --bcount) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; const float v = XMVectorGetX(*sPtr++); // Absolute thresholding generally doesn't give good results for all images @@ -2054,20 +2029,20 @@ bool DirectX::Internal::StoreScanline( } return false; - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - STORE_SCANLINE(XMFLOAT3SE, StoreFloat3SE) + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: STORE_SCANLINE(XMFLOAT3SE, StoreFloat3SE) case DXGI_FORMAT_R8G8_B8G8_UNORM: if (size >= sizeof(XMUBYTEN4)) { - XMUBYTEN4 * __restrict dPtr = static_cast(pDestination); + XMUBYTEN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; const XMVECTOR v0 = *sPtr++; const XMVECTOR v1 = (sPtr < ePtr) ? XMVectorSplatY(*sPtr++) : XMVectorZero(); - XMVECTOR v = XMVectorSelect(v1, v0, g_XMSelect1110); - v = XMVectorAdd(v, g_8BitBiasV); + XMVECTOR v = XMVectorSelect(v1, v0, g_XMSelect1110); + v = XMVectorAdd(v, g_8BitBiasV); XMStoreUByteN4(dPtr++, v); } return true; @@ -2079,14 +2054,15 @@ bool DirectX::Internal::StoreScanline( { static XMVECTORU32 select1101 = { { { XM_SELECT_1, XM_SELECT_1, XM_SELECT_0, XM_SELECT_1 } } }; - XMUBYTEN4 * __restrict dPtr = static_cast(pDestination); + XMUBYTEN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; const XMVECTOR v0 = XMVectorSwizzle<1, 0, 3, 2>(*sPtr++); const XMVECTOR v1 = (sPtr < ePtr) ? XMVectorSplatY(*sPtr++) : XMVectorZero(); - XMVECTOR v = XMVectorSelect(v1, v0, select1101); - v = XMVectorAdd(v, g_8BitBiasV); + XMVECTOR v = XMVectorSelect(v1, v0, select1101); + v = XMVectorAdd(v, g_8BitBiasV); XMStoreUByteN4(dPtr++, v); } return true; @@ -2097,16 +2073,17 @@ bool DirectX::Internal::StoreScanline( if (size >= sizeof(XMU565)) { static const XMVECTORF32 s_Scale = { { { 31.f, 63.f, 31.f, 1.f } } }; - XMU565 * __restrict dPtr = static_cast(pDestination); + XMU565* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMU565) + 1); icount += sizeof(XMU565)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>(*sPtr++); - #if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ +#if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ v = XMVectorMultiplyAdd(v, s_Scale, g_XMOneHalf); - #else +#else v = XMVectorMultiply(v, s_Scale); - #endif +#endif XMStoreU565(dPtr++, v); } return true; @@ -2117,19 +2094,20 @@ bool DirectX::Internal::StoreScanline( if (size >= sizeof(XMU555)) { static const XMVECTORF32 s_Scale = { { { 31.f, 31.f, 31.f, 1.f } } }; - #if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ +#if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ static const XMVECTORF32 s_OneHalfXYZ = { { { 0.5f, 0.5f, 0.5f, 0.f } } }; - #endif - XMU555 * __restrict dPtr = static_cast(pDestination); +#endif + XMU555* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMU555) + 1); icount += sizeof(XMU555)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>(*sPtr++); - #if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ +#if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ v = XMVectorMultiplyAdd(v, s_Scale, s_OneHalfXYZ); - #else +#else v = XMVectorMultiply(v, s_Scale); - #endif +#endif XMStoreU555(dPtr, v); dPtr->w = (XMVectorGetW(v) > threshold) ? 1u : 0u; ++dPtr; @@ -2142,12 +2120,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: if (size >= sizeof(XMUBYTEN4)) { - XMUBYTEN4 * __restrict dPtr = static_cast(pDestination); + XMUBYTEN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>(*sPtr++); - v = XMVectorAdd(v, g_8BitBiasV); + v = XMVectorAdd(v, g_8BitBiasV); XMStoreUByteN4(dPtr++, v); } return true; @@ -2158,12 +2137,13 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: if (size >= sizeof(XMUBYTEN4)) { - XMUBYTEN4 * __restrict dPtr = static_cast(pDestination); + XMUBYTEN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR v = XMVectorPermute<2, 1, 0, 7>(*sPtr++, g_XMIdentityR3); - v = XMVectorAdd(v, g_8BitBiasV); + v = XMVectorAdd(v, g_8BitBiasV); XMStoreUByteN4(dPtr++, v); } return true; @@ -2173,10 +2153,11 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_AYUV: if (size >= sizeof(XMUBYTEN4)) { - XMUBYTEN4 * __restrict dPtr = static_cast(pDestination); + XMUBYTEN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMUBYTEN4 rgba; XMStoreUByteN4(&rgba, *sPtr++); @@ -2204,10 +2185,11 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_Y410: if (size >= sizeof(XMUDECN4)) { - XMUDECN4 * __restrict dPtr = static_cast(pDestination); + XMUDECN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUDECN4) + 1); icount += sizeof(XMUDECN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMUDECN4 rgba; XMStoreUDecN4(&rgba, *sPtr++); @@ -2239,10 +2221,11 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_Y416: if (size >= sizeof(XMUSHORTN4)) { - XMUSHORTN4 * __restrict dPtr = static_cast(pDestination); + XMUSHORTN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUSHORTN4) + 1); icount += sizeof(XMUSHORTN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMUSHORTN4 rgba; XMStoreUShortN4(&rgba, *sPtr++); @@ -2274,10 +2257,11 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_YUY2: if (size >= sizeof(XMUBYTEN4)) { - XMUBYTEN4 * __restrict dPtr = static_cast(pDestination); + XMUBYTEN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUBYTEN4) + 1); icount += sizeof(XMUBYTEN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMUBYTEN4 rgb1; XMStoreUByteN4(&rgb1, *sPtr++); @@ -2311,10 +2295,11 @@ bool DirectX::Internal::StoreScanline( // Same as Y216 with least significant 6 bits set to zero if (size >= sizeof(XMUSHORTN4)) { - XMUSHORTN4 * __restrict dPtr = static_cast(pDestination); + XMUSHORTN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUSHORTN4) + 1); icount += sizeof(XMUSHORTN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMUDECN4 rgb1; XMStoreUDecN4(&rgb1, *sPtr++); @@ -2355,10 +2340,11 @@ bool DirectX::Internal::StoreScanline( case DXGI_FORMAT_Y216: if (size >= sizeof(XMUSHORTN4)) { - XMUSHORTN4 * __restrict dPtr = static_cast(pDestination); + XMUSHORTN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUSHORTN4) + 1); icount += sizeof(XMUSHORTN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMUSHORTN4 rgb1; XMStoreUShortN4(&rgb1, *sPtr++); @@ -2400,16 +2386,17 @@ bool DirectX::Internal::StoreScanline( if (size >= sizeof(XMUNIBBLE4)) { static const XMVECTORF32 s_Scale = { { { 15.f, 15.f, 15.f, 15.f } } }; - XMUNIBBLE4 * __restrict dPtr = static_cast(pDestination); + XMUNIBBLE4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUNIBBLE4) + 1); icount += sizeof(XMUNIBBLE4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>(*sPtr++); - #if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ +#if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ v = XMVectorMultiplyAdd(v, s_Scale, g_XMOneHalf); - #else +#else v = XMVectorMultiply(v, s_Scale); - #endif +#endif XMStoreUNibble4(dPtr++, v); } return true; @@ -2420,16 +2407,17 @@ bool DirectX::Internal::StoreScanline( if (size >= sizeof(XMUNIBBLE4)) { static const XMVECTORF32 s_Scale = { { { 15.f, 15.f, 15.f, 15.f } } }; - XMUNIBBLE4 * __restrict dPtr = static_cast(pDestination); + XMUNIBBLE4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUNIBBLE4) + 1); icount += sizeof(XMUNIBBLE4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR v = XMVectorSwizzle<3, 2, 1, 0>(*sPtr++); - #if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ +#if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ v = XMVectorMultiplyAdd(v, s_Scale, g_XMOneHalf); - #else +#else v = XMVectorMultiply(v, s_Scale); - #endif +#endif XMStoreUNibble4(dPtr++, v); } return true; @@ -2440,16 +2428,17 @@ bool DirectX::Internal::StoreScanline( // Xbox One specific 7e3 format with alpha if (size >= sizeof(XMUDECN4)) { - static const XMVECTORF32 Scale = { { { 1.0f, 1.0f, 1.0f, 3.0f } } }; - static const XMVECTORF32 C = { { { 31.875f, 31.875f, 31.875f, 3.f } } }; + static const XMVECTORF32 Scale = { { { 1.0f, 1.0f, 1.0f, 3.0f } } }; + static const XMVECTORF32 C = { { { 31.875f, 31.875f, 31.875f, 3.f } } }; - XMUDECN4 * __restrict dPtr = static_cast(pDestination); + XMUDECN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUDECN4) + 1); icount += sizeof(XMUDECN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR V = XMVectorMultiply(*sPtr++, Scale); - V = XMVectorClamp(V, g_XMZero, C); + V = XMVectorClamp(V, g_XMZero, C); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, V); @@ -2468,16 +2457,17 @@ bool DirectX::Internal::StoreScanline( // Xbox One specific 6e4 format with alpha if (size >= sizeof(XMUDECN4)) { - static const XMVECTORF32 Scale = { { { 1.0f, 1.0f, 1.0f, 3.0f } } }; - static const XMVECTORF32 C = { { { 508.f, 508.f, 508.f, 3.f } } }; + static const XMVECTORF32 Scale = { { { 1.0f, 1.0f, 1.0f, 3.0f } } }; + static const XMVECTORF32 C = { { { 508.f, 508.f, 508.f, 3.f } } }; - XMUDECN4 * __restrict dPtr = static_cast(pDestination); + XMUDECN4* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(XMUDECN4) + 1); icount += sizeof(XMUDECN4)) { - if (sPtr >= ePtr) break; + if (sPtr >= ePtr) + break; XMVECTOR V = XMVectorMultiply(*sPtr++, Scale); - V = XMVectorClamp(V, g_XMZero, C); + V = XMVectorClamp(V, g_XMZero, C); XMFLOAT4A tmp; XMStoreFloat4A(&tmp, V); @@ -2501,15 +2491,16 @@ bool DirectX::Internal::StoreScanline( if (size >= sizeof(uint8_t)) { static const XMVECTORF32 s_Scale = { { { 15.f, 15.f, 0.f, 0.f } } }; - uint8_t * __restrict dPtr = static_cast(pDestination); + uint8_t* __restrict dPtr = static_cast(pDestination); for (size_t icount = 0; icount < (size - sizeof(uint8_t) + 1); icount += sizeof(uint8_t)) { - if (sPtr >= ePtr) break; - #if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ + if (sPtr >= ePtr) + break; +#if defined(_M_ARM) || defined(_M_ARM64) || defined(_M_HYBRID_X86_ARM64) || defined(_M_ARM64EC) || __arm__ || __aarch64__ const XMVECTOR v = XMVectorMultiplyAdd(*sPtr++, s_Scale, g_XMOneHalf); - #else +#else const XMVECTOR v = XMVectorMultiply(*sPtr++, s_Scale); - #endif +#endif XMUNIBBLE4 nibble; XMStoreUNibble4(&nibble, v); *dPtr = static_cast(nibble.v); @@ -2521,19 +2512,16 @@ bool DirectX::Internal::StoreScanline( // We don't support the planar or palettized formats - default: - return false; + default: return false; } } #undef STORE_SCANLINE - //------------------------------------------------------------------------------------- // Convert DXGI image to/from GUID_WICPixelFormat128bppRGBAFloat (no range conversions) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Internal::ConvertToR32G32B32A32(const Image& srcImage, ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::Internal::ConvertToR32G32B32A32(const Image& srcImage, ScratchImage& image) noexcept { if (!srcImage.pixels) return E_POINTER; @@ -2542,7 +2530,7 @@ HRESULT DirectX::Internal::ConvertToR32G32B32A32(const Image& srcImage, ScratchI if (FAILED(hr)) return hr; - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) { image.Release(); @@ -2556,7 +2544,7 @@ HRESULT DirectX::Internal::ConvertToR32G32B32A32(const Image& srcImage, ScratchI return E_POINTER; } - const uint8_t *pSrc = srcImage.pixels; + const uint8_t* pSrc = srcImage.pixels; for (size_t h = 0; h < srcImage.height; ++h) { if (!LoadScanline(reinterpret_cast(pDest), srcImage.width, pSrc, srcImage.rowPitch, srcImage.format)) @@ -2572,8 +2560,7 @@ HRESULT DirectX::Internal::ConvertToR32G32B32A32(const Image& srcImage, ScratchI return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::Internal::ConvertFromR32G32B32A32(const Image& srcImage, const Image& destImage) noexcept +_Use_decl_annotations_ HRESULT DirectX::Internal::ConvertFromR32G32B32A32(const Image& srcImage, const Image& destImage) noexcept { assert(srcImage.format == DXGI_FORMAT_R32G32B32A32_FLOAT); @@ -2583,8 +2570,8 @@ HRESULT DirectX::Internal::ConvertFromR32G32B32A32(const Image& srcImage, const if (srcImage.width != destImage.width || srcImage.height != destImage.height) return E_FAIL; - const uint8_t *pSrc = srcImage.pixels; - uint8_t* pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; for (size_t h = 0; h < srcImage.height; ++h) { @@ -2598,11 +2585,9 @@ HRESULT DirectX::Internal::ConvertFromR32G32B32A32(const Image& srcImage, const return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::Internal::ConvertFromR32G32B32A32( - const Image& srcImage, - DXGI_FORMAT format, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::Internal::ConvertFromR32G32B32A32(const Image& srcImage, + DXGI_FORMAT format, + ScratchImage& image) noexcept { if (!srcImage.pixels) return E_POINTER; @@ -2611,7 +2596,7 @@ HRESULT DirectX::Internal::ConvertFromR32G32B32A32( if (FAILED(hr)) return hr; - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) { image.Release(); @@ -2628,13 +2613,11 @@ HRESULT DirectX::Internal::ConvertFromR32G32B32A32( return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::Internal::ConvertFromR32G32B32A32( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - DXGI_FORMAT format, - ScratchImage& result) noexcept +_Use_decl_annotations_ HRESULT DirectX::Internal::ConvertFromR32G32B32A32(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + DXGI_FORMAT format, + ScratchImage& result) noexcept { if (!srcImages) return E_POINTER; @@ -2644,8 +2627,8 @@ HRESULT DirectX::Internal::ConvertFromR32G32B32A32( assert(metadata.format == DXGI_FORMAT_R32G32B32A32_FLOAT); TexMetadata mdata2 = metadata; - mdata2.format = format; - HRESULT hr = result.Initialize(mdata2); + mdata2.format = format; + HRESULT hr = result.Initialize(mdata2); if (FAILED(hr)) return hr; @@ -2676,8 +2659,8 @@ HRESULT DirectX::Internal::ConvertFromR32G32B32A32( return E_FAIL; } - const uint8_t* pSrc = src.pixels; - uint8_t* pDest = dst.pixels; + const uint8_t* pSrc = src.pixels; + uint8_t* pDest = dst.pixels; if (!pSrc || !pDest) { result.Release(); @@ -2700,12 +2683,10 @@ HRESULT DirectX::Internal::ConvertFromR32G32B32A32( return S_OK; } - //------------------------------------------------------------------------------------- // Convert DXGI image to/from GUID_WICPixelFormat64bppRGBAHalf (no range conversions) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Internal::ConvertToR16G16B16A16(const Image& srcImage, ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::Internal::ConvertToR16G16B16A16(const Image& srcImage, ScratchImage& image) noexcept { if (!srcImage.pixels) return E_POINTER; @@ -2721,7 +2702,7 @@ HRESULT DirectX::Internal::ConvertToR16G16B16A16(const Image& srcImage, ScratchI return E_OUTOFMEMORY; } - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) { image.Release(); @@ -2735,7 +2716,7 @@ HRESULT DirectX::Internal::ConvertToR16G16B16A16(const Image& srcImage, ScratchI return E_POINTER; } - const uint8_t *pSrc = srcImage.pixels; + const uint8_t* pSrc = srcImage.pixels; for (size_t h = 0; h < srcImage.height; ++h) { if (!LoadScanline(scanline.get(), srcImage.width, pSrc, srcImage.rowPitch, srcImage.format)) @@ -2744,9 +2725,10 @@ HRESULT DirectX::Internal::ConvertToR16G16B16A16(const Image& srcImage, ScratchI return E_FAIL; } - XMConvertFloatToHalfStream( - reinterpret_cast(pDest), sizeof(HALF), - reinterpret_cast(scanline.get()), sizeof(float), + XMConvertFloatToHalfStream(reinterpret_cast(pDest), + sizeof(HALF), + reinterpret_cast(scanline.get()), + sizeof(float), srcImage.width * 4); pSrc += srcImage.rowPitch; @@ -2756,8 +2738,7 @@ HRESULT DirectX::Internal::ConvertToR16G16B16A16(const Image& srcImage, ScratchI return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::Internal::ConvertFromR16G16B16A16(const Image& srcImage, const Image& destImage) noexcept +_Use_decl_annotations_ HRESULT DirectX::Internal::ConvertFromR16G16B16A16(const Image& srcImage, const Image& destImage) noexcept { assert(srcImage.format == DXGI_FORMAT_R16G16B16A16_FLOAT); @@ -2771,14 +2752,15 @@ HRESULT DirectX::Internal::ConvertFromR16G16B16A16(const Image& srcImage, const if (!scanline) return E_OUTOFMEMORY; - const uint8_t *pSrc = srcImage.pixels; - uint8_t* pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; for (size_t h = 0; h < srcImage.height; ++h) { - XMConvertHalfToFloatStream( - reinterpret_cast(scanline.get()), sizeof(float), - reinterpret_cast(pSrc), sizeof(HALF), + XMConvertHalfToFloatStream(reinterpret_cast(scanline.get()), + sizeof(float), + reinterpret_cast(pSrc), + sizeof(HALF), srcImage.width * 4); if (!StoreScanline(pDest, destImage.rowPitch, destImage.format, scanline.get(), srcImage.width)) @@ -2791,7 +2773,6 @@ HRESULT DirectX::Internal::ConvertFromR16G16B16A16(const Image& srcImage, const return S_OK; } - //------------------------------------------------------------------------------------- // Convert from Linear RGB to sRGB // @@ -2799,15 +2780,13 @@ HRESULT DirectX::Internal::ConvertFromR16G16B16A16(const Image& srcImage, const // if C_linear > 0.0031308 -> C_srgb = ( 1 + a ) * pow( C_Linear, 1 / 2.4 ) - a // where a = 0.055 //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::Internal::StoreScanlineLinear( - void* pDestination, - size_t size, - DXGI_FORMAT format, - XMVECTOR* pSource, - size_t count, - TEX_FILTER_FLAGS flags, - float threshold) noexcept +_Use_decl_annotations_ bool DirectX::Internal::StoreScanlineLinear(void* pDestination, + size_t size, + DXGI_FORMAT format, + XMVECTOR* pSource, + size_t count, + TEX_FILTER_FLAGS flags, + float threshold) noexcept { if (!pSource || !count) return false; @@ -2818,9 +2797,7 @@ bool DirectX::Internal::StoreScanlineLinear( { case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - flags |= TEX_FILTER_SRGB; - break; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: flags |= TEX_FILTER_SRGB; break; case DXGI_FORMAT_R32G32B32A32_FLOAT: case DXGI_FORMAT_R32G32B32_FLOAT: @@ -2845,8 +2822,7 @@ bool DirectX::Internal::StoreScanlineLinear( case DXGI_FORMAT_B8G8R8A8_UNORM: case DXGI_FORMAT_B8G8R8X8_UNORM: case DXGI_FORMAT_B4G4R4A4_UNORM: - case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: - break; + case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: break; default: // can't treat A8, XR, Depth, SNORM, UINT, or SINT as sRGB @@ -2869,7 +2845,6 @@ bool DirectX::Internal::StoreScanlineLinear( return StoreScanline(pDestination, size, format, pSource, count, threshold); } - //------------------------------------------------------------------------------------- // Convert from sRGB to Linear RGB // @@ -2877,22 +2852,18 @@ bool DirectX::Internal::StoreScanlineLinear( // if C_srgb > 0.04045 -> C_linear = pow( ( C_srgb + a ) / ( 1 + a ), 2.4 ) // where a = 0.055 //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::Internal::LoadScanlineLinear( - XMVECTOR* pDestination, - size_t count, - const void* pSource, - size_t size, - DXGI_FORMAT format, - TEX_FILTER_FLAGS flags) noexcept +_Use_decl_annotations_ bool DirectX::Internal::LoadScanlineLinear(XMVECTOR* pDestination, + size_t count, + const void* pSource, + size_t size, + DXGI_FORMAT format, + TEX_FILTER_FLAGS flags) noexcept { switch (static_cast(format)) { case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - flags |= TEX_FILTER_SRGB; - break; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: flags |= TEX_FILTER_SRGB; break; case DXGI_FORMAT_R32G32B32A32_FLOAT: case DXGI_FORMAT_R32G32B32_FLOAT: @@ -2917,8 +2888,7 @@ bool DirectX::Internal::LoadScanlineLinear( case DXGI_FORMAT_B8G8R8A8_UNORM: case DXGI_FORMAT_B8G8R8X8_UNORM: case DXGI_FORMAT_B4G4R4A4_UNORM: - case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: - break; + case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: break; default: // can't treat A8, XR, Depth, SNORM, UINT, or SINT as sRGB @@ -2944,7 +2914,6 @@ bool DirectX::Internal::LoadScanlineLinear( return false; } - //------------------------------------------------------------------------------------- // Convert scanline based on source/target formats //------------------------------------------------------------------------------------- @@ -2957,8 +2926,8 @@ namespace uint32_t flags; }; - const ConvertData g_ConvertTable[] = - { + const ConvertData g_ConvertTable[] = { + // clang-format off { DXGI_FORMAT_R32G32B32A32_FLOAT, 32, CONVF_FLOAT | CONVF_R | CONVF_G | CONVF_B | CONVF_A }, { DXGI_FORMAT_R32G32B32A32_UINT, 32, CONVF_UINT | CONVF_R | CONVF_G | CONVF_B | CONVF_A }, { DXGI_FORMAT_R32G32B32A32_SINT, 32, CONVF_SINT | CONVF_R | CONVF_G | CONVF_B | CONVF_A }, @@ -3044,20 +3013,22 @@ namespace { XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM,10, CONVF_SNORM | CONVF_R | CONVF_G | CONVF_B | CONVF_A }, { XBOX_DXGI_FORMAT_R4G4_UNORM, 4, CONVF_UNORM | CONVF_R | CONVF_G }, { WIN11_DXGI_FORMAT_A4B4G4R4_UNORM, 4, CONVF_UNORM | CONVF_BGR | CONVF_R | CONVF_G | CONVF_B | CONVF_A }, + // clang-format on }; -#pragma prefast( suppress : 25004, "Signature must match bsearch" ); - int __cdecl ConvertCompare(const void* ptr1, const void *ptr2) noexcept +#pragma prefast(suppress : 25004, "Signature must match bsearch"); + int __cdecl ConvertCompare(const void* ptr1, const void* ptr2) noexcept { auto p1 = static_cast(ptr1); auto p2 = static_cast(ptr2); - if (p1->format == p2->format) return 0; - else return (p1->format < p2->format) ? -1 : 1; + if (p1->format == p2->format) + return 0; + else + return (p1->format < p2->format) ? -1 : 1; } -} +} // namespace -_Use_decl_annotations_ -uint32_t DirectX::Internal::GetConvertFlags(DXGI_FORMAT format) noexcept +_Use_decl_annotations_ uint32_t DirectX::Internal::GetConvertFlags(DXGI_FORMAT format) noexcept { #ifdef _DEBUG // Ensure conversion table is in ascending order @@ -3071,18 +3042,16 @@ uint32_t DirectX::Internal::GetConvertFlags(DXGI_FORMAT format) noexcept #endif ConvertData key = { format, 0, 0 }; - auto in = reinterpret_cast(bsearch(&key, g_ConvertTable, std::size(g_ConvertTable), sizeof(ConvertData), - ConvertCompare)); + auto in = reinterpret_cast( + bsearch(&key, g_ConvertTable, std::size(g_ConvertTable), sizeof(ConvertData), ConvertCompare)); return (in) ? in->flags : 0; } -_Use_decl_annotations_ -void DirectX::Internal::ConvertScanline( - XMVECTOR* pBuffer, - size_t count, - DXGI_FORMAT outFormat, - DXGI_FORMAT inFormat, - TEX_FILTER_FLAGS flags) noexcept +_Use_decl_annotations_ void DirectX::Internal::ConvertScanline(XMVECTOR* pBuffer, + size_t count, + DXGI_FORMAT outFormat, + DXGI_FORMAT inFormat, + TEX_FILTER_FLAGS flags) noexcept { assert(pBuffer && count > 0 && ((reinterpret_cast(pBuffer) & 0xF) == 0)); assert(IsValid(outFormat) && !IsTypeless(outFormat) && !IsPlanar(outFormat) && !IsPalettized(outFormat)); @@ -3104,10 +3073,10 @@ void DirectX::Internal::ConvertScanline( // Determine conversion details about source and dest formats ConvertData key = { inFormat, 0, 0 }; - auto in = reinterpret_cast( + auto in = reinterpret_cast( bsearch(&key, g_ConvertTable, std::size(g_ConvertTable), sizeof(ConvertData), ConvertCompare)); key.format = outFormat; - auto out = reinterpret_cast( + auto out = reinterpret_cast( bsearch(&key, g_ConvertTable, std::size(g_ConvertTable), sizeof(ConvertData), ConvertCompare)); if (!in || !out) { @@ -3127,17 +3096,12 @@ void DirectX::Internal::ConvertScanline( case DXGI_FORMAT_BC3_UNORM_SRGB: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - case DXGI_FORMAT_BC7_UNORM_SRGB: - flags |= TEX_FILTER_SRGB_IN; - break; + case DXGI_FORMAT_BC7_UNORM_SRGB: flags |= TEX_FILTER_SRGB_IN; break; case DXGI_FORMAT_A8_UNORM: - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - flags &= ~TEX_FILTER_SRGB_IN; - break; + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: flags &= ~TEX_FILTER_SRGB_IN; break; - default: - break; + default: break; } switch (outFormat) @@ -3148,17 +3112,12 @@ void DirectX::Internal::ConvertScanline( case DXGI_FORMAT_BC3_UNORM_SRGB: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - case DXGI_FORMAT_BC7_UNORM_SRGB: - flags |= TEX_FILTER_SRGB_OUT; - break; + case DXGI_FORMAT_BC7_UNORM_SRGB: flags |= TEX_FILTER_SRGB_OUT; break; case DXGI_FORMAT_A8_UNORM: - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: - flags &= ~TEX_FILTER_SRGB_OUT; - break; + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: flags &= ~TEX_FILTER_SRGB_OUT; break; - default: - break; + default: break; } if ((flags & (TEX_FILTER_SRGB_IN | TEX_FILTER_SRGB_OUT)) == (TEX_FILTER_SRGB_IN | TEX_FILTER_SRGB_OUT)) @@ -3200,11 +3159,11 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; - XMVECTOR v1 = XMVectorSplatY(v); - v1 = XMVectorClamp(v1, g_XMZero, S); - v1 = XMVectorDivide(v1, S); - *ptr++ = XMVectorSelect(v1, v, g_XMSelect1110); + const XMVECTOR v = *ptr; + XMVECTOR v1 = XMVectorSplatY(v); + v1 = XMVectorClamp(v1, g_XMZero, S); + v1 = XMVectorDivide(v1, S); + *ptr++ = XMVectorSelect(v1, v, g_XMSelect1110); } } else if (out->flags & CONVF_SNORM) @@ -3213,12 +3172,12 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; - XMVECTOR v1 = XMVectorSplatY(v); - v1 = XMVectorClamp(v1, g_XMZero, S); - v1 = XMVectorDivide(v1, S); - v1 = XMVectorMultiplyAdd(v1, g_XMTwo, g_XMNegativeOne); - *ptr++ = XMVectorSelect(v1, v, g_XMSelect1110); + const XMVECTOR v = *ptr; + XMVECTOR v1 = XMVectorSplatY(v); + v1 = XMVectorClamp(v1, g_XMZero, S); + v1 = XMVectorDivide(v1, S); + v1 = XMVectorMultiplyAdd(v1, g_XMTwo, g_XMNegativeOne); + *ptr++ = XMVectorSelect(v1, v, g_XMSelect1110); } } else @@ -3226,9 +3185,9 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVectorSplatY(v); - *ptr++ = XMVectorSelect(v1, v, g_XMSelect1110); + *ptr++ = XMVectorSelect(v1, v, g_XMSelect1110); } } } @@ -3240,10 +3199,10 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; - XMVECTOR v1 = XMVectorSaturate(v); - v1 = XMVectorSplatX(v1); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); + const XMVECTOR v = *ptr; + XMVECTOR v1 = XMVectorSaturate(v); + v1 = XMVectorSplatX(v1); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); } } else if (out->flags & CONVF_SNORM) @@ -3254,10 +3213,10 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; - XMVECTOR v1 = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); - v1 = XMVectorSplatX(v1); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); + const XMVECTOR v = *ptr; + XMVECTOR v1 = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); + v1 = XMVectorSplatX(v1); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); } } else @@ -3266,10 +3225,10 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; - XMVECTOR v1 = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); - v1 = XMVectorSplatX(v1); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); + const XMVECTOR v = *ptr; + XMVECTOR v1 = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); + v1 = XMVectorSplatX(v1); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); } } } @@ -3278,9 +3237,9 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVectorSplatX(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); } } } @@ -3289,43 +3248,41 @@ void DirectX::Internal::ConvertScanline( // !CONVF_DEPTH -> CONVF_DEPTH // RGB -> Depth (red channel or other specified channel) - switch (flags & (TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN | TEX_FILTER_RGB_COPY_BLUE | TEX_FILTER_RGB_COPY_ALPHA)) + switch ( + flags & (TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN | TEX_FILTER_RGB_COPY_BLUE | TEX_FILTER_RGB_COPY_ALPHA)) { - case TEX_FILTER_RGB_COPY_GREEN: + case TEX_FILTER_RGB_COPY_GREEN: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSplatY(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSplatY(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); } - break; + } + break; - case TEX_FILTER_RGB_COPY_BLUE: + case TEX_FILTER_RGB_COPY_BLUE: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSplatZ(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSplatZ(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); } - break; + } + break; - case TEX_FILTER_RGB_COPY_ALPHA: + case TEX_FILTER_RGB_COPY_ALPHA: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSplatW(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSplatW(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); } - break; + } + break; default: if ((in->flags & CONVF_UNORM) && ((in->flags & CONVF_RGB_MASK) == (CONVF_R | CONVF_G | CONVF_B))) @@ -3333,32 +3290,31 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVector3Dot(v, g_Grayscale); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); } break; } - #if (__cplusplus >= 201703L) +#if (__cplusplus >= 201703L) [[fallthrough]]; - #elif defined(__clang__) +#elif defined(__clang__) [[clang::fallthrough]]; - #elif defined(_MSC_VER) +#elif defined(_MSC_VER) __fallthrough; - #endif +#endif - case TEX_FILTER_RGB_COPY_RED: + case TEX_FILTER_RGB_COPY_RED: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSplatX(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSplatX(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); } - break; + } + break; } // Finialize type conversion for depth (red channel) @@ -3370,9 +3326,9 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); } } else if (in->flags & CONVF_FLOAT) @@ -3381,9 +3337,9 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVectorSaturate(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); } } } @@ -3392,7 +3348,7 @@ void DirectX::Internal::ConvertScanline( { // Alpha -> Stencil (green channel) static const XMVECTORU32 select0100 = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; - static const XMVECTORF32 S = { { { 255.f, 255.f, 255.f, 255.f } } }; + static const XMVECTORF32 S = { { { 255.f, 255.f, 255.f, 255.f } } }; if (in->flags & CONVF_UNORM) { @@ -3400,10 +3356,10 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; - XMVECTOR v1 = XMVectorMultiply(v, S); - v1 = XMVectorSplatW(v1); - *ptr++ = XMVectorSelect(v, v1, select0100); + const XMVECTOR v = *ptr; + XMVECTOR v1 = XMVectorMultiply(v, S); + v1 = XMVectorSplatW(v1); + *ptr++ = XMVectorSelect(v, v1, select0100); } } else if (in->flags & CONVF_SNORM) @@ -3412,11 +3368,11 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; - XMVECTOR v1 = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); - v1 = XMVectorMultiply(v1, S); - v1 = XMVectorSplatW(v1); - *ptr++ = XMVectorSelect(v, v1, select0100); + const XMVECTOR v = *ptr; + XMVECTOR v1 = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); + v1 = XMVectorMultiply(v1, S); + v1 = XMVectorSplatW(v1); + *ptr++ = XMVectorSelect(v, v1, select0100); } } else @@ -3424,9 +3380,9 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVectorSplatW(v); - *ptr++ = XMVectorSelect(v, v1, select0100); + *ptr++ = XMVectorSelect(v, v1, select0100); } } } @@ -3443,9 +3399,9 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVectorSaturate(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1000); } } } @@ -3460,7 +3416,7 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { const XMVECTOR v = *ptr; - *ptr++ = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); + *ptr++ = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); } } else if (in->flags & CONVF_FLOAT) @@ -3472,8 +3428,8 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { XMVECTOR v = *ptr; - v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); - *ptr++ = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); + v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); + *ptr++ = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); } } else @@ -3482,7 +3438,7 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { const XMVECTOR v = *ptr; - *ptr++ = XMVectorSaturate(v); + *ptr++ = XMVectorSaturate(v); } } } @@ -3497,7 +3453,7 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { const XMVECTOR v = *ptr; - *ptr++ = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); + *ptr++ = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); } } else if (in->flags & CONVF_FLOAT) @@ -3509,8 +3465,8 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { XMVECTOR v = *ptr; - v = XMVectorSaturate(v); - *ptr++ = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); + v = XMVectorSaturate(v); + *ptr++ = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); } } else @@ -3519,7 +3475,7 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { const XMVECTOR v = *ptr; - *ptr++ = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); + *ptr++ = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); } } } @@ -3537,7 +3493,7 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { const XMVECTOR v = *ptr; - *ptr++ = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); + *ptr++ = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); } } } @@ -3555,8 +3511,8 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { XMVECTOR v = *ptr; - v = XMVectorSaturate(v); - *ptr++ = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); + v = XMVectorSaturate(v); + *ptr++ = XMVectorMultiplyAdd(v, g_XMTwo, g_XMNegativeOne); } } } @@ -3569,8 +3525,8 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { XMVECTOR v = *ptr; - v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); - *ptr++ = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); + v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); + *ptr++ = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); } } else if (in->flags & CONVF_SNORM) @@ -3580,7 +3536,7 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { const XMVECTOR v = *ptr; - *ptr++ = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); + *ptr++ = XMVectorMultiplyAdd(v, g_XMOneHalf, g_XMOneHalf); } } } @@ -3597,27 +3553,25 @@ void DirectX::Internal::ConvertScanline( // We ignore TEX_FILTER_RGB_COPY_ALPHA since there's no input alpha channel. switch (flags & (TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN | TEX_FILTER_RGB_COPY_BLUE)) { - case TEX_FILTER_RGB_COPY_GREEN: + case TEX_FILTER_RGB_COPY_GREEN: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - *ptr++ = XMVectorSplatY(v); - } + const XMVECTOR v = *ptr; + *ptr++ = XMVectorSplatY(v); } - break; + } + break; - case TEX_FILTER_RGB_COPY_BLUE: + case TEX_FILTER_RGB_COPY_BLUE: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - *ptr++ = XMVectorSplatZ(v); - } + const XMVECTOR v = *ptr; + *ptr++ = XMVectorSplatZ(v); } - break; + } + break; default: if ((in->flags & CONVF_UNORM) && ((in->flags & CONVF_RGB_MASK) == (CONVF_R | CONVF_G | CONVF_B))) @@ -3626,29 +3580,28 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { const XMVECTOR v = *ptr; - *ptr++ = XMVector3Dot(v, g_Grayscale); + *ptr++ = XMVector3Dot(v, g_Grayscale); } break; } - #if (__cplusplus >= 201703L) +#if (__cplusplus >= 201703L) [[fallthrough]]; - #elif defined(__clang__) +#elif defined(__clang__) [[clang::fallthrough]]; - #elif defined(_MSC_VER) +#elif defined(_MSC_VER) __fallthrough; - #endif +#endif - case TEX_FILTER_RGB_COPY_RED: + case TEX_FILTER_RGB_COPY_RED: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - *ptr++ = XMVectorSplatX(v); - } + const XMVECTOR v = *ptr; + *ptr++ = XMVectorSplatX(v); } - break; + } + break; } } else if (((in->flags & CONVF_RGBA_MASK) == CONVF_A) && !(out->flags & CONVF_A)) @@ -3658,7 +3611,7 @@ void DirectX::Internal::ConvertScanline( for (size_t i = 0; i < count; ++i) { const XMVECTOR v = *ptr; - *ptr++ = XMVectorSplatW(v); + *ptr++ = XMVectorSplatW(v); } } else if ((in->flags & CONVF_RGB_MASK) == CONVF_R) @@ -3669,9 +3622,9 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVectorSplatX(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); } } else if ((out->flags & CONVF_RGB_MASK) == (CONVF_R | CONVF_G)) @@ -3680,9 +3633,9 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVectorSplatX(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); } } } @@ -3691,43 +3644,41 @@ void DirectX::Internal::ConvertScanline( if ((out->flags & CONVF_RGB_MASK) == CONVF_R) { // RGB(A) format -> R format - switch (flags & (TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN | TEX_FILTER_RGB_COPY_BLUE | TEX_FILTER_RGB_COPY_ALPHA)) + switch ( + flags & (TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN | TEX_FILTER_RGB_COPY_BLUE | TEX_FILTER_RGB_COPY_ALPHA)) { - case TEX_FILTER_RGB_COPY_GREEN: + case TEX_FILTER_RGB_COPY_GREEN: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSplatY(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSplatY(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); } - break; + } + break; - case TEX_FILTER_RGB_COPY_BLUE: + case TEX_FILTER_RGB_COPY_BLUE: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSplatZ(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSplatZ(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); } - break; + } + break; - case TEX_FILTER_RGB_COPY_ALPHA: + case TEX_FILTER_RGB_COPY_ALPHA: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSplatW(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSplatW(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); } - break; + } + break; default: if (in->flags & CONVF_UNORM) @@ -3735,20 +3686,20 @@ void DirectX::Internal::ConvertScanline( XMVECTOR* ptr = pBuffer; for (size_t i = 0; i < count; ++i) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR v1 = XMVector3Dot(v, g_Grayscale); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1110); } break; } - #if (__cplusplus >= 201703L) +#if (__cplusplus >= 201703L) [[fallthrough]]; - #elif defined(__clang__) +#elif defined(__clang__) [[clang::fallthrough]]; - #elif defined(_MSC_VER) +#elif defined(_MSC_VER) __fallthrough; - #endif +#endif case TEX_FILTER_RGB_COPY_RED: // Leave data unchanged and the store will handle this... @@ -3760,44 +3711,43 @@ void DirectX::Internal::ConvertScanline( if ((flags & TEX_FILTER_RGB_COPY_ALPHA) && (in->flags & CONVF_A)) { // RGBA -> RG format - switch (static_cast(flags & (TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN | TEX_FILTER_RGB_COPY_BLUE | TEX_FILTER_RGB_COPY_ALPHA))) + switch (static_cast( + flags + & (TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN | TEX_FILTER_RGB_COPY_BLUE | TEX_FILTER_RGB_COPY_ALPHA))) { case (static_cast(TEX_FILTER_RGB_COPY_RED) | static_cast(TEX_FILTER_RGB_COPY_ALPHA)): - default: + default: { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSwizzle<0, 3, 0, 3>(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSwizzle<0, 3, 0, 3>(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); } - break; + } + break; - case (static_cast(TEX_FILTER_RGB_COPY_GREEN) | static_cast(TEX_FILTER_RGB_COPY_ALPHA)): + case (static_cast(TEX_FILTER_RGB_COPY_GREEN) | static_cast(TEX_FILTER_RGB_COPY_ALPHA)): { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSwizzle<1, 3, 1, 3>(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSwizzle<1, 3, 1, 3>(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); } - break; + } + break; - case (static_cast(TEX_FILTER_RGB_COPY_BLUE) | static_cast(TEX_FILTER_RGB_COPY_ALPHA)): + case (static_cast(TEX_FILTER_RGB_COPY_BLUE) | static_cast(TEX_FILTER_RGB_COPY_ALPHA)): { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSwizzle<2, 3, 2, 3>(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSwizzle<2, 3, 2, 3>(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); } - break; + } + break; } } else @@ -3805,29 +3755,27 @@ void DirectX::Internal::ConvertScanline( // RGB format -> RG format switch (static_cast(flags & (TEX_FILTER_RGB_COPY_RED | TEX_FILTER_RGB_COPY_GREEN | TEX_FILTER_RGB_COPY_BLUE))) { - case (static_cast(TEX_FILTER_RGB_COPY_RED) | static_cast(TEX_FILTER_RGB_COPY_BLUE)): + case (static_cast(TEX_FILTER_RGB_COPY_RED) | static_cast(TEX_FILTER_RGB_COPY_BLUE)): { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSwizzle<0, 2, 0, 2>(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSwizzle<0, 2, 0, 2>(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); } - break; + } + break; - case (static_cast(TEX_FILTER_RGB_COPY_GREEN) | static_cast(TEX_FILTER_RGB_COPY_BLUE)): + case (static_cast(TEX_FILTER_RGB_COPY_GREEN) | static_cast(TEX_FILTER_RGB_COPY_BLUE)): { + XMVECTOR* ptr = pBuffer; + for (size_t i = 0; i < count; ++i) { - XMVECTOR* ptr = pBuffer; - for (size_t i = 0; i < count; ++i) - { - const XMVECTOR v = *ptr; - const XMVECTOR v1 = XMVectorSwizzle<1, 2, 3, 0>(v); - *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); - } + const XMVECTOR v = *ptr; + const XMVECTOR v1 = XMVectorSwizzle<1, 2, 3, 0>(v); + *ptr++ = XMVectorSelect(v, v1, g_XMSelect1100); } - break; + } + break; case (static_cast(TEX_FILTER_RGB_COPY_RED) | static_cast(TEX_FILTER_RGB_COPY_GREEN)): default: @@ -3853,209 +3801,257 @@ void DirectX::Internal::ConvertScanline( } } - //------------------------------------------------------------------------------------- // Dithering //------------------------------------------------------------------------------------- namespace { // 4X4X4 ordered dithering matrix - const float g_Dither[] = - { + const float g_Dither[] = { // (z & 3) + ( (y & 3) * 8) + (x & 3) - 0.468750f, -0.031250f, 0.343750f, -0.156250f, 0.468750f, -0.031250f, 0.343750f, -0.156250f, - -0.281250f, 0.218750f, -0.406250f, 0.093750f, -0.281250f, 0.218750f, -0.406250f, 0.093750f, - 0.281250f, -0.218750f, 0.406250f, -0.093750f, 0.281250f, -0.218750f, 0.406250f, -0.093750f, - -0.468750f, 0.031250f, -0.343750f, 0.156250f, -0.468750f, 0.031250f, -0.343750f, 0.156250f, + 0.468750f, + -0.031250f, + 0.343750f, + -0.156250f, + 0.468750f, + -0.031250f, + 0.343750f, + -0.156250f, + -0.281250f, + 0.218750f, + -0.406250f, + 0.093750f, + -0.281250f, + 0.218750f, + -0.406250f, + 0.093750f, + 0.281250f, + -0.218750f, + 0.406250f, + -0.093750f, + 0.281250f, + -0.218750f, + 0.406250f, + -0.093750f, + -0.468750f, + 0.031250f, + -0.343750f, + 0.156250f, + -0.468750f, + 0.031250f, + -0.343750f, + 0.156250f, }; - const XMVECTORF32 g_Scale16pc = { { { 65535.f, 65535.f, 65535.f, 65535.f } } }; - const XMVECTORF32 g_Scale15pc = { { { 32767.f, 32767.f, 32767.f, 32767.f } } }; - const XMVECTORF32 g_Scale10pc = { { { 1023.f, 1023.f, 1023.f, 3.f } } }; - const XMVECTORF32 g_Scale9pc = { { { 511.f, 511.f, 511.f, 3.f } } }; - const XMVECTORF32 g_Scale8pc = { { { 255.f, 255.f, 255.f, 255.f } } }; - const XMVECTORF32 g_Scale7pc = { { { 127.f, 127.f, 127.f, 127.f } } }; - const XMVECTORF32 g_Scale565pc = { { { 31.f, 63.f, 31.f, 1.f } } }; - const XMVECTORF32 g_Scale5551pc = { { { 31.f, 31.f, 31.f, 1.f } } }; - const XMVECTORF32 g_Scale4pc = { { { 15.f, 15.f, 15.f, 15.f } } }; + const XMVECTORF32 g_Scale16pc = { { { 65535.f, 65535.f, 65535.f, 65535.f } } }; + const XMVECTORF32 g_Scale15pc = { { { 32767.f, 32767.f, 32767.f, 32767.f } } }; + const XMVECTORF32 g_Scale10pc = { { { 1023.f, 1023.f, 1023.f, 3.f } } }; + const XMVECTORF32 g_Scale9pc = { { { 511.f, 511.f, 511.f, 3.f } } }; + const XMVECTORF32 g_Scale8pc = { { { 255.f, 255.f, 255.f, 255.f } } }; + const XMVECTORF32 g_Scale7pc = { { { 127.f, 127.f, 127.f, 127.f } } }; + const XMVECTORF32 g_Scale565pc = { { { 31.f, 63.f, 31.f, 1.f } } }; + const XMVECTORF32 g_Scale5551pc = { { { 31.f, 31.f, 31.f, 1.f } } }; + const XMVECTORF32 g_Scale4pc = { { { 15.f, 15.f, 15.f, 15.f } } }; const XMVECTORF32 g_ErrorWeight3 = { { { 3.f / 16.f, 3.f / 16.f, 3.f / 16.f, 3.f / 16.f } } }; const XMVECTORF32 g_ErrorWeight5 = { { { 5.f / 16.f, 5.f / 16.f, 5.f / 16.f, 5.f / 16.f } } }; const XMVECTORF32 g_ErrorWeight1 = { { { 1.f / 16.f, 1.f / 16.f, 1.f / 16.f, 1.f / 16.f } } }; const XMVECTORF32 g_ErrorWeight7 = { { { 7.f / 16.f, 7.f / 16.f, 7.f / 16.f, 7.f / 16.f } } }; -#define STORE_SCANLINE( type, scalev, clampzero, norm, itype, mask, row, bgr ) \ - if (size >= sizeof(type)) \ - { \ - type * __restrict dest = reinterpret_cast(pDestination); \ - for(size_t i = 0; i < count; ++i) \ - { \ - auto index = static_cast((row & 1) ? (count - i - 1) : i ); \ - ptrdiff_t delta = (row & 1) ? -2 : 0; \ - \ - XMVECTOR v = sPtr[ index ]; \ - if (bgr) { v = XMVectorSwizzle<2, 1, 0, 3>(v); } \ - if (norm && clampzero) v = XMVectorSaturate(v) ; \ - else if (clampzero) v = XMVectorClamp(v, g_XMZero, scalev); \ - else if (norm) v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); \ - else v = XMVectorClamp(v, XMVectorAdd(XMVectorNegate(scalev), g_XMOne), scalev); \ - v = XMVectorAdd(v, vError); \ - if (norm) v = XMVectorMultiply(v, scalev); \ - \ - XMVECTOR target; \ - if (pDiffusionErrors) \ - { \ - target = XMVectorRound(v); \ - vError = XMVectorSubtract(v, target); \ - if (norm) vError = XMVectorDivide(vError, scalev); \ - \ - /* Distribute error to next scanline and next pixel */ \ - pDiffusionErrors[ index-delta ] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[ index-delta ]); \ - pDiffusionErrors[ index+1 ] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[ index+1 ]); \ - pDiffusionErrors[ index+2+delta ] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[ index+2+delta ]); \ - vError = XMVectorMultiply(vError, g_ErrorWeight7); \ - } \ - else \ - { \ - /* Applied ordered dither */ \ - target = XMVectorAdd(v, ordered[ index & 3 ]); \ - target = XMVectorRound(target); \ - } \ - \ - target = XMVectorMin(scalev, target); \ - target = XMVectorMax((clampzero) ? g_XMZero : (XMVectorAdd(XMVectorNegate(scalev), g_XMOne)), target); \ - \ - XMFLOAT4A tmp; \ - XMStoreFloat4A(&tmp, target); \ - \ - auto dPtr = &dest[ index ]; \ - if (dPtr >= ePtr) break; \ - dPtr->x = itype(static_cast(tmp.x) & mask); \ - dPtr->y = itype(static_cast(tmp.y) & mask); \ - dPtr->z = itype(static_cast(tmp.z) & mask); \ - dPtr->w = itype(static_cast(tmp.w) & mask); \ - } \ - return true; \ - } \ - return false; +#define STORE_SCANLINE(type, scalev, clampzero, norm, itype, mask, row, bgr) \ + if (size >= sizeof(type)) \ + { \ + type* __restrict dest = reinterpret_cast(pDestination); \ + for (size_t i = 0; i < count; ++i) \ + { \ + auto index = static_cast((row & 1) ? (count - i - 1) : i); \ + ptrdiff_t delta = (row & 1) ? -2 : 0; \ + \ + XMVECTOR v = sPtr[index]; \ + if (bgr) \ + { \ + v = XMVectorSwizzle<2, 1, 0, 3>(v); \ + } \ + if (norm && clampzero) \ + v = XMVectorSaturate(v); \ + else if (clampzero) \ + v = XMVectorClamp(v, g_XMZero, scalev); \ + else if (norm) \ + v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); \ + else \ + v = XMVectorClamp(v, XMVectorAdd(XMVectorNegate(scalev), g_XMOne), scalev); \ + v = XMVectorAdd(v, vError); \ + if (norm) \ + v = XMVectorMultiply(v, scalev); \ + \ + XMVECTOR target; \ + if (pDiffusionErrors) \ + { \ + target = XMVectorRound(v); \ + vError = XMVectorSubtract(v, target); \ + if (norm) \ + vError = XMVectorDivide(vError, scalev); \ + \ + /* Distribute error to next scanline and next pixel */ \ + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); \ + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); \ + pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); \ + vError = XMVectorMultiply(vError, g_ErrorWeight7); \ + } \ + else \ + { \ + /* Applied ordered dither */ \ + target = XMVectorAdd(v, ordered[index & 3]); \ + target = XMVectorRound(target); \ + } \ + \ + target = XMVectorMin(scalev, target); \ + target = XMVectorMax((clampzero) ? g_XMZero : (XMVectorAdd(XMVectorNegate(scalev), g_XMOne)), target); \ + \ + XMFLOAT4A tmp; \ + XMStoreFloat4A(&tmp, target); \ + \ + auto dPtr = &dest[index]; \ + if (dPtr >= ePtr) \ + break; \ + dPtr->x = itype(static_cast(tmp.x) & mask); \ + dPtr->y = itype(static_cast(tmp.y) & mask); \ + dPtr->z = itype(static_cast(tmp.z) & mask); \ + dPtr->w = itype(static_cast(tmp.w) & mask); \ + } \ + return true; \ + } \ + return false; -#define STORE_SCANLINE2( type, scalev, clampzero, norm, itype, mask, row ) \ - /* The 2 component cases are always bgr=false */ \ - if (size >= sizeof(type)) \ - { \ - type * __restrict dest = reinterpret_cast(pDestination); \ - for(size_t i = 0; i < count; ++i) \ - { \ - auto index = static_cast((row & 1) ? (count - i - 1) : i ); \ - ptrdiff_t delta = (row & 1) ? -2 : 0; \ - \ - XMVECTOR v = sPtr[ index ]; \ - if (norm && clampzero) v = XMVectorSaturate(v) ; \ - else if (clampzero) v = XMVectorClamp(v, g_XMZero, scalev); \ - else if (norm) v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); \ - else v = XMVectorClamp(v, XMVectorAdd(XMVectorNegate(scalev), g_XMOne), scalev); \ - v = XMVectorAdd(v, vError); \ - if (norm) v = XMVectorMultiply(v, scalev); \ - \ - XMVECTOR target; \ - if (pDiffusionErrors) \ - { \ - target = XMVectorRound(v); \ - vError = XMVectorSubtract(v, target); \ - if (norm) vError = XMVectorDivide(vError, scalev); \ - \ - /* Distribute error to next scanline and next pixel */ \ - pDiffusionErrors[ index-delta ] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[ index-delta ]); \ - pDiffusionErrors[ index+1 ] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[ index+1 ]); \ - pDiffusionErrors[ index+2+delta ] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[ index+2+delta ]); \ - vError = XMVectorMultiply(vError, g_ErrorWeight7); \ - } \ - else \ - { \ - /* Applied ordered dither */ \ - target = XMVectorAdd(v, ordered[ index & 3 ]); \ - target = XMVectorRound(target); \ - } \ - \ - target = XMVectorMin(scalev, target); \ - target = XMVectorMax((clampzero) ? g_XMZero : (XMVectorAdd(XMVectorNegate(scalev), g_XMOne)), target); \ - \ - XMFLOAT4A tmp; \ - XMStoreFloat4A(&tmp, target); \ - \ - auto dPtr = &dest[ index ]; \ - if (dPtr >= ePtr) break; \ - dPtr->x = itype(static_cast(tmp.x) & mask); \ - dPtr->y = itype(static_cast(tmp.y) & mask); \ - } \ - return true; \ - } \ - return false; +#define STORE_SCANLINE2(type, scalev, clampzero, norm, itype, mask, row) \ + /* The 2 component cases are always bgr=false */ \ + if (size >= sizeof(type)) \ + { \ + type* __restrict dest = reinterpret_cast(pDestination); \ + for (size_t i = 0; i < count; ++i) \ + { \ + auto index = static_cast((row & 1) ? (count - i - 1) : i); \ + ptrdiff_t delta = (row & 1) ? -2 : 0; \ + \ + XMVECTOR v = sPtr[index]; \ + if (norm && clampzero) \ + v = XMVectorSaturate(v); \ + else if (clampzero) \ + v = XMVectorClamp(v, g_XMZero, scalev); \ + else if (norm) \ + v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); \ + else \ + v = XMVectorClamp(v, XMVectorAdd(XMVectorNegate(scalev), g_XMOne), scalev); \ + v = XMVectorAdd(v, vError); \ + if (norm) \ + v = XMVectorMultiply(v, scalev); \ + \ + XMVECTOR target; \ + if (pDiffusionErrors) \ + { \ + target = XMVectorRound(v); \ + vError = XMVectorSubtract(v, target); \ + if (norm) \ + vError = XMVectorDivide(vError, scalev); \ + \ + /* Distribute error to next scanline and next pixel */ \ + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); \ + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); \ + pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); \ + vError = XMVectorMultiply(vError, g_ErrorWeight7); \ + } \ + else \ + { \ + /* Applied ordered dither */ \ + target = XMVectorAdd(v, ordered[index & 3]); \ + target = XMVectorRound(target); \ + } \ + \ + target = XMVectorMin(scalev, target); \ + target = XMVectorMax((clampzero) ? g_XMZero : (XMVectorAdd(XMVectorNegate(scalev), g_XMOne)), target); \ + \ + XMFLOAT4A tmp; \ + XMStoreFloat4A(&tmp, target); \ + \ + auto dPtr = &dest[index]; \ + if (dPtr >= ePtr) \ + break; \ + dPtr->x = itype(static_cast(tmp.x) & mask); \ + dPtr->y = itype(static_cast(tmp.y) & mask); \ + } \ + return true; \ + } \ + return false; -#define STORE_SCANLINE1( type, scalev, clampzero, norm, mask, row, selectw ) \ - /* The 1 component cases are always bgr=false */ \ - if (size >= sizeof(type)) \ - { \ - type * __restrict dest = reinterpret_cast(pDestination); \ - for(size_t i = 0; i < count; ++i) \ - { \ - auto index = static_cast((row & 1) ? (count - i - 1) : i ); \ - ptrdiff_t delta = (row & 1) ? -2 : 0; \ - \ - XMVECTOR v = sPtr[ index ]; \ - if (norm && clampzero) v = XMVectorSaturate(v) ; \ - else if (clampzero) v = XMVectorClamp(v, g_XMZero, scalev); \ - else if (norm) v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); \ - else v = XMVectorClamp(v, XMVectorAdd(XMVectorNegate(scalev), g_XMOne), scalev); \ - v = XMVectorAdd(v, vError); \ - if (norm) v = XMVectorMultiply(v, scalev); \ - \ - XMVECTOR target; \ - if (pDiffusionErrors) \ - { \ - target = XMVectorRound(v); \ - vError = XMVectorSubtract(v, target); \ - if (norm) vError = XMVectorDivide(vError, scalev); \ - \ - /* Distribute error to next scanline and next pixel */ \ - pDiffusionErrors[ index-delta ] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[ index-delta ]); \ - pDiffusionErrors[ index+1 ] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[ index+1 ]); \ - pDiffusionErrors[ index+2+delta ] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[ index+2+delta ]); \ - vError = XMVectorMultiply(vError, g_ErrorWeight7); \ - } \ - else \ - { \ - /* Applied ordered dither */ \ - target = XMVectorAdd(v, ordered[ index & 3 ]); \ - target = XMVectorRound(target); \ - } \ - \ - target = XMVectorMin(scalev, target); \ - target = XMVectorMax((clampzero) ? g_XMZero : (XMVectorAdd(XMVectorNegate(scalev), g_XMOne)), target); \ - \ - auto dPtr = &dest[ index ]; \ - if (dPtr >= ePtr) break; \ - *dPtr = type(static_cast((selectw) ? XMVectorGetW(target) : XMVectorGetX(target)) & mask); \ - } \ - return true; \ - } \ - return false; -} +#define STORE_SCANLINE1(type, scalev, clampzero, norm, mask, row, selectw) \ + /* The 1 component cases are always bgr=false */ \ + if (size >= sizeof(type)) \ + { \ + type* __restrict dest = reinterpret_cast(pDestination); \ + for (size_t i = 0; i < count; ++i) \ + { \ + auto index = static_cast((row & 1) ? (count - i - 1) : i); \ + ptrdiff_t delta = (row & 1) ? -2 : 0; \ + \ + XMVECTOR v = sPtr[index]; \ + if (norm && clampzero) \ + v = XMVectorSaturate(v); \ + else if (clampzero) \ + v = XMVectorClamp(v, g_XMZero, scalev); \ + else if (norm) \ + v = XMVectorClamp(v, g_XMNegativeOne, g_XMOne); \ + else \ + v = XMVectorClamp(v, XMVectorAdd(XMVectorNegate(scalev), g_XMOne), scalev); \ + v = XMVectorAdd(v, vError); \ + if (norm) \ + v = XMVectorMultiply(v, scalev); \ + \ + XMVECTOR target; \ + if (pDiffusionErrors) \ + { \ + target = XMVectorRound(v); \ + vError = XMVectorSubtract(v, target); \ + if (norm) \ + vError = XMVectorDivide(vError, scalev); \ + \ + /* Distribute error to next scanline and next pixel */ \ + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); \ + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); \ + pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); \ + vError = XMVectorMultiply(vError, g_ErrorWeight7); \ + } \ + else \ + { \ + /* Applied ordered dither */ \ + target = XMVectorAdd(v, ordered[index & 3]); \ + target = XMVectorRound(target); \ + } \ + \ + target = XMVectorMin(scalev, target); \ + target = XMVectorMax((clampzero) ? g_XMZero : (XMVectorAdd(XMVectorNegate(scalev), g_XMOne)), target); \ + \ + auto dPtr = &dest[index]; \ + if (dPtr >= ePtr) \ + break; \ + *dPtr = type(static_cast((selectw) ? XMVectorGetW(target) : XMVectorGetX(target)) & mask); \ + } \ + return true; \ + } \ + return false; +} // namespace #pragma warning(push) -#pragma warning( disable : 4127 ) - -_Use_decl_annotations_ -bool DirectX::Internal::StoreScanlineDither( - void* pDestination, - size_t size, - DXGI_FORMAT format, - XMVECTOR* pSource, - size_t count, - float threshold, - size_t y, - size_t z, - XMVECTOR* pDiffusionErrors) noexcept +#pragma warning(disable : 4127) + +_Use_decl_annotations_ bool DirectX::Internal::StoreScanlineDither(void* pDestination, + size_t size, + DXGI_FORMAT format, + XMVECTOR* pSource, + size_t count, + float threshold, + size_t y, + size_t z, + XMVECTOR* pDiffusionErrors) noexcept { assert(pDestination != nullptr); assert(IsValid(format) && !IsTypeless(format) && !IsCompressed(format) && !IsPlanar(format) && !IsPalettized(format)); @@ -4077,17 +4073,17 @@ bool DirectX::Internal::StoreScanlineDither( // To avoid the need for another temporary scanline buffer, we allow this function to overwrite the source buffer in-place // Given the intended usage in the conversion routines, this is not a problem. - XMVECTOR* ptr = pSource; + XMVECTOR* ptr = pSource; const XMVECTOR* err = pDiffusionErrors + 1; for (size_t i = 0; i < count; ++i) { // Add contribution from previous scanline XMVECTOR v = XMVectorAdd(*ptr, *err++); - *ptr++ = v; + *ptr++ = v; } // Reset errors for next scanline - memset(pDiffusionErrors, 0, sizeof(XMVECTOR)*(count + 2)); + memset(pDiffusionErrors, 0, sizeof(XMVECTOR) * (count + 2)); } else { @@ -4111,40 +4107,34 @@ bool DirectX::Internal::StoreScanlineDither( switch (static_cast(format)) { - case DXGI_FORMAT_R16G16B16A16_UNORM: - STORE_SCANLINE(XMUSHORTN4, g_Scale16pc, true, true, uint16_t, 0xFFFF, y, false) + case DXGI_FORMAT_R16G16B16A16_UNORM: STORE_SCANLINE(XMUSHORTN4, g_Scale16pc, true, true, uint16_t, 0xFFFF, y, false) - case DXGI_FORMAT_R16G16B16A16_UINT: - STORE_SCANLINE(XMUSHORT4, g_Scale16pc, true, false, uint16_t, 0xFFFF, y, false) + case DXGI_FORMAT_R16G16B16A16_UINT: STORE_SCANLINE(XMUSHORT4, g_Scale16pc, true, false, uint16_t, 0xFFFF, y, false) - case DXGI_FORMAT_R16G16B16A16_SNORM: - STORE_SCANLINE(XMSHORTN4, g_Scale15pc, false, true, int16_t, 0xFFFF, y, false) + case DXGI_FORMAT_R16G16B16A16_SNORM: STORE_SCANLINE(XMSHORTN4, g_Scale15pc, false, true, int16_t, 0xFFFF, y, false) - case DXGI_FORMAT_R16G16B16A16_SINT: - STORE_SCANLINE(XMSHORT4, g_Scale15pc, false, false, int16_t, 0xFFFF, y, false) + case DXGI_FORMAT_R16G16B16A16_SINT: STORE_SCANLINE(XMSHORT4, g_Scale15pc, false, false, int16_t, 0xFFFF, y, false) - case DXGI_FORMAT_R10G10B10A2_UNORM: - STORE_SCANLINE(XMUDECN4, g_Scale10pc, true, true, uint16_t, 0x3FF, y, false) + case DXGI_FORMAT_R10G10B10A2_UNORM: STORE_SCANLINE(XMUDECN4, g_Scale10pc, true, true, uint16_t, 0x3FF, y, false) - case DXGI_FORMAT_R10G10B10A2_UINT: - STORE_SCANLINE(XMUDEC4, g_Scale10pc, true, false, uint16_t, 0x3FF, y, false) + case DXGI_FORMAT_R10G10B10A2_UINT: STORE_SCANLINE(XMUDEC4, g_Scale10pc, true, false, uint16_t, 0x3FF, y, false) case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: if (size >= sizeof(XMUDEC4)) { - static const XMVECTORF32 Scale = { { { 510.0f, 510.0f, 510.0f, 3.0f } } }; - static const XMVECTORF32 Bias = { { { 384.0f, 384.0f, 384.0f, 0.0f } } }; - static const XMVECTORF32 MinXR = { { { -0.7529f, -0.7529f, -0.7529f, 0.f } } }; - static const XMVECTORF32 MaxXR = { { { 1.2529f, 1.2529f, 1.2529f, 1.0f } } }; + static const XMVECTORF32 Scale = { { { 510.0f, 510.0f, 510.0f, 3.0f } } }; + static const XMVECTORF32 Bias = { { { 384.0f, 384.0f, 384.0f, 0.0f } } }; + static const XMVECTORF32 MinXR = { { { -0.7529f, -0.7529f, -0.7529f, 0.f } } }; + static const XMVECTORF32 MaxXR = { { { 1.2529f, 1.2529f, 1.2529f, 1.0f } } }; - XMUDEC4 * __restrict dest = static_cast(pDestination); + XMUDEC4* __restrict dest = static_cast(pDestination); for (size_t i = 0; i < count; ++i) { - auto index = static_cast((y & 1) ? (count - i - 1) : i); + auto index = static_cast((y & 1) ? (count - i - 1) : i); ptrdiff_t delta = (y & 1) ? -2 : 0; XMVECTOR v = XMVectorClamp(sPtr[index], MinXR, MaxXR); - v = XMVectorMultiplyAdd(v, Scale, vError); + v = XMVectorMultiplyAdd(v, Scale, vError); XMVECTOR target; if (pDiffusionErrors) @@ -4154,10 +4144,10 @@ bool DirectX::Internal::StoreScanlineDither( vError = XMVectorDivide(vError, Scale); // Distribute error to next scanline and next pixel - pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); - pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); - vError = XMVectorMultiply(vError, g_ErrorWeight7); + vError = XMVectorMultiply(vError, g_ErrorWeight7); } else { @@ -4173,7 +4163,8 @@ bool DirectX::Internal::StoreScanlineDither( XMStoreFloat4A(&tmp, target); auto dPtr = &dest[index]; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; dPtr->x = uint16_t(static_cast(tmp.x) & 0x3FF); dPtr->y = uint16_t(static_cast(tmp.y) & 0x3FF); dPtr->z = uint16_t(static_cast(tmp.z) & 0x3FF); @@ -4184,46 +4175,38 @@ bool DirectX::Internal::StoreScanlineDither( return false; case DXGI_FORMAT_R8G8B8A8_UNORM: - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - STORE_SCANLINE(XMUBYTEN4, g_Scale8pc, true, true, uint8_t, 0xFF, y, false) + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: STORE_SCANLINE(XMUBYTEN4, g_Scale8pc, true, true, uint8_t, 0xFF, y, false) - case DXGI_FORMAT_R8G8B8A8_UINT: - STORE_SCANLINE(XMUBYTE4, g_Scale8pc, true, false, uint8_t, 0xFF, y, false) + case DXGI_FORMAT_R8G8B8A8_UINT: STORE_SCANLINE(XMUBYTE4, g_Scale8pc, true, false, uint8_t, 0xFF, y, false) - case DXGI_FORMAT_R8G8B8A8_SNORM: - STORE_SCANLINE(XMBYTEN4, g_Scale7pc, false, true, int8_t, 0xFF, y, false) + case DXGI_FORMAT_R8G8B8A8_SNORM: STORE_SCANLINE(XMBYTEN4, g_Scale7pc, false, true, int8_t, 0xFF, y, false) - case DXGI_FORMAT_R8G8B8A8_SINT: - STORE_SCANLINE(XMBYTE4, g_Scale7pc, false, false, int8_t, 0xFF, y, false) + case DXGI_FORMAT_R8G8B8A8_SINT: STORE_SCANLINE(XMBYTE4, g_Scale7pc, false, false, int8_t, 0xFF, y, false) - case DXGI_FORMAT_R16G16_UNORM: - STORE_SCANLINE2(XMUSHORTN2, g_Scale16pc, true, true, uint16_t, 0xFFFF, y) + case DXGI_FORMAT_R16G16_UNORM: STORE_SCANLINE2(XMUSHORTN2, g_Scale16pc, true, true, uint16_t, 0xFFFF, y) - case DXGI_FORMAT_R16G16_UINT: - STORE_SCANLINE2(XMUSHORT2, g_Scale16pc, true, false, uint16_t, 0xFFFF, y) + case DXGI_FORMAT_R16G16_UINT: STORE_SCANLINE2(XMUSHORT2, g_Scale16pc, true, false, uint16_t, 0xFFFF, y) - case DXGI_FORMAT_R16G16_SNORM: - STORE_SCANLINE2(XMSHORTN2, g_Scale15pc, false, true, int16_t, 0xFFFF, y) + case DXGI_FORMAT_R16G16_SNORM: STORE_SCANLINE2(XMSHORTN2, g_Scale15pc, false, true, int16_t, 0xFFFF, y) - case DXGI_FORMAT_R16G16_SINT: - STORE_SCANLINE2(XMSHORT2, g_Scale15pc, false, false, int16_t, 0xFFFF, y) + case DXGI_FORMAT_R16G16_SINT: STORE_SCANLINE2(XMSHORT2, g_Scale15pc, false, false, int16_t, 0xFFFF, y) case DXGI_FORMAT_D24_UNORM_S8_UINT: if (size >= sizeof(uint32_t)) { - static const XMVECTORF32 Clamp = { { { 1.f, 255.f, 0.f, 0.f } } }; - static const XMVECTORF32 Scale = { { { 16777215.f, 1.f, 0.f, 0.f } } }; + static const XMVECTORF32 Clamp = { { { 1.f, 255.f, 0.f, 0.f } } }; + static const XMVECTORF32 Scale = { { { 16777215.f, 1.f, 0.f, 0.f } } }; static const XMVECTORF32 Scale2 = { { { 16777215.f, 255.f, 0.f, 0.f } } }; - uint32_t * __restrict dest = static_cast(pDestination); + uint32_t* __restrict dest = static_cast(pDestination); for (size_t i = 0; i < count; ++i) { - auto index = static_cast((y & 1) ? (count - i - 1) : i); + auto index = static_cast((y & 1) ? (count - i - 1) : i); ptrdiff_t delta = (y & 1) ? -2 : 0; XMVECTOR v = XMVectorClamp(sPtr[index], g_XMZero, Clamp); - v = XMVectorAdd(v, vError); - v = XMVectorMultiply(v, Scale); + v = XMVectorAdd(v, vError); + v = XMVectorMultiply(v, Scale); XMVECTOR target; if (pDiffusionErrors) @@ -4233,10 +4216,10 @@ bool DirectX::Internal::StoreScanlineDither( vError = XMVectorDivide(vError, Scale); // Distribute error to next scanline and next pixel - pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); - pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); - vError = XMVectorMultiply(vError, g_ErrorWeight7); + vError = XMVectorMultiply(vError, g_ErrorWeight7); } else { @@ -4251,67 +4234,54 @@ bool DirectX::Internal::StoreScanlineDither( XMStoreFloat4A(&tmp, target); auto dPtr = &dest[index]; - if (dPtr >= ePtr) break; - *dPtr = (static_cast(tmp.x) & 0xFFFFFF) - | ((static_cast(tmp.y) & 0xFF) << 24); + if (dPtr >= ePtr) + break; + *dPtr = (static_cast(tmp.x) & 0xFFFFFF) | ((static_cast(tmp.y) & 0xFF) << 24); } return true; } return false; - case DXGI_FORMAT_R8G8_UNORM: - STORE_SCANLINE2(XMUBYTEN2, g_Scale8pc, true, true, uint8_t, 0xFF, y) + case DXGI_FORMAT_R8G8_UNORM: STORE_SCANLINE2(XMUBYTEN2, g_Scale8pc, true, true, uint8_t, 0xFF, y) - case DXGI_FORMAT_R8G8_UINT: - STORE_SCANLINE2(XMUBYTE2, g_Scale8pc, true, false, uint8_t, 0xFF, y) + case DXGI_FORMAT_R8G8_UINT: STORE_SCANLINE2(XMUBYTE2, g_Scale8pc, true, false, uint8_t, 0xFF, y) - case DXGI_FORMAT_R8G8_SNORM: - STORE_SCANLINE2(XMBYTEN2, g_Scale7pc, false, true, int8_t, 0xFF, y) + case DXGI_FORMAT_R8G8_SNORM: STORE_SCANLINE2(XMBYTEN2, g_Scale7pc, false, true, int8_t, 0xFF, y) - case DXGI_FORMAT_R8G8_SINT: - STORE_SCANLINE2(XMBYTE2, g_Scale7pc, false, false, int8_t, 0xFF, y) + case DXGI_FORMAT_R8G8_SINT: STORE_SCANLINE2(XMBYTE2, g_Scale7pc, false, false, int8_t, 0xFF, y) case DXGI_FORMAT_D16_UNORM: - case DXGI_FORMAT_R16_UNORM: - STORE_SCANLINE1(uint16_t, g_Scale16pc, true, true, 0xFFFF, y, false) + case DXGI_FORMAT_R16_UNORM: STORE_SCANLINE1(uint16_t, g_Scale16pc, true, true, 0xFFFF, y, false) - case DXGI_FORMAT_R16_UINT: - STORE_SCANLINE1(uint16_t, g_Scale16pc, true, false, 0xFFFF, y, false) + case DXGI_FORMAT_R16_UINT: STORE_SCANLINE1(uint16_t, g_Scale16pc, true, false, 0xFFFF, y, false) - case DXGI_FORMAT_R16_SNORM: - STORE_SCANLINE1(int16_t, g_Scale15pc, false, true, 0xFFFF, y, false) + case DXGI_FORMAT_R16_SNORM: STORE_SCANLINE1(int16_t, g_Scale15pc, false, true, 0xFFFF, y, false) - case DXGI_FORMAT_R16_SINT: - STORE_SCANLINE1(int16_t, g_Scale15pc, false, false, 0xFFFF, y, false) + case DXGI_FORMAT_R16_SINT: STORE_SCANLINE1(int16_t, g_Scale15pc, false, false, 0xFFFF, y, false) - case DXGI_FORMAT_R8_UNORM: - STORE_SCANLINE1(uint8_t, g_Scale8pc, true, true, 0xFF, y, false) + case DXGI_FORMAT_R8_UNORM: STORE_SCANLINE1(uint8_t, g_Scale8pc, true, true, 0xFF, y, false) - case DXGI_FORMAT_R8_UINT: - STORE_SCANLINE1(uint8_t, g_Scale8pc, true, false, 0xFF, y, false) + case DXGI_FORMAT_R8_UINT: STORE_SCANLINE1(uint8_t, g_Scale8pc, true, false, 0xFF, y, false) - case DXGI_FORMAT_R8_SNORM: - STORE_SCANLINE1(int8_t, g_Scale7pc, false, true, 0xFF, y, false) + case DXGI_FORMAT_R8_SNORM: STORE_SCANLINE1(int8_t, g_Scale7pc, false, true, 0xFF, y, false) - case DXGI_FORMAT_R8_SINT: - STORE_SCANLINE1(int8_t, g_Scale7pc, false, false, 0xFF, y, false) + case DXGI_FORMAT_R8_SINT: STORE_SCANLINE1(int8_t, g_Scale7pc, false, false, 0xFF, y, false) - case DXGI_FORMAT_A8_UNORM: - STORE_SCANLINE1(uint8_t, g_Scale8pc, true, true, 0xFF, y, true) + case DXGI_FORMAT_A8_UNORM: STORE_SCANLINE1(uint8_t, g_Scale8pc, true, true, 0xFF, y, true) case DXGI_FORMAT_B5G6R5_UNORM: if (size >= sizeof(XMU565)) { - XMU565 * __restrict dest = static_cast(pDestination); + XMU565* __restrict dest = static_cast(pDestination); for (size_t i = 0; i < count; ++i) { - auto index = static_cast((y & 1) ? (count - i - 1) : i); + auto index = static_cast((y & 1) ? (count - i - 1) : i); ptrdiff_t delta = (y & 1) ? -2 : 0; XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>(sPtr[index]); - v = XMVectorSaturate(v); - v = XMVectorAdd(v, vError); - v = XMVectorMultiply(v, g_Scale565pc); + v = XMVectorSaturate(v); + v = XMVectorAdd(v, vError); + v = XMVectorMultiply(v, g_Scale565pc); XMVECTOR target; if (pDiffusionErrors) @@ -4321,10 +4291,10 @@ bool DirectX::Internal::StoreScanlineDither( vError = XMVectorDivide(vError, g_Scale565pc); // Distribute error to next scanline and next pixel - pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); - pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); - vError = XMVectorMultiply(vError, g_ErrorWeight7); + vError = XMVectorMultiply(vError, g_ErrorWeight7); } else { @@ -4339,7 +4309,8 @@ bool DirectX::Internal::StoreScanlineDither( XMStoreFloat4A(&tmp, target); auto dPtr = &dest[index]; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; dPtr->x = uint16_t(static_cast(tmp.x) & 0x1F); dPtr->y = uint16_t(static_cast(tmp.y) & 0x3F); dPtr->z = uint16_t(static_cast(tmp.z) & 0x1F); @@ -4351,16 +4322,16 @@ bool DirectX::Internal::StoreScanlineDither( case DXGI_FORMAT_B5G5R5A1_UNORM: if (size >= sizeof(XMU555)) { - XMU555 * __restrict dest = static_cast(pDestination); + XMU555* __restrict dest = static_cast(pDestination); for (size_t i = 0; i < count; ++i) { - auto index = static_cast((y & 1) ? (count - i - 1) : i); + auto index = static_cast((y & 1) ? (count - i - 1) : i); ptrdiff_t delta = (y & 1) ? -2 : 0; XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>(sPtr[index]); - v = XMVectorSaturate(v); - v = XMVectorAdd(v, vError); - v = XMVectorMultiply(v, g_Scale5551pc); + v = XMVectorSaturate(v); + v = XMVectorAdd(v, vError); + v = XMVectorMultiply(v, g_Scale5551pc); XMVECTOR target; if (pDiffusionErrors) @@ -4370,10 +4341,10 @@ bool DirectX::Internal::StoreScanlineDither( vError = XMVectorDivide(vError, g_Scale5551pc); // Distribute error to next scanline and next pixel - pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); - pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); - vError = XMVectorMultiply(vError, g_ErrorWeight7); + vError = XMVectorMultiply(vError, g_ErrorWeight7); } else { @@ -4388,7 +4359,8 @@ bool DirectX::Internal::StoreScanlineDither( XMStoreFloat4A(&tmp, target); auto dPtr = &dest[index]; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; dPtr->x = uint16_t(static_cast(tmp.x) & 0x1F); dPtr->y = uint16_t(static_cast(tmp.y) & 0x1F); dPtr->z = uint16_t(static_cast(tmp.z) & 0x1F); @@ -4399,23 +4371,22 @@ bool DirectX::Internal::StoreScanlineDither( return false; case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - STORE_SCANLINE(XMUBYTEN4, g_Scale8pc, true, true, uint8_t, 0xFF, y, true) + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: STORE_SCANLINE(XMUBYTEN4, g_Scale8pc, true, true, uint8_t, 0xFF, y, true) case DXGI_FORMAT_B8G8R8X8_UNORM: case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: if (size >= sizeof(XMUBYTEN4)) { - XMUBYTEN4 * __restrict dest = static_cast(pDestination); + XMUBYTEN4* __restrict dest = static_cast(pDestination); for (size_t i = 0; i < count; ++i) { - auto index = static_cast((y & 1) ? (count - i - 1) : i); + auto index = static_cast((y & 1) ? (count - i - 1) : i); ptrdiff_t delta = (y & 1) ? -2 : 0; XMVECTOR v = XMVectorSwizzle<2, 1, 0, 3>(sPtr[index]); - v = XMVectorSaturate(v); - v = XMVectorAdd(v, vError); - v = XMVectorMultiply(v, g_Scale8pc); + v = XMVectorSaturate(v); + v = XMVectorAdd(v, vError); + v = XMVectorMultiply(v, g_Scale8pc); XMVECTOR target; if (pDiffusionErrors) @@ -4425,10 +4396,10 @@ bool DirectX::Internal::StoreScanlineDither( vError = XMVectorDivide(vError, g_Scale8pc); // Distribute error to next scanline and next pixel - pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); - pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); - vError = XMVectorMultiply(vError, g_ErrorWeight7); + vError = XMVectorMultiply(vError, g_ErrorWeight7); } else { @@ -4443,7 +4414,8 @@ bool DirectX::Internal::StoreScanlineDither( XMStoreFloat4A(&tmp, target); auto dPtr = &dest[index]; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; dPtr->x = uint8_t(static_cast(tmp.x) & 0xFF); dPtr->y = uint8_t(static_cast(tmp.y) & 0xFF); dPtr->z = uint8_t(static_cast(tmp.z) & 0xFF); @@ -4453,22 +4425,21 @@ bool DirectX::Internal::StoreScanlineDither( } return false; - case DXGI_FORMAT_B4G4R4A4_UNORM: - STORE_SCANLINE(XMUNIBBLE4, g_Scale4pc, true, true, uint8_t, 0xF, y, true) + case DXGI_FORMAT_B4G4R4A4_UNORM: STORE_SCANLINE(XMUNIBBLE4, g_Scale4pc, true, true, uint8_t, 0xF, y, true) case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: if (size >= sizeof(XMUNIBBLE4)) { - XMUNIBBLE4 * __restrict dest = static_cast(pDestination); + XMUNIBBLE4* __restrict dest = static_cast(pDestination); for (size_t i = 0; i < count; ++i) { - auto index = static_cast((y & 1) ? (count - i - 1) : i); + auto index = static_cast((y & 1) ? (count - i - 1) : i); ptrdiff_t delta = (y & 1) ? -2 : 0; XMVECTOR v = XMVectorSaturate(sPtr[index]); - v = XMVectorSwizzle<3, 2, 1, 0>(v); - v = XMVectorAdd(v, vError); - v = XMVectorMultiply(v, g_Scale4pc); + v = XMVectorSwizzle<3, 2, 1, 0>(v); + v = XMVectorAdd(v, vError); + v = XMVectorMultiply(v, g_Scale4pc); XMVECTOR target; if (pDiffusionErrors) @@ -4478,10 +4449,10 @@ bool DirectX::Internal::StoreScanlineDither( vError = XMVectorDivide(vError, g_Scale4pc); // Distribute error to next scanline and next pixel - pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); - pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); - vError = XMVectorMultiply(vError, g_ErrorWeight7); + vError = XMVectorMultiply(vError, g_ErrorWeight7); } else { @@ -4496,7 +4467,8 @@ bool DirectX::Internal::StoreScanlineDither( XMStoreFloat4A(&tmp, target); auto dPtr = &dest[index]; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; dPtr->x = uint8_t(static_cast(tmp.x) & 0xF); dPtr->y = uint8_t(static_cast(tmp.y) & 0xF); dPtr->z = uint8_t(static_cast(tmp.z) & 0xF); @@ -4506,21 +4478,20 @@ bool DirectX::Internal::StoreScanlineDither( } return false; - case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: - STORE_SCANLINE(XMXDECN4, g_Scale9pc, false, true, uint16_t, 0x3FF, y, false) + case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: STORE_SCANLINE(XMXDECN4, g_Scale9pc, false, true, uint16_t, 0x3FF, y, false) case XBOX_DXGI_FORMAT_R4G4_UNORM: if (size >= sizeof(uint8_t)) { - uint8_t * __restrict dest = static_cast(pDestination); + uint8_t* __restrict dest = static_cast(pDestination); for (size_t i = 0; i < count; ++i) { - auto index = static_cast((y & 1) ? (count - i - 1) : i); + auto index = static_cast((y & 1) ? (count - i - 1) : i); ptrdiff_t delta = (y & 1) ? -2 : 0; XMVECTOR v = XMVectorSaturate(sPtr[index]); - v = XMVectorAdd(v, vError); - v = XMVectorMultiply(v, g_Scale4pc); + v = XMVectorAdd(v, vError); + v = XMVectorMultiply(v, g_Scale4pc); XMVECTOR target; if (pDiffusionErrors) @@ -4530,10 +4501,10 @@ bool DirectX::Internal::StoreScanlineDither( vError = XMVectorDivide(vError, g_Scale4pc); // Distribute error to next scanline and next pixel - pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); - pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); + pDiffusionErrors[index - delta] = XMVectorMultiplyAdd(g_ErrorWeight3, vError, pDiffusionErrors[index - delta]); + pDiffusionErrors[index + 1] = XMVectorMultiplyAdd(g_ErrorWeight5, vError, pDiffusionErrors[index + 1]); pDiffusionErrors[index + 2 + delta] = XMVectorMultiplyAdd(g_ErrorWeight1, vError, pDiffusionErrors[index + 2 + delta]); - vError = XMVectorMultiply(vError, g_ErrorWeight7); + vError = XMVectorMultiply(vError, g_ErrorWeight7); } else { @@ -4548,15 +4519,15 @@ bool DirectX::Internal::StoreScanlineDither( XMStoreFloat4A(&tmp, target); auto dPtr = &dest[index]; - if (dPtr >= ePtr) break; + if (dPtr >= ePtr) + break; *dPtr = static_cast((unsigned(tmp.x) & 0xF) | ((unsigned(tmp.y) & 0xF) << 4)); } return true; } return false; - default: - return StoreScanline(pDestination, size, format, pSource, count, threshold); + default: return StoreScanline(pDestination, size, format, pSource, count, threshold); } } @@ -4571,21 +4542,20 @@ namespace //------------------------------------------------------------------------------------- // Selection logic for using WIC vs. our own routines //------------------------------------------------------------------------------------- - inline bool UseWICConversion( - _In_ TEX_FILTER_FLAGS filter, - _In_ DXGI_FORMAT sformat, - _In_ DXGI_FORMAT tformat, - _Out_ WICPixelFormatGUID& pfGUID, - _Out_ WICPixelFormatGUID& targetGUID) noexcept + inline bool UseWICConversion(_In_ TEX_FILTER_FLAGS filter, + _In_ DXGI_FORMAT sformat, + _In_ DXGI_FORMAT tformat, + _Out_ WICPixelFormatGUID& pfGUID, + _Out_ WICPixelFormatGUID& targetGUID) noexcept { - #ifndef _WIN32 +#ifndef _WIN32 UNREFERENCED_PARAMETER(filter); UNREFERENCED_PARAMETER(sformat); UNREFERENCED_PARAMETER(tformat); UNREFERENCED_PARAMETER(pfGUID); UNREFERENCED_PARAMETER(targetGUID); return false; - #else +#else memset(&pfGUID, 0, sizeof(GUID)); memset(&targetGUID, 0, sizeof(GUID)); @@ -4620,16 +4590,14 @@ namespace } // Check for special cases - #if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) - if (sformat == DXGI_FORMAT_R16G16B16A16_FLOAT - || sformat == DXGI_FORMAT_R16_FLOAT - || tformat == DXGI_FORMAT_R16G16B16A16_FLOAT +#if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) + if (sformat == DXGI_FORMAT_R16G16B16A16_FLOAT || sformat == DXGI_FORMAT_R16_FLOAT || tformat == DXGI_FORMAT_R16G16B16A16_FLOAT || tformat == DXGI_FORMAT_R16_FLOAT) { // Use non-WIC code paths as these conversions are not supported by Xbox version of WIC return false; } - #endif +#endif switch (sformat) { @@ -4646,13 +4614,11 @@ namespace // WIC conversions for FP32->FP16 can result in NaN values instead of clamping for min/max value return false; - default: - break; + default: break; } break; - default: - break; + default: break; } switch (sformat) @@ -4670,8 +4636,7 @@ namespace // Conversion logic for these kinds of textures is unintuitive for WIC code paths return false; - default: - break; + default: break; } break; @@ -4685,8 +4650,7 @@ namespace // Conversion logic for these kinds of textures is unintuitive for WIC code paths return false; - default: - break; + default: break; } break; @@ -4701,8 +4665,7 @@ namespace // Conversion logic for these kinds of textures is unintuitive for WIC code paths return false; - default: - break; + default: break; } } @@ -4727,21 +4690,20 @@ namespace } return true; - #endif // WIN32 +#endif // WIN32 } //------------------------------------------------------------------------------------- // Convert the source image using WIC //------------------------------------------------------------------------------------- - HRESULT ConvertUsingWIC( - _In_ const Image& srcImage, - _In_ const WICPixelFormatGUID& pfGUID, - _In_ const WICPixelFormatGUID& targetGUID, - _In_ TEX_FILTER_FLAGS filter, - _In_ float threshold, - _In_ const Image& destImage) + HRESULT ConvertUsingWIC(_In_ const Image& srcImage, + _In_ const WICPixelFormatGUID& pfGUID, + _In_ const WICPixelFormatGUID& targetGUID, + _In_ TEX_FILTER_FLAGS filter, + _In_ float threshold, + _In_ const Image& destImage) { - #ifndef _WIN32 +#ifndef _WIN32 UNREFERENCED_PARAMETER(srcImage); UNREFERENCED_PARAMETER(pfGUID); UNREFERENCED_PARAMETER(targetGUID); @@ -4749,17 +4711,17 @@ namespace UNREFERENCED_PARAMETER(threshold); UNREFERENCED_PARAMETER(destImage); return E_NOTIMPL; - #else +#else assert(srcImage.width == destImage.width); assert(srcImage.height == destImage.height); bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; ComPtr FC; - HRESULT hr = pWIC->CreateFormatConverter(FC.GetAddressOf()); + HRESULT hr = pWIC->CreateFormatConverter(FC.GetAddressOf()); if (FAILED(hr)) return hr; @@ -4767,26 +4729,34 @@ namespace // but also always assumes UNORM <-> FLOAT conversions are changing color spaces sRGB <-> scRGB BOOL canConvert = FALSE; - hr = FC->CanConvert(pfGUID, targetGUID, &canConvert); + hr = FC->CanConvert(pfGUID, targetGUID, &canConvert); if (FAILED(hr) || !canConvert) { // This case is not an issue for the subset of WIC formats that map directly to DXGI return E_UNEXPECTED; } - if (srcImage.rowPitch > UINT32_MAX || srcImage.slicePitch > UINT32_MAX - || destImage.rowPitch > UINT32_MAX || destImage.slicePitch > UINT32_MAX) + if (srcImage.rowPitch > UINT32_MAX || srcImage.slicePitch > UINT32_MAX || destImage.rowPitch > UINT32_MAX + || destImage.slicePitch > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; ComPtr source; - hr = pWIC->CreateBitmapFromMemory(static_cast(srcImage.width), static_cast(srcImage.height), pfGUID, - static_cast(srcImage.rowPitch), static_cast(srcImage.slicePitch), - srcImage.pixels, source.GetAddressOf()); + hr = pWIC->CreateBitmapFromMemory(static_cast(srcImage.width), + static_cast(srcImage.height), + pfGUID, + static_cast(srcImage.rowPitch), + static_cast(srcImage.slicePitch), + srcImage.pixels, + source.GetAddressOf()); if (FAILED(hr)) return hr; - hr = FC->Initialize(source.Get(), targetGUID, GetWICDither(filter), nullptr, - static_cast(threshold) * 100.0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(source.Get(), + targetGUID, + GetWICDither(filter), + nullptr, + static_cast(threshold) * 100.0, + WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; @@ -4795,25 +4765,24 @@ namespace return hr; return S_OK; - #endif // WIN32 +#endif // WIN32 } //------------------------------------------------------------------------------------- // Convert the source image (not using WIC) //------------------------------------------------------------------------------------- - HRESULT ConvertCustom( - _In_ const Image& srcImage, - _In_ TEX_FILTER_FLAGS filter, - _In_ const Image& destImage, - _In_ float threshold, - size_t z, + HRESULT ConvertCustom(_In_ const Image& srcImage, + _In_ TEX_FILTER_FLAGS filter, + _In_ const Image& destImage, + _In_ float threshold, + size_t z, const std::function& statusCallback) noexcept { assert(srcImage.width == destImage.width); assert(srcImage.height == destImage.height); - const uint8_t *pSrc = srcImage.pixels; - uint8_t *pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; if (!pSrc || !pDest) return E_POINTER; @@ -4827,7 +4796,7 @@ namespace return E_OUTOFMEMORY; XMVECTOR* pDiffusionErrors = scanline.get() + width; - memset(pDiffusionErrors, 0, sizeof(XMVECTOR)*(width + 2)); + memset(pDiffusionErrors, 0, sizeof(XMVECTOR) * (width + 2)); for (size_t h = 0; h < srcImage.height; ++h) { @@ -4844,7 +4813,15 @@ namespace ConvertScanline(scanline.get(), width, destImage.format, srcImage.format, filter); - if (!StoreScanlineDither(pDest, destImage.rowPitch, destImage.format, scanline.get(), width, threshold, h, z, pDiffusionErrors)) + if (!StoreScanlineDither(pDest, + destImage.rowPitch, + destImage.format, + scanline.get(), + width, + threshold, + h, + z, + pDiffusionErrors)) return E_FAIL; pSrc += srcImage.rowPitch; @@ -4918,11 +4895,9 @@ namespace switch (format) { case DXGI_FORMAT_NV12: - case DXGI_FORMAT_NV11: - return DXGI_FORMAT_YUY2; + case DXGI_FORMAT_NV11: return DXGI_FORMAT_YUY2; - case DXGI_FORMAT_P010: - return DXGI_FORMAT_Y210; + case DXGI_FORMAT_P010: return DXGI_FORMAT_Y210; case DXGI_FORMAT_P016: return DXGI_FORMAT_Y216; @@ -4933,56 +4908,56 @@ namespace // We don't support conversion of JPEG Hardware decode formats - default: - return DXGI_FORMAT_UNKNOWN; + default: return DXGI_FORMAT_UNKNOWN; } } //------------------------------------------------------------------------------------- // Convert the image from a planar to non-planar image //------------------------------------------------------------------------------------- -#define CONVERT_420_TO_422( srcType, destType )\ - {\ - const size_t rowPitch = srcImage.rowPitch;\ - \ - const auto sourceE = reinterpret_cast(pSrc + srcImage.slicePitch);\ - auto pSrcUV = pSrc + (srcImage.height * rowPitch);\ - \ - for(size_t y = 0; y < srcImage.height; y+= 2)\ - {\ - auto sPtrY0 = reinterpret_cast(pSrc);\ - auto sPtrY2 = reinterpret_cast(pSrc + rowPitch);\ - auto sPtrUV = reinterpret_cast(pSrcUV);\ - \ - destType * __restrict dPtr0 = reinterpret_cast(pDest);\ - destType * __restrict dPtr1 = reinterpret_cast(pDest + destImage.rowPitch);\ - \ - for(size_t x = 0; x < srcImage.width; x+= 2)\ - {\ - if ((sPtrUV+1) >= sourceE) break;\ - \ - const srcType u = *(sPtrUV++);\ - const srcType v = *(sPtrUV++);\ - \ - dPtr0->x = *(sPtrY0++);\ - dPtr0->y = u;\ - dPtr0->z = *(sPtrY0++);\ - dPtr0->w = v;\ - ++dPtr0;\ - \ - dPtr1->x = *(sPtrY2++);\ - dPtr1->y = u;\ - dPtr1->z = *(sPtrY2++);\ - dPtr1->w = v;\ - ++dPtr1;\ - }\ - \ - pSrc += rowPitch * 2;\ - pSrcUV += rowPitch;\ - \ - pDest += destImage.rowPitch * 2;\ - }\ - } +#define CONVERT_420_TO_422(srcType, destType) \ + { \ + const size_t rowPitch = srcImage.rowPitch; \ + \ + const auto sourceE = reinterpret_cast(pSrc + srcImage.slicePitch); \ + auto pSrcUV = pSrc + (srcImage.height * rowPitch); \ + \ + for (size_t y = 0; y < srcImage.height; y += 2) \ + { \ + auto sPtrY0 = reinterpret_cast(pSrc); \ + auto sPtrY2 = reinterpret_cast(pSrc + rowPitch); \ + auto sPtrUV = reinterpret_cast(pSrcUV); \ + \ + destType* __restrict dPtr0 = reinterpret_cast(pDest); \ + destType* __restrict dPtr1 = reinterpret_cast(pDest + destImage.rowPitch); \ + \ + for (size_t x = 0; x < srcImage.width; x += 2) \ + { \ + if ((sPtrUV + 1) >= sourceE) \ + break; \ + \ + const srcType u = *(sPtrUV++); \ + const srcType v = *(sPtrUV++); \ + \ + dPtr0->x = *(sPtrY0++); \ + dPtr0->y = u; \ + dPtr0->z = *(sPtrY0++); \ + dPtr0->w = v; \ + ++dPtr0; \ + \ + dPtr1->x = *(sPtrY2++); \ + dPtr1->y = u; \ + dPtr1->z = *(sPtrY2++); \ + dPtr1->w = v; \ + ++dPtr1; \ + } \ + \ + pSrc += rowPitch * 2; \ + pSrcUV += rowPitch; \ + \ + pDest += destImage.rowPitch * 2; \ + } \ + } #ifdef __clang__ #pragma clang diagnostic ignored "-Wextra-semi-stmt" @@ -4993,8 +4968,8 @@ namespace assert(srcImage.width == destImage.width); assert(srcImage.height == destImage.height); - const uint8_t *pSrc = srcImage.pixels; - uint8_t *pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; if (!pSrc || !pDest) return E_POINTER; @@ -5034,18 +5009,19 @@ namespace const size_t rowPitch = srcImage.rowPitch; const uint8_t* sourceE = pSrc + srcImage.slicePitch; - const uint8_t* pSrcUV = pSrc + (srcImage.height * rowPitch); + const uint8_t* pSrcUV = pSrc + (srcImage.height * rowPitch); for (size_t y = 0; y < srcImage.height; ++y) { - const uint8_t* sPtrY = pSrc; + const uint8_t* sPtrY = pSrc; const uint8_t* sPtrUV = pSrcUV; - XMUBYTEN4 * __restrict dPtr = reinterpret_cast(pDest); + XMUBYTEN4* __restrict dPtr = reinterpret_cast(pDest); for (size_t x = 0; x < srcImage.width; x += 4) { - if ((sPtrUV + 1) >= sourceE) break; + if ((sPtrUV + 1) >= sourceE) + break; const uint8_t u = *(sPtrUV++); const uint8_t v = *(sPtrUV++); @@ -5071,14 +5047,12 @@ namespace } return S_OK; - default: - return E_UNEXPECTED; + default: return E_UNEXPECTED; } } #undef CONVERT_420_TO_422 -} - +} // namespace //===================================================================================== // Entry-points @@ -5087,41 +5061,30 @@ namespace //------------------------------------------------------------------------------------- // Convert image //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Convert( - const Image& srcImage, - DXGI_FORMAT format, - TEX_FILTER_FLAGS filter, - float threshold, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT +DirectX::Convert(const Image& srcImage, DXGI_FORMAT format, TEX_FILTER_FLAGS filter, float threshold, ScratchImage& image) noexcept { ConvertOptions options = {}; - options.filter = filter; - options.threshold = threshold; + options.filter = filter; + options.threshold = threshold; return ConvertEx(srcImage, format, options, image, nullptr); } -_Use_decl_annotations_ -HRESULT DirectX::ConvertEx( - const Image& srcImage, - DXGI_FORMAT format, - const ConvertOptions& options, - ScratchImage& image, - std::function statusCallback) +_Use_decl_annotations_ HRESULT DirectX::ConvertEx(const Image& srcImage, + DXGI_FORMAT format, + const ConvertOptions& options, + ScratchImage& image, + std::function statusCallback) { - if ((srcImage.format == format) - || !IsValid(format) - || !IsValid(srcImage.format)) + if ((srcImage.format == format) || !IsValid(format) || !IsValid(srcImage.format)) return E_INVALIDARG; if (!srcImage.pixels) return E_POINTER; - if (IsCompressed(srcImage.format) || IsCompressed(format) - || IsPlanar(srcImage.format) || IsPlanar(format) - || IsPalettized(srcImage.format) || IsPalettized(format) - || IsTypeless(srcImage.format) || IsTypeless(format)) + if (IsCompressed(srcImage.format) || IsCompressed(format) || IsPlanar(srcImage.format) || IsPlanar(format) + || IsPalettized(srcImage.format) || IsPalettized(format) || IsTypeless(srcImage.format) || IsTypeless(format)) return HRESULT_E_NOT_SUPPORTED; if ((srcImage.width > UINT32_MAX) || (srcImage.height > UINT32_MAX)) @@ -5131,7 +5094,7 @@ HRESULT DirectX::ConvertEx( if (FAILED(hr)) return hr; - const Image *rimage = image.GetImage(0, 0, 0); + const Image* rimage = image.GetImage(0, 0, 0); if (!rimage) { image.Release(); @@ -5175,57 +5138,43 @@ HRESULT DirectX::ConvertEx( return S_OK; } - //------------------------------------------------------------------------------------- // Convert image (complex) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Convert( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - DXGI_FORMAT format, - TEX_FILTER_FLAGS filter, - float threshold, - ScratchImage& result) noexcept +_Use_decl_annotations_ HRESULT DirectX::Convert(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + DXGI_FORMAT format, + TEX_FILTER_FLAGS filter, + float threshold, + ScratchImage& result) noexcept { ConvertOptions options = {}; - options.filter = filter; - options.threshold = threshold; + options.filter = filter; + options.threshold = threshold; return ConvertEx(srcImages, nimages, metadata, format, options, result, nullptr); } -_Use_decl_annotations_ -HRESULT DirectX::ConvertEx( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - DXGI_FORMAT format, - const ConvertOptions& options, - ScratchImage& result, - std::function statusCallback) +_Use_decl_annotations_ HRESULT DirectX::ConvertEx(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + DXGI_FORMAT format, + const ConvertOptions& options, + ScratchImage& result, + std::function statusCallback) { - if (!srcImages || !nimages - || (metadata.format == format) - || !IsValid(format) - || !IsValid(metadata.format)) + if (!srcImages || !nimages || (metadata.format == format) || !IsValid(format) || !IsValid(metadata.format)) return E_INVALIDARG; - if (IsCompressed(metadata.format) || IsCompressed(format) - || IsPlanar(metadata.format) || IsPlanar(format) - || IsPalettized(metadata.format) || IsPalettized(format) - || IsTypeless(metadata.format) || IsTypeless(format)) + if (IsCompressed(metadata.format) || IsCompressed(format) || IsPlanar(metadata.format) || IsPlanar(format) + || IsPalettized(metadata.format) || IsPalettized(format) || IsTypeless(metadata.format) || IsTypeless(format)) return HRESULT_E_NOT_SUPPORTED; if ((metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX)) return E_INVALIDARG; - if (statusCallback - && nimages == 1 - && !metadata.IsVolumemap() - && metadata.mipLevels == 1 - && metadata.arraySize == 1) + if (statusCallback && nimages == 1 && !metadata.IsVolumemap() && metadata.mipLevels == 1 && metadata.arraySize == 1) { // If progress reporting is requested when converting a single 1D or 2D image, call // the ConvertEx overload that takes a single image. @@ -5235,8 +5184,8 @@ HRESULT DirectX::ConvertEx( } TexMetadata mdata2 = metadata; - mdata2.format = format; - HRESULT hr = result.Initialize(mdata2); + mdata2.format = format; + HRESULT hr = result.Initialize(mdata2); if (FAILED(hr)) return hr; @@ -5263,7 +5212,7 @@ HRESULT DirectX::ConvertEx( } WICPixelFormatGUID pfGUID, targetGUID; - const bool usewic = !metadata.IsPMAlpha() && UseWICConversion(options.filter, metadata.format, format, pfGUID, targetGUID); + const bool usewic = !metadata.IsPMAlpha() && UseWICConversion(options.filter, metadata.format, format, pfGUID, targetGUID); switch (metadata.dimension) { @@ -5319,76 +5268,73 @@ HRESULT DirectX::ConvertEx( } break; - case TEX_DIMENSION_TEXTURE3D: + case TEX_DIMENSION_TEXTURE3D: { + size_t index = 0; + size_t d = metadata.depth; + for (size_t level = 0; level < metadata.mipLevels; ++level) { - size_t index = 0; - size_t d = metadata.depth; - for (size_t level = 0; level < metadata.mipLevels; ++level) + for (size_t slice = 0; slice < d; ++slice, ++index) { - for (size_t slice = 0; slice < d; ++slice, ++index) + if (index >= nimages) { - if (index >= nimages) - { - result.Release(); - return E_FAIL; - } + result.Release(); + return E_FAIL; + } - const Image& src = srcImages[index]; - if (src.format != metadata.format) - { - result.Release(); - return E_FAIL; - } + const Image& src = srcImages[index]; + if (src.format != metadata.format) + { + result.Release(); + return E_FAIL; + } - if ((src.width > UINT32_MAX) || (src.height > UINT32_MAX)) - { - result.Release(); - return E_FAIL; - } + if ((src.width > UINT32_MAX) || (src.height > UINT32_MAX)) + { + result.Release(); + return E_FAIL; + } - const Image& dst = dest[index]; - assert(dst.format == format); + const Image& dst = dest[index]; + assert(dst.format == format); - if (src.width != dst.width || src.height != dst.height) - { - result.Release(); - return E_FAIL; - } + if (src.width != dst.width || src.height != dst.height) + { + result.Release(); + return E_FAIL; + } - if (usewic) - { - hr = ConvertUsingWIC(src, pfGUID, targetGUID, options.filter, options.threshold, dst); - } - else - { - hr = ConvertCustom(src, options.filter, dst, options.threshold, slice, nullptr); - } + if (usewic) + { + hr = ConvertUsingWIC(src, pfGUID, targetGUID, options.filter, options.threshold, dst); + } + else + { + hr = ConvertCustom(src, options.filter, dst, options.threshold, slice, nullptr); + } - if (FAILED(hr)) - { - result.Release(); - return hr; - } + if (FAILED(hr)) + { + result.Release(); + return hr; + } - if (statusCallback) + if (statusCallback) + { + if (!statusCallback(index, nimages)) { - if (!statusCallback(index, nimages)) - { - result.Release(); - return E_ABORT; - } + result.Release(); + return E_ABORT; } } - - if (d > 1) - d >>= 1; } + + if (d > 1) + d >>= 1; } - break; + } + break; - default: - result.Release(); - return E_FAIL; + default: result.Release(); return E_FAIL; } if (statusCallback) @@ -5403,12 +5349,10 @@ HRESULT DirectX::ConvertEx( return S_OK; } - //------------------------------------------------------------------------------------- // Convert image from planar to single plane (image) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::ConvertToSinglePlane(const Image& srcImage, ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::ConvertToSinglePlane(const Image& srcImage, ScratchImage& image) noexcept { if (!IsPlanar(srcImage.format)) return E_INVALIDARG; @@ -5427,7 +5371,7 @@ HRESULT DirectX::ConvertToSinglePlane(const Image& srcImage, ScratchImage& image if (FAILED(hr)) return hr; - const Image *rimage = image.GetImage(0, 0, 0); + const Image* rimage = image.GetImage(0, 0, 0); if (!rimage) { image.Release(); @@ -5444,16 +5388,13 @@ HRESULT DirectX::ConvertToSinglePlane(const Image& srcImage, ScratchImage& image return S_OK; } - //------------------------------------------------------------------------------------- // Convert image from planar to single plane (complex) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::ConvertToSinglePlane( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - ScratchImage& result) noexcept +_Use_decl_annotations_ HRESULT DirectX::ConvertToSinglePlane(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + ScratchImage& result) noexcept { if (!srcImages || !nimages || !IsPlanar(metadata.format)) return E_INVALIDARG; @@ -5472,8 +5413,8 @@ HRESULT DirectX::ConvertToSinglePlane( return E_INVALIDARG; TexMetadata mdata2 = metadata; - mdata2.format = format; - HRESULT hr = result.Initialize(mdata2); + mdata2.format = format; + HRESULT hr = result.Initialize(mdata2); if (FAILED(hr)) return hr; @@ -5522,7 +5463,6 @@ HRESULT DirectX::ConvertToSinglePlane( return S_OK; } - //------------------------------------------------------------------------------------- // Returns the data type of a DXGI_FORMAT //------------------------------------------------------------------------------------- @@ -5532,22 +5472,16 @@ DirectX::FORMAT_TYPE DirectX::FormatDataType(_In_ DXGI_FORMAT fmt) noexcept switch (cflags & (CONVF_FLOAT | CONVF_UNORM | CONVF_UINT | CONVF_SNORM | CONVF_SINT)) { - case CONVF_FLOAT: - return FORMAT_TYPE_FLOAT; + case CONVF_FLOAT: return FORMAT_TYPE_FLOAT; - case CONVF_UNORM: - return FORMAT_TYPE_UNORM; + case CONVF_UNORM: return FORMAT_TYPE_UNORM; - case CONVF_UINT: - return FORMAT_TYPE_UINT; + case CONVF_UINT: return FORMAT_TYPE_UINT; - case CONVF_SNORM: - return FORMAT_TYPE_SNORM; + case CONVF_SNORM: return FORMAT_TYPE_SNORM; - case CONVF_SINT: - return FORMAT_TYPE_SINT; + case CONVF_SINT: return FORMAT_TYPE_SINT; - default: - return FORMAT_TYPE_TYPELESS; + default: return FORMAT_TYPE_TYPELESS; } } diff --git a/DirectXTex/DirectXTexD3D11.cpp b/DirectXTex/DirectXTexD3D11.cpp index 8ea659a8..23a90fa3 100644 --- a/DirectXTex/DirectXTexD3D11.cpp +++ b/DirectXTex/DirectXTexD3D11.cpp @@ -30,16 +30,15 @@ static_assert(static_cast(TEX_DIMENSION_TEXTURE3D) == static_cast(D3D1 namespace { - HRESULT Capture( - _In_ ID3D11DeviceContext* pContext, - _In_ ID3D11Resource* pSource, - const TexMetadata& metadata, - const ScratchImage& result) noexcept + HRESULT Capture(_In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + const TexMetadata& metadata, + const ScratchImage& result) noexcept { if (!pContext || !pSource || !result.GetPixels()) return E_POINTER; - #if defined(_XBOX_ONE) && defined(_TITLE) +#if defined(_XBOX_ONE) && defined(_TITLE) ComPtr d3dDevice; pContext->GetDevice(d3dDevice.GetAddressOf()); @@ -47,7 +46,7 @@ namespace if (d3dDevice->GetCreationFlags() & D3D11_CREATE_DEVICE_IMMEDIATE_CONTEXT_FAST_SEMANTICS) { ComPtr d3dDeviceX; - HRESULT hr = d3dDevice.As(&d3dDeviceX); + HRESULT hr = d3dDevice.As(&d3dDeviceX); if (FAILED(hr)) return hr; @@ -64,7 +63,7 @@ namespace } } - #endif +#endif if (metadata.IsVolumemap()) { @@ -72,14 +71,14 @@ namespace assert(metadata.arraySize == 1); size_t height = metadata.height; - size_t depth = metadata.depth; + size_t depth = metadata.depth; for (size_t level = 0; level < metadata.mipLevels; ++level) { const UINT dindex = D3D11CalcSubresource(static_cast(level), 0, static_cast(metadata.mipLevels)); D3D11_MAPPED_SUBRESOURCE mapped; - HRESULT hr = pContext->Map(pSource, dindex, D3D11_MAP_READ, 0, &mapped); + HRESULT hr = pContext->Map(pSource, dindex, D3D11_MAP_READ, 0, &mapped); if (FAILED(hr)) return hr; @@ -113,7 +112,7 @@ namespace } const uint8_t* sptr = pslice; - uint8_t* dptr = img->pixels; + uint8_t* dptr = img->pixels; for (size_t h = 0; h < lines; ++h) { const size_t msize = std::min(img->rowPitch, mapped.RowPitch); @@ -144,10 +143,11 @@ namespace for (size_t level = 0; level < metadata.mipLevels; ++level) { - const UINT dindex = D3D11CalcSubresource(static_cast(level), static_cast(item), static_cast(metadata.mipLevels)); + const UINT dindex + = D3D11CalcSubresource(static_cast(level), static_cast(item), static_cast(metadata.mipLevels)); D3D11_MAPPED_SUBRESOURCE mapped; - HRESULT hr = pContext->Map(pSource, dindex, D3D11_MAP_READ, 0, &mapped); + HRESULT hr = pContext->Map(pSource, dindex, D3D11_MAP_READ, 0, &mapped); if (FAILED(hr)) return hr; @@ -171,10 +171,11 @@ namespace return E_UNEXPECTED; } - const size_t msize = (metadata.dimension == TEX_DIMENSION_TEXTURE2D) - ? std::min(img->rowPitch, mapped.RowPitch) : img->rowPitch; + const size_t msize = (metadata.dimension == TEX_DIMENSION_TEXTURE2D) ? + std::min(img->rowPitch, mapped.RowPitch) : + img->rowPitch; - auto sptr = static_cast(mapped.pData); + auto sptr = static_cast(mapped.pData); uint8_t* dptr = img->pixels; for (size_t h = 0; h < lines; ++h) { @@ -193,8 +194,7 @@ namespace return S_OK; } -} - +} // namespace //===================================================================================== // Entry-points @@ -203,10 +203,7 @@ namespace //------------------------------------------------------------------------------------- // Determine if given texture metadata is supported on the given device //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::IsSupportedTexture( - ID3D11Device* pDevice, - const TexMetadata& metadata) noexcept +_Use_decl_annotations_ bool DirectX::IsSupportedTexture(ID3D11Device* pDevice, const TexMetadata& metadata) noexcept { if (!pDevice) return false; @@ -219,7 +216,7 @@ bool DirectX::IsSupportedTexture( if (!IsValid(fmt)) return false; - const size_t iWidth = metadata.width; + const size_t iWidth = metadata.width; const size_t iHeight = metadata.height; switch (static_cast(fmt)) @@ -248,8 +245,7 @@ bool DirectX::IsSupportedTexture( case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: case DXGI_FORMAT_420_OPAQUE: - if ((metadata.dimension != TEX_DIMENSION_TEXTURE2D) - || (iWidth % 2) != 0 || (iHeight % 2) != 0) + if ((metadata.dimension != TEX_DIMENSION_TEXTURE2D) || (iWidth % 2) != 0 || (iHeight % 2) != 0) { return false; } @@ -280,15 +276,13 @@ bool DirectX::IsSupportedTexture( return false; case WIN10_DXGI_FORMAT_V208: - if ((metadata.dimension != TEX_DIMENSION_TEXTURE2D) - || (iHeight % 2) != 0) + if ((metadata.dimension != TEX_DIMENSION_TEXTURE2D) || (iHeight % 2) != 0) { return false; } break; - default: - break; + default: break; } // Validate miplevel count @@ -297,11 +291,11 @@ bool DirectX::IsSupportedTexture( // Validate array size, dimension, and width/height const size_t arraySize = metadata.arraySize; - const size_t iDepth = metadata.depth; + const size_t iDepth = metadata.depth; // Most cases are known apriori based on feature level, but we use this for robustness to handle the few optional cases - UINT formatSupport = 0; - HRESULT hr = pDevice->CheckFormatSupport(fmt, &formatSupport); + UINT formatSupport = 0; + HRESULT hr = pDevice->CheckFormatSupport(fmt, &formatSupport); if (FAILED(hr)) { formatSupport = 0; @@ -318,14 +312,12 @@ bool DirectX::IsSupportedTexture( if (!(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURE1D)) return false; - if ((arraySize > D3D11_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) - || (iWidth > D3D11_REQ_TEXTURE1D_U_DIMENSION)) + if ((arraySize > D3D11_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) || (iWidth > D3D11_REQ_TEXTURE1D_U_DIMENSION)) return false; if (fl < D3D_FEATURE_LEVEL_11_0) { - if ((arraySize > D3D10_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) - || (iWidth > D3D10_REQ_TEXTURE1D_U_DIMENSION)) + if ((arraySize > D3D10_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) || (iWidth > D3D10_REQ_TEXTURE1D_U_DIMENSION)) return false; if (fl < D3D_FEATURE_LEVEL_10_0) @@ -345,15 +337,13 @@ bool DirectX::IsSupportedTexture( if (!(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURECUBE)) return false; - if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) - || (iWidth > D3D11_REQ_TEXTURECUBE_DIMENSION) + if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (iWidth > D3D11_REQ_TEXTURECUBE_DIMENSION) || (iHeight > D3D11_REQ_TEXTURECUBE_DIMENSION)) return false; if (fl < D3D_FEATURE_LEVEL_11_0) { - if ((arraySize > D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) - || (iWidth > D3D10_REQ_TEXTURECUBE_DIMENSION) + if ((arraySize > D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (iWidth > D3D10_REQ_TEXTURECUBE_DIMENSION) || (iHeight > D3D10_REQ_TEXTURECUBE_DIMENSION)) return false; @@ -362,13 +352,11 @@ bool DirectX::IsSupportedTexture( if (fl < D3D_FEATURE_LEVEL_10_0) { - if ((iWidth > D3D_FL9_3_REQ_TEXTURECUBE_DIMENSION) - || (iHeight > D3D_FL9_3_REQ_TEXTURECUBE_DIMENSION)) + if ((iWidth > D3D_FL9_3_REQ_TEXTURECUBE_DIMENSION) || (iHeight > D3D_FL9_3_REQ_TEXTURECUBE_DIMENSION)) return false; if ((fl < D3D_FEATURE_LEVEL_9_3) - && ((iWidth > D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION) - || (iHeight > D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION))) + && ((iWidth > D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION) || (iHeight > D3D_FL9_1_REQ_TEXTURECUBE_DIMENSION))) return false; } } @@ -378,28 +366,24 @@ bool DirectX::IsSupportedTexture( if (!(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURE2D)) return false; - if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) - || (iWidth > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION) + if ((arraySize > D3D11_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (iWidth > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION) || (iHeight > D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION)) return false; if (fl < D3D_FEATURE_LEVEL_11_0) { - if ((arraySize > D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) - || (iWidth > D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION) + if ((arraySize > D3D10_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (iWidth > D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION) || (iHeight > D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION)) return false; if (fl < D3D_FEATURE_LEVEL_10_0) { - if ((arraySize > 1) - || (iWidth > D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION) + if ((arraySize > 1) || (iWidth > D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION) || (iHeight > D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION)) return false; if ((fl < D3D_FEATURE_LEVEL_9_3) - && ((iWidth > D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION) - || (iHeight > D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION))) + && ((iWidth > D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION) || (iHeight > D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION))) return false; } } @@ -410,23 +394,19 @@ bool DirectX::IsSupportedTexture( if (!(formatSupport & D3D11_FORMAT_SUPPORT_TEXTURE3D)) return false; - if ((arraySize > 1) - || (iWidth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) - || (iHeight > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) + if ((arraySize > 1) || (iWidth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (iHeight > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (iDepth > D3D11_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)) return false; if (fl < D3D_FEATURE_LEVEL_11_0) { - if ((iWidth > D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) - || (iHeight > D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) + if ((iWidth > D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (iHeight > D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (iDepth > D3D10_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)) return false; if (fl < D3D_FEATURE_LEVEL_10_0) { - if ((iWidth > D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) - || (iHeight > D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) + if ((iWidth > D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (iHeight > D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (iDepth > D3D_FL9_1_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)) return false; } @@ -441,36 +421,37 @@ bool DirectX::IsSupportedTexture( return true; } - //------------------------------------------------------------------------------------- // Create a texture resource //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateTexture( - ID3D11Device* pDevice, - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - ID3D11Resource** ppResource) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateTexture(ID3D11Device* pDevice, + const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + ID3D11Resource** ppResource) noexcept { - return CreateTextureEx( - pDevice, srcImages, nimages, metadata, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, CREATETEX_DEFAULT, + return CreateTextureEx(pDevice, + srcImages, + nimages, + metadata, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, + CREATETEX_DEFAULT, ppResource); } -_Use_decl_annotations_ -HRESULT DirectX::CreateTextureEx( - ID3D11Device* pDevice, - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - CREATETEX_FLAGS flags, - ID3D11Resource** ppResource) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateTextureEx(ID3D11Device* pDevice, + const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + CREATETEX_FLAGS flags, + ID3D11Resource** ppResource) noexcept { if (!pDevice || !srcImages || !nimages || !ppResource) return E_INVALIDARG; @@ -480,8 +461,8 @@ HRESULT DirectX::CreateTextureEx( if (!metadata.mipLevels || !metadata.arraySize) return E_INVALIDARG; - if ((metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX) - || (metadata.mipLevels > UINT16_MAX) || (metadata.arraySize > UINT16_MAX)) + if ((metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX) || (metadata.mipLevels > UINT16_MAX) + || (metadata.arraySize > UINT16_MAX)) return E_INVALIDARG; std::unique_ptr initData(new (std::nothrow) D3D11_SUBRESOURCE_DATA[metadata.mipLevels * metadata.arraySize]); @@ -534,9 +515,7 @@ HRESULT DirectX::CreateTextureEx( if (!timg.pixels) return E_POINTER; - if (timg.pixels != pSlice - || timg.format != metadata.format - || timg.rowPitch != img.rowPitch + if (timg.pixels != pSlice || timg.format != metadata.format || timg.rowPitch != img.rowPitch || timg.slicePitch != img.slicePitch) return E_FAIL; @@ -545,8 +524,8 @@ HRESULT DirectX::CreateTextureEx( assert(idx < (metadata.mipLevels * metadata.arraySize)); - initData[idx].pSysMem = img.pixels; - initData[idx].SysMemPitch = static_cast(img.rowPitch); + initData[idx].pSysMem = img.pixels; + initData[idx].SysMemPitch = static_cast(img.rowPitch); initData[idx].SysMemSlicePitch = static_cast(img.slicePitch); ++idx; @@ -576,8 +555,8 @@ HRESULT DirectX::CreateTextureEx( assert(idx < (metadata.mipLevels * metadata.arraySize)); - initData[idx].pSysMem = img.pixels; - initData[idx].SysMemPitch = static_cast(img.rowPitch); + initData[idx].pSysMem = img.pixels; + initData[idx].SysMemPitch = static_cast(img.rowPitch); initData[idx].SysMemSlicePitch = static_cast(img.slicePitch); ++idx; } @@ -599,98 +578,95 @@ HRESULT DirectX::CreateTextureEx( switch (metadata.dimension) { - case TEX_DIMENSION_TEXTURE1D: - { - D3D11_TEXTURE1D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = format; - desc.Usage = usage; - desc.BindFlags = bindFlags; - desc.CPUAccessFlags = cpuAccessFlags; - desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); - - hr = pDevice->CreateTexture1D(&desc, initData.get(), reinterpret_cast(ppResource)); - } - break; - - case TEX_DIMENSION_TEXTURE2D: - { - D3D11_TEXTURE2D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.ArraySize = static_cast(metadata.arraySize); - desc.Format = format; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = usage; - desc.BindFlags = bindFlags; - desc.CPUAccessFlags = cpuAccessFlags; - if (metadata.IsCubemap()) - desc.MiscFlags = miscFlags | D3D11_RESOURCE_MISC_TEXTURECUBE; - else - desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); - - hr = pDevice->CreateTexture2D(&desc, initData.get(), reinterpret_cast(ppResource)); - } - break; - - case TEX_DIMENSION_TEXTURE3D: - { - D3D11_TEXTURE3D_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.Depth = static_cast(metadata.depth); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.Format = format; - desc.Usage = usage; - desc.BindFlags = bindFlags; - desc.CPUAccessFlags = cpuAccessFlags; + case TEX_DIMENSION_TEXTURE1D: { + D3D11_TEXTURE1D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.ArraySize = static_cast(metadata.arraySize); + desc.Format = format; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); + + hr = pDevice->CreateTexture1D(&desc, initData.get(), reinterpret_cast(ppResource)); + } + break; + + case TEX_DIMENSION_TEXTURE2D: { + D3D11_TEXTURE2D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.ArraySize = static_cast(metadata.arraySize); + desc.Format = format; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + if (metadata.IsCubemap()) + desc.MiscFlags = miscFlags | D3D11_RESOURCE_MISC_TEXTURECUBE; + else desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); - hr = pDevice->CreateTexture3D(&desc, initData.get(), reinterpret_cast(ppResource)); - } - break; + hr = pDevice->CreateTexture2D(&desc, initData.get(), reinterpret_cast(ppResource)); + } + break; + + case TEX_DIMENSION_TEXTURE3D: { + D3D11_TEXTURE3D_DESC desc = {}; + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.Depth = static_cast(metadata.depth); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.Format = format; + desc.Usage = usage; + desc.BindFlags = bindFlags; + desc.CPUAccessFlags = cpuAccessFlags; + desc.MiscFlags = miscFlags & ~static_cast(D3D11_RESOURCE_MISC_TEXTURECUBE); + + hr = pDevice->CreateTexture3D(&desc, initData.get(), reinterpret_cast(ppResource)); + } + break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } return hr; } - //------------------------------------------------------------------------------------- // Create a shader resource view and associated texture //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateShaderResourceView( - ID3D11Device* pDevice, - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - ID3D11ShaderResourceView** ppSRV) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateShaderResourceView(ID3D11Device* pDevice, + const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + ID3D11ShaderResourceView** ppSRV) noexcept { - return CreateShaderResourceViewEx( - pDevice, srcImages, nimages, metadata, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, CREATETEX_DEFAULT, + return CreateShaderResourceViewEx(pDevice, + srcImages, + nimages, + metadata, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, + CREATETEX_DEFAULT, ppSRV); } -_Use_decl_annotations_ -HRESULT DirectX::CreateShaderResourceViewEx( - ID3D11Device* pDevice, - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - CREATETEX_FLAGS flags, - ID3D11ShaderResourceView** ppSRV) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateShaderResourceViewEx(ID3D11Device* pDevice, + const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + CREATETEX_FLAGS flags, + ID3D11ShaderResourceView** ppSRV) noexcept { if (!ppSRV) return E_INVALIDARG; @@ -701,8 +677,15 @@ HRESULT DirectX::CreateShaderResourceViewEx( return E_INVALIDARG; ComPtr resource; - HRESULT hr = CreateTextureEx(pDevice, srcImages, nimages, metadata, - usage, bindFlags, cpuAccessFlags, miscFlags, flags, + HRESULT hr = CreateTextureEx(pDevice, + srcImages, + nimages, + metadata, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, + flags, resource.GetAddressOf()); if (FAILED(hr)) return hr; @@ -728,13 +711,13 @@ HRESULT DirectX::CreateShaderResourceViewEx( case TEX_DIMENSION_TEXTURE1D: if (metadata.arraySize > 1) { - SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE1DARRAY; + SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE1DARRAY; SRVDesc.Texture1DArray.MipLevels = static_cast(metadata.mipLevels); SRVDesc.Texture1DArray.ArraySize = static_cast(metadata.arraySize); } else { - SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE1D; + SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE1D; SRVDesc.Texture1D.MipLevels = static_cast(metadata.mipLevels); } break; @@ -745,37 +728,36 @@ HRESULT DirectX::CreateShaderResourceViewEx( if (metadata.arraySize > 6) { assert((metadata.arraySize % 6) == 0); - SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURECUBEARRAY; + SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURECUBEARRAY; SRVDesc.TextureCubeArray.MipLevels = static_cast(metadata.mipLevels); - SRVDesc.TextureCubeArray.NumCubes = static_cast(metadata.arraySize / 6); + SRVDesc.TextureCubeArray.NumCubes = static_cast(metadata.arraySize / 6); } else { - SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURECUBE; + SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURECUBE; SRVDesc.TextureCube.MipLevels = static_cast(metadata.mipLevels); } } else if (metadata.arraySize > 1) { - SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2DARRAY; + SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2DARRAY; SRVDesc.Texture2DArray.MipLevels = static_cast(metadata.mipLevels); SRVDesc.Texture2DArray.ArraySize = static_cast(metadata.arraySize); } else { - SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D; + SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE2D; SRVDesc.Texture2D.MipLevels = static_cast(metadata.mipLevels); } break; case TEX_DIMENSION_TEXTURE3D: assert(metadata.arraySize == 1); - SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE3D; + SRVDesc.ViewDimension = D3D_SRV_DIMENSION_TEXTURE3D; SRVDesc.Texture3D.MipLevels = static_cast(metadata.mipLevels); break; - default: - return E_UNEXPECTED; + default: return E_UNEXPECTED; } hr = pDevice->CreateShaderResourceView(resource.Get(), &SRVDesc, ppSRV); @@ -787,16 +769,13 @@ HRESULT DirectX::CreateShaderResourceViewEx( return S_OK; } - //------------------------------------------------------------------------------------- // Save a texture resource //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CaptureTexture( - ID3D11Device* pDevice, - ID3D11DeviceContext* pContext, - ID3D11Resource* pSource, - ScratchImage& result) noexcept +_Use_decl_annotations_ HRESULT DirectX::CaptureTexture(ID3D11Device* pDevice, + ID3D11DeviceContext* pContext, + ID3D11Resource* pSource, + ScratchImage& result) noexcept { if (!pDevice || !pContext || !pSource) return E_INVALIDARG; @@ -808,220 +787,215 @@ HRESULT DirectX::CaptureTexture( switch (resType) { - case D3D11_RESOURCE_DIMENSION_TEXTURE1D: - { - ComPtr pTexture; - hr = pSource->QueryInterface(IID_GRAPHICS_PPV_ARGS(pTexture.GetAddressOf())); - if (FAILED(hr)) - break; + case D3D11_RESOURCE_DIMENSION_TEXTURE1D: { + ComPtr pTexture; + hr = pSource->QueryInterface(IID_GRAPHICS_PPV_ARGS(pTexture.GetAddressOf())); + if (FAILED(hr)) + break; - assert(pTexture); + assert(pTexture); - D3D11_TEXTURE1D_DESC desc; - pTexture->GetDesc(&desc); + D3D11_TEXTURE1D_DESC desc; + pTexture->GetDesc(&desc); - ComPtr pStaging; - if ((desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) - { - // Handle case where the source is already a staging texture we can use directly - pStaging = pTexture; - } - else - { - desc.BindFlags = 0; - desc.MiscFlags = 0; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - desc.Usage = D3D11_USAGE_STAGING; - - hr = pDevice->CreateTexture1D(&desc, nullptr, pStaging.GetAddressOf()); - if (FAILED(hr)) - break; - - assert(pStaging); - - pContext->CopyResource(pStaging.Get(), pSource); - } - - TexMetadata mdata; - mdata.width = desc.Width; - mdata.height = mdata.depth = 1; - mdata.arraySize = desc.ArraySize; - mdata.mipLevels = desc.MipLevels; - mdata.miscFlags = 0; - mdata.miscFlags2 = 0; - mdata.format = desc.Format; - mdata.dimension = TEX_DIMENSION_TEXTURE1D; - - hr = result.Initialize(mdata); - if (FAILED(hr)) - break; - - hr = Capture(pContext, pStaging.Get(), mdata, result); + ComPtr pStaging; + if ((desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) + { + // Handle case where the source is already a staging texture we can use directly + pStaging = pTexture; } - break; - - case D3D11_RESOURCE_DIMENSION_TEXTURE2D: + else { - ComPtr pTexture; - hr = pSource->QueryInterface(IID_GRAPHICS_PPV_ARGS(pTexture.GetAddressOf())); + desc.BindFlags = 0; + desc.MiscFlags = 0; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + desc.Usage = D3D11_USAGE_STAGING; + + hr = pDevice->CreateTexture1D(&desc, nullptr, pStaging.GetAddressOf()); if (FAILED(hr)) break; - assert(pTexture); - - D3D11_TEXTURE2D_DESC desc; - pTexture->GetDesc(&desc); - - ComPtr pStaging; - if (desc.SampleDesc.Count > 1) - { - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; + assert(pStaging); - ComPtr pTemp; - hr = pDevice->CreateTexture2D(&desc, nullptr, pTemp.GetAddressOf()); - if (FAILED(hr)) - break; + pContext->CopyResource(pStaging.Get(), pSource); + } - assert(pTemp); + TexMetadata mdata; + mdata.width = desc.Width; + mdata.height = mdata.depth = 1; + mdata.arraySize = desc.ArraySize; + mdata.mipLevels = desc.MipLevels; + mdata.miscFlags = 0; + mdata.miscFlags2 = 0; + mdata.format = desc.Format; + mdata.dimension = TEX_DIMENSION_TEXTURE1D; + + hr = result.Initialize(mdata); + if (FAILED(hr)) + break; + + hr = Capture(pContext, pStaging.Get(), mdata, result); + } + break; - DXGI_FORMAT fmt = desc.Format; - if (IsTypeless(fmt)) - { - // Assume a UNORM if it exists otherwise use FLOAT - fmt = MakeTypelessUNORM(fmt); - fmt = MakeTypelessFLOAT(fmt); - } + case D3D11_RESOURCE_DIMENSION_TEXTURE2D: { + ComPtr pTexture; + hr = pSource->QueryInterface(IID_GRAPHICS_PPV_ARGS(pTexture.GetAddressOf())); + if (FAILED(hr)) + break; - UINT support = 0; - hr = pDevice->CheckFormatSupport(fmt, &support); - if (FAILED(hr)) - break; + assert(pTexture); - if (!(support & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE)) - { - hr = E_FAIL; - break; - } + D3D11_TEXTURE2D_DESC desc; + pTexture->GetDesc(&desc); - for (UINT item = 0; item < desc.ArraySize; ++item) - { - for (UINT level = 0; level < desc.MipLevels; ++level) - { - const UINT index = D3D11CalcSubresource(level, item, desc.MipLevels); - pContext->ResolveSubresource(pTemp.Get(), index, pSource, index, fmt); - } - } - - desc.BindFlags = 0; - desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - desc.Usage = D3D11_USAGE_STAGING; + ComPtr pStaging; + if (desc.SampleDesc.Count > 1) + { + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; - hr = pDevice->CreateTexture2D(&desc, nullptr, pStaging.GetAddressOf()); - if (FAILED(hr)) - break; + ComPtr pTemp; + hr = pDevice->CreateTexture2D(&desc, nullptr, pTemp.GetAddressOf()); + if (FAILED(hr)) + break; - assert(pStaging); + assert(pTemp); - pContext->CopyResource(pStaging.Get(), pTemp.Get()); - } - else if ((desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) + DXGI_FORMAT fmt = desc.Format; + if (IsTypeless(fmt)) { - // Handle case where the source is already a staging texture we can use directly - pStaging = pTexture; + // Assume a UNORM if it exists otherwise use FLOAT + fmt = MakeTypelessUNORM(fmt); + fmt = MakeTypelessFLOAT(fmt); } - else - { - desc.BindFlags = 0; - desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - desc.Usage = D3D11_USAGE_STAGING; - hr = pDevice->CreateTexture2D(&desc, nullptr, &pStaging); - if (FAILED(hr)) - break; + UINT support = 0; + hr = pDevice->CheckFormatSupport(fmt, &support); + if (FAILED(hr)) + break; - assert(pStaging); + if (!(support & D3D11_FORMAT_SUPPORT_MULTISAMPLE_RESOLVE)) + { + hr = E_FAIL; + break; + } - pContext->CopyResource(pStaging.Get(), pSource); + for (UINT item = 0; item < desc.ArraySize; ++item) + { + for (UINT level = 0; level < desc.MipLevels; ++level) + { + const UINT index = D3D11CalcSubresource(level, item, desc.MipLevels); + pContext->ResolveSubresource(pTemp.Get(), index, pSource, index, fmt); + } } - TexMetadata mdata; - mdata.width = desc.Width; - mdata.height = desc.Height; - mdata.depth = 1; - mdata.arraySize = desc.ArraySize; - mdata.mipLevels = desc.MipLevels; - mdata.miscFlags = (desc.MiscFlags & D3D11_RESOURCE_MISC_TEXTURECUBE) ? TEX_MISC_TEXTURECUBE : 0u; - mdata.miscFlags2 = 0; - mdata.format = desc.Format; - mdata.dimension = TEX_DIMENSION_TEXTURE2D; - - hr = result.Initialize(mdata); + desc.BindFlags = 0; + desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + desc.Usage = D3D11_USAGE_STAGING; + + hr = pDevice->CreateTexture2D(&desc, nullptr, pStaging.GetAddressOf()); if (FAILED(hr)) break; - hr = Capture(pContext, pStaging.Get(), mdata, result); - } - break; + assert(pStaging); - case D3D11_RESOURCE_DIMENSION_TEXTURE3D: + pContext->CopyResource(pStaging.Get(), pTemp.Get()); + } + else if ((desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) { - ComPtr pTexture; - hr = pSource->QueryInterface(IID_GRAPHICS_PPV_ARGS(pTexture.GetAddressOf())); + // Handle case where the source is already a staging texture we can use directly + pStaging = pTexture; + } + else + { + desc.BindFlags = 0; + desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + desc.Usage = D3D11_USAGE_STAGING; + + hr = pDevice->CreateTexture2D(&desc, nullptr, &pStaging); if (FAILED(hr)) break; - assert(pTexture); + assert(pStaging); - D3D11_TEXTURE3D_DESC desc; - pTexture->GetDesc(&desc); + pContext->CopyResource(pStaging.Get(), pSource); + } - ComPtr pStaging; - if ((desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) - { - // Handle case where the source is already a staging texture we can use directly - pStaging = pTexture; - } - else - { - desc.BindFlags = 0; - desc.MiscFlags = 0; - desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - desc.Usage = D3D11_USAGE_STAGING; + TexMetadata mdata; + mdata.width = desc.Width; + mdata.height = desc.Height; + mdata.depth = 1; + mdata.arraySize = desc.ArraySize; + mdata.mipLevels = desc.MipLevels; + mdata.miscFlags = (desc.MiscFlags & D3D11_RESOURCE_MISC_TEXTURECUBE) ? TEX_MISC_TEXTURECUBE : 0u; + mdata.miscFlags2 = 0; + mdata.format = desc.Format; + mdata.dimension = TEX_DIMENSION_TEXTURE2D; + + hr = result.Initialize(mdata); + if (FAILED(hr)) + break; + + hr = Capture(pContext, pStaging.Get(), mdata, result); + } + break; - hr = pDevice->CreateTexture3D(&desc, nullptr, pStaging.GetAddressOf()); - if (FAILED(hr)) - break; + case D3D11_RESOURCE_DIMENSION_TEXTURE3D: { + ComPtr pTexture; + hr = pSource->QueryInterface(IID_GRAPHICS_PPV_ARGS(pTexture.GetAddressOf())); + if (FAILED(hr)) + break; - assert(pStaging); + assert(pTexture); - pContext->CopyResource(pStaging.Get(), pSource); - } + D3D11_TEXTURE3D_DESC desc; + pTexture->GetDesc(&desc); + + ComPtr pStaging; + if ((desc.Usage == D3D11_USAGE_STAGING) && (desc.CPUAccessFlags & D3D11_CPU_ACCESS_READ)) + { + // Handle case where the source is already a staging texture we can use directly + pStaging = pTexture; + } + else + { + desc.BindFlags = 0; + desc.MiscFlags = 0; + desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + desc.Usage = D3D11_USAGE_STAGING; - TexMetadata mdata; - mdata.width = desc.Width; - mdata.height = desc.Height; - mdata.depth = desc.Depth; - mdata.arraySize = 1; - mdata.mipLevels = desc.MipLevels; - mdata.miscFlags = 0; - mdata.miscFlags2 = 0; - mdata.format = desc.Format; - mdata.dimension = TEX_DIMENSION_TEXTURE3D; - - hr = result.Initialize(mdata); + hr = pDevice->CreateTexture3D(&desc, nullptr, pStaging.GetAddressOf()); if (FAILED(hr)) break; - hr = Capture(pContext, pStaging.Get(), mdata, result); + assert(pStaging); + + pContext->CopyResource(pStaging.Get(), pSource); } - break; - default: - hr = E_FAIL; - break; + TexMetadata mdata; + mdata.width = desc.Width; + mdata.height = desc.Height; + mdata.depth = desc.Depth; + mdata.arraySize = 1; + mdata.mipLevels = desc.MipLevels; + mdata.miscFlags = 0; + mdata.miscFlags2 = 0; + mdata.format = desc.Format; + mdata.dimension = TEX_DIMENSION_TEXTURE3D; + + hr = result.Initialize(mdata); + if (FAILED(hr)) + break; + + hr = Capture(pContext, pStaging.Get(), mdata, result); + } + break; + + default: hr = E_FAIL; break; } if (FAILED(hr)) diff --git a/DirectXTex/DirectXTexD3D12.cpp b/DirectXTex/DirectXTexD3D12.cpp index 2bf8ee0f..2a990ba8 100644 --- a/DirectXTex/DirectXTexD3D12.cpp +++ b/DirectXTex/DirectXTexD3D12.cpp @@ -47,11 +47,8 @@ static_assert(static_cast(TEX_DIMENSION_TEXTURE3D) == static_cast(D3D1 namespace { - template void AdjustPlaneResource( - _In_ DXGI_FORMAT fmt, - _In_ size_t height, - _In_ size_t slicePlane, - _Inout_ T& res) noexcept + template + void AdjustPlaneResource(_In_ DXGI_FORMAT fmt, _In_ size_t height, _In_ size_t slicePlane, _Inout_ T& res) noexcept { switch (static_cast(fmt)) { @@ -69,7 +66,7 @@ namespace else { // Plane 1 - res.pData = const_cast(reinterpret_cast(res.pData) + res.RowPitch * PT(height)); + res.pData = const_cast(reinterpret_cast(res.pData) + res.RowPitch * PT(height)); res.SlicePitch = res.RowPitch * static_cast((height + 1) >> 1); } break; @@ -83,24 +80,21 @@ namespace else { // Plane 1 - res.pData = const_cast(reinterpret_cast(res.pData) + res.RowPitch * PT(height)); - res.RowPitch = (res.RowPitch >> 1); + res.pData = const_cast(reinterpret_cast(res.pData) + res.RowPitch * PT(height)); + res.RowPitch = (res.RowPitch >> 1); res.SlicePitch = res.RowPitch * static_cast(height); } break; - default: - break; + default: break; } } - //-------------------------------------------------------------------------------------- - inline void TransitionResource( - _In_ ID3D12GraphicsCommandList* commandList, - _In_ ID3D12Resource* resource, - _In_ D3D12_RESOURCE_STATES stateBefore, - _In_ D3D12_RESOURCE_STATES stateAfter) + inline void TransitionResource(_In_ ID3D12GraphicsCommandList* commandList, + _In_ ID3D12Resource* resource, + _In_ D3D12_RESOURCE_STATES stateBefore, + _In_ D3D12_RESOURCE_STATES stateAfter) { assert(commandList != nullptr); assert(resource != nullptr); @@ -109,27 +103,26 @@ namespace return; D3D12_RESOURCE_BARRIER desc = {}; - desc.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; - desc.Transition.pResource = resource; + desc.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + desc.Transition.pResource = resource; desc.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; desc.Transition.StateBefore = stateBefore; - desc.Transition.StateAfter = stateAfter; + desc.Transition.StateAfter = stateAfter; commandList->ResourceBarrier(1, &desc); } - //-------------------------------------------------------------------------------------- HRESULT Capture(_In_ ID3D12Device* device, - _In_ ID3D12CommandQueue* pCommandQ, - _In_ ID3D12Resource* pSource, - const D3D12_RESOURCE_DESC& desc, - _COM_Outptr_ ID3D12Resource** pStaging, - std::unique_ptr& layoutBuff, - UINT& numberOfPlanes, - UINT& numberOfResources, - D3D12_RESOURCE_STATES beforeState, - D3D12_RESOURCE_STATES afterState) noexcept + _In_ ID3D12CommandQueue* pCommandQ, + _In_ ID3D12Resource* pSource, + const D3D12_RESOURCE_DESC& desc, + _COM_Outptr_ ID3D12Resource** pStaging, + std::unique_ptr& layoutBuff, + UINT& numberOfPlanes, + UINT& numberOfResources, + D3D12_RESOURCE_STATES beforeState, + D3D12_RESOURCE_STATES afterState) noexcept { if (pStaging) { @@ -149,8 +142,7 @@ namespace return HRESULT_E_NOT_SUPPORTED; } - numberOfResources = (desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D) - ? 1u : desc.DepthOrArraySize; + numberOfResources = (desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D) ? 1u : desc.DepthOrArraySize; numberOfResources *= desc.MipLevels; numberOfResources *= numberOfPlanes; @@ -165,16 +157,15 @@ namespace if (!layoutBuff) return E_OUTOFMEMORY; - auto pLayout = reinterpret_cast(layoutBuff.get()); + auto pLayout = reinterpret_cast(layoutBuff.get()); auto pRowSizesInBytes = reinterpret_cast(pLayout + numberOfResources); - auto pNumRows = reinterpret_cast(pRowSizesInBytes + numberOfResources); + auto pNumRows = reinterpret_cast(pRowSizesInBytes + numberOfResources); UINT64 totalResourceSize = 0; - device->GetCopyableFootprints(&desc, 0, numberOfResources, 0, - pLayout, pNumRows, pRowSizesInBytes, &totalResourceSize); + device->GetCopyableFootprints(&desc, 0, numberOfResources, 0, pLayout, pNumRows, pRowSizesInBytes, &totalResourceSize); D3D12_HEAP_PROPERTIES sourceHeapProperties; - HRESULT hr = pSource->GetHeapProperties(&sourceHeapProperties, nullptr); + HRESULT hr = pSource->GetHeapProperties(&sourceHeapProperties, nullptr); if (SUCCEEDED(hr) && sourceHeapProperties.Type == D3D12_HEAP_TYPE_READBACK) { // Handle case where the source is already a staging texture we can use directly @@ -191,7 +182,11 @@ namespace // Spin up a new command list ComPtr commandList; - hr = device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, commandAlloc.Get(), nullptr, IID_GRAPHICS_PPV_ARGS(commandList.GetAddressOf())); + hr = device->CreateCommandList(0, + D3D12_COMMAND_LIST_TYPE_DIRECT, + commandAlloc.Get(), + nullptr, + IID_GRAPHICS_PPV_ARGS(commandList.GetAddressOf())); if (FAILED(hr)) return hr; @@ -206,31 +201,30 @@ namespace // Readback resources must be buffers D3D12_RESOURCE_DESC bufferDesc = {}; - bufferDesc.DepthOrArraySize = 1; - bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; - bufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE; - bufferDesc.Format = DXGI_FORMAT_UNKNOWN; - bufferDesc.Height = 1; - bufferDesc.Width = totalResourceSize; - bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; - bufferDesc.MipLevels = 1; - bufferDesc.SampleDesc.Count = 1; + bufferDesc.DepthOrArraySize = 1; + bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + bufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + bufferDesc.Format = DXGI_FORMAT_UNKNOWN; + bufferDesc.Height = 1; + bufferDesc.Width = totalResourceSize; + bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + bufferDesc.MipLevels = 1; + bufferDesc.SampleDesc.Count = 1; ComPtr copySource(pSource); - D3D12_RESOURCE_STATES beforeStateSource = beforeState; + D3D12_RESOURCE_STATES beforeStateSource = beforeState; if (desc.SampleDesc.Count > 1) { TransitionResource(commandList.Get(), pSource, beforeState, D3D12_RESOURCE_STATE_RESOLVE_SOURCE); // MSAA content must be resolved before being copied to a staging texture - auto descCopy = desc; - descCopy.SampleDesc.Count = 1; + auto descCopy = desc; + descCopy.SampleDesc.Count = 1; descCopy.SampleDesc.Quality = 0; - descCopy.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; + descCopy.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; ComPtr pTemp; - hr = device->CreateCommittedResource( - &defaultHeapProperties, + hr = device->CreateCommittedResource(&defaultHeapProperties, D3D12_HEAP_FLAG_NONE, &descCopy, D3D12_RESOURCE_STATE_RESOLVE_DEST, @@ -269,7 +263,7 @@ namespace } } - copySource = pTemp; + copySource = pTemp; beforeState = D3D12_RESOURCE_STATE_RESOLVE_DEST; } else @@ -278,8 +272,7 @@ namespace } // Create a staging texture - hr = device->CreateCommittedResource( - &readBackHeapProperties, + hr = device->CreateCommittedResource(&readBackHeapProperties, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_COPY_DEST, @@ -319,17 +312,16 @@ namespace // Block until the copy is complete while (fence->GetCompletedValue() < 1) { - #ifdef _WIN32 +#ifdef _WIN32 SwitchToThread(); - #else +#else std::this_thread::yield(); - #endif +#endif } return S_OK; } -} - +} // namespace //===================================================================================== // Entry-points @@ -338,10 +330,7 @@ namespace //------------------------------------------------------------------------------------- // Determine if given texture metadata is supported on the given device //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::IsSupportedTexture( - ID3D12Device* pDevice, - const TexMetadata& metadata) noexcept +_Use_decl_annotations_ bool DirectX::IsSupportedTexture(ID3D12Device* pDevice, const TexMetadata& metadata) noexcept { if (!pDevice) return false; @@ -352,7 +341,7 @@ bool DirectX::IsSupportedTexture( if (!IsValid(fmt)) return false; - const size_t iWidth = metadata.width; + const size_t iWidth = metadata.width; const size_t iHeight = metadata.height; switch (static_cast(fmt)) @@ -361,8 +350,7 @@ bool DirectX::IsSupportedTexture( case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: case DXGI_FORMAT_420_OPAQUE: - if ((metadata.dimension != TEX_DIMENSION_TEXTURE2D) - || (iWidth % 2) != 0 || (iHeight % 2) != 0) + if ((metadata.dimension != TEX_DIMENSION_TEXTURE2D) || (iWidth % 2) != 0 || (iHeight % 2) != 0) { return false; } @@ -393,15 +381,13 @@ bool DirectX::IsSupportedTexture( return false; case WIN10_DXGI_FORMAT_V208: - if ((metadata.dimension != TEX_DIMENSION_TEXTURE2D) - || (iHeight % 2) != 0) + if ((metadata.dimension != TEX_DIMENSION_TEXTURE2D) || (iHeight % 2) != 0) { return false; } break; - default: - break; + default: break; } // Validate miplevel count @@ -410,7 +396,7 @@ bool DirectX::IsSupportedTexture( // Validate array size, dimension, and width/height const size_t arraySize = metadata.arraySize; - const size_t iDepth = metadata.depth; + const size_t iDepth = metadata.depth; // Most cases are known apriori based on feature level, but we use this for robustness to handle the few optional cases D3D12_FEATURE_DATA_FORMAT_SUPPORT formatSupport = { fmt, D3D12_FORMAT_SUPPORT1_NONE, D3D12_FORMAT_SUPPORT2_NONE }; @@ -431,8 +417,7 @@ bool DirectX::IsSupportedTexture( if (!(formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURE1D)) return false; - if ((arraySize > D3D12_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) - || (iWidth > D3D12_REQ_TEXTURE1D_U_DIMENSION)) + if ((arraySize > D3D12_REQ_TEXTURE1D_ARRAY_AXIS_DIMENSION) || (iWidth > D3D12_REQ_TEXTURE1D_U_DIMENSION)) return false; { @@ -448,8 +433,7 @@ bool DirectX::IsSupportedTexture( if (!(formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURECUBE)) return false; - if ((arraySize > D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) - || (iWidth > D3D12_REQ_TEXTURECUBE_DIMENSION) + if ((arraySize > D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (iWidth > D3D12_REQ_TEXTURECUBE_DIMENSION) || (iHeight > D3D12_REQ_TEXTURECUBE_DIMENSION)) return false; } @@ -458,8 +442,7 @@ bool DirectX::IsSupportedTexture( if (!(formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURE2D)) return false; - if ((arraySize > D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) - || (iWidth > D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION) + if ((arraySize > D3D12_REQ_TEXTURE2D_ARRAY_AXIS_DIMENSION) || (iWidth > D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION) || (iHeight > D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION)) return false; } @@ -475,9 +458,7 @@ bool DirectX::IsSupportedTexture( if (!(formatSupport.Support1 & D3D12_FORMAT_SUPPORT1_TEXTURE3D)) return false; - if ((arraySize > 1) - || (iWidth > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) - || (iHeight > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) + if ((arraySize > 1) || (iWidth > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (iHeight > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION) || (iDepth > D3D12_REQ_TEXTURE3D_U_V_OR_W_DIMENSION)) return false; @@ -495,29 +476,21 @@ bool DirectX::IsSupportedTexture( return true; } - //------------------------------------------------------------------------------------- // Create a texture resource //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateTexture( - ID3D12Device* pDevice, - const TexMetadata& metadata, - ID3D12Resource** ppResource) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateTexture(ID3D12Device* pDevice, + const TexMetadata& metadata, + ID3D12Resource** ppResource) noexcept { - return CreateTextureEx( - pDevice, metadata, - D3D12_RESOURCE_FLAG_NONE, CREATETEX_DEFAULT, - ppResource); + return CreateTextureEx(pDevice, metadata, D3D12_RESOURCE_FLAG_NONE, CREATETEX_DEFAULT, ppResource); } -_Use_decl_annotations_ -HRESULT DirectX::CreateTextureEx( - ID3D12Device* pDevice, - const TexMetadata& metadata, - D3D12_RESOURCE_FLAGS resFlags, - CREATETEX_FLAGS flags, - ID3D12Resource** ppResource) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateTextureEx(ID3D12Device* pDevice, + const TexMetadata& metadata, + D3D12_RESOURCE_FLAGS resFlags, + CREATETEX_FLAGS flags, + ID3D12Resource** ppResource) noexcept { if (!pDevice || !ppResource) return E_INVALIDARG; @@ -527,8 +500,8 @@ HRESULT DirectX::CreateTextureEx( if (!metadata.mipLevels || !metadata.arraySize) return E_INVALIDARG; - if ((metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX) - || (metadata.mipLevels > UINT16_MAX) || (metadata.arraySize > UINT16_MAX)) + if ((metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX) || (metadata.mipLevels > UINT16_MAX) + || (metadata.arraySize > UINT16_MAX)) return E_INVALIDARG; DXGI_FORMAT format = metadata.format; @@ -542,46 +515,41 @@ HRESULT DirectX::CreateTextureEx( } D3D12_RESOURCE_DESC desc = {}; - desc.Width = static_cast(metadata.width); - desc.Height = static_cast(metadata.height); - desc.MipLevels = static_cast(metadata.mipLevels); - desc.DepthOrArraySize = (metadata.dimension == TEX_DIMENSION_TEXTURE3D) - ? static_cast(metadata.depth) - : static_cast(metadata.arraySize); - desc.Format = format; - desc.Flags = resFlags; + desc.Width = static_cast(metadata.width); + desc.Height = static_cast(metadata.height); + desc.MipLevels = static_cast(metadata.mipLevels); + desc.DepthOrArraySize + = (metadata.dimension == TEX_DIMENSION_TEXTURE3D) ? static_cast(metadata.depth) : static_cast(metadata.arraySize); + desc.Format = format; + desc.Flags = resFlags; desc.SampleDesc.Count = 1; - desc.Dimension = static_cast(metadata.dimension); + desc.Dimension = static_cast(metadata.dimension); const CD3DX12_HEAP_PROPERTIES defaultHeapProperties(D3D12_HEAP_TYPE_DEFAULT); - HRESULT hr = pDevice->CreateCommittedResource( - &defaultHeapProperties, + HRESULT hr = pDevice->CreateCommittedResource(&defaultHeapProperties, D3D12_HEAP_FLAG_NONE, &desc, - #if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) +#if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) D3D12_RESOURCE_STATE_COPY_DEST, - #else +#else D3D12_RESOURCE_STATE_COMMON, - #endif +#endif nullptr, IID_GRAPHICS_PPV_ARGS(ppResource)); return hr; } - //------------------------------------------------------------------------------------- // Prepares a texture resource for upload //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::PrepareUpload( - ID3D12Device* pDevice, - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - std::vector& subresources) +_Use_decl_annotations_ HRESULT DirectX::PrepareUpload(ID3D12Device* pDevice, + const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + std::vector& subresources) { if (!pDevice || !srcImages || !nimages || !metadata.mipLevels || !metadata.arraySize) return E_INVALIDARG; @@ -596,8 +564,7 @@ HRESULT DirectX::PrepareUpload( return HRESULT_E_NOT_SUPPORTED; } - size_t numberOfResources = (metadata.dimension == TEX_DIMENSION_TEXTURE3D) - ? 1u : metadata.arraySize; + size_t numberOfResources = (metadata.dimension == TEX_DIMENSION_TEXTURE3D) ? 1u : metadata.arraySize; numberOfResources *= metadata.mipLevels; numberOfResources *= numberOfPlanes; @@ -654,21 +621,14 @@ HRESULT DirectX::PrepareUpload( if (!timg.pixels) return E_POINTER; - if (timg.pixels != pSlice - || timg.format != metadata.format - || timg.rowPitch != img.rowPitch + if (timg.pixels != pSlice || timg.format != metadata.format || timg.rowPitch != img.rowPitch || timg.slicePitch != img.slicePitch) return E_FAIL; pSlice = timg.pixels + img.slicePitch; } - D3D12_SUBRESOURCE_DATA res = - { - img.pixels, - static_cast(img.rowPitch), - static_cast(img.slicePitch) - }; + D3D12_SUBRESOURCE_DATA res = { img.pixels, static_cast(img.rowPitch), static_cast(img.slicePitch) }; AdjustPlaneResource(metadata.format, img.height, plane, res); @@ -700,12 +660,7 @@ HRESULT DirectX::PrepareUpload( if (!img.pixels) return E_POINTER; - D3D12_SUBRESOURCE_DATA res = - { - img.pixels, - static_cast(img.rowPitch), - static_cast(img.slicePitch) - }; + D3D12_SUBRESOURCE_DATA res = { img.pixels, static_cast(img.rowPitch), static_cast(img.slicePitch) }; AdjustPlaneResource(metadata.format, img.height, plane, res); @@ -718,18 +673,15 @@ HRESULT DirectX::PrepareUpload( return S_OK; } - //------------------------------------------------------------------------------------- // Save a texture resource //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CaptureTexture( - ID3D12CommandQueue* pCommandQueue, - ID3D12Resource* pSource, - bool isCubeMap, - ScratchImage& result, - D3D12_RESOURCE_STATES beforeState, - D3D12_RESOURCE_STATES afterState) noexcept +_Use_decl_annotations_ HRESULT DirectX::CaptureTexture(ID3D12CommandQueue* pCommandQueue, + ID3D12Resource* pSource, + bool isCubeMap, + ScratchImage& result, + D3D12_RESOURCE_STATES beforeState, + D3D12_RESOURCE_STATES afterState) noexcept { if (!pCommandQueue || !pSource) return E_INVALIDARG; @@ -741,13 +693,13 @@ HRESULT DirectX::CaptureTexture( const auto desc = pSource->GetDesc(); #else D3D12_RESOURCE_DESC tmpDesc; - const auto& desc = *pSource->GetDesc(&tmpDesc); + const auto& desc = *pSource->GetDesc(&tmpDesc); #endif - ComPtr pStaging; + ComPtr pStaging; std::unique_ptr layoutBuff; - UINT numberOfPlanes, numberOfResources; - HRESULT hr = Capture(device.Get(), + UINT numberOfPlanes, numberOfResources; + HRESULT hr = Capture(device.Get(), pCommandQueue, pSource, desc, @@ -763,83 +715,77 @@ HRESULT DirectX::CaptureTexture( if (!layoutBuff || !numberOfPlanes || !numberOfResources) return E_UNEXPECTED; - auto pLayout = reinterpret_cast(layoutBuff.get()); + auto pLayout = reinterpret_cast(layoutBuff.get()); auto pRowSizesInBytes = reinterpret_cast(pLayout + numberOfResources); - auto pNumRows = reinterpret_cast(pRowSizesInBytes + numberOfResources); + auto pNumRows = reinterpret_cast(pRowSizesInBytes + numberOfResources); switch (desc.Dimension) { - case D3D12_RESOURCE_DIMENSION_TEXTURE1D: - { - TexMetadata mdata; - mdata.width = static_cast(desc.Width); - mdata.height = mdata.depth = 1; - mdata.arraySize = desc.DepthOrArraySize; - mdata.mipLevels = desc.MipLevels; - mdata.miscFlags = 0; - mdata.miscFlags2 = 0; - mdata.format = desc.Format; - mdata.dimension = TEX_DIMENSION_TEXTURE1D; - - hr = result.Initialize(mdata); - if (FAILED(hr)) - return hr; - } - break; - - case D3D12_RESOURCE_DIMENSION_TEXTURE2D: - { - TexMetadata mdata; - mdata.width = static_cast(desc.Width); - mdata.height = desc.Height; - mdata.depth = 1; - mdata.arraySize = desc.DepthOrArraySize; - mdata.mipLevels = desc.MipLevels; - mdata.miscFlags = isCubeMap ? TEX_MISC_TEXTURECUBE : 0u; - mdata.miscFlags2 = 0; - mdata.format = desc.Format; - mdata.dimension = TEX_DIMENSION_TEXTURE2D; - - hr = result.Initialize(mdata); - if (FAILED(hr)) - return hr; - } - break; - - case D3D12_RESOURCE_DIMENSION_TEXTURE3D: - { - TexMetadata mdata; - mdata.width = static_cast(desc.Width); - mdata.height = desc.Height; - mdata.depth = desc.DepthOrArraySize; - mdata.arraySize = 1; - mdata.mipLevels = desc.MipLevels; - mdata.miscFlags = 0; - mdata.miscFlags2 = 0; - mdata.format = desc.Format; - mdata.dimension = TEX_DIMENSION_TEXTURE3D; - - hr = result.Initialize(mdata); - if (FAILED(hr)) - return hr; - } - break; + case D3D12_RESOURCE_DIMENSION_TEXTURE1D: { + TexMetadata mdata; + mdata.width = static_cast(desc.Width); + mdata.height = mdata.depth = 1; + mdata.arraySize = desc.DepthOrArraySize; + mdata.mipLevels = desc.MipLevels; + mdata.miscFlags = 0; + mdata.miscFlags2 = 0; + mdata.format = desc.Format; + mdata.dimension = TEX_DIMENSION_TEXTURE1D; + + hr = result.Initialize(mdata); + if (FAILED(hr)) + return hr; + } + break; + + case D3D12_RESOURCE_DIMENSION_TEXTURE2D: { + TexMetadata mdata; + mdata.width = static_cast(desc.Width); + mdata.height = desc.Height; + mdata.depth = 1; + mdata.arraySize = desc.DepthOrArraySize; + mdata.mipLevels = desc.MipLevels; + mdata.miscFlags = isCubeMap ? TEX_MISC_TEXTURECUBE : 0u; + mdata.miscFlags2 = 0; + mdata.format = desc.Format; + mdata.dimension = TEX_DIMENSION_TEXTURE2D; + + hr = result.Initialize(mdata); + if (FAILED(hr)) + return hr; + } + break; + + case D3D12_RESOURCE_DIMENSION_TEXTURE3D: { + TexMetadata mdata; + mdata.width = static_cast(desc.Width); + mdata.height = desc.Height; + mdata.depth = desc.DepthOrArraySize; + mdata.arraySize = 1; + mdata.mipLevels = desc.MipLevels; + mdata.miscFlags = 0; + mdata.miscFlags2 = 0; + mdata.format = desc.Format; + mdata.dimension = TEX_DIMENSION_TEXTURE3D; + + hr = result.Initialize(mdata); + if (FAILED(hr)) + return hr; + } + break; - default: - return E_FAIL; + default: return E_FAIL; } BYTE* pData = nullptr; - hr = pStaging->Map(0, nullptr, reinterpret_cast(&pData)); + hr = pStaging->Map(0, nullptr, reinterpret_cast(&pData)); if (FAILED(hr)) { result.Release(); return E_FAIL; } - const UINT arraySize = (desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D) - ? 1u - : desc.DepthOrArraySize; + const UINT arraySize = (desc.Dimension == D3D12_RESOURCE_DIMENSION_TEXTURE3D) ? 1u : desc.DepthOrArraySize; for (UINT plane = 0; plane < numberOfPlanes; ++plane) { @@ -869,12 +815,9 @@ HRESULT DirectX::CaptureTexture( AdjustPlaneResource(img->format, img->height, plane, destData); - D3D12_SUBRESOURCE_DATA srcData = - { - pData + pLayout[dindex].Offset, + D3D12_SUBRESOURCE_DATA srcData = { pData + pLayout[dindex].Offset, static_cast(pLayout[dindex].Footprint.RowPitch), - static_cast(pLayout[dindex].Footprint.RowPitch) * static_cast(pNumRows[dindex]) - }; + static_cast(pLayout[dindex].Footprint.RowPitch) * static_cast(pNumRows[dindex]) }; if (pRowSizesInBytes[dindex] > SIZE_T(-1)) { @@ -883,7 +826,8 @@ HRESULT DirectX::CaptureTexture( return E_FAIL; } - MemcpySubresource(&destData, &srcData, + MemcpySubresource(&destData, + &srcData, static_cast(pRowSizesInBytes[dindex]), pNumRows[dindex], pLayout[dindex].Footprint.Depth); diff --git a/DirectXTex/DirectXTexDDS.cpp b/DirectXTex/DirectXTexDDS.cpp index d4281dd9..8f8f15ec 100644 --- a/DirectXTex/DirectXTexDDS.cpp +++ b/DirectXTex/DirectXTexDDS.cpp @@ -27,28 +27,28 @@ namespace //------------------------------------------------------------------------------------- enum CONVERSION_FLAGS : uint32_t { - CONV_FLAGS_NONE = 0x0, - CONV_FLAGS_EXPAND = 0x1, // Conversion requires expanded pixel size - CONV_FLAGS_NOALPHA = 0x2, // Conversion requires setting alpha to known value - CONV_FLAGS_SWIZZLE = 0x4, // BGR/RGB order swizzling required - CONV_FLAGS_PAL8 = 0x8, // Has an 8-bit palette - CONV_FLAGS_888 = 0x10, // Source is an 8:8:8 (24bpp) format - CONV_FLAGS_565 = 0x20, // Source is a 5:6:5 (16bpp) format - CONV_FLAGS_5551 = 0x40, // Source is a 5:5:5:1 (16bpp) format - CONV_FLAGS_4444 = 0x80, // Source is a 4:4:4:4 (16bpp) format - CONV_FLAGS_44 = 0x100, // Source is a 4:4 (8bpp) format - CONV_FLAGS_332 = 0x200, // Source is a 3:3:2 (8bpp) format - CONV_FLAGS_8332 = 0x400, // Source is a 8:3:3:2 (16bpp) format - CONV_FLAGS_A8P8 = 0x800, // Has an 8-bit palette with an alpha channel - CONF_FLAGS_11ON12 = 0x1000, // D3D11on12 format - CONV_FLAGS_DX10 = 0x10000, // Has the 'DX10' extension header - CONV_FLAGS_PMALPHA = 0x20000, // Contains premultiplied alpha data - CONV_FLAGS_L8 = 0x40000, // Source is a 8 luminance format - CONV_FLAGS_L16 = 0x80000, // Source is a 16 luminance format - CONV_FLAGS_A8L8 = 0x100000, // Source is a 8:8 luminance format - CONV_FLAGS_L6V5U5 = 0x200000, // Source is a 6:5:5 bumpluminance format - CONV_FLAGS_L8U8V8 = 0x400000, // Source is a X:8:8:8 bumpluminance format - CONV_FLAGS_WUV10 = 0x800000, // Source is a 2:10:10:10 bump format + CONV_FLAGS_NONE = 0x0, + CONV_FLAGS_EXPAND = 0x1, // Conversion requires expanded pixel size + CONV_FLAGS_NOALPHA = 0x2, // Conversion requires setting alpha to known value + CONV_FLAGS_SWIZZLE = 0x4, // BGR/RGB order swizzling required + CONV_FLAGS_PAL8 = 0x8, // Has an 8-bit palette + CONV_FLAGS_888 = 0x10, // Source is an 8:8:8 (24bpp) format + CONV_FLAGS_565 = 0x20, // Source is a 5:6:5 (16bpp) format + CONV_FLAGS_5551 = 0x40, // Source is a 5:5:5:1 (16bpp) format + CONV_FLAGS_4444 = 0x80, // Source is a 4:4:4:4 (16bpp) format + CONV_FLAGS_44 = 0x100, // Source is a 4:4 (8bpp) format + CONV_FLAGS_332 = 0x200, // Source is a 3:3:2 (8bpp) format + CONV_FLAGS_8332 = 0x400, // Source is a 8:3:3:2 (16bpp) format + CONV_FLAGS_A8P8 = 0x800, // Has an 8-bit palette with an alpha channel + CONF_FLAGS_11ON12 = 0x1000, // D3D11on12 format + CONV_FLAGS_DX10 = 0x10000, // Has the 'DX10' extension header + CONV_FLAGS_PMALPHA = 0x20000, // Contains premultiplied alpha data + CONV_FLAGS_L8 = 0x40000, // Source is a 8 luminance format + CONV_FLAGS_L16 = 0x80000, // Source is a 16 luminance format + CONV_FLAGS_A8L8 = 0x100000, // Source is a 8:8 luminance format + CONV_FLAGS_L6V5U5 = 0x200000, // Source is a 6:5:5 bumpluminance format + CONV_FLAGS_L8U8V8 = 0x400000, // Source is a X:8:8:8 bumpluminance format + CONV_FLAGS_WUV10 = 0x800000, // Source is a 2:10:10:10 bump format }; struct LegacyDDS @@ -58,8 +58,8 @@ namespace DDS_PIXELFORMAT ddpf; }; - const LegacyDDS g_LegacyDDSMap[] = - { + const LegacyDDS g_LegacyDDSMap[] = { + // clang-format off { DXGI_FORMAT_BC1_UNORM, CONV_FLAGS_NONE, DDSPF_DXT1 }, // D3DFMT_DXT1 { DXGI_FORMAT_BC2_UNORM, CONV_FLAGS_NONE, DDSPF_DXT3 }, // D3DFMT_DXT3 { DXGI_FORMAT_BC3_UNORM, CONV_FLAGS_NONE, DDSPF_DXT5 }, // D3DFMT_DXT5 @@ -163,6 +163,7 @@ namespace DDSPF_L6V5U5 }, // D3DFMT_L6V5U5 { DXGI_FORMAT_R8G8B8A8_UNORM, CONV_FLAGS_L8U8V8, DDSPF_X8L8V8U8 }, // D3DFMT_X8L8V8U8 { DXGI_FORMAT_R10G10B10A2_UNORM, CONV_FLAGS_WUV10, DDSPF_A2W10V10U10 }, // D3DFMT_A2W10V10U10 + // clang-format on }; // Note that many common DDS reader/writers (including D3DX) swap the @@ -181,9 +182,7 @@ namespace // FourCC EAR, EARG, ET2, ET2A (Ericsson Texture Compression) // FourCC MET1 (a.k.a. D3DFMT_MULTI2_ARGB8; rarely supported by any hardware) - DXGI_FORMAT GetDXGIFormat(const DDS_HEADER& hdr, const DDS_PIXELFORMAT& ddpf, - DDS_FLAGS flags, - _Inout_ uint32_t& convFlags) noexcept + DXGI_FORMAT GetDXGIFormat(const DDS_HEADER& hdr, const DDS_PIXELFORMAT& ddpf, DDS_FLAGS flags, _Inout_ uint32_t& convFlags) noexcept { uint32_t ddpfFlags = ddpf.flags; if (hdr.reserved1[9] == MAKEFOURCC('N', 'V', 'T', 'T')) @@ -193,7 +192,7 @@ namespace } constexpr size_t MAP_SIZE = sizeof(g_LegacyDDSMap) / sizeof(LegacyDDS); - size_t index = 0; + size_t index = 0; if (ddpf.size == 0 && ddpf.flags == 0 && ddpf.fourCC != 0) { // Handle some DDS files where the DDPF_PIXELFORMAT is mostly zero @@ -237,8 +236,7 @@ namespace if (entry->ddpf.flags & DDS_ALPHAPIXELS) { // LUMINANCEA - if (ddpf.RBitMask == entry->ddpf.RBitMask - && ddpf.ABitMask == entry->ddpf.ABitMask) + if (ddpf.RBitMask == entry->ddpf.RBitMask && ddpf.ABitMask == entry->ddpf.ABitMask) break; } else @@ -253,8 +251,7 @@ namespace if (entry->ddpf.flags & DDS_ALPHAPIXELS) { // BUMPDUDVA - if (ddpf.RBitMask == entry->ddpf.RBitMask - && ddpf.ABitMask == entry->ddpf.ABitMask) + if (ddpf.RBitMask == entry->ddpf.RBitMask && ddpf.ABitMask == entry->ddpf.ABitMask) { flags &= ~DDS_FLAGS_NO_R10B10G10A2_FIXUP; break; @@ -270,17 +267,14 @@ namespace else if (entry->ddpf.flags & DDS_ALPHAPIXELS) { // RGBA - if (ddpf.RBitMask == entry->ddpf.RBitMask - && ddpf.GBitMask == entry->ddpf.GBitMask - && ddpf.BBitMask == entry->ddpf.BBitMask - && ddpf.ABitMask == entry->ddpf.ABitMask) + if (ddpf.RBitMask == entry->ddpf.RBitMask && ddpf.GBitMask == entry->ddpf.GBitMask + && ddpf.BBitMask == entry->ddpf.BBitMask && ddpf.ABitMask == entry->ddpf.ABitMask) break; } else { // RGB - if (ddpf.RBitMask == entry->ddpf.RBitMask - && ddpf.GBitMask == entry->ddpf.GBitMask + if (ddpf.RBitMask == entry->ddpf.RBitMask && ddpf.GBitMask == entry->ddpf.GBitMask && ddpf.BBitMask == entry->ddpf.BBitMask) break; } @@ -291,7 +285,7 @@ namespace if (index >= MAP_SIZE) return DXGI_FORMAT_UNKNOWN; - uint32_t cflags = g_LegacyDDSMap[index].convFlags; + uint32_t cflags = g_LegacyDDSMap[index].convFlags; DXGI_FORMAT format = g_LegacyDDSMap[index].format; if ((cflags & CONV_FLAGS_EXPAND) && (flags & DDS_FLAGS_NO_LEGACY_EXPANSION)) @@ -302,8 +296,7 @@ namespace cflags ^= CONV_FLAGS_SWIZZLE; } - if ((hdr.reserved1[9] == MAKEFOURCC('N', 'V', 'T', 'T')) - && (ddpf.flags & 0x40000000 /* DDPF_SRGB */)) + if ((hdr.reserved1[9] == MAKEFOURCC('N', 'V', 'T', 'T')) && (ddpf.flags & 0x40000000 /* DDPF_SRGB */)) { format = MakeSRGB(format); } @@ -316,13 +309,12 @@ namespace //------------------------------------------------------------------------------------- // Decodes DDS header including optional DX10 extended header //------------------------------------------------------------------------------------- - HRESULT DecodeDDSHeader( - _In_reads_bytes_(size) const void* pSource, - size_t size, - DDS_FLAGS flags, - _Out_ TexMetadata& metadata, - _Out_opt_ DDSMetaData* ddPixelFormat, - _Inout_ uint32_t& convFlags) noexcept + HRESULT DecodeDDSHeader(_In_reads_bytes_(size) const void* pSource, + size_t size, + DDS_FLAGS flags, + _Out_ TexMetadata& metadata, + _Out_opt_ DDSMetaData* ddPixelFormat, + _Inout_ uint32_t& convFlags) noexcept { if (!pSource) return E_POINTER; @@ -363,7 +355,7 @@ namespace if (flags & DDS_FLAGS_PERMISSIVE) { - if (pHeader->ddspf.size != 0 /* Known variant */ + if (pHeader->ddspf.size != 0 /* Known variant */ && pHeader->ddspf.size != 24 /* Known variant */ && pHeader->ddspf.size != sizeof(DDS_PIXELFORMAT)) { @@ -382,11 +374,9 @@ namespace } // Check for DX10 extension - if ((pHeader->ddspf.flags & DDS_FOURCC) - && (MAKEFOURCC('D', 'X', '1', '0') == pHeader->ddspf.fourCC)) + if ((pHeader->ddspf.flags & DDS_FOURCC) && (MAKEFOURCC('D', 'X', '1', '0') == pHeader->ddspf.fourCC)) { - if (pHeader->size != sizeof(DDS_HEADER) - || pHeader->ddspf.size != sizeof(DDS_PIXELFORMAT)) + if (pHeader->size != sizeof(DDS_HEADER) || pHeader->ddspf.size != sizeof(DDS_PIXELFORMAT)) { // We do not accept legacy DX9 'known variants' for modern "DX10" extension header files. return E_FAIL; @@ -427,9 +417,9 @@ namespace return HRESULT_E_INVALID_DATA; } - metadata.width = pHeader->width; - metadata.height = 1; - metadata.depth = 1; + metadata.width = pHeader->width; + metadata.height = 1; + metadata.depth = 1; metadata.dimension = TEX_DIMENSION_TEXTURE1D; break; @@ -441,13 +431,13 @@ namespace // Known variant which assumes it is a 2D texture - #if (__cplusplus >= 201703L) - [[fallthrough]]; - #elif defined(__clang__) - [[clang::fallthrough]]; - #elif defined(_MSC_VER) - __fallthrough; - #endif +#if (__cplusplus >= 201703L) + [[fallthrough]]; +#elif defined(__clang__) + [[clang::fallthrough]]; +#elif defined(_MSC_VER) + __fallthrough; +#endif case DDS_DIMENSION_TEXTURE2D: if (d3d10ext->miscFlag & DDS_RESOURCE_MISC_TEXTURECUBE) @@ -456,9 +446,9 @@ namespace metadata.arraySize *= 6; } - metadata.width = pHeader->width; - metadata.height = pHeader->height; - metadata.depth = 1; + metadata.width = pHeader->width; + metadata.height = pHeader->height; + metadata.depth = 1; metadata.dimension = TEX_DIMENSION_TEXTURE2D; break; @@ -471,21 +461,22 @@ namespace if (metadata.arraySize > 1) return HRESULT_E_NOT_SUPPORTED; - metadata.width = pHeader->width; - metadata.height = pHeader->height; - metadata.depth = pHeader->depth; + metadata.width = pHeader->width; + metadata.height = pHeader->height; + metadata.depth = pHeader->depth; metadata.dimension = TEX_DIMENSION_TEXTURE3D; break; - default: - return HRESULT_E_INVALID_DATA; + default: return HRESULT_E_INVALID_DATA; } - static_assert(static_cast(TEX_MISC2_ALPHA_MODE_MASK) == static_cast(DDS_MISC_FLAGS2_ALPHA_MODE_MASK), "DDS header mismatch"); + static_assert(static_cast(TEX_MISC2_ALPHA_MODE_MASK) == static_cast(DDS_MISC_FLAGS2_ALPHA_MODE_MASK), + "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_UNKNOWN) == static_cast(DDS_ALPHA_MODE_UNKNOWN), "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_STRAIGHT) == static_cast(DDS_ALPHA_MODE_STRAIGHT), "DDS header mismatch"); - static_assert(static_cast(TEX_ALPHA_MODE_PREMULTIPLIED) == static_cast(DDS_ALPHA_MODE_PREMULTIPLIED), "DDS header mismatch"); + static_assert(static_cast(TEX_ALPHA_MODE_PREMULTIPLIED) == static_cast(DDS_ALPHA_MODE_PREMULTIPLIED), + "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_OPAQUE) == static_cast(DDS_ALPHA_MODE_OPAQUE), "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_CUSTOM) == static_cast(DDS_ALPHA_MODE_CUSTOM), "DDS header mismatch"); @@ -497,16 +488,16 @@ namespace if (pHeader->flags & DDS_HEADER_FLAGS_VOLUME) { - metadata.width = pHeader->width; - metadata.height = pHeader->height; - metadata.depth = pHeader->depth; + metadata.width = pHeader->width; + metadata.height = pHeader->height; + metadata.depth = pHeader->depth; metadata.dimension = TEX_DIMENSION_TEXTURE3D; if (flags & DDS_FLAGS_PERMISSIVE) { // Allow cases where mipCount was computed incorrectly - size_t maxMips = 0; - std::ignore = CalculateMipLevels3D(metadata.width, metadata.height, metadata.depth, maxMips); + size_t maxMips = 0; + std::ignore = CalculateMipLevels3D(metadata.width, metadata.height, metadata.depth, maxMips); metadata.mipLevels = std::min(metadata.mipLevels, maxMips); } } @@ -522,9 +513,9 @@ namespace metadata.miscFlags |= TEX_MISC_TEXTURECUBE; } - metadata.width = pHeader->width; - metadata.height = pHeader->height; - metadata.depth = 1; + metadata.width = pHeader->width; + metadata.height = pHeader->height; + metadata.depth = 1; metadata.dimension = TEX_DIMENSION_TEXTURE2D; // Note there's no way for a legacy Direct3D 9 DDS to express a '1D' texture @@ -532,8 +523,8 @@ namespace if (flags & DDS_FLAGS_PERMISSIVE) { // Allow cases where mipCount was computed incorrectly - size_t maxMips = 0; - std::ignore = CalculateMipLevels(metadata.width, metadata.height, maxMips); + size_t maxMips = 0; + std::ignore = CalculateMipLevels(metadata.width, metadata.height, maxMips); metadata.mipLevels = std::min(metadata.mipLevels, maxMips); } } @@ -563,8 +554,7 @@ namespace convFlags |= CONV_FLAGS_L16 | CONV_FLAGS_EXPAND; break; - default: - break; + default: break; } } } @@ -604,8 +594,7 @@ namespace convFlags |= CONV_FLAGS_SWIZZLE | CONV_FLAGS_NOALPHA; break; - default: - break; + default: break; } } @@ -630,8 +619,7 @@ namespace convFlags |= CONV_FLAGS_EXPAND; break; - default: - break; + default: break; } } @@ -649,7 +637,7 @@ namespace if (!(flags & DDS_FLAGS_ALLOW_LARGE_FILES)) { // 16k is the maximum required resource size supported by Direct3D - if (metadata.width > 16384u /* D3D12_REQ_TEXTURE1D_U_DIMENSION, D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION */ + if (metadata.width > 16384u /* D3D12_REQ_TEXTURE1D_U_DIMENSION, D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION */ || metadata.height > 16384u /* D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION */ || metadata.mipLevels > 15u /* D3D12_REQ_MIP_LEVELS */) { @@ -673,23 +661,22 @@ namespace // Handle DDS-specific metadata if (ddPixelFormat) { - ddPixelFormat->size = pHeader->ddspf.size; - ddPixelFormat->flags = pHeader->ddspf.flags; - ddPixelFormat->fourCC = pHeader->ddspf.fourCC; + ddPixelFormat->size = pHeader->ddspf.size; + ddPixelFormat->flags = pHeader->ddspf.flags; + ddPixelFormat->fourCC = pHeader->ddspf.fourCC; ddPixelFormat->RGBBitCount = pHeader->ddspf.RGBBitCount; - ddPixelFormat->RBitMask = pHeader->ddspf.RBitMask; - ddPixelFormat->GBitMask = pHeader->ddspf.GBitMask; - ddPixelFormat->BBitMask = pHeader->ddspf.BBitMask; - ddPixelFormat->ABitMask = pHeader->ddspf.ABitMask; + ddPixelFormat->RBitMask = pHeader->ddspf.RBitMask; + ddPixelFormat->GBitMask = pHeader->ddspf.GBitMask; + ddPixelFormat->BBitMask = pHeader->ddspf.BBitMask; + ddPixelFormat->ABitMask = pHeader->ddspf.ABitMask; } return S_OK; } - inline void CopyScanline24bpp( - _Out_writes_bytes_(width * 3) uint8_t* pDestination, - _In_reads_bytes_(width * 4) const uint8_t* pSource, - size_t width) noexcept + inline void CopyScanline24bpp(_Out_writes_bytes_(width * 3) uint8_t* pDestination, + _In_reads_bytes_(width * 4) const uint8_t* pSource, + size_t width) noexcept { for (size_t x = 0; x < width; ++x) { @@ -701,19 +688,13 @@ namespace pDestination += 3; } } -} - +} // namespace //------------------------------------------------------------------------------------- // Encodes DDS file header (magic value, header, optional DX10 extended header) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::EncodeDDSHeader( - const TexMetadata& metadata, - DDS_FLAGS flags, - uint8_t* pDestination, - size_t maxsize, - size_t& required) noexcept +_Use_decl_annotations_ HRESULT +DirectX::EncodeDDSHeader(const TexMetadata& metadata, DDS_FLAGS flags, uint8_t* pDestination, size_t maxsize, size_t& required) noexcept { if (!IsValid(metadata.format)) return E_INVALIDARG; @@ -738,30 +719,30 @@ HRESULT DirectX::EncodeDDSHeader( flags |= DDS_FLAGS_FORCE_DX10_EXT; } - CP_FLAGS pitchFlags = CP_FLAGS_NONE; - DDS_PIXELFORMAT ddpf = {}; + CP_FLAGS pitchFlags = CP_FLAGS_NONE; + DDS_PIXELFORMAT ddpf = {}; if (!(flags & DDS_FLAGS_FORCE_DX10_EXT)) { switch (metadata.format) { - case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy(&ddpf, &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R16G16_UNORM: memcpy(&ddpf, &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8_UNORM: memcpy(&ddpf, &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R16_UNORM: memcpy(&ddpf, &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8_UNORM: memcpy(&ddpf, &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_A8_UNORM: memcpy(&ddpf, &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy(&ddpf, &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy(&ddpf, &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC1_UNORM: memcpy(&ddpf, &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC2_UNORM: memcpy(&ddpf, metadata.IsPMAlpha() ? (&DDSPF_DXT2) : (&DDSPF_DXT3), sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC4_SNORM: memcpy(&ddpf, &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC5_SNORM: memcpy(&ddpf, &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B5G6R5_UNORM: memcpy(&ddpf, &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy(&ddpf, &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8_SNORM: memcpy(&ddpf, &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy(&ddpf, &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R16G16_SNORM: memcpy(&ddpf, &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy(&ddpf, &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.1 + case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy(&ddpf, &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R16G16_UNORM: memcpy(&ddpf, &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8_UNORM: memcpy(&ddpf, &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R16_UNORM: memcpy(&ddpf, &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8_UNORM: memcpy(&ddpf, &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_A8_UNORM: memcpy(&ddpf, &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy(&ddpf, &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy(&ddpf, &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC1_UNORM: memcpy(&ddpf, &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC2_UNORM: memcpy(&ddpf, metadata.IsPMAlpha() ? (&DDSPF_DXT2) : (&DDSPF_DXT3), sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC4_SNORM: memcpy(&ddpf, &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC5_SNORM: memcpy(&ddpf, &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B5G6R5_UNORM: memcpy(&ddpf, &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy(&ddpf, &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8_SNORM: memcpy(&ddpf, &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy(&ddpf, &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R16G16_SNORM: memcpy(&ddpf, &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy(&ddpf, &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.1 case DXGI_FORMAT_B8G8R8X8_UNORM: if (flags & DDS_FLAGS_FORCE_24BPP_RGB) { @@ -771,11 +752,11 @@ HRESULT DirectX::EncodeDDSHeader( } else { - memcpy(&ddpf, &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); // DXGI 1.1 + memcpy(&ddpf, &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); // DXGI 1.1 } break; - case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy(&ddpf, &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.2 - case DXGI_FORMAT_YUY2: memcpy(&ddpf, &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.2 + case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy(&ddpf, &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.2 + case DXGI_FORMAT_YUY2: memcpy(&ddpf, &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.2 case DXGI_FORMAT_BC3_UNORM: memcpy(&ddpf, metadata.IsPMAlpha() ? (&DDSPF_DXT4) : (&DDSPF_DXT5), sizeof(DDS_PIXELFORMAT)); @@ -787,28 +768,44 @@ HRESULT DirectX::EncodeDDSHeader( // Legacy D3DX formats using D3DFMT enum value as FourCC case DXGI_FORMAT_R32G32B32A32_FLOAT: - ddpf.size = sizeof(DDS_PIXELFORMAT); ddpf.flags = DDS_FOURCC; ddpf.fourCC = 116; // D3DFMT_A32B32G32R32F + ddpf.size = sizeof(DDS_PIXELFORMAT); + ddpf.flags = DDS_FOURCC; + ddpf.fourCC = 116; // D3DFMT_A32B32G32R32F break; case DXGI_FORMAT_R16G16B16A16_FLOAT: - ddpf.size = sizeof(DDS_PIXELFORMAT); ddpf.flags = DDS_FOURCC; ddpf.fourCC = 113; // D3DFMT_A16B16G16R16F + ddpf.size = sizeof(DDS_PIXELFORMAT); + ddpf.flags = DDS_FOURCC; + ddpf.fourCC = 113; // D3DFMT_A16B16G16R16F break; case DXGI_FORMAT_R16G16B16A16_UNORM: - ddpf.size = sizeof(DDS_PIXELFORMAT); ddpf.flags = DDS_FOURCC; ddpf.fourCC = 36; // D3DFMT_A16B16G16R16 + ddpf.size = sizeof(DDS_PIXELFORMAT); + ddpf.flags = DDS_FOURCC; + ddpf.fourCC = 36; // D3DFMT_A16B16G16R16 break; case DXGI_FORMAT_R16G16B16A16_SNORM: - ddpf.size = sizeof(DDS_PIXELFORMAT); ddpf.flags = DDS_FOURCC; ddpf.fourCC = 110; // D3DFMT_Q16W16V16U16 + ddpf.size = sizeof(DDS_PIXELFORMAT); + ddpf.flags = DDS_FOURCC; + ddpf.fourCC = 110; // D3DFMT_Q16W16V16U16 break; case DXGI_FORMAT_R32G32_FLOAT: - ddpf.size = sizeof(DDS_PIXELFORMAT); ddpf.flags = DDS_FOURCC; ddpf.fourCC = 115; // D3DFMT_G32R32F + ddpf.size = sizeof(DDS_PIXELFORMAT); + ddpf.flags = DDS_FOURCC; + ddpf.fourCC = 115; // D3DFMT_G32R32F break; case DXGI_FORMAT_R16G16_FLOAT: - ddpf.size = sizeof(DDS_PIXELFORMAT); ddpf.flags = DDS_FOURCC; ddpf.fourCC = 112; // D3DFMT_G16R16F + ddpf.size = sizeof(DDS_PIXELFORMAT); + ddpf.flags = DDS_FOURCC; + ddpf.fourCC = 112; // D3DFMT_G16R16F break; case DXGI_FORMAT_R32_FLOAT: - ddpf.size = sizeof(DDS_PIXELFORMAT); ddpf.flags = DDS_FOURCC; ddpf.fourCC = 114; // D3DFMT_R32F + ddpf.size = sizeof(DDS_PIXELFORMAT); + ddpf.flags = DDS_FOURCC; + ddpf.fourCC = 114; // D3DFMT_R32F break; case DXGI_FORMAT_R16_FLOAT: - ddpf.size = sizeof(DDS_PIXELFORMAT); ddpf.flags = DDS_FOURCC; ddpf.fourCC = 111; // D3DFMT_R16F + ddpf.size = sizeof(DDS_PIXELFORMAT); + ddpf.flags = DDS_FOURCC; + ddpf.fourCC = 111; // D3DFMT_R16F break; // DX9 legacy pixel formats @@ -878,8 +875,7 @@ HRESULT DirectX::EncodeDDSHeader( } break; - default: - break; + default: break; } } @@ -905,9 +901,9 @@ HRESULT DirectX::EncodeDDSHeader( assert(header); memset(header, 0, sizeof(DDS_HEADER)); - header->size = sizeof(DDS_HEADER); + header->size = sizeof(DDS_HEADER); header->flags = DDS_HEADER_FLAGS_TEXTURE; - header->caps = DDS_SURFACE_FLAGS_TEXTURE; + header->caps = DDS_SURFACE_FLAGS_TEXTURE; if (metadata.mipLevels > 0) { @@ -928,18 +924,17 @@ HRESULT DirectX::EncodeDDSHeader( if (metadata.width > UINT32_MAX) return E_INVALIDARG; - header->width = static_cast(metadata.width); + header->width = static_cast(metadata.width); header->height = header->depth = 1; break; case TEX_DIMENSION_TEXTURE2D: - if (metadata.height > UINT32_MAX - || metadata.width > UINT32_MAX) + if (metadata.height > UINT32_MAX || metadata.width > UINT32_MAX) return E_INVALIDARG; header->height = static_cast(metadata.height); - header->width = static_cast(metadata.width); - header->depth = 1; + header->width = static_cast(metadata.width); + header->depth = 1; if (metadata.IsCubemap()) { @@ -949,31 +944,25 @@ HRESULT DirectX::EncodeDDSHeader( break; case TEX_DIMENSION_TEXTURE3D: - if (metadata.height > UINT32_MAX - || metadata.width > UINT32_MAX - || metadata.depth > UINT16_MAX) + if (metadata.height > UINT32_MAX || metadata.width > UINT32_MAX || metadata.depth > UINT16_MAX) return E_INVALIDARG; header->flags |= DDS_HEADER_FLAGS_VOLUME; header->caps2 |= DDS_FLAGS_VOLUME; header->height = static_cast(metadata.height); - header->width = static_cast(metadata.width); - header->depth = static_cast(metadata.depth); + header->width = static_cast(metadata.width); + header->depth = static_cast(metadata.depth); break; - default: - return E_FAIL; + default: return E_FAIL; } - size_t rowPitch, slicePitch; - HRESULT hr = ComputePitch(metadata.format, - metadata.width, metadata.height, - rowPitch, slicePitch, pitchFlags); + size_t rowPitch, slicePitch; + HRESULT hr = ComputePitch(metadata.format, metadata.width, metadata.height, rowPitch, slicePitch, pitchFlags); if (FAILED(hr)) return hr; - if (slicePitch > UINT32_MAX - || rowPitch > UINT32_MAX) + if (slicePitch > UINT32_MAX || rowPitch > UINT32_MAX) return E_FAIL; if (IsCompressed(metadata.format)) @@ -995,7 +984,7 @@ HRESULT DirectX::EncodeDDSHeader( assert(ext); memset(ext, 0, sizeof(DDS_HEADER_DXT10)); - ext->dxgiFormat = metadata.format; + ext->dxgiFormat = metadata.format; ext->resourceDimension = metadata.dimension; if (metadata.arraySize > UINT16_MAX) @@ -1017,11 +1006,13 @@ HRESULT DirectX::EncodeDDSHeader( ext->arraySize = static_cast(metadata.arraySize); } - static_assert(static_cast(TEX_MISC2_ALPHA_MODE_MASK) == static_cast(DDS_MISC_FLAGS2_ALPHA_MODE_MASK), "DDS header mismatch"); + static_assert(static_cast(TEX_MISC2_ALPHA_MODE_MASK) == static_cast(DDS_MISC_FLAGS2_ALPHA_MODE_MASK), + "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_UNKNOWN) == static_cast(DDS_ALPHA_MODE_UNKNOWN), "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_STRAIGHT) == static_cast(DDS_ALPHA_MODE_STRAIGHT), "DDS header mismatch"); - static_assert(static_cast(TEX_ALPHA_MODE_PREMULTIPLIED) == static_cast(DDS_ALPHA_MODE_PREMULTIPLIED), "DDS header mismatch"); + static_assert(static_cast(TEX_ALPHA_MODE_PREMULTIPLIED) == static_cast(DDS_ALPHA_MODE_PREMULTIPLIED), + "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_OPAQUE) == static_cast(DDS_ALPHA_MODE_OPAQUE), "DDS header mismatch"); static_assert(static_cast(TEX_ALPHA_MODE_CUSTOM) == static_cast(DDS_ALPHA_MODE_CUSTOM), "DDS header mismatch"); @@ -1039,7 +1030,6 @@ HRESULT DirectX::EncodeDDSHeader( return S_OK; } - namespace { //------------------------------------------------------------------------------------- @@ -1098,16 +1088,14 @@ namespace return lformat; } - _Success_(return) - bool LegacyExpandScanline( - _Out_writes_bytes_(outSize) void* pDestination, - size_t outSize, - _In_ DXGI_FORMAT outFormat, - _In_reads_bytes_(inSize) const void* pSource, - size_t inSize, - _In_ TEXP_LEGACY_FORMAT inFormat, - _In_reads_opt_(256) const uint32_t* pal8, - _In_ uint32_t tflags) noexcept + _Success_(return) bool LegacyExpandScanline(_Out_writes_bytes_(outSize) void* pDestination, + size_t outSize, + _In_ DXGI_FORMAT outFormat, + _In_reads_bytes_(inSize) const void* pSource, + size_t inSize, + _In_ TEXP_LEGACY_FORMAT inFormat, + _In_reads_opt_(256) const uint32_t* pal8, + _In_ uint32_t tflags) noexcept { assert(pDestination && outSize > 0); assert(pSource && inSize > 0); @@ -1122,8 +1110,8 @@ namespace // D3DFMT_R8G8B8 -> DXGI_FORMAT_R8G8B8A8_UNORM if (inSize >= 3 && outSize >= 4) { - const uint8_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + const uint8_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 2)) && (ocount < (outSize - 3))); icount += 3, ocount += 4) { @@ -1147,7 +1135,7 @@ namespace if (inSize >= 1 && outSize >= 4) { const uint8_t* __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < (outSize - 3))); ++icount, ocount += 4) { @@ -1168,7 +1156,7 @@ namespace if (inSize >= 1 && outSize >= 2) { const uint8_t* __restrict sPtr = static_cast(pSource); - uint16_t * __restrict dPtr = static_cast(pDestination); + uint16_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < (outSize - 1))); ++icount, ocount += 2) { @@ -1184,8 +1172,7 @@ namespace } return false; - default: - return false; + default: return false; } case TEXP_LEGACY_A8R3G3B2: @@ -1196,7 +1183,7 @@ namespace if (inSize >= 2 && outSize >= 4) { const uint16_t* __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 3))); icount += 2, ocount += 4) { @@ -1221,7 +1208,7 @@ namespace if (inSize >= 1 && outSize >= 4) { const uint8_t* __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < (outSize - 3))); ++icount, ocount += 4) { @@ -1241,7 +1228,7 @@ namespace if (inSize >= 2 && outSize >= 4) { const uint16_t* __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 3))); icount += 2, ocount += 4) { @@ -1263,8 +1250,8 @@ namespace // D3DFMT_A4L4 -> DXGI_FORMAT_B4G4R4A4_UNORM if (inSize >= 1 && outSize >= 2) { - const uint8_t * __restrict sPtr = static_cast(pSource); - uint16_t * __restrict dPtr = static_cast(pDestination); + const uint8_t* __restrict sPtr = static_cast(pSource); + uint16_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < (outSize - 1))); ++icount, ocount += 2) { @@ -1283,8 +1270,8 @@ namespace // D3DFMT_A4L4 -> DXGI_FORMAT_R8G8B8A8_UNORM if (inSize >= 1 && outSize >= 4) { - const uint8_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + const uint8_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < (outSize - 3))); ++icount, ocount += 4) { @@ -1299,8 +1286,7 @@ namespace } return false; - default: - return false; + default: return false; } case TEXP_LEGACY_B4G4R4A4: @@ -1310,8 +1296,8 @@ namespace // D3DFMT_A4R4G4B4 -> DXGI_FORMAT_R8G8B8A8_UNORM if (inSize >= 2 && outSize >= 4) { - const uint16_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + const uint16_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 3))); icount += 2, ocount += 4) { @@ -1335,8 +1321,8 @@ namespace // D3DFMT_L8 -> DXGI_FORMAT_R8G8B8A8_UNORM if (inSize >= 1 && outSize >= 4) { - const uint8_t * __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + const uint8_t* __restrict sPtr = static_cast(pSource); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < inSize) && (ocount < (outSize - 3))); ++icount, ocount += 4) { @@ -1358,7 +1344,7 @@ namespace if (inSize >= 2 && outSize >= 8) { const uint16_t* __restrict sPtr = static_cast(pSource); - uint64_t * __restrict dPtr = static_cast(pDestination); + uint64_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 7))); icount += 2, ocount += 8) { @@ -1382,7 +1368,7 @@ namespace if (inSize >= 2 && outSize >= 4) { const uint16_t* __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 3))); icount += 2, ocount += 4) { @@ -1407,7 +1393,7 @@ namespace if (inSize >= 2 && outSize >= 4) { const uint16_t* __restrict sPtr = static_cast(pSource); - uint32_t * __restrict dPtr = static_cast(pDestination); + uint32_t* __restrict dPtr = static_cast(pDestination); for (size_t ocount = 0, icount = 0; ((icount < (inSize - 1)) && (ocount < (outSize - 3))); icount += 2, ocount += 4) { @@ -1417,8 +1403,8 @@ namespace uint32_t t1 = ((t & 0xFC00) >> 8) | ((t & 0xC000) >> 14); constexpr int m = 1U << 4; - int8_t v = ((((t >> 5) & 0x1f) ^ m) - m) + 16; - int8_t u = (((t & 0x1f) ^ m) - m) + 16; + int8_t v = ((((t >> 5) & 0x1f) ^ m) - m) + 16; + int8_t u = (((t & 0x1f) ^ m) - m) + 16; auto t2 = static_cast(u << 3 | u >> 2); auto t3 = static_cast(v << 3 | v >> 2); @@ -1429,20 +1415,17 @@ namespace } return false; - default: - return false; + default: return false; } } - _Success_(return) - bool LegacyConvertScanline( - _Out_writes_bytes_(outSize) void* pDestination, - size_t outSize, - _In_ DXGI_FORMAT outFormat, - _In_reads_bytes_(inSize) const void* pSource, - size_t inSize, - _In_ TEXP_LEGACY_FORMAT inFormat, - uint32_t tflags) noexcept + _Success_(return) bool LegacyConvertScanline(_Out_writes_bytes_(outSize) void* pDestination, + size_t outSize, + _In_ DXGI_FORMAT outFormat, + _In_reads_bytes_(inSize) const void* pSource, + size_t inSize, + _In_ TEXP_LEGACY_FORMAT inFormat, + uint32_t tflags) noexcept { assert(pDestination && outSize > 0); assert(pSource && inSize > 0); @@ -1464,10 +1447,10 @@ namespace const uint32_t t = *(sPtr++); // Converts 8-bit unsigned / 8-bit signed / 8-bit signed to 8:8:8:8 unsigned - uint32_t t1 = (t >> 16) & 0xff; - constexpr int m = 1U << 7; - uint32_t v = ((((t >> 8) & 0xff) ^ m) - m) + 128; - uint32_t u = (((t & 0xff) ^ m) - m) + 128; + uint32_t t1 = (t >> 16) & 0xff; + constexpr int m = 1U << 7; + uint32_t v = ((((t >> 8) & 0xff) ^ m) - m) + 128; + uint32_t u = (((t & 0xff) ^ m) - m) + 128; uint32_t t2 = u << 8; uint32_t t3 = v << 16; @@ -1494,9 +1477,9 @@ namespace // Converts 2-bit unsigned / 10-bit signed / 10-bit signed / 10-bit signed to 2:10:10:10 unsigned constexpr int m = 1U << 9; - uint32_t w = ((((t >> 20) & 0x3ff) ^ m) - m) + 512; - uint32_t v = ((((t >> 10) & 0x3ff) ^ m) - m) + 512; - uint32_t u = (((t & 0x3ff) ^ m) - m) + 512; + uint32_t w = ((((t >> 20) & 0x3ff) ^ m) - m) + 512; + uint32_t v = ((((t >> 10) & 0x3ff) ^ m) - m) + 512; + uint32_t u = (((t & 0x3ff) ^ m) - m) + 512; uint32_t t1 = u; uint32_t t2 = v << 10; @@ -1509,22 +1492,20 @@ namespace } return false; - default: - return false; + default: return false; } } //------------------------------------------------------------------------------------- // Converts or copies image data from pPixels into scratch image data //------------------------------------------------------------------------------------- - HRESULT CopyImage( - _In_reads_bytes_(size) const void* pPixels, - _In_ size_t size, - _In_ const TexMetadata& metadata, - _In_ CP_FLAGS cpFlags, - _In_ uint32_t convFlags, - _In_reads_opt_(256) const uint32_t *pal8, - _In_ const ScratchImage& image) noexcept + HRESULT CopyImage(_In_reads_bytes_(size) const void* pPixels, + _In_ size_t size, + _In_ const TexMetadata& metadata, + _In_ CP_FLAGS cpFlags, + _In_ uint32_t convFlags, + _In_reads_opt_(256) const uint32_t* pal8, + _In_ const ScratchImage& image) noexcept { assert(pPixels); assert(image.GetPixels()); @@ -1536,13 +1517,15 @@ namespace { if (convFlags & CONV_FLAGS_888) cpFlags |= CP_FLAGS_24BPP; - else if (convFlags & (CONV_FLAGS_565 | CONV_FLAGS_5551 | CONV_FLAGS_4444 | CONV_FLAGS_8332 | CONV_FLAGS_A8P8 | CONV_FLAGS_L16 | CONV_FLAGS_A8L8 | CONV_FLAGS_L6V5U5)) + else if (convFlags + & (CONV_FLAGS_565 | CONV_FLAGS_5551 | CONV_FLAGS_4444 | CONV_FLAGS_8332 | CONV_FLAGS_A8P8 | CONV_FLAGS_L16 + | CONV_FLAGS_A8L8 | CONV_FLAGS_L6V5U5)) cpFlags |= CP_FLAGS_16BPP; else if (convFlags & (CONV_FLAGS_44 | CONV_FLAGS_332 | CONV_FLAGS_PAL8 | CONV_FLAGS_L8)) cpFlags |= CP_FLAGS_8BPP; } - size_t pixelSize, nimages; + size_t pixelSize, nimages; HRESULT hr = DetermineImageArray(metadata, cpFlags, nimages, pixelSize); if (FAILED(hr)) return hr; @@ -1563,13 +1546,12 @@ namespace return E_OUTOFMEMORY; } - if (!SetupImageArray( - const_cast(reinterpret_cast(pPixels)), - pixelSize, - metadata, - cpFlags, - timages.get(), - nimages)) + if (!SetupImageArray(const_cast(reinterpret_cast(pPixels)), + pixelSize, + metadata, + cpFlags, + timages.get(), + nimages)) { return E_FAIL; } @@ -1592,230 +1574,233 @@ namespace switch (metadata.dimension) { case TEX_DIMENSION_TEXTURE1D: - case TEX_DIMENSION_TEXTURE2D: + case TEX_DIMENSION_TEXTURE2D: { + size_t index = 0; + for (size_t item = 0; item < metadata.arraySize; ++item) { - size_t index = 0; - for (size_t item = 0; item < metadata.arraySize; ++item) + size_t lastgood = 0; + for (size_t level = 0; level < metadata.mipLevels; ++level, ++index) { - size_t lastgood = 0; - for (size_t level = 0; level < metadata.mipLevels; ++level, ++index) - { - if (index >= nimages) - return E_FAIL; + if (index >= nimages) + return E_FAIL; - if (images[index].height != timages[index].height) - return E_FAIL; + if (images[index].height != timages[index].height) + return E_FAIL; - size_t dpitch = images[index].rowPitch; - const size_t spitch = timages[index].rowPitch; + size_t dpitch = images[index].rowPitch; + const size_t spitch = timages[index].rowPitch; - const uint8_t *pSrc = timages[index].pixels; - if (!pSrc) - return E_POINTER; + const uint8_t* pSrc = timages[index].pixels; + if (!pSrc) + return E_POINTER; - uint8_t *pDest = images[index].pixels; - if (!pDest) - return E_POINTER; + uint8_t* pDest = images[index].pixels; + if (!pDest) + return E_POINTER; - if (IsCompressed(metadata.format)) - { - size_t csize = std::min(images[index].slicePitch, timages[index].slicePitch); - memcpy(pDest, pSrc, csize); + if (IsCompressed(metadata.format)) + { + size_t csize = std::min(images[index].slicePitch, timages[index].slicePitch); + memcpy(pDest, pSrc, csize); - if (cpFlags & CP_FLAGS_BAD_DXTN_TAILS) + if (cpFlags & CP_FLAGS_BAD_DXTN_TAILS) + { + if (images[index].width < 4 || images[index].height < 4) { - if (images[index].width < 4 || images[index].height < 4) - { - csize = std::min(images[index].slicePitch, timages[lastgood].slicePitch); - memcpy(pDest, timages[lastgood].pixels, csize); - } - else - { - lastgood = index; - } + csize = std::min(images[index].slicePitch, timages[lastgood].slicePitch); + memcpy(pDest, timages[lastgood].pixels, csize); } - } - else if (IsPlanar(metadata.format)) - { - const size_t count = ComputeScanlines(metadata.format, images[index].height); - if (!count) - return E_UNEXPECTED; - - const size_t csize = std::min(dpitch, spitch); - for (size_t h = 0; h < count; ++h) + else { - memcpy(pDest, pSrc, csize); - pSrc += spitch; - pDest += dpitch; + lastgood = index; } } - else + } + else if (IsPlanar(metadata.format)) + { + const size_t count = ComputeScanlines(metadata.format, images[index].height); + if (!count) + return E_UNEXPECTED; + + const size_t csize = std::min(dpitch, spitch); + for (size_t h = 0; h < count; ++h) { - for (size_t h = 0; h < images[index].height; ++h) + memcpy(pDest, pSrc, csize); + pSrc += spitch; + pDest += dpitch; + } + } + else + { + for (size_t h = 0; h < images[index].height; ++h) + { + if (convFlags & CONV_FLAGS_EXPAND) { - if (convFlags & CONV_FLAGS_EXPAND) + if (convFlags & CONV_FLAGS_4444) { - if (convFlags & CONV_FLAGS_4444) - { - if (!ExpandScanline(pDest, dpitch, DXGI_FORMAT_R8G8B8A8_UNORM, - pSrc, spitch, + if (!ExpandScanline(pDest, + dpitch, + DXGI_FORMAT_R8G8B8A8_UNORM, + pSrc, + spitch, (convFlags & CONF_FLAGS_11ON12) ? WIN11_DXGI_FORMAT_A4B4G4R4_UNORM : DXGI_FORMAT_B4G4R4A4_UNORM, tflags)) - return E_FAIL; - } - else if (convFlags & (CONV_FLAGS_565 | CONV_FLAGS_5551)) - { - if (!ExpandScanline(pDest, dpitch, DXGI_FORMAT_R8G8B8A8_UNORM, - pSrc, spitch, - (convFlags & CONV_FLAGS_565) ? DXGI_FORMAT_B5G6R5_UNORM : DXGI_FORMAT_B5G5R5A1_UNORM, - tflags)) - return E_FAIL; - } - else - { - const TEXP_LEGACY_FORMAT lformat = FindLegacyFormat(convFlags); - if (!LegacyExpandScanline(pDest, dpitch, metadata.format, - pSrc, spitch, lformat, pal8, - tflags)) - return E_FAIL; - } - } - else if (convFlags & CONV_FLAGS_SWIZZLE) - { - SwizzleScanline(pDest, dpitch, pSrc, spitch, metadata.format, tflags); + return E_FAIL; } - else if (convFlags & (CONV_FLAGS_L8U8V8 | CONV_FLAGS_WUV10)) + else if (convFlags & (CONV_FLAGS_565 | CONV_FLAGS_5551)) { - const TEXP_LEGACY_FORMAT lformat = FindLegacyFormat(convFlags); - if (!LegacyConvertScanline(pDest, dpitch, metadata.format, - pSrc, spitch, lformat, tflags)) + if (!ExpandScanline(pDest, + dpitch, + DXGI_FORMAT_R8G8B8A8_UNORM, + pSrc, + spitch, + (convFlags & CONV_FLAGS_565) ? DXGI_FORMAT_B5G6R5_UNORM : DXGI_FORMAT_B5G5R5A1_UNORM, + tflags)) return E_FAIL; } else { - CopyScanline(pDest, dpitch, pSrc, spitch, metadata.format, tflags); + const TEXP_LEGACY_FORMAT lformat = FindLegacyFormat(convFlags); + if (!LegacyExpandScanline(pDest, dpitch, metadata.format, pSrc, spitch, lformat, pal8, tflags)) + return E_FAIL; } - - pSrc += spitch; - pDest += dpitch; } + else if (convFlags & CONV_FLAGS_SWIZZLE) + { + SwizzleScanline(pDest, dpitch, pSrc, spitch, metadata.format, tflags); + } + else if (convFlags & (CONV_FLAGS_L8U8V8 | CONV_FLAGS_WUV10)) + { + const TEXP_LEGACY_FORMAT lformat = FindLegacyFormat(convFlags); + if (!LegacyConvertScanline(pDest, dpitch, metadata.format, pSrc, spitch, lformat, tflags)) + return E_FAIL; + } + else + { + CopyScanline(pDest, dpitch, pSrc, spitch, metadata.format, tflags); + } + + pSrc += spitch; + pDest += dpitch; } } } } - break; + } + break; - case TEX_DIMENSION_TEXTURE3D: - { - size_t index = 0; - size_t d = metadata.depth; + case TEX_DIMENSION_TEXTURE3D: { + size_t index = 0; + size_t d = metadata.depth; - size_t lastgood = 0; - for (size_t level = 0; level < metadata.mipLevels; ++level) + size_t lastgood = 0; + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + for (size_t slice = 0; slice < d; ++slice, ++index) { - for (size_t slice = 0; slice < d; ++slice, ++index) - { - if (index >= nimages) - return E_FAIL; + if (index >= nimages) + return E_FAIL; - if (images[index].height != timages[index].height) - return E_FAIL; + if (images[index].height != timages[index].height) + return E_FAIL; - size_t dpitch = images[index].rowPitch; - const size_t spitch = timages[index].rowPitch; + size_t dpitch = images[index].rowPitch; + const size_t spitch = timages[index].rowPitch; - const uint8_t *pSrc = timages[index].pixels; - if (!pSrc) - return E_POINTER; + const uint8_t* pSrc = timages[index].pixels; + if (!pSrc) + return E_POINTER; - uint8_t *pDest = images[index].pixels; - if (!pDest) - return E_POINTER; + uint8_t* pDest = images[index].pixels; + if (!pDest) + return E_POINTER; - if (IsCompressed(metadata.format)) - { - size_t csize = std::min(images[index].slicePitch, timages[index].slicePitch); - memcpy(pDest, pSrc, csize); + if (IsCompressed(metadata.format)) + { + size_t csize = std::min(images[index].slicePitch, timages[index].slicePitch); + memcpy(pDest, pSrc, csize); - if (cpFlags & CP_FLAGS_BAD_DXTN_TAILS) + if (cpFlags & CP_FLAGS_BAD_DXTN_TAILS) + { + if (images[index].width < 4 || images[index].height < 4) { - if (images[index].width < 4 || images[index].height < 4) - { - csize = std::min(images[index].slicePitch, timages[lastgood + slice].slicePitch); - memcpy(pDest, timages[lastgood + slice].pixels, csize); - } - else if (!slice) - { - lastgood = index; - } + csize = std::min(images[index].slicePitch, timages[lastgood + slice].slicePitch); + memcpy(pDest, timages[lastgood + slice].pixels, csize); + } + else if (!slice) + { + lastgood = index; } } - else if (IsPlanar(metadata.format)) - { - // Direct3D does not support any planar formats for Texture3D - return HRESULT_E_NOT_SUPPORTED; - } - else + } + else if (IsPlanar(metadata.format)) + { + // Direct3D does not support any planar formats for Texture3D + return HRESULT_E_NOT_SUPPORTED; + } + else + { + for (size_t h = 0; h < images[index].height; ++h) { - for (size_t h = 0; h < images[index].height; ++h) + if (convFlags & CONV_FLAGS_EXPAND) { - if (convFlags & CONV_FLAGS_EXPAND) + if (convFlags & CONV_FLAGS_4444) { - if (convFlags & CONV_FLAGS_4444) - { - if (!ExpandScanline(pDest, dpitch, DXGI_FORMAT_R8G8B8A8_UNORM, - pSrc, spitch, + if (!ExpandScanline(pDest, + dpitch, + DXGI_FORMAT_R8G8B8A8_UNORM, + pSrc, + spitch, (convFlags & CONF_FLAGS_11ON12) ? WIN11_DXGI_FORMAT_A4B4G4R4_UNORM : DXGI_FORMAT_B4G4R4A4_UNORM, tflags)) - return E_FAIL; - } - else if (convFlags & (CONV_FLAGS_565 | CONV_FLAGS_5551)) - { - if (!ExpandScanline(pDest, dpitch, DXGI_FORMAT_R8G8B8A8_UNORM, - pSrc, spitch, - (convFlags & CONV_FLAGS_565) ? DXGI_FORMAT_B5G6R5_UNORM : DXGI_FORMAT_B5G5R5A1_UNORM, - tflags)) - return E_FAIL; - } - else - { - const TEXP_LEGACY_FORMAT lformat = FindLegacyFormat(convFlags); - if (!LegacyExpandScanline(pDest, dpitch, metadata.format, - pSrc, spitch, lformat, pal8, - tflags)) - return E_FAIL; - } - } - else if (convFlags & CONV_FLAGS_SWIZZLE) - { - SwizzleScanline(pDest, dpitch, pSrc, spitch, metadata.format, tflags); + return E_FAIL; } - else if (convFlags & (CONV_FLAGS_L8U8V8 | CONV_FLAGS_WUV10)) + else if (convFlags & (CONV_FLAGS_565 | CONV_FLAGS_5551)) { - const TEXP_LEGACY_FORMAT lformat = FindLegacyFormat(convFlags); - if (!LegacyConvertScanline(pDest, dpitch, metadata.format, - pSrc, spitch, lformat, tflags)) + if (!ExpandScanline(pDest, + dpitch, + DXGI_FORMAT_R8G8B8A8_UNORM, + pSrc, + spitch, + (convFlags & CONV_FLAGS_565) ? DXGI_FORMAT_B5G6R5_UNORM : DXGI_FORMAT_B5G5R5A1_UNORM, + tflags)) return E_FAIL; } else { - CopyScanline(pDest, dpitch, pSrc, spitch, metadata.format, tflags); + const TEXP_LEGACY_FORMAT lformat = FindLegacyFormat(convFlags); + if (!LegacyExpandScanline(pDest, dpitch, metadata.format, pSrc, spitch, lformat, pal8, tflags)) + return E_FAIL; } - - pSrc += spitch; - pDest += dpitch; } + else if (convFlags & CONV_FLAGS_SWIZZLE) + { + SwizzleScanline(pDest, dpitch, pSrc, spitch, metadata.format, tflags); + } + else if (convFlags & (CONV_FLAGS_L8U8V8 | CONV_FLAGS_WUV10)) + { + const TEXP_LEGACY_FORMAT lformat = FindLegacyFormat(convFlags); + if (!LegacyConvertScanline(pDest, dpitch, metadata.format, pSrc, spitch, lformat, tflags)) + return E_FAIL; + } + else + { + CopyScanline(pDest, dpitch, pSrc, spitch, metadata.format, tflags); + } + + pSrc += spitch; + pDest += dpitch; } } - - if (d > 1) - d >>= 1; } + + if (d > 1) + d >>= 1; } - break; + } + break; - default: - return E_FAIL; + default: return E_FAIL; } return S_OK; @@ -1841,8 +1826,8 @@ namespace for (size_t i = 0; i < image.GetImageCount(); ++i) { - const Image* img = &images[i]; - uint8_t *pPixels = img->pixels; + const Image* img = &images[i]; + uint8_t* pPixels = img->pixels; if (!pPixels) return E_POINTER; @@ -1873,8 +1858,7 @@ namespace return S_OK; } -} - +} // namespace //===================================================================================== // Entry-points @@ -1884,23 +1868,19 @@ namespace // Obtain metadata from DDS file in memory/on disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromDDSMemory( - const uint8_t* pSource, - size_t size, - DDS_FLAGS flags, - TexMetadata& metadata) noexcept +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromDDSMemory(const uint8_t* pSource, + size_t size, + DDS_FLAGS flags, + TexMetadata& metadata) noexcept { return GetMetadataFromDDSMemoryEx(pSource, size, flags, metadata, nullptr); } -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromDDSMemoryEx( - const uint8_t* pSource, - size_t size, - DDS_FLAGS flags, - TexMetadata& metadata, - DDSMetaData* ddPixelFormat) noexcept +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromDDSMemoryEx(const uint8_t* pSource, + size_t size, + DDS_FLAGS flags, + TexMetadata& metadata, + DDSMetaData* ddPixelFormat) noexcept { if (!pSource || size == 0) return E_INVALIDARG; @@ -1909,30 +1889,21 @@ HRESULT DirectX::GetMetadataFromDDSMemoryEx( return DecodeDDSHeader(pSource, size, flags, metadata, ddPixelFormat, convFlags); } -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromDDSFile( - const wchar_t* szFile, - DDS_FLAGS flags, - TexMetadata& metadata) noexcept +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromDDSFile(const wchar_t* szFile, DDS_FLAGS flags, TexMetadata& metadata) noexcept { return GetMetadataFromDDSFileEx(szFile, flags, metadata, nullptr); } -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromDDSFileEx( - const wchar_t* szFile, - DDS_FLAGS flags, - TexMetadata& metadata, - DDSMetaData* ddPixelFormat) noexcept +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromDDSFileEx(const wchar_t* szFile, + DDS_FLAGS flags, + TexMetadata& metadata, + DDSMetaData* ddPixelFormat) noexcept { if (!szFile) return E_INVALIDARG; #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -2000,38 +1971,30 @@ HRESULT DirectX::GetMetadataFromDDSFileEx( return DecodeDDSHeader(header, headerLen, flags, metadata, ddPixelFormat, convFlags); } - //------------------------------------------------------------------------------------- // Load a DDS file in memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromDDSMemory( - const uint8_t* pSource, - size_t size, - DDS_FLAGS flags, - TexMetadata* metadata, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT +DirectX::LoadFromDDSMemory(const uint8_t* pSource, size_t size, DDS_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept { return LoadFromDDSMemoryEx(pSource, size, flags, metadata, nullptr, image); } -_Use_decl_annotations_ -HRESULT DirectX::LoadFromDDSMemoryEx( - const uint8_t* pSource, - size_t size, - DDS_FLAGS flags, - TexMetadata* metadata, - DDSMetaData* ddPixelFormat, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadFromDDSMemoryEx(const uint8_t* pSource, + size_t size, + DDS_FLAGS flags, + TexMetadata* metadata, + DDSMetaData* ddPixelFormat, + ScratchImage& image) noexcept { if (!pSource || size == 0) return E_INVALIDARG; image.Release(); - uint32_t convFlags = 0; + uint32_t convFlags = 0; TexMetadata mdata; - HRESULT hr = DecodeDDSHeader(pSource, size, flags, mdata, ddPixelFormat, convFlags); + HRESULT hr = DecodeDDSHeader(pSource, size, flags, mdata, ddPixelFormat, convFlags); if (FAILED(hr)) return hr; @@ -2041,7 +2004,7 @@ HRESULT DirectX::LoadFromDDSMemoryEx( assert(offset <= size); - const uint32_t *pal8 = nullptr; + const uint32_t* pal8 = nullptr; if (convFlags & CONV_FLAGS_PAL8) { pal8 = reinterpret_cast(static_cast(pSource) + offset); @@ -2063,13 +2026,11 @@ HRESULT DirectX::LoadFromDDSMemoryEx( { // For cubemaps, DDS_HEADER_DXT10.arraySize is supposed to be 'number of cubes'. // This handles cases where the value is incorrectly written as the original 6*numCubes value. - if ((mdata.miscFlags & TEX_MISC_TEXTURECUBE) - && (convFlags & CONV_FLAGS_DX10) - && (image.GetPixelsSize() > remaining) + if ((mdata.miscFlags & TEX_MISC_TEXTURECUBE) && (convFlags & CONV_FLAGS_DX10) && (image.GetPixelsSize() > remaining) && ((mdata.arraySize % 6) == 0)) { mdata.arraySize = mdata.arraySize / 6; - hr = image.Initialize(mdata); + hr = image.Initialize(mdata); if (FAILED(hr)) return hr; @@ -2093,13 +2054,7 @@ HRESULT DirectX::LoadFromDDSMemoryEx( const void* pPixels = static_cast(pSource) + offset; assert(pPixels); - hr = CopyImage(pPixels, - size - offset, - mdata, - cflags, - convFlags, - pal8, - image); + hr = CopyImage(pPixels, size - offset, mdata, cflags, convFlags, pal8, image); if (FAILED(hr)) { image.Release(); @@ -2111,27 +2066,22 @@ HRESULT DirectX::LoadFromDDSMemoryEx( return S_OK; } - //------------------------------------------------------------------------------------- // Load a DDS file from disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromDDSFile( - const wchar_t* szFile, - DDS_FLAGS flags, - TexMetadata* metadata, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadFromDDSFile(const wchar_t* szFile, + DDS_FLAGS flags, + TexMetadata* metadata, + ScratchImage& image) noexcept { return LoadFromDDSFileEx(szFile, flags, metadata, nullptr, image); } -_Use_decl_annotations_ -HRESULT DirectX::LoadFromDDSFileEx( - const wchar_t* szFile, - DDS_FLAGS flags, - TexMetadata* metadata, - DDSMetaData* ddPixelFormat, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadFromDDSFileEx(const wchar_t* szFile, + DDS_FLAGS flags, + TexMetadata* metadata, + DDSMetaData* ddPixelFormat, + ScratchImage& image) noexcept { if (!szFile) return E_INVALIDARG; @@ -2139,10 +2089,7 @@ HRESULT DirectX::LoadFromDDSFileEx( image.Release(); #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -2204,9 +2151,9 @@ HRESULT DirectX::LoadFromDDSFileEx( return E_FAIL; #endif - uint32_t convFlags = 0; + uint32_t convFlags = 0; TexMetadata mdata; - HRESULT hr = DecodeDDSHeader(header, headerLen, flags, mdata, ddPixelFormat, convFlags); + HRESULT hr = DecodeDDSHeader(header, headerLen, flags, mdata, ddPixelFormat, convFlags); if (FAILED(hr)) return hr; @@ -2214,18 +2161,18 @@ HRESULT DirectX::LoadFromDDSFileEx( if (!(convFlags & CONV_FLAGS_DX10)) { - #ifdef _WIN32 - // Must reset file position since we read more than the standard header above +#ifdef _WIN32 + // Must reset file position since we read more than the standard header above const LARGE_INTEGER filePos = { { DDS_MIN_HEADER_SIZE, 0 } }; if (!SetFilePointerEx(hFile.get(), filePos, nullptr, FILE_BEGIN)) { return HRESULT_FROM_WIN32(GetLastError()); } - #else +#else inFile.seekg(DDS_MIN_HEADER_SIZE, std::ios::beg); if (!inFile) return E_FAIL; - #endif +#endif offset = DDS_MIN_HEADER_SIZE; } @@ -2239,7 +2186,7 @@ HRESULT DirectX::LoadFromDDSFileEx( return E_OUTOFMEMORY; } - #ifdef _WIN32 +#ifdef _WIN32 if (!ReadFile(hFile.get(), pal8.get(), 256 * sizeof(uint32_t), &bytesRead, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); @@ -2249,11 +2196,11 @@ HRESULT DirectX::LoadFromDDSFileEx( { return E_FAIL; } - #else +#else inFile.read(reinterpret_cast(pal8.get()), 256 * sizeof(uint32_t)); if (!inFile) return E_FAIL; - #endif +#endif offset += (256 * sizeof(uint32_t)); } @@ -2270,13 +2217,11 @@ HRESULT DirectX::LoadFromDDSFileEx( { // For cubemaps, DDS_HEADER_DXT10.arraySize is supposed to be 'number of cubes'. // This handles cases where the value is incorrectly written as the original 6*numCubes value. - if ((mdata.miscFlags & TEX_MISC_TEXTURECUBE) - && (convFlags & CONV_FLAGS_DX10) - && (image.GetPixelsSize() > remaining) + if ((mdata.miscFlags & TEX_MISC_TEXTURECUBE) && (convFlags & CONV_FLAGS_DX10) && (image.GetPixelsSize() > remaining) && ((mdata.arraySize % 6) == 0)) { mdata.arraySize = mdata.arraySize / 6; - hr = image.Initialize(mdata); + hr = image.Initialize(mdata); if (FAILED(hr)) return hr; @@ -2297,7 +2242,7 @@ HRESULT DirectX::LoadFromDDSFileEx( return E_OUTOFMEMORY; } - #ifdef _WIN32 +#ifdef _WIN32 if (!ReadFile(hFile.get(), temp.get(), static_cast(remaining), &bytesRead, nullptr)) { image.Release(); @@ -2309,14 +2254,14 @@ HRESULT DirectX::LoadFromDDSFileEx( image.Release(); return E_FAIL; } - #else +#else inFile.read(reinterpret_cast(temp.get()), remaining); if (!inFile) { image.Release(); return E_FAIL; } - #endif +#endif CP_FLAGS cflags = CP_FLAGS_NONE; if (flags & DDS_FLAGS_LEGACY_DWORD) @@ -2328,13 +2273,7 @@ HRESULT DirectX::LoadFromDDSFileEx( cflags |= CP_FLAGS_BAD_DXTN_TAILS; } - hr = CopyImage(temp.get(), - remaining, - mdata, - cflags, - convFlags, - pal8.get(), - image); + hr = CopyImage(temp.get(), remaining, mdata, cflags, convFlags, pal8.get(), image); if (FAILED(hr)) { image.Release(); @@ -2355,7 +2294,7 @@ HRESULT DirectX::LoadFromDDSFileEx( return HRESULT_E_ARITHMETIC_OVERFLOW; } - #ifdef _WIN32 +#ifdef _WIN32 const auto pixelBytes = static_cast(image.GetPixelsSize()); if (!ReadFile(hFile.get(), image.GetPixels(), pixelBytes, &bytesRead, nullptr)) { @@ -2368,14 +2307,14 @@ HRESULT DirectX::LoadFromDDSFileEx( image.Release(); return E_FAIL; } - #else +#else inFile.read(reinterpret_cast(image.GetPixels()), image.GetPixelsSize()); if (!inFile) { image.Release(); return E_FAIL; } - #endif +#endif if (convFlags & (CONV_FLAGS_SWIZZLE | CONV_FLAGS_NOALPHA | CONV_FLAGS_L8U8V8 | CONV_FLAGS_WUV10)) { @@ -2395,31 +2334,25 @@ HRESULT DirectX::LoadFromDDSFileEx( return S_OK; } - //------------------------------------------------------------------------------------- // Save a DDS file to memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveToDDSMemory( - const Image* images, - size_t nimages, - const TexMetadata& metadata, - DDS_FLAGS flags, - Blob& blob) noexcept +_Use_decl_annotations_ HRESULT +DirectX::SaveToDDSMemory(const Image* images, size_t nimages, const TexMetadata& metadata, DDS_FLAGS flags, Blob& blob) noexcept { if (!images || (nimages == 0)) return E_INVALIDARG; // Determine memory required - size_t required = 0; - HRESULT hr = EncodeDDSHeader(metadata, flags, nullptr, 0, required); + size_t required = 0; + HRESULT hr = EncodeDDSHeader(metadata, flags, nullptr, 0, required); if (FAILED(hr)) return hr; - bool fastpath = true; - const bool use24bpp = ((metadata.format == DXGI_FORMAT_B8G8R8X8_UNORM) - && (flags & DDS_FLAGS_FORCE_24BPP_RGB) - && !(flags & (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2))) != 0; + bool fastpath = true; + const bool use24bpp = ((metadata.format == DXGI_FORMAT_B8G8R8X8_UNORM) && (flags & DDS_FLAGS_FORCE_24BPP_RGB) + && !(flags & (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2))) + != 0; for (size_t i = 0; i < nimages; ++i) { @@ -2431,8 +2364,10 @@ HRESULT DirectX::SaveToDDSMemory( size_t ddsRowPitch, ddsSlicePitch; hr = ComputePitch(metadata.format, - images[i].width, images[i].height, - ddsRowPitch, ddsSlicePitch, + images[i].width, + images[i].height, + ddsRowPitch, + ddsSlicePitch, (use24bpp) ? CP_FLAGS_24BPP : CP_FLAGS_NONE); if (FAILED(hr)) return hr; @@ -2478,248 +2413,256 @@ HRESULT DirectX::SaveToDDSMemory( switch (static_cast(metadata.dimension)) { case DDS_DIMENSION_TEXTURE1D: - case DDS_DIMENSION_TEXTURE2D: + case DDS_DIMENSION_TEXTURE2D: { + size_t index = 0; + for (size_t item = 0; item < metadata.arraySize; ++item) { - size_t index = 0; - for (size_t item = 0; item < metadata.arraySize; ++item) + for (size_t level = 0; level < metadata.mipLevels; ++level) { - for (size_t level = 0; level < metadata.mipLevels; ++level) + if (index >= nimages) { - if (index >= nimages) + blob.Release(); + return E_FAIL; + } + + if (fastpath) + { + size_t pixsize = images[index].slicePitch; + memcpy(pDestination, images[index].pixels, pixsize); + + pDestination += pixsize; + remaining -= pixsize; + } + else if (use24bpp) + { + size_t ddsRowPitch, ddsSlicePitch; + hr = ComputePitch(metadata.format, + images[index].width, + images[index].height, + ddsRowPitch, + ddsSlicePitch, + CP_FLAGS_24BPP); + if (FAILED(hr)) { blob.Release(); - return E_FAIL; + return hr; } - if (fastpath) - { - size_t pixsize = images[index].slicePitch; - memcpy(pDestination, images[index].pixels, pixsize); + const size_t rowPitch = images[index].rowPitch; + const uint8_t* __restrict sPtr = images[index].pixels; + uint8_t* __restrict dPtr = pDestination; - pDestination += pixsize; - remaining -= pixsize; - } - else if (use24bpp) + const size_t csize = std::min(metadata.width * 3, ddsRowPitch); + size_t tremaining = remaining; + for (size_t j = 0; j < images[index].height; ++j) { - size_t ddsRowPitch, ddsSlicePitch; - hr = ComputePitch(metadata.format, images[index].width, images[index].height, ddsRowPitch, ddsSlicePitch, CP_FLAGS_24BPP); - if (FAILED(hr)) + if (tremaining < csize) { blob.Release(); - return hr; + return E_FAIL; } - const size_t rowPitch = images[index].rowPitch; - const uint8_t * __restrict sPtr = images[index].pixels; - uint8_t * __restrict dPtr = pDestination; + CopyScanline24bpp(dPtr, sPtr, images[index].width); - const size_t csize = std::min(metadata.width * 3, ddsRowPitch); - size_t tremaining = remaining; - for (size_t j = 0; j < images[index].height; ++j) - { - if (tremaining < csize) - { - blob.Release(); - return E_FAIL; - } + sPtr += rowPitch; + dPtr += ddsRowPitch; + tremaining -= ddsRowPitch; + } + + pDestination += ddsSlicePitch; + remaining -= ddsSlicePitch; + } + else + { + size_t ddsRowPitch, ddsSlicePitch; + hr = ComputePitch(metadata.format, + images[index].width, + images[index].height, + ddsRowPitch, + ddsSlicePitch, + CP_FLAGS_NONE); + if (FAILED(hr)) + { + blob.Release(); + return hr; + } - CopyScanline24bpp(dPtr, sPtr, images[index].width); + const size_t rowPitch = images[index].rowPitch; - sPtr += rowPitch; - dPtr += ddsRowPitch; - tremaining -= ddsRowPitch; - } + const uint8_t* __restrict sPtr = images[index].pixels; + uint8_t* __restrict dPtr = pDestination; - pDestination += ddsSlicePitch; - remaining -= ddsSlicePitch; - } - else + const size_t lines = ComputeScanlines(metadata.format, images[index].height); + const size_t csize = std::min(rowPitch, ddsRowPitch); + size_t tremaining = remaining; + for (size_t j = 0; j < lines; ++j) { - size_t ddsRowPitch, ddsSlicePitch; - hr = ComputePitch(metadata.format, images[index].width, images[index].height, ddsRowPitch, ddsSlicePitch, CP_FLAGS_NONE); - if (FAILED(hr)) + if (tremaining < csize) { blob.Release(); - return hr; + return E_FAIL; } - const size_t rowPitch = images[index].rowPitch; - - const uint8_t * __restrict sPtr = images[index].pixels; - uint8_t * __restrict dPtr = pDestination; - - const size_t lines = ComputeScanlines(metadata.format, images[index].height); - const size_t csize = std::min(rowPitch, ddsRowPitch); - size_t tremaining = remaining; - for (size_t j = 0; j < lines; ++j) - { - if (tremaining < csize) - { - blob.Release(); - return E_FAIL; - } - - memcpy(dPtr, sPtr, csize); - - sPtr += rowPitch; - dPtr += ddsRowPitch; - tremaining -= ddsRowPitch; - } + memcpy(dPtr, sPtr, csize); - pDestination += ddsSlicePitch; - remaining -= ddsSlicePitch; + sPtr += rowPitch; + dPtr += ddsRowPitch; + tremaining -= ddsRowPitch; } - ++index; + pDestination += ddsSlicePitch; + remaining -= ddsSlicePitch; } + + ++index; } } - break; + } + break; - case DDS_DIMENSION_TEXTURE3D: + case DDS_DIMENSION_TEXTURE3D: { + if (metadata.arraySize != 1) { - if (metadata.arraySize != 1) - { - blob.Release(); - return E_FAIL; - } + blob.Release(); + return E_FAIL; + } - size_t d = metadata.depth; + size_t d = metadata.depth; - size_t index = 0; - for (size_t level = 0; level < metadata.mipLevels; ++level) + size_t index = 0; + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + for (size_t slice = 0; slice < d; ++slice) { - for (size_t slice = 0; slice < d; ++slice) + if (index >= nimages) { - if (index >= nimages) + blob.Release(); + return E_FAIL; + } + + if (fastpath) + { + size_t pixsize = images[index].slicePitch; + memcpy(pDestination, images[index].pixels, pixsize); + + pDestination += pixsize; + remaining -= pixsize; + } + else if (use24bpp) + { + size_t ddsRowPitch, ddsSlicePitch; + hr = ComputePitch(metadata.format, + images[index].width, + images[index].height, + ddsRowPitch, + ddsSlicePitch, + CP_FLAGS_24BPP); + if (FAILED(hr)) { blob.Release(); - return E_FAIL; + return hr; } - if (fastpath) - { - size_t pixsize = images[index].slicePitch; - memcpy(pDestination, images[index].pixels, pixsize); + const size_t rowPitch = images[index].rowPitch; + const uint8_t* __restrict sPtr = images[index].pixels; + uint8_t* __restrict dPtr = pDestination; - pDestination += pixsize; - remaining -= pixsize; - } - else if (use24bpp) + const size_t csize = std::min(metadata.width * 3, ddsRowPitch); + size_t tremaining = remaining; + for (size_t j = 0; j < images[index].height; ++j) { - size_t ddsRowPitch, ddsSlicePitch; - hr = ComputePitch(metadata.format, images[index].width, images[index].height, ddsRowPitch, ddsSlicePitch, CP_FLAGS_24BPP); - if (FAILED(hr)) + if (tremaining < csize) { blob.Release(); - return hr; + return E_FAIL; } - const size_t rowPitch = images[index].rowPitch; - const uint8_t * __restrict sPtr = images[index].pixels; - uint8_t * __restrict dPtr = pDestination; + CopyScanline24bpp(dPtr, sPtr, images[index].width); - const size_t csize = std::min(metadata.width * 3, ddsRowPitch); - size_t tremaining = remaining; - for (size_t j = 0; j < images[index].height; ++j) - { - if (tremaining < csize) - { - blob.Release(); - return E_FAIL; - } + sPtr += rowPitch; + dPtr += ddsRowPitch; + tremaining -= ddsRowPitch; + } - CopyScanline24bpp(dPtr, sPtr, images[index].width); + pDestination += ddsSlicePitch; + remaining -= ddsSlicePitch; + } + else + { + size_t ddsRowPitch, ddsSlicePitch; + hr = ComputePitch(metadata.format, + images[index].width, + images[index].height, + ddsRowPitch, + ddsSlicePitch, + CP_FLAGS_NONE); + if (FAILED(hr)) + { + blob.Release(); + return hr; + } - sPtr += rowPitch; - dPtr += ddsRowPitch; - tremaining -= ddsRowPitch; - } + const size_t rowPitch = images[index].rowPitch; - pDestination += ddsSlicePitch; - remaining -= ddsSlicePitch; - } - else + const uint8_t* __restrict sPtr = images[index].pixels; + uint8_t* __restrict dPtr = pDestination; + + const size_t lines = ComputeScanlines(metadata.format, images[index].height); + const size_t csize = std::min(rowPitch, ddsRowPitch); + size_t tremaining = remaining; + for (size_t j = 0; j < lines; ++j) { - size_t ddsRowPitch, ddsSlicePitch; - hr = ComputePitch(metadata.format, images[index].width, images[index].height, ddsRowPitch, ddsSlicePitch, CP_FLAGS_NONE); - if (FAILED(hr)) + if (tremaining < csize) { blob.Release(); - return hr; + return E_FAIL; } - const size_t rowPitch = images[index].rowPitch; + memcpy(dPtr, sPtr, csize); - const uint8_t * __restrict sPtr = images[index].pixels; - uint8_t * __restrict dPtr = pDestination; - - const size_t lines = ComputeScanlines(metadata.format, images[index].height); - const size_t csize = std::min(rowPitch, ddsRowPitch); - size_t tremaining = remaining; - for (size_t j = 0; j < lines; ++j) - { - if (tremaining < csize) - { - blob.Release(); - return E_FAIL; - } - - memcpy(dPtr, sPtr, csize); - - sPtr += rowPitch; - dPtr += ddsRowPitch; - tremaining -= ddsRowPitch; - } - - pDestination += ddsSlicePitch; - remaining -= ddsSlicePitch; + sPtr += rowPitch; + dPtr += ddsRowPitch; + tremaining -= ddsRowPitch; } - ++index; + pDestination += ddsSlicePitch; + remaining -= ddsSlicePitch; } - if (d > 1) - d >>= 1; + ++index; } + + if (d > 1) + d >>= 1; } - break; + } + break; - default: - blob.Release(); - return E_FAIL; + default: blob.Release(); return E_FAIL; } return S_OK; } - //------------------------------------------------------------------------------------- // Save a DDS file to disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveToDDSFile( - const Image* images, - size_t nimages, - const TexMetadata& metadata, - DDS_FLAGS flags, - const wchar_t* szFile) noexcept +_Use_decl_annotations_ HRESULT +DirectX::SaveToDDSFile(const Image* images, size_t nimages, const TexMetadata& metadata, DDS_FLAGS flags, const wchar_t* szFile) noexcept { if (!szFile) return E_INVALIDARG; // Create DDS Header uint8_t header[DDS_DX10_HEADER_SIZE]; - size_t required; + size_t required; HRESULT hr = EncodeDDSHeader(metadata, flags, header, DDS_DX10_HEADER_SIZE, required); if (FAILED(hr)) return hr; // Create file and write header #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -2747,9 +2690,9 @@ HRESULT DirectX::SaveToDDSFile( return E_FAIL; #endif - const bool use24bpp = ((metadata.format == DXGI_FORMAT_B8G8R8X8_UNORM) - && (flags & DDS_FLAGS_FORCE_24BPP_RGB) - && !(flags & (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2))) != 0; + const bool use24bpp = ((metadata.format == DXGI_FORMAT_B8G8R8X8_UNORM) && (flags & DDS_FLAGS_FORCE_24BPP_RGB) + && !(flags & (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2))) + != 0; std::unique_ptr tempRow; if (use24bpp) @@ -2771,238 +2714,239 @@ HRESULT DirectX::SaveToDDSFile( switch (static_cast(metadata.dimension)) { case DDS_DIMENSION_TEXTURE1D: - case DDS_DIMENSION_TEXTURE2D: + case DDS_DIMENSION_TEXTURE2D: { + size_t index = 0; + for (size_t item = 0; item < metadata.arraySize; ++item) { - size_t index = 0; - for (size_t item = 0; item < metadata.arraySize; ++item) + for (size_t level = 0; level < metadata.mipLevels; ++level, ++index) { - for (size_t level = 0; level < metadata.mipLevels; ++level, ++index) + if (index >= nimages) + return E_FAIL; + + if (!images[index].pixels) + return E_POINTER; + + assert(images[index].rowPitch > 0); + assert(images[index].slicePitch > 0); + + size_t ddsRowPitch, ddsSlicePitch; + hr = ComputePitch(metadata.format, + images[index].width, + images[index].height, + ddsRowPitch, + ddsSlicePitch, + (use24bpp) ? CP_FLAGS_24BPP : CP_FLAGS_NONE); + if (FAILED(hr)) + return hr; + + if ((images[index].slicePitch == ddsSlicePitch) && (ddsSlicePitch <= UINT32_MAX)) { - if (index >= nimages) - return E_FAIL; - - if (!images[index].pixels) - return E_POINTER; - - assert(images[index].rowPitch > 0); - assert(images[index].slicePitch > 0); +#ifdef _WIN32 + if (!WriteFile(hFile.get(), images[index].pixels, static_cast(ddsSlicePitch), &bytesWritten, nullptr)) + { + return HRESULT_FROM_WIN32(GetLastError()); + } - size_t ddsRowPitch, ddsSlicePitch; - hr = ComputePitch(metadata.format, - images[index].width, images[index].height, - ddsRowPitch, ddsSlicePitch, - (use24bpp) ? CP_FLAGS_24BPP : CP_FLAGS_NONE); - if (FAILED(hr)) - return hr; + if (bytesWritten != ddsSlicePitch) + { + return E_FAIL; + } +#else + outFile.write(reinterpret_cast(images[index].pixels), static_cast(ddsSlicePitch)); + if (!outFile) + return E_FAIL; +#endif + } + else if (use24bpp) + { + const size_t rowPitch = images[index].rowPitch; + const uint8_t* __restrict sPtr = images[index].pixels; - if ((images[index].slicePitch == ddsSlicePitch) && (ddsSlicePitch <= UINT32_MAX)) + assert(ddsRowPitch <= metadata.width * 3u); + for (size_t j = 0; j < images[index].height; ++j) { - #ifdef _WIN32 - if (!WriteFile(hFile.get(), images[index].pixels, static_cast(ddsSlicePitch), &bytesWritten, nullptr)) + CopyScanline24bpp(tempRow.get(), sPtr, images[index].width); + +#ifdef _WIN32 + if (!WriteFile(hFile.get(), tempRow.get(), static_cast(ddsRowPitch), &bytesWritten, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); } - if (bytesWritten != ddsSlicePitch) + if (bytesWritten != ddsRowPitch) { return E_FAIL; } - #else - outFile.write(reinterpret_cast(images[index].pixels), static_cast(ddsSlicePitch)); +#else + outFile.write(reinterpret_cast(tempRow.get()), static_cast(ddsRowPitch)); if (!outFile) return E_FAIL; - #endif +#endif + + sPtr += rowPitch; } - else if (use24bpp) + } + else + { + const size_t rowPitch = images[index].rowPitch; + if (rowPitch < ddsRowPitch) { - const size_t rowPitch = images[index].rowPitch; - const uint8_t * __restrict sPtr = images[index].pixels; - - assert(ddsRowPitch <= metadata.width * 3u); - for (size_t j = 0; j < images[index].height; ++j) - { - CopyScanline24bpp(tempRow.get(), sPtr, images[index].width); + // DDS uses 1-byte alignment, so if this is happening then the input pitch isn't actually a full line of data + return E_FAIL; + } - #ifdef _WIN32 - if (!WriteFile(hFile.get(), tempRow.get(), static_cast(ddsRowPitch), &bytesWritten, nullptr)) - { - return HRESULT_FROM_WIN32(GetLastError()); - } + if (ddsRowPitch > UINT32_MAX) + return HRESULT_E_ARITHMETIC_OVERFLOW; - if (bytesWritten != ddsRowPitch) - { - return E_FAIL; - } - #else - outFile.write(reinterpret_cast(tempRow.get()), static_cast(ddsRowPitch)); - if (!outFile) - return E_FAIL; - #endif + const uint8_t* __restrict sPtr = images[index].pixels; - sPtr += rowPitch; - } - } - else + const size_t lines = ComputeScanlines(metadata.format, images[index].height); + for (size_t j = 0; j < lines; ++j) { - const size_t rowPitch = images[index].rowPitch; - if (rowPitch < ddsRowPitch) +#ifdef _WIN32 + if (!WriteFile(hFile.get(), sPtr, static_cast(ddsRowPitch), &bytesWritten, nullptr)) { - // DDS uses 1-byte alignment, so if this is happening then the input pitch isn't actually a full line of data - return E_FAIL; + return HRESULT_FROM_WIN32(GetLastError()); } - if (ddsRowPitch > UINT32_MAX) - return HRESULT_E_ARITHMETIC_OVERFLOW; - - const uint8_t * __restrict sPtr = images[index].pixels; - - const size_t lines = ComputeScanlines(metadata.format, images[index].height); - for (size_t j = 0; j < lines; ++j) + if (bytesWritten != ddsRowPitch) { - #ifdef _WIN32 - if (!WriteFile(hFile.get(), sPtr, static_cast(ddsRowPitch), &bytesWritten, nullptr)) - { - return HRESULT_FROM_WIN32(GetLastError()); - } - - if (bytesWritten != ddsRowPitch) - { - return E_FAIL; - } - #else - outFile.write(reinterpret_cast(sPtr), static_cast(ddsRowPitch)); - if (!outFile) - return E_FAIL; - #endif - - sPtr += rowPitch; + return E_FAIL; } +#else + outFile.write(reinterpret_cast(sPtr), static_cast(ddsRowPitch)); + if (!outFile) + return E_FAIL; +#endif + + sPtr += rowPitch; } } } } - break; + } + break; - case DDS_DIMENSION_TEXTURE3D: - { - if (metadata.arraySize != 1) - return E_FAIL; + case DDS_DIMENSION_TEXTURE3D: { + if (metadata.arraySize != 1) + return E_FAIL; - size_t d = metadata.depth; + size_t d = metadata.depth; - size_t index = 0; - for (size_t level = 0; level < metadata.mipLevels; ++level) + size_t index = 0; + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + for (size_t slice = 0; slice < d; ++slice, ++index) { - for (size_t slice = 0; slice < d; ++slice, ++index) + if (index >= nimages) + return E_FAIL; + + if (!images[index].pixels) + return E_POINTER; + + assert(images[index].rowPitch > 0); + assert(images[index].slicePitch > 0); + + size_t ddsRowPitch, ddsSlicePitch; + hr = ComputePitch(metadata.format, + images[index].width, + images[index].height, + ddsRowPitch, + ddsSlicePitch, + (use24bpp) ? CP_FLAGS_24BPP : CP_FLAGS_NONE); + if (FAILED(hr)) + return hr; + + if ((images[index].slicePitch == ddsSlicePitch) && (ddsSlicePitch <= UINT32_MAX)) { - if (index >= nimages) - return E_FAIL; - - if (!images[index].pixels) - return E_POINTER; - - assert(images[index].rowPitch > 0); - assert(images[index].slicePitch > 0); +#ifdef _WIN32 + if (!WriteFile(hFile.get(), images[index].pixels, static_cast(ddsSlicePitch), &bytesWritten, nullptr)) + { + return HRESULT_FROM_WIN32(GetLastError()); + } - size_t ddsRowPitch, ddsSlicePitch; - hr = ComputePitch(metadata.format, - images[index].width, images[index].height, - ddsRowPitch, ddsSlicePitch, - (use24bpp) ? CP_FLAGS_24BPP : CP_FLAGS_NONE); - if (FAILED(hr)) - return hr; + if (bytesWritten != ddsSlicePitch) + { + return E_FAIL; + } +#else + outFile.write(reinterpret_cast(images[index].pixels), static_cast(ddsSlicePitch)); + if (!outFile) + return E_FAIL; +#endif + } + else if (use24bpp) + { + const size_t rowPitch = images[index].rowPitch; + const uint8_t* __restrict sPtr = images[index].pixels; - if ((images[index].slicePitch == ddsSlicePitch) && (ddsSlicePitch <= UINT32_MAX)) + assert(ddsRowPitch <= metadata.width * 3u); + for (size_t j = 0; j < images[index].height; ++j) { - #ifdef _WIN32 - if (!WriteFile(hFile.get(), images[index].pixels, static_cast(ddsSlicePitch), &bytesWritten, nullptr)) + CopyScanline24bpp(tempRow.get(), sPtr, images[index].width); + +#ifdef _WIN32 + if (!WriteFile(hFile.get(), tempRow.get(), static_cast(ddsRowPitch), &bytesWritten, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); } - if (bytesWritten != ddsSlicePitch) + if (bytesWritten != ddsRowPitch) { return E_FAIL; } - #else - outFile.write(reinterpret_cast(images[index].pixels), static_cast(ddsSlicePitch)); +#else + outFile.write(reinterpret_cast(tempRow.get()), static_cast(ddsRowPitch)); if (!outFile) return E_FAIL; - #endif +#endif + sPtr += rowPitch; } - else if (use24bpp) + } + else + { + const size_t rowPitch = images[index].rowPitch; + if (rowPitch < ddsRowPitch) { - const size_t rowPitch = images[index].rowPitch; - const uint8_t * __restrict sPtr = images[index].pixels; + // DDS uses 1-byte alignment, so if this is happening then the input pitch isn't actually a full line of data + return E_FAIL; + } - assert(ddsRowPitch <= metadata.width * 3u); - for (size_t j = 0; j < images[index].height; ++j) - { - CopyScanline24bpp(tempRow.get(), sPtr, images[index].width); + if (ddsRowPitch > UINT32_MAX) + return HRESULT_E_ARITHMETIC_OVERFLOW; - #ifdef _WIN32 - if (!WriteFile(hFile.get(), tempRow.get(), static_cast(ddsRowPitch), &bytesWritten, nullptr)) - { - return HRESULT_FROM_WIN32(GetLastError()); - } + const uint8_t* __restrict sPtr = images[index].pixels; - if (bytesWritten != ddsRowPitch) - { - return E_FAIL; - } - #else - outFile.write(reinterpret_cast(tempRow.get()), static_cast(ddsRowPitch)); - if (!outFile) - return E_FAIL; - #endif - sPtr += rowPitch; - } - } - else + const size_t lines = ComputeScanlines(metadata.format, images[index].height); + for (size_t j = 0; j < lines; ++j) { - const size_t rowPitch = images[index].rowPitch; - if (rowPitch < ddsRowPitch) +#ifdef _WIN32 + if (!WriteFile(hFile.get(), sPtr, static_cast(ddsRowPitch), &bytesWritten, nullptr)) { - // DDS uses 1-byte alignment, so if this is happening then the input pitch isn't actually a full line of data - return E_FAIL; + return HRESULT_FROM_WIN32(GetLastError()); } - if (ddsRowPitch > UINT32_MAX) - return HRESULT_E_ARITHMETIC_OVERFLOW; - - const uint8_t * __restrict sPtr = images[index].pixels; - - const size_t lines = ComputeScanlines(metadata.format, images[index].height); - for (size_t j = 0; j < lines; ++j) + if (bytesWritten != ddsRowPitch) { - #ifdef _WIN32 - if (!WriteFile(hFile.get(), sPtr, static_cast(ddsRowPitch), &bytesWritten, nullptr)) - { - return HRESULT_FROM_WIN32(GetLastError()); - } - - if (bytesWritten != ddsRowPitch) - { - return E_FAIL; - } - #else - outFile.write(reinterpret_cast(sPtr), static_cast(ddsRowPitch)); - if (!outFile) - return E_FAIL; - #endif - sPtr += rowPitch; + return E_FAIL; } +#else + outFile.write(reinterpret_cast(sPtr), static_cast(ddsRowPitch)); + if (!outFile) + return E_FAIL; +#endif + sPtr += rowPitch; } } - - if (d > 1) - d >>= 1; } + + if (d > 1) + d >>= 1; } - break; + } + break; - default: - return E_FAIL; + default: return E_FAIL; } #ifdef _WIN32 @@ -3012,7 +2956,6 @@ HRESULT DirectX::SaveToDDSFile( return S_OK; } - //-------------------------------------------------------------------------------------- // Adapters for /Zc:wchar_t- clients @@ -3020,59 +2963,49 @@ HRESULT DirectX::SaveToDDSFile( namespace DirectX { - HRESULT __cdecl GetMetadataFromDDSFile( - _In_z_ const __wchar_t* szFile, - _In_ DDS_FLAGS flags, - _Out_ TexMetadata& metadata) noexcept + HRESULT __cdecl GetMetadataFromDDSFile(_In_z_ const __wchar_t* szFile, _In_ DDS_FLAGS flags, _Out_ TexMetadata& metadata) noexcept { return GetMetadataFromDDSFile(reinterpret_cast(szFile), flags, metadata); } - HRESULT __cdecl GetMetadataFromDDSFileEx( - _In_z_ const __wchar_t* szFile, - _In_ DDS_FLAGS flags, - _Out_ TexMetadata& metadata, - _Out_opt_ DDSMetaData* ddPixelFormat) noexcept + HRESULT __cdecl GetMetadataFromDDSFileEx(_In_z_ const __wchar_t* szFile, + _In_ DDS_FLAGS flags, + _Out_ TexMetadata& metadata, + _Out_opt_ DDSMetaData* ddPixelFormat) noexcept { return GetMetadataFromDDSFileEx(reinterpret_cast(szFile), flags, metadata, ddPixelFormat); } - HRESULT __cdecl LoadFromDDSFile( - _In_z_ const __wchar_t* szFile, - _In_ DDS_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) noexcept + HRESULT __cdecl LoadFromDDSFile(_In_z_ const __wchar_t* szFile, + _In_ DDS_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept { return LoadFromDDSFile(reinterpret_cast(szFile), flags, metadata, image); } - HRESULT __cdecl LoadFromDDSFileEx( - _In_z_ const __wchar_t* szFile, - _In_ DDS_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_opt_ DDSMetaData* ddPixelFormat, - _Out_ ScratchImage& image) noexcept + HRESULT __cdecl LoadFromDDSFileEx(_In_z_ const __wchar_t* szFile, + _In_ DDS_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_opt_ DDSMetaData* ddPixelFormat, + _Out_ ScratchImage& image) noexcept { return LoadFromDDSFileEx(reinterpret_cast(szFile), flags, metadata, ddPixelFormat, image); } - HRESULT __cdecl SaveToDDSFile( - _In_ const Image& image, - _In_ DDS_FLAGS flags, - _In_z_ const __wchar_t* szFile) noexcept + HRESULT __cdecl SaveToDDSFile(_In_ const Image& image, _In_ DDS_FLAGS flags, _In_z_ const __wchar_t* szFile) noexcept { return SaveToDDSFile(image, flags, reinterpret_cast(szFile)); } - HRESULT __cdecl SaveToDDSFile( - _In_reads_(nimages) const Image* images, - _In_ size_t nimages, - _In_ const TexMetadata& metadata, - _In_ DDS_FLAGS flags, - _In_z_ const __wchar_t* szFile) noexcept + HRESULT __cdecl SaveToDDSFile(_In_reads_(nimages) const Image* images, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DDS_FLAGS flags, + _In_z_ const __wchar_t* szFile) noexcept { return SaveToDDSFile(images, nimages, metadata, flags, reinterpret_cast(szFile)); } -} +} // namespace DirectX #endif // !_NATIVE_WCHAR_T_DEFINED diff --git a/DirectXTex/DirectXTexFlipRotate.cpp b/DirectXTex/DirectXTexFlipRotate.cpp index cef81a34..07e0757c 100644 --- a/DirectXTex/DirectXTexFlipRotate.cpp +++ b/DirectXTex/DirectXTexFlipRotate.cpp @@ -20,11 +20,8 @@ namespace //------------------------------------------------------------------------------------- // Do flip/rotate operation using WIC //------------------------------------------------------------------------------------- - HRESULT PerformFlipRotateUsingWIC( - const Image& srcImage, - TEX_FR_FLAGS flags, - const WICPixelFormatGUID& pfGUID, - const Image& destImage) noexcept + HRESULT + PerformFlipRotateUsingWIC(const Image& srcImage, TEX_FR_FLAGS flags, const WICPixelFormatGUID& pfGUID, const Image& destImage) noexcept { if (!srcImage.pixels || !destImage.pixels) return E_POINTER; @@ -32,18 +29,22 @@ namespace assert(srcImage.format == destImage.format); bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; - if (srcImage.rowPitch > UINT32_MAX || srcImage.slicePitch > UINT32_MAX - || destImage.rowPitch > UINT32_MAX || destImage.slicePitch > UINT32_MAX) + if (srcImage.rowPitch > UINT32_MAX || srcImage.slicePitch > UINT32_MAX || destImage.rowPitch > UINT32_MAX + || destImage.slicePitch > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; ComPtr source; - HRESULT hr = pWIC->CreateBitmapFromMemory(static_cast(srcImage.width), static_cast(srcImage.height), pfGUID, - static_cast(srcImage.rowPitch), static_cast(srcImage.slicePitch), - srcImage.pixels, source.GetAddressOf()); + HRESULT hr = pWIC->CreateBitmapFromMemory(static_cast(srcImage.width), + static_cast(srcImage.height), + pfGUID, + static_cast(srcImage.rowPitch), + static_cast(srcImage.slicePitch), + srcImage.pixels, + source.GetAddressOf()); if (FAILED(hr)) return hr; @@ -82,17 +83,13 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Do conversion, flip/rotate using WIC, conversion cycle // // For large images we have to use F16 instead of F32 to avoid exceeding the 32-bit // memory limitations of WIC. //------------------------------------------------------------------------------------- - HRESULT PerformFlipRotateViaF16( - const Image& srcImage, - TEX_FR_FLAGS flags, - const Image& destImage) noexcept + HRESULT PerformFlipRotateViaF16(const Image& srcImage, TEX_FR_FLAGS flags, const Image& destImage) noexcept { if (!srcImage.pixels || !destImage.pixels) return E_POINTER; @@ -101,11 +98,11 @@ namespace assert(srcImage.format == destImage.format); ScratchImage temp; - HRESULT hr = ConvertToR16G16B16A16(srcImage, temp); + HRESULT hr = ConvertToR16G16B16A16(srcImage, temp); if (FAILED(hr)) return hr; - const Image *tsrc = temp.GetImage(0, 0, 0); + const Image* tsrc = temp.GetImage(0, 0, 0); if (!tsrc) return E_POINTER; @@ -114,7 +111,7 @@ namespace if (FAILED(hr)) return hr; - const Image *tdest = rtemp.GetImage(0, 0, 0); + const Image* tdest = rtemp.GetImage(0, 0, 0); if (!tdest) return E_POINTER; @@ -131,10 +128,7 @@ namespace return S_OK; } - HRESULT PerformFlipRotateViaF32( - const Image& srcImage, - TEX_FR_FLAGS flags, - const Image& destImage) noexcept + HRESULT PerformFlipRotateViaF32(const Image& srcImage, TEX_FR_FLAGS flags, const Image& destImage) noexcept { if (!srcImage.pixels || !destImage.pixels) return E_POINTER; @@ -143,11 +137,11 @@ namespace assert(srcImage.format == destImage.format); ScratchImage temp; - HRESULT hr = ConvertToR32G32B32A32(srcImage, temp); + HRESULT hr = ConvertToR32G32B32A32(srcImage, temp); if (FAILED(hr)) return hr; - const Image *tsrc = temp.GetImage(0, 0, 0); + const Image* tsrc = temp.GetImage(0, 0, 0); if (!tsrc) return E_POINTER; @@ -156,7 +150,7 @@ namespace if (FAILED(hr)) return hr; - const Image *tdest = rtemp.GetImage(0, 0, 0); + const Image* tdest = rtemp.GetImage(0, 0, 0); if (!tdest) return E_POINTER; @@ -172,8 +166,7 @@ namespace return S_OK; } -} - +} // namespace //===================================================================================== // Entry-points @@ -182,11 +175,7 @@ namespace //------------------------------------------------------------------------------------- // Flip/rotate image //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::FlipRotate( - const Image& srcImage, - TEX_FR_FLAGS flags, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::FlipRotate(const Image& srcImage, TEX_FR_FLAGS flags, ScratchImage& image) noexcept { if (!srcImage.pixels) return E_POINTER; @@ -204,11 +193,16 @@ HRESULT DirectX::FlipRotate( } static_assert(static_cast(TEX_FR_ROTATE0) == static_cast(WICBitmapTransformRotate0), "TEX_FR_ROTATE0 no longer matches WIC"); - static_assert(static_cast(TEX_FR_ROTATE90) == static_cast(WICBitmapTransformRotate90), "TEX_FR_ROTATE90 no longer matches WIC"); - static_assert(static_cast(TEX_FR_ROTATE180) == static_cast(WICBitmapTransformRotate180), "TEX_FR_ROTATE180 no longer matches WIC"); - static_assert(static_cast(TEX_FR_ROTATE270) == static_cast(WICBitmapTransformRotate270), "TEX_FR_ROTATE270 no longer matches WIC"); - static_assert(static_cast(TEX_FR_FLIP_HORIZONTAL) == static_cast(WICBitmapTransformFlipHorizontal), "TEX_FR_FLIP_HORIZONTAL no longer matches WIC"); - static_assert(static_cast(TEX_FR_FLIP_VERTICAL) == static_cast(WICBitmapTransformFlipVertical), "TEX_FR_FLIP_VERTICAL no longer matches WIC"); + static_assert(static_cast(TEX_FR_ROTATE90) == static_cast(WICBitmapTransformRotate90), + "TEX_FR_ROTATE90 no longer matches WIC"); + static_assert(static_cast(TEX_FR_ROTATE180) == static_cast(WICBitmapTransformRotate180), + "TEX_FR_ROTATE180 no longer matches WIC"); + static_assert(static_cast(TEX_FR_ROTATE270) == static_cast(WICBitmapTransformRotate270), + "TEX_FR_ROTATE270 no longer matches WIC"); + static_assert(static_cast(TEX_FR_FLIP_HORIZONTAL) == static_cast(WICBitmapTransformFlipHorizontal), + "TEX_FR_FLIP_HORIZONTAL no longer matches WIC"); + static_assert(static_cast(TEX_FR_FLIP_VERTICAL) == static_cast(WICBitmapTransformFlipVertical), + "TEX_FR_FLIP_VERTICAL no longer matches WIC"); // Only supports 90, 180, 270, or no rotation flags... not a combination of rotation flags const int rotateMode = static_cast(flags & (TEX_FR_ROTATE0 | TEX_FR_ROTATE90 | TEX_FR_ROTATE180 | TEX_FR_ROTATE270)); @@ -218,19 +212,17 @@ HRESULT DirectX::FlipRotate( case 0: case TEX_FR_ROTATE90: case TEX_FR_ROTATE180: - case TEX_FR_ROTATE270: - break; + case TEX_FR_ROTATE270: break; - default: - return E_INVALIDARG; + default: return E_INVALIDARG; } - size_t nwidth = srcImage.width; + size_t nwidth = srcImage.width; size_t nheight = srcImage.height; if ((rotateMode == TEX_FR_ROTATE90) || (rotateMode == TEX_FR_ROTATE270)) { - nwidth = srcImage.height; + nwidth = srcImage.height; nheight = srcImage.width; } @@ -238,7 +230,7 @@ HRESULT DirectX::FlipRotate( if (FAILED(hr)) return hr; - const Image *rimage = image.GetImage(0, 0, 0); + const Image* rimage = image.GetImage(0, 0, 0); if (!rimage) { image.Release(); @@ -275,17 +267,11 @@ HRESULT DirectX::FlipRotate( return S_OK; } - //------------------------------------------------------------------------------------- // Flip/rotate image (complex) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::FlipRotate( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - TEX_FR_FLAGS flags, - ScratchImage& result) noexcept +_Use_decl_annotations_ HRESULT +DirectX::FlipRotate(const Image* srcImages, size_t nimages, const TexMetadata& metadata, TEX_FR_FLAGS flags, ScratchImage& result) noexcept { if (!srcImages || !nimages) return E_INVALIDARG; @@ -297,11 +283,16 @@ HRESULT DirectX::FlipRotate( } static_assert(static_cast(TEX_FR_ROTATE0) == static_cast(WICBitmapTransformRotate0), "TEX_FR_ROTATE0 no longer matches WIC"); - static_assert(static_cast(TEX_FR_ROTATE90) == static_cast(WICBitmapTransformRotate90), "TEX_FR_ROTATE90 no longer matches WIC"); - static_assert(static_cast(TEX_FR_ROTATE180) == static_cast(WICBitmapTransformRotate180), "TEX_FR_ROTATE180 no longer matches WIC"); - static_assert(static_cast(TEX_FR_ROTATE270) == static_cast(WICBitmapTransformRotate270), "TEX_FR_ROTATE270 no longer matches WIC"); - static_assert(static_cast(TEX_FR_FLIP_HORIZONTAL) == static_cast(WICBitmapTransformFlipHorizontal), "TEX_FR_FLIP_HORIZONTAL no longer matches WIC"); - static_assert(static_cast(TEX_FR_FLIP_VERTICAL) == static_cast(WICBitmapTransformFlipVertical), "TEX_FR_FLIP_VERTICAL no longer matches WIC"); + static_assert(static_cast(TEX_FR_ROTATE90) == static_cast(WICBitmapTransformRotate90), + "TEX_FR_ROTATE90 no longer matches WIC"); + static_assert(static_cast(TEX_FR_ROTATE180) == static_cast(WICBitmapTransformRotate180), + "TEX_FR_ROTATE180 no longer matches WIC"); + static_assert(static_cast(TEX_FR_ROTATE270) == static_cast(WICBitmapTransformRotate270), + "TEX_FR_ROTATE270 no longer matches WIC"); + static_assert(static_cast(TEX_FR_FLIP_HORIZONTAL) == static_cast(WICBitmapTransformFlipHorizontal), + "TEX_FR_FLIP_HORIZONTAL no longer matches WIC"); + static_assert(static_cast(TEX_FR_FLIP_VERTICAL) == static_cast(WICBitmapTransformFlipVertical), + "TEX_FR_FLIP_VERTICAL no longer matches WIC"); // Only supports 90, 180, 270, or no rotation flags... not a combination of rotation flags const int rotateMode = static_cast(flags & (TEX_FR_ROTATE0 | TEX_FR_ROTATE90 | TEX_FR_ROTATE180 | TEX_FR_ROTATE270)); @@ -311,11 +302,9 @@ HRESULT DirectX::FlipRotate( case 0: case TEX_FR_ROTATE90: case TEX_FR_ROTATE180: - case TEX_FR_ROTATE270: - break; + case TEX_FR_ROTATE270: break; - default: - return E_INVALIDARG; + default: return E_INVALIDARG; } TexMetadata mdata2 = metadata; @@ -323,8 +312,8 @@ HRESULT DirectX::FlipRotate( bool flipwh = false; if ((rotateMode == TEX_FR_ROTATE90) || (rotateMode == TEX_FR_ROTATE270)) { - flipwh = true; - mdata2.width = metadata.height; + flipwh = true; + mdata2.width = metadata.height; mdata2.height = metadata.width; } @@ -346,7 +335,7 @@ HRESULT DirectX::FlipRotate( } WICPixelFormatGUID pfGUID; - const bool wicpf = DXGIToWIC(metadata.format, pfGUID); + const bool wicpf = DXGIToWIC(metadata.format, pfGUID); for (size_t index = 0; index < nimages; ++index) { diff --git a/DirectXTex/DirectXTexHDR.cpp b/DirectXTex/DirectXTexHDR.cpp index a0d55129..1ac287ff 100644 --- a/DirectXTex/DirectXTexHDR.cpp +++ b/DirectXTex/DirectXTexHDR.cpp @@ -26,11 +26,11 @@ // we support only that one as that's what other Radiance parsing code does as well. // -//Uncomment to disable the use of adapative RLE encoding when writing an HDR. Used for testing only. -//#define DISABLE_COMPRESS +// Uncomment to disable the use of adapative RLE encoding when writing an HDR. Used for testing only. +// #define DISABLE_COMPRESS -//Uncomment to use "old colors" standard RLE encoding when writing an HDR. Used for testing only. -//#define WRITE_OLD_COLORS +// Uncomment to use "old colors" standard RLE encoding when writing an HDR. Used for testing only. +// #define WRITE_OLD_COLORS using namespace DirectX; @@ -44,22 +44,22 @@ using namespace DirectX; namespace { const char g_Signature[] = "#?RADIANCE"; - // This is the official header signature for the .HDR (RGBE) file format. + // This is the official header signature for the .HDR (RGBE) file format. const char g_AltSignature[] = "#?RGBE"; - // This is a common variant header signature that is otherwise exactly the same format. + // This is a common variant header signature that is otherwise exactly the same format. - const char g_Format[] = "FORMAT="; + const char g_Format[] = "FORMAT="; const char g_Exposure[] = "EXPOSURE="; const char g_sRGBE[] = "32-bit_rle_rgbe"; const char g_sXYZE[] = "32-bit_rle_xyze"; - const char g_Header[] = - "#?RADIANCE\n"\ - "FORMAT=32-bit_rle_rgbe\n"\ - "\n"\ - "-Y %u +X %u\n"; + const char g_Header[] + = "#?RADIANCE\n" + "FORMAT=32-bit_rle_rgbe\n" + "\n" + "-Y %u +X %u\n"; inline size_t FindEOL(const char* str, size_t maxlen) noexcept { @@ -79,7 +79,7 @@ namespace #ifndef _WIN32 template - inline int sprintf_s(char(&buffer)[sizeOfBuffer], const char* format, ...) + inline int sprintf_s(char (&buffer)[sizeOfBuffer], const char* format, ...) { // This is adapter code. It is not a full implementation of sprintf_s! va_list ap; @@ -93,12 +93,11 @@ namespace //------------------------------------------------------------------------------------- // Decodes HDR header //------------------------------------------------------------------------------------- - HRESULT DecodeHDRHeader( - _In_reads_bytes_(size) const uint8_t* pSource, - size_t size, - _Out_ TexMetadata& metadata, - size_t& offset, - float& exposure) noexcept + HRESULT DecodeHDRHeader(_In_reads_bytes_(size) const uint8_t* pSource, + size_t size, + _Out_ TexMetadata& metadata, + size_t& offset, + float& exposure) noexcept { if (!pSource) return E_POINTER; @@ -113,15 +112,14 @@ namespace } // Verify magic signature - if (memcmp(pSource, g_Signature, sizeof(g_Signature) - 1) != 0 - && memcmp(pSource, g_AltSignature, sizeof(g_AltSignature) - 1) != 0) + if (memcmp(pSource, g_Signature, sizeof(g_Signature) - 1) != 0 && memcmp(pSource, g_AltSignature, sizeof(g_AltSignature) - 1) != 0) { return E_FAIL; } // Process first part of header bool formatFound = false; - auto info = reinterpret_cast(pSource); + auto info = reinterpret_cast(pSource); while (size > 0) { if (*info == '\n') @@ -131,7 +129,7 @@ namespace break; } - constexpr size_t formatLen = sizeof(g_Format) - 1; + constexpr size_t formatLen = sizeof(g_Format) - 1; constexpr size_t exposureLen = sizeof(g_Exposure) - 1; if ((size > formatLen) && memcmp(info, g_Format, formatLen) == 0) { @@ -163,8 +161,7 @@ namespace formatFound = true; const size_t len = FindEOL(info, size); - if (len == size_t(-1) - || len < 1) + if (len == size_t(-1) || len < 1) { return E_FAIL; } @@ -186,8 +183,7 @@ namespace } const size_t len = FindEOL(info, size); - if (len == size_t(-1) - || len < 1) + if (len == size_t(-1) || len < 1) { return E_FAIL; } @@ -208,8 +204,7 @@ namespace else { const size_t len = FindEOL(info, size); - if (len == size_t(-1) - || len < 1) + if (len == size_t(-1) || len < 1) { return E_FAIL; } @@ -228,8 +223,7 @@ namespace char orientation[256] = {}; const size_t len = FindEOL(info, std::min(sizeof(orientation) - 1, size)); - if (len == size_t(-1) - || len <= 2) + if (len == size_t(-1) || len <= 2) { return E_FAIL; } @@ -239,8 +233,10 @@ namespace if (orientation[0] != '-' || orientation[1] != 'Y') { // We only support the -Y +X orientation (see top of file) - return (static_cast(((orientation[0] == '+' || orientation[0] == '-') && (orientation[1] == 'X' || orientation[1] == 'Y')))) - ? HRESULT_E_NOT_SUPPORTED : HRESULT_E_INVALID_DATA; + return (static_cast( + ((orientation[0] == '+' || orientation[0] == '-') && (orientation[1] == 'X' || orientation[1] == 'Y')))) ? + HRESULT_E_NOT_SUPPORTED : + HRESULT_E_INVALID_DATA; } uint32_t height = 0; @@ -312,11 +308,11 @@ namespace offset = size_t(info - reinterpret_cast(pSource)); - metadata.width = width; + metadata.width = width; metadata.height = height; metadata.depth = metadata.arraySize = metadata.mipLevels = 1; - metadata.format = DXGI_FORMAT_R32G32B32A32_FLOAT; - metadata.dimension = TEX_DIMENSION_TEXTURE2D; + metadata.format = DXGI_FORMAT_R32G32B32A32_FLOAT; + metadata.dimension = TEX_DIMENSION_TEXTURE2D; metadata.SetAlphaMode(TEX_ALPHA_MODE_OPAQUE); return S_OK; @@ -325,20 +321,24 @@ namespace //------------------------------------------------------------------------------------- // FloatToRGBE //------------------------------------------------------------------------------------- - inline void FloatToRGBE(_Out_writes_(width*4) uint8_t* pDestination, _In_reads_(width*fpp) const float* pSource, size_t width, _In_range_(3, 4) int fpp) noexcept + inline void FloatToRGBE(_Out_writes_(width * 4) uint8_t* pDestination, + _In_reads_(width* fpp) const float* pSource, + size_t width, + _In_range_(3, 4) int fpp) noexcept { auto ePtr = pSource + width * size_t(fpp); for (size_t j = 0; j < width; ++j) { - if (pSource + 2 >= ePtr) break; + if (pSource + 2 >= ePtr) + break; const float r = pSource[0] >= 0.f ? pSource[0] : 0.f; const float g = pSource[1] >= 0.f ? pSource[1] : 0.f; const float b = pSource[2] >= 0.f ? pSource[2] : 0.f; pSource += fpp; - const float max_xy = (r > g) ? r : g; - float max_xyz = (max_xy > b) ? max_xy : b; + const float max_xy = (r > g) ? r : g; + float max_xyz = (max_xy > b) ? max_xy : b; if (max_xyz > 1e-32f) { @@ -346,9 +346,9 @@ namespace max_xyz = frexpf(max_xyz, &e) * 256.f / max_xyz; e += 128; - const uint8_t red = uint8_t(r * max_xyz); + const uint8_t red = uint8_t(r * max_xyz); const uint8_t green = uint8_t(g * max_xyz); - const uint8_t blue = uint8_t(b * max_xyz); + const uint8_t blue = uint8_t(b * max_xyz); pDestination[0] = red; pDestination[1] = green; @@ -367,20 +367,27 @@ namespace //------------------------------------------------------------------------------------- // HalfToRGBE //------------------------------------------------------------------------------------- - inline void HalfToRGBE(_Out_writes_(width * 4) uint8_t* pDestination, _In_reads_(width* fpp) const uint16_t* pSource, size_t width, _In_range_(3, 4) int fpp) noexcept + inline void HalfToRGBE(_Out_writes_(width * 4) uint8_t* pDestination, + _In_reads_(width* fpp) const uint16_t* pSource, + size_t width, + _In_range_(3, 4) int fpp) noexcept { auto ePtr = pSource + width * size_t(fpp); for (size_t j = 0; j < width; ++j) { - if (pSource + 2 >= ePtr) break; - float r = PackedVector::XMConvertHalfToFloat(pSource[0]); r = (r >= 0.f) ? r : 0.f; - float g = PackedVector::XMConvertHalfToFloat(pSource[1]); g = (g >= 0.f) ? g : 0.f; - float b = PackedVector::XMConvertHalfToFloat(pSource[2]); b = (b >= 0.f) ? b : 0.f; + if (pSource + 2 >= ePtr) + break; + float r = PackedVector::XMConvertHalfToFloat(pSource[0]); + r = (r >= 0.f) ? r : 0.f; + float g = PackedVector::XMConvertHalfToFloat(pSource[1]); + g = (g >= 0.f) ? g : 0.f; + float b = PackedVector::XMConvertHalfToFloat(pSource[2]); + b = (b >= 0.f) ? b : 0.f; pSource += fpp; - const float max_xy = (r > g) ? r : g; - float max_xyz = (max_xy > b) ? max_xy : b; + const float max_xy = (r > g) ? r : g; + float max_xyz = (max_xy > b) ? max_xy : b; if (max_xyz > 1e-32f) { @@ -388,9 +395,9 @@ namespace max_xyz = frexpf(max_xyz, &e) * 256.f / max_xyz; e += 128; - const uint8_t red = uint8_t(r * max_xyz); + const uint8_t red = uint8_t(r * max_xyz); const uint8_t green = uint8_t(g * max_xyz); - const uint8_t blue = uint8_t(b * max_xyz); + const uint8_t blue = uint8_t(b * max_xyz); pDestination[0] = red; pDestination[1] = green; @@ -409,8 +416,8 @@ namespace //------------------------------------------------------------------------------------- // Encode using Adapative RLE //------------------------------------------------------------------------------------- - _Success_(return > 0) - size_t EncodeRLE(_Out_writes_(width * 4) uint8_t* enc, _In_reads_(width * 4) const uint8_t* rgbe, size_t rowPitch, size_t width) noexcept + _Success_(return > 0) size_t + EncodeRLE(_Out_writes_(width * 4) uint8_t* enc, _In_reads_(width * 4) const uint8_t* rgbe, size_t rowPitch, size_t width) noexcept { if (width < 8 || width > INT16_MAX) { @@ -418,14 +425,14 @@ namespace return 0; } - #ifdef WRITE_OLD_COLORS +#ifdef WRITE_OLD_COLORS size_t encSize = 0; const uint8_t* scanPtr = rgbe; for (size_t pixelCount = 0; pixelCount < width;) { size_t spanLen = 1; - auto spanPtr = reinterpret_cast(scanPtr); + auto spanPtr = reinterpret_cast(scanPtr); while (pixelCount + spanLen < width && spanLen < INT16_MAX) { if (spanPtr[spanLen] == *spanPtr) @@ -520,7 +527,7 @@ namespace } return encSize; - #else +#else enc[0] = 2; enc[1] = 2; enc[2] = uint8_t(width >> 8); @@ -561,7 +568,7 @@ namespace else { uint8_t runLen = 1; - scan[0] = *spanPtr; + scan[0] = *spanPtr; while (pixelCount + runLen < width && runLen < 127) { if (spanPtr[(runLen - 1) * 4] != spanPtr[runLen * 4]) @@ -587,10 +594,9 @@ namespace } return encSize; - #endif +#endif } -} - +} // namespace //===================================================================================== // Entry-points @@ -599,28 +605,23 @@ namespace //------------------------------------------------------------------------------------- // Obtain metadata from HDR file in memory/on disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromHDRMemory(const uint8_t* pSource, size_t size, TexMetadata& metadata) noexcept +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromHDRMemory(const uint8_t* pSource, size_t size, TexMetadata& metadata) noexcept { if (!pSource || size == 0) return E_INVALIDARG; size_t offset; - float exposure; + float exposure; return DecodeHDRHeader(pSource, size, metadata, offset, exposure); } -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromHDRFile(const wchar_t* szFile, TexMetadata& metadata) noexcept +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromHDRFile(const wchar_t* szFile, TexMetadata& metadata) noexcept { if (!szFile) return E_INVALIDARG; #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -685,26 +686,27 @@ HRESULT DirectX::GetMetadataFromHDRFile(const wchar_t* szFile, TexMetadata& meta #endif size_t offset; - float exposure; + float exposure; return DecodeHDRHeader(header, headerLen, metadata, offset, exposure); } - //------------------------------------------------------------------------------------- // Load a HDR file in memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromHDRMemory(const uint8_t* pSource, size_t size, TexMetadata* metadata, ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadFromHDRMemory(const uint8_t* pSource, + size_t size, + TexMetadata* metadata, + ScratchImage& image) noexcept { if (!pSource || size == 0) return E_INVALIDARG; image.Release(); - size_t offset; - float exposure; + size_t offset; + float exposure; TexMetadata mdata; - HRESULT hr = DecodeHDRHeader(pSource, size, mdata, offset, exposure); + HRESULT hr = DecodeHDRHeader(pSource, size, mdata, offset, exposure); if (FAILED(hr)) return hr; @@ -804,7 +806,7 @@ HRESULT DirectX::LoadFromHDRMemory(const uint8_t* pSource, size_t size, TexMetad ++sourcePtr; for (uint8_t j = 0; j < runLen; ++j) { - auto val = static_cast(*sourcePtr++); + auto val = static_cast(*sourcePtr++); *pixelLoc = val; pixelLoc += 4; } @@ -861,7 +863,7 @@ HRESULT DirectX::LoadFromHDRMemory(const uint8_t* pSource, size_t size, TexMetad pixelLoc[1] = prevColor[1] = inColor[1]; pixelLoc[2] = prevColor[2] = inColor[2]; pixelLoc[3] = prevColor[3] = inColor[3]; - bitShift = 0; + bitShift = 0; ++pixelCount; pixelLoc += 4; } @@ -891,10 +893,10 @@ HRESULT DirectX::LoadFromHDRMemory(const uint8_t* pSource, size_t size, TexMetad for (size_t j = 0; j < image.GetPixelsSize(); j += 16) { const auto exponent = static_cast(fdata[3]); - fdata[0] = 1.0f / exposure*ldexpf((fdata[0] + 0.5f), exponent - (128 + 8)); - fdata[1] = 1.0f / exposure*ldexpf((fdata[1] + 0.5f), exponent - (128 + 8)); - fdata[2] = 1.0f / exposure*ldexpf((fdata[2] + 0.5f), exponent - (128 + 8)); - fdata[3] = 1.f; + fdata[0] = 1.0f / exposure * ldexpf((fdata[0] + 0.5f), exponent - (128 + 8)); + fdata[1] = 1.0f / exposure * ldexpf((fdata[1] + 0.5f), exponent - (128 + 8)); + fdata[2] = 1.0f / exposure * ldexpf((fdata[2] + 0.5f), exponent - (128 + 8)); + fdata[3] = 1.f; fdata += 4; } @@ -906,12 +908,10 @@ HRESULT DirectX::LoadFromHDRMemory(const uint8_t* pSource, size_t size, TexMetad return S_OK; } - //------------------------------------------------------------------------------------- // Load a HDR file from disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromHDRFile(const wchar_t* szFile, TexMetadata* metadata, ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadFromHDRFile(const wchar_t* szFile, TexMetadata* metadata, ScratchImage& image) noexcept { if (!szFile) return E_INVALIDARG; @@ -919,10 +919,7 @@ HRESULT DirectX::LoadFromHDRFile(const wchar_t* szFile, TexMetadata* metadata, S image.Release(); #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -994,12 +991,10 @@ HRESULT DirectX::LoadFromHDRFile(const wchar_t* szFile, TexMetadata* metadata, S return LoadFromHDRMemory(temp.get(), len, metadata, image); } - //------------------------------------------------------------------------------------- // Save a HDR file to memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveToHDRMemory(const Image& image, Blob& blob) noexcept +_Use_decl_annotations_ HRESULT DirectX::SaveToHDRMemory(const Image& image, Blob& blob) noexcept { if (!image.pixels) return E_POINTER; @@ -1015,15 +1010,10 @@ HRESULT DirectX::SaveToHDRMemory(const Image& image, Blob& blob) noexcept switch (image.format) { case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - fpp = 4; - break; - case DXGI_FORMAT_R32G32B32_FLOAT: - fpp = 3; - break; - - default: - return HRESULT_E_NOT_SUPPORTED; + case DXGI_FORMAT_R16G16B16A16_FLOAT: fpp = 4; break; + case DXGI_FORMAT_R32G32B32_FLOAT: fpp = 3; break; + + default: return HRESULT_E_NOT_SUPPORTED; } blob.Release(); @@ -1033,7 +1023,7 @@ HRESULT DirectX::SaveToHDRMemory(const Image& image, Blob& blob) noexcept auto headerLen = static_cast(strlen(header)); - size_t rowPitch = image.width * 4; + size_t rowPitch = image.width * 4; const size_t slicePitch = image.height * rowPitch; HRESULT hr = blob.Initialize(headerLen + slicePitch); @@ -1064,7 +1054,7 @@ HRESULT DirectX::SaveToHDRMemory(const Image& image, Blob& blob) noexcept } auto rgbe = temp.get(); - auto enc = temp.get() + rowPitch; + auto enc = temp.get() + rowPitch; const uint8_t* sPtr = image.pixels; for (size_t scan = 0; scan < image.height; ++scan) @@ -1103,12 +1093,10 @@ HRESULT DirectX::SaveToHDRMemory(const Image& image, Blob& blob) noexcept return S_OK; } - //------------------------------------------------------------------------------------- // Save a HDR file to disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexcept +_Use_decl_annotations_ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexcept { if (!szFile) return E_INVALIDARG; @@ -1127,22 +1115,15 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce switch (image.format) { case DXGI_FORMAT_R32G32B32A32_FLOAT: - case DXGI_FORMAT_R16G16B16A16_FLOAT: - fpp = 4; - break; - case DXGI_FORMAT_R32G32B32_FLOAT: - fpp = 3; - break; - - default: - return HRESULT_E_NOT_SUPPORTED; + case DXGI_FORMAT_R16G16B16A16_FLOAT: fpp = 4; break; + case DXGI_FORMAT_R32G32B32_FLOAT: fpp = 3; break; + + default: return HRESULT_E_NOT_SUPPORTED; } // Create file and write header #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -1155,7 +1136,7 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce return E_FAIL; #endif - const uint64_t pitch = uint64_t(image.width) * 4u; + const uint64_t pitch = uint64_t(image.width) * 4u; const uint64_t slicePitch = uint64_t(image.height) * pitch; if (pitch > UINT32_MAX) @@ -1173,9 +1154,9 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce return hr; // Write blob - #ifdef _WIN32 +#ifdef _WIN32 const auto bytesToWrite = static_cast(blob.GetBufferSize()); - DWORD bytesWritten; + DWORD bytesWritten; if (!WriteFile(hFile.get(), blob.GetConstBufferPointer(), bytesToWrite, &bytesWritten, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); @@ -1185,13 +1166,12 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce { return E_FAIL; } - #else - outFile.write(reinterpret_cast(blob.GetConstBufferPointer()), - static_cast(blob.GetBufferSize())); +#else + outFile.write(reinterpret_cast(blob.GetConstBufferPointer()), static_cast(blob.GetBufferSize())); if (!outFile) return E_FAIL; - #endif +#endif } else { @@ -1206,7 +1186,7 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce char header[256] = {}; sprintf_s(header, g_Header, image.height, image.width); - #ifdef _WIN32 +#ifdef _WIN32 const auto headerLen = static_cast(strlen(header)); DWORD bytesWritten; @@ -1217,21 +1197,21 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce if (bytesWritten != headerLen) return E_FAIL; - #else +#else outFile.write(reinterpret_cast(header), static_cast(strlen(header))); if (!outFile) return E_FAIL; - #endif +#endif - #ifdef DISABLE_COMPRESS - // Uncompressed write +#ifdef DISABLE_COMPRESS + // Uncompressed write auto sPtr = reinterpret_cast(image.pixels); for (size_t scan = 0; scan < image.height; ++scan) { FloatToRGBE(rgbe, reinterpret_cast(sPtr), image.width, fpp); sPtr += image.rowPitch; - #ifdef _WIN32 +#ifdef _WIN32 if (!WriteFile(hFile.get(), rgbe, static_cast(rowPitch), &bytesWritten, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); @@ -1239,14 +1219,13 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce if (bytesWritten != rowPitch) return E_FAIL; - #else +#else outFile.write(reinterpret_cast(rgbe), static_cast(rowPitch)); if (!outFile) return E_FAIL; - #endif - +#endif } - #else +#else auto enc = temp.get() + rowPitch; const uint8_t* sPtr = image.pixels; @@ -1268,7 +1247,7 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce if (encSize > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; - #ifdef _WIN32 +#ifdef _WIN32 if (!WriteFile(hFile.get(), enc, static_cast(encSize), &bytesWritten, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); @@ -1276,15 +1255,15 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce if (bytesWritten != encSize) return E_FAIL; - #else +#else outFile.write(reinterpret_cast(enc), static_cast(encSize)); if (!outFile) return E_FAIL; - #endif +#endif } else { - #ifdef _WIN32 +#ifdef _WIN32 if (!WriteFile(hFile.get(), rgbe, static_cast(rowPitch), &bytesWritten, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); @@ -1292,14 +1271,14 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce if (bytesWritten != rowPitch) return E_FAIL; - #else +#else outFile.write(reinterpret_cast(rgbe), static_cast(rowPitch)); if (!outFile) return E_FAIL; - #endif +#endif } } - #endif +#endif } #ifdef _WIN32 @@ -1309,7 +1288,6 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce return S_OK; } - //-------------------------------------------------------------------------------------- // Adapters for /Zc:wchar_t- clients @@ -1317,27 +1295,20 @@ HRESULT DirectX::SaveToHDRFile(const Image& image, const wchar_t* szFile) noexce namespace DirectX { - HRESULT __cdecl GetMetadataFromHDRFile( - _In_z_ const __wchar_t* szFile, - _Out_ TexMetadata& metadata) noexcept + HRESULT __cdecl GetMetadataFromHDRFile(_In_z_ const __wchar_t* szFile, _Out_ TexMetadata& metadata) noexcept { return GetMetadataFromHDRFile(reinterpret_cast(szFile), metadata); } - HRESULT __cdecl LoadFromHDRFile( - _In_z_ const __wchar_t* szFile, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) noexcept + HRESULT __cdecl LoadFromHDRFile(_In_z_ const __wchar_t* szFile, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept { return LoadFromHDRFile(reinterpret_cast(szFile), metadata, image); } - HRESULT __cdecl SaveToHDRFile( - _In_ const Image& image, - _In_z_ const __wchar_t* szFile) noexcept + HRESULT __cdecl SaveToHDRFile(_In_ const Image& image, _In_z_ const __wchar_t* szFile) noexcept { return SaveToHDRFile(image, reinterpret_cast(szFile)); } -} +} // namespace DirectX #endif // !_NATIVE_WCHAR_T_DEFINED diff --git a/DirectXTex/DirectXTexImage.cpp b/DirectXTex/DirectXTexImage.cpp index cf4c47b8..71961456 100644 --- a/DirectXTex/DirectXTexImage.cpp +++ b/DirectXTex/DirectXTexImage.cpp @@ -17,32 +17,30 @@ using namespace DirectX::Internal; #ifndef _WIN32 namespace { - inline void * _aligned_malloc(size_t size, size_t alignment) + inline void* _aligned_malloc(size_t size, size_t alignment) { size = (size + alignment - 1) & ~(alignment - 1); return std::aligned_alloc(alignment, size); } #define _aligned_free free -} +} // namespace #endif //------------------------------------------------------------------------------------- // Determines number of image array entries and pixel size //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Internal::DetermineImageArray( - const TexMetadata& metadata, - CP_FLAGS cpFlags, - size_t& nImages, - size_t& pixelSize) noexcept +_Use_decl_annotations_ HRESULT DirectX::Internal::DetermineImageArray(const TexMetadata& metadata, + CP_FLAGS cpFlags, + size_t& nImages, + size_t& pixelSize) noexcept { assert(metadata.width > 0 && metadata.height > 0 && metadata.depth > 0); assert(metadata.arraySize > 0); assert(metadata.mipLevels > 0); uint64_t totalPixelSize = 0; - size_t nimages = 0; + size_t nimages = 0; switch (metadata.dimension) { @@ -55,7 +53,7 @@ HRESULT DirectX::Internal::DetermineImageArray( for (size_t level = 0; level < metadata.mipLevels; ++level) { - size_t rowPitch, slicePitch; + size_t rowPitch, slicePitch; HRESULT hr = ComputePitch(metadata.format, w, h, rowPitch, slicePitch, cpFlags); if (FAILED(hr)) { @@ -75,43 +73,40 @@ HRESULT DirectX::Internal::DetermineImageArray( } break; - case TEX_DIMENSION_TEXTURE3D: - { - size_t w = metadata.width; - size_t h = metadata.height; - size_t d = metadata.depth; + case TEX_DIMENSION_TEXTURE3D: { + size_t w = metadata.width; + size_t h = metadata.height; + size_t d = metadata.depth; - for (size_t level = 0; level < metadata.mipLevels; ++level) + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + size_t rowPitch, slicePitch; + HRESULT hr = ComputePitch(metadata.format, w, h, rowPitch, slicePitch, cpFlags); + if (FAILED(hr)) { - size_t rowPitch, slicePitch; - HRESULT hr = ComputePitch(metadata.format, w, h, rowPitch, slicePitch, cpFlags); - if (FAILED(hr)) - { - nImages = pixelSize = 0; - return hr; - } + nImages = pixelSize = 0; + return hr; + } - for (size_t slice = 0; slice < d; ++slice) - { - totalPixelSize += uint64_t(slicePitch); - ++nimages; - } + for (size_t slice = 0; slice < d; ++slice) + { + totalPixelSize += uint64_t(slicePitch); + ++nimages; + } - if (h > 1) - h >>= 1; + if (h > 1) + h >>= 1; - if (w > 1) - w >>= 1; + if (w > 1) + w >>= 1; - if (d > 1) - d >>= 1; - } + if (d > 1) + d >>= 1; } - break; + } + break; - default: - nImages = pixelSize = 0; - return E_INVALIDARG; + default: nImages = pixelSize = 0; return E_INVALIDARG; } #if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) @@ -131,24 +126,21 @@ HRESULT DirectX::Internal::DetermineImageArray( } #endif - nImages = nimages; + nImages = nimages; pixelSize = static_cast(totalPixelSize); return S_OK; } - //------------------------------------------------------------------------------------- // Fills in the image array entries //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::Internal::SetupImageArray( - uint8_t *pMemory, - size_t pixelSize, - const TexMetadata& metadata, - CP_FLAGS cpFlags, - Image* images, - size_t nImages) noexcept +_Use_decl_annotations_ bool DirectX::Internal::SetupImageArray(uint8_t* pMemory, + size_t pixelSize, + const TexMetadata& metadata, + CP_FLAGS cpFlags, + Image* images, + size_t nImages) noexcept { assert(pMemory); assert(pixelSize > 0); @@ -157,8 +149,8 @@ bool DirectX::Internal::SetupImageArray( if (!images) return false; - size_t index = 0; - uint8_t* pixels = pMemory; + size_t index = 0; + uint8_t* pixels = pMemory; const uint8_t* pEndBits = pMemory + pixelSize; switch (metadata.dimension) @@ -186,12 +178,12 @@ bool DirectX::Internal::SetupImageArray( if (FAILED(ComputePitch(metadata.format, w, h, rowPitch, slicePitch, cpFlags))) return false; - images[index].width = w; - images[index].height = h; - images[index].format = metadata.format; - images[index].rowPitch = rowPitch; + images[index].width = w; + images[index].height = h; + images[index].format = metadata.format; + images[index].rowPitch = rowPitch; images[index].slicePitch = slicePitch; - images[index].pixels = pixels; + images[index].pixels = pixels; ++index; pixels += slicePitch; @@ -209,95 +201,90 @@ bool DirectX::Internal::SetupImageArray( } return true; - case TEX_DIMENSION_TEXTURE3D: + case TEX_DIMENSION_TEXTURE3D: { + if (metadata.mipLevels == 0 || metadata.depth == 0) { - if (metadata.mipLevels == 0 || metadata.depth == 0) - { - return false; - } + return false; + } - size_t w = metadata.width; - size_t h = metadata.height; - size_t d = metadata.depth; + size_t w = metadata.width; + size_t h = metadata.height; + size_t d = metadata.depth; - for (size_t level = 0; level < metadata.mipLevels; ++level) + for (size_t level = 0; level < metadata.mipLevels; ++level) + { + size_t rowPitch, slicePitch; + if (FAILED(ComputePitch(metadata.format, w, h, rowPitch, slicePitch, cpFlags))) + return false; + + for (size_t slice = 0; slice < d; ++slice) { - size_t rowPitch, slicePitch; - if (FAILED(ComputePitch(metadata.format, w, h, rowPitch, slicePitch, cpFlags))) + if (index >= nImages) + { return false; + } - for (size_t slice = 0; slice < d; ++slice) + // We use the same memory organization that Direct3D 11 needs for D3D11_SUBRESOURCE_DATA + // with all slices of a given miplevel being continuous in memory + images[index].width = w; + images[index].height = h; + images[index].format = metadata.format; + images[index].rowPitch = rowPitch; + images[index].slicePitch = slicePitch; + images[index].pixels = pixels; + ++index; + + pixels += slicePitch; + if (pixels > pEndBits) { - if (index >= nImages) - { - return false; - } - - // We use the same memory organization that Direct3D 11 needs for D3D11_SUBRESOURCE_DATA - // with all slices of a given miplevel being continuous in memory - images[index].width = w; - images[index].height = h; - images[index].format = metadata.format; - images[index].rowPitch = rowPitch; - images[index].slicePitch = slicePitch; - images[index].pixels = pixels; - ++index; - - pixels += slicePitch; - if (pixels > pEndBits) - { - return false; - } + return false; } + } - if (h > 1) - h >>= 1; + if (h > 1) + h >>= 1; - if (w > 1) - w >>= 1; + if (w > 1) + w >>= 1; - if (d > 1) - d >>= 1; - } + if (d > 1) + d >>= 1; } + } return true; - default: - return false; + default: return false; } } - //===================================================================================== // ScratchImage - Bitmap image container //===================================================================================== -ScratchImage& ScratchImage::operator= (ScratchImage&& moveFrom) noexcept +ScratchImage& ScratchImage::operator=(ScratchImage&& moveFrom) noexcept { if (this != &moveFrom) { Release(); - m_nimages = moveFrom.m_nimages; - m_size = moveFrom.m_size; + m_nimages = moveFrom.m_nimages; + m_size = moveFrom.m_size; m_metadata = moveFrom.m_metadata; - m_image = moveFrom.m_image; - m_memory = moveFrom.m_memory; + m_image = moveFrom.m_image; + m_memory = moveFrom.m_memory; moveFrom.m_nimages = 0; - moveFrom.m_size = 0; - moveFrom.m_image = nullptr; - moveFrom.m_memory = nullptr; + moveFrom.m_size = 0; + moveFrom.m_image = nullptr; + moveFrom.m_memory = nullptr; } return *this; } - //------------------------------------------------------------------------------------- // Methods //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT ScratchImage::Initialize(const TexMetadata& mdata, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT ScratchImage::Initialize(const TexMetadata& mdata, CP_FLAGS flags) noexcept { if (!IsValid(mdata.format)) return E_INVALIDARG; @@ -339,23 +326,22 @@ HRESULT ScratchImage::Initialize(const TexMetadata& mdata, CP_FLAGS flags) noexc return E_INVALIDARG; break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } Release(); - m_metadata.width = mdata.width; - m_metadata.height = mdata.height; - m_metadata.depth = mdata.depth; - m_metadata.arraySize = mdata.arraySize; - m_metadata.mipLevels = mipLevels; - m_metadata.miscFlags = mdata.miscFlags; + m_metadata.width = mdata.width; + m_metadata.height = mdata.height; + m_metadata.depth = mdata.depth; + m_metadata.arraySize = mdata.arraySize; + m_metadata.mipLevels = mipLevels; + m_metadata.miscFlags = mdata.miscFlags; m_metadata.miscFlags2 = mdata.miscFlags2; - m_metadata.format = mdata.format; - m_metadata.dimension = mdata.dimension; + m_metadata.format = mdata.format; + m_metadata.dimension = mdata.dimension; - size_t pixelSize, nimages; + size_t pixelSize, nimages; HRESULT hr = DetermineImageArray(m_metadata, flags, nimages, pixelSize); if (FAILED(hr)) return hr; @@ -385,8 +371,8 @@ HRESULT ScratchImage::Initialize(const TexMetadata& mdata, CP_FLAGS flags) noexc return S_OK; } -_Use_decl_annotations_ -HRESULT ScratchImage::Initialize1D(DXGI_FORMAT fmt, size_t length, size_t arraySize, size_t mipLevels, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT +ScratchImage::Initialize1D(DXGI_FORMAT fmt, size_t length, size_t arraySize, size_t mipLevels, CP_FLAGS flags) noexcept { if (!length || !arraySize) return E_INVALIDARG; @@ -401,8 +387,8 @@ HRESULT ScratchImage::Initialize1D(DXGI_FORMAT fmt, size_t length, size_t arrayS return S_OK; } -_Use_decl_annotations_ -HRESULT ScratchImage::Initialize2D(DXGI_FORMAT fmt, size_t width, size_t height, size_t arraySize, size_t mipLevels, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT +ScratchImage::Initialize2D(DXGI_FORMAT fmt, size_t width, size_t height, size_t arraySize, size_t mipLevels, CP_FLAGS flags) noexcept { if (!IsValid(fmt) || !width || !height || !arraySize) return E_INVALIDARG; @@ -415,17 +401,17 @@ HRESULT ScratchImage::Initialize2D(DXGI_FORMAT fmt, size_t width, size_t height, Release(); - m_metadata.width = width; - m_metadata.height = height; - m_metadata.depth = 1; - m_metadata.arraySize = arraySize; - m_metadata.mipLevels = mipLevels; - m_metadata.miscFlags = 0; + m_metadata.width = width; + m_metadata.height = height; + m_metadata.depth = 1; + m_metadata.arraySize = arraySize; + m_metadata.mipLevels = mipLevels; + m_metadata.miscFlags = 0; m_metadata.miscFlags2 = 0; - m_metadata.format = fmt; - m_metadata.dimension = TEX_DIMENSION_TEXTURE2D; + m_metadata.format = fmt; + m_metadata.dimension = TEX_DIMENSION_TEXTURE2D; - size_t pixelSize, nimages; + size_t pixelSize, nimages; HRESULT hr = DetermineImageArray(m_metadata, flags, nimages, pixelSize); if (FAILED(hr)) return hr; @@ -455,8 +441,8 @@ HRESULT ScratchImage::Initialize2D(DXGI_FORMAT fmt, size_t width, size_t height, return S_OK; } -_Use_decl_annotations_ -HRESULT ScratchImage::Initialize3D(DXGI_FORMAT fmt, size_t width, size_t height, size_t depth, size_t mipLevels, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT +ScratchImage::Initialize3D(DXGI_FORMAT fmt, size_t width, size_t height, size_t depth, size_t mipLevels, CP_FLAGS flags) noexcept { if (!IsValid(fmt) || !width || !height || !depth) return E_INVALIDARG; @@ -472,17 +458,17 @@ HRESULT ScratchImage::Initialize3D(DXGI_FORMAT fmt, size_t width, size_t height, Release(); - m_metadata.width = width; - m_metadata.height = height; - m_metadata.depth = depth; - m_metadata.arraySize = 1; // Direct3D 10.x/11 does not support arrays of 3D textures - m_metadata.mipLevels = mipLevels; - m_metadata.miscFlags = 0; + m_metadata.width = width; + m_metadata.height = height; + m_metadata.depth = depth; + m_metadata.arraySize = 1; // Direct3D 10.x/11 does not support arrays of 3D textures + m_metadata.mipLevels = mipLevels; + m_metadata.miscFlags = 0; m_metadata.miscFlags2 = 0; - m_metadata.format = fmt; - m_metadata.dimension = TEX_DIMENSION_TEXTURE3D; + m_metadata.format = fmt; + m_metadata.dimension = TEX_DIMENSION_TEXTURE3D; - size_t pixelSize, nimages; + size_t pixelSize, nimages; HRESULT hr = DetermineImageArray(m_metadata, flags, nimages, pixelSize); if (FAILED(hr)) return hr; @@ -514,8 +500,8 @@ HRESULT ScratchImage::Initialize3D(DXGI_FORMAT fmt, size_t width, size_t height, return S_OK; } -_Use_decl_annotations_ -HRESULT ScratchImage::InitializeCube(DXGI_FORMAT fmt, size_t width, size_t height, size_t nCubes, size_t mipLevels, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT +ScratchImage::InitializeCube(DXGI_FORMAT fmt, size_t width, size_t height, size_t nCubes, size_t mipLevels, CP_FLAGS flags) noexcept { if (!width || !height || !nCubes) return E_INVALIDARG; @@ -530,12 +516,10 @@ HRESULT ScratchImage::InitializeCube(DXGI_FORMAT fmt, size_t width, size_t heigh return S_OK; } -_Use_decl_annotations_ -HRESULT ScratchImage::InitializeFromImage(const Image& srcImage, bool allow1D, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT ScratchImage::InitializeFromImage(const Image& srcImage, bool allow1D, CP_FLAGS flags) noexcept { - HRESULT hr = (srcImage.height > 1 || !allow1D) - ? Initialize2D(srcImage.format, srcImage.width, srcImage.height, 1, 1, flags) - : Initialize1D(srcImage.format, srcImage.width, 1, 1, flags); + HRESULT hr = (srcImage.height > 1 || !allow1D) ? Initialize2D(srcImage.format, srcImage.width, srcImage.height, 1, 1, flags) : + Initialize1D(srcImage.format, srcImage.width, 1, 1, flags); if (FAILED(hr)) return hr; @@ -567,15 +551,17 @@ HRESULT ScratchImage::InitializeFromImage(const Image& srcImage, bool allow1D, C return S_OK; } -_Use_decl_annotations_ -HRESULT ScratchImage::InitializeArrayFromImages(const Image* images, size_t nImages, bool allow1D, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT ScratchImage::InitializeArrayFromImages(const Image* images, + size_t nImages, + bool allow1D, + CP_FLAGS flags) noexcept { if (!images || !nImages) return E_INVALIDARG; const DXGI_FORMAT format = images[0].format; - const size_t width = images[0].width; - const size_t height = images[0].height; + const size_t width = images[0].width; + const size_t height = images[0].height; for (size_t index = 0; index < nImages; ++index) { @@ -589,9 +575,8 @@ HRESULT ScratchImage::InitializeArrayFromImages(const Image* images, size_t nIma } } - HRESULT hr = (height > 1 || !allow1D) - ? Initialize2D(format, width, height, nImages, 1, flags) - : Initialize1D(format, width, nImages, 1, flags); + HRESULT hr = (height > 1 || !allow1D) ? Initialize2D(format, width, height, nImages, 1, flags) : + Initialize1D(format, width, nImages, 1, flags); if (FAILED(hr)) return hr; @@ -627,8 +612,7 @@ HRESULT ScratchImage::InitializeArrayFromImages(const Image* images, size_t nIma return S_OK; } -_Use_decl_annotations_ -HRESULT ScratchImage::InitializeCubeFromImages(const Image* images, size_t nImages, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT ScratchImage::InitializeCubeFromImages(const Image* images, size_t nImages, CP_FLAGS flags) noexcept { if (!images || !nImages) return E_INVALIDARG; @@ -646,8 +630,7 @@ HRESULT ScratchImage::InitializeCubeFromImages(const Image* images, size_t nImag return S_OK; } -_Use_decl_annotations_ -HRESULT ScratchImage::Initialize3DFromImages(const Image* images, size_t depth, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT ScratchImage::Initialize3DFromImages(const Image* images, size_t depth, CP_FLAGS flags) noexcept { if (!images || !depth) return E_INVALIDARG; @@ -656,8 +639,8 @@ HRESULT ScratchImage::Initialize3DFromImages(const Image* images, size_t depth, return E_INVALIDARG; const DXGI_FORMAT format = images[0].format; - const size_t width = images[0].width; - const size_t height = images[0].height; + const size_t width = images[0].width; + const size_t height = images[0].height; for (size_t slice = 0; slice < depth; ++slice) { @@ -709,7 +692,7 @@ HRESULT ScratchImage::Initialize3DFromImages(const Image* images, size_t depth, void ScratchImage::Release() noexcept { m_nimages = 0; - m_size = 0; + m_size = 0; if (m_image) { @@ -726,8 +709,7 @@ void ScratchImage::Release() noexcept memset(&m_metadata, 0, sizeof(m_metadata)); } -_Use_decl_annotations_ -bool ScratchImage::OverrideFormat(DXGI_FORMAT f) noexcept +_Use_decl_annotations_ bool ScratchImage::OverrideFormat(DXGI_FORMAT f) noexcept { if (!m_image) return false; @@ -745,8 +727,7 @@ bool ScratchImage::OverrideFormat(DXGI_FORMAT f) noexcept return true; } -_Use_decl_annotations_ -const Image* ScratchImage::GetImage(size_t mip, size_t item, size_t slice) const noexcept +_Use_decl_annotations_ const Image* ScratchImage::GetImage(size_t mip, size_t item, size_t slice) const noexcept { if (mip >= m_metadata.mipLevels) return nullptr; @@ -763,7 +744,7 @@ const Image* ScratchImage::GetImage(size_t mip, size_t item, size_t slice) const if (item >= m_metadata.arraySize) return nullptr; - index = item*(m_metadata.mipLevels) + mip; + index = item * (m_metadata.mipLevels) + mip; break; case TEX_DIMENSION_TEXTURE3D: @@ -790,8 +771,7 @@ const Image* ScratchImage::GetImage(size_t mip, size_t item, size_t slice) const } break; - default: - return nullptr; + default: return nullptr; } return &m_image[index]; @@ -823,10 +803,10 @@ bool ScratchImage::IsAlphaAllOpaque() const noexcept for (size_t index = 0; index < m_nimages; ++index) { - #pragma warning( suppress : 6011 ) +#pragma warning(suppress : 6011) const Image& img = m_image[index]; - const uint8_t *pPixels = img.pixels; + const uint8_t* pPixels = img.pixels; assert(pPixels); for (size_t h = 0; h < img.height; ++h) diff --git a/DirectXTex/DirectXTexMipmaps.cpp b/DirectXTex/DirectXTexMipmaps.cpp index f4c02404..ab09ab73 100644 --- a/DirectXTex/DirectXTexMipmaps.cpp +++ b/DirectXTex/DirectXTexMipmaps.cpp @@ -24,7 +24,6 @@ namespace return ((x != 0) && !(x & (x - 1))); } - size_t CountMips(_In_ size_t width, _In_ size_t height) noexcept { size_t mipLevels = 1; @@ -43,7 +42,6 @@ namespace return mipLevels; } - size_t CountMips3D(_In_ size_t width, _In_ size_t height, _In_ size_t depth) noexcept { size_t mipLevels = 1; @@ -66,11 +64,10 @@ namespace } #ifdef _WIN32 - HRESULT EnsureWicBitmapPixelFormat( - _In_ IWICImagingFactory* pWIC, - _In_ IWICBitmap* src, - _In_ TEX_FILTER_FLAGS filter, - _In_ const WICPixelFormatGUID& desiredPixelFormat, + HRESULT EnsureWicBitmapPixelFormat(_In_ IWICImagingFactory* pWIC, + _In_ IWICBitmap* src, + _In_ TEX_FILTER_FLAGS filter, + _In_ const WICPixelFormatGUID& desiredPixelFormat, __RPC__deref_out_opt /* needed to match WIC annotation */ IWICBitmap** dest) noexcept { if (!dest) @@ -82,7 +79,7 @@ namespace return E_POINTER; WICPixelFormatGUID actualPixelFormat; - HRESULT hr = src->GetPixelFormat(&actualPixelFormat); + HRESULT hr = src->GetPixelFormat(&actualPixelFormat); if (SUCCEEDED(hr)) { @@ -99,7 +96,7 @@ namespace if (SUCCEEDED(hr)) { BOOL canConvert = FALSE; - hr = converter->CanConvert(actualPixelFormat, desiredPixelFormat, &canConvert); + hr = converter->CanConvert(actualPixelFormat, desiredPixelFormat, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; @@ -108,8 +105,7 @@ namespace if (SUCCEEDED(hr)) { - hr = converter->Initialize(src, desiredPixelFormat, GetWICDither(filter), nullptr, - 0, WICBitmapPaletteTypeMedianCut); + hr = converter->Initialize(src, desiredPixelFormat, GetWICDither(filter), nullptr, 0, WICBitmapPaletteTypeMedianCut); } if (SUCCEEDED(hr)) @@ -123,27 +119,19 @@ namespace } #endif // WIN32 - #if DIRECTX_MATH_VERSION >= 310 #define VectorSum XMVectorSum #else - inline XMVECTOR XM_CALLCONV VectorSum - ( - FXMVECTOR V - ) + inline XMVECTOR XM_CALLCONV VectorSum(FXMVECTOR V) { - XMVECTOR vTemp = XMVectorSwizzle<2, 3, 0, 1>(V); + XMVECTOR vTemp = XMVectorSwizzle<2, 3, 0, 1>(V); XMVECTOR vTemp2 = XMVectorAdd(V, vTemp); - vTemp = XMVectorSwizzle<1, 0, 3, 2>(vTemp2); + vTemp = XMVectorSwizzle<1, 0, 3, 2>(vTemp2); return XMVectorAdd(vTemp, vTemp2); } #endif - - HRESULT ScaleAlpha( - const Image& srcImage, - float alphaScale, - const Image& destImage) noexcept + HRESULT ScaleAlpha(const Image& srcImage, float alphaScale, const Image& destImage) noexcept { assert(srcImage.width == destImage.width); assert(srcImage.height == destImage.height); @@ -154,8 +142,8 @@ namespace return E_OUTOFMEMORY; } - const uint8_t* pSrc = srcImage.pixels; - uint8_t* pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; if (!pSrc || !pDest) { return E_POINTER; @@ -173,9 +161,9 @@ namespace XMVECTOR* ptr = scanline.get(); for (size_t w = 0; w < srcImage.width; ++w) { - const XMVECTOR v = *ptr; + const XMVECTOR v = *ptr; const XMVECTOR alpha = XMVectorMultiply(XMVectorSplatW(v), vscale); - *(ptr++) = XMVectorSelect(alpha, v, g_XMSelect1110); + *(ptr++) = XMVectorSelect(alpha, v, g_XMSelect1110); } if (!StoreScanline(pDest, destImage.rowPitch, destImage.format, scanline.get(), srcImage.width)) @@ -190,19 +178,16 @@ namespace return S_OK; } - - void GenerateAlphaCoverageConvolutionVectors( - _In_ size_t N, - _Out_writes_(N*N) XMVECTOR* vectors) noexcept + void GenerateAlphaCoverageConvolutionVectors(_In_ size_t N, _Out_writes_(N* N) XMVECTOR* vectors) noexcept { for (size_t sy = 0; sy < N; ++sy) { - const float fy = (float(sy) + 0.5f) / float(N); + const float fy = (float(sy) + 0.5f) / float(N); const float ify = 1.0f - fy; for (size_t sx = 0; sx < N; ++sx) { - const float fx = (float(sx) + 0.5f) / float(N); + const float fx = (float(sx) + 0.5f) / float(N); const float ifx = 1.0f - fx; // [0]=(x+0, y+0), [1]=(x+0, y+1), [2]=(x+1, y+0), [3]=(x+1, y+1) @@ -211,12 +196,7 @@ namespace } } - - HRESULT CalculateAlphaCoverage( - const Image& srcImage, - float alphaReference, - float alphaScale, - float& coverage) noexcept + HRESULT CalculateAlphaCoverage(const Image& srcImage, float alphaReference, float alphaScale, float& coverage) noexcept { coverage = 0.0f; @@ -234,14 +214,14 @@ namespace const XMVECTOR scale = XMVectorReplicate(alphaScale); - const uint8_t *pSrcRow0 = srcImage.pixels; + const uint8_t* pSrcRow0 = srcImage.pixels; if (!pSrcRow0) { return E_POINTER; } constexpr size_t N = 8; - XMVECTOR convolution[N * N]; + XMVECTOR convolution[N * N]; GenerateAlphaCoverageConvolutionVectors(N, convolution); size_t coverageCount = 0; @@ -252,7 +232,7 @@ namespace return E_FAIL; } - const uint8_t *pSrcRow1 = pSrcRow0 + srcImage.rowPitch; + const uint8_t* pSrcRow1 = pSrcRow0 + srcImage.rowPitch; if (!LoadScanlineLinear(row1.get(), srcImage.width, pSrcRow1, srcImage.rowPitch, srcImage.format, TEX_FILTER_DEFAULT)) { return E_FAIL; @@ -266,17 +246,17 @@ namespace XMVECTOR r0 = XMVectorSplatW(*pRow0); XMVECTOR r1 = XMVectorSplatW(*pRow1); - XMVECTOR v1 = XMVectorSaturate(XMVectorMultiply(r0, scale)); + XMVECTOR v1 = XMVectorSaturate(XMVectorMultiply(r0, scale)); const XMVECTOR v2 = XMVectorSaturate(XMVectorMultiply(r1, scale)); r0 = XMVectorSplatW(*(++pRow0)); r1 = XMVectorSplatW(*(++pRow1)); - XMVECTOR v3 = XMVectorSaturate(XMVectorMultiply(XMVectorSplatW(r0), scale)); + XMVECTOR v3 = XMVectorSaturate(XMVectorMultiply(XMVectorSplatW(r0), scale)); const XMVECTOR v4 = XMVectorSaturate(XMVectorMultiply(XMVectorSplatW(r1), scale)); - v1 = XMVectorMergeXY(v1, v2); // [v1.x v2.x --- ---] - v3 = XMVectorMergeXY(v3, v4); // [v3.x v4.x --- ---] + v1 = XMVectorMergeXY(v1, v2); // [v1.x v2.x --- ---] + v3 = XMVectorMergeXY(v3, v4); // [v3.x v4.x --- ---] XMVECTOR v = XMVectorPermute<0, 1, 4, 5>(v1, v3); // [v1.x v2.x v3.x v4.x] @@ -306,24 +286,19 @@ namespace return S_OK; } - - HRESULT EstimateAlphaScaleForCoverage( - const Image& srcImage, - float alphaReference, - float targetCoverage, - float& alphaScale) noexcept + HRESULT EstimateAlphaScaleForCoverage(const Image& srcImage, float alphaReference, float targetCoverage, float& alphaScale) noexcept { float minAlphaScale = 0.0f; float maxAlphaScale = 4.0f; - float bestError = FLT_MAX; + float bestError = FLT_MAX; // Determine desired scale using a binary search. Hardcoded to 10 steps max. - alphaScale = 1.0f; + alphaScale = 1.0f; constexpr size_t N = 10; for (size_t i = 0; i < N; ++i) { - float currentCoverage = 0.0f; - HRESULT hr = CalculateAlphaCoverage(srcImage, alphaReference, alphaScale, currentCoverage); + float currentCoverage = 0.0f; + HRESULT hr = CalculateAlphaCoverage(srcImage, alphaReference, alphaScale, currentCoverage); if (FAILED(hr)) { return hr; @@ -353,13 +328,9 @@ namespace return S_OK; } -} +} // namespace -_Use_decl_annotations_ -bool DirectX::CalculateMipLevels( - size_t width, - size_t height, - size_t& mipLevels) noexcept +_Use_decl_annotations_ bool DirectX::CalculateMipLevels(size_t width, size_t height, size_t& mipLevels) noexcept { if (mipLevels > 1) { @@ -378,12 +349,7 @@ bool DirectX::CalculateMipLevels( return true; } -_Use_decl_annotations_ -bool DirectX::CalculateMipLevels3D( - size_t width, - size_t height, - size_t depth, - size_t& mipLevels) noexcept +_Use_decl_annotations_ bool DirectX::CalculateMipLevels3D(size_t width, size_t height, size_t depth, size_t& mipLevels) noexcept { if (mipLevels > 1) { @@ -404,15 +370,13 @@ bool DirectX::CalculateMipLevels3D( #ifdef _WIN32 //--- Resizing color and alpha channels separately using WIC --- -_Use_decl_annotations_ -HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha( - IWICImagingFactory* pWIC, - bool iswic2, - IWICBitmap* original, - size_t newWidth, - size_t newHeight, - TEX_FILTER_FLAGS filter, - const Image* img) noexcept +_Use_decl_annotations_ HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha(IWICImagingFactory* pWIC, + bool iswic2, + IWICBitmap* original, + size_t newWidth, + size_t newHeight, + TEX_FILTER_FLAGS filter, + const Image* img) noexcept { if (!pWIC || !original || !img) return E_POINTER; @@ -420,13 +384,13 @@ HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha( const WICBitmapInterpolationMode interpolationMode = GetWICInterp(filter); WICPixelFormatGUID desiredPixelFormat = GUID_WICPixelFormatUndefined; - HRESULT hr = original->GetPixelFormat(&desiredPixelFormat); + HRESULT hr = original->GetPixelFormat(&desiredPixelFormat); - size_t colorBytesInPixel = 0; - size_t colorBytesPerPixel = 0; - size_t colorWithAlphaBytesPerPixel = 0; - WICPixelFormatGUID colorPixelFormat = GUID_WICPixelFormatUndefined; - WICPixelFormatGUID colorWithAlphaPixelFormat = GUID_WICPixelFormatUndefined; + size_t colorBytesInPixel = 0; + size_t colorBytesPerPixel = 0; + size_t colorWithAlphaBytesPerPixel = 0; + WICPixelFormatGUID colorPixelFormat = GUID_WICPixelFormatUndefined; + WICPixelFormatGUID colorWithAlphaPixelFormat = GUID_WICPixelFormatUndefined; if (SUCCEEDED(hr)) { @@ -450,27 +414,27 @@ HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha( if (bitsPerPixel <= 32) { colorBytesInPixel = colorBytesPerPixel = 3; - colorPixelFormat = GUID_WICPixelFormat24bppBGR; + colorPixelFormat = GUID_WICPixelFormat24bppBGR; colorWithAlphaBytesPerPixel = 4; - colorWithAlphaPixelFormat = GUID_WICPixelFormat32bppBGRA; + colorWithAlphaPixelFormat = GUID_WICPixelFormat32bppBGRA; } else { if (iswic2) { colorBytesInPixel = colorBytesPerPixel = 12; - colorPixelFormat = GUID_WICPixelFormat96bppRGBFloat; + colorPixelFormat = GUID_WICPixelFormat96bppRGBFloat; } else { - colorBytesInPixel = 12; + colorBytesInPixel = 12; colorBytesPerPixel = 16; - colorPixelFormat = GUID_WICPixelFormat128bppRGBFloat; + colorPixelFormat = GUID_WICPixelFormat128bppRGBFloat; } colorWithAlphaBytesPerPixel = 16; - colorWithAlphaPixelFormat = GUID_WICPixelFormat128bppRGBAFloat; + colorWithAlphaPixelFormat = GUID_WICPixelFormat128bppRGBAFloat; } } } @@ -514,7 +478,10 @@ HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha( hr = EnsureWicBitmapPixelFormat(pWIC, original, filter, colorWithAlphaPixelFormat, converted.GetAddressOf()); if (SUCCEEDED(hr)) { - hr = colorWithAlphaScaler->Initialize(converted.Get(), static_cast(newWidth), static_cast(newHeight), interpolationMode); + hr = colorWithAlphaScaler->Initialize(converted.Get(), + static_cast(newWidth), + static_cast(newHeight), + interpolationMode); } } @@ -524,7 +491,11 @@ HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha( hr = pWIC->CreateBitmapFromSource(colorWithAlphaScaler.Get(), WICBitmapCacheOnDemand, resized.GetAddressOf()); if (SUCCEEDED(hr)) { - hr = EnsureWicBitmapPixelFormat(pWIC, resized.Get(), filter, colorWithAlphaPixelFormat, resizedColorWithAlpha.GetAddressOf()); + hr = EnsureWicBitmapPixelFormat(pWIC, + resized.Get(), + filter, + colorWithAlphaPixelFormat, + resizedColorWithAlpha.GetAddressOf()); } } } @@ -542,9 +513,9 @@ HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha( if (SUCCEEDED(hr)) { - BYTE* colorWithAlphaData = nullptr; - UINT colorWithAlphaSizeInBytes = 0; - UINT colorWithAlphaStride = 0; + BYTE* colorWithAlphaData = nullptr; + UINT colorWithAlphaSizeInBytes = 0; + UINT colorWithAlphaStride = 0; hr = colorWithAlphaLock->GetDataPointer(&colorWithAlphaSizeInBytes, &colorWithAlphaData); if (SUCCEEDED(hr)) @@ -559,9 +530,9 @@ HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha( } } - BYTE* colorData = nullptr; - UINT colorSizeInBytes = 0; - UINT colorStride = 0; + BYTE* colorData = nullptr; + UINT colorSizeInBytes = 0; + UINT colorStride = 0; if (SUCCEEDED(hr)) { hr = colorLock->GetDataPointer(&colorSizeInBytes, &colorData); @@ -582,8 +553,8 @@ HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha( { for (size_t i = 0; SUCCEEDED(hr) && i < newWidth; i++) { - size_t colorWithAlphaIndex = (j * colorWithAlphaStride) + (i * colorWithAlphaBytesPerPixel); - const size_t colorIndex = (j * colorStride) + (i * colorBytesPerPixel); + size_t colorWithAlphaIndex = (j * colorWithAlphaStride) + (i * colorWithAlphaBytesPerPixel); + const size_t colorIndex = (j * colorStride) + (i * colorBytesPerPixel); if (((colorWithAlphaIndex + colorBytesInPixel) > colorWithAlphaSizeInBytes) || ((colorIndex + colorBytesPerPixel) > colorSizeInBytes)) @@ -592,8 +563,11 @@ HRESULT DirectX::Internal::ResizeSeparateColorAndAlpha( } else { - #pragma warning( suppress : 26014 6386 ) // No overflow possible here - memcpy_s(colorWithAlphaData + colorWithAlphaIndex, colorWithAlphaBytesPerPixel, colorData + colorIndex, colorBytesInPixel); +#pragma warning(suppress : 26014 6386) // No overflow possible here + memcpy_s(colorWithAlphaData + colorWithAlphaIndex, + colorWithAlphaBytesPerPixel, + colorData + colorIndex, + colorBytesInPixel); } } } @@ -641,14 +615,13 @@ namespace return false; } - #if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) - if (format == DXGI_FORMAT_R16G16B16A16_FLOAT - || format == DXGI_FORMAT_R16_FLOAT) +#if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) + if (format == DXGI_FORMAT_R16G16B16A16_FLOAT || format == DXGI_FORMAT_R16_FLOAT) { // Use non-WIC code paths as these conversions are not supported by Xbox version of WIC return false; } - #endif +#endif static_assert(TEX_FILTER_POINT == 0x100000, "TEX_FILTER_ flag values don't match TEX_FILTER_MODE_MASK"); @@ -698,15 +671,13 @@ namespace return true; } - //--- mipmap (1D/2D) generation using WIC image scalar --- - HRESULT GenerateMipMapsUsingWIC( - _In_ const Image& baseImage, - _In_ TEX_FILTER_FLAGS filter, - _In_ size_t levels, - _In_ const WICPixelFormatGUID& pfGUID, - _In_ const ScratchImage& mipChain, - _In_ size_t item) noexcept + HRESULT GenerateMipMapsUsingWIC(_In_ const Image& baseImage, + _In_ TEX_FILTER_FLAGS filter, + _In_ size_t levels, + _In_ const WICPixelFormatGUID& pfGUID, + _In_ const ScratchImage& mipChain, + _In_ size_t item) noexcept { assert(levels > 1); @@ -714,25 +685,29 @@ namespace return E_POINTER; bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; - size_t width = baseImage.width; + size_t width = baseImage.width; size_t height = baseImage.height; if (baseImage.rowPitch > UINT32_MAX || baseImage.slicePitch > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; ComPtr source; - HRESULT hr = pWIC->CreateBitmapFromMemory(static_cast(width), static_cast(height), pfGUID, - static_cast(baseImage.rowPitch), static_cast(baseImage.slicePitch), - baseImage.pixels, source.GetAddressOf()); + HRESULT hr = pWIC->CreateBitmapFromMemory(static_cast(width), + static_cast(height), + pfGUID, + static_cast(baseImage.rowPitch), + static_cast(baseImage.slicePitch), + baseImage.pixels, + source.GetAddressOf()); if (FAILED(hr)) return hr; // Copy base image to top miplevel - const Image *img0 = mipChain.GetImage(0, item, 0); + const Image* img0 = mipChain.GetImage(0, item, 0); if (!img0) return E_POINTER; @@ -740,7 +715,7 @@ namespace if (!pDest) return E_POINTER; - const uint8_t *pSrc = baseImage.pixels; + const uint8_t* pSrc = baseImage.pixels; for (size_t h = 0; h < height; ++h) { const size_t msize = std::min(img0->rowPitch, baseImage.rowPitch); @@ -760,14 +735,14 @@ namespace return hr; BOOL supportsTransparency = FALSE; - hr = pixelFormatInfo->SupportsTransparency(&supportsTransparency); + hr = pixelFormatInfo->SupportsTransparency(&supportsTransparency); if (FAILED(hr)) return hr; // Resize base image to each target mip level for (size_t level = 1; level < levels; ++level) { - const Image *img = mipChain.GetImage(level, item, 0); + const Image* img = mipChain.GetImage(level, item, 0); if (!img) return E_POINTER; @@ -795,9 +770,7 @@ namespace if (img->rowPitch > UINT32_MAX || img->slicePitch > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; - hr = scaler->Initialize(source.Get(), - static_cast(width), static_cast(height), - GetWICInterp(filter)); + hr = scaler->Initialize(source.Get(), static_cast(width), static_cast(height), GetWICInterp(filter)); if (FAILED(hr)) return hr; @@ -822,14 +795,13 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pfScaler, pfGUID, &canConvert); + hr = FC->CanConvert(pfScaler, pfGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; } - hr = FC->Initialize(scaler.Get(), pfGUID, GetWICDither(filter), nullptr, - 0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(scaler.Get(), pfGUID, GetWICDither(filter), nullptr, 0, WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; @@ -844,15 +816,13 @@ namespace } #endif // WIN32 - //------------------------------------------------------------------------------------- // Generate (1D/2D) mip-map helpers (custom filtering) //------------------------------------------------------------------------------------- - HRESULT Setup2DMips( - _In_reads_(nimages) const Image* baseImages, - _In_ size_t nimages, - _In_ const TexMetadata& mdata, - _Out_ ScratchImage& mipChain) noexcept + HRESULT Setup2DMips(_In_reads_(nimages) const Image* baseImages, + _In_ size_t nimages, + _In_ const TexMetadata& mdata, + _Out_ ScratchImage& mipChain) noexcept { if (!baseImages || !nimages) return E_INVALIDARG; @@ -873,7 +843,7 @@ namespace { const Image& src = baseImages[item]; - const Image *dest = mipChain.GetImage(0, item, 0); + const Image* dest = mipChain.GetImage(0, item, 0); if (!dest) { mipChain.Release(); @@ -889,8 +859,8 @@ namespace return E_POINTER; } - const uint8_t *pSrc = src.pixels; - const size_t rowPitch = src.rowPitch; + const uint8_t* pSrc = src.pixels; + const size_t rowPitch = src.rowPitch; for (size_t h = 0; h < mdata.height; ++h) { const size_t msize = std::min(dest->rowPitch, rowPitch); @@ -913,7 +883,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; // Allocate temporary space (2 scanlines) @@ -928,23 +898,23 @@ namespace // Resize base image to each target mip level for (size_t level = 1; level < levels; ++level) { - #ifdef _DEBUG - memset(row, 0xCD, sizeof(XMVECTOR)*width); - #endif +#ifdef _DEBUG + memset(row, 0xCD, sizeof(XMVECTOR) * width); +#endif // 2D point filter - const Image* src = mipChain.GetImage(level - 1, item, 0); + const Image* src = mipChain.GetImage(level - 1, item, 0); const Image* dest = mipChain.GetImage(level, item, 0); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - uint8_t* pDest = dest->pixels; + const uint8_t* pSrc = src->pixels; + uint8_t* pDest = dest->pixels; const size_t rowPitch = src->rowPitch; - const size_t nwidth = (width > 1) ? (width >> 1) : 1; + const size_t nwidth = (width > 1) ? (width >> 1) : 1; const size_t nheight = (height > 1) ? (height >> 1) : 1; const size_t xinc = (width << 16) / nwidth; @@ -986,7 +956,6 @@ namespace return S_OK; } - //--- 2D Box Filter --- HRESULT Generate2DMipsBoxFilter(size_t levels, TEX_FILTER_FLAGS filter, const ScratchImage& mipChain, size_t item) noexcept { @@ -999,7 +968,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; if (!ispow2(width) || !ispow2(height)) @@ -1033,18 +1002,18 @@ namespace } // 2D box filter - const Image* src = mipChain.GetImage(level - 1, item, 0); + const Image* src = mipChain.GetImage(level - 1, item, 0); const Image* dest = mipChain.GetImage(level, item, 0); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - uint8_t* pDest = dest->pixels; + const uint8_t* pSrc = src->pixels; + uint8_t* pDest = dest->pixels; const size_t rowPitch = src->rowPitch; - const size_t nwidth = (width > 1) ? (width >> 1) : 1; + const size_t nwidth = (width > 1) ? (width >> 1) : 1; const size_t nheight = (height > 1) ? (height >> 1) : 1; for (size_t y = 0; y < nheight; ++y) @@ -1082,7 +1051,6 @@ namespace return S_OK; } - //--- 2D Linear Filter --- HRESULT Generate2DMipsLinearFilter(size_t levels, TEX_FILTER_FLAGS filter, const ScratchImage& mipChain, size_t item) noexcept { @@ -1095,7 +1063,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; // Allocate temporary space (3 scanlines, plus X and Y filters) @@ -1119,14 +1087,14 @@ namespace for (size_t level = 1; level < levels; ++level) { // 2D linear filter - const Image* src = mipChain.GetImage(level - 1, item, 0); + const Image* src = mipChain.GetImage(level - 1, item, 0); const Image* dest = mipChain.GetImage(level, item, 0); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - uint8_t* pDest = dest->pixels; + const uint8_t* pSrc = src->pixels; + uint8_t* pDest = dest->pixels; const size_t rowPitch = src->rowPitch; @@ -1136,10 +1104,10 @@ namespace const size_t nheight = (height > 1) ? (height >> 1) : 1; CreateLinearFilter(height, nheight, (filter & TEX_FILTER_WRAP_V) != 0, lfY); - #ifdef _DEBUG - memset(row0, 0xCD, sizeof(XMVECTOR)*width); - memset(row1, 0xDD, sizeof(XMVECTOR)*width); - #endif +#ifdef _DEBUG + memset(row0, 0xCD, sizeof(XMVECTOR) * width); + memset(row1, 0xDD, sizeof(XMVECTOR) * width); +#endif size_t u0 = size_t(-1); size_t u1 = size_t(-1); @@ -1212,7 +1180,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; // Allocate temporary space (5 scanlines, plus X and Y filters) @@ -1238,14 +1206,14 @@ namespace for (size_t level = 1; level < levels; ++level) { // 2D cubic filter - const Image* src = mipChain.GetImage(level - 1, item, 0); + const Image* src = mipChain.GetImage(level - 1, item, 0); const Image* dest = mipChain.GetImage(level, item, 0); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - uint8_t* pDest = dest->pixels; + const uint8_t* pSrc = src->pixels; + uint8_t* pDest = dest->pixels; const size_t rowPitch = src->rowPitch; @@ -1255,12 +1223,12 @@ namespace const size_t nheight = (height > 1) ? (height >> 1) : 1; CreateCubicFilter(height, nheight, (filter & TEX_FILTER_WRAP_V) != 0, (filter & TEX_FILTER_MIRROR_V) != 0, cfY); - #ifdef _DEBUG - memset(row0, 0xCD, sizeof(XMVECTOR)*width); - memset(row1, 0xDD, sizeof(XMVECTOR)*width); - memset(row2, 0xED, sizeof(XMVECTOR)*width); - memset(row3, 0xFD, sizeof(XMVECTOR)*width); - #endif +#ifdef _DEBUG + memset(row0, 0xCD, sizeof(XMVECTOR) * width); + memset(row1, 0xDD, sizeof(XMVECTOR) * width); + memset(row2, 0xED, sizeof(XMVECTOR) * width); + memset(row3, 0xFD, sizeof(XMVECTOR) * width); +#endif size_t u0 = size_t(-1); size_t u1 = size_t(-1); @@ -1387,7 +1355,6 @@ namespace return S_OK; } - //--- 2D Triangle Filter --- HRESULT Generate2DMipsTriangleFilter(size_t levels, TEX_FILTER_FLAGS filter, const ScratchImage& mipChain, size_t item) noexcept { @@ -1400,7 +1367,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; // Allocate initial temporary space (1 scanline, accumulation rows, plus X and Y filters) @@ -1412,7 +1379,7 @@ namespace if (!rowActive) return E_OUTOFMEMORY; - TriangleRow * rowFree = nullptr; + TriangleRow* rowFree = nullptr; std::unique_ptr tfX, tfY; @@ -1422,37 +1389,37 @@ namespace for (size_t level = 1; level < levels; ++level) { // 2D triangle filter - const Image* src = mipChain.GetImage(level - 1, item, 0); + const Image* src = mipChain.GetImage(level - 1, item, 0); const Image* dest = mipChain.GetImage(level, item, 0); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - const size_t rowPitch = src->rowPitch; - const uint8_t* pEndSrc = pSrc + rowPitch * height; + const uint8_t* pSrc = src->pixels; + const size_t rowPitch = src->rowPitch; + const uint8_t* pEndSrc = pSrc + rowPitch * height; uint8_t* pDest = dest->pixels; const size_t nwidth = (width > 1) ? (width >> 1) : 1; - HRESULT hr = CreateTriangleFilter(width, nwidth, (filter & TEX_FILTER_WRAP_U) != 0, tfX); + HRESULT hr = CreateTriangleFilter(width, nwidth, (filter & TEX_FILTER_WRAP_U) != 0, tfX); if (FAILED(hr)) return hr; const size_t nheight = (height > 1) ? (height >> 1) : 1; - hr = CreateTriangleFilter(height, nheight, (filter & TEX_FILTER_WRAP_V) != 0, tfY); + hr = CreateTriangleFilter(height, nheight, (filter & TEX_FILTER_WRAP_V) != 0, tfY); if (FAILED(hr)) return hr; - #ifdef _DEBUG - memset(row, 0xCD, sizeof(XMVECTOR)*width); - #endif +#ifdef _DEBUG + memset(row, 0xCD, sizeof(XMVECTOR) * width); +#endif auto xFromEnd = reinterpret_cast(reinterpret_cast(tfX.get()) + tfX->sizeInBytes); auto yFromEnd = reinterpret_cast(reinterpret_cast(tfY.get()) + tfY->sizeInBytes); // Count times rows get written (and clear out any leftover accumulation rows from last miplevel) - for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd; ) + for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd;) { for (size_t j = 0; j < yFrom->count; ++j) { @@ -1472,7 +1439,7 @@ namespace } // Filter image - for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd; ) + for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd;) { // Create accumulation rows as needed for (size_t j = 0; j < yFrom->count; ++j) @@ -1560,22 +1527,20 @@ namespace switch (dest->format) { case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_R10G10B10A2_UINT: - { - // Need to slightly bias results for floating-point error accumulation which can - // be visible with harshly quantized values - static const XMVECTORF32 Bias = { { { 0.f, 0.f, 0.f, 0.1f } } }; + case DXGI_FORMAT_R10G10B10A2_UINT: { + // Need to slightly bias results for floating-point error accumulation which can + // be visible with harshly quantized values + static const XMVECTORF32 Bias = { { { 0.f, 0.f, 0.f, 0.1f } } }; - XMVECTOR* ptr = pAccSrc; - for (size_t i = 0; i < dest->width; ++i, ++ptr) - { - *ptr = XMVectorAdd(*ptr, Bias); - } + XMVECTOR* ptr = pAccSrc; + for (size_t i = 0; i < dest->width; ++i, ++ptr) + { + *ptr = XMVectorAdd(*ptr, Bias); } - break; + } + break; - default: - break; + default: break; } // This performs any required clamping @@ -1584,7 +1549,7 @@ namespace // Put row on freelist to reuse it's allocated scanline rowAcc->next = rowFree; - rowFree = rowAcc; + rowFree = rowAcc; } } @@ -1601,15 +1566,10 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Generate volume mip-map helpers //------------------------------------------------------------------------------------- - HRESULT Setup3DMips( - _In_reads_(depth) const Image* baseImages, - size_t depth, - size_t levels, - _Out_ ScratchImage& mipChain) noexcept + HRESULT Setup3DMips(_In_reads_(depth) const Image* baseImages, size_t depth, size_t levels, _Out_ ScratchImage& mipChain) noexcept { if (!baseImages || !depth) return E_INVALIDARG; @@ -1619,7 +1579,7 @@ namespace assert(levels > 1); - const size_t width = baseImages[0].width; + const size_t width = baseImages[0].width; const size_t height = baseImages[0].height; HRESULT hr = mipChain.Initialize3D(baseImages[0].format, width, height, depth, levels); @@ -1631,7 +1591,7 @@ namespace { const Image& src = baseImages[slice]; - const Image *dest = mipChain.GetImage(0, 0, slice); + const Image* dest = mipChain.GetImage(0, 0, slice); if (!dest) { mipChain.Release(); @@ -1647,8 +1607,8 @@ namespace return E_POINTER; } - const uint8_t *pSrc = src.pixels; - const size_t rowPitch = src.rowPitch; + const uint8_t* pSrc = src.pixels; + const size_t rowPitch = src.rowPitch; for (size_t h = 0; h < height; ++h) { const size_t msize = std::min(dest->rowPitch, rowPitch); @@ -1661,7 +1621,6 @@ namespace return S_OK; } - //--- 3D Point Filter --- HRESULT Generate3DMipsPointFilter(size_t depth, size_t levels, const ScratchImage& mipChain) noexcept { @@ -1675,7 +1634,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; // Allocate temporary space (2 scanlines) @@ -1690,9 +1649,9 @@ namespace // Resize base image to each target mip level for (size_t level = 1; level < levels; ++level) { - #ifdef _DEBUG - memset(row, 0xCD, sizeof(XMVECTOR)*width); - #endif +#ifdef _DEBUG + memset(row, 0xCD, sizeof(XMVECTOR) * width); +#endif if (depth > 1) { @@ -1704,18 +1663,18 @@ namespace size_t sz = 0; for (size_t slice = 0; slice < ndepth; ++slice) { - const Image* src = mipChain.GetImage(level - 1, 0, (sz >> 16)); + const Image* src = mipChain.GetImage(level - 1, 0, (sz >> 16)); const Image* dest = mipChain.GetImage(level, 0, slice); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - uint8_t* pDest = dest->pixels; + const uint8_t* pSrc = src->pixels; + uint8_t* pDest = dest->pixels; const size_t rowPitch = src->rowPitch; - const size_t nwidth = (width > 1) ? (width >> 1) : 1; + const size_t nwidth = (width > 1) ? (width >> 1) : 1; const size_t nheight = (height > 1) ? (height >> 1) : 1; const size_t xinc = (width << 16) / nwidth; @@ -1753,18 +1712,18 @@ namespace else { // 2D point filter - const Image* src = mipChain.GetImage(level - 1, 0, 0); + const Image* src = mipChain.GetImage(level - 1, 0, 0); const Image* dest = mipChain.GetImage(level, 0, 0); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - uint8_t* pDest = dest->pixels; + const uint8_t* pSrc = src->pixels; + uint8_t* pDest = dest->pixels; const size_t rowPitch = src->rowPitch; - const size_t nwidth = (width > 1) ? (width >> 1) : 1; + const size_t nwidth = (width > 1) ? (width >> 1) : 1; const size_t nheight = (height > 1) ? (height >> 1) : 1; const size_t xinc = (width << 16) / nwidth; @@ -1810,7 +1769,6 @@ namespace return S_OK; } - //--- 3D Box Filter --- HRESULT Generate3DMipsBoxFilter(size_t depth, size_t levels, TEX_FILTER_FLAGS filter, const ScratchImage& mipChain) noexcept { @@ -1826,7 +1784,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; if (!ispow2(width) || !ispow2(height) || !ispow2(depth)) @@ -1885,12 +1843,12 @@ namespace const uint8_t* pSrc1 = srca->pixels; const uint8_t* pSrc2 = srcb->pixels; - uint8_t* pDest = dest->pixels; + uint8_t* pDest = dest->pixels; const size_t aRowPitch = srca->rowPitch; const size_t bRowPitch = srcb->rowPitch; - const size_t nwidth = (width > 1) ? (width >> 1) : 1; + const size_t nwidth = (width > 1) ? (width >> 1) : 1; const size_t nheight = (height > 1) ? (height >> 1) : 1; for (size_t y = 0; y < nheight; ++y) @@ -1921,8 +1879,7 @@ namespace { const size_t x2 = x << 1; - AVERAGE8(target[x], urow0[x2], urow1[x2], urow2[x2], urow3[x2], - vrow0[x2], vrow1[x2], vrow2[x2], vrow3[x2]) + AVERAGE8(target[x], urow0[x2], urow1[x2], urow2[x2], urow3[x2], vrow0[x2], vrow1[x2], vrow2[x2], vrow3[x2]) } if (!StoreScanlineLinear(pDest, dest->rowPitch, dest->format, target, nwidth, filter)) @@ -1934,18 +1891,18 @@ namespace else { // 2D box filter - const Image* src = mipChain.GetImage(level - 1, 0, 0); + const Image* src = mipChain.GetImage(level - 1, 0, 0); const Image* dest = mipChain.GetImage(level, 0, 0); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - uint8_t* pDest = dest->pixels; + const uint8_t* pSrc = src->pixels; + uint8_t* pDest = dest->pixels; const size_t rowPitch = src->rowPitch; - const size_t nwidth = (width > 1) ? (width >> 1) : 1; + const size_t nwidth = (width > 1) ? (width >> 1) : 1; const size_t nheight = (height > 1) ? (height >> 1) : 1; for (size_t y = 0; y < nheight; ++y) @@ -1987,7 +1944,6 @@ namespace return S_OK; } - //--- 3D Linear Filter --- HRESULT Generate3DMipsLinearFilter(size_t depth, size_t levels, TEX_FILTER_FLAGS filter, const ScratchImage& mipChain) noexcept { @@ -2003,7 +1959,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; // Allocate temporary space (5 scanlines, plus X/Y/Z filters) @@ -2035,12 +1991,12 @@ namespace const size_t nheight = (height > 1) ? (height >> 1) : 1; CreateLinearFilter(height, nheight, (filter & TEX_FILTER_WRAP_V) != 0, lfY); - #ifdef _DEBUG - memset(urow0, 0xCD, sizeof(XMVECTOR)*width); - memset(urow1, 0xDD, sizeof(XMVECTOR)*width); - memset(vrow0, 0xED, sizeof(XMVECTOR)*width); - memset(vrow1, 0xFD, sizeof(XMVECTOR)*width); - #endif +#ifdef _DEBUG + memset(urow0, 0xCD, sizeof(XMVECTOR) * width); + memset(urow1, 0xDD, sizeof(XMVECTOR) * width); + memset(vrow0, 0xED, sizeof(XMVECTOR) * width); + memset(vrow1, 0xFD, sizeof(XMVECTOR) * width); +#endif if (depth > 1) { @@ -2076,8 +2032,18 @@ namespace { u0 = toY.u0; - if (!LoadScanlineLinear(urow0, width, srca->pixels + (srca->rowPitch * u0), srca->rowPitch, srca->format, filter) - || !LoadScanlineLinear(vrow0, width, srcb->pixels + (srcb->rowPitch * u0), srcb->rowPitch, srcb->format, filter)) + if (!LoadScanlineLinear(urow0, + width, + srca->pixels + (srca->rowPitch * u0), + srca->rowPitch, + srca->format, + filter) + || !LoadScanlineLinear(vrow0, + width, + srcb->pixels + (srcb->rowPitch * u0), + srcb->rowPitch, + srcb->format, + filter)) return E_FAIL; } else @@ -2094,8 +2060,18 @@ namespace { u1 = toY.u1; - if (!LoadScanlineLinear(urow1, width, srca->pixels + (srca->rowPitch * u1), srca->rowPitch, srca->format, filter) - || !LoadScanlineLinear(vrow1, width, srcb->pixels + (srcb->rowPitch * u1), srcb->rowPitch, srcb->format, filter)) + if (!LoadScanlineLinear(urow1, + width, + srca->pixels + (srca->rowPitch * u1), + srca->rowPitch, + srca->format, + filter) + || !LoadScanlineLinear(vrow1, + width, + srcb->pixels + (srcb->rowPitch * u1), + srcb->rowPitch, + srcb->format, + filter)) return E_FAIL; } @@ -2115,14 +2091,14 @@ namespace else { // 2D linear filter - const Image* src = mipChain.GetImage(level - 1, 0, 0); + const Image* src = mipChain.GetImage(level - 1, 0, 0); const Image* dest = mipChain.GetImage(level, 0, 0); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - uint8_t* pDest = dest->pixels; + const uint8_t* pSrc = src->pixels; + uint8_t* pDest = dest->pixels; const size_t rowPitch = src->rowPitch; @@ -2185,7 +2161,6 @@ namespace return S_OK; } - //--- 3D Cubic Filter --- HRESULT Generate3DMipsCubicFilter(size_t depth, size_t levels, TEX_FILTER_FLAGS filter, const ScratchImage& mipChain) noexcept { @@ -2201,7 +2176,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; // Allocate temporary space (17 scanlines, plus X/Y/Z filters) @@ -2224,13 +2199,17 @@ namespace XMVECTOR* srow[4]; XMVECTOR* trow[4]; - XMVECTOR *ptr = scanline.get() + width; + XMVECTOR* ptr = scanline.get() + width; for (size_t j = 0; j < 4; ++j) { - urow[j] = ptr; ptr += width; - vrow[j] = ptr; ptr += width; - srow[j] = ptr; ptr += width; - trow[j] = ptr; ptr += width; + urow[j] = ptr; + ptr += width; + vrow[j] = ptr; + ptr += width; + srow[j] = ptr; + ptr += width; + trow[j] = ptr; + ptr += width; } // Resize base image to each target mip level @@ -2242,15 +2221,15 @@ namespace const size_t nheight = (height > 1) ? (height >> 1) : 1; CreateCubicFilter(height, nheight, (filter & TEX_FILTER_WRAP_V) != 0, (filter & TEX_FILTER_MIRROR_V) != 0, cfY); - #ifdef _DEBUG +#ifdef _DEBUG for (size_t j = 0; j < 4; ++j) { - memset(urow[j], 0xCD, sizeof(XMVECTOR)*width); - memset(vrow[j], 0xDD, sizeof(XMVECTOR)*width); - memset(srow[j], 0xED, sizeof(XMVECTOR)*width); - memset(trow[j], 0xFD, sizeof(XMVECTOR)*width); + memset(urow[j], 0xCD, sizeof(XMVECTOR) * width); + memset(vrow[j], 0xDD, sizeof(XMVECTOR) * width); + memset(srow[j], 0xED, sizeof(XMVECTOR) * width); + memset(trow[j], 0xFD, sizeof(XMVECTOR) * width); } - #endif +#endif if (depth > 1) { @@ -2291,10 +2270,30 @@ namespace { u0 = toY.u0; - if (!LoadScanlineLinear(urow[0], width, srca->pixels + (srca->rowPitch * u0), srca->rowPitch, srca->format, filter) - || !LoadScanlineLinear(urow[1], width, srcb->pixels + (srcb->rowPitch * u0), srcb->rowPitch, srcb->format, filter) - || !LoadScanlineLinear(urow[2], width, srcc->pixels + (srcc->rowPitch * u0), srcc->rowPitch, srcc->format, filter) - || !LoadScanlineLinear(urow[3], width, srcd->pixels + (srcd->rowPitch * u0), srcd->rowPitch, srcd->format, filter)) + if (!LoadScanlineLinear(urow[0], + width, + srca->pixels + (srca->rowPitch * u0), + srca->rowPitch, + srca->format, + filter) + || !LoadScanlineLinear(urow[1], + width, + srcb->pixels + (srcb->rowPitch * u0), + srcb->rowPitch, + srcb->format, + filter) + || !LoadScanlineLinear(urow[2], + width, + srcc->pixels + (srcc->rowPitch * u0), + srcc->rowPitch, + srcc->format, + filter) + || !LoadScanlineLinear(urow[3], + width, + srcd->pixels + (srcd->rowPitch * u0), + srcd->rowPitch, + srcd->format, + filter)) return E_FAIL; } else if (toY.u0 == u1) @@ -2336,10 +2335,30 @@ namespace { u1 = toY.u1; - if (!LoadScanlineLinear(vrow[0], width, srca->pixels + (srca->rowPitch * u1), srca->rowPitch, srca->format, filter) - || !LoadScanlineLinear(vrow[1], width, srcb->pixels + (srcb->rowPitch * u1), srcb->rowPitch, srcb->format, filter) - || !LoadScanlineLinear(vrow[2], width, srcc->pixels + (srcc->rowPitch * u1), srcc->rowPitch, srcc->format, filter) - || !LoadScanlineLinear(vrow[3], width, srcd->pixels + (srcd->rowPitch * u1), srcd->rowPitch, srcd->format, filter)) + if (!LoadScanlineLinear(vrow[0], + width, + srca->pixels + (srca->rowPitch * u1), + srca->rowPitch, + srca->format, + filter) + || !LoadScanlineLinear(vrow[1], + width, + srcb->pixels + (srcb->rowPitch * u1), + srcb->rowPitch, + srcb->format, + filter) + || !LoadScanlineLinear(vrow[2], + width, + srcc->pixels + (srcc->rowPitch * u1), + srcc->rowPitch, + srcc->format, + filter) + || !LoadScanlineLinear(vrow[3], + width, + srcd->pixels + (srcd->rowPitch * u1), + srcd->rowPitch, + srcd->format, + filter)) return E_FAIL; } else if (toY.u1 == u2) @@ -2371,10 +2390,30 @@ namespace { u2 = toY.u2; - if (!LoadScanlineLinear(srow[0], width, srca->pixels + (srca->rowPitch * u2), srca->rowPitch, srca->format, filter) - || !LoadScanlineLinear(srow[1], width, srcb->pixels + (srcb->rowPitch * u2), srcb->rowPitch, srcb->format, filter) - || !LoadScanlineLinear(srow[2], width, srcc->pixels + (srcc->rowPitch * u2), srcc->rowPitch, srcc->format, filter) - || !LoadScanlineLinear(srow[3], width, srcd->pixels + (srcd->rowPitch * u2), srcd->rowPitch, srcd->format, filter)) + if (!LoadScanlineLinear(srow[0], + width, + srca->pixels + (srca->rowPitch * u2), + srca->rowPitch, + srca->format, + filter) + || !LoadScanlineLinear(srow[1], + width, + srcb->pixels + (srcb->rowPitch * u2), + srcb->rowPitch, + srcb->format, + filter) + || !LoadScanlineLinear(srow[2], + width, + srcc->pixels + (srcc->rowPitch * u2), + srcc->rowPitch, + srcc->format, + filter) + || !LoadScanlineLinear(srow[3], + width, + srcd->pixels + (srcd->rowPitch * u2), + srcd->rowPitch, + srcd->format, + filter)) return E_FAIL; } else @@ -2394,10 +2433,30 @@ namespace { u3 = toY.u3; - if (!LoadScanlineLinear(trow[0], width, srca->pixels + (srca->rowPitch * u3), srca->rowPitch, srca->format, filter) - || !LoadScanlineLinear(trow[1], width, srcb->pixels + (srcb->rowPitch * u3), srcb->rowPitch, srcb->format, filter) - || !LoadScanlineLinear(trow[2], width, srcc->pixels + (srcc->rowPitch * u3), srcc->rowPitch, srcc->format, filter) - || !LoadScanlineLinear(trow[3], width, srcd->pixels + (srcd->rowPitch * u3), srcd->rowPitch, srcd->format, filter)) + if (!LoadScanlineLinear(trow[0], + width, + srca->pixels + (srca->rowPitch * u3), + srca->rowPitch, + srca->format, + filter) + || !LoadScanlineLinear(trow[1], + width, + srcb->pixels + (srcb->rowPitch * u3), + srcb->rowPitch, + srcb->format, + filter) + || !LoadScanlineLinear(trow[2], + width, + srcc->pixels + (srcc->rowPitch * u3), + srcc->rowPitch, + srcc->format, + filter) + || !LoadScanlineLinear(trow[3], + width, + srcd->pixels + (srcd->rowPitch * u3), + srcd->rowPitch, + srcd->format, + filter)) return E_FAIL; } @@ -2430,14 +2489,14 @@ namespace else { // 2D cubic filter - const Image* src = mipChain.GetImage(level - 1, 0, 0); + const Image* src = mipChain.GetImage(level - 1, 0, 0); const Image* dest = mipChain.GetImage(level, 0, 0); if (!src || !dest) return E_POINTER; - const uint8_t* pSrc = src->pixels; - uint8_t* pDest = dest->pixels; + const uint8_t* pSrc = src->pixels; + uint8_t* pDest = dest->pixels; const size_t rowPitch = src->rowPitch; @@ -2569,7 +2628,6 @@ namespace return S_OK; } - //--- 3D Triangle Filter --- HRESULT Generate3DMipsTriangleFilter(size_t depth, size_t levels, TEX_FILTER_FLAGS filter, const ScratchImage& mipChain) noexcept { @@ -2585,7 +2643,7 @@ namespace assert(levels > 1); - size_t width = mipChain.GetMetadata().width; + size_t width = mipChain.GetMetadata().width; size_t height = mipChain.GetMetadata().height; // Allocate initial temporary space (1 scanline, accumulation rows, plus X/Y/Z filters) @@ -2597,7 +2655,7 @@ namespace if (!sliceActive) return E_OUTOFMEMORY; - TriangleRow * sliceFree = nullptr; + TriangleRow* sliceFree = nullptr; std::unique_ptr tfX, tfY, tfZ; @@ -2607,30 +2665,30 @@ namespace for (size_t level = 1; level < levels; ++level) { const size_t nwidth = (width > 1) ? (width >> 1) : 1; - HRESULT hr = CreateTriangleFilter(width, nwidth, (filter & TEX_FILTER_WRAP_U) != 0, tfX); + HRESULT hr = CreateTriangleFilter(width, nwidth, (filter & TEX_FILTER_WRAP_U) != 0, tfX); if (FAILED(hr)) return hr; const size_t nheight = (height > 1) ? (height >> 1) : 1; - hr = CreateTriangleFilter(height, nheight, (filter & TEX_FILTER_WRAP_V) != 0, tfY); + hr = CreateTriangleFilter(height, nheight, (filter & TEX_FILTER_WRAP_V) != 0, tfY); if (FAILED(hr)) return hr; const size_t ndepth = (depth > 1) ? (depth >> 1) : 1; - hr = CreateTriangleFilter(depth, ndepth, (filter & TEX_FILTER_WRAP_W) != 0, tfZ); + hr = CreateTriangleFilter(depth, ndepth, (filter & TEX_FILTER_WRAP_W) != 0, tfZ); if (FAILED(hr)) return hr; - #ifdef _DEBUG - memset(row, 0xCD, sizeof(XMVECTOR)*width); - #endif +#ifdef _DEBUG + memset(row, 0xCD, sizeof(XMVECTOR) * width); +#endif auto xFromEnd = reinterpret_cast(reinterpret_cast(tfX.get()) + tfX->sizeInBytes); auto yFromEnd = reinterpret_cast(reinterpret_cast(tfY.get()) + tfY->sizeInBytes); auto zFromEnd = reinterpret_cast(reinterpret_cast(tfZ.get()) + tfZ->sizeInBytes); // Count times slices get written (and clear out any leftover accumulation slices from last miplevel) - for (FilterFrom* zFrom = tfZ->from; zFrom < zFromEnd; ) + for (FilterFrom* zFrom = tfZ->from; zFrom < zFromEnd;) { for (size_t j = 0; j < zFrom->count; ++j) { @@ -2687,11 +2745,11 @@ namespace if (!src) return E_POINTER; - const uint8_t* pSrc = src->pixels; - const size_t rowPitch = src->rowPitch; - const uint8_t* pEndSrc = pSrc + rowPitch * height; + const uint8_t* pSrc = src->pixels; + const size_t rowPitch = src->rowPitch; + const uint8_t* pEndSrc = pSrc + rowPitch * height; - for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd; ) + for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd;) { // Load source scanline if ((pSrc + rowPitch) > pEndSrc) @@ -2722,7 +2780,7 @@ namespace assert(v < nheight); const float yweight = yFrom->to[k].weight; - XMVECTOR * accPtr = accSlice + v * nwidth; + XMVECTOR* accPtr = accSlice + v * nwidth; for (size_t l = 0; l < xFrom->count; ++l) { @@ -2755,8 +2813,8 @@ namespace if (!sliceAcc->remaining) { - const Image* dest = mipChain.GetImage(level, 0, w); - XMVECTOR* pAccSrc = sliceAcc->scanline.get(); + const Image* dest = mipChain.GetImage(level, 0, w); + XMVECTOR* pAccSrc = sliceAcc->scanline.get(); if (!dest || !pAccSrc) return E_POINTER; @@ -2767,22 +2825,20 @@ namespace switch (dest->format) { case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R10G10B10A2_UINT: { + // Need to slightly bias results for floating-point error accumulation which can + // be visible with harshly quantized values + static const XMVECTORF32 Bias = { { { 0.f, 0.f, 0.f, 0.1f } } }; + + XMVECTOR* ptr = pAccSrc; + for (size_t i = 0; i < dest->width; ++i, ++ptr) { - // Need to slightly bias results for floating-point error accumulation which can - // be visible with harshly quantized values - static const XMVECTORF32 Bias = { { { 0.f, 0.f, 0.f, 0.1f } } }; - - XMVECTOR* ptr = pAccSrc; - for (size_t i = 0; i < dest->width; ++i, ++ptr) - { - *ptr = XMVectorAdd(*ptr, Bias); - } + *ptr = XMVectorAdd(*ptr, Bias); } - break; + } + break; - default: - break; + default: break; } // This performs any required clamping @@ -2795,7 +2851,7 @@ namespace // Put slice on freelist to reuse it's allocated scanline sliceAcc->next = sliceFree; - sliceFree = sliceAcc; + sliceFree = sliceAcc; } } @@ -2814,8 +2870,7 @@ namespace return S_OK; } -} - +} // namespace //===================================================================================== // Entry-points @@ -2824,13 +2879,8 @@ namespace //------------------------------------------------------------------------------------- // Generate mipmap chain //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::GenerateMipMaps( - const Image& baseImage, - TEX_FILTER_FLAGS filter, - size_t levels, - ScratchImage& mipChain, - bool allow1D) noexcept +_Use_decl_annotations_ HRESULT +DirectX::GenerateMipMaps(const Image& baseImage, TEX_FILTER_FLAGS filter, size_t levels, ScratchImage& mipChain, bool allow1D) noexcept { if (!IsValid(baseImage.format)) return E_INVALIDARG; @@ -2857,12 +2907,13 @@ HRESULT DirectX::GenerateMipMaps( bool usewic = UseWICFiltering(baseImage.format, filter); WICPixelFormatGUID pfGUID = {}; - const bool wicpf = (usewic) ? DXGIToWIC(baseImage.format, pfGUID, true) : false; + const bool wicpf = (usewic) ? DXGIToWIC(baseImage.format, pfGUID, true) : false; if (usewic && !wicpf) { // Check to see if the source and/or result size is too big for WIC - const uint64_t expandedSize = uint64_t(std::max(1, baseImage.width >> 1)) * uint64_t(std::max(1, baseImage.height >> 1)) * sizeof(float) * 4; + const uint64_t expandedSize = uint64_t(std::max(1, baseImage.width >> 1)) + * uint64_t(std::max(1, baseImage.height >> 1)) * sizeof(float) * 4; const uint64_t expandedSize2 = uint64_t(baseImage.width) * uint64_t(baseImage.height) * sizeof(float) * 4; if (expandedSize > UINT32_MAX || expandedSize2 > UINT32_MAX) { @@ -2882,74 +2933,76 @@ HRESULT DirectX::GenerateMipMaps( case TEX_FILTER_POINT: case TEX_FILTER_FANT: // Equivalent to Box filter case TEX_FILTER_LINEAR: - case TEX_FILTER_CUBIC: - { - static_assert(TEX_FILTER_FANT == TEX_FILTER_BOX, "TEX_FILTER_ flag alias mismatch"); + case TEX_FILTER_CUBIC: { + static_assert(TEX_FILTER_FANT == TEX_FILTER_BOX, "TEX_FILTER_ flag alias mismatch"); - if (wicpf) - { - // Case 1: Base image format is supported by Windows Imaging Component - hr = (baseImage.height > 1 || !allow1D) - ? mipChain.Initialize2D(baseImage.format, baseImage.width, baseImage.height, 1, levels) - : mipChain.Initialize1D(baseImage.format, baseImage.width, 1, levels); - if (FAILED(hr)) - return hr; + if (wicpf) + { + // Case 1: Base image format is supported by Windows Imaging Component + hr = (baseImage.height > 1 || !allow1D) ? + mipChain.Initialize2D(baseImage.format, baseImage.width, baseImage.height, 1, levels) : + mipChain.Initialize1D(baseImage.format, baseImage.width, 1, levels); + if (FAILED(hr)) + return hr; - return GenerateMipMapsUsingWIC(baseImage, filter, levels, pfGUID, mipChain, 0); - } - else - { - // Case 2: Base image format is not supported by WIC, so we have to convert, generate, and convert back - assert(baseImage.format != DXGI_FORMAT_R32G32B32A32_FLOAT); - ScratchImage temp; - hr = ConvertToR32G32B32A32(baseImage, temp); - if (FAILED(hr)) - return hr; + return GenerateMipMapsUsingWIC(baseImage, filter, levels, pfGUID, mipChain, 0); + } + else + { + // Case 2: Base image format is not supported by WIC, so we have to convert, generate, and convert back + assert(baseImage.format != DXGI_FORMAT_R32G32B32A32_FLOAT); + ScratchImage temp; + hr = ConvertToR32G32B32A32(baseImage, temp); + if (FAILED(hr)) + return hr; - const Image *timg = temp.GetImage(0, 0, 0); - if (!timg) - return E_POINTER; + const Image* timg = temp.GetImage(0, 0, 0); + if (!timg) + return E_POINTER; - ScratchImage tMipChain; - hr = (baseImage.height > 1 || !allow1D) - ? tMipChain.Initialize2D(DXGI_FORMAT_R32G32B32A32_FLOAT, baseImage.width, baseImage.height, 1, levels) - : tMipChain.Initialize1D(DXGI_FORMAT_R32G32B32A32_FLOAT, baseImage.width, 1, levels); - if (FAILED(hr)) - return hr; + ScratchImage tMipChain; + hr = (baseImage.height > 1 || !allow1D) ? + tMipChain.Initialize2D(DXGI_FORMAT_R32G32B32A32_FLOAT, baseImage.width, baseImage.height, 1, levels) : + tMipChain.Initialize1D(DXGI_FORMAT_R32G32B32A32_FLOAT, baseImage.width, 1, levels); + if (FAILED(hr)) + return hr; - hr = GenerateMipMapsUsingWIC(*timg, filter, levels, GUID_WICPixelFormat128bppRGBAFloat, tMipChain, 0); - if (FAILED(hr)) - return hr; + hr = GenerateMipMapsUsingWIC(*timg, filter, levels, GUID_WICPixelFormat128bppRGBAFloat, tMipChain, 0); + if (FAILED(hr)) + return hr; - temp.Release(); + temp.Release(); - return ConvertFromR32G32B32A32(tMipChain.GetImages(), tMipChain.GetImageCount(), tMipChain.GetMetadata(), baseImage.format, mipChain); - } + return ConvertFromR32G32B32A32(tMipChain.GetImages(), + tMipChain.GetImageCount(), + tMipChain.GetMetadata(), + baseImage.format, + mipChain); } + } - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } } else - #endif // WIN32 +#endif // WIN32 { //--- Use custom filters to generate mipmaps ---------------------------------- TexMetadata mdata = {}; - mdata.width = baseImage.width; + mdata.width = baseImage.width; if (baseImage.height > 1 || !allow1D) { - mdata.height = baseImage.height; + mdata.height = baseImage.height; mdata.dimension = TEX_DIMENSION_TEXTURE2D; } else { - mdata.height = 1; + mdata.height = 1; mdata.dimension = TEX_DIMENSION_TEXTURE1D; } mdata.depth = mdata.arraySize = 1; - mdata.mipLevels = levels; - mdata.format = baseImage.format; + mdata.mipLevels = levels; + mdata.format = baseImage.format; uint32_t filter_select = (filter & TEX_FILTER_MODE_MASK); if (!filter_select) @@ -3010,26 +3063,23 @@ HRESULT DirectX::GenerateMipMaps( mipChain.Release(); return hr; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } } } -_Use_decl_annotations_ -HRESULT DirectX::GenerateMipMaps( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - TEX_FILTER_FLAGS filter, - size_t levels, - ScratchImage& mipChain) +_Use_decl_annotations_ HRESULT DirectX::GenerateMipMaps(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + TEX_FILTER_FLAGS filter, + size_t levels, + ScratchImage& mipChain) { if (!srcImages || !nimages || !IsValid(metadata.format)) return E_INVALIDARG; - if (metadata.IsVolumemap() - || IsCompressed(metadata.format) || IsTypeless(metadata.format) || IsPlanar(metadata.format) || IsPalettized(metadata.format)) + if (metadata.IsVolumemap() || IsCompressed(metadata.format) || IsTypeless(metadata.format) || IsPlanar(metadata.format) + || IsPalettized(metadata.format)) return HRESULT_E_NOT_SUPPORTED; if (!CalculateMipLevels(metadata.width, metadata.height, levels)) @@ -3072,12 +3122,13 @@ HRESULT DirectX::GenerateMipMaps( bool usewic = !metadata.IsPMAlpha() && UseWICFiltering(metadata.format, filter); WICPixelFormatGUID pfGUID = {}; - const bool wicpf = (usewic) ? DXGIToWIC(metadata.format, pfGUID, true) : false; + const bool wicpf = (usewic) ? DXGIToWIC(metadata.format, pfGUID, true) : false; if (usewic && !wicpf) { // Check to see if the source and/or result size is too big for WIC - const uint64_t expandedSize = uint64_t(std::max(1, metadata.width >> 1)) * uint64_t(std::max(1, metadata.height >> 1)) * sizeof(float) * 4; + const uint64_t expandedSize + = uint64_t(std::max(1, metadata.width >> 1)) * uint64_t(std::max(1, metadata.height >> 1)) * sizeof(float) * 4; const uint64_t expandedSize2 = uint64_t(metadata.width) * uint64_t(metadata.height) * sizeof(float) * 4; if (expandedSize > UINT32_MAX || expandedSize2 > UINT32_MAX) { @@ -3097,74 +3148,76 @@ HRESULT DirectX::GenerateMipMaps( case TEX_FILTER_POINT: case TEX_FILTER_FANT: // Equivalent to Box filter case TEX_FILTER_LINEAR: - case TEX_FILTER_CUBIC: + case TEX_FILTER_CUBIC: { + static_assert(TEX_FILTER_FANT == TEX_FILTER_BOX, "TEX_FILTER_ flag alias mismatch"); + + if (wicpf) { - static_assert(TEX_FILTER_FANT == TEX_FILTER_BOX, "TEX_FILTER_ flag alias mismatch"); + // Case 1: Base image format is supported by Windows Imaging Component + TexMetadata mdata2 = metadata; + mdata2.mipLevels = levels; + hr = mipChain.Initialize(mdata2); + if (FAILED(hr)) + return hr; - if (wicpf) + for (size_t item = 0; item < metadata.arraySize; ++item) { - // Case 1: Base image format is supported by Windows Imaging Component - TexMetadata mdata2 = metadata; - mdata2.mipLevels = levels; - hr = mipChain.Initialize(mdata2); + hr = GenerateMipMapsUsingWIC(baseImages[item], filter, levels, pfGUID, mipChain, item); if (FAILED(hr)) - return hr; - - for (size_t item = 0; item < metadata.arraySize; ++item) { - hr = GenerateMipMapsUsingWIC(baseImages[item], filter, levels, pfGUID, mipChain, item); - if (FAILED(hr)) - { - mipChain.Release(); - return hr; - } + mipChain.Release(); + return hr; } - - return S_OK; } - else + + return S_OK; + } + else + { + // Case 2: Base image format is not supported by WIC, so we have to convert, generate, and convert back + assert(metadata.format != DXGI_FORMAT_R32G32B32A32_FLOAT); + + TexMetadata mdata2 = metadata; + mdata2.mipLevels = levels; + mdata2.format = DXGI_FORMAT_R32G32B32A32_FLOAT; + ScratchImage tMipChain; + hr = tMipChain.Initialize(mdata2); + if (FAILED(hr)) + return hr; + + for (size_t item = 0; item < metadata.arraySize; ++item) { - // Case 2: Base image format is not supported by WIC, so we have to convert, generate, and convert back - assert(metadata.format != DXGI_FORMAT_R32G32B32A32_FLOAT); - - TexMetadata mdata2 = metadata; - mdata2.mipLevels = levels; - mdata2.format = DXGI_FORMAT_R32G32B32A32_FLOAT; - ScratchImage tMipChain; - hr = tMipChain.Initialize(mdata2); + ScratchImage temp; + hr = ConvertToR32G32B32A32(baseImages[item], temp); if (FAILED(hr)) return hr; - for (size_t item = 0; item < metadata.arraySize; ++item) - { - ScratchImage temp; - hr = ConvertToR32G32B32A32(baseImages[item], temp); - if (FAILED(hr)) - return hr; - - const Image *timg = temp.GetImage(0, 0, 0); - if (!timg) - return E_POINTER; - - hr = GenerateMipMapsUsingWIC(*timg, filter, levels, GUID_WICPixelFormat128bppRGBAFloat, tMipChain, item); - if (FAILED(hr)) - return hr; - } + const Image* timg = temp.GetImage(0, 0, 0); + if (!timg) + return E_POINTER; - return ConvertFromR32G32B32A32(tMipChain.GetImages(), tMipChain.GetImageCount(), tMipChain.GetMetadata(), metadata.format, mipChain); + hr = GenerateMipMapsUsingWIC(*timg, filter, levels, GUID_WICPixelFormat128bppRGBAFloat, tMipChain, item); + if (FAILED(hr)) + return hr; } + + return ConvertFromR32G32B32A32(tMipChain.GetImages(), + tMipChain.GetImageCount(), + tMipChain.GetMetadata(), + metadata.format, + mipChain); } + } - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } } else - #endif // WIN32 +#endif // WIN32 { //--- Use custom filters to generate mipmaps ---------------------------------- TexMetadata mdata2 = metadata; - mdata2.mipLevels = levels; + mdata2.mipLevels = levels; uint32_t filter_select = (filter & TEX_FILTER_MODE_MASK); if (!filter_select) @@ -3240,23 +3293,16 @@ HRESULT DirectX::GenerateMipMaps( } return hr; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } } } - //------------------------------------------------------------------------------------- // Generate mipmap chain for volume texture //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::GenerateMipMaps3D( - const Image* baseImages, - size_t depth, - TEX_FILTER_FLAGS filter, - size_t levels, - ScratchImage& mipChain) noexcept +_Use_decl_annotations_ HRESULT +DirectX::GenerateMipMaps3D(const Image* baseImages, size_t depth, TEX_FILTER_FLAGS filter, size_t levels, ScratchImage& mipChain) noexcept { if (!baseImages || !depth) return E_INVALIDARG; @@ -3268,8 +3314,8 @@ HRESULT DirectX::GenerateMipMaps3D( return HRESULT_E_NOT_SUPPORTED; const DXGI_FORMAT format = baseImages[0].format; - const size_t width = baseImages[0].width; - const size_t height = baseImages[0].height; + const size_t width = baseImages[0].width; + const size_t height = baseImages[0].height; if (!CalculateMipLevels3D(width, height, depth, levels)) return E_INVALIDARG; @@ -3355,19 +3401,16 @@ HRESULT DirectX::GenerateMipMaps3D( mipChain.Release(); return hr; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } } -_Use_decl_annotations_ -HRESULT DirectX::GenerateMipMaps3D( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - TEX_FILTER_FLAGS filter, - size_t levels, - ScratchImage& mipChain) +_Use_decl_annotations_ HRESULT DirectX::GenerateMipMaps3D(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + TEX_FILTER_FLAGS filter, + size_t levels, + ScratchImage& mipChain) { if (!srcImages || !nimages || !IsValid(metadata.format)) return E_INVALIDARG; @@ -3378,8 +3421,8 @@ HRESULT DirectX::GenerateMipMaps3D( if (filter & TEX_FILTER_FORCE_WIC) return HRESULT_E_NOT_SUPPORTED; - if (!metadata.IsVolumemap() - || IsCompressed(metadata.format) || IsTypeless(metadata.format) || IsPlanar(metadata.format) || IsPalettized(metadata.format)) + if (!metadata.IsVolumemap() || IsCompressed(metadata.format) || IsTypeless(metadata.format) || IsPlanar(metadata.format) + || IsPalettized(metadata.format)) return HRESULT_E_NOT_SUPPORTED; if (!CalculateMipLevels3D(metadata.width, metadata.height, metadata.depth, levels)) @@ -3419,7 +3462,8 @@ HRESULT DirectX::GenerateMipMaps3D( if (!filter_select) { // Default filter choice - filter_select = (ispow2(metadata.width) && ispow2(metadata.height) && ispow2(metadata.depth)) ? TEX_FILTER_BOX : TEX_FILTER_TRIANGLE; + filter_select + = (ispow2(metadata.width) && ispow2(metadata.height) && ispow2(metadata.depth)) ? TEX_FILTER_BOX : TEX_FILTER_TRIANGLE; } switch (filter_select) @@ -3474,25 +3518,22 @@ HRESULT DirectX::GenerateMipMaps3D( mipChain.Release(); return hr; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } } -_Use_decl_annotations_ -HRESULT DirectX::ScaleMipMapsAlphaForCoverage( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - size_t item, - float alphaReference, - ScratchImage& mipChain) noexcept +_Use_decl_annotations_ HRESULT DirectX::ScaleMipMapsAlphaForCoverage(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + size_t item, + float alphaReference, + ScratchImage& mipChain) noexcept { if (!srcImages || !nimages || !IsValid(metadata.format) || nimages > metadata.mipLevels || !mipChain.GetImages()) return E_INVALIDARG; - if (metadata.IsVolumemap() - || IsCompressed(metadata.format) || IsTypeless(metadata.format) || IsPlanar(metadata.format) || IsPalettized(metadata.format)) + if (metadata.IsVolumemap() || IsCompressed(metadata.format) || IsTypeless(metadata.format) || IsPlanar(metadata.format) + || IsPalettized(metadata.format)) return HRESULT_E_NOT_SUPPORTED; if (srcImages[0].format != metadata.format || srcImages[0].width != metadata.width || srcImages[0].height != metadata.height) @@ -3501,8 +3542,8 @@ HRESULT DirectX::ScaleMipMapsAlphaForCoverage( return E_FAIL; } - float targetCoverage = 0.0f; - HRESULT hr = CalculateAlphaCoverage(srcImages[0], alphaReference, 1.0f, targetCoverage); + float targetCoverage = 0.0f; + HRESULT hr = CalculateAlphaCoverage(srcImages[0], alphaReference, 1.0f, targetCoverage); if (FAILED(hr)) return hr; @@ -3510,7 +3551,7 @@ HRESULT DirectX::ScaleMipMapsAlphaForCoverage( { const Image& src = srcImages[0]; - const Image *dest = mipChain.GetImage(0, item, 0); + const Image* dest = mipChain.GetImage(0, item, 0); if (!dest) return E_POINTER; @@ -3518,8 +3559,8 @@ HRESULT DirectX::ScaleMipMapsAlphaForCoverage( if (!pDest) return E_POINTER; - const uint8_t *pSrc = src.pixels; - const size_t rowPitch = src.rowPitch; + const uint8_t* pSrc = src.pixels; + const size_t rowPitch = src.rowPitch; for (size_t h = 0; h < metadata.height; ++h) { const size_t msize = std::min(dest->rowPitch, rowPitch); @@ -3535,7 +3576,7 @@ HRESULT DirectX::ScaleMipMapsAlphaForCoverage( return E_FAIL; float alphaScale = 0.0f; - hr = EstimateAlphaScaleForCoverage(srcImages[level], alphaReference, targetCoverage, alphaScale); + hr = EstimateAlphaScaleForCoverage(srcImages[level], alphaReference, targetCoverage, alphaScale); if (FAILED(hr)) return hr; diff --git a/DirectXTex/DirectXTexMisc.cpp b/DirectXTex/DirectXTexMisc.cpp index 95a8834f..7b787cd7 100644 --- a/DirectXTex/DirectXTexMisc.cpp +++ b/DirectXTex/DirectXTexMisc.cpp @@ -24,12 +24,7 @@ namespace const XMVECTORF32 g_Gamma22 = { { { 2.2f, 2.2f, 2.2f, 1.f } } }; //------------------------------------------------------------------------------------- - HRESULT ComputeMSE_( - const Image& image1, - const Image& image2, - float& mse, - _Out_writes_opt_(4) float* mseV, - CMSE_FLAGS flags) noexcept + HRESULT ComputeMSE_(const Image& image1, const Image& image2, float& mse, _Out_writes_opt_(4) float* mseV, CMSE_FLAGS flags) noexcept { if (!image1.pixels || !image2.pixels) return E_POINTER; @@ -46,57 +41,43 @@ namespace // Flags implied from image formats switch (image1.format) { - case DXGI_FORMAT_B8G8R8X8_UNORM: - flags |= CMSE_IGNORE_ALPHA; - break; + case DXGI_FORMAT_B8G8R8X8_UNORM: flags |= CMSE_IGNORE_ALPHA; break; - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - flags |= CMSE_IMAGE1_SRGB | CMSE_IGNORE_ALPHA; - break; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: flags |= CMSE_IMAGE1_SRGB | CMSE_IGNORE_ALPHA; break; case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC2_UNORM_SRGB: case DXGI_FORMAT_BC3_UNORM_SRGB: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_BC7_UNORM_SRGB: - flags |= CMSE_IMAGE1_SRGB; - break; + case DXGI_FORMAT_BC7_UNORM_SRGB: flags |= CMSE_IMAGE1_SRGB; break; - default: - break; + default: break; } switch (image2.format) { - case DXGI_FORMAT_B8G8R8X8_UNORM: - flags |= CMSE_IGNORE_ALPHA; - break; + case DXGI_FORMAT_B8G8R8X8_UNORM: flags |= CMSE_IGNORE_ALPHA; break; - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - flags |= CMSE_IMAGE2_SRGB | CMSE_IGNORE_ALPHA; - break; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: flags |= CMSE_IMAGE2_SRGB | CMSE_IGNORE_ALPHA; break; case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC2_UNORM_SRGB: case DXGI_FORMAT_BC3_UNORM_SRGB: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_BC7_UNORM_SRGB: - flags |= CMSE_IMAGE2_SRGB; - break; + case DXGI_FORMAT_BC7_UNORM_SRGB: flags |= CMSE_IMAGE2_SRGB; break; - default: - break; + default: break; } - const uint8_t *pSrc1 = image1.pixels; - const size_t rowPitch1 = image1.rowPitch; + const uint8_t* pSrc1 = image1.pixels; + const size_t rowPitch1 = image1.rowPitch; - const uint8_t *pSrc2 = image2.pixels; - const size_t rowPitch2 = image2.rowPitch; + const uint8_t* pSrc2 = image2.pixels; + const size_t rowPitch2 = image2.rowPitch; - XMVECTOR acc = g_XMZero; + XMVECTOR acc = g_XMZero; static XMVECTORF32 two = { { { 2.0f, 2.0f, 2.0f, 2.0f } } }; for (size_t h = 0; h < image1.height; ++h) @@ -176,8 +157,7 @@ namespace } //------------------------------------------------------------------------------------- - HRESULT EvaluateImage_( - const Image& image, + HRESULT EvaluateImage_(const Image& image, const std::function& pixelFunc) { if (!pixelFunc) @@ -194,8 +174,8 @@ namespace if (!scanline) return E_OUTOFMEMORY; - const uint8_t *pSrc = image.pixels; - const size_t rowPitch = image.rowPitch; + const uint8_t* pSrc = image.pixels; + const size_t rowPitch = image.rowPitch; for (size_t h = 0; h < image.height; ++h) { @@ -210,11 +190,11 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- - HRESULT TransformImage_( - const Image& srcImage, - const std::function& pixelFunc, + HRESULT TransformImage_(const Image& srcImage, + const std::function< + void __cdecl(_Out_writes_(width) XMVECTOR* outPixels, _In_reads_(width) const XMVECTOR* inPixels, size_t width, size_t y)>& + pixelFunc, const Image& destImage) { if (!pixelFunc) @@ -235,10 +215,10 @@ namespace XMVECTOR* sScanline = scanlines.get(); XMVECTOR* dScanline = scanlines.get() + width; - const uint8_t *pSrc = srcImage.pixels; - const size_t spitch = srcImage.rowPitch; + const uint8_t* pSrc = srcImage.pixels; + const size_t spitch = srcImage.rowPitch; - uint8_t *pDest = destImage.pixels; + uint8_t* pDest = destImage.pixels; const size_t dpitch = destImage.rowPitch; for (size_t h = 0; h < srcImage.height; ++h) @@ -246,9 +226,9 @@ namespace if (!LoadScanline(sScanline, width, pSrc, spitch, srcImage.format)) return E_FAIL; - #ifdef _DEBUG - memset(dScanline, 0xCD, sizeof(XMVECTOR)*width); - #endif +#ifdef _DEBUG + memset(dScanline, 0xCD, sizeof(XMVECTOR) * width); +#endif pixelFunc(dScanline, sScanline, width, h); @@ -261,8 +241,7 @@ namespace return S_OK; } -}; - +}; // namespace //===================================================================================== // Entry points @@ -271,20 +250,17 @@ namespace //------------------------------------------------------------------------------------- // Copies a rectangle from one image into another //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CopyRectangle( - const Image& srcImage, - const Rect& srcRect, - const Image& dstImage, - TEX_FILTER_FLAGS filter, - size_t xOffset, - size_t yOffset) noexcept +_Use_decl_annotations_ HRESULT DirectX::CopyRectangle(const Image& srcImage, + const Rect& srcRect, + const Image& dstImage, + TEX_FILTER_FLAGS filter, + size_t xOffset, + size_t yOffset) noexcept { if (!srcImage.pixels || !dstImage.pixels) return E_POINTER; - if (IsCompressed(srcImage.format) || IsCompressed(dstImage.format) - || IsPlanar(srcImage.format) || IsPlanar(dstImage.format) + if (IsCompressed(srcImage.format) || IsCompressed(dstImage.format) || IsPlanar(srcImage.format) || IsPlanar(dstImage.format) || IsPalettized(srcImage.format) || IsPalettized(dstImage.format)) return HRESULT_E_NOT_SUPPORTED; @@ -310,8 +286,8 @@ HRESULT DirectX::CopyRectangle( return HRESULT_E_NOT_SUPPORTED; } - const uint8_t* pEndSrc = srcImage.pixels + srcImage.rowPitch*srcImage.height; - const uint8_t* pEndDest = dstImage.pixels + dstImage.rowPitch*dstImage.height; + const uint8_t* pEndSrc = srcImage.pixels + srcImage.rowPitch * srcImage.height; + const uint8_t* pEndDest = dstImage.pixels + dstImage.rowPitch * dstImage.height; // Round to bytes sbpp = (sbpp + 7) / 8; @@ -321,7 +297,7 @@ HRESULT DirectX::CopyRectangle( if (srcImage.format == dstImage.format) { // Direct copy case (avoid intermediate conversions) - uint8_t* pDest = dstImage.pixels + (yOffset * dstImage.rowPitch) + (xOffset * sbpp); + uint8_t* pDest = dstImage.pixels + (yOffset * dstImage.rowPitch) + (xOffset * sbpp); const size_t copyW = srcRect.w * sbpp; for (size_t h = 0; h < srcRect.h; ++h) { @@ -380,17 +356,11 @@ HRESULT DirectX::CopyRectangle( return S_OK; } - //------------------------------------------------------------------------------------- // Computes the Mean-Squared-Error (MSE) between two images //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::ComputeMSE( - const Image& image1, - const Image& image2, - float& mse, - float* mseV, - CMSE_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT +DirectX::ComputeMSE(const Image& image1, const Image& image2, float& mse, float* mseV, CMSE_FLAGS flags) noexcept { if (!image1.pixels || !image2.pixels) return E_POINTER; @@ -401,8 +371,7 @@ HRESULT DirectX::ComputeMSE( if (!IsValid(image1.format) || !IsValid(image2.format)) return E_INVALIDARG; - if (IsPlanar(image1.format) || IsPlanar(image2.format) - || IsPalettized(image1.format) || IsPalettized(image2.format) + if (IsPlanar(image1.format) || IsPlanar(image2.format) || IsPalettized(image1.format) || IsPalettized(image2.format) || IsTypeless(image1.format) || IsTypeless(image2.format)) return HRESULT_E_NOT_SUPPORTED; @@ -412,7 +381,7 @@ HRESULT DirectX::ComputeMSE( { // Case 1: both images are compressed, expand to RGBA32F ScratchImage temp1; - HRESULT hr = Decompress(image1, DXGI_FORMAT_R32G32B32A32_FLOAT, temp1); + HRESULT hr = Decompress(image1, DXGI_FORMAT_R32G32B32A32_FLOAT, temp1); if (FAILED(hr)) return hr; @@ -432,7 +401,7 @@ HRESULT DirectX::ComputeMSE( { // Case 2: image1 is compressed, expand to RGBA32F ScratchImage temp; - HRESULT hr = Decompress(image1, DXGI_FORMAT_R32G32B32A32_FLOAT, temp); + HRESULT hr = Decompress(image1, DXGI_FORMAT_R32G32B32A32_FLOAT, temp); if (FAILED(hr)) return hr; @@ -449,7 +418,7 @@ HRESULT DirectX::ComputeMSE( { // Case 3: image2 is compressed, expand to RGBA32F ScratchImage temp; - HRESULT hr = Decompress(image2, DXGI_FORMAT_R32G32B32A32_FLOAT, temp); + HRESULT hr = Decompress(image2, DXGI_FORMAT_R32G32B32A32_FLOAT, temp); if (FAILED(hr)) return hr; @@ -467,17 +436,13 @@ HRESULT DirectX::ComputeMSE( } } - //------------------------------------------------------------------------------------- // Evaluates a user-supplied function for all the pixels in the image //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::EvaluateImage( - const Image& image, +_Use_decl_annotations_ HRESULT DirectX::EvaluateImage(const Image& image, std::function pixelFunc) { - if (image.width > UINT32_MAX - || image.height > UINT32_MAX) + if (image.width > UINT32_MAX || image.height > UINT32_MAX) return E_INVALIDARG; if (!IsValid(image.format)) @@ -489,7 +454,7 @@ HRESULT DirectX::EvaluateImage( if (IsCompressed(image.format)) { ScratchImage temp; - HRESULT hr = Decompress(image, DXGI_FORMAT_R32G32B32A32_FLOAT, temp); + HRESULT hr = Decompress(image, DXGI_FORMAT_R32G32B32A32_FLOAT, temp); if (FAILED(hr)) return hr; @@ -505,11 +470,9 @@ HRESULT DirectX::EvaluateImage( } } -_Use_decl_annotations_ -HRESULT DirectX::EvaluateImage( - const Image* images, - size_t nimages, - const TexMetadata& metadata, +_Use_decl_annotations_ HRESULT DirectX::EvaluateImage(const Image* images, + size_t nimages, + const TexMetadata& metadata, std::function pixelFunc) { if (!images || !nimages) @@ -521,15 +484,14 @@ HRESULT DirectX::EvaluateImage( if (IsPlanar(metadata.format) || IsPalettized(metadata.format) || IsTypeless(metadata.format)) return HRESULT_E_NOT_SUPPORTED; - if (metadata.width > UINT32_MAX - || metadata.height > UINT32_MAX) + if (metadata.width > UINT32_MAX || metadata.height > UINT32_MAX) return E_INVALIDARG; if (metadata.IsVolumemap() && metadata.depth > UINT16_MAX) return E_INVALIDARG; ScratchImage temp; - DXGI_FORMAT format = metadata.format; + DXGI_FORMAT format = metadata.format; if (IsCompressed(format)) { HRESULT hr = Decompress(images, nimages, metadata, DXGI_FORMAT_R32G32B32A32_FLOAT, temp); @@ -562,54 +524,49 @@ HRESULT DirectX::EvaluateImage( } break; - case TEX_DIMENSION_TEXTURE3D: + case TEX_DIMENSION_TEXTURE3D: { + size_t index = 0; + size_t d = metadata.depth; + for (size_t level = 0; level < metadata.mipLevels; ++level) { - size_t index = 0; - size_t d = metadata.depth; - for (size_t level = 0; level < metadata.mipLevels; ++level) + for (size_t slice = 0; slice < d; ++slice, ++index) { - for (size_t slice = 0; slice < d; ++slice, ++index) - { - if (index >= nimages) - return E_FAIL; + if (index >= nimages) + return E_FAIL; - const Image& img = images[index]; - if (img.format != format) - return E_FAIL; + const Image& img = images[index]; + if (img.format != format) + return E_FAIL; - if ((img.width > UINT32_MAX) || (img.height > UINT32_MAX)) - return E_FAIL; - - HRESULT hr = EvaluateImage_(img, pixelFunc); - if (FAILED(hr)) - return hr; - } + if ((img.width > UINT32_MAX) || (img.height > UINT32_MAX)) + return E_FAIL; - if (d > 1) - d >>= 1; + HRESULT hr = EvaluateImage_(img, pixelFunc); + if (FAILED(hr)) + return hr; } + + if (d > 1) + d >>= 1; } - break; + } + break; - default: - return E_FAIL; + default: return E_FAIL; } return S_OK; } - //------------------------------------------------------------------------------------- // Use a user-supplied function to compute a new image from an input image //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::TransformImage( - const Image& image, - std::function pixelFunc, +_Use_decl_annotations_ HRESULT DirectX::TransformImage(const Image& image, + std::function + pixelFunc, ScratchImage& result) { - if (image.width > UINT32_MAX - || image.height > UINT32_MAX) + if (image.width > UINT32_MAX || image.height > UINT32_MAX) return E_INVALIDARG; if (IsPlanar(image.format) || IsPalettized(image.format) || IsCompressed(image.format) || IsTypeless(image.format)) @@ -636,11 +593,11 @@ HRESULT DirectX::TransformImage( return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::TransformImage( - const Image* srcImages, - size_t nimages, const TexMetadata& metadata, - std::function pixelFunc, +_Use_decl_annotations_ HRESULT DirectX::TransformImage(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + std::function + pixelFunc, ScratchImage& result) { if (!srcImages || !nimages) @@ -649,8 +606,7 @@ HRESULT DirectX::TransformImage( if (IsPlanar(metadata.format) || IsPalettized(metadata.format) || IsCompressed(metadata.format) || IsTypeless(metadata.format)) return HRESULT_E_NOT_SUPPORTED; - if (metadata.width > UINT32_MAX - || metadata.height > UINT32_MAX) + if (metadata.width > UINT32_MAX || metadata.height > UINT32_MAX) return E_INVALIDARG; if (metadata.IsVolumemap() && metadata.depth > UINT16_MAX) @@ -709,58 +665,55 @@ HRESULT DirectX::TransformImage( } break; - case TEX_DIMENSION_TEXTURE3D: + case TEX_DIMENSION_TEXTURE3D: { + size_t index = 0; + size_t d = metadata.depth; + for (size_t level = 0; level < metadata.mipLevels; ++level) { - size_t index = 0; - size_t d = metadata.depth; - for (size_t level = 0; level < metadata.mipLevels; ++level) + for (size_t slice = 0; slice < d; ++slice, ++index) { - for (size_t slice = 0; slice < d; ++slice, ++index) + if (index >= nimages) + { + result.Release(); + return E_FAIL; + } + + const Image& src = srcImages[index]; + if (src.format != metadata.format) + { + result.Release(); + return E_FAIL; + } + + if ((src.width > UINT32_MAX) || (src.height > UINT32_MAX)) + { + result.Release(); + return E_FAIL; + } + + const Image& dst = dest[index]; + + if (src.width != dst.width || src.height != dst.height) { - if (index >= nimages) - { - result.Release(); - return E_FAIL; - } - - const Image& src = srcImages[index]; - if (src.format != metadata.format) - { - result.Release(); - return E_FAIL; - } - - if ((src.width > UINT32_MAX) || (src.height > UINT32_MAX)) - { - result.Release(); - return E_FAIL; - } - - const Image& dst = dest[index]; - - if (src.width != dst.width || src.height != dst.height) - { - result.Release(); - return E_FAIL; - } - - hr = TransformImage_(src, pixelFunc, dst); - if (FAILED(hr)) - { - result.Release(); - return hr; - } + result.Release(); + return E_FAIL; } - if (d > 1) - d >>= 1; + hr = TransformImage_(src, pixelFunc, dst); + if (FAILED(hr)) + { + result.Release(); + return hr; + } } + + if (d > 1) + d >>= 1; } - break; + } + break; - default: - result.Release(); - return E_FAIL; + default: result.Release(); return E_FAIL; } return S_OK; diff --git a/DirectXTex/DirectXTexNormalMaps.cpp b/DirectXTex/DirectXTexNormalMaps.cpp index 3ad10e1b..8734cedc 100644 --- a/DirectXTex/DirectXTexNormalMaps.cpp +++ b/DirectXTex/DirectXTexNormalMaps.cpp @@ -28,29 +28,23 @@ namespace switch (flags & 0xf) { case 0: - case CNMAP_CHANNEL_RED: return XMVectorGetX(val); - case CNMAP_CHANNEL_GREEN: return XMVectorGetY(val); - case CNMAP_CHANNEL_BLUE: return XMVectorGetZ(val); - case CNMAP_CHANNEL_ALPHA: return XMVectorGetW(val); - - case CNMAP_CHANNEL_LUMINANCE: - { - const XMVECTOR v = XMVectorMultiply(val, lScale); - XMStoreFloat4A(&f, v); - return f.x + f.y + f.z; - } + case CNMAP_CHANNEL_RED: return XMVectorGetX(val); + case CNMAP_CHANNEL_GREEN: return XMVectorGetY(val); + case CNMAP_CHANNEL_BLUE: return XMVectorGetZ(val); + case CNMAP_CHANNEL_ALPHA: return XMVectorGetW(val); + + case CNMAP_CHANNEL_LUMINANCE: { + const XMVECTOR v = XMVectorMultiply(val, lScale); + XMStoreFloat4A(&f, v); + return f.x + f.y + f.z; + } - default: - assert(false); - return 0.f; + default: assert(false); return 0.f; } } - void EvaluateRow( - _In_reads_(width) const XMVECTOR* pSource, - _Out_writes_(width + 2) float* pDest, - size_t width, - CNMAP_FLAGS flags) noexcept + void + EvaluateRow(_In_reads_(width) const XMVECTOR* pSource, _Out_writes_(width + 2) float* pDest, size_t width, CNMAP_FLAGS flags) noexcept { assert(pSource && pDest); assert(width > 0); @@ -63,19 +57,22 @@ namespace if (flags & CNMAP_MIRROR_U) { // Mirror in U - pDest[0] = EvaluateColor(pSource[0], flags); + pDest[0] = EvaluateColor(pSource[0], flags); pDest[width + 1] = EvaluateColor(pSource[width - 1], flags); } else { // Wrap in U - pDest[0] = EvaluateColor(pSource[width - 1], flags); + pDest[0] = EvaluateColor(pSource[width - 1], flags); pDest[width + 1] = EvaluateColor(pSource[0], flags); } } - HRESULT ComputeNMap(_In_ const Image& srcImage, _In_ CNMAP_FLAGS flags, _In_ float amplitude, - _In_ DXGI_FORMAT format, _In_ const Image& normalMap) noexcept + HRESULT ComputeNMap(_In_ const Image& srcImage, + _In_ CNMAP_FLAGS flags, + _In_ float amplitude, + _In_ DXGI_FORMAT format, + _In_ const Image& normalMap) noexcept { if (!srcImage.pixels || !normalMap.pixels) return E_INVALIDARG; @@ -87,7 +84,7 @@ namespace if (!(convFlags & (CONVF_UNORM | CONVF_SNORM | CONVF_FLOAT))) return HRESULT_E_NOT_SUPPORTED; - const size_t width = srcImage.width; + const size_t width = srcImage.width; const size_t height = srcImage.height; if (width != normalMap.width || height != normalMap.height) return E_FAIL; @@ -105,17 +102,17 @@ namespace if (!pDest) return E_POINTER; - XMVECTOR* row0 = scanline.get(); - XMVECTOR* row1 = row0 + width; - XMVECTOR* row2 = row1 + width; + XMVECTOR* row0 = scanline.get(); + XMVECTOR* row1 = row0 + width; + XMVECTOR* row2 = row1 + width; XMVECTOR* target = row2 + width; float* val0 = buffer.get(); float* val1 = val0 + width + 2; float* val2 = val1 + width + 2; - const size_t rowPitch = srcImage.rowPitch; - const uint8_t* pSrc = srcImage.pixels; + const size_t rowPitch = srcImage.rowPitch; + const uint8_t* pSrc = srcImage.pixels; // Read first scanline row into 'row1' if (!LoadScanline(row1, width, pSrc, rowPitch, srcImage.format)) @@ -168,18 +165,18 @@ namespace EvaluateRow(row2, val2, width, flags); // Generate target scanline - XMVECTOR *dptr = target; + XMVECTOR* dptr = target; for (size_t x = 0; x < width; ++x) { // Compute normal via central differencing - float totDelta = (val0[x] - val0[x + 2]) + (val1[x] - val1[x + 2]) + (val2[x] - val2[x + 2]); - const float deltaZX = totDelta * amplitude / 6.f; + float totDelta = (val0[x] - val0[x + 2]) + (val1[x] - val1[x + 2]) + (val2[x] - val2[x + 2]); + const float deltaZX = totDelta * amplitude / 6.f; - totDelta = (val0[x] - val2[x]) + (val0[x + 1] - val2[x + 1]) + (val0[x + 2] - val2[x + 2]); + totDelta = (val0[x] - val2[x]) + (val0[x + 1] - val2[x + 1]) + (val0[x + 2] - val2[x + 2]); const float deltaZY = totDelta * amplitude / 6.f; - const XMVECTOR vx = XMVectorSetZ(g_XMNegIdentityR0, deltaZX); // (-1.0f, 0.0f, deltaZX) - const XMVECTOR vy = XMVectorSetZ(g_XMNegIdentityR1, deltaZY); // (0.0f, -1.0f, deltaZY) + const XMVECTOR vx = XMVectorSetZ(g_XMNegIdentityR0, deltaZX); // (-1.0f, 0.0f, deltaZX) + const XMVECTOR vy = XMVectorSetZ(g_XMNegIdentityR1, deltaZY); // (0.0f, -1.0f, deltaZY) const XMVECTOR normal = XMVector3Normalize(XMVector3Cross(vx, vy)); @@ -188,26 +185,42 @@ namespace if (flags & CNMAP_COMPUTE_OCCLUSION) { - float delta = 0.f; - const float c = val1[x + 1]; - - float t = val0[x] - c; if (t > 0.f) delta += t; - t = val0[x + 1] - c; if (t > 0.f) delta += t; - t = val0[x + 2] - c; if (t > 0.f) delta += t; - t = val1[x] - c; if (t > 0.f) delta += t; + float delta = 0.f; + const float c = val1[x + 1]; + + float t = val0[x] - c; + if (t > 0.f) + delta += t; + t = val0[x + 1] - c; + if (t > 0.f) + delta += t; + t = val0[x + 2] - c; + if (t > 0.f) + delta += t; + t = val1[x] - c; + if (t > 0.f) + delta += t; // Skip current pixel - t = val1[x + 2] - c; if (t > 0.f) delta += t; - t = val2[x] - c; if (t > 0.f) delta += t; - t = val2[x + 1] - c; if (t > 0.f) delta += t; - t = val2[x + 2] - c; if (t > 0.f) delta += t; + t = val1[x + 2] - c; + if (t > 0.f) + delta += t; + t = val2[x] - c; + if (t > 0.f) + delta += t; + t = val2[x + 1] - c; + if (t > 0.f) + delta += t; + t = val2[x + 2] - c; + if (t > 0.f) + delta += t; // Average delta (divide by 8, scale by amplitude factor) delta *= 0.125f * amplitude; if (delta > 0.f) { // If < 0, then no occlusion - const float r = sqrtf(1.f + delta*delta); - alpha = (r - delta) / r; + const float r = sqrtf(1.f + delta * delta); + alpha = (r - delta) / r; } } @@ -215,7 +228,8 @@ namespace if (convFlags & CONVF_UNORM) { // 0.5f*normal + 0.5f -or- invert sign case: -0.5f*normal + 0.5f - const XMVECTOR n1 = XMVectorMultiplyAdd((flags & CNMAP_INVERT_SIGN) ? g_XMNegativeOneHalf : g_XMOneHalf, normal, g_XMOneHalf); + const XMVECTOR n1 + = XMVectorMultiplyAdd((flags & CNMAP_INVERT_SIGN) ? g_XMNegativeOneHalf : g_XMOneHalf, normal, g_XMOneHalf); *dptr++ = XMVectorSetW(n1, alpha); } else if (flags & CNMAP_INVERT_SIGN) @@ -233,9 +247,9 @@ namespace // Cycle buffers float* temp = val0; - val0 = val1; - val1 = val2; - val2 = temp; + val0 = val1; + val1 = val2; + val2 = temp; pSrc += rowPitch; pDest += normalMap.rowPitch; @@ -243,8 +257,7 @@ namespace return S_OK; } -} - +} // namespace //===================================================================================== // Entry points @@ -253,13 +266,8 @@ namespace //------------------------------------------------------------------------------------- // Generates a normal map from a height-map //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::ComputeNormalMap( - const Image& srcImage, - CNMAP_FLAGS flags, - float amplitude, - DXGI_FORMAT format, - ScratchImage& normalMap) noexcept +_Use_decl_annotations_ HRESULT +DirectX::ComputeNormalMap(const Image& srcImage, CNMAP_FLAGS flags, float amplitude, DXGI_FORMAT format, ScratchImage& normalMap) noexcept { if (!srcImage.pixels) return E_POINTER; @@ -275,17 +283,13 @@ HRESULT DirectX::ComputeNormalMap( case CNMAP_CHANNEL_GREEN: case CNMAP_CHANNEL_BLUE: case CNMAP_CHANNEL_ALPHA: - case CNMAP_CHANNEL_LUMINANCE: - break; + case CNMAP_CHANNEL_LUMINANCE: break; - default: - return E_INVALIDARG; + default: return E_INVALIDARG; } - if (IsCompressed(format) || IsCompressed(srcImage.format) - || IsTypeless(format) || IsTypeless(srcImage.format) - || IsPlanar(format) || IsPlanar(srcImage.format) - || IsPalettized(format) || IsPalettized(srcImage.format)) + if (IsCompressed(format) || IsCompressed(srcImage.format) || IsTypeless(format) || IsTypeless(srcImage.format) || IsPlanar(format) + || IsPlanar(srcImage.format) || IsPalettized(format) || IsPalettized(srcImage.format)) return HRESULT_E_NOT_SUPPORTED; // Setup target image @@ -295,7 +299,7 @@ HRESULT DirectX::ComputeNormalMap( if (FAILED(hr)) return hr; - const Image *img = normalMap.GetImage(0, 0, 0); + const Image* img = normalMap.GetImage(0, 0, 0); if (!img) { normalMap.Release(); @@ -312,23 +316,19 @@ HRESULT DirectX::ComputeNormalMap( return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::ComputeNormalMap( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - CNMAP_FLAGS flags, - float amplitude, - DXGI_FORMAT format, - ScratchImage& normalMaps) noexcept +_Use_decl_annotations_ HRESULT DirectX::ComputeNormalMap(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + CNMAP_FLAGS flags, + float amplitude, + DXGI_FORMAT format, + ScratchImage& normalMaps) noexcept { if (!srcImages || !nimages || !IsValid(metadata.format) || !IsValid(format)) return E_INVALIDARG; - if (IsCompressed(format) || IsCompressed(metadata.format) - || IsTypeless(format) || IsTypeless(metadata.format) - || IsPlanar(format) || IsPlanar(metadata.format) - || IsPalettized(format) || IsPalettized(metadata.format)) + if (IsCompressed(format) || IsCompressed(metadata.format) || IsTypeless(format) || IsTypeless(metadata.format) || IsPlanar(format) + || IsPlanar(metadata.format) || IsPalettized(format) || IsPalettized(metadata.format)) return HRESULT_E_NOT_SUPPORTED; static_assert(CNMAP_CHANNEL_RED == 0x1, "CNMAP_CHANNEL_ flag values don't match mask"); @@ -339,18 +339,16 @@ HRESULT DirectX::ComputeNormalMap( case CNMAP_CHANNEL_GREEN: case CNMAP_CHANNEL_BLUE: case CNMAP_CHANNEL_ALPHA: - case CNMAP_CHANNEL_LUMINANCE: - break; + case CNMAP_CHANNEL_LUMINANCE: break; - default: - return E_INVALIDARG; + default: return E_INVALIDARG; } normalMaps.Release(); TexMetadata mdata2 = metadata; - mdata2.format = format; - HRESULT hr = normalMaps.Initialize(mdata2); + mdata2.format = format; + HRESULT hr = normalMaps.Initialize(mdata2); if (FAILED(hr)) return hr; diff --git a/DirectXTex/DirectXTexP.h b/DirectXTex/DirectXTexP.h index f0ac5814..470d768f 100644 --- a/DirectXTex/DirectXTexP.h +++ b/DirectXTex/DirectXTexP.h @@ -13,7 +13,8 @@ #ifdef _MSC_VER // Off by default warnings -#pragma warning(disable : 4619 4616 4061 4265 4365 4571 4623 4625 4626 4628 4668 4710 4711 4746 4774 4820 4865 4987 5026 5027 5031 5032 5039 5045 5219 5246 5264 26812) +#pragma warning(disable \ + : 4619 4616 4061 4265 4365 4571 4623 4625 4626 4628 4668 4710 4711 4746 4774 4820 4865 4987 5026 5027 5031 5032 5039 5045 5219 5246 5264 26812) // C4619/4616 #pragma warning warnings // C4061 enumerator 'X' in switch of enum 'X' is not explicitly handled by a case label // C4265 class has virtual functions, but destructor is not virtual @@ -52,11 +53,11 @@ // C5038 data member 'X' will be initialized after data member 'Y' // C5040 dynamic exception specifications are valid only in C++14 and earlier; treating as noexcept(false) // C5043 exception specification does not match previous declaration -// C5204 class has virtual functions, but its trivial destructor is not virtual; instances of objects derived from this class may not be destructed correctly -// C5246 'anonymous struct or union': the initialization of a subobject should be wrapped in braces -// C5256 a non-defining declaration of an enumeration with a fixed underlying type is only permitted as a standalone declaration -// C5262 implicit fall-through occurs here; are you missing a break statement? -// C5267 definition of implicit copy constructor for 'X' is deprecated because it has a user-provided assignment operator +// C5204 class has virtual functions, but its trivial destructor is not virtual; instances of objects derived from this class may not be +// destructed correctly C5246 'anonymous struct or union': the initialization of a subobject should be wrapped in braces C5256 a +// non-defining declaration of an enumeration with a fixed underlying type is only permitted as a standalone declaration C5262 implicit +// fall-through occurs here; are you missing a break statement? C5267 definition of implicit copy constructor for 'X' is deprecated because +// it has a user-provided assignment operator #endif // _XBOX_ONE && _TITLE #endif // _MSC_VER @@ -114,12 +115,12 @@ #ifdef _GAMING_XBOX_SCARLETT #pragma warning(push) -#pragma warning(disable: 5204 5249) +#pragma warning(disable : 5204 5249) #include #pragma warning(pop) #elif defined(_GAMING_XBOX) #pragma warning(push) -#pragma warning(disable: 5204) +#pragma warning(disable : 5204) #include #pragma warning(pop) #elif defined(_XBOX_ONE) && defined(_TITLE) @@ -240,9 +241,9 @@ namespace DirectX { //----------------------------------------------------------------------------- // WIC helper functions - #ifdef _WIN32 +#ifdef _WIN32 DXGI_FORMAT __cdecl WICToDXGI(_In_ const GUID& guid) noexcept; - bool __cdecl DXGIToWIC(_In_ DXGI_FORMAT format, _Out_ GUID& guid, _In_ bool ignoreRGBvsBGR = false) noexcept; + bool __cdecl DXGIToWIC(_In_ DXGI_FORMAT format, _Out_ GUID& guid, _In_ bool ignoreRGBvsBGR = false) noexcept; TEX_FILTER_FLAGS __cdecl CheckWICColorSpace(_In_ const GUID& sourceGUID, _In_ const GUID& targetGUID) noexcept; @@ -250,19 +251,18 @@ namespace DirectX { static_assert(TEX_FILTER_DITHER == 0x10000, "TEX_FILTER_DITHER* flag values don't match mask"); - static_assert(static_cast(TEX_FILTER_DITHER) == static_cast(WIC_FLAGS_DITHER), "TEX_FILTER_DITHER* should match WIC_FLAGS_DITHER*"); - static_assert(static_cast(TEX_FILTER_DITHER_DIFFUSION) == static_cast(WIC_FLAGS_DITHER_DIFFUSION), "TEX_FILTER_DITHER* should match WIC_FLAGS_DITHER*"); + static_assert(static_cast(TEX_FILTER_DITHER) == static_cast(WIC_FLAGS_DITHER), + "TEX_FILTER_DITHER* should match WIC_FLAGS_DITHER*"); + static_assert(static_cast(TEX_FILTER_DITHER_DIFFUSION) == static_cast(WIC_FLAGS_DITHER_DIFFUSION), + "TEX_FILTER_DITHER* should match WIC_FLAGS_DITHER*"); switch (flags & TEX_FILTER_DITHER_MASK) { - case TEX_FILTER_DITHER: - return WICBitmapDitherTypeOrdered4x4; + case TEX_FILTER_DITHER: return WICBitmapDitherTypeOrdered4x4; - case TEX_FILTER_DITHER_DIFFUSION: - return WICBitmapDitherTypeErrorDiffusion; + case TEX_FILTER_DITHER_DIFFUSION: return WICBitmapDitherTypeErrorDiffusion; - default: - return WICBitmapDitherTypeNone; + default: return WICBitmapDitherTypeNone; } } @@ -270,14 +270,11 @@ namespace DirectX { switch (flags & TEX_FILTER_DITHER_MASK) { - case WIC_FLAGS_DITHER: - return WICBitmapDitherTypeOrdered4x4; + case WIC_FLAGS_DITHER: return WICBitmapDitherTypeOrdered4x4; - case WIC_FLAGS_DITHER_DIFFUSION: - return WICBitmapDitherTypeErrorDiffusion; + case WIC_FLAGS_DITHER_DIFFUSION: return WICBitmapDitherTypeErrorDiffusion; - default: - return WICBitmapDitherTypeNone; + default: return WICBitmapDitherTypeNone; } } @@ -285,25 +282,25 @@ namespace DirectX { static_assert(TEX_FILTER_POINT == 0x100000, "TEX_FILTER_ flag values don't match TEX_FILTER_MASK"); - static_assert(static_cast(TEX_FILTER_POINT) == static_cast(WIC_FLAGS_FILTER_POINT), "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*"); - static_assert(static_cast(TEX_FILTER_LINEAR) == static_cast(WIC_FLAGS_FILTER_LINEAR), "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*"); - static_assert(static_cast(TEX_FILTER_CUBIC) == static_cast(WIC_FLAGS_FILTER_CUBIC), "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*"); - static_assert(static_cast(TEX_FILTER_FANT) == static_cast(WIC_FLAGS_FILTER_FANT), "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*"); + static_assert(static_cast(TEX_FILTER_POINT) == static_cast(WIC_FLAGS_FILTER_POINT), + "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*"); + static_assert(static_cast(TEX_FILTER_LINEAR) == static_cast(WIC_FLAGS_FILTER_LINEAR), + "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*"); + static_assert(static_cast(TEX_FILTER_CUBIC) == static_cast(WIC_FLAGS_FILTER_CUBIC), + "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*"); + static_assert(static_cast(TEX_FILTER_FANT) == static_cast(WIC_FLAGS_FILTER_FANT), + "TEX_FILTER_* flags should match WIC_FLAGS_FILTER_*"); switch (flags & TEX_FILTER_MODE_MASK) { - case TEX_FILTER_POINT: - return WICBitmapInterpolationModeNearestNeighbor; + case TEX_FILTER_POINT: return WICBitmapInterpolationModeNearestNeighbor; - case TEX_FILTER_LINEAR: - return WICBitmapInterpolationModeLinear; + case TEX_FILTER_LINEAR: return WICBitmapInterpolationModeLinear; - case TEX_FILTER_CUBIC: - return WICBitmapInterpolationModeCubic; + case TEX_FILTER_CUBIC: return WICBitmapInterpolationModeCubic; case TEX_FILTER_FANT: - default: - return WICBitmapInterpolationModeFant; + default: return WICBitmapInterpolationModeFant; } } @@ -311,32 +308,31 @@ namespace DirectX { switch (flags & TEX_FILTER_MODE_MASK) { - case TEX_FILTER_POINT: - return WICBitmapInterpolationModeNearestNeighbor; + case TEX_FILTER_POINT: return WICBitmapInterpolationModeNearestNeighbor; - case TEX_FILTER_LINEAR: - return WICBitmapInterpolationModeLinear; + case TEX_FILTER_LINEAR: return WICBitmapInterpolationModeLinear; - case TEX_FILTER_CUBIC: - return WICBitmapInterpolationModeCubic; + case TEX_FILTER_CUBIC: return WICBitmapInterpolationModeCubic; case TEX_FILTER_FANT: - default: - return WICBitmapInterpolationModeFant; + default: return WICBitmapInterpolationModeFant; } } - #endif // WIN32 +#endif // WIN32 //--------------------------------------------------------------------------------- // Image helper functions - HRESULT __cdecl DetermineImageArray( - _In_ const TexMetadata& metadata, _In_ CP_FLAGS cpFlags, - _Out_ size_t& nImages, _Out_ size_t& pixelSize) noexcept; - - _Success_(return) bool __cdecl SetupImageArray( - _In_reads_bytes_(pixelSize) uint8_t* pMemory, _In_ size_t pixelSize, - _In_ const TexMetadata& metadata, _In_ CP_FLAGS cpFlags, - _Out_writes_(nImages) Image* images, _In_ size_t nImages) noexcept; + HRESULT __cdecl DetermineImageArray(_In_ const TexMetadata& metadata, + _In_ CP_FLAGS cpFlags, + _Out_ size_t& nImages, + _Out_ size_t& pixelSize) noexcept; + + _Success_(return) bool __cdecl SetupImageArray(_In_reads_bytes_(pixelSize) uint8_t* pMemory, + _In_ size_t pixelSize, + _In_ const TexMetadata& metadata, + _In_ CP_FLAGS cpFlags, + _Out_writes_(nImages) Image* images, + _In_ size_t nImages) noexcept; //--------------------------------------------------------------------------------- // Conversion helper functions @@ -354,103 +350,125 @@ namespace DirectX enum CONVERT_FLAGS : uint32_t { - CONVF_FLOAT = 0x1, - CONVF_UNORM = 0x2, - CONVF_UINT = 0x4, - CONVF_SNORM = 0x8, - CONVF_SINT = 0x10, - CONVF_DEPTH = 0x20, - CONVF_STENCIL = 0x40, + CONVF_FLOAT = 0x1, + CONVF_UNORM = 0x2, + CONVF_UINT = 0x4, + CONVF_SNORM = 0x8, + CONVF_SINT = 0x10, + CONVF_DEPTH = 0x20, + CONVF_STENCIL = 0x40, CONVF_SHAREDEXP = 0x80, - CONVF_BGR = 0x100, - CONVF_XR = 0x200, - CONVF_PACKED = 0x400, - CONVF_BC = 0x800, - CONVF_YUV = 0x1000, - CONVF_POS_ONLY = 0x2000, - CONVF_R = 0x10000, - CONVF_G = 0x20000, - CONVF_B = 0x40000, - CONVF_A = 0x80000, - CONVF_RGB_MASK = 0x70000, + CONVF_BGR = 0x100, + CONVF_XR = 0x200, + CONVF_PACKED = 0x400, + CONVF_BC = 0x800, + CONVF_YUV = 0x1000, + CONVF_POS_ONLY = 0x2000, + CONVF_R = 0x10000, + CONVF_G = 0x20000, + CONVF_B = 0x40000, + CONVF_A = 0x80000, + CONVF_RGB_MASK = 0x70000, CONVF_RGBA_MASK = 0xF0000, }; uint32_t __cdecl GetConvertFlags(_In_ DXGI_FORMAT format) noexcept; - void __cdecl CopyScanline( - _When_(pDestination == pSource, _Inout_updates_bytes_(outSize)) - _When_(pDestination != pSource, _Out_writes_bytes_(outSize)) - void* pDestination, _In_ size_t outSize, - _In_reads_bytes_(inSize) const void* pSource, _In_ size_t inSize, - _In_ DXGI_FORMAT format, _In_ uint32_t tflags) noexcept; - - void __cdecl SwizzleScanline( - _When_(pDestination == pSource, _In_) - _When_(pDestination != pSource, _Out_writes_bytes_(outSize)) - void* pDestination, _In_ size_t outSize, - _In_reads_bytes_(inSize) const void* pSource, _In_ size_t inSize, - _In_ DXGI_FORMAT format, _In_ uint32_t tflags) noexcept; - - _Success_(return) bool __cdecl ExpandScanline( - _Out_writes_bytes_(outSize) void* pDestination, _In_ size_t outSize, - _In_ DXGI_FORMAT outFormat, - _In_reads_bytes_(inSize) const void* pSource, _In_ size_t inSize, - _In_ DXGI_FORMAT inFormat, _In_ uint32_t tflags) noexcept; - - _Success_(return) bool __cdecl LoadScanline( - _Out_writes_(count) XMVECTOR* pDestination, _In_ size_t count, - _In_reads_bytes_(size) const void* pSource, _In_ size_t size, - _In_ DXGI_FORMAT format) noexcept; - - _Success_(return) bool __cdecl LoadScanlineLinear( - _Out_writes_(count) XMVECTOR* pDestination, _In_ size_t count, - _In_reads_bytes_(size) const void* pSource, _In_ size_t size, - _In_ DXGI_FORMAT format, _In_ TEX_FILTER_FLAGS flags) noexcept; - - _Success_(return) bool __cdecl StoreScanline( - _Out_writes_bytes_(size) void* pDestination, _In_ size_t size, _In_ DXGI_FORMAT format, - _In_reads_(count) const XMVECTOR* pSource, _In_ size_t count, _In_ float threshold = 0) noexcept; - - _Success_(return) bool __cdecl StoreScanlineLinear( - _Out_writes_bytes_(size) void* pDestination, _In_ size_t size, _In_ DXGI_FORMAT format, - _Inout_updates_all_(count) XMVECTOR* pSource, _In_ size_t count, - _In_ TEX_FILTER_FLAGS flags, _In_ float threshold = 0) noexcept; - - _Success_(return) bool __cdecl StoreScanlineDither( - _Out_writes_bytes_(size) void* pDestination, _In_ size_t size, _In_ DXGI_FORMAT format, - _Inout_updates_all_(count) XMVECTOR* pSource, _In_ size_t count, - _In_ float threshold, size_t y, size_t z, - _Inout_updates_all_opt_(count + 2) XMVECTOR* pDiffusionErrors) noexcept; + void __cdecl CopyScanline(_When_(pDestination == pSource, _Inout_updates_bytes_(outSize)) + _When_(pDestination != pSource, _Out_writes_bytes_(outSize)) void* pDestination, + _In_ size_t outSize, + _In_reads_bytes_(inSize) const void* pSource, + _In_ size_t inSize, + _In_ DXGI_FORMAT format, + _In_ uint32_t tflags) noexcept; + + void __cdecl SwizzleScanline(_When_(pDestination == pSource, _In_) + _When_(pDestination != pSource, _Out_writes_bytes_(outSize)) void* pDestination, + _In_ size_t outSize, + _In_reads_bytes_(inSize) const void* pSource, + _In_ size_t inSize, + _In_ DXGI_FORMAT format, + _In_ uint32_t tflags) noexcept; + + _Success_(return) bool __cdecl ExpandScanline(_Out_writes_bytes_(outSize) void* pDestination, + _In_ size_t outSize, + _In_ DXGI_FORMAT outFormat, + _In_reads_bytes_(inSize) const void* pSource, + _In_ size_t inSize, + _In_ DXGI_FORMAT inFormat, + _In_ uint32_t tflags) noexcept; + + _Success_(return) bool __cdecl LoadScanline(_Out_writes_(count) XMVECTOR* pDestination, + _In_ size_t count, + _In_reads_bytes_(size) const void* pSource, + _In_ size_t size, + _In_ DXGI_FORMAT format) noexcept; + + _Success_(return) bool __cdecl LoadScanlineLinear(_Out_writes_(count) XMVECTOR* pDestination, + _In_ size_t count, + _In_reads_bytes_(size) const void* pSource, + _In_ size_t size, + _In_ DXGI_FORMAT format, + _In_ TEX_FILTER_FLAGS flags) noexcept; + + _Success_(return) bool __cdecl StoreScanline(_Out_writes_bytes_(size) void* pDestination, + _In_ size_t size, + _In_ DXGI_FORMAT format, + _In_reads_(count) const XMVECTOR* pSource, + _In_ size_t count, + _In_ float threshold = 0) noexcept; + + _Success_(return) bool __cdecl StoreScanlineLinear(_Out_writes_bytes_(size) void* pDestination, + _In_ size_t size, + _In_ DXGI_FORMAT format, + _Inout_updates_all_(count) XMVECTOR* pSource, + _In_ size_t count, + _In_ TEX_FILTER_FLAGS flags, + _In_ float threshold = 0) noexcept; + + _Success_(return) bool __cdecl StoreScanlineDither(_Out_writes_bytes_(size) void* pDestination, + _In_ size_t size, + _In_ DXGI_FORMAT format, + _Inout_updates_all_(count) XMVECTOR* pSource, + _In_ size_t count, + _In_ float threshold, + size_t y, + size_t z, + _Inout_updates_all_opt_(count + 2) XMVECTOR* pDiffusionErrors) noexcept; HRESULT __cdecl ConvertToR32G32B32A32(_In_ const Image& srcImage, _Inout_ ScratchImage& image) noexcept; HRESULT __cdecl ConvertFromR32G32B32A32(_In_ const Image& srcImage, _In_ const Image& destImage) noexcept; - HRESULT __cdecl ConvertFromR32G32B32A32( - _In_ const Image& srcImage, _In_ DXGI_FORMAT format, _Inout_ ScratchImage& image) noexcept; - HRESULT __cdecl ConvertFromR32G32B32A32( - _In_reads_(nimages) const Image* srcImages, _In_ size_t nimages, _In_ const TexMetadata& metadata, - _In_ DXGI_FORMAT format, _Out_ ScratchImage& result) noexcept; + HRESULT __cdecl ConvertFromR32G32B32A32(_In_ const Image& srcImage, _In_ DXGI_FORMAT format, _Inout_ ScratchImage& image) noexcept; + HRESULT __cdecl ConvertFromR32G32B32A32(_In_reads_(nimages) const Image* srcImages, + _In_ size_t nimages, + _In_ const TexMetadata& metadata, + _In_ DXGI_FORMAT format, + _Out_ ScratchImage& result) noexcept; HRESULT __cdecl ConvertToR16G16B16A16(_In_ const Image& srcImage, _Inout_ ScratchImage& image) noexcept; HRESULT __cdecl ConvertFromR16G16B16A16(_In_ const Image& srcImage, _In_ const Image& destImage) noexcept; - void __cdecl ConvertScanline( - _Inout_updates_all_(count) XMVECTOR* pBuffer, _In_ size_t count, - _In_ DXGI_FORMAT outFormat, _In_ DXGI_FORMAT inFormat, _In_ TEX_FILTER_FLAGS flags) noexcept; + void __cdecl ConvertScanline(_Inout_updates_all_(count) XMVECTOR* pBuffer, + _In_ size_t count, + _In_ DXGI_FORMAT outFormat, + _In_ DXGI_FORMAT inFormat, + _In_ TEX_FILTER_FLAGS flags) noexcept; //--------------------------------------------------------------------------------- // Misc helper functions bool __cdecl IsAlphaAllOpaqueBC(_In_ const Image& cImage) noexcept; - #ifdef _WIN32 +#ifdef _WIN32 HRESULT __cdecl ResizeSeparateColorAndAlpha(_In_ IWICImagingFactory* pWIC, - _In_ bool iswic2, - _In_ IWICBitmap* original, - _In_ size_t newWidth, _In_ size_t newHeight, _In_ TEX_FILTER_FLAGS filter, - _Inout_ const Image* img) noexcept; - #endif + _In_ bool iswic2, + _In_ IWICBitmap* original, + _In_ size_t newWidth, + _In_ size_t newHeight, + _In_ TEX_FILTER_FLAGS filter, + _Inout_ const Image* img) noexcept; +#endif } // namespace Internal } // namespace DirectX diff --git a/DirectXTex/DirectXTexPMAlpha.cpp b/DirectXTex/DirectXTexPMAlpha.cpp index 9750d782..11561668 100644 --- a/DirectXTex/DirectXTexPMAlpha.cpp +++ b/DirectXTex/DirectXTexPMAlpha.cpp @@ -19,9 +19,12 @@ namespace constexpr TEX_FILTER_FLAGS GetSRGBFlags(_In_ TEX_PMALPHA_FLAGS compress) noexcept { static_assert(TEX_FILTER_SRGB_IN == 0x1000000, "TEX_FILTER_SRGB flag values don't match TEX_FILTER_SRGB_MASK"); - static_assert(static_cast(TEX_PMALPHA_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_PMALPHA_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_PMALPHA_SRGB) == static_cast(TEX_FILTER_SRGB), "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_PMALPHA_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), + "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_PMALPHA_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), + "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_PMALPHA_SRGB) == static_cast(TEX_FILTER_SRGB), + "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); return static_cast(compress & TEX_FILTER_SRGB_MASK); } @@ -36,8 +39,8 @@ namespace if (!scanline) return E_OUTOFMEMORY; - const uint8_t *pSrc = srcImage.pixels; - uint8_t *pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; if (!pSrc || !pDest) return E_POINTER; @@ -49,10 +52,10 @@ namespace XMVECTOR* ptr = scanline.get(); for (size_t w = 0; w < srcImage.width; ++w) { - const XMVECTOR v = *ptr; - XMVECTOR alpha = XMVectorSplatW(*ptr); - alpha = XMVectorMultiply(v, alpha); - *(ptr++) = XMVectorSelect(v, alpha, g_XMSelect1110); + const XMVECTOR v = *ptr; + XMVECTOR alpha = XMVectorSplatW(*ptr); + alpha = XMVectorMultiply(v, alpha); + *(ptr++) = XMVectorSelect(v, alpha, g_XMSelect1110); } if (!StoreScanline(pDest, destImage.rowPitch, destImage.format, scanline.get(), srcImage.width)) @@ -70,17 +73,20 @@ namespace assert(srcImage.width == destImage.width); assert(srcImage.height == destImage.height); - static_assert(static_cast(TEX_PMALPHA_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), "TEX_PMALHPA_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_PMALPHA_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), "TEX_PMALHPA_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_PMALPHA_SRGB) == static_cast(TEX_FILTER_SRGB), "TEX_PMALHPA_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_PMALPHA_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), + "TEX_PMALHPA_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_PMALPHA_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), + "TEX_PMALHPA_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_PMALPHA_SRGB) == static_cast(TEX_FILTER_SRGB), + "TEX_PMALHPA_SRGB* should match TEX_FILTER_SRGB*"); flags &= TEX_PMALPHA_SRGB; auto scanline = make_AlignedArrayXMVECTOR(srcImage.width); if (!scanline) return E_OUTOFMEMORY; - const uint8_t *pSrc = srcImage.pixels; - uint8_t *pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; if (!pSrc || !pDest) return E_POINTER; @@ -94,10 +100,10 @@ namespace XMVECTOR* ptr = scanline.get(); for (size_t w = 0; w < srcImage.width; ++w) { - const XMVECTOR v = *ptr; - XMVECTOR alpha = XMVectorSplatW(*ptr); - alpha = XMVectorMultiply(v, alpha); - *(ptr++) = XMVectorSelect(v, alpha, g_XMSelect1110); + const XMVECTOR v = *ptr; + XMVECTOR alpha = XMVectorSplatW(*ptr); + alpha = XMVectorMultiply(v, alpha); + *(ptr++) = XMVectorSelect(v, alpha, g_XMSelect1110); } if (!StoreScanlineLinear(pDest, destImage.rowPitch, destImage.format, scanline.get(), srcImage.width, filter)) @@ -121,8 +127,8 @@ namespace if (!scanline) return E_OUTOFMEMORY; - const uint8_t *pSrc = srcImage.pixels; - uint8_t *pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; if (!pSrc || !pDest) return E_POINTER; @@ -134,8 +140,8 @@ namespace XMVECTOR* ptr = scanline.get(); for (size_t w = 0; w < srcImage.width; ++w) { - const XMVECTOR v = *ptr; - XMVECTOR alpha = XMVectorSplatW(*ptr); + const XMVECTOR v = *ptr; + XMVECTOR alpha = XMVectorSplatW(*ptr); if (XMVectorGetX(alpha) > 0) { alpha = XMVectorDivide(v, alpha); @@ -158,17 +164,20 @@ namespace assert(srcImage.width == destImage.width); assert(srcImage.height == destImage.height); - static_assert(static_cast(TEX_PMALPHA_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_PMALPHA_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); - static_assert(static_cast(TEX_PMALPHA_SRGB) == static_cast(TEX_FILTER_SRGB), "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_PMALPHA_SRGB_IN) == static_cast(TEX_FILTER_SRGB_IN), + "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_PMALPHA_SRGB_OUT) == static_cast(TEX_FILTER_SRGB_OUT), + "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); + static_assert(static_cast(TEX_PMALPHA_SRGB) == static_cast(TEX_FILTER_SRGB), + "TEX_PMALPHA_SRGB* should match TEX_FILTER_SRGB*"); flags &= TEX_PMALPHA_SRGB; auto scanline = make_AlignedArrayXMVECTOR(srcImage.width); if (!scanline) return E_OUTOFMEMORY; - const uint8_t *pSrc = srcImage.pixels; - uint8_t *pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; if (!pSrc || !pDest) return E_POINTER; @@ -182,8 +191,8 @@ namespace XMVECTOR* ptr = scanline.get(); for (size_t w = 0; w < srcImage.width; ++w) { - const XMVECTOR v = *ptr; - XMVECTOR alpha = XMVectorSplatW(*ptr); + const XMVECTOR v = *ptr; + XMVECTOR alpha = XMVectorSplatW(*ptr); if (XMVectorGetX(alpha) > 0) { alpha = XMVectorDivide(v, alpha); @@ -200,8 +209,7 @@ namespace return S_OK; } -} - +} // namespace //===================================================================================== // Entry-points @@ -210,19 +218,12 @@ namespace //------------------------------------------------------------------------------------- // Converts to/from a premultiplied alpha version of the texture //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::PremultiplyAlpha( - const Image& srcImage, - TEX_PMALPHA_FLAGS flags, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::PremultiplyAlpha(const Image& srcImage, TEX_PMALPHA_FLAGS flags, ScratchImage& image) noexcept { if (!srcImage.pixels) return E_POINTER; - if (IsCompressed(srcImage.format) - || IsPlanar(srcImage.format) - || IsPalettized(srcImage.format) - || IsTypeless(srcImage.format) + if (IsCompressed(srcImage.format) || IsPlanar(srcImage.format) || IsPalettized(srcImage.format) || IsTypeless(srcImage.format) || !HasAlpha(srcImage.format)) return HRESULT_E_NOT_SUPPORTED; @@ -233,7 +234,7 @@ HRESULT DirectX::PremultiplyAlpha( if (FAILED(hr)) return hr; - const Image *rimage = image.GetImage(0, 0, 0); + const Image* rimage = image.GetImage(0, 0, 0); if (!rimage) { image.Release(); @@ -257,25 +258,19 @@ HRESULT DirectX::PremultiplyAlpha( return S_OK; } - //------------------------------------------------------------------------------------- // Converts to/from a premultiplied alpha version of the texture (complex) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::PremultiplyAlpha( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - TEX_PMALPHA_FLAGS flags, - ScratchImage& result) noexcept +_Use_decl_annotations_ HRESULT DirectX::PremultiplyAlpha(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + TEX_PMALPHA_FLAGS flags, + ScratchImage& result) noexcept { if (!srcImages || !nimages) return E_INVALIDARG; - if (IsCompressed(metadata.format) - || IsPlanar(metadata.format) - || IsPalettized(metadata.format) - || IsTypeless(metadata.format) + if (IsCompressed(metadata.format) || IsPlanar(metadata.format) || IsPalettized(metadata.format) || IsTypeless(metadata.format) || !HasAlpha(metadata.format)) return HRESULT_E_NOT_SUPPORTED; diff --git a/DirectXTex/DirectXTexResize.cpp b/DirectXTex/DirectXTexResize.cpp index 775d59dd..2bd61091 100644 --- a/DirectXTex/DirectXTexResize.cpp +++ b/DirectXTex/DirectXTexResize.cpp @@ -21,11 +21,8 @@ namespace { #ifdef _WIN32 //--- Do image resize using WIC --- - HRESULT PerformResizeUsingWIC( - const Image& srcImage, - TEX_FILTER_FLAGS filter, - const WICPixelFormatGUID& pfGUID, - const Image& destImage) noexcept + HRESULT + PerformResizeUsingWIC(const Image& srcImage, TEX_FILTER_FLAGS filter, const WICPixelFormatGUID& pfGUID, const Image& destImage) noexcept { if (!srcImage.pixels || !destImage.pixels) return E_POINTER; @@ -33,12 +30,12 @@ namespace assert(srcImage.format == destImage.format); bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; ComPtr componentInfo; - HRESULT hr = pWIC->CreateComponentInfo(pfGUID, componentInfo.GetAddressOf()); + HRESULT hr = pWIC->CreateComponentInfo(pfGUID, componentInfo.GetAddressOf()); if (FAILED(hr)) return hr; @@ -48,18 +45,22 @@ namespace return hr; BOOL supportsTransparency = FALSE; - hr = pixelFormatInfo->SupportsTransparency(&supportsTransparency); + hr = pixelFormatInfo->SupportsTransparency(&supportsTransparency); if (FAILED(hr)) return hr; - if (srcImage.rowPitch > UINT32_MAX || srcImage.slicePitch > UINT32_MAX - || destImage.rowPitch > UINT32_MAX || destImage.slicePitch > UINT32_MAX) + if (srcImage.rowPitch > UINT32_MAX || srcImage.slicePitch > UINT32_MAX || destImage.rowPitch > UINT32_MAX + || destImage.slicePitch > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; ComPtr source; - hr = pWIC->CreateBitmapFromMemory(static_cast(srcImage.width), static_cast(srcImage.height), pfGUID, - static_cast(srcImage.rowPitch), static_cast(srcImage.slicePitch), - srcImage.pixels, source.GetAddressOf()); + hr = pWIC->CreateBitmapFromMemory(static_cast(srcImage.width), + static_cast(srcImage.height), + pfGUID, + static_cast(srcImage.rowPitch), + static_cast(srcImage.slicePitch), + srcImage.pixels, + source.GetAddressOf()); if (FAILED(hr)) return hr; @@ -77,7 +78,8 @@ namespace return hr; hr = scaler->Initialize(source.Get(), - static_cast(destImage.width), static_cast(destImage.height), + static_cast(destImage.width), + static_cast(destImage.height), GetWICInterp(filter)); if (FAILED(hr)) return hr; @@ -89,7 +91,10 @@ namespace if (memcmp(&pfScaler, &pfGUID, sizeof(WICPixelFormatGUID)) == 0) { - hr = scaler->CopyPixels(nullptr, static_cast(destImage.rowPitch), static_cast(destImage.slicePitch), destImage.pixels); + hr = scaler->CopyPixels(nullptr, + static_cast(destImage.rowPitch), + static_cast(destImage.slicePitch), + destImage.pixels); if (FAILED(hr)) return hr; } @@ -103,18 +108,20 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pfScaler, pfGUID, &canConvert); + hr = FC->CanConvert(pfScaler, pfGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; } - hr = FC->Initialize(scaler.Get(), pfGUID, GetWICDither(filter), nullptr, - 0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(scaler.Get(), pfGUID, GetWICDither(filter), nullptr, 0, WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; - hr = FC->CopyPixels(nullptr, static_cast(destImage.rowPitch), static_cast(destImage.slicePitch), destImage.pixels); + hr = FC->CopyPixels(nullptr, + static_cast(destImage.rowPitch), + static_cast(destImage.slicePitch), + destImage.pixels); if (FAILED(hr)) return hr; } @@ -123,12 +130,8 @@ namespace return S_OK; } - //--- Do conversion, resize using WIC, conversion cycle --- - HRESULT PerformResizeViaF32( - const Image& srcImage, - TEX_FILTER_FLAGS filter, - const Image& destImage) noexcept + HRESULT PerformResizeViaF32(const Image& srcImage, TEX_FILTER_FLAGS filter, const Image& destImage) noexcept { if (!srcImage.pixels || !destImage.pixels) return E_POINTER; @@ -137,11 +140,11 @@ namespace assert(srcImage.format == destImage.format); ScratchImage temp; - HRESULT hr = ConvertToR32G32B32A32(srcImage, temp); + HRESULT hr = ConvertToR32G32B32A32(srcImage, temp); if (FAILED(hr)) return hr; - const Image *tsrc = temp.GetImage(0, 0, 0); + const Image* tsrc = temp.GetImage(0, 0, 0); if (!tsrc) return E_POINTER; @@ -150,7 +153,7 @@ namespace if (FAILED(hr)) return hr; - const Image *tdest = rtemp.GetImage(0, 0, 0); + const Image* tdest = rtemp.GetImage(0, 0, 0); if (!tdest) return E_POINTER; @@ -167,7 +170,6 @@ namespace return S_OK; } - //--- determine when to use WIC vs. non-WIC paths --- bool UseWICFiltering(_In_ DXGI_FORMAT format, _In_ TEX_FILTER_FLAGS filter) noexcept { @@ -189,14 +191,13 @@ namespace return false; } - #if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) - if (format == DXGI_FORMAT_R16G16B16A16_FLOAT - || format == DXGI_FORMAT_R16_FLOAT) +#if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) + if (format == DXGI_FORMAT_R16G16B16A16_FLOAT || format == DXGI_FORMAT_R16_FLOAT) { // Use non-WIC code paths as these conversions are not supported by Xbox version of WIC return false; } - #endif +#endif static_assert(TEX_FILTER_POINT == 0x100000, "TEX_FILTER_ flag values don't match TEX_FILTER_MASK"); @@ -266,12 +267,12 @@ namespace XMVECTOR* row = target + destImage.width; - #ifdef _DEBUG - memset(row, 0xCD, sizeof(XMVECTOR)*srcImage.width); - #endif +#ifdef _DEBUG + memset(row, 0xCD, sizeof(XMVECTOR) * srcImage.width); +#endif - const uint8_t* pSrc = srcImage.pixels; - uint8_t* pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; const size_t rowPitch = srcImage.rowPitch; @@ -307,7 +308,6 @@ namespace return S_OK; } - //--- Box Filter --- HRESULT ResizeBoxFilter(const Image& srcImage, TEX_FILTER_FLAGS filter, const Image& destImage) noexcept { @@ -329,16 +329,16 @@ namespace XMVECTOR* urow0 = target + destImage.width; XMVECTOR* urow1 = urow0 + srcImage.width; - #ifdef _DEBUG - memset(urow0, 0xCD, sizeof(XMVECTOR)*srcImage.width); - memset(urow1, 0xDD, sizeof(XMVECTOR)*srcImage.width); - #endif +#ifdef _DEBUG + memset(urow0, 0xCD, sizeof(XMVECTOR) * srcImage.width); + memset(urow1, 0xDD, sizeof(XMVECTOR) * srcImage.width); +#endif const XMVECTOR* urow2 = urow0 + 1; const XMVECTOR* urow3 = urow1 + 1; - const uint8_t* pSrc = srcImage.pixels; - uint8_t* pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; const size_t rowPitch = srcImage.rowPitch; @@ -370,7 +370,6 @@ namespace return S_OK; } - //--- Linear Filter --- HRESULT ResizeLinearFilter(const Image& srcImage, TEX_FILTER_FLAGS filter, const Image& destImage) noexcept { @@ -399,13 +398,13 @@ namespace XMVECTOR* row0 = target + destImage.width; XMVECTOR* row1 = row0 + srcImage.width; - #ifdef _DEBUG - memset(row0, 0xCD, sizeof(XMVECTOR)*srcImage.width); - memset(row1, 0xDD, sizeof(XMVECTOR)*srcImage.width); - #endif +#ifdef _DEBUG + memset(row0, 0xCD, sizeof(XMVECTOR) * srcImage.width); + memset(row1, 0xDD, sizeof(XMVECTOR) * srcImage.width); +#endif - const uint8_t* pSrc = srcImage.pixels; - uint8_t* pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; const size_t rowPitch = srcImage.rowPitch; @@ -457,7 +456,6 @@ namespace return S_OK; } - //--- Cubic Filter --- #ifdef __clang__ #pragma clang diagnostic ignored "-Wextra-semi-stmt" @@ -492,15 +490,15 @@ namespace XMVECTOR* row2 = row0 + srcImage.width * 2; XMVECTOR* row3 = row0 + srcImage.width * 3; - #ifdef _DEBUG - memset(row0, 0xCD, sizeof(XMVECTOR)*srcImage.width); - memset(row1, 0xDD, sizeof(XMVECTOR)*srcImage.width); - memset(row2, 0xED, sizeof(XMVECTOR)*srcImage.width); - memset(row3, 0xFD, sizeof(XMVECTOR)*srcImage.width); - #endif +#ifdef _DEBUG + memset(row0, 0xCD, sizeof(XMVECTOR) * srcImage.width); + memset(row1, 0xDD, sizeof(XMVECTOR) * srcImage.width); + memset(row2, 0xED, sizeof(XMVECTOR) * srcImage.width); + memset(row3, 0xFD, sizeof(XMVECTOR) * srcImage.width); +#endif - const uint8_t* pSrc = srcImage.pixels; - uint8_t* pDest = destImage.pixels; + const uint8_t* pSrc = srcImage.pixels; + uint8_t* pDest = destImage.pixels; const size_t rowPitch = srcImage.rowPitch; @@ -622,7 +620,6 @@ namespace return S_OK; } - //--- Triangle Filter --- HRESULT ResizeTriangleFilter(const Image& srcImage, TEX_FILTER_FLAGS filter, const Image& destImage) noexcept { @@ -640,10 +637,10 @@ namespace if (!rowActive) return E_OUTOFMEMORY; - TriangleRow * rowFree = nullptr; + TriangleRow* rowFree = nullptr; std::unique_ptr tfX; - HRESULT hr = CreateTriangleFilter(srcImage.width, destImage.width, (filter & TEX_FILTER_WRAP_U) != 0, tfX); + HRESULT hr = CreateTriangleFilter(srcImage.width, destImage.width, (filter & TEX_FILTER_WRAP_U) != 0, tfX); if (FAILED(hr)) return hr; @@ -654,15 +651,15 @@ namespace XMVECTOR* row = scanline.get(); - #ifdef _DEBUG - memset(row, 0xCD, sizeof(XMVECTOR)*srcImage.width); - #endif +#ifdef _DEBUG + memset(row, 0xCD, sizeof(XMVECTOR) * srcImage.width); +#endif auto xFromEnd = reinterpret_cast(reinterpret_cast(tfX.get()) + tfX->sizeInBytes); auto yFromEnd = reinterpret_cast(reinterpret_cast(tfY.get()) + tfY->sizeInBytes); // Count times rows get written - for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd; ) + for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd;) { for (size_t j = 0; j < yFrom->count; ++j) { @@ -675,13 +672,13 @@ namespace } // Filter image - const uint8_t* pSrc = srcImage.pixels; - const size_t rowPitch = srcImage.rowPitch; - const uint8_t* pEndSrc = pSrc + rowPitch * srcImage.height; + const uint8_t* pSrc = srcImage.pixels; + const size_t rowPitch = srcImage.rowPitch; + const uint8_t* pEndSrc = pSrc + rowPitch * srcImage.height; uint8_t* pDest = destImage.pixels; - for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd; ) + for (FilterFrom* yFrom = tfY->from; yFrom < yFromEnd;) { // Create accumulation rows as needed for (size_t j = 0; j < yFrom->count; ++j) @@ -768,31 +765,34 @@ namespace switch (destImage.format) { case DXGI_FORMAT_R10G10B10A2_UNORM: - case DXGI_FORMAT_R10G10B10A2_UINT: + case DXGI_FORMAT_R10G10B10A2_UINT: { + // Need to slightly bias results for floating-point error accumulation which can + // be visible with harshly quantized values + static const XMVECTORF32 Bias = { { { 0.f, 0.f, 0.f, 0.1f } } }; + + XMVECTOR* ptr = pAccSrc; + for (size_t i = 0; i < destImage.width; ++i, ++ptr) { - // Need to slightly bias results for floating-point error accumulation which can - // be visible with harshly quantized values - static const XMVECTORF32 Bias = { { { 0.f, 0.f, 0.f, 0.1f } } }; - - XMVECTOR* ptr = pAccSrc; - for (size_t i = 0; i < destImage.width; ++i, ++ptr) - { - *ptr = XMVectorAdd(*ptr, Bias); - } + *ptr = XMVectorAdd(*ptr, Bias); } - break; + } + break; - default: - break; + default: break; } // This performs any required clamping - if (!StoreScanlineLinear(pDest + (destImage.rowPitch * v), destImage.rowPitch, destImage.format, pAccSrc, destImage.width, filter)) + if (!StoreScanlineLinear(pDest + (destImage.rowPitch * v), + destImage.rowPitch, + destImage.format, + pAccSrc, + destImage.width, + filter)) return E_FAIL; // Put row on freelist to reuse it's allocated scanline rowAcc->next = rowFree; - rowFree = rowAcc; + rowFree = rowAcc; } } @@ -802,7 +802,6 @@ namespace return S_OK; } - //--- Custom filter resize --- HRESULT PerformResizeUsingCustomFilters(const Image& srcImage, TEX_FILTER_FLAGS filter, const Image& destImage) noexcept { @@ -815,33 +814,27 @@ namespace if (!filter_select) { // Default filter choice - filter_select = (((destImage.width << 1) == srcImage.width) && ((destImage.height << 1) == srcImage.height)) - ? TEX_FILTER_BOX : TEX_FILTER_LINEAR; + filter_select = (((destImage.width << 1) == srcImage.width) && ((destImage.height << 1) == srcImage.height)) ? + TEX_FILTER_BOX : + TEX_FILTER_LINEAR; } switch (filter_select) { - case TEX_FILTER_POINT: - return ResizePointFilter(srcImage, destImage); + case TEX_FILTER_POINT: return ResizePointFilter(srcImage, destImage); - case TEX_FILTER_BOX: - return ResizeBoxFilter(srcImage, filter, destImage); + case TEX_FILTER_BOX: return ResizeBoxFilter(srcImage, filter, destImage); - case TEX_FILTER_LINEAR: - return ResizeLinearFilter(srcImage, filter, destImage); + case TEX_FILTER_LINEAR: return ResizeLinearFilter(srcImage, filter, destImage); - case TEX_FILTER_CUBIC: - return ResizeCubicFilter(srcImage, filter, destImage); + case TEX_FILTER_CUBIC: return ResizeCubicFilter(srcImage, filter, destImage); - case TEX_FILTER_TRIANGLE: - return ResizeTriangleFilter(srcImage, filter, destImage); + case TEX_FILTER_TRIANGLE: return ResizeTriangleFilter(srcImage, filter, destImage); - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } } -} - +} // namespace //===================================================================================== // Entry-points @@ -850,13 +843,8 @@ namespace //------------------------------------------------------------------------------------- // Resize image //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Resize( - const Image& srcImage, - size_t width, - size_t height, - TEX_FILTER_FLAGS filter, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT +DirectX::Resize(const Image& srcImage, size_t width, size_t height, TEX_FILTER_FLAGS filter, ScratchImage& image) noexcept { if (width == 0 || height == 0) return E_INVALIDARG; @@ -880,12 +868,12 @@ HRESULT DirectX::Resize( bool usewic = UseWICFiltering(srcImage.format, filter); WICPixelFormatGUID pfGUID = {}; - const bool wicpf = (usewic) ? DXGIToWIC(srcImage.format, pfGUID, true) : false; + const bool wicpf = (usewic) ? DXGIToWIC(srcImage.format, pfGUID, true) : false; if (usewic && !wicpf) { // Check to see if the source and/or result size is too big for WIC - const uint64_t expandedSize = uint64_t(width) * uint64_t(height) * sizeof(float) * 4; + const uint64_t expandedSize = uint64_t(width) * uint64_t(height) * sizeof(float) * 4; const uint64_t expandedSize2 = uint64_t(srcImage.width) * uint64_t(srcImage.height) * sizeof(float) * 4; if (expandedSize > UINT32_MAX || expandedSize2 > UINT32_MAX) { @@ -901,7 +889,7 @@ HRESULT DirectX::Resize( if (FAILED(hr)) return hr; - const Image *rimage = image.GetImage(0, 0, 0); + const Image* rimage = image.GetImage(0, 0, 0); if (!rimage) return E_POINTER; @@ -920,7 +908,7 @@ HRESULT DirectX::Resize( } } else - #endif +#endif { // Case 3: not using WIC resizing hr = PerformResizeUsingCustomFilters(srcImage, filter, *rimage); @@ -935,33 +923,28 @@ HRESULT DirectX::Resize( return S_OK; } - //------------------------------------------------------------------------------------- // Resize image (complex) //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::Resize( - const Image* srcImages, - size_t nimages, - const TexMetadata& metadata, - size_t width, - size_t height, - TEX_FILTER_FLAGS filter, - ScratchImage& result) noexcept +_Use_decl_annotations_ HRESULT DirectX::Resize(const Image* srcImages, + size_t nimages, + const TexMetadata& metadata, + size_t width, + size_t height, + TEX_FILTER_FLAGS filter, + ScratchImage& result) noexcept { if (!srcImages || !nimages || width == 0 || height == 0) return E_INVALIDARG; - if ((width > UINT32_MAX) || (height > UINT32_MAX) - || (metadata.width > UINT32_MAX) - || (metadata.height > UINT32_MAX)) + if ((width > UINT32_MAX) || (height > UINT32_MAX) || (metadata.width > UINT32_MAX) || (metadata.height > UINT32_MAX)) return E_INVALIDARG; TexMetadata mdata2 = metadata; - mdata2.width = width; - mdata2.height = height; - mdata2.mipLevels = 1; - HRESULT hr = result.Initialize(mdata2); + mdata2.width = width; + mdata2.height = height; + mdata2.mipLevels = 1; + HRESULT hr = result.Initialize(mdata2); if (FAILED(hr)) return hr; @@ -969,12 +952,12 @@ HRESULT DirectX::Resize( bool usewic = !metadata.IsPMAlpha() && UseWICFiltering(metadata.format, filter); WICPixelFormatGUID pfGUID = {}; - const bool wicpf = (usewic) ? DXGIToWIC(metadata.format, pfGUID, true) : false; + const bool wicpf = (usewic) ? DXGIToWIC(metadata.format, pfGUID, true) : false; if (usewic && !wicpf) { // Check to see if the source and/or result size is too big for WIC - const uint64_t expandedSize = uint64_t(width) * uint64_t(height) * sizeof(float) * 4; + const uint64_t expandedSize = uint64_t(width) * uint64_t(height) * sizeof(float) * 4; const uint64_t expandedSize2 = uint64_t(metadata.width) * uint64_t(metadata.height) * sizeof(float) * 4; if (expandedSize > UINT32_MAX || expandedSize2 > UINT32_MAX) { @@ -1001,7 +984,7 @@ HRESULT DirectX::Resize( return E_FAIL; } - const Image* srcimg = &srcImages[srcIndex]; + const Image* srcimg = &srcImages[srcIndex]; const Image* destimg = result.GetImage(0, item, 0); if (!srcimg || !destimg) { @@ -1021,7 +1004,7 @@ HRESULT DirectX::Resize( return E_FAIL; } - #ifdef _WIN32 +#ifdef _WIN32 if (usewic) { if (wicpf) @@ -1036,7 +1019,7 @@ HRESULT DirectX::Resize( } } else - #endif +#endif { // Case 3: not using WIC resizing hr = PerformResizeUsingCustomFilters(*srcimg, filter, *destimg); @@ -1062,7 +1045,7 @@ HRESULT DirectX::Resize( return E_FAIL; } - const Image* srcimg = &srcImages[srcIndex]; + const Image* srcimg = &srcImages[srcIndex]; const Image* destimg = result.GetImage(0, 0, slice); if (!srcimg || !destimg) { @@ -1082,7 +1065,7 @@ HRESULT DirectX::Resize( return E_FAIL; } - #ifdef _WIN32 +#ifdef _WIN32 if (usewic) { if (wicpf) @@ -1097,7 +1080,7 @@ HRESULT DirectX::Resize( } } else - #endif +#endif { // Case 3: not using WIC resizing hr = PerformResizeUsingCustomFilters(*srcimg, filter, *destimg); @@ -1111,9 +1094,7 @@ HRESULT DirectX::Resize( } break; - default: - result.Release(); - return E_FAIL; + default: result.Release(); return E_FAIL; } return S_OK; diff --git a/DirectXTex/DirectXTexTGA.cpp b/DirectXTex/DirectXTexTGA.cpp index 71bd3855..381165f7 100644 --- a/DirectXTex/DirectXTexTGA.cpp +++ b/DirectXTex/DirectXTexTGA.cpp @@ -28,51 +28,51 @@ namespace constexpr float GAMMA_EPSILON = 0.01f; const char g_Signature[] = "TRUEVISION-XFILE."; - // This is the official footer signature for the TGA 2.0 file format. + // This is the official footer signature for the TGA 2.0 file format. enum TGAImageType { - TGA_NO_IMAGE = 0, - TGA_COLOR_MAPPED = 1, - TGA_TRUECOLOR = 2, - TGA_BLACK_AND_WHITE = 3, - TGA_COLOR_MAPPED_RLE = 9, - TGA_TRUECOLOR_RLE = 10, + TGA_NO_IMAGE = 0, + TGA_COLOR_MAPPED = 1, + TGA_TRUECOLOR = 2, + TGA_BLACK_AND_WHITE = 3, + TGA_COLOR_MAPPED_RLE = 9, + TGA_TRUECOLOR_RLE = 10, TGA_BLACK_AND_WHITE_RLE = 11, }; enum TGADescriptorFlags { - TGA_FLAGS_INVERTX = 0x10, - TGA_FLAGS_INVERTY = 0x20, + TGA_FLAGS_INVERTX = 0x10, + TGA_FLAGS_INVERTY = 0x20, TGA_FLAGS_INTERLEAVED_2WAY = 0x40, // Deprecated TGA_FLAGS_INTERLEAVED_4WAY = 0x80, // Deprecated }; enum TGAAttributesType : uint8_t { - TGA_ATTRIBUTE_NONE = 0, // 0: no alpha data included - TGA_ATTRIBUTE_IGNORED = 1, // 1: undefined data, can be ignored - TGA_ATTRIBUTE_UNDEFINED = 2, // 2: uedefined data, should be retained - TGA_ATTRIBUTE_ALPHA = 3, // 3: useful alpha channel data - TGA_ATTRIBUTE_PREMULTIPLIED = 4, // 4: pre-multiplied alpha + TGA_ATTRIBUTE_NONE = 0, // 0: no alpha data included + TGA_ATTRIBUTE_IGNORED = 1, // 1: undefined data, can be ignored + TGA_ATTRIBUTE_UNDEFINED = 2, // 2: uedefined data, should be retained + TGA_ATTRIBUTE_ALPHA = 3, // 3: useful alpha channel data + TGA_ATTRIBUTE_PREMULTIPLIED = 4, // 4: pre-multiplied alpha }; -#pragma pack(push,1) +#pragma pack(push, 1) struct TGA_HEADER { - uint8_t bIDLength; - uint8_t bColorMapType; - uint8_t bImageType; - uint16_t wColorMapFirst; - uint16_t wColorMapLength; - uint8_t bColorMapSize; - uint16_t wXOrigin; - uint16_t wYOrigin; - uint16_t wWidth; - uint16_t wHeight; - uint8_t bBitsPerPixel; - uint8_t bDescriptor; + uint8_t bIDLength; + uint8_t bColorMapType; + uint8_t bImageType; + uint16_t wColorMapFirst; + uint16_t wColorMapLength; + uint8_t bColorMapSize; + uint16_t wXOrigin; + uint16_t wYOrigin; + uint16_t wWidth; + uint16_t wHeight; + uint8_t bBitsPerPixel; + uint8_t bDescriptor; }; static_assert(sizeof(TGA_HEADER) == 18, "TGA 2.0 size mismatch"); @@ -81,40 +81,40 @@ namespace struct TGA_FOOTER { - uint32_t dwExtensionOffset; - uint32_t dwDeveloperOffset; - char Signature[18]; + uint32_t dwExtensionOffset; + uint32_t dwDeveloperOffset; + char Signature[18]; }; static_assert(sizeof(TGA_FOOTER) == 26, "TGA 2.0 size mismatch"); struct TGA_EXTENSION { - uint16_t wSize; - char szAuthorName[41]; - char szAuthorComment[324]; - uint16_t wStampMonth; - uint16_t wStampDay; - uint16_t wStampYear; - uint16_t wStampHour; - uint16_t wStampMinute; - uint16_t wStampSecond; - char szJobName[41]; - uint16_t wJobHour; - uint16_t wJobMinute; - uint16_t wJobSecond; - char szSoftwareId[41]; - uint16_t wVersionNumber; - uint8_t bVersionLetter; - uint32_t dwKeyColor; - uint16_t wPixelNumerator; - uint16_t wPixelDenominator; - uint16_t wGammaNumerator; - uint16_t wGammaDenominator; - uint32_t dwColorOffset; - uint32_t dwStampOffset; - uint32_t dwScanOffset; - uint8_t bAttributesType; + uint16_t wSize; + char szAuthorName[41]; + char szAuthorComment[324]; + uint16_t wStampMonth; + uint16_t wStampDay; + uint16_t wStampYear; + uint16_t wStampHour; + uint16_t wStampMinute; + uint16_t wStampSecond; + char szJobName[41]; + uint16_t wJobHour; + uint16_t wJobMinute; + uint16_t wJobSecond; + char szSoftwareId[41]; + uint16_t wVersionNumber; + uint8_t bVersionLetter; + uint32_t dwKeyColor; + uint16_t wPixelNumerator; + uint16_t wPixelDenominator; + uint16_t wGammaNumerator; + uint16_t wGammaDenominator; + uint32_t dwColorOffset; + uint32_t dwStampOffset; + uint32_t dwScanOffset; + uint8_t bAttributesType; }; static_assert(sizeof(TGA_EXTENSION) == 495, "TGA 2.0 size mismatch"); @@ -123,28 +123,26 @@ namespace enum CONVERSION_FLAGS { - CONV_FLAGS_NONE = 0x0, - CONV_FLAGS_EXPAND = 0x1, // Conversion requires expanded pixel size - CONV_FLAGS_INVERTX = 0x2, // If set, scanlines are right-to-left - CONV_FLAGS_INVERTY = 0x4, // If set, scanlines are top-to-bottom - CONV_FLAGS_RLE = 0x8, // Source data is RLE compressed - CONV_FLAGS_PALETTED = 0x10, // Source data is paletted - - CONV_FLAGS_SWIZZLE = 0x10000, // Swizzle BGR<->RGB data - CONV_FLAGS_888 = 0x20000, // 24bpp format + CONV_FLAGS_NONE = 0x0, + CONV_FLAGS_EXPAND = 0x1, // Conversion requires expanded pixel size + CONV_FLAGS_INVERTX = 0x2, // If set, scanlines are right-to-left + CONV_FLAGS_INVERTY = 0x4, // If set, scanlines are top-to-bottom + CONV_FLAGS_RLE = 0x8, // Source data is RLE compressed + CONV_FLAGS_PALETTED = 0x10, // Source data is paletted + + CONV_FLAGS_SWIZZLE = 0x10000, // Swizzle BGR<->RGB data + CONV_FLAGS_888 = 0x20000, // 24bpp format }; - //------------------------------------------------------------------------------------- // Decodes TGA header //------------------------------------------------------------------------------------- - HRESULT DecodeTGAHeader( - _In_reads_bytes_(size) const uint8_t* pSource, - size_t size, - TGA_FLAGS flags, - _Out_ TexMetadata& metadata, - size_t& offset, - _Inout_opt_ uint32_t* convFlags) noexcept + HRESULT DecodeTGAHeader(_In_reads_bytes_(size) const uint8_t* pSource, + size_t size, + TGA_FLAGS flags, + _Out_ TexMetadata& metadata, + size_t& offset, + _Inout_opt_ uint32_t* convFlags) noexcept { if (!pSource) return E_POINTER; @@ -172,13 +170,10 @@ namespace switch (pHeader->bImageType) { case TGA_NO_IMAGE: - case TGA_COLOR_MAPPED_RLE: - return HRESULT_E_NOT_SUPPORTED; + case TGA_COLOR_MAPPED_RLE: return HRESULT_E_NOT_SUPPORTED; case TGA_COLOR_MAPPED: - if (pHeader->bColorMapType != 1 - || pHeader->wColorMapLength == 0 - || pHeader->bBitsPerPixel != 8) + if (pHeader->bColorMapType != 1 || pHeader->wColorMapLength == 0 || pHeader->bBitsPerPixel != 8) { return HRESULT_E_NOT_SUPPORTED; } @@ -197,10 +192,9 @@ namespace } break; - // Other possible values are 15, 16, and 32 which we do not support. + // Other possible values are 15, 16, and 32 which we do not support. - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } if (convFlags) @@ -211,17 +205,14 @@ namespace case TGA_TRUECOLOR: case TGA_TRUECOLOR_RLE: - if (pHeader->bColorMapType != 0 - || pHeader->wColorMapLength != 0) + if (pHeader->bColorMapType != 0 || pHeader->wColorMapLength != 0) { return HRESULT_E_NOT_SUPPORTED; } switch (pHeader->bBitsPerPixel) { - case 16: - metadata.format = DXGI_FORMAT_B5G5R5A1_UNORM; - break; + case 16: metadata.format = DXGI_FORMAT_B5G5R5A1_UNORM; break; case 24: if (flags & TGA_FLAGS_BGR) @@ -238,12 +229,9 @@ namespace *convFlags |= CONV_FLAGS_EXPAND; break; - case 32: - metadata.format = (flags & TGA_FLAGS_BGR) ? DXGI_FORMAT_B8G8R8A8_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM; - break; + case 32: metadata.format = (flags & TGA_FLAGS_BGR) ? DXGI_FORMAT_B8G8R8A8_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM; break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } if (convFlags && (pHeader->bImageType == TGA_TRUECOLOR_RLE)) @@ -254,20 +242,16 @@ namespace case TGA_BLACK_AND_WHITE: case TGA_BLACK_AND_WHITE_RLE: - if (pHeader->bColorMapType != 0 - || pHeader->wColorMapLength != 0) + if (pHeader->bColorMapType != 0 || pHeader->wColorMapLength != 0) { return HRESULT_E_NOT_SUPPORTED; } switch (pHeader->bBitsPerPixel) { - case 8: - metadata.format = DXGI_FORMAT_R8_UNORM; - break; + case 8: metadata.format = DXGI_FORMAT_R8_UNORM; break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } if (convFlags && (pHeader->bImageType == TGA_BLACK_AND_WHITE_RLE)) @@ -276,8 +260,7 @@ namespace } break; - default: - return HRESULT_E_INVALID_DATA; + default: return HRESULT_E_INVALID_DATA; } uint64_t sizeBytes = uint64_t(pHeader->wWidth) * uint64_t(pHeader->wHeight) * uint64_t(pHeader->bBitsPerPixel) / 8; @@ -286,10 +269,10 @@ namespace return HRESULT_E_ARITHMETIC_OVERFLOW; } - metadata.width = pHeader->wWidth; + metadata.width = pHeader->wWidth; metadata.height = pHeader->wHeight; metadata.depth = metadata.arraySize = metadata.mipLevels = 1; - metadata.dimension = TEX_DIMENSION_TEXTURE2D; + metadata.dimension = TEX_DIMENSION_TEXTURE2D; if (convFlags) { @@ -310,26 +293,21 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Reads palette for color-mapped TGA formats //------------------------------------------------------------------------------------- - HRESULT ReadPalette( - _In_reads_(TGA_HEADER_LEN) const uint8_t* header, - _In_reads_bytes_(size) const void* pSource, - size_t size, - TGA_FLAGS flags, - uint8_t palette[256 * 4], - size_t& colorMapSize) noexcept + HRESULT ReadPalette(_In_reads_(TGA_HEADER_LEN) const uint8_t* header, + _In_reads_bytes_(size) const void* pSource, + size_t size, + TGA_FLAGS flags, + uint8_t palette[256 * 4], + size_t& colorMapSize) noexcept { assert(header && pSource); auto pHeader = reinterpret_cast(header); - if (pHeader->bColorMapType != 1 - || pHeader->wColorMapLength == 0 - || pHeader->wColorMapLength > 256 - || pHeader->bColorMapSize != 24) + if (pHeader->bColorMapType != 1 || pHeader->wColorMapLength == 0 || pHeader->wColorMapLength > 256 || pHeader->bColorMapSize != 24) { return HRESULT_E_NOT_SUPPORTED; } @@ -368,7 +346,6 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Set alpha for images with all 0 alpha channel //------------------------------------------------------------------------------------- @@ -389,16 +366,14 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Uncompress pixel data from a TGA into the target image //------------------------------------------------------------------------------------- - HRESULT UncompressPixels( - _In_reads_bytes_(size) const void* pSource, - size_t size, - TGA_FLAGS flags, - _In_ const Image* image, - _In_ uint32_t convFlags) noexcept + HRESULT UncompressPixels(_In_reads_bytes_(size) const void* pSource, + size_t size, + TGA_FLAGS flags, + _In_ const Image* image, + _In_ uint32_t convFlags) noexcept { assert(size > 0); @@ -406,13 +381,17 @@ namespace return E_POINTER; // Compute TGA image data pitch - size_t rowPitch, slicePitch; - HRESULT hr = ComputePitch(image->format, image->width, image->height, rowPitch, slicePitch, + size_t rowPitch, slicePitch; + HRESULT hr = ComputePitch(image->format, + image->width, + image->height, + rowPitch, + slicePitch, (convFlags & CONV_FLAGS_EXPAND) ? CP_FLAGS_24BPP : CP_FLAGS_NONE); if (FAILED(hr)) return hr; - auto sPtr = static_cast(pSource); + auto sPtr = static_cast(pSource); const uint8_t* endPtr = sPtr + size; bool opaquealpha = false; @@ -426,11 +405,10 @@ namespace size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); assert(offset < rowPitch); - uint8_t* dPtr = image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1))) - + offset; + uint8_t* dPtr + = image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1))) + offset; - for (size_t x = 0; x < image->width; ) + for (size_t x = 0; x < image->width;) { if (sPtr >= endPtr) return E_FAIL; @@ -484,128 +462,191 @@ namespace break; //-------------------------------------------------------------------------- 16-bit - case DXGI_FORMAT_B5G5R5A1_UNORM: + case DXGI_FORMAT_B5G5R5A1_UNORM: { + uint32_t minalpha = 255; + uint32_t maxalpha = 0; + + for (size_t y = 0; y < image->height; ++y) { - uint32_t minalpha = 255; - uint32_t maxalpha = 0; + size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); + assert(offset * 2 < rowPitch); - for (size_t y = 0; y < image->height; ++y) - { - size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); - assert(offset * 2 < rowPitch); + auto dPtr = reinterpret_cast( + image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) + + offset; - auto dPtr = reinterpret_cast(image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) - + offset; + for (size_t x = 0; x < image->width;) + { + if (sPtr >= endPtr) + return E_FAIL; - for (size_t x = 0; x < image->width; ) + if (*sPtr & 0x80) { - if (sPtr >= endPtr) + // Repeat + size_t j = size_t(*sPtr & 0x7F) + 1; + ++sPtr; + + if (sPtr + 1 >= endPtr) return E_FAIL; - if (*sPtr & 0x80) - { - // Repeat - size_t j = size_t(*sPtr & 0x7F) + 1; - ++sPtr; + auto t = static_cast(uint32_t(*sPtr) | uint32_t(*(sPtr + 1u) << 8)); - if (sPtr + 1 >= endPtr) - return E_FAIL; + const uint32_t alpha = (t & 0x8000) ? 255 : 0; + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); - auto t = static_cast(uint32_t(*sPtr) | uint32_t(*(sPtr + 1u) << 8)); + sPtr += 2; - const uint32_t alpha = (t & 0x8000) ? 255 : 0; - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); + for (; j > 0; --j, ++x) + { + if (x >= image->width) + return E_FAIL; - sPtr += 2; + *dPtr = t; - for (; j > 0; --j, ++x) - { - if (x >= image->width) - return E_FAIL; + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; + } + } + else + { + // Literal + size_t j = size_t(*sPtr & 0x7F) + 1; + ++sPtr; - *dPtr = t; + if (sPtr + (j * 2) > endPtr) + return E_FAIL; - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } - } - else + for (; j > 0; --j, ++x) { - // Literal - size_t j = size_t(*sPtr & 0x7F) + 1; - ++sPtr; - - if (sPtr + (j * 2) > endPtr) + if (x >= image->width) return E_FAIL; - for (; j > 0; --j, ++x) - { - if (x >= image->width) - return E_FAIL; - - auto t = static_cast(uint32_t(*sPtr) | uint32_t(*(sPtr + 1u) << 8)); + auto t = static_cast(uint32_t(*sPtr) | uint32_t(*(sPtr + 1u) << 8)); - const uint32_t alpha = (t & 0x8000) ? 255 : 0; - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); + const uint32_t alpha = (t & 0x8000) ? 255 : 0; + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); - sPtr += 2; - *dPtr = t; + sPtr += 2; + *dPtr = t; - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; } } } + } - // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque - if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) - { - opaquealpha = true; - hr = SetAlphaChannelToOpaque(image); - if (FAILED(hr)) - return hr; - } - else if (minalpha == 255) - { - opaquealpha = true; - } + // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque + if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) + { + opaquealpha = true; + hr = SetAlphaChannelToOpaque(image); + if (FAILED(hr)) + return hr; } - break; + else if (minalpha == 255) + { + opaquealpha = true; + } + } + break; //------------------------------------------------------ 24/32-bit (with swizzling) - case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM: { + uint32_t minalpha = 255; + uint32_t maxalpha = 0; + + for (size_t y = 0; y < image->height; ++y) { - uint32_t minalpha = 255; - uint32_t maxalpha = 0; + size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); - for (size_t y = 0; y < image->height; ++y) + auto dPtr = reinterpret_cast( + image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) + + offset; + + for (size_t x = 0; x < image->width;) { - size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); + if (sPtr >= endPtr) + return E_FAIL; + + if (*sPtr & 0x80) + { + // Repeat + size_t j = size_t(*sPtr & 0x7F) + 1; + ++sPtr; + + uint32_t t; + if (convFlags & CONV_FLAGS_EXPAND) + { + assert(offset * 3 < rowPitch); + + if (sPtr + 2 >= endPtr) + return E_FAIL; + + // BGR -> RGBA + t = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | 0xFF000000; + sPtr += 3; + + minalpha = maxalpha = 255; + } + else + { + assert(offset * 4 < rowPitch); + + if (sPtr + 3 >= endPtr) + return E_FAIL; + + // BGRA -> RGBA + const uint32_t alpha = *(sPtr + 3); + t = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | uint32_t(alpha << 24); + + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); + + sPtr += 4; + } + + for (; j > 0; --j, ++x) + { + if (x >= image->width) + return E_FAIL; - auto dPtr = reinterpret_cast(image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) - + offset; + *dPtr = t; - for (size_t x = 0; x < image->width; ) + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; + } + } + else { - if (sPtr >= endPtr) - return E_FAIL; + // Literal + size_t j = size_t(*sPtr & 0x7F) + 1; + ++sPtr; + + if (convFlags & CONV_FLAGS_EXPAND) + { + if (sPtr + (j * 3) > endPtr) + return E_FAIL; + } + else + { + if (sPtr + (j * 4) > endPtr) + return E_FAIL; + } - if (*sPtr & 0x80) + for (; j > 0; --j, ++x) { - // Repeat - size_t j = size_t(*sPtr & 0x7F) + 1; - ++sPtr; + if (x >= image->width) + return E_FAIL; - uint32_t t; if (convFlags & CONV_FLAGS_EXPAND) { assert(offset * 3 < rowPitch); @@ -614,7 +655,7 @@ namespace return E_FAIL; // BGR -> RGBA - t = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | 0xFF000000; + *dPtr = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | 0xFF000000; sPtr += 3; minalpha = maxalpha = 255; @@ -627,8 +668,8 @@ namespace return E_FAIL; // BGRA -> RGBA - const uint32_t alpha = *(sPtr + 3); - t = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | uint32_t(alpha << 24); + uint32_t alpha = *(sPtr + 3); + *dPtr = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | uint32_t(alpha << 24); minalpha = std::min(minalpha, alpha); maxalpha = std::max(maxalpha, alpha); @@ -636,121 +677,96 @@ namespace sPtr += 4; } - for (; j > 0; --j, ++x) - { - if (x >= image->width) - return E_FAIL; - - *dPtr = t; - - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } - } - else - { - // Literal - size_t j = size_t(*sPtr & 0x7F) + 1; - ++sPtr; - - if (convFlags & CONV_FLAGS_EXPAND) - { - if (sPtr + (j * 3) > endPtr) - return E_FAIL; - } + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; else - { - if (sPtr + (j * 4) > endPtr) - return E_FAIL; - } + ++dPtr; + } + } + } + } - for (; j > 0; --j, ++x) - { - if (x >= image->width) - return E_FAIL; + // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque + if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) + { + opaquealpha = true; + hr = SetAlphaChannelToOpaque(image); + if (FAILED(hr)) + return hr; + } + else if (minalpha == 255) + { + opaquealpha = true; + } + } + break; - if (convFlags & CONV_FLAGS_EXPAND) - { - assert(offset * 3 < rowPitch); + //-------------------------------------------------------------------- 32-bit (BGR) + case DXGI_FORMAT_B8G8R8A8_UNORM: { + assert((convFlags & CONV_FLAGS_EXPAND) == 0); - if (sPtr + 2 >= endPtr) - return E_FAIL; + uint32_t minalpha = 255; + uint32_t maxalpha = 0; - // BGR -> RGBA - *dPtr = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | 0xFF000000; - sPtr += 3; + for (size_t y = 0; y < image->height; ++y) + { + size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); - minalpha = maxalpha = 255; - } - else - { - assert(offset * 4 < rowPitch); + auto dPtr = reinterpret_cast( + image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) + + offset; - if (sPtr + 3 >= endPtr) - return E_FAIL; + for (size_t x = 0; x < image->width;) + { + if (sPtr >= endPtr) + return E_FAIL; - // BGRA -> RGBA - uint32_t alpha = *(sPtr + 3); - *dPtr = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | uint32_t(alpha << 24); + if (*sPtr & 0x80) + { + // Repeat + size_t j = size_t(*sPtr & 0x7F) + 1; + ++sPtr; - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); + assert(offset * 4 < rowPitch); - sPtr += 4; - } + if (sPtr + 3 >= endPtr) + return E_FAIL; - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } - } - } - } + const uint32_t alpha = *(sPtr + 3); - // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque - if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) - { - opaquealpha = true; - hr = SetAlphaChannelToOpaque(image); - if (FAILED(hr)) - return hr; - } - else if (minalpha == 255) - { - opaquealpha = true; - } - } - break; + auto t = *reinterpret_cast(sPtr); - //-------------------------------------------------------------------- 32-bit (BGR) - case DXGI_FORMAT_B8G8R8A8_UNORM: - { - assert((convFlags & CONV_FLAGS_EXPAND) == 0); + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); - uint32_t minalpha = 255; - uint32_t maxalpha = 0; + sPtr += 4; - for (size_t y = 0; y < image->height; ++y) - { - size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); + for (; j > 0; --j, ++x) + { + if (x >= image->width) + return E_FAIL; - auto dPtr = reinterpret_cast(image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) - + offset; + *dPtr = t; - for (size_t x = 0; x < image->width; ) + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; + } + } + else { - if (sPtr >= endPtr) + // Literal + size_t j = size_t(*sPtr & 0x7F) + 1; + ++sPtr; + + if (sPtr + (j * 4) > endPtr) return E_FAIL; - if (*sPtr & 0x80) + for (; j > 0; --j, ++x) { - // Repeat - size_t j = size_t(*sPtr & 0x7F) + 1; - ++sPtr; + if (x >= image->width) + return E_FAIL; assert(offset * 4 < rowPitch); @@ -758,175 +774,130 @@ namespace return E_FAIL; const uint32_t alpha = *(sPtr + 3); - - auto t = *reinterpret_cast(sPtr); + *dPtr = *reinterpret_cast(sPtr); minalpha = std::min(minalpha, alpha); maxalpha = std::max(maxalpha, alpha); sPtr += 4; - for (; j > 0; --j, ++x) - { - if (x >= image->width) - return E_FAIL; - - *dPtr = t; - - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } - } - else - { - // Literal - size_t j = size_t(*sPtr & 0x7F) + 1; - ++sPtr; - - if (sPtr + (j * 4) > endPtr) - return E_FAIL; - - for (; j > 0; --j, ++x) - { - if (x >= image->width) - return E_FAIL; - - assert(offset * 4 < rowPitch); - - if (sPtr + 3 >= endPtr) - return E_FAIL; - - const uint32_t alpha = *(sPtr + 3); - *dPtr = *reinterpret_cast(sPtr); - - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); - - sPtr += 4; - - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; } } } + } - // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque - if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) - { - opaquealpha = true; - hr = SetAlphaChannelToOpaque(image); - if (FAILED(hr)) - return hr; - } - else if (minalpha == 255) - { - opaquealpha = true; - } + // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque + if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) + { + opaquealpha = true; + hr = SetAlphaChannelToOpaque(image); + if (FAILED(hr)) + return hr; } - break; + else if (minalpha == 255) + { + opaquealpha = true; + } + } + break; //-------------------------------------------------------------------- 24-bit (BGR) - case DXGI_FORMAT_B8G8R8X8_UNORM: + case DXGI_FORMAT_B8G8R8X8_UNORM: { + assert((convFlags & CONV_FLAGS_EXPAND) != 0); + + for (size_t y = 0; y < image->height; ++y) { - assert((convFlags & CONV_FLAGS_EXPAND) != 0); + size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); - for (size_t y = 0; y < image->height; ++y) - { - size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); + auto dPtr = reinterpret_cast( + image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) + + offset; - auto dPtr = reinterpret_cast(image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) - + offset; + for (size_t x = 0; x < image->width;) + { + if (sPtr >= endPtr) + return E_FAIL; - for (size_t x = 0; x < image->width; ) + if (*sPtr & 0x80) { - if (sPtr >= endPtr) - return E_FAIL; + // Repeat + size_t j = size_t(*sPtr & 0x7F) + 1; + ++sPtr; - if (*sPtr & 0x80) - { - // Repeat - size_t j = size_t(*sPtr & 0x7F) + 1; - ++sPtr; + assert(offset * 3 < rowPitch); - assert(offset * 3 < rowPitch); + if (sPtr + 2 >= endPtr) + return E_FAIL; - if (sPtr + 2 >= endPtr) + uint32_t t = uint32_t(*sPtr) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2) << 16); + sPtr += 3; + + for (; j > 0; --j, ++x) + { + if (x >= image->width) return E_FAIL; - uint32_t t = uint32_t(*sPtr) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2) << 16); - sPtr += 3; + *dPtr = t; - for (; j > 0; --j, ++x) - { - if (x >= image->width) - return E_FAIL; + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; + } + } + else + { + // Literal + size_t j = size_t(*sPtr & 0x7F) + 1; + ++sPtr; - *dPtr = t; + if (sPtr + (j * 3) > endPtr) + return E_FAIL; - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } - } - else + for (; j > 0; --j, ++x) { - // Literal - size_t j = size_t(*sPtr & 0x7F) + 1; - ++sPtr; - - if (sPtr + (j * 3) > endPtr) + if (x >= image->width) return E_FAIL; - for (; j > 0; --j, ++x) - { - if (x >= image->width) - return E_FAIL; - - assert(offset * 3 < rowPitch); + assert(offset * 3 < rowPitch); - if (sPtr + 2 >= endPtr) - return E_FAIL; + if (sPtr + 2 >= endPtr) + return E_FAIL; - *dPtr = uint32_t(*sPtr) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2) << 16); - sPtr += 3; + *dPtr = uint32_t(*sPtr) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2) << 16); + sPtr += 3; - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; } } } } - break; + } + break; //--------------------------------------------------------------------------------- - default: - return E_FAIL; + default: return E_FAIL; } return opaquealpha ? S_FALSE : S_OK; } - //------------------------------------------------------------------------------------- // Copies pixel data from a TGA into the target image //------------------------------------------------------------------------------------- - HRESULT CopyPixels( - _In_reads_bytes_(size) const void* pSource, - size_t size, - TGA_FLAGS flags, - _In_ const Image* image, - _In_ uint32_t convFlags, - _In_opt_ const uint8_t* palette) noexcept + HRESULT CopyPixels(_In_reads_bytes_(size) const void* pSource, + size_t size, + TGA_FLAGS flags, + _In_ const Image* image, + _In_ uint32_t convFlags, + _In_opt_ const uint8_t* palette) noexcept { assert(size > 0); @@ -934,14 +905,17 @@ namespace return E_POINTER; // Compute TGA image data pitch - size_t rowPitch, slicePitch; - HRESULT hr = ComputePitch(image->format, image->width, image->height, - rowPitch, slicePitch, + size_t rowPitch, slicePitch; + HRESULT hr = ComputePitch(image->format, + image->width, + image->height, + rowPitch, + slicePitch, (convFlags & CONV_FLAGS_EXPAND) ? CP_FLAGS_24BPP : CP_FLAGS_NONE); if (FAILED(hr)) return hr; - auto sPtr = static_cast(pSource); + auto sPtr = static_cast(pSource); const uint8_t* endPtr = sPtr + size; bool opaquealpha = false; @@ -958,9 +932,9 @@ namespace size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); assert(offset < rowPitch); - auto dPtr = reinterpret_cast(image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) - + offset; + auto dPtr = reinterpret_cast( + image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) + + offset; for (size_t x = 0; x < image->width; ++x) { @@ -987,9 +961,8 @@ namespace size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); assert(offset < rowPitch); - uint8_t* dPtr = image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1))) - + offset; + uint8_t* dPtr + = image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1))) + offset; for (size_t x = 0; x < image->width; ++x) { @@ -1007,218 +980,212 @@ namespace break; //---------------------------------------------------------------------- 16-bit - case DXGI_FORMAT_B5G5R5A1_UNORM: - { - uint32_t minalpha = 255; - uint32_t maxalpha = 0; + case DXGI_FORMAT_B5G5R5A1_UNORM: { + uint32_t minalpha = 255; + uint32_t maxalpha = 0; - for (size_t y = 0; y < image->height; ++y) - { - size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); - assert(offset * 2 < rowPitch); + for (size_t y = 0; y < image->height; ++y) + { + size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); + assert(offset * 2 < rowPitch); - auto dPtr = reinterpret_cast(image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) - + offset; + auto dPtr = reinterpret_cast( + image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) + + offset; - for (size_t x = 0; x < image->width; ++x) - { - if (sPtr + 1 >= endPtr) - return E_FAIL; + for (size_t x = 0; x < image->width; ++x) + { + if (sPtr + 1 >= endPtr) + return E_FAIL; - auto t = static_cast(uint32_t(*sPtr) | uint32_t(*(sPtr + 1u) << 8)); - sPtr += 2; - *dPtr = t; + auto t = static_cast(uint32_t(*sPtr) | uint32_t(*(sPtr + 1u) << 8)); + sPtr += 2; + *dPtr = t; - const uint32_t alpha = (t & 0x8000) ? 255 : 0; - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); + const uint32_t alpha = (t & 0x8000) ? 255 : 0; + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; } + } - // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque - if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) - { - opaquealpha = true; - hr = SetAlphaChannelToOpaque(image); - if (FAILED(hr)) - return hr; - } - else if (minalpha == 255) - { - opaquealpha = true; - } + // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque + if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) + { + opaquealpha = true; + hr = SetAlphaChannelToOpaque(image); + if (FAILED(hr)) + return hr; } - break; + else if (minalpha == 255) + { + opaquealpha = true; + } + } + break; //-------------------------------------------------- 24/32-bit (with swizzling) - case DXGI_FORMAT_R8G8B8A8_UNORM: - { - uint32_t minalpha = 255; - uint32_t maxalpha = 0; + case DXGI_FORMAT_R8G8B8A8_UNORM: { + uint32_t minalpha = 255; + uint32_t maxalpha = 0; - for (size_t y = 0; y < image->height; ++y) - { - size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); + for (size_t y = 0; y < image->height; ++y) + { + size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); - auto dPtr = reinterpret_cast(image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) - + offset; + auto dPtr = reinterpret_cast( + image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) + + offset; - for (size_t x = 0; x < image->width; ++x) + for (size_t x = 0; x < image->width; ++x) + { + if (convFlags & CONV_FLAGS_EXPAND) { - if (convFlags & CONV_FLAGS_EXPAND) - { - assert(offset * 3 < rowPitch); - - if (sPtr + 2 >= endPtr) - return E_FAIL; + assert(offset * 3 < rowPitch); - // BGR -> RGBA - *dPtr = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | 0xFF000000; - sPtr += 3; + if (sPtr + 2 >= endPtr) + return E_FAIL; - minalpha = maxalpha = 255; - } - else - { - assert(offset * 4 < rowPitch); + // BGR -> RGBA + *dPtr = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | 0xFF000000; + sPtr += 3; - if (sPtr + 3 >= endPtr) - return E_FAIL; + minalpha = maxalpha = 255; + } + else + { + assert(offset * 4 < rowPitch); - // BGRA -> RGBA - uint32_t alpha = *(sPtr + 3); - *dPtr = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | uint32_t(alpha << 24); + if (sPtr + 3 >= endPtr) + return E_FAIL; - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); + // BGRA -> RGBA + uint32_t alpha = *(sPtr + 3); + *dPtr = uint32_t(*sPtr << 16) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2)) | uint32_t(alpha << 24); - sPtr += 4; - } + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; + sPtr += 4; } - } - // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque - if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) - { - opaquealpha = true; - hr = SetAlphaChannelToOpaque(image); - if (FAILED(hr)) - return hr; - } - else if (minalpha == 255) - { - opaquealpha = true; + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; } } - break; + + // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque + if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) + { + opaquealpha = true; + hr = SetAlphaChannelToOpaque(image); + if (FAILED(hr)) + return hr; + } + else if (minalpha == 255) + { + opaquealpha = true; + } + } + break; //---------------------------------------------------------------- 32-bit (BGR) - case DXGI_FORMAT_B8G8R8A8_UNORM: + case DXGI_FORMAT_B8G8R8A8_UNORM: { + assert((convFlags & CONV_FLAGS_EXPAND) == 0); + + uint32_t minalpha = 255; + uint32_t maxalpha = 0; + + for (size_t y = 0; y < image->height; ++y) { - assert((convFlags & CONV_FLAGS_EXPAND) == 0); + size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); - uint32_t minalpha = 255; - uint32_t maxalpha = 0; + auto dPtr = reinterpret_cast( + image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) + + offset; - for (size_t y = 0; y < image->height; ++y) + for (size_t x = 0; x < image->width; ++x) { - size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); - - auto dPtr = reinterpret_cast(image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) - + offset; + assert(offset * 4 < rowPitch); - for (size_t x = 0; x < image->width; ++x) - { - assert(offset * 4 < rowPitch); - - if (sPtr + 3 >= endPtr) - return E_FAIL; + if (sPtr + 3 >= endPtr) + return E_FAIL; - const uint32_t alpha = *(sPtr + 3); - *dPtr = *reinterpret_cast(sPtr); + const uint32_t alpha = *(sPtr + 3); + *dPtr = *reinterpret_cast(sPtr); - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); - sPtr += 4; + sPtr += 4; - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; } + } - // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque - if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) - { - opaquealpha = true; - hr = SetAlphaChannelToOpaque(image); - if (FAILED(hr)) - return hr; - } - else if (minalpha == 255) - { - opaquealpha = true; - } + // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque + if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) + { + opaquealpha = true; + hr = SetAlphaChannelToOpaque(image); + if (FAILED(hr)) + return hr; } - break; + else if (minalpha == 255) + { + opaquealpha = true; + } + } + break; //---------------------------------------------------------------- 24-bit (BGR) - case DXGI_FORMAT_B8G8R8X8_UNORM: - { - assert((convFlags & CONV_FLAGS_EXPAND) != 0); + case DXGI_FORMAT_B8G8R8X8_UNORM: { + assert((convFlags & CONV_FLAGS_EXPAND) != 0); - for (size_t y = 0; y < image->height; ++y) - { - size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); + for (size_t y = 0; y < image->height; ++y) + { + size_t offset = ((convFlags & CONV_FLAGS_INVERTX) ? (image->width - 1) : 0); - auto dPtr = reinterpret_cast(image->pixels - + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) - + offset; + auto dPtr = reinterpret_cast( + image->pixels + (image->rowPitch * ((convFlags & CONV_FLAGS_INVERTY) ? y : (image->height - y - 1)))) + + offset; - for (size_t x = 0; x < image->width; ++x) - { - assert(offset * 3 < rowPitch); + for (size_t x = 0; x < image->width; ++x) + { + assert(offset * 3 < rowPitch); - if (sPtr + 2 >= endPtr) - return E_FAIL; + if (sPtr + 2 >= endPtr) + return E_FAIL; - *dPtr = uint32_t(*sPtr) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2) << 16); - sPtr += 3; + *dPtr = uint32_t(*sPtr) | uint32_t(*(sPtr + 1) << 8) | uint32_t(*(sPtr + 2) << 16); + sPtr += 3; - if (convFlags & CONV_FLAGS_INVERTX) - --dPtr; - else - ++dPtr; - } + if (convFlags & CONV_FLAGS_INVERTX) + --dPtr; + else + ++dPtr; } } - break; + } + break; //----------------------------------------------------------------------------- - default: - return E_FAIL; + default: return E_FAIL; } } return opaquealpha ? S_FALSE : S_OK; } - //------------------------------------------------------------------------------------- // Encodes TGA file header //------------------------------------------------------------------------------------- @@ -1226,78 +1193,74 @@ namespace { memset(&header, 0, TGA_HEADER_LEN); - if ((image.width > UINT16_MAX) - || (image.height > UINT16_MAX)) + if ((image.width > UINT16_MAX) || (image.height > UINT16_MAX)) { return HRESULT_E_NOT_SUPPORTED; } - header.wWidth = static_cast(image.width); + header.wWidth = static_cast(image.width); header.wHeight = static_cast(image.height); switch (image.format) { case DXGI_FORMAT_R8G8B8A8_UNORM: case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - header.bImageType = TGA_TRUECOLOR; + header.bImageType = TGA_TRUECOLOR; header.bBitsPerPixel = 32; - header.bDescriptor = TGA_FLAGS_INVERTY | 8; + header.bDescriptor = TGA_FLAGS_INVERTY | 8; convFlags |= CONV_FLAGS_SWIZZLE; break; case DXGI_FORMAT_B8G8R8A8_UNORM: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - header.bImageType = TGA_TRUECOLOR; + header.bImageType = TGA_TRUECOLOR; header.bBitsPerPixel = 32; - header.bDescriptor = TGA_FLAGS_INVERTY | 8; + header.bDescriptor = TGA_FLAGS_INVERTY | 8; break; case DXGI_FORMAT_B8G8R8X8_UNORM: case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - header.bImageType = TGA_TRUECOLOR; + header.bImageType = TGA_TRUECOLOR; header.bBitsPerPixel = 24; - header.bDescriptor = TGA_FLAGS_INVERTY; + header.bDescriptor = TGA_FLAGS_INVERTY; convFlags |= CONV_FLAGS_888; break; case DXGI_FORMAT_R8_UNORM: case DXGI_FORMAT_A8_UNORM: - header.bImageType = TGA_BLACK_AND_WHITE; + header.bImageType = TGA_BLACK_AND_WHITE; header.bBitsPerPixel = 8; - header.bDescriptor = TGA_FLAGS_INVERTY; + header.bDescriptor = TGA_FLAGS_INVERTY; break; case DXGI_FORMAT_B5G5R5A1_UNORM: - header.bImageType = TGA_TRUECOLOR; + header.bImageType = TGA_TRUECOLOR; header.bBitsPerPixel = 16; - header.bDescriptor = TGA_FLAGS_INVERTY | 1; + header.bDescriptor = TGA_FLAGS_INVERTY | 1; break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } return S_OK; } - //------------------------------------------------------------------------------------- // Copies BGRX data to form BGR 24bpp data //------------------------------------------------------------------------------------- -#pragma warning(suppress: 6001 6101) // In the case where outSize is insufficient we do not write to pDestination - void Copy24bppScanline( - _Out_writes_bytes_(outSize) void* pDestination, - _In_ size_t outSize, - _In_reads_bytes_(inSize) const void* pSource, - _In_ size_t inSize) noexcept +#pragma warning(suppress : 6001 6101) // In the case where outSize is insufficient we do not write to pDestination + void Copy24bppScanline(_Out_writes_bytes_(outSize) void* pDestination, + _In_ size_t outSize, + _In_reads_bytes_(inSize) const void* pSource, + _In_ size_t inSize) noexcept { assert(pDestination && outSize > 0); assert(pSource && inSize > 0); assert(pDestination != pSource); - const uint32_t * __restrict sPtr = static_cast(pSource); - uint8_t * __restrict dPtr = static_cast(pDestination); + const uint32_t* __restrict sPtr = static_cast(pSource); + uint8_t* __restrict dPtr = static_cast(pDestination); if (inSize >= 4 && outSize >= 3) { @@ -1310,9 +1273,9 @@ namespace if (dPtr + 3 > endPtr) return; - *(dPtr++) = uint8_t(t & 0xFF); // Blue - *(dPtr++) = uint8_t((t & 0xFF00) >> 8); // Green - *(dPtr++) = uint8_t((t & 0xFF0000) >> 16); // Red + *(dPtr++) = uint8_t(t & 0xFF); // Blue + *(dPtr++) = uint8_t((t & 0xFF00) >> 8); // Green + *(dPtr++) = uint8_t((t & 0xFF0000) >> 16); // Red } } } @@ -1320,7 +1283,7 @@ namespace //------------------------------------------------------------------------------------- // TGA 2.0 Extension helpers //------------------------------------------------------------------------------------- - void SetExtension(_In_ TGA_EXTENSION *ext, TGA_FLAGS flags, const TexMetadata& metadata) noexcept + void SetExtension(_In_ TGA_EXTENSION* ext, TGA_FLAGS flags, const TexMetadata& metadata) noexcept { memset(ext, 0, sizeof(TGA_EXTENSION)); @@ -1333,37 +1296,27 @@ namespace const bool sRGB = ((flags & TGA_FLAGS_FORCE_LINEAR) == 0) && ((flags & TGA_FLAGS_FORCE_SRGB) != 0 || IsSRGB(metadata.format)); if (sRGB) { - ext->wGammaNumerator = 22; + ext->wGammaNumerator = 22; ext->wGammaDenominator = 10; } else if (flags & TGA_FLAGS_FORCE_LINEAR) { - ext->wGammaNumerator = 1; + ext->wGammaNumerator = 1; ext->wGammaDenominator = 1; } switch (metadata.GetAlphaMode()) { default: - case TEX_ALPHA_MODE_UNKNOWN: - ext->bAttributesType = HasAlpha(metadata.format) ? TGA_ATTRIBUTE_UNDEFINED : TGA_ATTRIBUTE_NONE; - break; + case TEX_ALPHA_MODE_UNKNOWN: ext->bAttributesType = HasAlpha(metadata.format) ? TGA_ATTRIBUTE_UNDEFINED : TGA_ATTRIBUTE_NONE; break; - case TEX_ALPHA_MODE_STRAIGHT: - ext->bAttributesType = TGA_ATTRIBUTE_ALPHA; - break; + case TEX_ALPHA_MODE_STRAIGHT: ext->bAttributesType = TGA_ATTRIBUTE_ALPHA; break; - case TEX_ALPHA_MODE_PREMULTIPLIED: - ext->bAttributesType = TGA_ATTRIBUTE_PREMULTIPLIED; - break; + case TEX_ALPHA_MODE_PREMULTIPLIED: ext->bAttributesType = TGA_ATTRIBUTE_PREMULTIPLIED; break; - case TEX_ALPHA_MODE_OPAQUE: - ext->bAttributesType = TGA_ATTRIBUTE_IGNORED; - break; + case TEX_ALPHA_MODE_OPAQUE: ext->bAttributesType = TGA_ATTRIBUTE_IGNORED; break; - case TEX_ALPHA_MODE_CUSTOM: - ext->bAttributesType = TGA_ATTRIBUTE_UNDEFINED; - break; + case TEX_ALPHA_MODE_CUSTOM: ext->bAttributesType = TGA_ATTRIBUTE_UNDEFINED; break; } // Set file time stamp @@ -1371,43 +1324,44 @@ namespace time_t now = {}; time(&now); - #ifdef _WIN32 - tm info; +#ifdef _WIN32 + tm info; auto pinfo = &info; if (!gmtime_s(pinfo, &now)) - #else +#else const tm* pinfo = gmtime(&now); if (pinfo) - #endif +#endif { - ext->wStampMonth = static_cast(pinfo->tm_mon + 1); - ext->wStampDay = static_cast(pinfo->tm_mday); - ext->wStampYear = static_cast(pinfo->tm_year + 1900); - ext->wStampHour = static_cast(pinfo->tm_hour); + ext->wStampMonth = static_cast(pinfo->tm_mon + 1); + ext->wStampDay = static_cast(pinfo->tm_mday); + ext->wStampYear = static_cast(pinfo->tm_year + 1900); + ext->wStampHour = static_cast(pinfo->tm_hour); ext->wStampMinute = static_cast(pinfo->tm_min); ext->wStampSecond = static_cast(pinfo->tm_sec); } } } - TEX_ALPHA_MODE GetAlphaModeFromExtension(_In_opt_ const TGA_EXTENSION *ext) noexcept + TEX_ALPHA_MODE GetAlphaModeFromExtension(_In_opt_ const TGA_EXTENSION* ext) noexcept { if (ext && ext->wSize == sizeof(TGA_EXTENSION)) { switch (ext->bAttributesType) { - case TGA_ATTRIBUTE_IGNORED: return TEX_ALPHA_MODE_OPAQUE; - case TGA_ATTRIBUTE_UNDEFINED: return TEX_ALPHA_MODE_CUSTOM; - case TGA_ATTRIBUTE_ALPHA: return TEX_ALPHA_MODE_STRAIGHT; + case TGA_ATTRIBUTE_IGNORED: return TEX_ALPHA_MODE_OPAQUE; + case TGA_ATTRIBUTE_UNDEFINED: return TEX_ALPHA_MODE_CUSTOM; + case TGA_ATTRIBUTE_ALPHA: return TEX_ALPHA_MODE_STRAIGHT; case TGA_ATTRIBUTE_PREMULTIPLIED: return TEX_ALPHA_MODE_PREMULTIPLIED; - default: return TEX_ALPHA_MODE_UNKNOWN; + default: return TEX_ALPHA_MODE_UNKNOWN; } } return TEX_ALPHA_MODE_UNKNOWN; } - DXGI_FORMAT GetSRGBFromExtension(_In_opt_ const TGA_EXTENSION* ext, DXGI_FORMAT format, TGA_FLAGS flags, _In_opt_ ScratchImage* image) noexcept + DXGI_FORMAT + GetSRGBFromExtension(_In_opt_ const TGA_EXTENSION* ext, DXGI_FORMAT format, TGA_FLAGS flags, _In_opt_ ScratchImage* image) noexcept { bool sRGB = false; @@ -1435,8 +1389,7 @@ namespace return format; } -} - +} // namespace //===================================================================================== // Entry-points @@ -1445,17 +1398,15 @@ namespace //------------------------------------------------------------------------------------- // Obtain metadata from TGA file in memory/on disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromTGAMemory( - const uint8_t* pSource, - size_t size, - TGA_FLAGS flags, - TexMetadata& metadata) noexcept +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromTGAMemory(const uint8_t* pSource, + size_t size, + TGA_FLAGS flags, + TexMetadata& metadata) noexcept { if (!pSource || size == 0) return E_INVALIDARG; - size_t offset; + size_t offset; HRESULT hr = DecodeTGAHeader(pSource, size, flags, metadata, offset, nullptr); if (FAILED(hr)) return hr; @@ -1468,8 +1419,7 @@ HRESULT DirectX::GetMetadataFromTGAMemory( if (memcmp(footer->Signature, g_Signature, sizeof(g_Signature)) == 0) { - if (footer->dwExtensionOffset != 0 - && ((footer->dwExtensionOffset + sizeof(TGA_EXTENSION)) <= size)) + if (footer->dwExtensionOffset != 0 && ((footer->dwExtensionOffset + sizeof(TGA_EXTENSION)) <= size)) { ext = reinterpret_cast(static_cast(pSource) + footer->dwExtensionOffset); metadata.SetAlphaMode(GetAlphaModeFromExtension(ext)); @@ -1485,17 +1435,13 @@ HRESULT DirectX::GetMetadataFromTGAMemory( return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromTGAFile(const wchar_t* szFile, TGA_FLAGS flags, TexMetadata& metadata) noexcept +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromTGAFile(const wchar_t* szFile, TGA_FLAGS flags, TexMetadata& metadata) noexcept { if (!szFile) return E_INVALIDARG; #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -1559,18 +1505,18 @@ HRESULT DirectX::GetMetadataFromTGAFile(const wchar_t* szFile, TGA_FLAGS flags, size_t headerLen = TGA_HEADER_LEN; #endif - size_t offset; + size_t offset; HRESULT hr = DecodeTGAHeader(header, headerLen, flags, metadata, offset, nullptr); if (FAILED(hr)) return hr; // Optional TGA 2.0 footer & extension area - const TGA_EXTENSION* ext = nullptr; - TGA_EXTENSION extData = {}; + const TGA_EXTENSION* ext = nullptr; + TGA_EXTENSION extData = {}; { TGA_FOOTER footer = {}; - #ifdef _WIN32 +#ifdef _WIN32 if (SetFilePointer(hFile.get(), -static_cast(sizeof(TGA_FOOTER)), nullptr, FILE_END) != INVALID_SET_FILE_POINTER) { if (!ReadFile(hFile.get(), &footer, sizeof(TGA_FOOTER), &bytesRead, nullptr)) @@ -1583,7 +1529,7 @@ HRESULT DirectX::GetMetadataFromTGAFile(const wchar_t* szFile, TGA_FLAGS flags, return E_FAIL; } } - #else +#else inFile.seekg(-static_cast(sizeof(TGA_FOOTER)), std::ios::end); if (inFile) { @@ -1591,25 +1537,23 @@ HRESULT DirectX::GetMetadataFromTGAFile(const wchar_t* szFile, TGA_FLAGS flags, if (!inFile) return E_FAIL; } - #endif +#endif if (memcmp(footer.Signature, g_Signature, sizeof(g_Signature)) == 0) { - if (footer.dwExtensionOffset != 0 - && ((footer.dwExtensionOffset + sizeof(TGA_EXTENSION)) <= len)) + if (footer.dwExtensionOffset != 0 && ((footer.dwExtensionOffset + sizeof(TGA_EXTENSION)) <= len)) { - #ifdef _WIN32 +#ifdef _WIN32 const LARGE_INTEGER filePos = { { static_cast(footer.dwExtensionOffset), 0 } }; if (SetFilePointerEx(hFile.get(), filePos, nullptr, FILE_BEGIN)) { - if (ReadFile(hFile.get(), &extData, sizeof(TGA_EXTENSION), &bytesRead, nullptr) - && bytesRead == sizeof(TGA_EXTENSION)) + if (ReadFile(hFile.get(), &extData, sizeof(TGA_EXTENSION), &bytesRead, nullptr) && bytesRead == sizeof(TGA_EXTENSION)) { ext = &extData; metadata.SetAlphaMode(GetAlphaModeFromExtension(ext)); } } - #else // !WIN32 +#else // !WIN32 inFile.seekg(static_cast(footer.dwExtensionOffset), std::ios::beg); if (inFile) { @@ -1620,7 +1564,7 @@ HRESULT DirectX::GetMetadataFromTGAFile(const wchar_t* szFile, TGA_FLAGS flags, metadata.SetAlphaMode(GetAlphaModeFromExtension(ext)); } } - #endif +#endif } } } @@ -1633,34 +1577,28 @@ HRESULT DirectX::GetMetadataFromTGAFile(const wchar_t* szFile, TGA_FLAGS flags, return S_OK; } - //------------------------------------------------------------------------------------- // Load a TGA file in memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromTGAMemory( - const uint8_t* pSource, - size_t size, - TGA_FLAGS flags, - TexMetadata* metadata, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT +DirectX::LoadFromTGAMemory(const uint8_t* pSource, size_t size, TGA_FLAGS flags, TexMetadata* metadata, ScratchImage& image) noexcept { if (!pSource || size == 0) return E_INVALIDARG; image.Release(); - size_t offset; - uint32_t convFlags = 0; + size_t offset; + uint32_t convFlags = 0; TexMetadata mdata; - HRESULT hr = DecodeTGAHeader(pSource, size, flags, mdata, offset, &convFlags); + HRESULT hr = DecodeTGAHeader(pSource, size, flags, mdata, offset, &convFlags); if (FAILED(hr)) return hr; if (offset > size) return HRESULT_E_INVALID_DATA; - size_t paletteOffset = 0; + size_t paletteOffset = 0; uint8_t palette[256 * 4] = {}; if (convFlags & CONV_FLAGS_PALETTED) { @@ -1671,8 +1609,7 @@ HRESULT DirectX::LoadFromTGAMemory( auto pColorMap = static_cast(pSource) + offset; _Analysis_assume_(size > TGA_HEADER_LEN); - hr = ReadPalette(static_cast(pSource), pColorMap, remaining, flags, - palette, paletteOffset); + hr = ReadPalette(static_cast(pSource), pColorMap, remaining, flags, palette, paletteOffset); if (FAILED(hr)) return hr; } @@ -1710,8 +1647,7 @@ HRESULT DirectX::LoadFromTGAMemory( if (memcmp(footer->Signature, g_Signature, sizeof(g_Signature)) == 0) { - if (footer->dwExtensionOffset != 0 - && ((footer->dwExtensionOffset + sizeof(TGA_EXTENSION)) <= size)) + if (footer->dwExtensionOffset != 0 && ((footer->dwExtensionOffset + sizeof(TGA_EXTENSION)) <= size)) { ext = reinterpret_cast(static_cast(pSource) + footer->dwExtensionOffset); } @@ -1739,16 +1675,13 @@ HRESULT DirectX::LoadFromTGAMemory( return S_OK; } - //------------------------------------------------------------------------------------- // Load a TGA file from disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromTGAFile( - const wchar_t* szFile, - TGA_FLAGS flags, - TexMetadata* metadata, - ScratchImage& image) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadFromTGAFile(const wchar_t* szFile, + TGA_FLAGS flags, + TexMetadata* metadata, + ScratchImage& image) noexcept { if (!szFile) return E_INVALIDARG; @@ -1756,10 +1689,7 @@ HRESULT DirectX::LoadFromTGAFile( image.Release(); #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -1823,10 +1753,10 @@ HRESULT DirectX::LoadFromTGAFile( size_t headerLen = TGA_HEADER_LEN; #endif - size_t offset; - uint32_t convFlags = 0; + size_t offset; + uint32_t convFlags = 0; TexMetadata mdata; - HRESULT hr = DecodeTGAHeader(header, headerLen, flags, mdata, offset, &convFlags); + HRESULT hr = DecodeTGAHeader(header, headerLen, flags, mdata, offset, &convFlags); if (FAILED(hr)) return hr; @@ -1840,18 +1770,18 @@ HRESULT DirectX::LoadFromTGAFile( if (offset > TGA_HEADER_LEN) { - #ifdef _WIN32 - // Skip past the id string +#ifdef _WIN32 + // Skip past the id string const LARGE_INTEGER filePos = { { static_cast(offset), 0 } }; if (!SetFilePointerEx(hFile.get(), filePos, nullptr, FILE_BEGIN)) { return HRESULT_FROM_WIN32(GetLastError()); } - #else +#else inFile.seekg(offset, std::ios::beg); if (!inFile) return E_FAIL; - #endif +#endif } hr = image.Initialize2D(mdata.format, mdata.width, mdata.height, 1, 1, CP_FLAGS_LIMIT_4GB); @@ -1877,7 +1807,7 @@ HRESULT DirectX::LoadFromTGAFile( return HRESULT_E_ARITHMETIC_OVERFLOW; } - #ifdef _WIN32 +#ifdef _WIN32 if (!ReadFile(hFile.get(), image.GetPixels(), static_cast(image.GetPixelsSize()), &bytesRead, nullptr)) { image.Release(); @@ -1889,202 +1819,198 @@ HRESULT DirectX::LoadFromTGAFile( image.Release(); return E_FAIL; } - #else +#else inFile.read(reinterpret_cast(image.GetPixels()), image.GetPixelsSize()); if (!inFile) { image.Release(); return E_FAIL; } - #endif +#endif switch (mdata.format) { - case DXGI_FORMAT_R8G8B8A8_UNORM: + case DXGI_FORMAT_R8G8B8A8_UNORM: { + // TGA stores 32-bit data in BGRA form, need to swizzle to RGBA + assert(image.GetImageCount() == 1); + const Image* img = image.GetImage(0, 0, 0); + if (!img) { - // TGA stores 32-bit data in BGRA form, need to swizzle to RGBA - assert(image.GetImageCount() == 1); - const Image* img = image.GetImage(0, 0, 0); - if (!img) - { - image.Release(); - return E_POINTER; - } - - uint8_t *pPixels = img->pixels; - if (!pPixels) - { - image.Release(); - return E_POINTER; - } - - size_t rowPitch = img->rowPitch; + image.Release(); + return E_POINTER; + } - // Scan for non-zero alpha channel - uint32_t minalpha = 255; - uint32_t maxalpha = 0; + uint8_t* pPixels = img->pixels; + if (!pPixels) + { + image.Release(); + return E_POINTER; + } - for (size_t h = 0; h < img->height; ++h) - { - auto sPtr = reinterpret_cast(pPixels); + size_t rowPitch = img->rowPitch; - for (size_t x = 0; x < img->width; ++x) - { - const uint32_t alpha = ((*sPtr & 0xFF000000) >> 24); + // Scan for non-zero alpha channel + uint32_t minalpha = 255; + uint32_t maxalpha = 0; - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); + for (size_t h = 0; h < img->height; ++h) + { + auto sPtr = reinterpret_cast(pPixels); - ++sPtr; - } + for (size_t x = 0; x < img->width; ++x) + { + const uint32_t alpha = ((*sPtr & 0xFF000000) >> 24); - pPixels += rowPitch; - } + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); - uint32_t tflags = TEXP_SCANLINE_NONE; - if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) - { - opaquealpha = true; - tflags = TEXP_SCANLINE_SETALPHA; - } - else if (minalpha == 255) - { - opaquealpha = true; + ++sPtr; } - // Swizzle scanlines - pPixels = img->pixels; + pPixels += rowPitch; + } - for (size_t h = 0; h < img->height; ++h) - { - SwizzleScanline(pPixels, rowPitch, pPixels, rowPitch, mdata.format, tflags); - pPixels += rowPitch; - } + uint32_t tflags = TEXP_SCANLINE_NONE; + if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) + { + opaquealpha = true; + tflags = TEXP_SCANLINE_SETALPHA; + } + else if (minalpha == 255) + { + opaquealpha = true; } - break; - case DXGI_FORMAT_B8G8R8A8_UNORM: + // Swizzle scanlines + pPixels = img->pixels; + + for (size_t h = 0; h < img->height; ++h) { - assert(image.GetImageCount() == 1); - const Image* img = image.GetImage(0, 0, 0); - if (!img) - { - image.Release(); - return E_POINTER; - } + SwizzleScanline(pPixels, rowPitch, pPixels, rowPitch, mdata.format, tflags); + pPixels += rowPitch; + } + } + break; - // Scan for non-zero alpha channel - uint32_t minalpha = 255; - uint32_t maxalpha = 0; + case DXGI_FORMAT_B8G8R8A8_UNORM: { + assert(image.GetImageCount() == 1); + const Image* img = image.GetImage(0, 0, 0); + if (!img) + { + image.Release(); + return E_POINTER; + } - const uint8_t *pPixels = img->pixels; - if (!pPixels) - { - image.Release(); - return E_POINTER; - } + // Scan for non-zero alpha channel + uint32_t minalpha = 255; + uint32_t maxalpha = 0; - const size_t rowPitch = img->rowPitch; + const uint8_t* pPixels = img->pixels; + if (!pPixels) + { + image.Release(); + return E_POINTER; + } - for (size_t h = 0; h < img->height; ++h) - { - auto sPtr = reinterpret_cast(pPixels); + const size_t rowPitch = img->rowPitch; - for (size_t x = 0; x < img->width; ++x) - { - const uint32_t alpha = ((*sPtr & 0xFF000000) >> 24); + for (size_t h = 0; h < img->height; ++h) + { + auto sPtr = reinterpret_cast(pPixels); - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); + for (size_t x = 0; x < img->width; ++x) + { + const uint32_t alpha = ((*sPtr & 0xFF000000) >> 24); - ++sPtr; - } + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); - pPixels += rowPitch; + ++sPtr; } - // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque - if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) - { - opaquealpha = true; - hr = SetAlphaChannelToOpaque(img); - if (FAILED(hr)) - { - image.Release(); - return hr; - } - } - else if (minalpha == 255) - { - opaquealpha = true; - } + pPixels += rowPitch; } - break; - case DXGI_FORMAT_B5G5R5A1_UNORM: + // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque + if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) { - assert(image.GetImageCount() == 1); - const Image* img = image.GetImage(0, 0, 0); - if (!img) + opaquealpha = true; + hr = SetAlphaChannelToOpaque(img); + if (FAILED(hr)) { image.Release(); - return E_POINTER; + return hr; } + } + else if (minalpha == 255) + { + opaquealpha = true; + } + } + break; - // Scan for non-zero alpha channel - uint32_t minalpha = 255; - uint32_t maxalpha = 0; + case DXGI_FORMAT_B5G5R5A1_UNORM: { + assert(image.GetImageCount() == 1); + const Image* img = image.GetImage(0, 0, 0); + if (!img) + { + image.Release(); + return E_POINTER; + } - const uint8_t *pPixels = img->pixels; - if (!pPixels) - { - image.Release(); - return E_POINTER; - } + // Scan for non-zero alpha channel + uint32_t minalpha = 255; + uint32_t maxalpha = 0; - const size_t rowPitch = img->rowPitch; + const uint8_t* pPixels = img->pixels; + if (!pPixels) + { + image.Release(); + return E_POINTER; + } - for (size_t h = 0; h < img->height; ++h) - { - auto sPtr = reinterpret_cast(pPixels); + const size_t rowPitch = img->rowPitch; - for (size_t x = 0; x < img->width; ++x) - { - const uint32_t alpha = (*sPtr & 0x8000) ? 255 : 0; + for (size_t h = 0; h < img->height; ++h) + { + auto sPtr = reinterpret_cast(pPixels); - minalpha = std::min(minalpha, alpha); - maxalpha = std::max(maxalpha, alpha); + for (size_t x = 0; x < img->width; ++x) + { + const uint32_t alpha = (*sPtr & 0x8000) ? 255 : 0; - ++sPtr; - } + minalpha = std::min(minalpha, alpha); + maxalpha = std::max(maxalpha, alpha); - pPixels += rowPitch; + ++sPtr; } - // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque - if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) - { - opaquealpha = true; - hr = SetAlphaChannelToOpaque(img); - if (FAILED(hr)) - { - image.Release(); - return hr; - } - } - else if (minalpha == 255) + pPixels += rowPitch; + } + + // If there are no non-zero alpha channel entries, we'll assume alpha is not used and force it to opaque + if (maxalpha == 0 && !(flags & TGA_FLAGS_ALLOW_ALL_ZERO_ALPHA)) + { + opaquealpha = true; + hr = SetAlphaChannelToOpaque(img); + if (FAILED(hr)) { - opaquealpha = true; + image.Release(); + return hr; } } - break; + else if (minalpha == 255) + { + opaquealpha = true; + } + } + break; case DXGI_FORMAT_B8G8R8X8_UNORM: // Should never be trying to direct-read 24bpp return E_FAIL; - default: - break; + default: break; } } else // RLE || EXPAND || INVERTX || PALETTED || !INVERTY @@ -2096,7 +2022,7 @@ HRESULT DirectX::LoadFromTGAFile( return E_OUTOFMEMORY; } - #ifdef _WIN32 +#ifdef _WIN32 if (!ReadFile(hFile.get(), temp.get(), static_cast(remaining), &bytesRead, nullptr)) { image.Release(); @@ -2108,16 +2034,16 @@ HRESULT DirectX::LoadFromTGAFile( image.Release(); return E_FAIL; } - #else +#else inFile.read(reinterpret_cast(temp.get()), remaining); if (!inFile) { image.Release(); return E_FAIL; } - #endif +#endif - size_t paletteOffset = 0; + size_t paletteOffset = 0; uint8_t palette[256 * 4] = {}; if (convFlags & CONV_FLAGS_PALETTED) { @@ -2137,13 +2063,11 @@ HRESULT DirectX::LoadFromTGAFile( if (convFlags & CONV_FLAGS_RLE) { - hr = UncompressPixels(temp.get() + paletteOffset, remaining - paletteOffset, - flags, image.GetImage(0, 0, 0), convFlags); + hr = UncompressPixels(temp.get() + paletteOffset, remaining - paletteOffset, flags, image.GetImage(0, 0, 0), convFlags); } else { - hr = CopyPixels(temp.get() + paletteOffset, remaining - paletteOffset, - flags, image.GetImage(0, 0, 0), convFlags, palette); + hr = CopyPixels(temp.get() + paletteOffset, remaining - paletteOffset, flags, image.GetImage(0, 0, 0), convFlags, palette); } if (FAILED(hr)) @@ -2157,12 +2081,12 @@ HRESULT DirectX::LoadFromTGAFile( } // Optional TGA 2.0 footer & extension area - const TGA_EXTENSION* ext = nullptr; - TGA_EXTENSION extData = {}; + const TGA_EXTENSION* ext = nullptr; + TGA_EXTENSION extData = {}; { TGA_FOOTER footer = {}; - #ifdef _WIN32 +#ifdef _WIN32 if (SetFilePointer(hFile.get(), -static_cast(sizeof(TGA_FOOTER)), nullptr, FILE_END) != INVALID_SET_FILE_POINTER) { if (!ReadFile(hFile.get(), &footer, sizeof(TGA_FOOTER), &bytesRead, nullptr)) @@ -2177,7 +2101,7 @@ HRESULT DirectX::LoadFromTGAFile( return E_FAIL; } } - #else // !WIN32 +#else // !WIN32 inFile.seekg(-static_cast(sizeof(TGA_FOOTER)), std::ios::end); if (inFile) { @@ -2188,24 +2112,22 @@ HRESULT DirectX::LoadFromTGAFile( return E_FAIL; } } - #endif +#endif if (memcmp(footer.Signature, g_Signature, sizeof(g_Signature)) == 0) { - if (footer.dwExtensionOffset != 0 - && ((footer.dwExtensionOffset + sizeof(TGA_EXTENSION)) <= len)) + if (footer.dwExtensionOffset != 0 && ((footer.dwExtensionOffset + sizeof(TGA_EXTENSION)) <= len)) { - #ifdef _WIN32 +#ifdef _WIN32 const LARGE_INTEGER filePos = { { static_cast(footer.dwExtensionOffset), 0 } }; if (SetFilePointerEx(hFile.get(), filePos, nullptr, FILE_BEGIN)) { - if (ReadFile(hFile.get(), &extData, sizeof(TGA_EXTENSION), &bytesRead, nullptr) - && bytesRead == sizeof(TGA_EXTENSION)) + if (ReadFile(hFile.get(), &extData, sizeof(TGA_EXTENSION), &bytesRead, nullptr) && bytesRead == sizeof(TGA_EXTENSION)) { ext = &extData; } } - #else // !WIN32 +#else // !WIN32 inFile.seekg(static_cast(footer.dwExtensionOffset), std::ios::beg); if (inFile) { @@ -2215,7 +2137,7 @@ HRESULT DirectX::LoadFromTGAFile( ext = &extData; } } - #endif +#endif } } } @@ -2241,16 +2163,13 @@ HRESULT DirectX::LoadFromTGAFile( return S_OK; } - //------------------------------------------------------------------------------------- // Save a TGA file to memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveToTGAMemory( - const Image& image, - TGA_FLAGS flags, - Blob& blob, - const TexMetadata* metadata) noexcept +_Use_decl_annotations_ HRESULT DirectX::SaveToTGAMemory(const Image& image, + TGA_FLAGS flags, + Blob& blob, + const TexMetadata* metadata) noexcept { if ((flags & (TGA_FLAGS_FORCE_LINEAR | TGA_FLAGS_FORCE_SRGB)) != 0 && !metadata) return E_INVALIDARG; @@ -2259,8 +2178,8 @@ HRESULT DirectX::SaveToTGAMemory( return E_POINTER; TGA_HEADER tga_header = {}; - uint32_t convFlags = 0; - HRESULT hr = EncodeTGAHeader(image, tga_header, convFlags); + uint32_t convFlags = 0; + HRESULT hr = EncodeTGAHeader(image, tga_header, convFlags); if (FAILED(hr)) return hr; @@ -2268,21 +2187,22 @@ HRESULT DirectX::SaveToTGAMemory( // Determine memory required for image data size_t rowPitch, slicePitch; - hr = ComputePitch(image.format, image.width, image.height, rowPitch, slicePitch, + hr = ComputePitch(image.format, + image.width, + image.height, + rowPitch, + slicePitch, (convFlags & CONV_FLAGS_888) ? CP_FLAGS_24BPP : CP_FLAGS_NONE); if (FAILED(hr)) return hr; - hr = blob.Initialize(TGA_HEADER_LEN - + slicePitch - + (metadata ? sizeof(TGA_EXTENSION) : 0) - + sizeof(TGA_FOOTER)); + hr = blob.Initialize(TGA_HEADER_LEN + slicePitch + (metadata ? sizeof(TGA_EXTENSION) : 0) + sizeof(TGA_FOOTER)); if (FAILED(hr)) return hr; // Copy header auto destPtr = blob.GetBufferPointer(); - assert(destPtr != nullptr); + assert(destPtr != nullptr); uint8_t* dPtr = destPtr; memcpy(dPtr, &tga_header, TGA_HEADER_LEN); @@ -2323,7 +2243,7 @@ HRESULT DirectX::SaveToTGAMemory( } // Copy TGA 2.0 footer - auto footer = reinterpret_cast(dPtr); + auto footer = reinterpret_cast(dPtr); footer->dwDeveloperOffset = 0; footer->dwExtensionOffset = extOffset; memcpy(footer->Signature, g_Signature, sizeof(g_Signature)); @@ -2331,16 +2251,13 @@ HRESULT DirectX::SaveToTGAMemory( return S_OK; } - //------------------------------------------------------------------------------------- // Save a TGA file to disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveToTGAFile( - const Image& image, - TGA_FLAGS flags, - const wchar_t* szFile, - const TexMetadata* metadata) noexcept +_Use_decl_annotations_ HRESULT DirectX::SaveToTGAFile(const Image& image, + TGA_FLAGS flags, + const wchar_t* szFile, + const TexMetadata* metadata) noexcept { if (!szFile) return E_INVALIDARG; @@ -2352,17 +2269,14 @@ HRESULT DirectX::SaveToTGAFile( return E_POINTER; TGA_HEADER tga_header = {}; - uint32_t convFlags = 0; - HRESULT hr = EncodeTGAHeader(image, tga_header, convFlags); + uint32_t convFlags = 0; + HRESULT hr = EncodeTGAHeader(image, tga_header, convFlags); if (FAILED(hr)) return hr; // Create file and write header #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_WRITE, 0, CREATE_ALWAYS, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -2377,7 +2291,11 @@ HRESULT DirectX::SaveToTGAFile( // Determine size for TGA pixel data size_t rowPitch, slicePitch; - hr = ComputePitch(image.format, image.width, image.height, rowPitch, slicePitch, + hr = ComputePitch(image.format, + image.width, + image.height, + rowPitch, + slicePitch, (convFlags & CONV_FLAGS_888) ? CP_FLAGS_24BPP : CP_FLAGS_NONE); if (FAILED(hr)) return hr; @@ -2392,9 +2310,9 @@ HRESULT DirectX::SaveToTGAFile( return hr; // Write blob - #ifdef _WIN32 +#ifdef _WIN32 const DWORD bytesToWrite = static_cast(blob.GetBufferSize()); - DWORD bytesWritten; + DWORD bytesWritten; if (!WriteFile(hFile.get(), blob.GetConstBufferPointer(), bytesToWrite, &bytesWritten, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); @@ -2404,13 +2322,12 @@ HRESULT DirectX::SaveToTGAFile( { return E_FAIL; } - #else - outFile.write(reinterpret_cast(blob.GetConstBufferPointer()), - static_cast(blob.GetBufferSize())); +#else + outFile.write(reinterpret_cast(blob.GetConstBufferPointer()), static_cast(blob.GetBufferSize())); if (!outFile) return E_FAIL; - #endif +#endif } else { @@ -2420,7 +2337,7 @@ HRESULT DirectX::SaveToTGAFile( return E_OUTOFMEMORY; // Write header - #ifdef _WIN32 +#ifdef _WIN32 DWORD bytesWritten; if (!WriteFile(hFile.get(), &tga_header, TGA_HEADER_LEN, &bytesWritten, nullptr)) { @@ -2429,11 +2346,11 @@ HRESULT DirectX::SaveToTGAFile( if (bytesWritten != TGA_HEADER_LEN) return E_FAIL; - #else +#else outFile.write(reinterpret_cast(&tga_header), TGA_HEADER_LEN); if (!outFile) return E_FAIL; - #endif +#endif if (rowPitch > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; @@ -2459,7 +2376,7 @@ HRESULT DirectX::SaveToTGAFile( pPixels += image.rowPitch; - #ifdef _WIN32 +#ifdef _WIN32 if (!WriteFile(hFile.get(), temp.get(), static_cast(rowPitch), &bytesWritten, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); @@ -2467,11 +2384,11 @@ HRESULT DirectX::SaveToTGAFile( if (bytesWritten != rowPitch) return E_FAIL; - #else +#else outFile.write(reinterpret_cast(temp.get()), rowPitch); if (!outFile) return E_FAIL; - #endif +#endif } uint32_t extOffset = 0; @@ -2481,7 +2398,7 @@ HRESULT DirectX::SaveToTGAFile( TGA_EXTENSION ext = {}; SetExtension(&ext, flags, *metadata); - #ifdef _WIN32 +#ifdef _WIN32 extOffset = SetFilePointer(hFile.get(), 0, nullptr, FILE_CURRENT); if (extOffset == INVALID_SET_FILE_POINTER) { @@ -2495,7 +2412,7 @@ HRESULT DirectX::SaveToTGAFile( if (bytesWritten != sizeof(TGA_EXTENSION)) return E_FAIL; - #else +#else extOffset = static_cast(outFile.tellp()); if (!outFile) return E_FAIL; @@ -2503,15 +2420,15 @@ HRESULT DirectX::SaveToTGAFile( outFile.write(reinterpret_cast(&ext), sizeof(TGA_EXTENSION)); if (!outFile) return E_FAIL; - #endif +#endif } // Write TGA 2.0 footer - TGA_FOOTER footer = {}; + TGA_FOOTER footer = {}; footer.dwExtensionOffset = extOffset; memcpy(footer.Signature, g_Signature, sizeof(g_Signature)); - #ifdef _WIN32 +#ifdef _WIN32 if (!WriteFile(hFile.get(), &footer, sizeof(TGA_FOOTER), &bytesWritten, nullptr)) { return HRESULT_FROM_WIN32(GetLastError()); @@ -2519,11 +2436,11 @@ HRESULT DirectX::SaveToTGAFile( if (bytesWritten != sizeof(footer)) return E_FAIL; - #else +#else outFile.write(reinterpret_cast(&footer), sizeof(TGA_FOOTER)); if (!outFile) return E_FAIL; - #endif +#endif } #ifdef _WIN32 @@ -2533,7 +2450,6 @@ HRESULT DirectX::SaveToTGAFile( return S_OK; } - //-------------------------------------------------------------------------------------- // Adapters for /Zc:wchar_t- clients @@ -2541,30 +2457,26 @@ HRESULT DirectX::SaveToTGAFile( namespace DirectX { - HRESULT __cdecl GetMetadataFromTGAFile( - _In_z_ const __wchar_t* szFile, - _In_ TGA_FLAGS flags, - _Out_ TexMetadata& metadata) noexcept + HRESULT __cdecl GetMetadataFromTGAFile(_In_z_ const __wchar_t* szFile, _In_ TGA_FLAGS flags, _Out_ TexMetadata& metadata) noexcept { return GetMetadataFromTGAFile(reinterpret_cast(szFile), flags, metadata); } - HRESULT __cdecl LoadFromTGAFile( - _In_z_ const __wchar_t* szFile, - _In_ TGA_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) noexcept + HRESULT __cdecl LoadFromTGAFile(_In_z_ const __wchar_t* szFile, + _In_ TGA_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) noexcept { return LoadFromTGAFile(reinterpret_cast(szFile), flags, metadata, image); } HRESULT __cdecl SaveToTGAFile(_In_ const Image& image, - _In_ TGA_FLAGS flags, - _In_z_ const __wchar_t* szFile, - _In_opt_ const TexMetadata* metadata) noexcept + _In_ TGA_FLAGS flags, + _In_z_ const __wchar_t* szFile, + _In_opt_ const TexMetadata* metadata) noexcept { return SaveToTGAFile(image, flags, reinterpret_cast(szFile), metadata); } -} +} // namespace DirectX #endif // !_NATIVE_WCHAR_T_DEFINED diff --git a/DirectXTex/DirectXTexUtil.cpp b/DirectXTex/DirectXTexUtil.cpp index 277e7122..06274f9d 100644 --- a/DirectXTex/DirectXTexUtil.cpp +++ b/DirectXTex/DirectXTexUtil.cpp @@ -46,15 +46,15 @@ namespace DXGI_FORMAT format; bool srgb; - constexpr WICTranslate(const GUID& wg, DXGI_FORMAT fmt, bool isrgb) noexcept : - wic(wg), - format(fmt), - srgb(isrgb) + constexpr WICTranslate(const GUID& wg, DXGI_FORMAT fmt, bool isrgb) noexcept + : wic(wg), + format(fmt), + srgb(isrgb) {} }; - constexpr WICTranslate g_WICFormats[] = - { + constexpr WICTranslate g_WICFormats[] = { + // clang-format off { GUID_WICPixelFormat128bppRGBAFloat, DXGI_FORMAT_R32G32B32A32_FLOAT, false }, { GUID_WICPixelFormat64bppRGBAHalf, DXGI_FORMAT_R16G16B16A16_FLOAT, false }, @@ -78,20 +78,15 @@ namespace { GUID_WICPixelFormat8bppAlpha, DXGI_FORMAT_A8_UNORM, false }, { GUID_WICPixelFormatBlackWhite, DXGI_FORMAT_R1_UNORM, false }, + // clang-format on }; - bool g_WIC2 = false; + bool g_WIC2 = false; IWICImagingFactory* g_Factory = nullptr; - BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID *ifactory) noexcept + BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID* ifactory) noexcept { - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - ifactory - ); + HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory2, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory2), ifactory); if (SUCCEEDED(hr)) { @@ -103,19 +98,13 @@ namespace { g_WIC2 = false; - hr = CoCreateInstance( - CLSID_WICImagingFactory1, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory), - ifactory - ); + hr = CoCreateInstance(CLSID_WICImagingFactory1, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory), ifactory); return SUCCEEDED(hr) ? TRUE : FALSE; } } #else // !WIN32 - inline void * _aligned_malloc(size_t size, size_t alignment) + inline void* _aligned_malloc(size_t size, size_t alignment) { size = (size + alignment - 1) & ~(alignment - 1); return std::aligned_alloc(alignment, size); @@ -123,16 +112,14 @@ namespace #define _aligned_free free #endif -} - +} // namespace #ifdef _WIN32 //===================================================================================== // WIC Utilities //===================================================================================== -_Use_decl_annotations_ -DXGI_FORMAT DirectX::Internal::WICToDXGI(const GUID& guid) noexcept +_Use_decl_annotations_ DXGI_FORMAT DirectX::Internal::WICToDXGI(const GUID& guid) noexcept { for (size_t i = 0; i < std::size(g_WICFormats); ++i) { @@ -149,8 +136,7 @@ DXGI_FORMAT DirectX::Internal::WICToDXGI(const GUID& guid) noexcept return DXGI_FORMAT_UNKNOWN; } -_Use_decl_annotations_ -bool DirectX::Internal::DXGIToWIC(DXGI_FORMAT format, GUID& guid, bool ignoreRGBvsBGR) noexcept +_Use_decl_annotations_ bool DirectX::Internal::DXGIToWIC(DXGI_FORMAT format, GUID& guid, bool ignoreRGBvsBGR) noexcept { switch (format) { @@ -168,21 +154,13 @@ bool DirectX::Internal::DXGIToWIC(DXGI_FORMAT format, GUID& guid, bool ignoreRGB } return true; - case DXGI_FORMAT_D32_FLOAT: - memcpy(&guid, &GUID_WICPixelFormat32bppGrayFloat, sizeof(GUID)); - return true; + case DXGI_FORMAT_D32_FLOAT: memcpy(&guid, &GUID_WICPixelFormat32bppGrayFloat, sizeof(GUID)); return true; - case DXGI_FORMAT_D16_UNORM: - memcpy(&guid, &GUID_WICPixelFormat16bppGray, sizeof(GUID)); - return true; + case DXGI_FORMAT_D16_UNORM: memcpy(&guid, &GUID_WICPixelFormat16bppGray, sizeof(GUID)); return true; - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - memcpy(&guid, &GUID_WICPixelFormat32bppBGRA, sizeof(GUID)); - return true; + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: memcpy(&guid, &GUID_WICPixelFormat32bppBGRA, sizeof(GUID)); return true; - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - memcpy(&guid, &GUID_WICPixelFormat32bppBGR, sizeof(GUID)); - return true; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: memcpy(&guid, &GUID_WICPixelFormat32bppBGR, sizeof(GUID)); return true; case DXGI_FORMAT_R32G32B32_FLOAT: if (g_WIC2) @@ -235,48 +213,37 @@ TEX_FILTER_FLAGS DirectX::Internal::CheckWICColorSpace(_In_ const GUID& sourceGU return srgb; } - //------------------------------------------------------------------------------------- // Public helper function to get common WIC codec GUIDs //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -REFGUID DirectX::GetWICCodec(WICCodecs codec) noexcept +_Use_decl_annotations_ REFGUID DirectX::GetWICCodec(WICCodecs codec) noexcept { switch (codec) { - case WIC_CODEC_BMP: - return GUID_ContainerFormatBmp; + case WIC_CODEC_BMP: return GUID_ContainerFormatBmp; - case WIC_CODEC_JPEG: - return GUID_ContainerFormatJpeg; + case WIC_CODEC_JPEG: return GUID_ContainerFormatJpeg; - case WIC_CODEC_PNG: - return GUID_ContainerFormatPng; + case WIC_CODEC_PNG: return GUID_ContainerFormatPng; - case WIC_CODEC_TIFF: - return GUID_ContainerFormatTiff; + case WIC_CODEC_TIFF: return GUID_ContainerFormatTiff; - case WIC_CODEC_GIF: - return GUID_ContainerFormatGif; + case WIC_CODEC_GIF: return GUID_ContainerFormatGif; - case WIC_CODEC_WMP: - return GUID_ContainerFormatWmp; + case WIC_CODEC_WMP: return GUID_ContainerFormatWmp; - case WIC_CODEC_ICO: - return GUID_ContainerFormatIco; + case WIC_CODEC_ICO: return GUID_ContainerFormatIco; - #ifdef NTDDI_WIN10_RS4 +#ifdef NTDDI_WIN10_RS4 case WIC_CODEC_HEIF: // This requires installing https://aka.ms/heif return GUID_ContainerFormatHeif; - #endif +#endif - default: - return GUID_NULL; + default: return GUID_NULL; } } - //------------------------------------------------------------------------------------- // Singleton function for WIC factory //------------------------------------------------------------------------------------- @@ -290,10 +257,7 @@ IWICImagingFactory* DirectX::GetWICFactory(bool& iswic2) noexcept static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; - if (!InitOnceExecuteOnce(&s_initOnce, - InitializeWICFactory, - nullptr, - reinterpret_cast(&g_Factory))) + if (!InitOnceExecuteOnce(&s_initOnce, InitializeWICFactory, nullptr, reinterpret_cast(&g_Factory))) { return nullptr; } @@ -302,7 +266,6 @@ IWICImagingFactory* DirectX::GetWICFactory(bool& iswic2) noexcept return g_Factory; } - //------------------------------------------------------------------------------------- // Optional initializer for WIC factory //------------------------------------------------------------------------------------- @@ -315,7 +278,7 @@ void DirectX::SetWICFactory(_In_opt_ IWICImagingFactory* pWIC) noexcept if (pWIC) { ComPtr wic2; - HRESULT hr = pWIC->QueryInterface(IID_PPV_ARGS(wic2.GetAddressOf())); + HRESULT hr = pWIC->QueryInterface(IID_PPV_ARGS(wic2.GetAddressOf())); if (SUCCEEDED(hr)) { iswic2 = true; @@ -330,14 +293,12 @@ void DirectX::SetWICFactory(_In_opt_ IWICImagingFactory* pWIC) noexcept } #endif // WIN32 - //===================================================================================== // DXGI Format Utilities //===================================================================================== //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::IsPacked(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ bool DirectX::IsPacked(DXGI_FORMAT fmt) noexcept { switch (static_cast(fmt)) { @@ -348,15 +309,12 @@ bool DirectX::IsPacked(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_Y216: // 4:2:2 16-bit return true; - default: - return false; + default: return false; } } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::IsVideo(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ bool DirectX::IsVideo(DXGI_FORMAT fmt) noexcept { switch (static_cast(fmt)) { @@ -385,15 +343,12 @@ bool DirectX::IsVideo(DXGI_FORMAT fmt) noexcept // These video formats are for JPEG Hardware decode (DXGI 1.4) return true; - default: - return false; + default: return false; } } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::IsPlanar(DXGI_FORMAT fmt, bool isd3d12) noexcept +_Use_decl_annotations_ bool DirectX::IsPlanar(DXGI_FORMAT fmt, bool isd3d12) noexcept { switch (static_cast(fmt)) { @@ -404,19 +359,18 @@ bool DirectX::IsPlanar(DXGI_FORMAT fmt, bool isd3d12) noexcept case DXGI_FORMAT_R24G8_TYPELESS: case DXGI_FORMAT_D24_UNORM_S8_UINT: case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - return isd3d12; // Direct3D 12 considers these planar, Direct3D 11 does not. + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: return isd3d12; // Direct3D 12 considers these planar, Direct3D 11 does not. - case DXGI_FORMAT_NV12: // 4:2:0 8-bit - case DXGI_FORMAT_P010: // 4:2:0 10-bit - case DXGI_FORMAT_P016: // 4:2:0 16-bit - case DXGI_FORMAT_420_OPAQUE:// 4:2:0 8-bit - case DXGI_FORMAT_NV11: // 4:1:1 8-bit + case DXGI_FORMAT_NV12: // 4:2:0 8-bit + case DXGI_FORMAT_P010: // 4:2:0 10-bit + case DXGI_FORMAT_P016: // 4:2:0 16-bit + case DXGI_FORMAT_420_OPAQUE: // 4:2:0 8-bit + case DXGI_FORMAT_NV11: // 4:1:1 8-bit - case WIN10_DXGI_FORMAT_P208: // 4:2:2 8-bit - case WIN10_DXGI_FORMAT_V208: // 4:4:0 8-bit - case WIN10_DXGI_FORMAT_V408: // 4:4:4 8-bit - // These are JPEG Hardware decode formats (DXGI 1.4) + case WIN10_DXGI_FORMAT_P208: // 4:2:2 8-bit + case WIN10_DXGI_FORMAT_V208: // 4:4:0 8-bit + case WIN10_DXGI_FORMAT_V408: // 4:4:4 8-bit + // These are JPEG Hardware decode formats (DXGI 1.4) case XBOX_DXGI_FORMAT_D16_UNORM_S8_UINT: case XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS: @@ -424,15 +378,12 @@ bool DirectX::IsPlanar(DXGI_FORMAT fmt, bool isd3d12) noexcept // These are Xbox One platform specific types return true; - default: - return false; + default: return false; } } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::IsDepthStencil(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ bool DirectX::IsDepthStencil(DXGI_FORMAT fmt) noexcept { switch (static_cast(fmt)) { @@ -448,18 +399,14 @@ bool DirectX::IsDepthStencil(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_D16_UNORM: case XBOX_DXGI_FORMAT_D16_UNORM_S8_UINT: case XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS: - case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: - return true; + case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: return true; - default: - return false; + default: return false; } } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::IsBGR(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ bool DirectX::IsBGR(DXGI_FORMAT fmt) noexcept { switch (static_cast(fmt)) { @@ -472,18 +419,14 @@ bool DirectX::IsBGR(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_B8G8R8X8_TYPELESS: case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: case DXGI_FORMAT_B4G4R4A4_UNORM: - case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: - return true; + case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: return true; - default: - return false; + default: return false; } } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::IsTypeless(DXGI_FORMAT fmt, bool partialTypeless) noexcept +_Use_decl_annotations_ bool DirectX::IsTypeless(DXGI_FORMAT fmt, bool partialTypeless) noexcept { switch (static_cast(fmt)) { @@ -508,26 +451,21 @@ bool DirectX::IsTypeless(DXGI_FORMAT fmt, bool partialTypeless) noexcept case DXGI_FORMAT_B8G8R8A8_TYPELESS: case DXGI_FORMAT_B8G8R8X8_TYPELESS: case DXGI_FORMAT_BC6H_TYPELESS: - case DXGI_FORMAT_BC7_TYPELESS: - return true; + case DXGI_FORMAT_BC7_TYPELESS: return true; case DXGI_FORMAT_R32_FLOAT_X8X24_TYPELESS: case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: case DXGI_FORMAT_X24_TYPELESS_G8_UINT: case XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS: - case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: - return partialTypeless; + case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: return partialTypeless; - default: - return false; + default: return false; } } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -bool DirectX::HasAlpha(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ bool DirectX::HasAlpha(DXGI_FORMAT fmt) noexcept { switch (static_cast(fmt)) { @@ -578,34 +516,28 @@ bool DirectX::HasAlpha(DXGI_FORMAT fmt) noexcept case XBOX_DXGI_FORMAT_R10G10B10_7E3_A2_FLOAT: case XBOX_DXGI_FORMAT_R10G10B10_6E4_A2_FLOAT: case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: - case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: - return true; + case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: return true; - default: - return false; + default: return false; } } - //------------------------------------------------------------------------------------- // Returns bits-per-pixel for a given DXGI format, or 0 on failure //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -size_t DirectX::BitsPerPixel(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ size_t DirectX::BitsPerPixel(DXGI_FORMAT fmt) noexcept { switch (static_cast(fmt)) { case DXGI_FORMAT_R32G32B32A32_TYPELESS: case DXGI_FORMAT_R32G32B32A32_FLOAT: case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - return 128; + case DXGI_FORMAT_R32G32B32A32_SINT: return 128; case DXGI_FORMAT_R32G32B32_TYPELESS: case DXGI_FORMAT_R32G32B32_FLOAT: case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return 96; + case DXGI_FORMAT_R32G32B32_SINT: return 96; case DXGI_FORMAT_R16G16B16A16_TYPELESS: case DXGI_FORMAT_R16G16B16A16_FLOAT: @@ -623,8 +555,7 @@ size_t DirectX::BitsPerPixel(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: case DXGI_FORMAT_Y416: case DXGI_FORMAT_Y210: - case DXGI_FORMAT_Y216: - return 64; + case DXGI_FORMAT_Y216: return 64; case DXGI_FORMAT_R10G10B10A2_TYPELESS: case DXGI_FORMAT_R10G10B10A2_UNORM: @@ -666,16 +597,14 @@ size_t DirectX::BitsPerPixel(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_YUY2: case XBOX_DXGI_FORMAT_R10G10B10_7E3_A2_FLOAT: case XBOX_DXGI_FORMAT_R10G10B10_6E4_A2_FLOAT: - case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: - return 32; + case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: return 32; case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: case XBOX_DXGI_FORMAT_D16_UNORM_S8_UINT: case XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS: case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: - case WIN10_DXGI_FORMAT_V408: - return 24; + case WIN10_DXGI_FORMAT_V408: return 24; case DXGI_FORMAT_R8G8_TYPELESS: case DXGI_FORMAT_R8G8_UNORM: @@ -695,13 +624,11 @@ size_t DirectX::BitsPerPixel(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_B4G4R4A4_UNORM: case WIN10_DXGI_FORMAT_P208: case WIN10_DXGI_FORMAT_V208: - case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: - return 16; + case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: return 16; case DXGI_FORMAT_NV12: case DXGI_FORMAT_420_OPAQUE: - case DXGI_FORMAT_NV11: - return 12; + case DXGI_FORMAT_NV11: return 12; case DXGI_FORMAT_R8_TYPELESS: case DXGI_FORMAT_R8_UNORM: @@ -727,32 +654,26 @@ size_t DirectX::BitsPerPixel(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: case DXGI_FORMAT_P8: - case XBOX_DXGI_FORMAT_R4G4_UNORM: - return 8; + case XBOX_DXGI_FORMAT_R4G4_UNORM: return 8; - case DXGI_FORMAT_R1_UNORM: - return 1; + case DXGI_FORMAT_R1_UNORM: return 1; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - return 4; + case DXGI_FORMAT_BC4_SNORM: return 4; - default: - return 0; + default: return 0; } } - //------------------------------------------------------------------------------------- // Returns bits-per-color-channel for a given DXGI format, or 0 on failure // For mixed formats, it returns the largest color-depth in the format //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -size_t DirectX::BitsPerColor(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ size_t DirectX::BitsPerColor(DXGI_FORMAT fmt) noexcept { switch (static_cast(fmt)) { @@ -776,14 +697,12 @@ size_t DirectX::BitsPerColor(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_D32_FLOAT: case DXGI_FORMAT_R32_FLOAT: case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R32_SINT: - return 32; + case DXGI_FORMAT_R32_SINT: return 32; case DXGI_FORMAT_R24G8_TYPELESS: case DXGI_FORMAT_D24_UNORM_S8_UINT: case DXGI_FORMAT_R24_UNORM_X8_TYPELESS: - case DXGI_FORMAT_X24_TYPELESS_G8_UINT: - return 24; + case DXGI_FORMAT_X24_TYPELESS_G8_UINT: return 24; case DXGI_FORMAT_R16G16B16A16_TYPELESS: case DXGI_FORMAT_R16G16B16A16_FLOAT: @@ -812,14 +731,11 @@ size_t DirectX::BitsPerColor(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_Y216: case XBOX_DXGI_FORMAT_D16_UNORM_S8_UINT: case XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS: - case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: - return 16; + case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: return 16; - case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: - return 14; + case DXGI_FORMAT_R9G9B9E5_SHAREDEXP: return 14; - case DXGI_FORMAT_R11G11B10_FLOAT: - return 11; + case DXGI_FORMAT_R11G11B10_FLOAT: return 11; case DXGI_FORMAT_R10G10B10A2_TYPELESS: case DXGI_FORMAT_R10G10B10A2_UNORM: @@ -830,8 +746,7 @@ size_t DirectX::BitsPerColor(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_Y210: case XBOX_DXGI_FORMAT_R10G10B10_7E3_A2_FLOAT: case XBOX_DXGI_FORMAT_R10G10B10_6E4_A2_FLOAT: - case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: - return 10; + case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: return 10; case DXGI_FORMAT_R8G8B8A8_TYPELESS: case DXGI_FORMAT_R8G8B8A8_UNORM: @@ -871,13 +786,11 @@ size_t DirectX::BitsPerColor(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_NV11: case WIN10_DXGI_FORMAT_P208: case WIN10_DXGI_FORMAT_V208: - case WIN10_DXGI_FORMAT_V408: - return 8; + case WIN10_DXGI_FORMAT_V408: return 8; case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return 7; + case DXGI_FORMAT_BC7_UNORM_SRGB: return 7; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: @@ -888,19 +801,15 @@ size_t DirectX::BitsPerColor(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_BC3_TYPELESS: case DXGI_FORMAT_BC3_UNORM: case DXGI_FORMAT_BC3_UNORM_SRGB: - case DXGI_FORMAT_B5G6R5_UNORM: - return 6; + case DXGI_FORMAT_B5G6R5_UNORM: return 6; - case DXGI_FORMAT_B5G5R5A1_UNORM: - return 5; + case DXGI_FORMAT_B5G5R5A1_UNORM: return 5; case DXGI_FORMAT_B4G4R4A4_UNORM: case XBOX_DXGI_FORMAT_R4G4_UNORM: - case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: - return 4; + case WIN11_DXGI_FORMAT_A4B4G4R4_UNORM: return 4; - case DXGI_FORMAT_R1_UNORM: - return 1; + case DXGI_FORMAT_R1_UNORM: return 1; case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: @@ -908,17 +817,14 @@ size_t DirectX::BitsPerColor(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_A8P8: // Palettized formats return 0 for this function - default: - return 0; + default: return 0; } } - //------------------------------------------------------------------------------------- // Returns bytes per block for a given DXGI BC format, or 0 on failure //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -size_t DirectX::BytesPerBlock(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ size_t DirectX::BytesPerBlock(DXGI_FORMAT fmt) noexcept { switch (fmt) { @@ -927,8 +833,7 @@ size_t DirectX::BytesPerBlock(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - return 8; + case DXGI_FORMAT_BC4_SNORM: return 8; case DXGI_FORMAT_BC2_TYPELESS: case DXGI_FORMAT_BC2_UNORM: @@ -944,15 +849,12 @@ size_t DirectX::BytesPerBlock(DXGI_FORMAT fmt) noexcept case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return 16; + case DXGI_FORMAT_BC7_UNORM_SRGB: return 16; - default: - return 0; + default: return 0; } } - namespace { // Multiplies two 64-bit values, setting 'overflow' if the mathematical result is @@ -960,7 +862,7 @@ namespace // computations rather than at every individual site. inline uint64_t MulOverflow(uint64_t a, uint64_t b, bool& overflow) noexcept { - #if defined(__GNUC__) || defined(__clang__) +#if defined(__GNUC__) || defined(__clang__) uint64_t result = 0; if (__builtin_mul_overflow(a, b, &result)) { @@ -968,8 +870,8 @@ namespace return 0; } return result; - #elif defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC)) - const uint64_t high = __umulh(a, b); +#elif defined(_MSC_VER) && (defined(_M_ARM64) || defined(_M_ARM64EC)) + const uint64_t high = __umulh(a, b); const uint64_t result = a * b; if (high != 0) { @@ -977,8 +879,8 @@ namespace return 0; } return result; - #elif defined(_MSC_VER) && defined(_M_X64) - uint64_t high = 0; +#elif defined(_MSC_VER) && defined(_M_X64) + uint64_t high = 0; const uint64_t result = _umul128(a, b, &high); if (high != 0) { @@ -986,7 +888,7 @@ namespace return 0; } return result; - #else +#else const uint64_t result = a * b; if ((a != 0) && ((result / a) != b)) { @@ -994,26 +896,24 @@ namespace return 0; } return result; - #endif +#endif } -} +} // namespace //------------------------------------------------------------------------------------- // Computes the image row pitch in bytes, and the slice ptich (size in bytes of the image) // based on DXGI format, width, and height //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::ComputePitch(DXGI_FORMAT fmt, size_t width, size_t height, - size_t& rowPitch, size_t& slicePitch, CP_FLAGS flags) noexcept +_Use_decl_annotations_ HRESULT +DirectX::ComputePitch(DXGI_FORMAT fmt, size_t width, size_t height, size_t& rowPitch, size_t& slicePitch, CP_FLAGS flags) noexcept { - uint64_t pitch = 0; - uint64_t slice = 0; - bool overflow = false; + uint64_t pitch = 0; + uint64_t slice = 0; + bool overflow = false; switch (static_cast(fmt)) { - case DXGI_FORMAT_UNKNOWN: - return E_INVALIDARG; + case DXGI_FORMAT_UNKNOWN: return E_INVALIDARG; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: @@ -1027,15 +927,15 @@ HRESULT DirectX::ComputePitch(DXGI_FORMAT fmt, size_t width, size_t height, { const size_t nbw = width >> 2; const size_t nbh = height >> 2; - pitch = std::max(1u, MulOverflow(nbw, 8u, overflow)); - slice = std::max(1u, MulOverflow(pitch, nbh, overflow)); + pitch = std::max(1u, MulOverflow(nbw, 8u, overflow)); + slice = std::max(1u, MulOverflow(pitch, nbh, overflow)); } else { const uint64_t nbw = std::max(1u, (uint64_t(width) >> 2) + ((width & 3u) ? 1u : 0u)); const uint64_t nbh = std::max(1u, (uint64_t(height) >> 2) + ((height & 3u) ? 1u : 0u)); - pitch = MulOverflow(nbw, 8u, overflow); - slice = MulOverflow(pitch, nbh, overflow); + pitch = MulOverflow(nbw, 8u, overflow); + slice = MulOverflow(pitch, nbh, overflow); } } break; @@ -1061,15 +961,15 @@ HRESULT DirectX::ComputePitch(DXGI_FORMAT fmt, size_t width, size_t height, { const size_t nbw = width >> 2; const size_t nbh = height >> 2; - pitch = std::max(1u, MulOverflow(nbw, 16u, overflow)); - slice = std::max(1u, MulOverflow(pitch, nbh, overflow)); + pitch = std::max(1u, MulOverflow(nbw, 16u, overflow)); + slice = std::max(1u, MulOverflow(pitch, nbh, overflow)); } else { const uint64_t nbw = std::max(1u, (uint64_t(width) >> 2) + ((width & 3u) ? 1u : 0u)); const uint64_t nbh = std::max(1u, (uint64_t(height) >> 2) + ((height & 3u) ? 1u : 0u)); - pitch = MulOverflow(nbw, 16u, overflow); - slice = MulOverflow(pitch, nbh, overflow); + pitch = MulOverflow(nbw, 16u, overflow); + slice = MulOverflow(pitch, nbh, overflow); } } break; @@ -1109,13 +1009,13 @@ HRESULT DirectX::ComputePitch(DXGI_FORMAT fmt, size_t width, size_t height, return E_INVALIDARG; } - #if (__cplusplus >= 201703L) +#if (__cplusplus >= 201703L) [[fallthrough]]; - #elif defined(__clang__) +#elif defined(__clang__) [[clang::fallthrough]]; - #elif defined(_MSC_VER) +#elif defined(_MSC_VER) __fallthrough; - #endif +#endif case XBOX_DXGI_FORMAT_D16_UNORM_S8_UINT: case XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS: @@ -1231,21 +1131,18 @@ HRESULT DirectX::ComputePitch(DXGI_FORMAT fmt, size_t width, size_t height, static_assert(sizeof(size_t) == 8, "Not a 64-bit platform!"); #endif - rowPitch = static_cast(pitch); + rowPitch = static_cast(pitch); slicePitch = static_cast(slice); return S_OK; } - //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -size_t DirectX::ComputeScanlines(DXGI_FORMAT fmt, size_t height) noexcept +_Use_decl_annotations_ size_t DirectX::ComputeScanlines(DXGI_FORMAT fmt, size_t height) noexcept { switch (static_cast(fmt)) { - case DXGI_FORMAT_UNKNOWN: - return 0; + case DXGI_FORMAT_UNKNOWN: return 0; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: @@ -1267,22 +1164,14 @@ size_t DirectX::ComputeScanlines(DXGI_FORMAT fmt, size_t height) noexcept case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - assert(IsCompressed(fmt)); - return std::max(1, (height + 3) / 4); + case DXGI_FORMAT_BC7_UNORM_SRGB: assert(IsCompressed(fmt)); return std::max(1, (height + 3) / 4); case DXGI_FORMAT_NV11: - case WIN10_DXGI_FORMAT_P208: - assert(IsPlanar(fmt)); - return height * 2; + case WIN10_DXGI_FORMAT_P208: assert(IsPlanar(fmt)); return height * 2; - case WIN10_DXGI_FORMAT_V208: - assert(IsPlanar(fmt)); - return height + (((height + 1) >> 1) * 2); + case WIN10_DXGI_FORMAT_V208: assert(IsPlanar(fmt)); return height + (((height + 1) >> 1) * 2); - case WIN10_DXGI_FORMAT_V408: - assert(IsPlanar(fmt)); - return height + ((height >> 1) * 4); + case WIN10_DXGI_FORMAT_V408: assert(IsPlanar(fmt)); return height + ((height >> 1) * 4); case DXGI_FORMAT_NV12: case DXGI_FORMAT_P010: @@ -1290,9 +1179,7 @@ size_t DirectX::ComputeScanlines(DXGI_FORMAT fmt, size_t height) noexcept case DXGI_FORMAT_420_OPAQUE: case XBOX_DXGI_FORMAT_D16_UNORM_S8_UINT: case XBOX_DXGI_FORMAT_R16_UNORM_X8_TYPELESS: - case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: - assert(IsPlanar(fmt)); - return height + ((height + 1) >> 1); + case XBOX_DXGI_FORMAT_X16_TYPELESS_G8_UINT: assert(IsPlanar(fmt)); return height + ((height + 1) >> 1); default: assert(IsValid(fmt)); @@ -1301,7 +1188,6 @@ size_t DirectX::ComputeScanlines(DXGI_FORMAT fmt, size_t height) noexcept } } - //------------------------------------------------------------------------------------- // Compute standard tile shape for 64KB tiles //------------------------------------------------------------------------------------- @@ -1310,11 +1196,7 @@ namespace constexpr size_t TILED_RESOURCE_TILE_SIZE_IN_BYTES = 65536; } -_Use_decl_annotations_ -HRESULT DirectX::ComputeTileShape( - DXGI_FORMAT fmt, - TEX_DIMENSION dimension, - TileShape& tiling) noexcept +_Use_decl_annotations_ HRESULT DirectX::ComputeTileShape(DXGI_FORMAT fmt, TEX_DIMENSION dimension, TileShape& tiling) noexcept { tiling = {}; @@ -1333,7 +1215,7 @@ HRESULT DirectX::ComputeTileShape( if (iscompressed) return E_INVALIDARG; - tiling.width = (bpp) ? ((TILED_RESOURCE_TILE_SIZE_IN_BYTES * 8) / bpp) : TILED_RESOURCE_TILE_SIZE_IN_BYTES; + tiling.width = (bpp) ? ((TILED_RESOURCE_TILE_SIZE_IN_BYTES * 8) / bpp) : TILED_RESOURCE_TILE_SIZE_IN_BYTES; tiling.height = tiling.depth = 1; break; @@ -1345,16 +1227,13 @@ HRESULT DirectX::ComputeTileShape( switch (bpb) { case 8: - tiling.width = 128 * 4; + tiling.width = 128 * 4; tiling.height = 64 * 4; break; - case 16: - tiling.width = tiling.height = 64 * 4; - break; + case 16: tiling.width = tiling.height = 64 * 4; break; - default: - return E_INVALIDARG; + default: return E_INVALIDARG; } assert(((tiling.width / 4) * (tiling.height / 4) * bpb) == TILED_RESOURCE_TILE_SIZE_IN_BYTES); @@ -1367,7 +1246,7 @@ HRESULT DirectX::ComputeTileShape( } else if (bpp <= 16) { - tiling.width = 256; + tiling.width = 256; tiling.height = 128; } else if (bpp <= 32) @@ -1376,7 +1255,7 @@ HRESULT DirectX::ComputeTileShape( } else if (bpp <= 64) { - tiling.width = 128; + tiling.width = 128; tiling.height = 64; } else if (bpp <= 128) @@ -1400,18 +1279,17 @@ HRESULT DirectX::ComputeTileShape( switch (bpb) { case 8: - tiling.width = 32 * 4; + tiling.width = 32 * 4; tiling.height = 16 * 4; - tiling.depth = 16; + tiling.depth = 16; break; case 16: tiling.width = tiling.height = 16 * 4; - tiling.depth = 16; + tiling.depth = 16; break; - default: - return E_INVALIDARG; + default: return E_INVALIDARG; } assert(((tiling.width / 4) * (tiling.height / 4) * tiling.depth * bpb) == TILED_RESOURCE_TILE_SIZE_IN_BYTES); @@ -1420,7 +1298,7 @@ HRESULT DirectX::ComputeTileShape( { if (bpp <= 8) { - tiling.width = 64; + tiling.width = 64; tiling.height = tiling.depth = 32; } else if (bpp <= 16) @@ -1430,11 +1308,11 @@ HRESULT DirectX::ComputeTileShape( else if (bpp <= 32) { tiling.width = tiling.height = 32; - tiling.depth = 16; + tiling.depth = 16; } else if (bpp <= 64) { - tiling.width = 32; + tiling.width = 32; tiling.height = tiling.depth = 16; } else if (bpp <= 128) @@ -1451,298 +1329,225 @@ HRESULT DirectX::ComputeTileShape( } break; - default: - return E_INVALIDARG; + default: return E_INVALIDARG; } return S_OK; } - //------------------------------------------------------------------------------------- // Converts to an SRGB equivalent type if available //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -DXGI_FORMAT DirectX::MakeSRGB(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ DXGI_FORMAT DirectX::MakeSRGB(DXGI_FORMAT fmt) noexcept { switch (fmt) { - case DXGI_FORMAT_R8G8B8A8_UNORM: - return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + case DXGI_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - case DXGI_FORMAT_BC1_UNORM: - return DXGI_FORMAT_BC1_UNORM_SRGB; + case DXGI_FORMAT_BC1_UNORM: return DXGI_FORMAT_BC1_UNORM_SRGB; - case DXGI_FORMAT_BC2_UNORM: - return DXGI_FORMAT_BC2_UNORM_SRGB; + case DXGI_FORMAT_BC2_UNORM: return DXGI_FORMAT_BC2_UNORM_SRGB; - case DXGI_FORMAT_BC3_UNORM: - return DXGI_FORMAT_BC3_UNORM_SRGB; + case DXGI_FORMAT_BC3_UNORM: return DXGI_FORMAT_BC3_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8A8_UNORM: - return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8X8_UNORM: - return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8X8_UNORM: return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; - case DXGI_FORMAT_BC7_UNORM: - return DXGI_FORMAT_BC7_UNORM_SRGB; + case DXGI_FORMAT_BC7_UNORM: return DXGI_FORMAT_BC7_UNORM_SRGB; - default: - return fmt; + default: return fmt; } } - //------------------------------------------------------------------------------------- // Converts to an non-SRGB equivalent type //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -DXGI_FORMAT DirectX::MakeLinear(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ DXGI_FORMAT DirectX::MakeLinear(DXGI_FORMAT fmt) noexcept { switch (fmt) { - case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: - return DXGI_FORMAT_R8G8B8A8_UNORM; + case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: return DXGI_FORMAT_R8G8B8A8_UNORM; - case DXGI_FORMAT_BC1_UNORM_SRGB: - return DXGI_FORMAT_BC1_UNORM; + case DXGI_FORMAT_BC1_UNORM_SRGB: return DXGI_FORMAT_BC1_UNORM; - case DXGI_FORMAT_BC2_UNORM_SRGB: - return DXGI_FORMAT_BC2_UNORM; + case DXGI_FORMAT_BC2_UNORM_SRGB: return DXGI_FORMAT_BC2_UNORM; - case DXGI_FORMAT_BC3_UNORM_SRGB: - return DXGI_FORMAT_BC3_UNORM; + case DXGI_FORMAT_BC3_UNORM_SRGB: return DXGI_FORMAT_BC3_UNORM; - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - return DXGI_FORMAT_B8G8R8A8_UNORM; + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8A8_UNORM; - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - return DXGI_FORMAT_B8G8R8X8_UNORM; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8X8_UNORM; - case DXGI_FORMAT_BC7_UNORM_SRGB: - return DXGI_FORMAT_BC7_UNORM; + case DXGI_FORMAT_BC7_UNORM_SRGB: return DXGI_FORMAT_BC7_UNORM; - default: - return fmt; + default: return fmt; } } - //------------------------------------------------------------------------------------- // Converts to a format to an equivalent TYPELESS format if available //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -DXGI_FORMAT DirectX::MakeTypeless(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ DXGI_FORMAT DirectX::MakeTypeless(DXGI_FORMAT fmt) noexcept { switch (static_cast(fmt)) { case DXGI_FORMAT_R32G32B32A32_FLOAT: case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - return DXGI_FORMAT_R32G32B32A32_TYPELESS; + case DXGI_FORMAT_R32G32B32A32_SINT: return DXGI_FORMAT_R32G32B32A32_TYPELESS; case DXGI_FORMAT_R32G32B32_FLOAT: case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return DXGI_FORMAT_R32G32B32_TYPELESS; + case DXGI_FORMAT_R32G32B32_SINT: return DXGI_FORMAT_R32G32B32_TYPELESS; case DXGI_FORMAT_R16G16B16A16_FLOAT: case DXGI_FORMAT_R16G16B16A16_UNORM: case DXGI_FORMAT_R16G16B16A16_UINT: case DXGI_FORMAT_R16G16B16A16_SNORM: - case DXGI_FORMAT_R16G16B16A16_SINT: - return DXGI_FORMAT_R16G16B16A16_TYPELESS; + case DXGI_FORMAT_R16G16B16A16_SINT: return DXGI_FORMAT_R16G16B16A16_TYPELESS; case DXGI_FORMAT_R32G32_FLOAT: case DXGI_FORMAT_R32G32_UINT: - case DXGI_FORMAT_R32G32_SINT: - return DXGI_FORMAT_R32G32_TYPELESS; + case DXGI_FORMAT_R32G32_SINT: return DXGI_FORMAT_R32G32_TYPELESS; case DXGI_FORMAT_R10G10B10A2_UNORM: case DXGI_FORMAT_R10G10B10A2_UINT: case XBOX_DXGI_FORMAT_R10G10B10_7E3_A2_FLOAT: case XBOX_DXGI_FORMAT_R10G10B10_6E4_A2_FLOAT: - case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: - return DXGI_FORMAT_R10G10B10A2_TYPELESS; + case XBOX_DXGI_FORMAT_R10G10B10_SNORM_A2_UNORM: return DXGI_FORMAT_R10G10B10A2_TYPELESS; case DXGI_FORMAT_R8G8B8A8_UNORM: case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: case DXGI_FORMAT_R8G8B8A8_UINT: case DXGI_FORMAT_R8G8B8A8_SNORM: - case DXGI_FORMAT_R8G8B8A8_SINT: - return DXGI_FORMAT_R8G8B8A8_TYPELESS; + case DXGI_FORMAT_R8G8B8A8_SINT: return DXGI_FORMAT_R8G8B8A8_TYPELESS; case DXGI_FORMAT_R16G16_FLOAT: case DXGI_FORMAT_R16G16_UNORM: case DXGI_FORMAT_R16G16_UINT: case DXGI_FORMAT_R16G16_SNORM: - case DXGI_FORMAT_R16G16_SINT: - return DXGI_FORMAT_R16G16_TYPELESS; + case DXGI_FORMAT_R16G16_SINT: return DXGI_FORMAT_R16G16_TYPELESS; case DXGI_FORMAT_D32_FLOAT: case DXGI_FORMAT_R32_FLOAT: case DXGI_FORMAT_R32_UINT: - case DXGI_FORMAT_R32_SINT: - return DXGI_FORMAT_R32_TYPELESS; + case DXGI_FORMAT_R32_SINT: return DXGI_FORMAT_R32_TYPELESS; case DXGI_FORMAT_R8G8_UNORM: case DXGI_FORMAT_R8G8_UINT: case DXGI_FORMAT_R8G8_SNORM: - case DXGI_FORMAT_R8G8_SINT: - return DXGI_FORMAT_R8G8_TYPELESS; + case DXGI_FORMAT_R8G8_SINT: return DXGI_FORMAT_R8G8_TYPELESS; case DXGI_FORMAT_R16_FLOAT: case DXGI_FORMAT_D16_UNORM: case DXGI_FORMAT_R16_UNORM: case DXGI_FORMAT_R16_UINT: case DXGI_FORMAT_R16_SNORM: - case DXGI_FORMAT_R16_SINT: - return DXGI_FORMAT_R16_TYPELESS; + case DXGI_FORMAT_R16_SINT: return DXGI_FORMAT_R16_TYPELESS; case DXGI_FORMAT_R8_UNORM: case DXGI_FORMAT_R8_UINT: case DXGI_FORMAT_R8_SNORM: case DXGI_FORMAT_R8_SINT: - case XBOX_DXGI_FORMAT_R4G4_UNORM: - return DXGI_FORMAT_R8_TYPELESS; + case XBOX_DXGI_FORMAT_R4G4_UNORM: return DXGI_FORMAT_R8_TYPELESS; case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: - return DXGI_FORMAT_BC1_TYPELESS; + case DXGI_FORMAT_BC1_UNORM_SRGB: return DXGI_FORMAT_BC1_TYPELESS; case DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT_BC2_UNORM_SRGB: - return DXGI_FORMAT_BC2_TYPELESS; + case DXGI_FORMAT_BC2_UNORM_SRGB: return DXGI_FORMAT_BC2_TYPELESS; case DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT_BC3_UNORM_SRGB: - return DXGI_FORMAT_BC3_TYPELESS; + case DXGI_FORMAT_BC3_UNORM_SRGB: return DXGI_FORMAT_BC3_TYPELESS; case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - return DXGI_FORMAT_BC4_TYPELESS; + case DXGI_FORMAT_BC4_SNORM: return DXGI_FORMAT_BC4_TYPELESS; case DXGI_FORMAT_BC5_UNORM: - case DXGI_FORMAT_BC5_SNORM: - return DXGI_FORMAT_BC5_TYPELESS; + case DXGI_FORMAT_BC5_SNORM: return DXGI_FORMAT_BC5_TYPELESS; case DXGI_FORMAT_B8G8R8A8_UNORM: - case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - return DXGI_FORMAT_B8G8R8A8_TYPELESS; + case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8A8_TYPELESS; case DXGI_FORMAT_B8G8R8X8_UNORM: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - return DXGI_FORMAT_B8G8R8X8_TYPELESS; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: return DXGI_FORMAT_B8G8R8X8_TYPELESS; case DXGI_FORMAT_BC6H_UF16: - case DXGI_FORMAT_BC6H_SF16: - return DXGI_FORMAT_BC6H_TYPELESS; + case DXGI_FORMAT_BC6H_SF16: return DXGI_FORMAT_BC6H_TYPELESS; case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return DXGI_FORMAT_BC7_TYPELESS; + case DXGI_FORMAT_BC7_UNORM_SRGB: return DXGI_FORMAT_BC7_TYPELESS; - default: - return fmt; + default: return fmt; } } - //------------------------------------------------------------------------------------- // Converts to a TYPELESS format to an equivalent UNORM format if available //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -DXGI_FORMAT DirectX::MakeTypelessUNORM(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ DXGI_FORMAT DirectX::MakeTypelessUNORM(DXGI_FORMAT fmt) noexcept { switch (fmt) { - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - return DXGI_FORMAT_R16G16B16A16_UNORM; + case DXGI_FORMAT_R16G16B16A16_TYPELESS: return DXGI_FORMAT_R16G16B16A16_UNORM; - case DXGI_FORMAT_R10G10B10A2_TYPELESS: - return DXGI_FORMAT_R10G10B10A2_UNORM; + case DXGI_FORMAT_R10G10B10A2_TYPELESS: return DXGI_FORMAT_R10G10B10A2_UNORM; - case DXGI_FORMAT_R8G8B8A8_TYPELESS: - return DXGI_FORMAT_R8G8B8A8_UNORM; + case DXGI_FORMAT_R8G8B8A8_TYPELESS: return DXGI_FORMAT_R8G8B8A8_UNORM; - case DXGI_FORMAT_R16G16_TYPELESS: - return DXGI_FORMAT_R16G16_UNORM; + case DXGI_FORMAT_R16G16_TYPELESS: return DXGI_FORMAT_R16G16_UNORM; - case DXGI_FORMAT_R8G8_TYPELESS: - return DXGI_FORMAT_R8G8_UNORM; + case DXGI_FORMAT_R8G8_TYPELESS: return DXGI_FORMAT_R8G8_UNORM; - case DXGI_FORMAT_R16_TYPELESS: - return DXGI_FORMAT_R16_UNORM; + case DXGI_FORMAT_R16_TYPELESS: return DXGI_FORMAT_R16_UNORM; - case DXGI_FORMAT_R8_TYPELESS: - return DXGI_FORMAT_R8_UNORM; + case DXGI_FORMAT_R8_TYPELESS: return DXGI_FORMAT_R8_UNORM; - case DXGI_FORMAT_BC1_TYPELESS: - return DXGI_FORMAT_BC1_UNORM; + case DXGI_FORMAT_BC1_TYPELESS: return DXGI_FORMAT_BC1_UNORM; - case DXGI_FORMAT_BC2_TYPELESS: - return DXGI_FORMAT_BC2_UNORM; + case DXGI_FORMAT_BC2_TYPELESS: return DXGI_FORMAT_BC2_UNORM; - case DXGI_FORMAT_BC3_TYPELESS: - return DXGI_FORMAT_BC3_UNORM; + case DXGI_FORMAT_BC3_TYPELESS: return DXGI_FORMAT_BC3_UNORM; - case DXGI_FORMAT_BC4_TYPELESS: - return DXGI_FORMAT_BC4_UNORM; + case DXGI_FORMAT_BC4_TYPELESS: return DXGI_FORMAT_BC4_UNORM; - case DXGI_FORMAT_BC5_TYPELESS: - return DXGI_FORMAT_BC5_UNORM; + case DXGI_FORMAT_BC5_TYPELESS: return DXGI_FORMAT_BC5_UNORM; - case DXGI_FORMAT_B8G8R8A8_TYPELESS: - return DXGI_FORMAT_B8G8R8A8_UNORM; + case DXGI_FORMAT_B8G8R8A8_TYPELESS: return DXGI_FORMAT_B8G8R8A8_UNORM; - case DXGI_FORMAT_B8G8R8X8_TYPELESS: - return DXGI_FORMAT_B8G8R8X8_UNORM; + case DXGI_FORMAT_B8G8R8X8_TYPELESS: return DXGI_FORMAT_B8G8R8X8_UNORM; - case DXGI_FORMAT_BC7_TYPELESS: - return DXGI_FORMAT_BC7_UNORM; + case DXGI_FORMAT_BC7_TYPELESS: return DXGI_FORMAT_BC7_UNORM; - default: - return fmt; + default: return fmt; } } - //------------------------------------------------------------------------------------- // Converts to a TYPELESS format to an equivalent FLOAT format if available //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -DXGI_FORMAT DirectX::MakeTypelessFLOAT(DXGI_FORMAT fmt) noexcept +_Use_decl_annotations_ DXGI_FORMAT DirectX::MakeTypelessFLOAT(DXGI_FORMAT fmt) noexcept { switch (fmt) { - case DXGI_FORMAT_R32G32B32A32_TYPELESS: - return DXGI_FORMAT_R32G32B32A32_FLOAT; + case DXGI_FORMAT_R32G32B32A32_TYPELESS: return DXGI_FORMAT_R32G32B32A32_FLOAT; - case DXGI_FORMAT_R32G32B32_TYPELESS: - return DXGI_FORMAT_R32G32B32_FLOAT; + case DXGI_FORMAT_R32G32B32_TYPELESS: return DXGI_FORMAT_R32G32B32_FLOAT; - case DXGI_FORMAT_R16G16B16A16_TYPELESS: - return DXGI_FORMAT_R16G16B16A16_FLOAT; + case DXGI_FORMAT_R16G16B16A16_TYPELESS: return DXGI_FORMAT_R16G16B16A16_FLOAT; - case DXGI_FORMAT_R32G32_TYPELESS: - return DXGI_FORMAT_R32G32_FLOAT; + case DXGI_FORMAT_R32G32_TYPELESS: return DXGI_FORMAT_R32G32_FLOAT; - case DXGI_FORMAT_R16G16_TYPELESS: - return DXGI_FORMAT_R16G16_FLOAT; + case DXGI_FORMAT_R16G16_TYPELESS: return DXGI_FORMAT_R16G16_FLOAT; - case DXGI_FORMAT_R32_TYPELESS: - return DXGI_FORMAT_R32_FLOAT; + case DXGI_FORMAT_R32_TYPELESS: return DXGI_FORMAT_R32_FLOAT; - case DXGI_FORMAT_R16_TYPELESS: - return DXGI_FORMAT_R16_FLOAT; + case DXGI_FORMAT_R16_TYPELESS: return DXGI_FORMAT_R16_FLOAT; - default: - return fmt; + default: return fmt; } } - //===================================================================================== // TexMetadata //===================================================================================== @@ -1762,7 +1567,7 @@ size_t TexMetadata::ComputeIndex(size_t mip, size_t item, size_t slice) const no if (item >= arraySize) return size_t(-1); - return (item*(mipLevels)+mip); + return (item * (mipLevels) + mip); case TEX_DIMENSION_TEXTURE3D: if (item > 0) @@ -1773,7 +1578,7 @@ size_t TexMetadata::ComputeIndex(size_t mip, size_t item, size_t slice) const no else { size_t index = 0; - size_t d = depth; + size_t d = depth; for (size_t level = 0; level < mip; ++level) { @@ -1790,8 +1595,7 @@ size_t TexMetadata::ComputeIndex(size_t mip, size_t item, size_t slice) const no return index; } - default: - return size_t(-1); + default: return size_t(-1); } } @@ -1808,7 +1612,7 @@ uint32_t TexMetadata::CalculateSubresource(size_t mip, size_t item) const noexce case TEX_DIMENSION_TEXTURE2D: if (item < arraySize) { - return static_cast(mip + item*mipLevels); + return static_cast(mip + item * mipLevels); } break; @@ -1820,8 +1624,7 @@ uint32_t TexMetadata::CalculateSubresource(size_t mip, size_t item) const noexce } break; - default: - break; + default: break; } } @@ -1841,7 +1644,7 @@ uint32_t TexMetadata::CalculateSubresource(size_t mip, size_t item, size_t plane case TEX_DIMENSION_TEXTURE2D: if (item < arraySize) { - return static_cast(mip + item*mipLevels + plane*mipLevels*arraySize); + return static_cast(mip + item * mipLevels + plane * mipLevels * arraySize); } break; @@ -1849,34 +1652,32 @@ uint32_t TexMetadata::CalculateSubresource(size_t mip, size_t item, size_t plane // No support for arrays of volumes if (item == 0) { - result = static_cast(mip + plane*mipLevels); + result = static_cast(mip + plane * mipLevels); } break; - default: - break; + default: break; } } return result; } - //===================================================================================== // Blob - Bitmap image container //===================================================================================== -Blob& Blob::operator= (Blob&& moveFrom) noexcept +Blob& Blob::operator=(Blob&& moveFrom) noexcept { if (this != &moveFrom) { Release(); m_buffer = moveFrom.m_buffer; - m_size = moveFrom.m_size; + m_size = moveFrom.m_size; moveFrom.m_buffer = nullptr; - moveFrom.m_size = 0; + moveFrom.m_size = 0; } return *this; } @@ -1892,8 +1693,7 @@ void Blob::Release() noexcept m_size = 0; } -_Use_decl_annotations_ -HRESULT Blob::Initialize(size_t size) noexcept +_Use_decl_annotations_ HRESULT Blob::Initialize(size_t size) noexcept { if (!size) return E_INVALIDARG; @@ -1945,7 +1745,7 @@ HRESULT Blob::Resize(size_t size) noexcept Release(); m_buffer = tbuffer; - m_size = size; + m_size = size; return S_OK; } diff --git a/DirectXTex/DirectXTexWIC.cpp b/DirectXTex/DirectXTexWIC.cpp index 54e90eb0..2bb6fc37 100644 --- a/DirectXTex/DirectXTexWIC.cpp +++ b/DirectXTex/DirectXTexWIC.cpp @@ -22,22 +22,22 @@ namespace //------------------------------------------------------------------------------------- struct WICConvert { - const GUID& source; - const GUID& target; - TEX_ALPHA_MODE alphaMode; - - constexpr WICConvert(const GUID& src, const GUID& tgt, TEX_ALPHA_MODE mode) noexcept : - source(src), - target(tgt), - alphaMode(mode) + const GUID& source; + const GUID& target; + TEX_ALPHA_MODE alphaMode; + + constexpr WICConvert(const GUID& src, const GUID& tgt, TEX_ALPHA_MODE mode) noexcept + : source(src), + target(tgt), + alphaMode(mode) {} }; - constexpr WICConvert g_WICConvert[] = - { + constexpr WICConvert g_WICConvert[] = { // Directly support the formats listed in XnaTexUtil::g_WICFormats, so no conversion required // Note target GUID in this conversion table must be one of those directly supported formats. + // clang-format off { GUID_WICPixelFormat1bppIndexed, GUID_WICPixelFormat32bppRGBA, TEX_ALPHA_MODE_UNKNOWN }, // DXGI_FORMAT_R8G8B8A8_UNORM { GUID_WICPixelFormat2bppIndexed, GUID_WICPixelFormat32bppRGBA, TEX_ALPHA_MODE_UNKNOWN }, // DXGI_FORMAT_R8G8B8A8_UNORM { GUID_WICPixelFormat4bppIndexed, GUID_WICPixelFormat32bppRGBA, TEX_ALPHA_MODE_UNKNOWN }, // DXGI_FORMAT_R8G8B8A8_UNORM @@ -87,17 +87,17 @@ namespace { GUID_WICPixelFormat64bppPRGBAHalf, GUID_WICPixelFormat64bppRGBAHalf, TEX_ALPHA_MODE_UNKNOWN }, // DXGI_FORMAT_R16G16B16A16_FLOAT // We don't support n-channel formats + // clang-format on }; //------------------------------------------------------------------------------------- // Returns the DXGI format and optionally the WIC pixel GUID to convert to //------------------------------------------------------------------------------------- - DXGI_FORMAT DetermineFormat( - _In_ const WICPixelFormatGUID& pixelFormat, - WIC_FLAGS flags, - bool iswic2, - _Out_opt_ WICPixelFormatGUID* pConvert, - _Out_ TEX_ALPHA_MODE* alphaMode) noexcept + DXGI_FORMAT DetermineFormat(_In_ const WICPixelFormatGUID& pixelFormat, + WIC_FLAGS flags, + bool iswic2, + _Out_opt_ WICPixelFormatGUID* pConvert, + _Out_ TEX_ALPHA_MODE* alphaMode) noexcept { if (pConvert) memset(pConvert, 0, sizeof(WICPixelFormatGUID)); @@ -120,7 +120,7 @@ namespace { if (pConvert) memcpy_s(pConvert, sizeof(WICPixelFormatGUID), &GUID_WICPixelFormat128bppRGBAFloat, sizeof(GUID)); - format = DXGI_FORMAT_R32G32B32A32_FLOAT; + format = DXGI_FORMAT_R32G32B32A32_FLOAT; *alphaMode = TEX_ALPHA_MODE_OPAQUE; } } @@ -145,8 +145,8 @@ namespace // Handle special cases based on flags switch (format) { - case DXGI_FORMAT_B8G8R8A8_UNORM: // BGRA - case DXGI_FORMAT_B8G8R8X8_UNORM: // BGRX + case DXGI_FORMAT_B8G8R8A8_UNORM: // BGRA + case DXGI_FORMAT_B8G8R8X8_UNORM: // BGRX if (flags & WIC_FLAGS_FORCE_RGB) { format = DXGI_FORMAT_R8G8B8A8_UNORM; @@ -184,24 +184,22 @@ namespace } break; - default: - break; + default: break; } return format; } - //------------------------------------------------------------------------------------- // IStream over a Blob for WIC in-memory write functions //------------------------------------------------------------------------------------- class MemoryStreamOnBlob : public IStream { - MemoryStreamOnBlob(Blob& blob) noexcept : - mBlob(blob), - m_streamPosition(0), - m_streamEOF(0), - mRefCount(1) + MemoryStreamOnBlob(Blob& blob) noexcept + : mBlob(blob), + m_streamPosition(0), + m_streamEOF(0), + mRefCount(1) { assert(mBlob.GetConstBufferPointer() && mBlob.GetBufferSize() > 0); } @@ -209,18 +207,16 @@ namespace public: virtual ~MemoryStreamOnBlob() = default; - MemoryStreamOnBlob(MemoryStreamOnBlob&&) = delete; - MemoryStreamOnBlob& operator= (MemoryStreamOnBlob&&) = delete; + MemoryStreamOnBlob(MemoryStreamOnBlob&&) = delete; + MemoryStreamOnBlob& operator=(MemoryStreamOnBlob&&) = delete; - MemoryStreamOnBlob(MemoryStreamOnBlob const&) = delete; - MemoryStreamOnBlob& operator= (MemoryStreamOnBlob const&) = delete; + MemoryStreamOnBlob(MemoryStreamOnBlob const&) = delete; + MemoryStreamOnBlob& operator=(MemoryStreamOnBlob const&) = delete; // IUnknown HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, void** ppvObject) override { - if (iid == __uuidof(IUnknown) - || iid == __uuidof(IStream) - || iid == __uuidof(ISequentialStream)) + if (iid == __uuidof(IUnknown) || iid == __uuidof(IStream) || iid == __uuidof(ISequentialStream)) { *ppvObject = static_cast(this); AddRef(); @@ -230,10 +226,7 @@ namespace return E_NOINTERFACE; } - ULONG STDMETHODCALLTYPE AddRef() override - { - return InterlockedIncrement(&mRefCount); - } + ULONG STDMETHODCALLTYPE AddRef() override { return InterlockedIncrement(&mRefCount); } ULONG STDMETHODCALLTYPE Release() override { @@ -249,7 +242,7 @@ namespace HRESULT STDMETHODCALLTYPE Read(void* pv, ULONG cb, ULONG* pcbRead) override { size_t maxRead = m_streamEOF - m_streamPosition; - auto ptr = mBlob.GetBufferPointer(); + auto ptr = mBlob.GetBufferPointer(); if (cb > maxRead) { const uint64_t pos = uint64_t(m_streamPosition) + uint64_t(maxRead); @@ -286,9 +279,9 @@ namespace HRESULT STDMETHODCALLTYPE Write(void const* pv, ULONG cb, ULONG* pcbWritten) override { - const size_t blobSize = mBlob.GetBufferSize(); + const size_t blobSize = mBlob.GetBufferSize(); const size_t spaceAvailable = blobSize - m_streamPosition; - size_t growAmount = cb; + size_t growAmount = cb; if (spaceAvailable > 0) { @@ -304,9 +297,9 @@ namespace if (growAmount > 0) { - uint64_t newSize = uint64_t(blobSize); + uint64_t newSize = uint64_t(blobSize); const uint64_t targetSize = uint64_t(blobSize) + growAmount; - HRESULT hr = ComputeGrowSize(newSize, targetSize); + HRESULT hr = ComputeGrowSize(newSize, targetSize); if (FAILED(hr)) return hr; @@ -323,7 +316,7 @@ namespace memcpy(&ptr[m_streamPosition], pv, cb); m_streamPosition = static_cast(pos); - m_streamEOF = std::max(m_streamEOF, m_streamPosition); + m_streamEOF = std::max(m_streamEOF, m_streamPosition); if (pcbWritten) { @@ -352,9 +345,9 @@ namespace } else { - uint64_t newSize = uint64_t(blobSize); + uint64_t newSize = uint64_t(blobSize); const uint64_t targetSize = uint64_t(size.QuadPart); - HRESULT hr = ComputeGrowSize(newSize, targetSize); + HRESULT hr = ComputeGrowSize(newSize, targetSize); if (FAILED(hr)) return hr; @@ -379,35 +372,17 @@ namespace return S_OK; } - HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*) override - { - return E_NOTIMPL; - } + HRESULT STDMETHODCALLTYPE CopyTo(IStream*, ULARGE_INTEGER, ULARGE_INTEGER*, ULARGE_INTEGER*) override { return E_NOTIMPL; } - HRESULT STDMETHODCALLTYPE Commit(DWORD) override - { - return E_NOTIMPL; - } + HRESULT STDMETHODCALLTYPE Commit(DWORD) override { return E_NOTIMPL; } - HRESULT STDMETHODCALLTYPE Revert() override - { - return E_NOTIMPL; - } + HRESULT STDMETHODCALLTYPE Revert() override { return E_NOTIMPL; } - HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) override - { - return E_NOTIMPL; - } + HRESULT STDMETHODCALLTYPE LockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) override { return E_NOTIMPL; } - HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) override - { - return E_NOTIMPL; - } + HRESULT STDMETHODCALLTYPE UnlockRegion(ULARGE_INTEGER, ULARGE_INTEGER, DWORD) override { return E_NOTIMPL; } - HRESULT STDMETHODCALLTYPE Clone(IStream**) override - { - return E_NOTIMPL; - } + HRESULT STDMETHODCALLTYPE Clone(IStream**) override { return E_NOTIMPL; } HRESULT STDMETHODCALLTYPE Seek(LARGE_INTEGER liDistanceToMove, DWORD dwOrigin, ULARGE_INTEGER* lpNewFilePointer) override { @@ -415,20 +390,13 @@ namespace switch (dwOrigin) { - case STREAM_SEEK_SET: - newPosition = liDistanceToMove.QuadPart; - break; + case STREAM_SEEK_SET: newPosition = liDistanceToMove.QuadPart; break; - case STREAM_SEEK_CUR: - newPosition = static_cast(m_streamPosition) + liDistanceToMove.QuadPart; - break; + case STREAM_SEEK_CUR: newPosition = static_cast(m_streamPosition) + liDistanceToMove.QuadPart; break; - case STREAM_SEEK_END: - newPosition = static_cast(m_streamEOF) + liDistanceToMove.QuadPart; - break; + case STREAM_SEEK_END: newPosition = static_cast(m_streamEOF) + liDistanceToMove.QuadPart; break; - default: - return STG_E_INVALIDFUNCTION; + default: return STG_E_INVALIDFUNCTION; } HRESULT result = S_OK; @@ -436,12 +404,12 @@ namespace if (newPosition > static_cast(m_streamEOF)) { m_streamPosition = m_streamEOF; - result = E_BOUNDS; + result = E_BOUNDS; } else if (newPosition < 0) { m_streamPosition = 0; - result = E_BOUNDS; + result = E_BOUNDS; } else { @@ -489,10 +457,10 @@ namespace } private: - Blob& mBlob; + Blob& mBlob; size_t m_streamPosition; size_t m_streamEOF; - ULONG mRefCount; + ULONG mRefCount; static HRESULT ComputeGrowSize(uint64_t& newSize, const uint64_t targetSize) noexcept { @@ -518,12 +486,11 @@ namespace //------------------------------------------------------------------------------------- // Determines metadata for image //------------------------------------------------------------------------------------- - HRESULT DecodeMetadata( - WIC_FLAGS flags, - bool iswic2, - _In_ IWICBitmapDecoder *decoder, - _In_ IWICBitmapFrameDecode *frame, - _Out_ TexMetadata& metadata, + HRESULT DecodeMetadata(WIC_FLAGS flags, + bool iswic2, + _In_ IWICBitmapDecoder* decoder, + _In_ IWICBitmapFrameDecode* frame, + _Out_ TexMetadata& metadata, _Out_opt_ WICPixelFormatGUID* pConvert, _In_ std::function getMQR) { @@ -531,16 +498,16 @@ namespace return E_POINTER; memset(&metadata, 0, sizeof(TexMetadata)); - metadata.depth = 1; + metadata.depth = 1; metadata.mipLevels = 1; metadata.dimension = TEX_DIMENSION_TEXTURE2D; - UINT w, h; + UINT w, h; HRESULT hr = frame->GetSize(&w, &h); if (FAILED(hr)) return hr; - metadata.width = w; + metadata.width = w; metadata.height = h; if (flags & WIC_FLAGS_ALL_FRAMES) @@ -600,7 +567,7 @@ namespace sRGB = (flags & WIC_FLAGS_DEFAULT_SRGB) != 0; } } - #if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) +#if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) else if (memcmp(&containerFormat, &GUID_ContainerFormatJpeg, sizeof(GUID)) == 0) { if (SUCCEEDED(metareader->GetMetadataByName(L"/app1/ifd/exif/{ushort=40961}", &value)) && value.vt == VT_UI2) @@ -623,7 +590,7 @@ namespace sRGB = (flags & WIC_FLAGS_DEFAULT_SRGB) != 0; } } - #else +#else else if (SUCCEEDED(metareader->GetMetadataByName(L"System.Image.ColorSpace", &value)) && value.vt == VT_UI2) { sRGB = (value.uiVal == 1); @@ -632,7 +599,7 @@ namespace { sRGB = (flags & WIC_FLAGS_DEFAULT_SRGB) != 0; } - #endif +#endif std::ignore = PropVariantClear(&value); @@ -658,16 +625,14 @@ namespace return hr; } - //------------------------------------------------------------------------------------- // Decodes a single frame //------------------------------------------------------------------------------------- - HRESULT DecodeSingleFrame( - WIC_FLAGS flags, - const TexMetadata& metadata, - const WICPixelFormatGUID& convertGUID, - _In_ IWICBitmapFrameDecode *frame, - _Inout_ ScratchImage& image) + HRESULT DecodeSingleFrame(WIC_FLAGS flags, + const TexMetadata& metadata, + const WICPixelFormatGUID& convertGUID, + _In_ IWICBitmapFrameDecode* frame, + _Inout_ ScratchImage& image) { if (!frame) return E_POINTER; @@ -676,12 +641,12 @@ namespace if (FAILED(hr)) return hr; - const Image *img = image.GetImage(0, 0, 0); + const Image* img = image.GetImage(0, 0, 0); if (!img) return E_POINTER; bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; @@ -707,14 +672,13 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pixelFormat, convertGUID, &canConvert); + hr = FC->CanConvert(pixelFormat, convertGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; } - hr = FC->Initialize(frame, convertGUID, GetWICDither(flags), nullptr, - 0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(frame, convertGUID, GetWICDither(flags), nullptr, 0, WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; @@ -726,15 +690,10 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Decodes an image array, resizing/format converting as needed //------------------------------------------------------------------------------------- - HRESULT DecodeMultiframe( - WIC_FLAGS flags, - const TexMetadata& metadata, - _In_ IWICBitmapDecoder *decoder, - _Inout_ ScratchImage& image) + HRESULT DecodeMultiframe(WIC_FLAGS flags, const TexMetadata& metadata, _In_ IWICBitmapDecoder* decoder, _Inout_ ScratchImage& image) { if (!decoder) return E_POINTER; @@ -744,7 +703,7 @@ namespace return hr; bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; @@ -793,14 +752,13 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pfGuid, sourceGUID, &canConvert); + hr = FC->CanConvert(pfGuid, sourceGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; } - hr = FC->Initialize(frame.Get(), sourceGUID, GetWICDither(flags), nullptr, - 0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(frame.Get(), sourceGUID, GetWICDither(flags), nullptr, 0, WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; @@ -818,7 +776,8 @@ namespace return hr; hr = scaler->Initialize(frame.Get(), - static_cast(metadata.width), static_cast(metadata.height), + static_cast(metadata.width), + static_cast(metadata.height), GetWICInterp(flags)); if (FAILED(hr)) return hr; @@ -844,14 +803,13 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pfScaler, sourceGUID, &canConvert); + hr = FC->CanConvert(pfScaler, sourceGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; } - hr = FC->Initialize(scaler.Get(), sourceGUID, GetWICDither(flags), nullptr, - 0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(scaler.Get(), sourceGUID, GetWICDither(flags), nullptr, 0, WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; @@ -865,21 +823,16 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Encodes image metadata //------------------------------------------------------------------------------------- - HRESULT EncodeMetadata( - WIC_FLAGS flags, - _In_ IWICBitmapFrameEncode* frame, - const GUID& containerFormat, - DXGI_FORMAT format) + HRESULT EncodeMetadata(WIC_FLAGS flags, _In_ IWICBitmapFrameEncode* frame, const GUID& containerFormat, DXGI_FORMAT format) { if (!frame) return E_POINTER; ComPtr metawriter; - HRESULT hr = frame->GetMetadataQueryWriter(metawriter.GetAddressOf()); + HRESULT hr = frame->GetMetadataQueryWriter(metawriter.GetAddressOf()); if (SUCCEEDED(hr)) { PROPVARIANT value; @@ -887,7 +840,7 @@ namespace const bool sRGB = ((flags & WIC_FLAGS_FORCE_LINEAR) == 0) && ((flags & WIC_FLAGS_FORCE_SRGB) != 0 || IsSRGB(format)); - value.vt = VT_LPSTR; + value.vt = VT_LPSTR; value.pszVal = const_cast("DirectXTex"); if (memcmp(&containerFormat, &GUID_ContainerFormatPng, sizeof(GUID)) == 0) @@ -898,22 +851,22 @@ namespace // Set sRGB chunk if (sRGB) { - value.vt = VT_UI1; - value.bVal = 0; + value.vt = VT_UI1; + value.bVal = 0; std::ignore = metawriter->SetMetadataByName(L"/sRGB/RenderingIntent", &value); } else { // add gAMA chunk with gamma 1.0 - value.vt = VT_UI4; + value.vt = VT_UI4; value.uintVal = 100000; // gama value * 100,000 -- i.e. gamma 1.0 - std::ignore = metawriter->SetMetadataByName(L"/gAMA/ImageGamma", &value); + std::ignore = metawriter->SetMetadataByName(L"/gAMA/ImageGamma", &value); // remove sRGB chunk which is added by default. std::ignore = metawriter->RemoveMetadataByName(L"/sRGB/RenderingIntent"); } } - #if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) +#if (defined(_XBOX_ONE) && defined(_TITLE)) || defined(_GAMING_XBOX) else if (memcmp(&containerFormat, &GUID_ContainerFormatJpeg, sizeof(GUID)) == 0) { // Set Software name @@ -922,7 +875,7 @@ namespace if (sRGB) { // Set EXIF Colorspace of sRGB - value.vt = VT_UI2; + value.vt = VT_UI2; value.uiVal = 1; std::ignore = metawriter->SetMetadataByName(L"/app1/ifd/exif/{ushort=40961}", &value); } @@ -935,12 +888,12 @@ namespace if (sRGB) { // Set EXIF Colorspace of sRGB - value.vt = VT_UI2; + value.vt = VT_UI2; value.uiVal = 1; std::ignore = metawriter->SetMetadataByName(L"/ifd/exif/{ushort=40961}", &value); } } - #else +#else else { // Set Software name @@ -949,12 +902,12 @@ namespace if (sRGB) { // Set EXIF Colorspace of sRGB - value.vt = VT_UI2; + value.vt = VT_UI2; value.uiVal = 1; std::ignore = metawriter->SetMetadataByName(L"System.Image.ColorSpace", &value); } } - #endif +#endif } else if (hr == WINCODEC_ERR_UNSUPPORTEDOPERATION) { @@ -965,17 +918,15 @@ namespace return hr; } - //------------------------------------------------------------------------------------- // Encodes a single frame //------------------------------------------------------------------------------------- - HRESULT EncodeImage( - const Image& image, - WIC_FLAGS flags, - _In_ REFGUID containerFormat, - _In_ IWICBitmapFrameEncode* frame, - _In_opt_ IPropertyBag2* props, - _In_opt_ const GUID* targetFormat) + HRESULT EncodeImage(const Image& image, + WIC_FLAGS flags, + _In_ REFGUID containerFormat, + _In_ IWICBitmapFrameEncode* frame, + _In_opt_ IPropertyBag2* props, + _In_opt_ const GUID* targetFormat) { if (!frame || !image.pixels) return E_POINTER; @@ -1003,7 +954,7 @@ namespace return hr; WICPixelFormatGUID targetGuid = (targetFormat) ? (*targetFormat) : pfGuid; - hr = frame->SetPixelFormat(&targetGuid); + hr = frame->SetPixelFormat(&targetGuid); if (FAILED(hr)) return hr; @@ -1021,14 +972,18 @@ namespace { // Conversion required to write bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; ComPtr source; - hr = pWIC->CreateBitmapFromMemory(static_cast(image.width), static_cast(image.height), pfGuid, - static_cast(image.rowPitch), static_cast(image.slicePitch), - image.pixels, source.GetAddressOf()); + hr = pWIC->CreateBitmapFromMemory(static_cast(image.width), + static_cast(image.height), + pfGuid, + static_cast(image.rowPitch), + static_cast(image.slicePitch), + image.pixels, + source.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1038,26 +993,27 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pfGuid, targetGuid, &canConvert); + hr = FC->CanConvert(pfGuid, targetGuid, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; } - hr = FC->Initialize(source.Get(), targetGuid, GetWICDither(flags), nullptr, - 0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(source.Get(), targetGuid, GetWICDither(flags), nullptr, 0, WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; WICRect rect = { 0, 0, static_cast(image.width), static_cast(image.height) }; - hr = frame->WriteSource(FC.Get(), &rect); + hr = frame->WriteSource(FC.Get(), &rect); if (FAILED(hr)) return hr; } else { // No conversion required - hr = frame->WritePixels(static_cast(image.height), static_cast(image.rowPitch), static_cast(image.slicePitch), + hr = frame->WritePixels(static_cast(image.height), + static_cast(image.rowPitch), + static_cast(image.slicePitch), reinterpret_cast(image.pixels)); if (FAILED(hr)) return hr; @@ -1070,12 +1026,11 @@ namespace return S_OK; } - HRESULT EncodeSingleFrame( - const Image& image, - WIC_FLAGS flags, - _In_ REFGUID containerFormat, - _Inout_ IStream* stream, - _In_opt_ const GUID* targetFormat, + HRESULT EncodeSingleFrame(const Image& image, + WIC_FLAGS flags, + _In_ REFGUID containerFormat, + _Inout_ IStream* stream, + _In_opt_ const GUID* targetFormat, _In_ std::function setCustomProps) { if (!stream) @@ -1083,12 +1038,12 @@ namespace // Initialize WIC bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; ComPtr encoder; - HRESULT hr = pWIC->CreateEncoder(containerFormat, nullptr, encoder.GetAddressOf()); + HRESULT hr = pWIC->CreateEncoder(containerFormat, nullptr, encoder.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1097,7 +1052,7 @@ namespace return hr; ComPtr frame; - ComPtr props; + ComPtr props; hr = encoder->CreateNewFrame(frame.GetAddressOf(), props.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1109,9 +1064,9 @@ namespace option.pstrName = const_cast(L"EnableV5Header32bppBGRA"); VARIANT varValue; - varValue.vt = VT_BOOL; + varValue.vt = VT_BOOL; varValue.boolVal = VARIANT_TRUE; - std::ignore = props->Write(1, &option, &varValue); + std::ignore = props->Write(1, &option, &varValue); } if (setCustomProps) @@ -1130,17 +1085,15 @@ namespace return S_OK; } - //------------------------------------------------------------------------------------- // Encodes an image array //------------------------------------------------------------------------------------- - HRESULT EncodeMultiframe( - _In_reads_(nimages) const Image* images, - size_t nimages, - WIC_FLAGS flags, - _In_ REFGUID containerFormat, - _Inout_ IStream* stream, - _In_opt_ const GUID* targetFormat, + HRESULT EncodeMultiframe(_In_reads_(nimages) const Image* images, + size_t nimages, + WIC_FLAGS flags, + _In_ REFGUID containerFormat, + _Inout_ IStream* stream, + _In_opt_ const GUID* targetFormat, _In_ std::function setCustomProps) { assert(nimages > 1); @@ -1149,12 +1102,12 @@ namespace // Initialize WIC bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; ComPtr encoder; - HRESULT hr = pWIC->CreateEncoder(containerFormat, nullptr, encoder.GetAddressOf()); + HRESULT hr = pWIC->CreateEncoder(containerFormat, nullptr, encoder.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1164,7 +1117,7 @@ namespace return hr; BOOL mframe = FALSE; - hr = einfo->DoesSupportMultiframe(&mframe); + hr = einfo->DoesSupportMultiframe(&mframe); if (FAILED(hr)) return hr; @@ -1178,7 +1131,7 @@ namespace for (size_t index = 0; index < nimages; ++index) { ComPtr frame; - ComPtr props; + ComPtr props; hr = encoder->CreateNewFrame(frame.GetAddressOf(), props.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1199,8 +1152,7 @@ namespace return S_OK; } -} - +} // namespace //===================================================================================== // Entry-points @@ -1209,13 +1161,11 @@ namespace //------------------------------------------------------------------------------------- // Obtain metadata from WIC-supported file in memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromWICMemory( - const uint8_t* pSource, - size_t size, - WIC_FLAGS flags, - TexMetadata& metadata, - std::function getMQR) +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromWICMemory(const uint8_t* pSource, + size_t size, + WIC_FLAGS flags, + TexMetadata& metadata, + std::function getMQR) { if (!pSource || size == 0) return E_INVALIDARG; @@ -1224,18 +1174,17 @@ HRESULT DirectX::GetMetadataFromWICMemory( return HRESULT_E_FILE_TOO_LARGE; bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; // Create input stream for memory ComPtr stream; - HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); + HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); if (FAILED(hr)) return hr; - hr = stream->InitializeFromMemory(static_cast(const_cast(pSource)), - static_cast(size)); + hr = stream->InitializeFromMemory(static_cast(const_cast(pSource)), static_cast(size)); if (FAILED(hr)) return hr; @@ -1258,22 +1207,19 @@ HRESULT DirectX::GetMetadataFromWICMemory( return S_OK; } - //------------------------------------------------------------------------------------- // Obtain metadata from WIC-supported file on disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::GetMetadataFromWICFile( - const wchar_t* szFile, - WIC_FLAGS flags, - TexMetadata& metadata, - std::function getMQR) +_Use_decl_annotations_ HRESULT DirectX::GetMetadataFromWICFile(const wchar_t* szFile, + WIC_FLAGS flags, + TexMetadata& metadata, + std::function getMQR) { if (!szFile) return E_INVALIDARG; bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; @@ -1296,18 +1242,15 @@ HRESULT DirectX::GetMetadataFromWICFile( return S_OK; } - //------------------------------------------------------------------------------------- // Load a WIC-supported file in memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromWICMemory( - const uint8_t* pSource, - size_t size, - WIC_FLAGS flags, - TexMetadata* metadata, - ScratchImage& image, - std::function getMQR) +_Use_decl_annotations_ HRESULT DirectX::LoadFromWICMemory(const uint8_t* pSource, + size_t size, + WIC_FLAGS flags, + TexMetadata* metadata, + ScratchImage& image, + std::function getMQR) { if (!pSource || size == 0) return E_INVALIDARG; @@ -1316,7 +1259,7 @@ HRESULT DirectX::LoadFromWICMemory( return HRESULT_E_FILE_TOO_LARGE; bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; @@ -1324,7 +1267,7 @@ HRESULT DirectX::LoadFromWICMemory( // Create input stream for memory ComPtr stream; - HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); + HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1344,9 +1287,9 @@ HRESULT DirectX::LoadFromWICMemory( return hr; // Get metadata - TexMetadata mdata = {}; + TexMetadata mdata = {}; WICPixelFormatGUID convertGUID = {}; - hr = DecodeMetadata(flags, iswic2, decoder.Get(), frame.Get(), mdata, &convertGUID, getMQR); + hr = DecodeMetadata(flags, iswic2, decoder.Get(), frame.Get(), mdata, &convertGUID, getMQR); if (FAILED(hr)) return hr; @@ -1371,23 +1314,20 @@ HRESULT DirectX::LoadFromWICMemory( return S_OK; } - //------------------------------------------------------------------------------------- // Load a WIC-supported file from disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadFromWICFile( - const wchar_t* szFile, - WIC_FLAGS flags, - TexMetadata* metadata, - ScratchImage& image, - std::function getMQR) +_Use_decl_annotations_ HRESULT DirectX::LoadFromWICFile(const wchar_t* szFile, + WIC_FLAGS flags, + TexMetadata* metadata, + ScratchImage& image, + std::function getMQR) { if (!szFile) return E_INVALIDARG; bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; @@ -1405,9 +1345,9 @@ HRESULT DirectX::LoadFromWICFile( return hr; // Get metadata - TexMetadata mdata = {}; + TexMetadata mdata = {}; WICPixelFormatGUID convertGUID = {}; - hr = DecodeMetadata(flags, iswic2, decoder.Get(), frame.Get(), mdata, &convertGUID, getMQR); + hr = DecodeMetadata(flags, iswic2, decoder.Get(), frame.Get(), mdata, &convertGUID, getMQR); if (FAILED(hr)) return hr; @@ -1432,18 +1372,15 @@ HRESULT DirectX::LoadFromWICFile( return S_OK; } - //------------------------------------------------------------------------------------- // Save a WIC-supported file to memory //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveToWICMemory( - const Image& image, - WIC_FLAGS flags, - REFGUID containerFormat, - Blob& blob, - const GUID* targetFormat, - std::function setCustomProps) +_Use_decl_annotations_ HRESULT DirectX::SaveToWICMemory(const Image& image, + WIC_FLAGS flags, + REFGUID containerFormat, + Blob& blob, + const GUID* targetFormat, + std::function setCustomProps) { if (!image.pixels) return E_POINTER; @@ -1479,15 +1416,13 @@ HRESULT DirectX::SaveToWICMemory( return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::SaveToWICMemory( - const Image* images, - size_t nimages, - WIC_FLAGS flags, - REFGUID containerFormat, - Blob& blob, - const GUID* targetFormat, - std::function setCustomProps) +_Use_decl_annotations_ HRESULT DirectX::SaveToWICMemory(const Image* images, + size_t nimages, + WIC_FLAGS flags, + REFGUID containerFormat, + Blob& blob, + const GUID* targetFormat, + std::function setCustomProps) { if (!images || nimages == 0) return E_INVALIDARG; @@ -1527,18 +1462,15 @@ HRESULT DirectX::SaveToWICMemory( return S_OK; } - //------------------------------------------------------------------------------------- // Save a WIC-supported file to disk //------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveToWICFile( - const Image& image, - WIC_FLAGS flags, - REFGUID containerFormat, - const wchar_t* szFile, - const GUID* targetFormat, - std::function setCustomProps) +_Use_decl_annotations_ HRESULT DirectX::SaveToWICFile(const Image& image, + WIC_FLAGS flags, + REFGUID containerFormat, + const wchar_t* szFile, + const GUID* targetFormat, + std::function setCustomProps) { if (!szFile) return E_INVALIDARG; @@ -1547,12 +1479,12 @@ HRESULT DirectX::SaveToWICFile( return E_POINTER; bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; ComPtr stream; - HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); + HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1571,26 +1503,24 @@ HRESULT DirectX::SaveToWICFile( return S_OK; } -_Use_decl_annotations_ -HRESULT DirectX::SaveToWICFile( - const Image* images, - size_t nimages, - WIC_FLAGS flags, - REFGUID containerFormat, - const wchar_t* szFile, - const GUID* targetFormat, - std::function setCustomProps) +_Use_decl_annotations_ HRESULT DirectX::SaveToWICFile(const Image* images, + size_t nimages, + WIC_FLAGS flags, + REFGUID containerFormat, + const wchar_t* szFile, + const GUID* targetFormat, + std::function setCustomProps) { if (!szFile || !images || nimages == 0) return E_INVALIDARG; bool iswic2 = false; - auto pWIC = GetWICFactory(iswic2); + auto pWIC = GetWICFactory(iswic2); if (!pWIC) return E_NOINTERFACE; ComPtr stream; - HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); + HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1613,7 +1543,6 @@ HRESULT DirectX::SaveToWICFile( return S_OK; } - //-------------------------------------------------------------------------------------- // Adapters for /Zc:wchar_t- clients @@ -1621,47 +1550,54 @@ HRESULT DirectX::SaveToWICFile( namespace DirectX { - HRESULT __cdecl GetMetadataFromWICFile( - _In_z_ const __wchar_t* szFile, - _In_ WIC_FLAGS flags, - _Out_ TexMetadata& metadata, + HRESULT __cdecl GetMetadataFromWICFile(_In_z_ const __wchar_t* szFile, + _In_ WIC_FLAGS flags, + _Out_ TexMetadata& metadata, _In_ std::function getMQR) { return GetMetadataFromWICFile(reinterpret_cast(szFile), flags, metadata, getMQR); } - HRESULT __cdecl LoadFromWICFile( - _In_z_ const __wchar_t* szFile, - _In_ WIC_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image, + HRESULT __cdecl LoadFromWICFile(_In_z_ const __wchar_t* szFile, + _In_ WIC_FLAGS flags, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image, _In_ std::function getMQR) { return LoadFromWICFile(reinterpret_cast(szFile), flags, metadata, image, getMQR); } - HRESULT __cdecl SaveToWICFile( - _In_ const Image& image, - _In_ WIC_FLAGS flags, - _In_ REFGUID guidContainerFormat, - _In_z_ const __wchar_t* szFile, - _In_opt_ const GUID* targetFormat, + HRESULT __cdecl SaveToWICFile(_In_ const Image& image, + _In_ WIC_FLAGS flags, + _In_ REFGUID guidContainerFormat, + _In_z_ const __wchar_t* szFile, + _In_opt_ const GUID* targetFormat, _In_ std::function setCustomProps) { - return SaveToWICFile(image, flags, guidContainerFormat, reinterpret_cast(szFile), targetFormat, setCustomProps); + return SaveToWICFile(image, + flags, + guidContainerFormat, + reinterpret_cast(szFile), + targetFormat, + setCustomProps); } - HRESULT __cdecl SaveToWICFile( - _In_count_(nimages) const Image* images, - _In_ size_t nimages, - _In_ WIC_FLAGS flags, - _In_ REFGUID guidContainerFormat, - _In_z_ const __wchar_t* szFile, - _In_opt_ const GUID* targetFormat, + HRESULT __cdecl SaveToWICFile(_In_count_(nimages) const Image* images, + _In_ size_t nimages, + _In_ WIC_FLAGS flags, + _In_ REFGUID guidContainerFormat, + _In_z_ const __wchar_t* szFile, + _In_opt_ const GUID* targetFormat, _In_ std::function setCustomProps) { - return SaveToWICFile(images, nimages, flags, guidContainerFormat, reinterpret_cast(szFile), targetFormat, setCustomProps); + return SaveToWICFile(images, + nimages, + flags, + guidContainerFormat, + reinterpret_cast(szFile), + targetFormat, + setCustomProps); } -} +} // namespace DirectX #endif // !_NATIVE_WCHAR_T_DEFINED diff --git a/DirectXTex/filters.h b/DirectXTex/filters.h index c9f9e810..c41af51d 100644 --- a/DirectXTex/filters.h +++ b/DirectXTex/filters.h @@ -16,7 +16,6 @@ #include "scoped.h" - namespace DirectX { namespace Filters @@ -25,29 +24,28 @@ namespace DirectX // Box filtering helpers //------------------------------------------------------------------------------------- - XMGLOBALCONST XMVECTORF32 g_boxScale = { { { 0.25f, 0.25f, 0.25f, 0.25f } } }; + XMGLOBALCONST XMVECTORF32 g_boxScale = { { { 0.25f, 0.25f, 0.25f, 0.25f } } }; XMGLOBALCONST XMVECTORF32 g_boxScale3D = { { { 0.125f, 0.125f, 0.125f, 0.125f } } }; - #define AVERAGE4( res, p0, p1, p2, p3 ) \ -{ \ - XMVECTOR v = XMVectorAdd((p0), (p1)); \ - v = XMVectorAdd(v, (p2)); \ - v = XMVectorAdd(v, (p3)); \ - res = XMVectorMultiply(v, g_boxScale); \ -} - - #define AVERAGE8( res, p0, p1, p2, p3, p4, p5, p6, p7) \ -{ \ - XMVECTOR v = XMVectorAdd((p0), (p1)); \ - v = XMVectorAdd(v, (p2)); \ - v = XMVectorAdd(v, (p3)); \ - v = XMVectorAdd(v, (p4)); \ - v = XMVectorAdd(v, (p5)); \ - v = XMVectorAdd(v, (p6)); \ - v = XMVectorAdd(v, (p7)); \ - res = XMVectorMultiply(v, g_boxScale3D); \ -} - +#define AVERAGE4(res, p0, p1, p2, p3) \ + { \ + XMVECTOR v = XMVectorAdd((p0), (p1)); \ + v = XMVectorAdd(v, (p2)); \ + v = XMVectorAdd(v, (p3)); \ + res = XMVectorMultiply(v, g_boxScale); \ + } + +#define AVERAGE8(res, p0, p1, p2, p3, p4, p5, p6, p7) \ + { \ + XMVECTOR v = XMVectorAdd((p0), (p1)); \ + v = XMVectorAdd(v, (p2)); \ + v = XMVectorAdd(v, (p3)); \ + v = XMVectorAdd(v, (p4)); \ + v = XMVectorAdd(v, (p5)); \ + v = XMVectorAdd(v, (p6)); \ + v = XMVectorAdd(v, (p7)); \ + res = XMVectorMultiply(v, g_boxScale3D); \ + } //------------------------------------------------------------------------------------- // Linear filtering helpers @@ -55,10 +53,10 @@ namespace DirectX struct LinearFilter { - size_t u0; - float weight0; - size_t u1; - float weight1; + size_t u0; + float weight0; + size_t u1; + float weight1; }; inline void CreateLinearFilter(_In_ size_t source, _In_ size_t dest, _In_ bool wrap, _Out_writes_(dest) LinearFilter* lf) noexcept @@ -90,27 +88,31 @@ namespace DirectX isrcB = (wrap) ? 0 : (ptrdiff_t(source) - 1); } - auto& entry = lf[u]; - entry.u0 = size_t(isrcA); + auto& entry = lf[u]; + entry.u0 = size_t(isrcA); entry.weight0 = weight; - entry.u1 = size_t(isrcB); + entry.u1 = size_t(isrcB); entry.weight1 = 1.0f - weight; } } - #define BILINEAR_INTERPOLATE( res, x, y, r0, r1 ) \ - res = XMVectorAdd(XMVectorScale(XMVectorAdd(XMVectorScale((r0)[ x.u0 ], x.weight0), XMVectorScale((r0)[ x.u1 ], x.weight1)), y.weight0), \ - XMVectorScale(XMVectorAdd(XMVectorScale((r1)[ x.u0 ], x.weight0), XMVectorScale((r1)[ x.u1 ], x.weight1)), y.weight1) ); - - #define TRILINEAR_INTERPOLATE( res, x, y, z, r0, r1, r2, r3 ) \ -{\ - const XMVECTOR a0 = XMVectorScale(XMVectorAdd(XMVectorScale((r0)[ x.u0 ], x.weight0 ), XMVectorScale((r0)[ x.u1 ], x.weight1)), y.weight0); \ - const XMVECTOR a1 = XMVectorScale(XMVectorAdd(XMVectorScale((r1)[ x.u0 ], x.weight0 ), XMVectorScale((r1)[ x.u1 ], x.weight1)), y.weight1); \ - const XMVECTOR a2 = XMVectorScale(XMVectorAdd(XMVectorScale((r2)[ x.u0 ], x.weight0 ), XMVectorScale((r2)[ x.u1 ], x.weight1)), y.weight0); \ - const XMVECTOR a3 = XMVectorScale(XMVectorAdd(XMVectorScale((r3)[ x.u0 ], x.weight0 ), XMVectorScale((r3)[ x.u1 ], x.weight1)), y.weight1); \ - res = XMVectorAdd(XMVectorScale(XMVectorAdd(a0, a1), z.weight0), XMVectorScale(XMVectorAdd(a2, a3), z.weight1)); \ -} +#define BILINEAR_INTERPOLATE(res, x, y, r0, r1) \ + res = XMVectorAdd(XMVectorScale(XMVectorAdd(XMVectorScale((r0)[x.u0], x.weight0), XMVectorScale((r0)[x.u1], x.weight1)), y.weight0), \ + XMVectorScale(XMVectorAdd(XMVectorScale((r1)[x.u0], x.weight0), XMVectorScale((r1)[x.u1], x.weight1)), y.weight1)); + +#define TRILINEAR_INTERPOLATE(res, x, y, z, r0, r1, r2, r3) \ + { \ + const XMVECTOR a0 \ + = XMVectorScale(XMVectorAdd(XMVectorScale((r0)[x.u0], x.weight0), XMVectorScale((r0)[x.u1], x.weight1)), y.weight0); \ + const XMVECTOR a1 \ + = XMVectorScale(XMVectorAdd(XMVectorScale((r1)[x.u0], x.weight0), XMVectorScale((r1)[x.u1], x.weight1)), y.weight1); \ + const XMVECTOR a2 \ + = XMVectorScale(XMVectorAdd(XMVectorScale((r2)[x.u0], x.weight0), XMVectorScale((r2)[x.u1], x.weight1)), y.weight0); \ + const XMVECTOR a3 \ + = XMVectorScale(XMVectorAdd(XMVectorScale((r3)[x.u0], x.weight0), XMVectorScale((r3)[x.u1], x.weight1)), y.weight1); \ + res = XMVectorAdd(XMVectorScale(XMVectorAdd(a0, a1), z.weight0), XMVectorScale(XMVectorAdd(a2, a3), z.weight1)); \ + } //------------------------------------------------------------------------------------- // Cubic filtering helpers @@ -118,7 +120,7 @@ namespace DirectX XMGLOBALCONST XMVECTORF32 g_cubicThird = { { { 1.f / 3.f, 1.f / 3.f, 1.f / 3.f, 1.f / 3.f } } }; XMGLOBALCONST XMVECTORF32 g_cubicSixth = { { { 1.f / 6.f, 1.f / 6.f, 1.f / 6.f, 1.f / 6.f } } }; - XMGLOBALCONST XMVECTORF32 g_cubicHalf = { { { 1.f / 2.f, 1.f / 2.f, 1.f / 2.f, 1.f / 2.f } } }; + XMGLOBALCONST XMVECTORF32 g_cubicHalf = { { { 1.f / 2.f, 1.f / 2.f, 1.f / 2.f, 1.f / 2.f } } }; constexpr ptrdiff_t bounduvw(ptrdiff_t u, ptrdiff_t maxu, bool wrap, bool mirror) noexcept { @@ -154,14 +156,18 @@ namespace DirectX struct CubicFilter { - size_t u0; - size_t u1; - size_t u2; - size_t u3; - float x; + size_t u0; + size_t u1; + size_t u2; + size_t u3; + float x; }; - inline void CreateCubicFilter(_In_ size_t source, _In_ size_t dest, _In_ bool wrap, _In_ bool mirror, _Out_writes_(dest) CubicFilter* cf) noexcept + inline void CreateCubicFilter(_In_ size_t source, + _In_ size_t dest, + _In_ bool wrap, + _In_ bool mirror, + _Out_writes_(dest) CubicFilter* cf) noexcept { assert(source > 0); assert(dest > 0); @@ -179,33 +185,33 @@ namespace DirectX const ptrdiff_t isrcD = bounduvw(isrcB + 2, ptrdiff_t(source) - 1, wrap, mirror); auto& entry = cf[u]; - entry.u0 = size_t(isrcA); - entry.u1 = size_t(isrcB); - entry.u2 = size_t(isrcC); - entry.u3 = size_t(isrcD); + entry.u0 = size_t(isrcA); + entry.u1 = size_t(isrcB); + entry.u2 = size_t(isrcC); + entry.u3 = size_t(isrcD); const float x = srcB - float(isrcB); - entry.x = x; + entry.x = x; } } - #define CUBIC_INTERPOLATE( res, dx, p0, p1, p2, p3 ) \ -{ \ - const XMVECTOR a0 = (p1); \ - const XMVECTOR d0 = XMVectorSubtract(p0, a0); \ - const XMVECTOR d2 = XMVectorSubtract(p2, a0); \ - const XMVECTOR d3 = XMVectorSubtract(p3, a0); \ - XMVECTOR a1 = XMVectorSubtract(d2, XMVectorMultiply(g_cubicThird, d0)); \ - a1 = XMVectorSubtract(a1, XMVectorMultiply(g_cubicSixth, d3)); \ - const XMVECTOR a2 = XMVectorAdd(XMVectorMultiply(g_cubicHalf, d0), XMVectorMultiply(g_cubicHalf, d2)); \ - XMVECTOR a3 = XMVectorSubtract(XMVectorMultiply(g_cubicSixth, d3), XMVectorMultiply(g_cubicSixth, d0)); \ - a3 = XMVectorSubtract(a3, XMVectorMultiply(g_cubicHalf, d2)); \ - const XMVECTOR vdx = XMVectorReplicate(dx); \ - const XMVECTOR vdx2 = XMVectorMultiply(vdx, vdx); \ - const XMVECTOR vdx3 = XMVectorMultiply(vdx2, vdx); \ - res = XMVectorAdd(XMVectorAdd(XMVectorAdd(a0, XMVectorMultiply(a1, vdx)), XMVectorMultiply(a2, vdx2)), XMVectorMultiply(a3, vdx3)); \ -} - +#define CUBIC_INTERPOLATE(res, dx, p0, p1, p2, p3) \ + { \ + const XMVECTOR a0 = (p1); \ + const XMVECTOR d0 = XMVectorSubtract(p0, a0); \ + const XMVECTOR d2 = XMVectorSubtract(p2, a0); \ + const XMVECTOR d3 = XMVectorSubtract(p3, a0); \ + XMVECTOR a1 = XMVectorSubtract(d2, XMVectorMultiply(g_cubicThird, d0)); \ + a1 = XMVectorSubtract(a1, XMVectorMultiply(g_cubicSixth, d3)); \ + const XMVECTOR a2 = XMVectorAdd(XMVectorMultiply(g_cubicHalf, d0), XMVectorMultiply(g_cubicHalf, d2)); \ + XMVECTOR a3 = XMVectorSubtract(XMVectorMultiply(g_cubicSixth, d3), XMVectorMultiply(g_cubicSixth, d0)); \ + a3 = XMVectorSubtract(a3, XMVectorMultiply(g_cubicHalf, d2)); \ + const XMVECTOR vdx = XMVectorReplicate(dx); \ + const XMVECTOR vdx2 = XMVectorMultiply(vdx, vdx); \ + const XMVECTOR vdx3 = XMVectorMultiply(vdx2, vdx); \ + res = XMVectorAdd(XMVectorAdd(XMVectorAdd(a0, XMVectorMultiply(a1, vdx)), XMVectorMultiply(a2, vdx2)), \ + XMVectorMultiply(a3, vdx3)); \ + } //------------------------------------------------------------------------------------- // Triangle filtering helpers @@ -213,57 +219,61 @@ namespace DirectX struct FilterTo { - size_t u; - float weight; + size_t u; + float weight; }; struct FilterFrom { - size_t count; - size_t sizeInBytes; - FilterTo to[1]; // variable-sized array + size_t count; + size_t sizeInBytes; + FilterTo to[1]; // variable-sized array }; struct Filter { - size_t sizeInBytes; - size_t totalSize; - FilterFrom from[1]; // variable-sized array + size_t sizeInBytes; + size_t totalSize; + FilterFrom from[1]; // variable-sized array }; struct TriangleRow { - size_t remaining; - TriangleRow* next; - ScopedAlignedArrayXMVECTOR scanline; - - TriangleRow() noexcept : remaining(0), next(nullptr) {} + size_t remaining; + TriangleRow* next; + ScopedAlignedArrayXMVECTOR scanline; + + TriangleRow() noexcept + : remaining(0), + next(nullptr) + {} }; constexpr size_t TF_FILTER_SIZE = sizeof(Filter) - sizeof(FilterFrom); - constexpr size_t TF_FROM_SIZE = sizeof(FilterFrom) - sizeof(FilterTo); - constexpr size_t TF_TO_SIZE = sizeof(FilterTo); + constexpr size_t TF_FROM_SIZE = sizeof(FilterFrom) - sizeof(FilterTo); + constexpr size_t TF_TO_SIZE = sizeof(FilterTo); constexpr float TF_EPSILON = 0.00001f; - inline HRESULT CreateTriangleFilter(_In_ size_t source, _In_ size_t dest, _In_ bool wrap, _Inout_ std::unique_ptr& tf) noexcept + inline HRESULT + CreateTriangleFilter(_In_ size_t source, _In_ size_t dest, _In_ bool wrap, _Inout_ std::unique_ptr& tf) noexcept { assert(source > 0); assert(dest > 0); - const float scale = float(dest) / float(source); + const float scale = float(dest) / float(source); const float scaleInv = 0.5f / scale; // Determine storage required for filter and allocate memory if needed - size_t totalSize = TF_FILTER_SIZE + TF_FROM_SIZE + TF_TO_SIZE; - const float repeat = (wrap) ? 1.f : 0.f; + size_t totalSize = TF_FILTER_SIZE + TF_FROM_SIZE + TF_TO_SIZE; + const float repeat = (wrap) ? 1.f : 0.f; for (size_t u = 0; u < source; ++u) { - const float src = float(u) - 0.5f; + const float src = float(u) - 0.5f; const float destMin = src * scale; const float destMax = destMin + scale; - const float t = destMax - destMin + repeat + 1.f; + const float t = destMax - destMin + repeat + 1.f; totalSize += TF_FROM_SIZE + TF_TO_SIZE + size_t(t) * TF_TO_SIZE * 2; } @@ -299,14 +309,14 @@ namespace DirectX // Filter setup size_t sizeInBytes = TF_FILTER_SIZE; - size_t accumU = 0; - float accumWeight = 0.f; + size_t accumU = 0; + float accumWeight = 0.f; for (size_t u = 0; u < source; ++u) { // Setup from entry const size_t sizeFrom = sizeInBytes; - auto pFrom = reinterpret_cast(pFilter + sizeInBytes); + auto pFrom = reinterpret_cast(pFilter + sizeInBytes); sizeInBytes += TF_FROM_SIZE; if (sizeInBytes > totalSize) @@ -364,12 +374,12 @@ namespace DirectX if (sizeInBytes > totalSize) return E_FAIL; - pTo->u = accumU; + pTo->u = accumU; pTo->weight = accumWeight; } accumWeight = 0.f; - accumU = u0; + accumU = u0; } // Clip destination @@ -402,14 +412,14 @@ namespace DirectX if (sizeInBytes > totalSize) return E_FAIL; - pTo->u = accumU; + pTo->u = accumU; pTo->weight = accumWeight; } accumWeight = 0.f; // Finalize from entry - pFrom->count = toCount; + pFrom->count = toCount; pFrom->sizeInBytes = sizeInBytes - sizeFrom; } diff --git a/DirectXTex/scoped.h b/DirectXTex/scoped.h index ee38a70c..70ebe643 100644 --- a/DirectXTex/scoped.h +++ b/DirectXTex/scoped.h @@ -21,14 +21,17 @@ #ifndef _WIN32 #include -struct aligned_deleter { void operator()(void* p) noexcept { free(p); } }; +struct aligned_deleter +{ + void operator()(void* p) noexcept { free(p); } +}; using ScopedAlignedArrayFloat = std::unique_ptr; inline ScopedAlignedArrayFloat make_AlignedArrayFloat(uint64_t count) { uint64_t size = sizeof(float) * count; - size = (size + 15u) & ~0xF; + size = (size + 15u) & ~0xF; if (size > static_cast(UINT32_MAX)) return nullptr; @@ -47,11 +50,14 @@ inline ScopedAlignedArrayXMVECTOR make_AlignedArrayXMVECTOR(uint64_t count) return ScopedAlignedArrayXMVECTOR(static_cast(ptr)); } -#else // WIN32 +#else // WIN32 //--------------------------------------------------------------------------------- #include -struct aligned_deleter { void operator()(void* p) noexcept { _aligned_free(p); } }; +struct aligned_deleter +{ + void operator()(void* p) noexcept { _aligned_free(p); } +}; using ScopedAlignedArrayFloat = std::unique_ptr; @@ -76,14 +82,33 @@ inline ScopedAlignedArrayXMVECTOR make_AlignedArrayXMVECTOR(uint64_t count) } //--------------------------------------------------------------------------------- -struct handle_closer { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) CloseHandle(h); } }; +struct handle_closer +{ + void operator()(HANDLE h) noexcept + { + assert(h != INVALID_HANDLE_VALUE); + if (h) + CloseHandle(h); + } +}; using ScopedHandle = std::unique_ptr; -inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } +inline HANDLE safe_handle(HANDLE h) noexcept +{ + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; +} //--------------------------------------------------------------------------------- -struct find_closer { void operator()(HANDLE h) noexcept { assert(h != INVALID_HANDLE_VALUE); if (h) FindClose(h); } }; +struct find_closer +{ + void operator()(HANDLE h) noexcept + { + assert(h != INVALID_HANDLE_VALUE); + if (h) + FindClose(h); + } +}; using ScopedFindHandle = std::unique_ptr; @@ -91,9 +116,11 @@ using ScopedFindHandle = std::unique_ptr; class auto_delete_file { public: - auto_delete_file(HANDLE hFile) noexcept : m_handle(hFile) {} + auto_delete_file(HANDLE hFile) noexcept + : m_handle(hFile) + {} - auto_delete_file(const auto_delete_file&) = delete; + auto_delete_file(const auto_delete_file&) = delete; auto_delete_file& operator=(const auto_delete_file&) = delete; ~auto_delete_file() @@ -101,8 +128,8 @@ class auto_delete_file if (m_handle) { FILE_DISPOSITION_INFO info = {}; - info.DeleteFile = TRUE; - std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); + info.DeleteFile = TRUE; + std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); } } diff --git a/README.md b/README.md index 88407e64..1e824b5f 100644 --- a/README.md +++ b/README.md @@ -10,7 +10,7 @@ Copyright (c) Microsoft Corporation. This package contains DirectXTex, a shared source library for reading and writing ``.DDS`` files, and performing various texture content processing operations including resizing, format conversion, mip-map generation, block compression for Direct3D runtime texture resources, and height-map to normal-map conversion. This library makes use of the Windows Image Component (WIC) APIs. It also includes ``.TGA`` and ``.HDR`` readers and writers since these image file formats are commonly used for texture content processing pipelines, but are not currently supported by a built-in WIC codec. -This code is designed to build with Visual Studio 2022, Visual Studio 2026, clang for Windows v12 or later, or MinGW. Use of the Windows 10 May 2020 Update SDK ([19041](https://walbourn.github.io/windows-10-may-2020-update-sdk/)) or later is required for Visual Studio. It can also be built for Windows Subsystem for Linux using GCC 11 or later. +This code is designed to build with Visual Studio 2022, Visual Studio 2026, clang for Windows v12 or later, or MinGW. Use of the Windows 11 SDK ([22000](https://walbourn.github.io/windows-sdk-for-windows-11/)) or later is required for Visual Studio. It can also be built for Windows Subsystem for Linux using GCC 11 or later. These components are designed to work without requiring any content from the legacy DirectX SDK. For details, see [Where is the DirectX SDK?](https://aka.ms/dxsdk). @@ -99,6 +99,13 @@ FOR SECURITY ADVISORIES, see [GitHub](https://github.com/microsoft/DirectXTex/se For a full change history, see [CHANGELOG.md](https://github.com/microsoft/DirectXTex/blob/main/CHANGELOG.md). +* clang-format use for this project must match the version use by GitHub Super-Linter to pass the validation. VS 2022 and VS 2026 come with different versions, so to match use: + +```cmd +winget install --id=LLVM.LLVM --version 21.1.2 +powershell -File build/Format.ps1 -LLVM +``` + * The _directxtex_desktop_win10_ and _directxtex_uwp_ NuGet packages are deprecated. The best way to integrate the latest DirectXTex into your C++ project is using [vcpkg](https://github.com/microsoft/vcpkg/tree/master/ports/directxtex). * The CMake projects require 3.21 or later. diff --git a/ScreenGrab/ScreenGrab11.cpp b/ScreenGrab/ScreenGrab11.cpp index b0e01232..7e60c343 100644 --- a/ScreenGrab/ScreenGrab11.cpp +++ b/ScreenGrab/ScreenGrab11.cpp @@ -58,9 +58,8 @@ using Microsoft::WRL::ComPtr; // Macros //-------------------------------------------------------------------------------------- #ifndef MAKEFOURCC -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | \ - ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 )) +#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24)) #endif /* defined(MAKEFOURCC) */ //-------------------------------------------------------------------------------------- @@ -70,36 +69,36 @@ using Microsoft::WRL::ComPtr; //-------------------------------------------------------------------------------------- namespace { -#pragma pack(push,1) +#pragma pack(push, 1) constexpr uint32_t DDS_MAGIC = 0x20534444; // "DDS " struct DDS_PIXELFORMAT { - uint32_t size; - uint32_t flags; - uint32_t fourCC; - uint32_t RGBBitCount; - uint32_t RBitMask; - uint32_t GBitMask; - uint32_t BBitMask; - uint32_t ABitMask; + uint32_t size; + uint32_t flags; + uint32_t fourCC; + uint32_t RGBBitCount; + uint32_t RBitMask; + uint32_t GBitMask; + uint32_t BBitMask; + uint32_t ABitMask; }; -#define DDS_FOURCC 0x00000004 // DDPF_FOURCC -#define DDS_RGB 0x00000040 // DDPF_RGB -#define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS -#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE -#define DDS_LUMINANCEA 0x00020001 // DDPF_LUMINANCE | DDPF_ALPHAPIXELS -#define DDS_ALPHA 0x00000002 // DDPF_ALPHA -#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV +#define DDS_FOURCC 0x00000004 // DDPF_FOURCC +#define DDS_RGB 0x00000040 // DDPF_RGB +#define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS +#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE +#define DDS_LUMINANCEA 0x00020001 // DDPF_LUMINANCE | DDPF_ALPHAPIXELS +#define DDS_ALPHA 0x00000002 // DDPF_ALPHA +#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV -#define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT -#define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT -#define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH -#define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE +#define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT +#define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT +#define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH +#define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE -#define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE +#define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE struct DDS_HEADER { @@ -121,11 +120,11 @@ namespace struct DDS_HEADER_DXT10 { - DXGI_FORMAT dxgiFormat; - uint32_t resourceDimension; - uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG - uint32_t arraySize; - uint32_t reserved; + DXGI_FORMAT dxgiFormat; + uint32_t resourceDimension; + uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG + uint32_t arraySize; + uint32_t reserved; }; #pragma pack(pop) @@ -134,113 +133,100 @@ namespace static_assert(sizeof(DDS_HEADER) == 124, "DDS Header size mismatch"); static_assert(sizeof(DDS_HEADER_DXT10) == 20, "DDS DX10 Extended Header size mismatch"); - constexpr size_t DDS_MIN_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); + constexpr size_t DDS_MIN_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); constexpr size_t DDS_DX10_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10); static_assert(DDS_DX10_HEADER_SIZE > DDS_MIN_HEADER_SIZE, "DDS DX10 Header should be larger than standard header"); - const DDS_PIXELFORMAT DDSPF_DXT1 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','1'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT1 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '1'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_DXT3 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','3'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT3 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '3'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_DXT5 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','5'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT5 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '5'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_BC4_UNORM = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','4','U'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_BC4_UNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B', 'C', '4', 'U'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_BC4_SNORM = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','4','S'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_BC4_SNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B', 'C', '4', 'S'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_BC5_UNORM = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','5','U'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_BC5_UNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B', 'C', '5', 'U'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_BC5_SNORM = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','5','S'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_BC5_SNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B', 'C', '5', 'S'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_R8G8_B8G8 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('R','G','B','G'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_R8G8_B8G8 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('R', 'G', 'B', 'G'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_G8R8_G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('G','R','G','B'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_G8R8_G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('G', 'R', 'G', 'B'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_YUY2 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('Y','U','Y','2'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_YUY2 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('Y', 'U', 'Y', '2'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_A8R8G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; + const DDS_PIXELFORMAT DDSPF_A8R8G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; - const DDS_PIXELFORMAT DDSPF_X8R8G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0 }; + const DDS_PIXELFORMAT DDSPF_X8R8G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0 }; - const DDS_PIXELFORMAT DDSPF_A8B8G8R8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; + const DDS_PIXELFORMAT DDSPF_A8B8G8R8 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; - const DDS_PIXELFORMAT DDSPF_G16R16 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_G16R16 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_R5G6B5 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0xf800, 0x07e0, 0x001f, 0 }; + const DDS_PIXELFORMAT DDSPF_R5G6B5 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0xf800, 0x07e0, 0x001f, 0 }; - const DDS_PIXELFORMAT DDSPF_A1R5G5B5 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x7c00, 0x03e0, 0x001f, 0x8000 }; + const DDS_PIXELFORMAT DDSPF_A1R5G5B5 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x7c00, 0x03e0, 0x001f, 0x8000 }; - const DDS_PIXELFORMAT DDSPF_A4R4G4B4 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x0f00, 0x00f0, 0x000f, 0xf000 }; + const DDS_PIXELFORMAT DDSPF_A4R4G4B4 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x0f00, 0x00f0, 0x000f, 0xf000 }; - const DDS_PIXELFORMAT DDSPF_L8 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 8, 0xff, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_L8 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 8, 0xff, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_L16 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 16, 0xffff, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_L16 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 16, 0xffff, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_A8L8 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 16, 0x00ff, 0, 0, 0xff00 }; + const DDS_PIXELFORMAT DDSPF_A8L8 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 16, 0x00ff, 0, 0, 0xff00 }; - const DDS_PIXELFORMAT DDSPF_A8 = - { sizeof(DDS_PIXELFORMAT), DDS_ALPHA, 0, 8, 0, 0, 0, 0xff }; + const DDS_PIXELFORMAT DDSPF_A8 = { sizeof(DDS_PIXELFORMAT), DDS_ALPHA, 0, 8, 0, 0, 0, 0xff }; - const DDS_PIXELFORMAT DDSPF_V8U8 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 16, 0x00ff, 0xff00, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_V8U8 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 16, 0x00ff, 0xff00, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_Q8W8V8U8 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; + const DDS_PIXELFORMAT DDSPF_Q8W8V8U8 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; - const DDS_PIXELFORMAT DDSPF_V16U16 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_V16U16 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; // DXGI_FORMAT_R10G10B10A2_UNORM should be written using DX10 extension to avoid D3DX 10:10:10:2 reversal issue // This indicates the DDS_HEADER_DXT10 extension is present (the format is in dxgiFormat) - const DDS_PIXELFORMAT DDSPF_DX10 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','1','0'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DX10 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', '1', '0'), 0, 0, 0, 0, 0 }; //----------------------------------------------------------------------------- - struct handle_closer { void operator()(HANDLE h) noexcept { if (h) CloseHandle(h); } }; + struct handle_closer + { + void operator()(HANDLE h) noexcept + { + if (h) + CloseHandle(h); + } + }; using ScopedHandle = std::unique_ptr; - inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } + inline HANDLE safe_handle(HANDLE h) noexcept + { + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; + } class auto_delete_file { public: - auto_delete_file(HANDLE hFile) noexcept : m_handle(hFile) {} + auto_delete_file(HANDLE hFile) noexcept + : m_handle(hFile) + {} ~auto_delete_file() { if (m_handle) { FILE_DISPOSITION_INFO info = {}; - info.DeleteFile = TRUE; - std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); + info.DeleteFile = TRUE; + std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); } } - auto_delete_file(const auto_delete_file&) = delete; + auto_delete_file(const auto_delete_file&) = delete; auto_delete_file& operator=(const auto_delete_file&) = delete; - auto_delete_file(const auto_delete_file&&) = delete; + auto_delete_file(const auto_delete_file&&) = delete; auto_delete_file& operator=(const auto_delete_file&&) = delete; void clear() noexcept { m_handle = nullptr; } @@ -252,7 +238,10 @@ namespace class auto_delete_file_wic { public: - auto_delete_file_wic(ComPtr& hFile, const wchar_t* szFile) noexcept : m_filename(szFile), m_handle(hFile) {} + auto_delete_file_wic(ComPtr& hFile, const wchar_t* szFile) noexcept + : m_filename(szFile), + m_handle(hFile) + {} ~auto_delete_file_wic() { if (m_filename) @@ -262,16 +251,16 @@ namespace } } - auto_delete_file_wic(const auto_delete_file_wic&) = delete; + auto_delete_file_wic(const auto_delete_file_wic&) = delete; auto_delete_file_wic& operator=(const auto_delete_file_wic&) = delete; - auto_delete_file_wic(const auto_delete_file_wic&&) = delete; + auto_delete_file_wic(const auto_delete_file_wic&&) = delete; auto_delete_file_wic& operator=(const auto_delete_file_wic&&) = delete; void clear() noexcept { m_filename = nullptr; } private: - const wchar_t* m_filename; + const wchar_t* m_filename; ComPtr& m_handle; }; @@ -285,14 +274,12 @@ namespace case DXGI_FORMAT_R32G32B32A32_TYPELESS: case DXGI_FORMAT_R32G32B32A32_FLOAT: case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - return 128; + case DXGI_FORMAT_R32G32B32A32_SINT: return 128; case DXGI_FORMAT_R32G32B32_TYPELESS: case DXGI_FORMAT_R32G32B32_FLOAT: case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return 96; + case DXGI_FORMAT_R32G32B32_SINT: return 96; case DXGI_FORMAT_R16G16B16A16_TYPELESS: case DXGI_FORMAT_R16G16B16A16_FLOAT: @@ -310,8 +297,7 @@ namespace case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: case DXGI_FORMAT_Y416: case DXGI_FORMAT_Y210: - case DXGI_FORMAT_Y216: - return 64; + case DXGI_FORMAT_Y216: return 64; case DXGI_FORMAT_R10G10B10A2_TYPELESS: case DXGI_FORMAT_R10G10B10A2_UNORM: @@ -350,12 +336,10 @@ namespace case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: case DXGI_FORMAT_AYUV: case DXGI_FORMAT_Y410: - case DXGI_FORMAT_YUY2: - return 32; + case DXGI_FORMAT_YUY2: return 32; case DXGI_FORMAT_P010: - case DXGI_FORMAT_P016: - return 24; + case DXGI_FORMAT_P016: return 24; case DXGI_FORMAT_R8G8_TYPELESS: case DXGI_FORMAT_R8G8_UNORM: @@ -372,13 +356,11 @@ namespace case DXGI_FORMAT_B5G6R5_UNORM: case DXGI_FORMAT_B5G5R5A1_UNORM: case DXGI_FORMAT_A8P8: - case DXGI_FORMAT_B4G4R4A4_UNORM: - return 16; + case DXGI_FORMAT_B4G4R4A4_UNORM: return 16; case DXGI_FORMAT_NV12: case DXGI_FORMAT_420_OPAQUE: - case DXGI_FORMAT_NV11: - return 12; + case DXGI_FORMAT_NV11: return 12; case DXGI_FORMAT_R8_TYPELESS: case DXGI_FORMAT_R8_UNORM: @@ -403,26 +385,21 @@ namespace case DXGI_FORMAT_BC7_UNORM_SRGB: case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: - case DXGI_FORMAT_P8: - return 8; + case DXGI_FORMAT_P8: return 8; - case DXGI_FORMAT_R1_UNORM: - return 1; + case DXGI_FORMAT_R1_UNORM: return 1; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - return 4; + case DXGI_FORMAT_BC4_SNORM: return 4; - default: - return 0; + default: return 0; } } - //-------------------------------------------------------------------------------------- // Determines if the format is block compressed //-------------------------------------------------------------------------------------- @@ -450,34 +427,30 @@ namespace case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return true; + case DXGI_FORMAT_BC7_UNORM_SRGB: return true; - default: - return false; + default: return false; } } - //-------------------------------------------------------------------------------------- // Get surface information for a particular format //-------------------------------------------------------------------------------------- - HRESULT GetSurfaceInfo( - _In_ size_t width, - _In_ size_t height, - _In_ DXGI_FORMAT fmt, - _Out_opt_ size_t* outNumBytes, - _Out_opt_ size_t* outRowBytes, - _Out_opt_ size_t* outNumRows) noexcept + HRESULT GetSurfaceInfo(_In_ size_t width, + _In_ size_t height, + _In_ DXGI_FORMAT fmt, + _Out_opt_ size_t* outNumBytes, + _Out_opt_ size_t* outRowBytes, + _Out_opt_ size_t* outNumRows) noexcept { uint64_t numBytes = 0; uint64_t rowBytes = 0; - uint64_t numRows = 0; + uint64_t numRows = 0; - bool bc = false; - bool packed = false; - bool planar = false; - size_t bpe = 0; + bool bc = false; + bool packed = false; + bool planar = false; + size_t bpe = 0; switch (fmt) { case DXGI_FORMAT_BC1_TYPELESS: @@ -486,7 +459,7 @@ namespace case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: case DXGI_FORMAT_BC4_SNORM: - bc = true; + bc = true; bpe = 8; break; @@ -505,7 +478,7 @@ namespace case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: case DXGI_FORMAT_BC7_UNORM_SRGB: - bc = true; + bc = true; bpe = 16; break; @@ -513,29 +486,28 @@ namespace case DXGI_FORMAT_G8R8_G8B8_UNORM: case DXGI_FORMAT_YUY2: packed = true; - bpe = 4; + bpe = 4; break; case DXGI_FORMAT_Y210: case DXGI_FORMAT_Y216: packed = true; - bpe = 8; + bpe = 8; break; case DXGI_FORMAT_NV12: case DXGI_FORMAT_420_OPAQUE: planar = true; - bpe = 2; + bpe = 2; break; case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: planar = true; - bpe = 4; + bpe = 4; break; - default: - break; + default: break; } if (bc) @@ -551,26 +523,26 @@ namespace numBlocksHigh = std::max(1u, (uint64_t(height) + 3u) / 4u); } rowBytes = numBlocksWide * bpe; - numRows = numBlocksHigh; + numRows = numBlocksHigh; numBytes = rowBytes * numBlocksHigh; } else if (packed) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } else if (fmt == DXGI_FORMAT_NV11) { rowBytes = ((uint64_t(width) + 3u) >> 2) * 4u; - numRows = uint64_t(height) * 2u; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data + numRows = uint64_t(height) * 2u; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data numBytes = rowBytes * numRows; } else if (planar) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; numBytes = (rowBytes * uint64_t(height)) + ((rowBytes * uint64_t(height) + 1u) >> 1); - numRows = height + ((uint64_t(height) + 1u) >> 1); + numRows = height + ((uint64_t(height) + 1u) >> 1); } else { @@ -579,17 +551,17 @@ namespace return E_INVALIDARG; rowBytes = (uint64_t(width) * bpp + 7u) / 8u; // round up to nearest byte - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } - #if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) +#if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) static_assert(sizeof(size_t) == 4, "Not a 32-bit platform!"); if (numBytes > UINT32_MAX || rowBytes > UINT32_MAX || numRows > UINT32_MAX) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - #else +#else static_assert(sizeof(size_t) == 8, "Not a 64-bit platform!"); - #endif +#endif if (outNumBytes) { @@ -607,7 +579,6 @@ namespace return S_OK; } - //-------------------------------------------------------------------------------------- DXGI_FORMAT EnsureNotTypeless(DXGI_FORMAT fmt) noexcept { @@ -637,13 +608,11 @@ namespace } } - //-------------------------------------------------------------------------------------- - HRESULT CaptureTexture( - _In_ ID3D11DeviceContext* pContext, - _In_ ID3D11Resource* pSource, - D3D11_TEXTURE2D_DESC& desc, - ComPtr& pStaging) noexcept + HRESULT CaptureTexture(_In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + D3D11_TEXTURE2D_DESC& desc, + ComPtr& pStaging) noexcept { if (!pContext || !pSource) return E_INVALIDARG; @@ -655,7 +624,7 @@ namespace return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); ComPtr pTexture; - HRESULT hr = pSource->QueryInterface(IID_ID3D11Texture2D, reinterpret_cast(pTexture.GetAddressOf())); + HRESULT hr = pSource->QueryInterface(IID_ID3D11Texture2D, reinterpret_cast(pTexture.GetAddressOf())); if (FAILED(hr)) return hr; @@ -669,7 +638,7 @@ namespace if (desc.SampleDesc.Count > 1) { // MSAA content must be resolved before being copied to a staging texture - desc.SampleDesc.Count = 1; + desc.SampleDesc.Count = 1; desc.SampleDesc.Quality = 0; ComPtr pTemp; @@ -682,7 +651,7 @@ namespace const DXGI_FORMAT fmt = EnsureNotTypeless(desc.Format); UINT support = 0; - hr = d3dDevice->CheckFormatSupport(fmt, &support); + hr = d3dDevice->CheckFormatSupport(fmt, &support); if (FAILED(hr)) return hr; @@ -701,7 +670,7 @@ namespace desc.BindFlags = 0; desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - desc.Usage = D3D11_USAGE_STAGING; + desc.Usage = D3D11_USAGE_STAGING; hr = d3dDevice->CreateTexture2D(&desc, nullptr, pStaging.ReleaseAndGetAddressOf()); if (FAILED(hr)) @@ -722,7 +691,7 @@ namespace desc.BindFlags = 0; desc.MiscFlags &= D3D11_RESOURCE_MISC_TEXTURECUBE; desc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; - desc.Usage = D3D11_USAGE_STAGING; + desc.Usage = D3D11_USAGE_STAGING; hr = d3dDevice->CreateTexture2D(&desc, nullptr, pStaging.ReleaseAndGetAddressOf()); if (FAILED(hr)) @@ -741,13 +710,7 @@ namespace BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID* ifactory) noexcept { - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - ifactory - ); + HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory2, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory2), ifactory); if (SUCCEEDED(hr)) { @@ -757,13 +720,7 @@ namespace } else { - hr = CoCreateInstance( - CLSID_WICImagingFactory1, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory), - ifactory - ); + hr = CoCreateInstance(CLSID_WICImagingFactory1, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory), ifactory); return SUCCEEDED(hr) ? TRUE : FALSE; } } @@ -773,10 +730,7 @@ namespace static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; IWICImagingFactory* factory = nullptr; - if (!InitOnceExecuteOnce(&s_initOnce, - InitializeWICFactory, - nullptr, - reinterpret_cast(&factory))) + if (!InitOnceExecuteOnce(&s_initOnce, InitializeWICFactory, nullptr, reinterpret_cast(&factory))) { return nullptr; } @@ -785,28 +739,22 @@ namespace } } // anonymous namespace - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveDDSTextureToFile( - ID3D11DeviceContext* pContext, - ID3D11Resource* pSource, - const wchar_t* fileName) noexcept +_Use_decl_annotations_ HRESULT DirectX::SaveDDSTextureToFile(ID3D11DeviceContext* pContext, + ID3D11Resource* pSource, + const wchar_t* fileName) noexcept { if (!fileName) return E_INVALIDARG; - D3D11_TEXTURE2D_DESC desc = {}; + D3D11_TEXTURE2D_DESC desc = {}; ComPtr pStaging; - HRESULT hr = CaptureTexture(pContext, pSource, desc, pStaging); + HRESULT hr = CaptureTexture(pContext, pSource, desc, pStaging); if (FAILED(hr)) return hr; // Create file - ScopedHandle hFile(safe_handle(CreateFile2( - fileName, - GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) return HRESULT_FROM_WIN32(GetLastError()); @@ -817,68 +765,105 @@ HRESULT DirectX::SaveDDSTextureToFile( *reinterpret_cast(&fileHeader[0]) = DDS_MAGIC; - auto header = reinterpret_cast(&fileHeader[0] + sizeof(uint32_t)); - size_t headerSize = DDS_MIN_HEADER_SIZE; - header->size = sizeof(DDS_HEADER); - header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP; - header->height = desc.Height; - header->width = desc.Width; + auto header = reinterpret_cast(&fileHeader[0] + sizeof(uint32_t)); + size_t headerSize = DDS_MIN_HEADER_SIZE; + header->size = sizeof(DDS_HEADER); + header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP; + header->height = desc.Height; + header->width = desc.Width; header->mipMapCount = 1; - header->caps = DDS_SURFACE_FLAGS_TEXTURE; + header->caps = DDS_SURFACE_FLAGS_TEXTURE; // Try to use a legacy .DDS pixel format for better tools support, otherwise fallback to 'DX10' header extension DDS_HEADER_DXT10* extHeader = nullptr; switch (desc.Format) { - case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R16G16_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R16_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC1_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC2_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC3_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC4_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC4_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC5_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC5_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B5G6R5_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R16G16_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.1 - case DXGI_FORMAT_B8G8R8X8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.1 - case DXGI_FORMAT_YUY2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.2 - case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.2 + case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R16G16_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R16_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_A8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC1_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC2_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC3_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC4_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC4_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC5_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC5_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B5G6R5_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R16G16_SNORM: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B8G8R8A8_UNORM: + memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); + break; // DXGI 1.1 + case DXGI_FORMAT_B8G8R8X8_UNORM: + memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); + break; // DXGI 1.1 + case DXGI_FORMAT_YUY2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break; // DXGI 1.2 + case DXGI_FORMAT_B4G4R4A4_UNORM: + memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); + break; // DXGI 1.2 // Legacy D3DX formats using D3DFMT enum value as FourCC - case DXGI_FORMAT_R32G32B32A32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 116; break; // D3DFMT_A32B32G32R32F - case DXGI_FORMAT_R16G16B16A16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 113; break; // D3DFMT_A16B16G16R16F - case DXGI_FORMAT_R16G16B16A16_UNORM: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 36; break; // D3DFMT_A16B16G16R16 - case DXGI_FORMAT_R16G16B16A16_SNORM: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 110; break; // D3DFMT_Q16W16V16U16 - case DXGI_FORMAT_R32G32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 115; break; // D3DFMT_G32R32F - case DXGI_FORMAT_R16G16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 112; break; // D3DFMT_G16R16F - case DXGI_FORMAT_R32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 114; break; // D3DFMT_R32F - case DXGI_FORMAT_R16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 111; break; // D3DFMT_R16F + case DXGI_FORMAT_R32G32B32A32_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 116; + break; // D3DFMT_A32B32G32R32F + case DXGI_FORMAT_R16G16B16A16_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 113; + break; // D3DFMT_A16B16G16R16F + case DXGI_FORMAT_R16G16B16A16_UNORM: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 36; + break; // D3DFMT_A16B16G16R16 + case DXGI_FORMAT_R16G16B16A16_SNORM: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 110; + break; // D3DFMT_Q16W16V16U16 + case DXGI_FORMAT_R32G32_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 115; + break; // D3DFMT_G32R32F + case DXGI_FORMAT_R16G16_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 112; + break; // D3DFMT_G16R16F + case DXGI_FORMAT_R32_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 114; + break; // D3DFMT_R32F + case DXGI_FORMAT_R16_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 111; + break; // D3DFMT_R16F case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: case DXGI_FORMAT_P8: - case DXGI_FORMAT_A8P8: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + case DXGI_FORMAT_A8P8: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); default: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DX10, sizeof(DDS_PIXELFORMAT)); headerSize += sizeof(DDS_HEADER_DXT10); - extHeader = reinterpret_cast(fileHeader + DDS_MIN_HEADER_SIZE); - extHeader->dxgiFormat = desc.Format; + extHeader = reinterpret_cast(fileHeader + DDS_MIN_HEADER_SIZE); + extHeader->dxgiFormat = desc.Format; extHeader->resourceDimension = D3D11_RESOURCE_DIMENSION_TEXTURE2D; - extHeader->arraySize = 1; + extHeader->arraySize = 1; break; } @@ -950,50 +935,46 @@ HRESULT DirectX::SaveDDSTextureToFile( } //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveWICTextureToFile( - ID3D11DeviceContext* pContext, - ID3D11Resource* pSource, - REFGUID guidContainerFormat, - const wchar_t* fileName, - const GUID* targetFormat, - std::function setCustomProps, - bool forceSRGB) +_Use_decl_annotations_ HRESULT DirectX::SaveWICTextureToFile(ID3D11DeviceContext* pContext, + ID3D11Resource* pSource, + REFGUID guidContainerFormat, + const wchar_t* fileName, + const GUID* targetFormat, + std::function setCustomProps, + bool forceSRGB) { if (!fileName) return E_INVALIDARG; - D3D11_TEXTURE2D_DESC desc = {}; + D3D11_TEXTURE2D_DESC desc = {}; ComPtr pStaging; - HRESULT hr = CaptureTexture(pContext, pSource, desc, pStaging); + HRESULT hr = CaptureTexture(pContext, pSource, desc, pStaging); if (FAILED(hr)) return hr; // Determine source format's WIC equivalent WICPixelFormatGUID pfGuid = {}; - bool sRGB = forceSRGB; + bool sRGB = forceSRGB; switch (desc.Format) { - case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break; - case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break; - case DXGI_FORMAT_R16G16B16A16_UNORM: pfGuid = GUID_WICPixelFormat64bppRGBA; break; - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102XR; break; // DXGI 1.1 - case DXGI_FORMAT_R10G10B10A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102; break; - case DXGI_FORMAT_B5G5R5A1_UNORM: pfGuid = GUID_WICPixelFormat16bppBGRA5551; break; - case DXGI_FORMAT_B5G6R5_UNORM: pfGuid = GUID_WICPixelFormat16bppBGR565; break; - case DXGI_FORMAT_R32_FLOAT: pfGuid = GUID_WICPixelFormat32bppGrayFloat; break; - case DXGI_FORMAT_R16_FLOAT: pfGuid = GUID_WICPixelFormat16bppGrayHalf; break; - case DXGI_FORMAT_R16_UNORM: pfGuid = GUID_WICPixelFormat16bppGray; break; - case DXGI_FORMAT_R8_UNORM: pfGuid = GUID_WICPixelFormat8bppGray; break; - case DXGI_FORMAT_A8_UNORM: pfGuid = GUID_WICPixelFormat8bppAlpha; break; - - case DXGI_FORMAT_R8G8B8A8_UNORM: - pfGuid = GUID_WICPixelFormat32bppRGBA; - break; + case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break; + case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break; + case DXGI_FORMAT_R16G16B16A16_UNORM: pfGuid = GUID_WICPixelFormat64bppRGBA; break; + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102XR; break; // DXGI 1.1 + case DXGI_FORMAT_R10G10B10A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102; break; + case DXGI_FORMAT_B5G5R5A1_UNORM: pfGuid = GUID_WICPixelFormat16bppBGRA5551; break; + case DXGI_FORMAT_B5G6R5_UNORM: pfGuid = GUID_WICPixelFormat16bppBGR565; break; + case DXGI_FORMAT_R32_FLOAT: pfGuid = GUID_WICPixelFormat32bppGrayFloat; break; + case DXGI_FORMAT_R16_FLOAT: pfGuid = GUID_WICPixelFormat16bppGrayHalf; break; + case DXGI_FORMAT_R16_UNORM: pfGuid = GUID_WICPixelFormat16bppGray; break; + case DXGI_FORMAT_R8_UNORM: pfGuid = GUID_WICPixelFormat8bppGray; break; + case DXGI_FORMAT_A8_UNORM: pfGuid = GUID_WICPixelFormat8bppAlpha; break; + + case DXGI_FORMAT_R8G8B8A8_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA; break; case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: pfGuid = GUID_WICPixelFormat32bppRGBA; - sRGB = true; + sRGB = true; break; case DXGI_FORMAT_B8G8R8A8_UNORM: // DXGI 1.1 @@ -1002,7 +983,7 @@ HRESULT DirectX::SaveWICTextureToFile( case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: // DXGI 1.1 pfGuid = GUID_WICPixelFormat32bppBGRA; - sRGB = true; + sRGB = true; break; case DXGI_FORMAT_B8G8R8X8_UNORM: // DXGI 1.1 @@ -1011,11 +992,10 @@ HRESULT DirectX::SaveWICTextureToFile( case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: // DXGI 1.1 pfGuid = GUID_WICPixelFormat32bppBGR; - sRGB = true; + sRGB = true; break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } auto pWIC = GetWIC(); @@ -1043,7 +1023,7 @@ HRESULT DirectX::SaveWICTextureToFile( return hr; ComPtr frame; - ComPtr props; + ComPtr props; hr = encoder->CreateNewFrame(frame.GetAddressOf(), props.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1055,9 +1035,9 @@ HRESULT DirectX::SaveWICTextureToFile( option.pstrName = const_cast(L"EnableV5Header32bppBGRA"); VARIANT varValue; - varValue.vt = VT_BOOL; + varValue.vt = VT_BOOL; varValue.boolVal = VARIANT_TRUE; - std::ignore = props->Write(1, &option, &varValue); + std::ignore = props->Write(1, &option, &varValue); } if (setCustomProps) @@ -1108,13 +1088,9 @@ HRESULT DirectX::SaveWICTextureToFile( case DXGI_FORMAT_R16_FLOAT: case DXGI_FORMAT_R16_UNORM: case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_A8_UNORM: - targetGuid = GUID_WICPixelFormat8bppGray; - break; + case DXGI_FORMAT_A8_UNORM: targetGuid = GUID_WICPixelFormat8bppGray; break; - default: - targetGuid = GUID_WICPixelFormat24bppBGR; - break; + default: targetGuid = GUID_WICPixelFormat24bppBGR; break; } } @@ -1135,7 +1111,7 @@ HRESULT DirectX::SaveWICTextureToFile( PROPVARIANT value; PropVariantInit(&value); - value.vt = VT_LPSTR; + value.vt = VT_LPSTR; value.pszVal = const_cast("DirectXTK"); if (memcmp(&guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID)) == 0) @@ -1146,16 +1122,16 @@ HRESULT DirectX::SaveWICTextureToFile( // Set sRGB chunk if (sRGB) { - value.vt = VT_UI1; - value.bVal = 0; + value.vt = VT_UI1; + value.bVal = 0; std::ignore = metawriter->SetMetadataByName(L"/sRGB/RenderingIntent", &value); } else { // add gAMA chunk with gamma 1.0 - value.vt = VT_UI4; + value.vt = VT_UI4; value.uintVal = 100000; // gama value * 100,000 -- i.e. gamma 1.0 - std::ignore = metawriter->SetMetadataByName(L"/gAMA/ImageGamma", &value); + std::ignore = metawriter->SetMetadataByName(L"/gAMA/ImageGamma", &value); // remove sRGB chunk which is added by default. std::ignore = metawriter->RemoveMetadataByName(L"/sRGB/RenderingIntent"); @@ -1169,7 +1145,7 @@ HRESULT DirectX::SaveWICTextureToFile( if (sRGB) { // Set EXIF Colorspace of sRGB - value.vt = VT_UI2; + value.vt = VT_UI2; value.uiVal = 1; std::ignore = metawriter->SetMetadataByName(L"System.Image.ColorSpace", &value); } @@ -1192,10 +1168,13 @@ HRESULT DirectX::SaveWICTextureToFile( { // Conversion required to write ComPtr source; - hr = pWIC->CreateBitmapFromMemory(desc.Width, desc.Height, + hr = pWIC->CreateBitmapFromMemory(desc.Width, + desc.Height, pfGuid, - mapped.RowPitch, static_cast(imageSize), - static_cast(mapped.pData), source.GetAddressOf()); + mapped.RowPitch, + static_cast(imageSize), + static_cast(mapped.pData), + source.GetAddressOf()); if (FAILED(hr)) { pContext->Unmap(pStaging.Get(), 0); @@ -1211,7 +1190,7 @@ HRESULT DirectX::SaveWICTextureToFile( } BOOL canConvert = FALSE; - hr = FC->CanConvert(pfGuid, targetGuid, &canConvert); + hr = FC->CanConvert(pfGuid, targetGuid, &canConvert); if (FAILED(hr) || !canConvert) { pContext->Unmap(pStaging.Get(), 0); @@ -1226,14 +1205,12 @@ HRESULT DirectX::SaveWICTextureToFile( } WICRect rect = { 0, 0, static_cast(desc.Width), static_cast(desc.Height) }; - hr = frame->WriteSource(FC.Get(), &rect); + hr = frame->WriteSource(FC.Get(), &rect); } else { // No conversion required - hr = frame->WritePixels(desc.Height, - mapped.RowPitch, static_cast(imageSize), - static_cast(mapped.pData)); + hr = frame->WritePixels(desc.Height, mapped.RowPitch, static_cast(imageSize), static_cast(mapped.pData)); } pContext->Unmap(pStaging.Get(), 0); diff --git a/ScreenGrab/ScreenGrab11.h b/ScreenGrab/ScreenGrab11.h index 138c0053..34ffbcdd 100644 --- a/ScreenGrab/ScreenGrab11.h +++ b/ScreenGrab/ScreenGrab11.h @@ -27,20 +27,16 @@ #include - namespace DirectX { - HRESULT __cdecl SaveDDSTextureToFile( - _In_ ID3D11DeviceContext* pContext, - _In_ ID3D11Resource* pSource, - _In_z_ const wchar_t* fileName) noexcept; + HRESULT __cdecl + SaveDDSTextureToFile(_In_ ID3D11DeviceContext* pContext, _In_ ID3D11Resource* pSource, _In_z_ const wchar_t* fileName) noexcept; - HRESULT __cdecl SaveWICTextureToFile( - _In_ ID3D11DeviceContext* pContext, - _In_ ID3D11Resource* pSource, - _In_ REFGUID guidContainerFormat, - _In_z_ const wchar_t* fileName, - _In_opt_ const GUID* targetFormat = nullptr, - _In_ std::function setCustomProps = nullptr, - _In_ bool forceSRGB = false); -} + HRESULT __cdecl SaveWICTextureToFile(_In_ ID3D11DeviceContext* pContext, + _In_ ID3D11Resource* pSource, + _In_ REFGUID guidContainerFormat, + _In_z_ const wchar_t* fileName, + _In_opt_ const GUID* targetFormat = nullptr, + _In_ std::function setCustomProps = nullptr, + _In_ bool forceSRGB = false); +} // namespace DirectX diff --git a/ScreenGrab/ScreenGrab12.cpp b/ScreenGrab/ScreenGrab12.cpp index b199d3ac..bc56f961 100644 --- a/ScreenGrab/ScreenGrab12.cpp +++ b/ScreenGrab/ScreenGrab12.cpp @@ -74,9 +74,8 @@ using Microsoft::WRL::ComPtr; // Macros //-------------------------------------------------------------------------------------- #ifndef MAKEFOURCC -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | \ - ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 )) +#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24)) #endif /* defined(MAKEFOURCC) */ // HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW) @@ -92,36 +91,36 @@ using Microsoft::WRL::ComPtr; //-------------------------------------------------------------------------------------- namespace { -#pragma pack(push,1) +#pragma pack(push, 1) constexpr uint32_t DDS_MAGIC = 0x20534444; // "DDS " struct DDS_PIXELFORMAT { - uint32_t size; - uint32_t flags; - uint32_t fourCC; - uint32_t RGBBitCount; - uint32_t RBitMask; - uint32_t GBitMask; - uint32_t BBitMask; - uint32_t ABitMask; + uint32_t size; + uint32_t flags; + uint32_t fourCC; + uint32_t RGBBitCount; + uint32_t RBitMask; + uint32_t GBitMask; + uint32_t BBitMask; + uint32_t ABitMask; }; -#define DDS_FOURCC 0x00000004 // DDPF_FOURCC -#define DDS_RGB 0x00000040 // DDPF_RGB -#define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS -#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE -#define DDS_LUMINANCEA 0x00020001 // DDPF_LUMINANCE | DDPF_ALPHAPIXELS -#define DDS_ALPHA 0x00000002 // DDPF_ALPHA -#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV +#define DDS_FOURCC 0x00000004 // DDPF_FOURCC +#define DDS_RGB 0x00000040 // DDPF_RGB +#define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS +#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE +#define DDS_LUMINANCEA 0x00020001 // DDPF_LUMINANCE | DDPF_ALPHAPIXELS +#define DDS_ALPHA 0x00000002 // DDPF_ALPHA +#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV -#define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT -#define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT -#define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH -#define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE +#define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT +#define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT +#define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH +#define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE -#define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE +#define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE struct DDS_HEADER { @@ -143,11 +142,11 @@ namespace struct DDS_HEADER_DXT10 { - DXGI_FORMAT dxgiFormat; - uint32_t resourceDimension; - uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG - uint32_t arraySize; - uint32_t reserved; + DXGI_FORMAT dxgiFormat; + uint32_t resourceDimension; + uint32_t miscFlag; // see D3D11_RESOURCE_MISC_FLAG + uint32_t arraySize; + uint32_t reserved; }; static_assert(sizeof(DDS_PIXELFORMAT) == 32, "DDS pixel format size mismatch"); @@ -156,114 +155,101 @@ namespace #pragma pack(pop) - constexpr size_t DDS_MIN_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); + constexpr size_t DDS_MIN_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); constexpr size_t DDS_DX10_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER) + sizeof(DDS_HEADER_DXT10); static_assert(DDS_DX10_HEADER_SIZE > DDS_MIN_HEADER_SIZE, "DDS DX10 Header should be larger than standard header"); - const DDS_PIXELFORMAT DDSPF_DXT1 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','1'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT1 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '1'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_DXT3 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','3'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT3 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '3'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_DXT5 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','5'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT5 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '5'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_BC4_UNORM = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','4','U'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_BC4_UNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B', 'C', '4', 'U'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_BC4_SNORM = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','4','S'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_BC4_SNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B', 'C', '4', 'S'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_BC5_UNORM = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','5','U'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_BC5_UNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B', 'C', '5', 'U'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_BC5_SNORM = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B','C','5','S'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_BC5_SNORM = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('B', 'C', '5', 'S'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_R8G8_B8G8 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('R','G','B','G'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_R8G8_B8G8 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('R', 'G', 'B', 'G'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_G8R8_G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('G','R','G','B'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_G8R8_G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('G', 'R', 'G', 'B'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_YUY2 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('Y','U','Y','2'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_YUY2 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('Y', 'U', 'Y', '2'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_A8R8G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; + const DDS_PIXELFORMAT DDSPF_A8R8G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; - const DDS_PIXELFORMAT DDSPF_X8R8G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0 }; + const DDS_PIXELFORMAT DDSPF_X8R8G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0 }; - const DDS_PIXELFORMAT DDSPF_A8B8G8R8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; + const DDS_PIXELFORMAT DDSPF_A8B8G8R8 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; - const DDS_PIXELFORMAT DDSPF_G16R16 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_G16R16 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_R5G6B5 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0xf800, 0x07e0, 0x001f, 0 }; + const DDS_PIXELFORMAT DDSPF_R5G6B5 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0xf800, 0x07e0, 0x001f, 0 }; - const DDS_PIXELFORMAT DDSPF_A1R5G5B5 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x7c00, 0x03e0, 0x001f, 0x8000 }; + const DDS_PIXELFORMAT DDSPF_A1R5G5B5 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x7c00, 0x03e0, 0x001f, 0x8000 }; - const DDS_PIXELFORMAT DDSPF_A4R4G4B4 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x0f00, 0x00f0, 0x000f, 0xf000 }; + const DDS_PIXELFORMAT DDSPF_A4R4G4B4 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x0f00, 0x00f0, 0x000f, 0xf000 }; - const DDS_PIXELFORMAT DDSPF_L8 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 8, 0xff, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_L8 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 8, 0xff, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_L16 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 16, 0xffff, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_L16 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 16, 0xffff, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_A8L8 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 16, 0x00ff, 0, 0, 0xff00 }; + const DDS_PIXELFORMAT DDSPF_A8L8 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 16, 0x00ff, 0, 0, 0xff00 }; - const DDS_PIXELFORMAT DDSPF_A8 = - { sizeof(DDS_PIXELFORMAT), DDS_ALPHA, 0, 8, 0, 0, 0, 0xff }; + const DDS_PIXELFORMAT DDSPF_A8 = { sizeof(DDS_PIXELFORMAT), DDS_ALPHA, 0, 8, 0, 0, 0, 0xff }; - const DDS_PIXELFORMAT DDSPF_V8U8 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 16, 0x00ff, 0xff00, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_V8U8 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 16, 0x00ff, 0xff00, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_Q8W8V8U8 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; + const DDS_PIXELFORMAT DDSPF_Q8W8V8U8 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; - const DDS_PIXELFORMAT DDSPF_V16U16 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_V16U16 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; // DXGI_FORMAT_R10G10B10A2_UNORM should be written using DX10 extension to avoid D3DX 10:10:10:2 reversal issue // This indicates the DDS_HEADER_DXT10 extension is present (the format is in dxgiFormat) - const DDS_PIXELFORMAT DDSPF_DX10 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','1','0'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DX10 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', '1', '0'), 0, 0, 0, 0, 0 }; //----------------------------------------------------------------------------- #ifdef _WIN32 - struct handle_closer { void operator()(HANDLE h) noexcept { if (h) CloseHandle(h); } }; + struct handle_closer + { + void operator()(HANDLE h) noexcept + { + if (h) + CloseHandle(h); + } + }; using ScopedHandle = std::unique_ptr; - inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } + inline HANDLE safe_handle(HANDLE h) noexcept + { + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; + } class auto_delete_file { public: - auto_delete_file(HANDLE hFile) noexcept : m_handle(hFile) {} + auto_delete_file(HANDLE hFile) noexcept + : m_handle(hFile) + {} ~auto_delete_file() { if (m_handle) { FILE_DISPOSITION_INFO info = {}; - info.DeleteFile = TRUE; - std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); + info.DeleteFile = TRUE; + std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); } } - auto_delete_file(const auto_delete_file&) = delete; + auto_delete_file(const auto_delete_file&) = delete; auto_delete_file& operator=(const auto_delete_file&) = delete; - auto_delete_file(const auto_delete_file&&) = delete; + auto_delete_file(const auto_delete_file&&) = delete; auto_delete_file& operator=(const auto_delete_file&&) = delete; void clear() noexcept { m_handle = nullptr; } @@ -275,7 +261,10 @@ namespace class auto_delete_file_wic { public: - auto_delete_file_wic(ComPtr& hFile, const wchar_t* szFile) noexcept : m_filename(szFile), m_handle(hFile) {} + auto_delete_file_wic(ComPtr& hFile, const wchar_t* szFile) noexcept + : m_filename(szFile), + m_handle(hFile) + {} ~auto_delete_file_wic() { if (m_filename) @@ -285,16 +274,16 @@ namespace } } - auto_delete_file_wic(const auto_delete_file_wic&) = delete; + auto_delete_file_wic(const auto_delete_file_wic&) = delete; auto_delete_file_wic& operator=(const auto_delete_file_wic&) = delete; - auto_delete_file_wic(const auto_delete_file_wic&&) = delete; + auto_delete_file_wic(const auto_delete_file_wic&&) = delete; auto_delete_file_wic& operator=(const auto_delete_file_wic&&) = delete; void clear() noexcept { m_filename = nullptr; } private: - const wchar_t* m_filename; + const wchar_t* m_filename; ComPtr& m_handle; }; #endif @@ -309,14 +298,12 @@ namespace case DXGI_FORMAT_R32G32B32A32_TYPELESS: case DXGI_FORMAT_R32G32B32A32_FLOAT: case DXGI_FORMAT_R32G32B32A32_UINT: - case DXGI_FORMAT_R32G32B32A32_SINT: - return 128; + case DXGI_FORMAT_R32G32B32A32_SINT: return 128; case DXGI_FORMAT_R32G32B32_TYPELESS: case DXGI_FORMAT_R32G32B32_FLOAT: case DXGI_FORMAT_R32G32B32_UINT: - case DXGI_FORMAT_R32G32B32_SINT: - return 96; + case DXGI_FORMAT_R32G32B32_SINT: return 96; case DXGI_FORMAT_R16G16B16A16_TYPELESS: case DXGI_FORMAT_R16G16B16A16_FLOAT: @@ -334,8 +321,7 @@ namespace case DXGI_FORMAT_X32_TYPELESS_G8X24_UINT: case DXGI_FORMAT_Y416: case DXGI_FORMAT_Y210: - case DXGI_FORMAT_Y216: - return 64; + case DXGI_FORMAT_Y216: return 64; case DXGI_FORMAT_R10G10B10A2_TYPELESS: case DXGI_FORMAT_R10G10B10A2_UNORM: @@ -374,13 +360,11 @@ namespace case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: case DXGI_FORMAT_AYUV: case DXGI_FORMAT_Y410: - case DXGI_FORMAT_YUY2: - return 32; + case DXGI_FORMAT_YUY2: return 32; case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: - case DXGI_FORMAT_V408: - return 24; + case DXGI_FORMAT_V408: return 24; case DXGI_FORMAT_R8G8_TYPELESS: case DXGI_FORMAT_R8G8_UNORM: @@ -399,13 +383,11 @@ namespace case DXGI_FORMAT_A8P8: case DXGI_FORMAT_B4G4R4A4_UNORM: case DXGI_FORMAT_P208: - case DXGI_FORMAT_V208: - return 16; + case DXGI_FORMAT_V208: return 16; case DXGI_FORMAT_NV12: case DXGI_FORMAT_420_OPAQUE: - case DXGI_FORMAT_NV11: - return 12; + case DXGI_FORMAT_NV11: return 12; case DXGI_FORMAT_R8_TYPELESS: case DXGI_FORMAT_R8_UNORM: @@ -430,26 +412,21 @@ namespace case DXGI_FORMAT_BC7_UNORM_SRGB: case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: - case DXGI_FORMAT_P8: - return 8; + case DXGI_FORMAT_P8: return 8; - case DXGI_FORMAT_R1_UNORM: - return 1; + case DXGI_FORMAT_R1_UNORM: return 1; case DXGI_FORMAT_BC1_TYPELESS: case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - return 4; + case DXGI_FORMAT_BC4_SNORM: return 4; - default: - return 0; + default: return 0; } } - //-------------------------------------------------------------------------------------- // Determines if the format is block compressed //-------------------------------------------------------------------------------------- @@ -477,34 +454,30 @@ namespace case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - return true; + case DXGI_FORMAT_BC7_UNORM_SRGB: return true; - default: - return false; + default: return false; } } - //-------------------------------------------------------------------------------------- // Get surface information for a particular format //-------------------------------------------------------------------------------------- - HRESULT GetSurfaceInfo( - _In_ size_t width, - _In_ size_t height, - _In_ DXGI_FORMAT fmt, - _Out_opt_ size_t* outNumBytes, - _Out_opt_ size_t* outRowBytes, - _Out_opt_ size_t* outNumRows) noexcept + HRESULT GetSurfaceInfo(_In_ size_t width, + _In_ size_t height, + _In_ DXGI_FORMAT fmt, + _Out_opt_ size_t* outNumBytes, + _Out_opt_ size_t* outRowBytes, + _Out_opt_ size_t* outNumRows) noexcept { uint64_t numBytes = 0; uint64_t rowBytes = 0; - uint64_t numRows = 0; + uint64_t numRows = 0; - bool bc = false; - bool packed = false; - bool planar = false; - size_t bpe = 0; + bool bc = false; + bool packed = false; + bool planar = false; + size_t bpe = 0; switch (fmt) { case DXGI_FORMAT_BC1_TYPELESS: @@ -513,7 +486,7 @@ namespace case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: case DXGI_FORMAT_BC4_SNORM: - bc = true; + bc = true; bpe = 8; break; @@ -532,7 +505,7 @@ namespace case DXGI_FORMAT_BC7_TYPELESS: case DXGI_FORMAT_BC7_UNORM: case DXGI_FORMAT_BC7_UNORM_SRGB: - bc = true; + bc = true; bpe = 16; break; @@ -540,30 +513,29 @@ namespace case DXGI_FORMAT_G8R8_G8B8_UNORM: case DXGI_FORMAT_YUY2: packed = true; - bpe = 4; + bpe = 4; break; case DXGI_FORMAT_Y210: case DXGI_FORMAT_Y216: packed = true; - bpe = 8; + bpe = 8; break; case DXGI_FORMAT_NV12: case DXGI_FORMAT_420_OPAQUE: case DXGI_FORMAT_P208: planar = true; - bpe = 2; + bpe = 2; break; case DXGI_FORMAT_P010: case DXGI_FORMAT_P016: planar = true; - bpe = 4; + bpe = 4; break; - default: - break; + default: break; } if (bc) @@ -579,26 +551,26 @@ namespace numBlocksHigh = std::max(1u, (uint64_t(height) + 3u) / 4u); } rowBytes = numBlocksWide * bpe; - numRows = numBlocksHigh; + numRows = numBlocksHigh; numBytes = rowBytes * numBlocksHigh; } else if (packed) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } else if (fmt == DXGI_FORMAT_NV11) { rowBytes = ((uint64_t(width) + 3u) >> 2) * 4u; - numRows = uint64_t(height) * 2u; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data + numRows = uint64_t(height) * 2u; // Direct3D makes this simplifying assumption, although it is larger than the 4:1:1 data numBytes = rowBytes * numRows; } else if (planar) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; numBytes = (rowBytes * uint64_t(height)) + ((rowBytes * uint64_t(height) + 1u) >> 1); - numRows = height + ((uint64_t(height) + 1u) >> 1); + numRows = height + ((uint64_t(height) + 1u) >> 1); } else { @@ -607,17 +579,17 @@ namespace return E_INVALIDARG; rowBytes = (uint64_t(width) * bpp + 7u) / 8u; // round up to nearest byte - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } - #if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) +#if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) static_assert(sizeof(size_t) == 4, "Not a 32-bit platform!"); if (numBytes > UINT32_MAX || rowBytes > UINT32_MAX || numRows > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; - #else +#else static_assert(sizeof(size_t) == 8, "Not a 64-bit platform!"); - #endif +#endif if (outNumBytes) { @@ -635,7 +607,6 @@ namespace return S_OK; } - //-------------------------------------------------------------------------------------- DXGI_FORMAT EnsureNotTypeless(DXGI_FORMAT fmt) noexcept { @@ -665,13 +636,11 @@ namespace } } - //-------------------------------------------------------------------------------------- - inline void TransitionResource( - _In_ ID3D12GraphicsCommandList* commandList, - _In_ ID3D12Resource* resource, - _In_ D3D12_RESOURCE_STATES stateBefore, - _In_ D3D12_RESOURCE_STATES stateAfter) noexcept + inline void TransitionResource(_In_ ID3D12GraphicsCommandList* commandList, + _In_ ID3D12Resource* resource, + _In_ D3D12_RESOURCE_STATES stateBefore, + _In_ D3D12_RESOURCE_STATES stateAfter) noexcept { assert(commandList != nullptr); assert(resource != nullptr); @@ -680,25 +649,24 @@ namespace return; D3D12_RESOURCE_BARRIER desc = {}; - desc.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; - desc.Transition.pResource = resource; + desc.Type = D3D12_RESOURCE_BARRIER_TYPE_TRANSITION; + desc.Transition.pResource = resource; desc.Transition.Subresource = D3D12_RESOURCE_BARRIER_ALL_SUBRESOURCES; desc.Transition.StateBefore = stateBefore; - desc.Transition.StateAfter = stateAfter; + desc.Transition.StateAfter = stateAfter; commandList->ResourceBarrier(1, &desc); } - //-------------------------------------------------------------------------------------- HRESULT CaptureTexture(_In_ ID3D12Device* device, - _In_ ID3D12CommandQueue* pCommandQ, - _In_ ID3D12Resource* pSource, - UINT64 srcPitch, - const D3D12_RESOURCE_DESC& desc, - _COM_Outptr_ ID3D12Resource** pStaging, - D3D12_RESOURCE_STATES beforeState, - D3D12_RESOURCE_STATES afterState) noexcept + _In_ ID3D12CommandQueue* pCommandQ, + _In_ ID3D12Resource* pSource, + UINT64 srcPitch, + const D3D12_RESOURCE_DESC& desc, + _COM_Outptr_ ID3D12Resource** pStaging, + D3D12_RESOURCE_STATES beforeState, + D3D12_RESOURCE_STATES afterState) noexcept { if (pStaging) { @@ -719,7 +687,7 @@ namespace return HRESULT_E_NOT_SUPPORTED; D3D12_HEAP_PROPERTIES sourceHeapProperties; - HRESULT hr = pSource->GetHeapProperties(&sourceHeapProperties, nullptr); + HRESULT hr = pSource->GetHeapProperties(&sourceHeapProperties, nullptr); if (SUCCEEDED(hr) && sourceHeapProperties.Type == D3D12_HEAP_TYPE_READBACK) { // Handle case where the source is already a staging texture we can use directly @@ -730,13 +698,20 @@ namespace // Create a command allocator ComPtr commandAlloc; - hr = device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, IID_ID3D12CommandAllocator, reinterpret_cast(commandAlloc.GetAddressOf())); + hr = device->CreateCommandAllocator(D3D12_COMMAND_LIST_TYPE_DIRECT, + IID_ID3D12CommandAllocator, + reinterpret_cast(commandAlloc.GetAddressOf())); if (FAILED(hr)) return hr; // Spin up a new command list ComPtr commandList; - hr = device->CreateCommandList(0, D3D12_COMMAND_LIST_TYPE_DIRECT, commandAlloc.Get(), nullptr, IID_ID3D12GraphicsCommandList, reinterpret_cast(commandList.GetAddressOf())); + hr = device->CreateCommandList(0, + D3D12_COMMAND_LIST_TYPE_DIRECT, + commandAlloc.Get(), + nullptr, + IID_ID3D12GraphicsCommandList, + reinterpret_cast(commandList.GetAddressOf())); if (FAILED(hr)) return hr; @@ -753,31 +728,30 @@ namespace // Readback resources must be buffers D3D12_RESOURCE_DESC bufferDesc = {}; - bufferDesc.DepthOrArraySize = 1; - bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; - bufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE; - bufferDesc.Format = DXGI_FORMAT_UNKNOWN; - bufferDesc.Height = 1; - bufferDesc.Width = srcPitch * desc.Height; - bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; - bufferDesc.MipLevels = 1; - bufferDesc.SampleDesc.Count = 1; + bufferDesc.DepthOrArraySize = 1; + bufferDesc.Dimension = D3D12_RESOURCE_DIMENSION_BUFFER; + bufferDesc.Flags = D3D12_RESOURCE_FLAG_NONE; + bufferDesc.Format = DXGI_FORMAT_UNKNOWN; + bufferDesc.Height = 1; + bufferDesc.Width = srcPitch * desc.Height; + bufferDesc.Layout = D3D12_TEXTURE_LAYOUT_ROW_MAJOR; + bufferDesc.MipLevels = 1; + bufferDesc.SampleDesc.Count = 1; ComPtr copySource(pSource); - D3D12_RESOURCE_STATES beforeStateSource = beforeState; + D3D12_RESOURCE_STATES beforeStateSource = beforeState; if (desc.SampleDesc.Count > 1) { TransitionResource(commandList.Get(), pSource, beforeState, D3D12_RESOURCE_STATE_RESOLVE_SOURCE); // MSAA content must be resolved before being copied to a staging texture - auto descCopy = desc; - descCopy.SampleDesc.Count = 1; + auto descCopy = desc; + descCopy.SampleDesc.Count = 1; descCopy.SampleDesc.Quality = 0; - descCopy.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; + descCopy.Alignment = D3D12_DEFAULT_RESOURCE_PLACEMENT_ALIGNMENT; ComPtr pTemp; - hr = device->CreateCommittedResource( - &defaultHeapProperties, + hr = device->CreateCommittedResource(&defaultHeapProperties, D3D12_HEAP_FLAG_NONE, &descCopy, D3D12_RESOURCE_STATE_RESOLVE_DEST, @@ -808,7 +782,7 @@ namespace } } - copySource = pTemp; + copySource = pTemp; beforeState = D3D12_RESOURCE_STATE_RESOLVE_DEST; } else @@ -817,8 +791,7 @@ namespace } // Create a staging texture - hr = device->CreateCommittedResource( - &readBackHeapProperties, + hr = device->CreateCommittedResource(&readBackHeapProperties, D3D12_HEAP_FLAG_NONE, &bufferDesc, D3D12_RESOURCE_STATE_COPY_DEST, @@ -836,11 +809,11 @@ namespace // Get the copy target location D3D12_PLACED_SUBRESOURCE_FOOTPRINT bufferFootprint = {}; - bufferFootprint.Footprint.Width = static_cast(desc.Width); - bufferFootprint.Footprint.Height = desc.Height; - bufferFootprint.Footprint.Depth = 1; - bufferFootprint.Footprint.RowPitch = static_cast(srcPitch); - bufferFootprint.Footprint.Format = desc.Format; + bufferFootprint.Footprint.Width = static_cast(desc.Width); + bufferFootprint.Footprint.Height = desc.Height; + bufferFootprint.Footprint.Depth = 1; + bufferFootprint.Footprint.RowPitch = static_cast(srcPitch); + bufferFootprint.Footprint.Format = desc.Format; const CD3DX12_TEXTURE_COPY_LOCATION copyDest(*pStaging, bufferFootprint); const CD3DX12_TEXTURE_COPY_LOCATION copySrc(copySource.Get(), 0); @@ -874,11 +847,11 @@ namespace // Block until the copy is complete while (fence->GetCompletedValue() < 1) { - #ifdef _WIN32 +#ifdef _WIN32 SwitchToThread(); - #else +#else std::this_thread::yield(); - #endif +#endif } return S_OK; @@ -887,12 +860,10 @@ namespace #ifdef _WIN32 BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID* ifactory) noexcept { - return SUCCEEDED(CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - ifactory)) ? TRUE : FALSE; + return SUCCEEDED( + CoCreateInstance(CLSID_WICImagingFactory2, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory2), ifactory)) ? + TRUE : + FALSE; } IWICImagingFactory2* GetWIC() noexcept @@ -900,10 +871,7 @@ namespace static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; IWICImagingFactory2* factory = nullptr; - if (!InitOnceExecuteOnce(&s_initOnce, - InitializeWICFactory, - nullptr, - reinterpret_cast(&factory))) + if (!InitOnceExecuteOnce(&s_initOnce, InitializeWICFactory, nullptr, reinterpret_cast(&factory))) { return nullptr; } @@ -913,15 +881,12 @@ namespace #endif } // anonymous namespace - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveDDSTextureToFile( - ID3D12CommandQueue* pCommandQ, - ID3D12Resource* pSource, - const wchar_t* fileName, - D3D12_RESOURCE_STATES beforeState, - D3D12_RESOURCE_STATES afterState) noexcept +_Use_decl_annotations_ HRESULT DirectX::SaveDDSTextureToFile(ID3D12CommandQueue* pCommandQ, + ID3D12Resource* pSource, + const wchar_t* fileName, + D3D12_RESOURCE_STATES beforeState, + D3D12_RESOURCE_STATES afterState) noexcept { if (!fileName) return E_INVALIDARG; @@ -934,25 +899,17 @@ HRESULT DirectX::SaveDDSTextureToFile( const auto desc = pSource->GetDesc(); #else D3D12_RESOURCE_DESC tmpDesc; - const auto& desc = *pSource->GetDesc(&tmpDesc); + const auto& desc = *pSource->GetDesc(&tmpDesc); #endif if (desc.Width > UINT32_MAX) return E_INVALIDARG; UINT64 totalResourceSize = 0; - UINT64 fpRowPitch = 0; - UINT fpRowCount = 0; + UINT64 fpRowPitch = 0; + UINT fpRowCount = 0; // Get the rowcount, pitch and size of the top mip - device->GetCopyableFootprints( - &desc, - 0, - 1, - 0, - nullptr, - &fpRowCount, - &fpRowPitch, - &totalResourceSize); + device->GetCopyableFootprints(&desc, 0, 1, 0, nullptr, &fpRowCount, &fpRowPitch, &totalResourceSize); // Round up the srcPitch to multiples of 256 const UINT64 dstRowPitch = (fpRowPitch + 255) & ~0xFFu; @@ -967,10 +924,7 @@ HRESULT DirectX::SaveDDSTextureToFile( // Create file #ifdef _WIN32 - ScopedHandle hFile(safe_handle(CreateFile2( - fileName, - GENERIC_WRITE, 0, CREATE_ALWAYS, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) return HRESULT_FROM_WIN32(GetLastError()); @@ -986,68 +940,101 @@ HRESULT DirectX::SaveDDSTextureToFile( *reinterpret_cast(&fileHeader[0]) = DDS_MAGIC; - auto header = reinterpret_cast(&fileHeader[0] + sizeof(uint32_t)); - size_t headerSize = DDS_MIN_HEADER_SIZE; - header->size = sizeof(DDS_HEADER); - header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP; - header->height = desc.Height; - header->width = static_cast(desc.Width); + auto header = reinterpret_cast(&fileHeader[0] + sizeof(uint32_t)); + size_t headerSize = DDS_MIN_HEADER_SIZE; + header->size = sizeof(DDS_HEADER); + header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP; + header->height = desc.Height; + header->width = static_cast(desc.Width); header->mipMapCount = 1; - header->caps = DDS_SURFACE_FLAGS_TEXTURE; + header->caps = DDS_SURFACE_FLAGS_TEXTURE; // Try to use a legacy .DDS pixel format for better tools support, otherwise fallback to 'DX10' header extension DDS_HEADER_DXT10* extHeader = nullptr; switch (desc.Format) { - case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy(&header->ddspf, &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R16G16_UNORM: memcpy(&header->ddspf, &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8_UNORM: memcpy(&header->ddspf, &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R16_UNORM: memcpy(&header->ddspf, &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8_UNORM: memcpy(&header->ddspf, &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_A8_UNORM: memcpy(&header->ddspf, &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy(&header->ddspf, &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy(&header->ddspf, &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC1_UNORM: memcpy(&header->ddspf, &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC2_UNORM: memcpy(&header->ddspf, &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC3_UNORM: memcpy(&header->ddspf, &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC4_UNORM: memcpy(&header->ddspf, &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC4_SNORM: memcpy(&header->ddspf, &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC5_UNORM: memcpy(&header->ddspf, &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_BC5_SNORM: memcpy(&header->ddspf, &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B5G6R5_UNORM: memcpy(&header->ddspf, &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy(&header->ddspf, &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8_SNORM: memcpy(&header->ddspf, &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy(&header->ddspf, &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_R16G16_SNORM: memcpy(&header->ddspf, &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy(&header->ddspf, &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B8G8R8X8_UNORM: memcpy(&header->ddspf, &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_YUY2: memcpy(&header->ddspf, &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break; - case DXGI_FORMAT_B4G4R4A4_UNORM: memcpy(&header->ddspf, &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8B8A8_UNORM: memcpy(&header->ddspf, &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R16G16_UNORM: memcpy(&header->ddspf, &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8_UNORM: memcpy(&header->ddspf, &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R16_UNORM: memcpy(&header->ddspf, &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8_UNORM: memcpy(&header->ddspf, &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_A8_UNORM: memcpy(&header->ddspf, &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8_B8G8_UNORM: memcpy(&header->ddspf, &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_G8R8_G8B8_UNORM: memcpy(&header->ddspf, &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC1_UNORM: memcpy(&header->ddspf, &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC2_UNORM: memcpy(&header->ddspf, &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC3_UNORM: memcpy(&header->ddspf, &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC4_UNORM: memcpy(&header->ddspf, &DDSPF_BC4_UNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC4_SNORM: memcpy(&header->ddspf, &DDSPF_BC4_SNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC5_UNORM: memcpy(&header->ddspf, &DDSPF_BC5_UNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_BC5_SNORM: memcpy(&header->ddspf, &DDSPF_BC5_SNORM, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B5G6R5_UNORM: memcpy(&header->ddspf, &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B5G5R5A1_UNORM: memcpy(&header->ddspf, &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8_SNORM: memcpy(&header->ddspf, &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R8G8B8A8_SNORM: memcpy(&header->ddspf, &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_R16G16_SNORM: memcpy(&header->ddspf, &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B8G8R8A8_UNORM: memcpy(&header->ddspf, &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B8G8R8X8_UNORM: memcpy(&header->ddspf, &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_YUY2: memcpy(&header->ddspf, &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break; + case DXGI_FORMAT_B4G4R4A4_UNORM: + memcpy(&header->ddspf, &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); + break; // Legacy D3DX formats using D3DFMT enum value as FourCC - case DXGI_FORMAT_R32G32B32A32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 116; break; // D3DFMT_A32B32G32R32F - case DXGI_FORMAT_R16G16B16A16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 113; break; // D3DFMT_A16B16G16R16F - case DXGI_FORMAT_R16G16B16A16_UNORM: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 36; break; // D3DFMT_A16B16G16R16 - case DXGI_FORMAT_R16G16B16A16_SNORM: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 110; break; // D3DFMT_Q16W16V16U16 - case DXGI_FORMAT_R32G32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 115; break; // D3DFMT_G32R32F - case DXGI_FORMAT_R16G16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 112; break; // D3DFMT_G16R16F - case DXGI_FORMAT_R32_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 114; break; // D3DFMT_R32F - case DXGI_FORMAT_R16_FLOAT: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 111; break; // D3DFMT_R16F + case DXGI_FORMAT_R32G32B32A32_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 116; + break; // D3DFMT_A32B32G32R32F + case DXGI_FORMAT_R16G16B16A16_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 113; + break; // D3DFMT_A16B16G16R16F + case DXGI_FORMAT_R16G16B16A16_UNORM: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 36; + break; // D3DFMT_A16B16G16R16 + case DXGI_FORMAT_R16G16B16A16_SNORM: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 110; + break; // D3DFMT_Q16W16V16U16 + case DXGI_FORMAT_R32G32_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 115; + break; // D3DFMT_G32R32F + case DXGI_FORMAT_R16G16_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 112; + break; // D3DFMT_G16R16F + case DXGI_FORMAT_R32_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 114; + break; // D3DFMT_R32F + case DXGI_FORMAT_R16_FLOAT: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 111; + break; // D3DFMT_R16F case DXGI_FORMAT_AI44: case DXGI_FORMAT_IA44: case DXGI_FORMAT_P8: - case DXGI_FORMAT_A8P8: - return HRESULT_E_NOT_SUPPORTED; + case DXGI_FORMAT_A8P8: return HRESULT_E_NOT_SUPPORTED; default: memcpy(&header->ddspf, &DDSPF_DX10, sizeof(DDS_PIXELFORMAT)); headerSize += sizeof(DDS_HEADER_DXT10); - extHeader = reinterpret_cast(fileHeader + DDS_MIN_HEADER_SIZE); - extHeader->dxgiFormat = desc.Format; + extHeader = reinterpret_cast(fileHeader + DDS_MIN_HEADER_SIZE); + extHeader->dxgiFormat = desc.Format; extHeader->resourceDimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; - extHeader->arraySize = 1; + extHeader->arraySize = 1; break; } @@ -1082,10 +1069,10 @@ HRESULT DirectX::SaveDDSTextureToFile( if (imageSize > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; - void* pMappedMemory = nullptr; - D3D12_RANGE readRange = { 0, static_cast(imageSize) }; - D3D12_RANGE writeRange = { 0, 0 }; - hr = pStaging->Map(0, &readRange, &pMappedMemory); + void* pMappedMemory = nullptr; + D3D12_RANGE readRange = { 0, static_cast(imageSize) }; + D3D12_RANGE writeRange = { 0, 0 }; + hr = pStaging->Map(0, &readRange, &pMappedMemory); if (FAILED(hr)) return hr; @@ -1141,17 +1128,15 @@ HRESULT DirectX::SaveDDSTextureToFile( //-------------------------------------------------------------------------------------- #ifdef _WIN32 -_Use_decl_annotations_ -HRESULT DirectX::SaveWICTextureToFile( - ID3D12CommandQueue* pCommandQ, - ID3D12Resource* pSource, - REFGUID guidContainerFormat, - const wchar_t* fileName, - D3D12_RESOURCE_STATES beforeState, - D3D12_RESOURCE_STATES afterState, - const GUID* targetFormat, - std::function setCustomProps, - bool forceSRGB) +_Use_decl_annotations_ HRESULT DirectX::SaveWICTextureToFile(ID3D12CommandQueue* pCommandQ, + ID3D12Resource* pSource, + REFGUID guidContainerFormat, + const wchar_t* fileName, + D3D12_RESOURCE_STATES beforeState, + D3D12_RESOURCE_STATES afterState, + const GUID* targetFormat, + std::function setCustomProps, + bool forceSRGB) { if (!fileName) return E_INVALIDARG; @@ -1164,25 +1149,17 @@ HRESULT DirectX::SaveWICTextureToFile( const auto desc = pSource->GetDesc(); #else D3D12_RESOURCE_DESC tmpDesc; - const auto& desc = *pSource->GetDesc(&tmpDesc); + const auto& desc = *pSource->GetDesc(&tmpDesc); #endif if (desc.Width > UINT32_MAX) return E_INVALIDARG; UINT64 totalResourceSize = 0; - UINT64 fpRowPitch = 0; - UINT fpRowCount = 0; + UINT64 fpRowPitch = 0; + UINT fpRowCount = 0; // Get the rowcount, pitch and size of the top mip - device->GetCopyableFootprints( - &desc, - 0, - 1, - 0, - nullptr, - &fpRowCount, - &fpRowPitch, - &totalResourceSize); + device->GetCopyableFootprints(&desc, 0, 1, 0, nullptr, &fpRowCount, &fpRowPitch, &totalResourceSize); // Round up the srcPitch to multiples of 256 const UINT64 dstRowPitch = (fpRowPitch + 255) & ~0xFFu; @@ -1197,51 +1174,44 @@ HRESULT DirectX::SaveWICTextureToFile( // Determine source format's WIC equivalent WICPixelFormatGUID pfGuid = {}; - bool sRGB = forceSRGB; + bool sRGB = forceSRGB; switch (desc.Format) { - case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break; - case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break; - case DXGI_FORMAT_R16G16B16A16_UNORM: pfGuid = GUID_WICPixelFormat64bppRGBA; break; - case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102XR; break; - case DXGI_FORMAT_R10G10B10A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102; break; - case DXGI_FORMAT_B5G5R5A1_UNORM: pfGuid = GUID_WICPixelFormat16bppBGRA5551; break; - case DXGI_FORMAT_B5G6R5_UNORM: pfGuid = GUID_WICPixelFormat16bppBGR565; break; - case DXGI_FORMAT_R32_FLOAT: pfGuid = GUID_WICPixelFormat32bppGrayFloat; break; - case DXGI_FORMAT_R16_FLOAT: pfGuid = GUID_WICPixelFormat16bppGrayHalf; break; - case DXGI_FORMAT_R16_UNORM: pfGuid = GUID_WICPixelFormat16bppGray; break; - case DXGI_FORMAT_R8_UNORM: pfGuid = GUID_WICPixelFormat8bppGray; break; - case DXGI_FORMAT_A8_UNORM: pfGuid = GUID_WICPixelFormat8bppAlpha; break; - - case DXGI_FORMAT_R8G8B8A8_UNORM: - pfGuid = GUID_WICPixelFormat32bppRGBA; - break; + case DXGI_FORMAT_R32G32B32A32_FLOAT: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break; + case DXGI_FORMAT_R16G16B16A16_FLOAT: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break; + case DXGI_FORMAT_R16G16B16A16_UNORM: pfGuid = GUID_WICPixelFormat64bppRGBA; break; + case DXGI_FORMAT_R10G10B10_XR_BIAS_A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102XR; break; + case DXGI_FORMAT_R10G10B10A2_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA1010102; break; + case DXGI_FORMAT_B5G5R5A1_UNORM: pfGuid = GUID_WICPixelFormat16bppBGRA5551; break; + case DXGI_FORMAT_B5G6R5_UNORM: pfGuid = GUID_WICPixelFormat16bppBGR565; break; + case DXGI_FORMAT_R32_FLOAT: pfGuid = GUID_WICPixelFormat32bppGrayFloat; break; + case DXGI_FORMAT_R16_FLOAT: pfGuid = GUID_WICPixelFormat16bppGrayHalf; break; + case DXGI_FORMAT_R16_UNORM: pfGuid = GUID_WICPixelFormat16bppGray; break; + case DXGI_FORMAT_R8_UNORM: pfGuid = GUID_WICPixelFormat8bppGray; break; + case DXGI_FORMAT_A8_UNORM: pfGuid = GUID_WICPixelFormat8bppAlpha; break; + + case DXGI_FORMAT_R8G8B8A8_UNORM: pfGuid = GUID_WICPixelFormat32bppRGBA; break; case DXGI_FORMAT_R8G8B8A8_UNORM_SRGB: pfGuid = GUID_WICPixelFormat32bppRGBA; - sRGB = true; + sRGB = true; break; - case DXGI_FORMAT_B8G8R8A8_UNORM: - pfGuid = GUID_WICPixelFormat32bppBGRA; - break; + case DXGI_FORMAT_B8G8R8A8_UNORM: pfGuid = GUID_WICPixelFormat32bppBGRA; break; case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: pfGuid = GUID_WICPixelFormat32bppBGRA; - sRGB = true; + sRGB = true; break; - case DXGI_FORMAT_B8G8R8X8_UNORM: - pfGuid = GUID_WICPixelFormat32bppBGR; - break; + case DXGI_FORMAT_B8G8R8X8_UNORM: pfGuid = GUID_WICPixelFormat32bppBGR; break; case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: pfGuid = GUID_WICPixelFormat32bppBGR; - sRGB = true; + sRGB = true; break; - default: - return HRESULT_E_NOT_SUPPORTED; + default: return HRESULT_E_NOT_SUPPORTED; } auto pWIC = GetWIC(); @@ -1269,7 +1239,7 @@ HRESULT DirectX::SaveWICTextureToFile( return hr; ComPtr frame; - ComPtr props; + ComPtr props; hr = encoder->CreateNewFrame(frame.GetAddressOf(), props.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1281,9 +1251,9 @@ HRESULT DirectX::SaveWICTextureToFile( option.pstrName = const_cast(L"EnableV5Header32bppBGRA"); VARIANT varValue; - varValue.vt = VT_BOOL; + varValue.vt = VT_BOOL; varValue.boolVal = VARIANT_TRUE; - std::ignore = props->Write(1, &option, &varValue); + std::ignore = props->Write(1, &option, &varValue); } if (setCustomProps) @@ -1327,13 +1297,9 @@ HRESULT DirectX::SaveWICTextureToFile( case DXGI_FORMAT_R16_FLOAT: case DXGI_FORMAT_R16_UNORM: case DXGI_FORMAT_R8_UNORM: - case DXGI_FORMAT_A8_UNORM: - targetGuid = GUID_WICPixelFormat8bppGray; - break; + case DXGI_FORMAT_A8_UNORM: targetGuid = GUID_WICPixelFormat8bppGray; break; - default: - targetGuid = GUID_WICPixelFormat24bppBGR; - break; + default: targetGuid = GUID_WICPixelFormat24bppBGR; break; } } @@ -1354,7 +1320,7 @@ HRESULT DirectX::SaveWICTextureToFile( PROPVARIANT value; PropVariantInit(&value); - value.vt = VT_LPSTR; + value.vt = VT_LPSTR; value.pszVal = const_cast("DirectXTK"); if (memcmp(&guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID)) == 0) @@ -1365,16 +1331,16 @@ HRESULT DirectX::SaveWICTextureToFile( // Set sRGB chunk if (sRGB) { - value.vt = VT_UI1; - value.bVal = 0; + value.vt = VT_UI1; + value.bVal = 0; std::ignore = metawriter->SetMetadataByName(L"/sRGB/RenderingIntent", &value); } else { // add gAMA chunk with gamma 1.0 - value.vt = VT_UI4; + value.vt = VT_UI4; value.uintVal = 100000; // gama value * 100,000 -- i.e. gamma 1.0 - std::ignore = metawriter->SetMetadataByName(L"/gAMA/ImageGamma", &value); + std::ignore = metawriter->SetMetadataByName(L"/gAMA/ImageGamma", &value); // remove sRGB chunk which is added by default. std::ignore = metawriter->RemoveMetadataByName(L"/sRGB/RenderingIntent"); @@ -1388,7 +1354,7 @@ HRESULT DirectX::SaveWICTextureToFile( if (sRGB) { // Set EXIF Colorspace of sRGB - value.vt = VT_UI2; + value.vt = VT_UI2; value.uiVal = 1; std::ignore = metawriter->SetMetadataByName(L"System.Image.ColorSpace", &value); } @@ -1399,10 +1365,10 @@ HRESULT DirectX::SaveWICTextureToFile( if (imageSize > UINT32_MAX) return HRESULT_E_ARITHMETIC_OVERFLOW; - void* pMappedMemory = nullptr; - D3D12_RANGE readRange = { 0, static_cast(imageSize) }; - D3D12_RANGE writeRange = { 0, 0 }; - hr = pStaging->Map(0, &readRange, &pMappedMemory); + void* pMappedMemory = nullptr; + D3D12_RANGE readRange = { 0, static_cast(imageSize) }; + D3D12_RANGE writeRange = { 0, 0 }; + hr = pStaging->Map(0, &readRange, &pMappedMemory); if (FAILED(hr)) return hr; @@ -1410,10 +1376,13 @@ HRESULT DirectX::SaveWICTextureToFile( { // Conversion required to write ComPtr source; - hr = pWIC->CreateBitmapFromMemory(static_cast(desc.Width), desc.Height, + hr = pWIC->CreateBitmapFromMemory(static_cast(desc.Width), + desc.Height, pfGuid, - static_cast(dstRowPitch), static_cast(imageSize), - static_cast(pMappedMemory), source.GetAddressOf()); + static_cast(dstRowPitch), + static_cast(imageSize), + static_cast(pMappedMemory), + source.GetAddressOf()); if (FAILED(hr)) { pStaging->Unmap(0, &writeRange); @@ -1429,7 +1398,7 @@ HRESULT DirectX::SaveWICTextureToFile( } BOOL canConvert = FALSE; - hr = FC->CanConvert(pfGuid, targetGuid, &canConvert); + hr = FC->CanConvert(pfGuid, targetGuid, &canConvert); if (FAILED(hr) || !canConvert) { pStaging->Unmap(0, &writeRange); @@ -1444,13 +1413,14 @@ HRESULT DirectX::SaveWICTextureToFile( } WICRect rect = { 0, 0, static_cast(desc.Width), static_cast(desc.Height) }; - hr = frame->WriteSource(FC.Get(), &rect); + hr = frame->WriteSource(FC.Get(), &rect); } else { // No conversion required hr = frame->WritePixels(desc.Height, - static_cast(dstRowPitch), static_cast(imageSize), + static_cast(dstRowPitch), + static_cast(imageSize), static_cast(pMappedMemory)); } diff --git a/ScreenGrab/ScreenGrab12.h b/ScreenGrab/ScreenGrab12.h index 6a9e7f82..116532a4 100644 --- a/ScreenGrab/ScreenGrab12.h +++ b/ScreenGrab/ScreenGrab12.h @@ -31,7 +31,7 @@ #include #else #include -#pragma comment(lib,"dxguid.lib") +#pragma comment(lib, "dxguid.lib") #endif #ifdef _WIN32 @@ -44,26 +44,23 @@ #include #endif - namespace DirectX { - HRESULT __cdecl SaveDDSTextureToFile( - _In_ ID3D12CommandQueue* pCommandQueue, - _In_ ID3D12Resource* pSource, - _In_z_ const wchar_t* fileName, - D3D12_RESOURCE_STATES beforeState = D3D12_RESOURCE_STATE_RENDER_TARGET, - D3D12_RESOURCE_STATES afterState = D3D12_RESOURCE_STATE_RENDER_TARGET) noexcept; + HRESULT __cdecl SaveDDSTextureToFile(_In_ ID3D12CommandQueue* pCommandQueue, + _In_ ID3D12Resource* pSource, + _In_z_ const wchar_t* fileName, + D3D12_RESOURCE_STATES beforeState = D3D12_RESOURCE_STATE_RENDER_TARGET, + D3D12_RESOURCE_STATES afterState = D3D12_RESOURCE_STATE_RENDER_TARGET) noexcept; #ifdef _WIN32 - HRESULT __cdecl SaveWICTextureToFile( - _In_ ID3D12CommandQueue* pCommandQ, - _In_ ID3D12Resource* pSource, - REFGUID guidContainerFormat, - _In_z_ const wchar_t* fileName, - D3D12_RESOURCE_STATES beforeState = D3D12_RESOURCE_STATE_RENDER_TARGET, - D3D12_RESOURCE_STATES afterState = D3D12_RESOURCE_STATE_RENDER_TARGET, - _In_opt_ const GUID* targetFormat = nullptr, - _In_ std::function setCustomProps = nullptr, - bool forceSRGB = false); + HRESULT __cdecl SaveWICTextureToFile(_In_ ID3D12CommandQueue* pCommandQ, + _In_ ID3D12Resource* pSource, + REFGUID guidContainerFormat, + _In_z_ const wchar_t* fileName, + D3D12_RESOURCE_STATES beforeState = D3D12_RESOURCE_STATE_RENDER_TARGET, + D3D12_RESOURCE_STATES afterState = D3D12_RESOURCE_STATE_RENDER_TARGET, + _In_opt_ const GUID* targetFormat = nullptr, + _In_ std::function setCustomProps = nullptr, + bool forceSRGB = false); #endif -} +} // namespace DirectX diff --git a/ScreenGrab/ScreenGrab9.cpp b/ScreenGrab/ScreenGrab9.cpp index b75adefb..493e4817 100644 --- a/ScreenGrab/ScreenGrab9.cpp +++ b/ScreenGrab/ScreenGrab9.cpp @@ -52,9 +52,8 @@ using Microsoft::WRL::ComPtr; // Macros //-------------------------------------------------------------------------------------- #ifndef MAKEFOURCC -#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ - ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | \ - ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24 )) +#define MAKEFOURCC(ch0, ch1, ch2, ch3) \ + ((uint32_t)(uint8_t)(ch0) | ((uint32_t)(uint8_t)(ch1) << 8) | ((uint32_t)(uint8_t)(ch2) << 16) | ((uint32_t)(uint8_t)(ch3) << 24)) #endif /* defined(MAKEFOURCC) */ //-------------------------------------------------------------------------------------- @@ -64,38 +63,38 @@ using Microsoft::WRL::ComPtr; //-------------------------------------------------------------------------------------- namespace { -#pragma pack(push,1) +#pragma pack(push, 1) constexpr uint32_t DDS_MAGIC = 0x20534444; // "DDS " struct DDS_PIXELFORMAT { - uint32_t size; - uint32_t flags; - uint32_t fourCC; - uint32_t RGBBitCount; - uint32_t RBitMask; - uint32_t GBitMask; - uint32_t BBitMask; - uint32_t ABitMask; + uint32_t size; + uint32_t flags; + uint32_t fourCC; + uint32_t RGBBitCount; + uint32_t RBitMask; + uint32_t GBitMask; + uint32_t BBitMask; + uint32_t ABitMask; }; -#define DDS_FOURCC 0x00000004 // DDPF_FOURCC -#define DDS_RGB 0x00000040 // DDPF_RGB -#define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS -#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE -#define DDS_LUMINANCEA 0x00020001 // DDPF_LUMINANCE | DDPF_ALPHAPIXELS -#define DDS_ALPHA 0x00000002 // DDPF_ALPHA -#define DDS_BUMPLUMINANCE 0x00040000 // DDPF_BUMPLUMINANCE -#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV -#define DDS_BUMPDUDVA 0x00080001 // DDPF_BUMPDUDV | DDPF_ALPHAPIXELS +#define DDS_FOURCC 0x00000004 // DDPF_FOURCC +#define DDS_RGB 0x00000040 // DDPF_RGB +#define DDS_RGBA 0x00000041 // DDPF_RGB | DDPF_ALPHAPIXELS +#define DDS_LUMINANCE 0x00020000 // DDPF_LUMINANCE +#define DDS_LUMINANCEA 0x00020001 // DDPF_LUMINANCE | DDPF_ALPHAPIXELS +#define DDS_ALPHA 0x00000002 // DDPF_ALPHA +#define DDS_BUMPLUMINANCE 0x00040000 // DDPF_BUMPLUMINANCE +#define DDS_BUMPDUDV 0x00080000 // DDPF_BUMPDUDV +#define DDS_BUMPDUDVA 0x00080001 // DDPF_BUMPDUDV | DDPF_ALPHAPIXELS -#define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT -#define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT -#define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH -#define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE +#define DDS_HEADER_FLAGS_TEXTURE 0x00001007 // DDSD_CAPS | DDSD_HEIGHT | DDSD_WIDTH | DDSD_PIXELFORMAT +#define DDS_HEADER_FLAGS_MIPMAP 0x00020000 // DDSD_MIPMAPCOUNT +#define DDS_HEADER_FLAGS_PITCH 0x00000008 // DDSD_PITCH +#define DDS_HEADER_FLAGS_LINEARSIZE 0x00080000 // DDSD_LINEARSIZE -#define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE +#define DDS_SURFACE_FLAGS_TEXTURE 0x00001000 // DDSCAPS_TEXTURE struct DDS_HEADER { @@ -122,136 +121,114 @@ namespace constexpr size_t DDS_DX9_HEADER_SIZE = sizeof(uint32_t) + sizeof(DDS_HEADER); - const DDS_PIXELFORMAT DDSPF_DXT1 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','1'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT1 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '1'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_DXT2 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','2'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT2 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '2'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_DXT3 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','3'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT3 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '3'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_DXT4 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','4'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT4 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '4'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_DXT5 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D','X','T','5'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_DXT5 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('D', 'X', 'T', '5'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_R8G8_B8G8 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('R','G','B','G'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_R8G8_B8G8 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('R', 'G', 'B', 'G'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_G8R8_G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('G','R','G','B'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_G8R8_G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('G', 'R', 'G', 'B'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_YUY2 = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('Y','U','Y','2'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_YUY2 = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('Y', 'U', 'Y', '2'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_UYVY = - { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('U','Y','V','Y'), 0, 0, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_UYVY = { sizeof(DDS_PIXELFORMAT), DDS_FOURCC, MAKEFOURCC('U', 'Y', 'V', 'Y'), 0, 0, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_A8R8G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; + const DDS_PIXELFORMAT DDSPF_A8R8G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0xff000000 }; - const DDS_PIXELFORMAT DDSPF_X8R8G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0 }; + const DDS_PIXELFORMAT DDSPF_X8R8G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x00ff0000, 0x0000ff00, 0x000000ff, 0 }; - const DDS_PIXELFORMAT DDSPF_A8B8G8R8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; + const DDS_PIXELFORMAT DDSPF_A8B8G8R8 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; - const DDS_PIXELFORMAT DDSPF_X8B8G8R8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0 }; + const DDS_PIXELFORMAT DDSPF_X8B8G8R8 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0 }; - const DDS_PIXELFORMAT DDSPF_G16R16 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_G16R16 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_R5G6B5 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0xf800, 0x07e0, 0x001f, 0 }; + const DDS_PIXELFORMAT DDSPF_R5G6B5 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0xf800, 0x07e0, 0x001f, 0 }; - const DDS_PIXELFORMAT DDSPF_A1R5G5B5 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x7c00, 0x03e0, 0x001f, 0x8000 }; + const DDS_PIXELFORMAT DDSPF_A1R5G5B5 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x7c00, 0x03e0, 0x001f, 0x8000 }; - const DDS_PIXELFORMAT DDSPF_X1R5G5B5 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0x7c00, 0x03e0, 0x001f, 0 }; + const DDS_PIXELFORMAT DDSPF_X1R5G5B5 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0x7c00, 0x03e0, 0x001f, 0 }; - const DDS_PIXELFORMAT DDSPF_A4R4G4B4 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x0f00, 0x00f0, 0x000f, 0xf000 }; + const DDS_PIXELFORMAT DDSPF_A4R4G4B4 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x0f00, 0x00f0, 0x000f, 0xf000 }; - const DDS_PIXELFORMAT DDSPF_X4R4G4B4 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0x0f00, 0x00f0, 0x000f, 0 }; + const DDS_PIXELFORMAT DDSPF_X4R4G4B4 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 16, 0x0f00, 0x00f0, 0x000f, 0 }; - const DDS_PIXELFORMAT DDSPF_R8G8B8 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 24, 0xff0000, 0x00ff00, 0x0000ff, 0 }; + const DDS_PIXELFORMAT DDSPF_R8G8B8 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 24, 0xff0000, 0x00ff00, 0x0000ff, 0 }; - const DDS_PIXELFORMAT DDSPF_A8R3G3B2 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x00e0, 0x001c, 0x0003, 0xff00 }; + const DDS_PIXELFORMAT DDSPF_A8R3G3B2 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 16, 0x00e0, 0x001c, 0x0003, 0xff00 }; - const DDS_PIXELFORMAT DDSPF_R3G3B2 = - { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 8, 0xe0, 0x1c, 0x03, 0 }; + const DDS_PIXELFORMAT DDSPF_R3G3B2 = { sizeof(DDS_PIXELFORMAT), DDS_RGB, 0, 8, 0xe0, 0x1c, 0x03, 0 }; - const DDS_PIXELFORMAT DDSPF_A4L4 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 8, 0x0f, 0, 0, 0xf0 }; + const DDS_PIXELFORMAT DDSPF_A4L4 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 8, 0x0f, 0, 0, 0xf0 }; - const DDS_PIXELFORMAT DDSPF_L8 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 8, 0xff, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_L8 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 8, 0xff, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_L16 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 16, 0xffff, 0, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_L16 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCE, 0, 16, 0xffff, 0, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_A8L8 = - { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 16, 0x00ff, 0, 0, 0xff00 }; + const DDS_PIXELFORMAT DDSPF_A8L8 = { sizeof(DDS_PIXELFORMAT), DDS_LUMINANCEA, 0, 16, 0x00ff, 0, 0, 0xff00 }; - const DDS_PIXELFORMAT DDSPF_A8 = - { sizeof(DDS_PIXELFORMAT), DDS_ALPHA, 0, 8, 0, 0, 0, 0xff }; + const DDS_PIXELFORMAT DDSPF_A8 = { sizeof(DDS_PIXELFORMAT), DDS_ALPHA, 0, 8, 0, 0, 0, 0xff }; - const DDS_PIXELFORMAT DDSPF_V8U8 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 16, 0x00ff, 0xff00, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_V8U8 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 16, 0x00ff, 0xff00, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_Q8W8V8U8 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; + const DDS_PIXELFORMAT DDSPF_Q8W8V8U8 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0xff000000 }; - const DDS_PIXELFORMAT DDSPF_V16U16 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; + const DDS_PIXELFORMAT DDSPF_V16U16 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDV, 0, 32, 0x0000ffff, 0xffff0000, 0, 0 }; - const DDS_PIXELFORMAT DDSPF_A2W10V10U10 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDVA, 0, 32, 0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000 }; + const DDS_PIXELFORMAT DDSPF_A2W10V10U10 + = { sizeof(DDS_PIXELFORMAT), DDS_BUMPDUDVA, 0, 32, 0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000 }; - const DDS_PIXELFORMAT DDSPF_L6V5U5 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPLUMINANCE, 0, 16, 0x001f, 0x03e0, 0xfc00, 0 }; + const DDS_PIXELFORMAT DDSPF_L6V5U5 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPLUMINANCE, 0, 16, 0x001f, 0x03e0, 0xfc00, 0 }; - const DDS_PIXELFORMAT DDSPF_X8L8V8U8 = - { sizeof(DDS_PIXELFORMAT), DDS_BUMPLUMINANCE, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0 }; + const DDS_PIXELFORMAT DDSPF_X8L8V8U8 = { sizeof(DDS_PIXELFORMAT), DDS_BUMPLUMINANCE, 0, 32, 0x000000ff, 0x0000ff00, 0x00ff0000, 0 }; // Note these 10:10:10:2 format RGB masks are reversed to support a long-standing bug in D3DX - const DDS_PIXELFORMAT DDSPF_A2R10G10B10 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000003ff, 0x000ffc00, 0x3ff00000, 0xc0000000 }; - const DDS_PIXELFORMAT DDSPF_A2B10G10R10 = - { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000 }; + const DDS_PIXELFORMAT DDSPF_A2R10G10B10 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x000003ff, 0x000ffc00, 0x3ff00000, 0xc0000000 }; + const DDS_PIXELFORMAT DDSPF_A2B10G10R10 = { sizeof(DDS_PIXELFORMAT), DDS_RGBA, 0, 32, 0x3ff00000, 0x000ffc00, 0x000003ff, 0xc0000000 }; //----------------------------------------------------------------------------- - struct handle_closer { void operator()(HANDLE h) noexcept { if (h) CloseHandle(h); } }; + struct handle_closer + { + void operator()(HANDLE h) noexcept + { + if (h) + CloseHandle(h); + } + }; using ScopedHandle = std::unique_ptr; - inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } + inline HANDLE safe_handle(HANDLE h) noexcept + { + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; + } class auto_delete_file { public: - auto_delete_file(HANDLE hFile) noexcept : m_handle(hFile) {} + auto_delete_file(HANDLE hFile) noexcept + : m_handle(hFile) + {} ~auto_delete_file() { if (m_handle) { FILE_DISPOSITION_INFO info = {}; - info.DeleteFile = TRUE; - std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); + info.DeleteFile = TRUE; + std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); } } - auto_delete_file(const auto_delete_file&) = delete; + auto_delete_file(const auto_delete_file&) = delete; auto_delete_file& operator=(const auto_delete_file&) = delete; - auto_delete_file(const auto_delete_file&&) = delete; + auto_delete_file(const auto_delete_file&&) = delete; auto_delete_file& operator=(const auto_delete_file&&) = delete; void clear() noexcept { m_handle = nullptr; } @@ -263,7 +240,10 @@ namespace class auto_delete_file_wic { public: - auto_delete_file_wic(ComPtr& hFile, const wchar_t* szFile) noexcept : m_filename(szFile), m_handle(hFile) {} + auto_delete_file_wic(ComPtr& hFile, const wchar_t* szFile) noexcept + : m_filename(szFile), + m_handle(hFile) + {} ~auto_delete_file_wic() { if (m_filename) @@ -273,20 +253,19 @@ namespace } } - auto_delete_file_wic(const auto_delete_file_wic&) = delete; + auto_delete_file_wic(const auto_delete_file_wic&) = delete; auto_delete_file_wic& operator=(const auto_delete_file_wic&) = delete; - auto_delete_file_wic(const auto_delete_file_wic&&) = delete; + auto_delete_file_wic(const auto_delete_file_wic&&) = delete; auto_delete_file_wic& operator=(const auto_delete_file_wic&&) = delete; void clear() noexcept { m_filename = nullptr; } private: - const wchar_t* m_filename; + const wchar_t* m_filename; ComPtr& m_handle; }; - //-------------------------------------------------------------------------------------- // Return the BPP for a particular format //-------------------------------------------------------------------------------------- @@ -294,14 +273,12 @@ namespace { switch (static_cast(fmt)) { - case D3DFMT_A32B32G32R32F: - return 128; + case D3DFMT_A32B32G32R32F: return 128; case D3DFMT_A16B16G16R16: case D3DFMT_Q16W16V16U16: case D3DFMT_A16B16G16R16F: - case D3DFMT_G32R32F: - return 64; + case D3DFMT_G32R32F: return 64; case D3DFMT_A8R8G8B8: case D3DFMT_X8R8G8B8: @@ -323,13 +300,12 @@ namespace case D3DFMT_INDEX32: case D3DFMT_G16R16F: case D3DFMT_R32F: - #if !defined(D3D_DISABLE_9EX) +#if !defined(D3D_DISABLE_9EX) case D3DFMT_D32_LOCKABLE: - #endif +#endif return 32; - case D3DFMT_R8G8B8: - return 24; + case D3DFMT_R8G8B8: return 24; case D3DFMT_A4R4G4B4: case D3DFMT_X4R4G4B4: @@ -352,8 +328,7 @@ namespace case D3DFMT_YUY2: // From DX docs, reference/d3d/enums/d3dformat.asp // (note how it says that D3DFMT_R8G8_B8G8 is "A 16-bit packed RGB format analogous to UYVY (U0Y0, V0Y1, U2Y2, and so on)") - case D3DFMT_UYVY: - return 16; + case D3DFMT_UYVY: return 16; case D3DFMT_R3G3B2: case D3DFMT_A8: @@ -361,13 +336,12 @@ namespace case D3DFMT_P8: case D3DFMT_L8: case D3DFMT_A4L4: - #if !defined(D3D_DISABLE_9EX) +#if !defined(D3D_DISABLE_9EX) case D3DFMT_S8_LOCKABLE: - #endif +#endif return 8; - case D3DFMT_DXT1: - return 4; + case D3DFMT_DXT1: return 4; case D3DFMT_DXT2: case D3DFMT_DXT3: @@ -375,23 +349,18 @@ namespace case D3DFMT_DXT5: // http://msdn.microsoft.com/library/default.asp?url=/library/en-us/directshow/htm/directxvideoaccelerationdxvavideosubtypes.asp case MAKEFOURCC('A', 'I', '4', '4'): - case MAKEFOURCC('I', 'A', '4', '4'): - return 8; + case MAKEFOURCC('I', 'A', '4', '4'): return 8; - case MAKEFOURCC('Y', 'V', '1', '2'): - return 12; + case MAKEFOURCC('Y', 'V', '1', '2'): return 12; - #if !defined(D3D_DISABLE_9EX) - case D3DFMT_A1: - return 1; - #endif +#if !defined(D3D_DISABLE_9EX) + case D3DFMT_A1: return 1; +#endif - default: - return 0; + default: return 0; } } - //-------------------------------------------------------------------------------------- // Determines if the format is block compressed //-------------------------------------------------------------------------------------- @@ -403,37 +372,33 @@ namespace case D3DFMT_DXT2: case D3DFMT_DXT3: case D3DFMT_DXT4: - case D3DFMT_DXT5: - return true; + case D3DFMT_DXT5: return true; - default: - return false; + default: return false; } } - //-------------------------------------------------------------------------------------- // Get surface information for a particular format //-------------------------------------------------------------------------------------- - HRESULT GetSurfaceInfo( - _In_ size_t width, - _In_ size_t height, - _In_ D3DFORMAT fmt, - size_t* outNumBytes, - _Out_opt_ size_t* outRowBytes, - _Out_opt_ size_t* outNumRows) noexcept + HRESULT GetSurfaceInfo(_In_ size_t width, + _In_ size_t height, + _In_ D3DFORMAT fmt, + size_t* outNumBytes, + _Out_opt_ size_t* outRowBytes, + _Out_opt_ size_t* outNumRows) noexcept { uint64_t numBytes = 0; uint64_t rowBytes = 0; - uint64_t numRows = 0; + uint64_t numRows = 0; - bool bc = false; - bool packed = false; - size_t bpe = 0; + bool bc = false; + bool packed = false; + size_t bpe = 0; switch (static_cast(fmt)) { case D3DFMT_DXT1: - bc = true; + bc = true; bpe = 8; break; @@ -441,7 +406,7 @@ namespace case D3DFMT_DXT3: case D3DFMT_DXT4: case D3DFMT_DXT5: - bc = true; + bc = true; bpe = 16; break; @@ -450,11 +415,10 @@ namespace case D3DFMT_UYVY: case D3DFMT_YUY2: packed = true; - bpe = 4; + bpe = 4; break; - default: - break; + default: break; } if (bc) @@ -470,13 +434,13 @@ namespace numBlocksHigh = std::max(1u, (uint64_t(height) + 3u) / 4u); } rowBytes = numBlocksWide * bpe; - numRows = numBlocksHigh; + numRows = numBlocksHigh; numBytes = rowBytes * numBlocksHigh; } else if (packed) { rowBytes = ((uint64_t(width) + 1u) >> 1) * bpe; - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } else @@ -486,17 +450,17 @@ namespace return E_INVALIDARG; rowBytes = (uint64_t(width) * bpp + 7u) / 8u; // round up to nearest byte - numRows = uint64_t(height); + numRows = uint64_t(height); numBytes = rowBytes * height; } - #if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) +#if defined(_M_IX86) || defined(_M_ARM) || defined(_M_HYBRID_X86_ARM64) static_assert(sizeof(size_t) == 4, "Not a 32-bit platform!"); if (numBytes > UINT32_MAX || rowBytes > UINT32_MAX || numRows > UINT32_MAX) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - #else +#else static_assert(sizeof(size_t) == 8, "Not a 64-bit platform!"); - #endif +#endif if (outNumBytes) { @@ -514,19 +478,12 @@ namespace return S_OK; } - //-------------------------------------------------------------------------------------- bool g_WIC2 = false; BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID* ifactory) noexcept { - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - ifactory - ); + HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory2, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory2), ifactory); if (SUCCEEDED(hr)) { @@ -536,13 +493,7 @@ namespace } else { - hr = CoCreateInstance( - CLSID_WICImagingFactory1, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory), - ifactory - ); + hr = CoCreateInstance(CLSID_WICImagingFactory1, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory), ifactory); return SUCCEEDED(hr) ? TRUE : FALSE; } } @@ -552,10 +503,7 @@ namespace static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; IWICImagingFactory* factory = nullptr; - if (!InitOnceExecuteOnce(&s_initOnce, - InitializeWICFactory, - nullptr, - reinterpret_cast(&factory))) + if (!InitOnceExecuteOnce(&s_initOnce, InitializeWICFactory, nullptr, reinterpret_cast(&factory))) { return nullptr; } @@ -564,18 +512,14 @@ namespace } } // anonymous namespace - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveDDSTextureToFile( - LPDIRECT3DSURFACE9 pSource, - const wchar_t* fileName) noexcept +_Use_decl_annotations_ HRESULT DirectX::SaveDDSTextureToFile(LPDIRECT3DSURFACE9 pSource, const wchar_t* fileName) noexcept { if (!pSource || !fileName) return E_INVALIDARG; D3DSURFACE_DESC desc = {}; - HRESULT hr = pSource->GetDesc(&desc); + HRESULT hr = pSource->GetDesc(&desc); if (FAILED(hr)) return hr; @@ -590,10 +534,7 @@ HRESULT DirectX::SaveDDSTextureToFile( } // Create file - ScopedHandle hFile(safe_handle(CreateFile2( - fileName, - GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(fileName, GENERIC_WRITE | DELETE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) return HRESULT_FROM_WIN32(GetLastError()); @@ -604,64 +545,104 @@ HRESULT DirectX::SaveDDSTextureToFile( *reinterpret_cast(&fileHeader[0]) = DDS_MAGIC; - auto header = reinterpret_cast(&fileHeader[0] + sizeof(uint32_t)); - header->size = sizeof(DDS_HEADER); - header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP; - header->height = desc.Height; - header->width = desc.Width; + auto header = reinterpret_cast(&fileHeader[0] + sizeof(uint32_t)); + header->size = sizeof(DDS_HEADER); + header->flags = DDS_HEADER_FLAGS_TEXTURE | DDS_HEADER_FLAGS_MIPMAP; + header->height = desc.Height; + header->width = desc.Width; header->mipMapCount = 1; - header->caps = DDS_SURFACE_FLAGS_TEXTURE; + header->caps = DDS_SURFACE_FLAGS_TEXTURE; switch (desc.Format) { - case D3DFMT_R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8B8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A8R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_X8R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_R5G6B5: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_X1R5G5B5: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A1R5G5B5: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A4R4G4B4: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_R3G3B2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R3G3B2, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A8R3G3B2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R3G3B2, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_X4R4G4B4: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X4R4G4B4, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A2B10G10R10: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A2B10G10R10, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A8B8G8R8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_X8B8G8R8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_G16R16: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A2R10G10B10: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A2R10G10B10, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_L8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A8L8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A4L4: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A4L4, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_V8U8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_L6V5U5: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L6V5U5, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_X8L8V8U8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8L8V8U8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_Q8W8V8U8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_V16U16: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_A2W10V10U10: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A2W10V10U10, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_L16: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8B8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A8R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_X8R8G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8R8G8B8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_R5G6B5: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R5G6B5, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_X1R5G5B5: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A1R5G5B5: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A1R5G5B5, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A4R4G4B4: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A4R4G4B4, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_R3G3B2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R3G3B2, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A8R3G3B2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8R3G3B2, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_X4R4G4B4: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X4R4G4B4, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A2B10G10R10: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A2B10G10R10, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A8B8G8R8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_X8B8G8R8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8B8G8R8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_G16R16: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G16R16, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A2R10G10B10: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A2R10G10B10, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_L8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A8L8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A8L8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A4L4: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A4L4, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_V8U8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V8U8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_L6V5U5: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L6V5U5, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_X8L8V8U8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_X8L8V8U8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_Q8W8V8U8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_Q8W8V8U8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_V16U16: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_V16U16, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_A2W10V10U10: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_A2W10V10U10, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_L16: + memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_L16, sizeof(DDS_PIXELFORMAT)); + break; // FourCC formats - case D3DFMT_UYVY: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_UYVY, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_R8G8_B8G8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_YUY2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_G8R8_G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_DXT1: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_DXT2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT2, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_DXT3: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_DXT4: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT4, sizeof(DDS_PIXELFORMAT)); break; - case D3DFMT_DXT5: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_UYVY: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_UYVY, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_R8G8_B8G8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_R8G8_B8G8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_YUY2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_YUY2, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_G8R8_G8B8: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_G8R8_G8B8, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_DXT1: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT1, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_DXT2: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT2, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_DXT3: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT3, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_DXT4: memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT4, sizeof(DDS_PIXELFORMAT)); break; + case D3DFMT_DXT5: + memcpy_s(&header->ddspf, sizeof(header->ddspf), &DDSPF_DXT5, sizeof(DDS_PIXELFORMAT)); + break; // Legacy D3DX formats using D3DFMT enum value as FourCC - case D3DFMT_A16B16G16R16: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 36; break; - case D3DFMT_Q16W16V16U16: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 110; break; - case D3DFMT_R16F: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 111; break; - case D3DFMT_G16R16F: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 112; break; - case D3DFMT_A16B16G16R16F: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 113; break; - case D3DFMT_R32F: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 114; break; - case D3DFMT_G32R32F: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 115; break; - case D3DFMT_A32B32G32R32F: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 116; break; - case D3DFMT_CxV8U8: header->ddspf.size = sizeof(DDS_PIXELFORMAT); header->ddspf.flags = DDS_FOURCC; header->ddspf.fourCC = 117; break; + case D3DFMT_A16B16G16R16: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 36; + break; + case D3DFMT_Q16W16V16U16: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 110; + break; + case D3DFMT_R16F: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 111; + break; + case D3DFMT_G16R16F: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 112; + break; + case D3DFMT_A16B16G16R16F: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 113; + break; + case D3DFMT_R32F: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 114; + break; + case D3DFMT_G32R32F: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 115; + break; + case D3DFMT_A32B32G32R32F: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 116; + break; + case D3DFMT_CxV8U8: + header->ddspf.size = sizeof(DDS_PIXELFORMAT); + header->ddspf.flags = DDS_FOURCC; + header->ddspf.fourCC = 117; + break; default: // No support for paletted formats D3DFMT_P8, D3DFMT_A8P8 @@ -693,7 +674,7 @@ HRESULT DirectX::SaveDDSTextureToFile( return E_OUTOFMEMORY; D3DLOCKED_RECT lockedRect = {}; - hr = pSource->LockRect(&lockedRect, nullptr, D3DLOCK_READONLY); + hr = pSource->LockRect(&lockedRect, nullptr, D3DLOCK_READONLY); if (FAILED(hr)) return hr; @@ -735,21 +716,18 @@ HRESULT DirectX::SaveDDSTextureToFile( return S_OK; } - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::SaveWICTextureToFile( - LPDIRECT3DSURFACE9 pSource, - REFGUID guidContainerFormat, - const wchar_t* fileName, - const GUID* targetFormat, - std::function setCustomProps) +_Use_decl_annotations_ HRESULT DirectX::SaveWICTextureToFile(LPDIRECT3DSURFACE9 pSource, + REFGUID guidContainerFormat, + const wchar_t* fileName, + const GUID* targetFormat, + std::function setCustomProps) { if (!pSource || !fileName) return E_INVALIDARG; D3DSURFACE_DESC desc = {}; - HRESULT hr = pSource->GetDesc(&desc); + HRESULT hr = pSource->GetDesc(&desc); if (FAILED(hr)) return hr; @@ -771,22 +749,22 @@ HRESULT DirectX::SaveWICTextureToFile( WICPixelFormatGUID pfGuid = {}; switch (desc.Format) { - case D3DFMT_R8G8B8: pfGuid = GUID_WICPixelFormat24bppBGR; break; - case D3DFMT_A8R8G8B8: pfGuid = GUID_WICPixelFormat32bppBGRA; break; - case D3DFMT_X8R8G8B8: pfGuid = GUID_WICPixelFormat32bppBGR; break; - case D3DFMT_R5G6B5: pfGuid = GUID_WICPixelFormat16bppBGR565; break; - case D3DFMT_X1R5G5B5: pfGuid = GUID_WICPixelFormat16bppBGR555; break; - case D3DFMT_A1R5G5B5: pfGuid = GUID_WICPixelFormat16bppBGRA5551; break; - case D3DFMT_A8: pfGuid = GUID_WICPixelFormat8bppAlpha; break; - case D3DFMT_A2B10G10R10: pfGuid = GUID_WICPixelFormat32bppRGBA1010102; break; - case D3DFMT_A8B8G8R8: pfGuid = GUID_WICPixelFormat32bppRGBA; break; - case D3DFMT_A16B16G16R16: pfGuid = GUID_WICPixelFormat64bppRGBA; break; - case D3DFMT_L8: pfGuid = GUID_WICPixelFormat8bppGray; break; - case D3DFMT_L16: pfGuid = GUID_WICPixelFormat16bppGray; break; - case D3DFMT_R16F: pfGuid = GUID_WICPixelFormat16bppGrayHalf; break; - case D3DFMT_A16B16G16R16F: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break; - case D3DFMT_R32F: pfGuid = GUID_WICPixelFormat32bppGrayFloat; break; - case D3DFMT_A32B32G32R32F: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break; + case D3DFMT_R8G8B8: pfGuid = GUID_WICPixelFormat24bppBGR; break; + case D3DFMT_A8R8G8B8: pfGuid = GUID_WICPixelFormat32bppBGRA; break; + case D3DFMT_X8R8G8B8: pfGuid = GUID_WICPixelFormat32bppBGR; break; + case D3DFMT_R5G6B5: pfGuid = GUID_WICPixelFormat16bppBGR565; break; + case D3DFMT_X1R5G5B5: pfGuid = GUID_WICPixelFormat16bppBGR555; break; + case D3DFMT_A1R5G5B5: pfGuid = GUID_WICPixelFormat16bppBGRA5551; break; + case D3DFMT_A8: pfGuid = GUID_WICPixelFormat8bppAlpha; break; + case D3DFMT_A2B10G10R10: pfGuid = GUID_WICPixelFormat32bppRGBA1010102; break; + case D3DFMT_A8B8G8R8: pfGuid = GUID_WICPixelFormat32bppRGBA; break; + case D3DFMT_A16B16G16R16: pfGuid = GUID_WICPixelFormat64bppRGBA; break; + case D3DFMT_L8: pfGuid = GUID_WICPixelFormat8bppGray; break; + case D3DFMT_L16: pfGuid = GUID_WICPixelFormat16bppGray; break; + case D3DFMT_R16F: pfGuid = GUID_WICPixelFormat16bppGrayHalf; break; + case D3DFMT_A16B16G16R16F: pfGuid = GUID_WICPixelFormat64bppRGBAHalf; break; + case D3DFMT_R32F: pfGuid = GUID_WICPixelFormat32bppGrayFloat; break; + case D3DFMT_A32B32G32R32F: pfGuid = GUID_WICPixelFormat128bppRGBAFloat; break; case D3DFMT_X8B8G8R8: if (g_WIC2) @@ -795,8 +773,7 @@ HRESULT DirectX::SaveWICTextureToFile( return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } ComPtr stream; @@ -820,7 +797,7 @@ HRESULT DirectX::SaveWICTextureToFile( return hr; ComPtr frame; - ComPtr props; + ComPtr props; hr = encoder->CreateNewFrame(frame.GetAddressOf(), props.GetAddressOf()); if (FAILED(hr)) return hr; @@ -832,9 +809,9 @@ HRESULT DirectX::SaveWICTextureToFile( option.pstrName = const_cast(L"EnableV5Header32bppBGRA"); VARIANT varValue; - varValue.vt = VT_BOOL; + varValue.vt = VT_BOOL; varValue.boolVal = VARIANT_TRUE; - std::ignore = props->Write(1, &option, &varValue); + std::ignore = props->Write(1, &option, &varValue); } if (setCustomProps) @@ -881,23 +858,15 @@ HRESULT DirectX::SaveWICTextureToFile( case D3DFMT_R5G6B5: targetGuid = GUID_WICPixelFormat16bppBGR565; break; case D3DFMT_A1R5G5B5: - case D3DFMT_X1R5G5B5: - targetGuid = GUID_WICPixelFormat16bppBGR555; - break; + case D3DFMT_X1R5G5B5: targetGuid = GUID_WICPixelFormat16bppBGR555; break; - case D3DFMT_L16: - targetGuid = GUID_WICPixelFormat16bppGray; - break; + case D3DFMT_L16: targetGuid = GUID_WICPixelFormat16bppGray; break; case D3DFMT_R32F: case D3DFMT_R16F: - case D3DFMT_L8: - targetGuid = GUID_WICPixelFormat8bppGray; - break; + case D3DFMT_L8: targetGuid = GUID_WICPixelFormat8bppGray; break; - default: - targetGuid = GUID_WICPixelFormat24bppBGR; - break; + default: targetGuid = GUID_WICPixelFormat24bppBGR; break; } } @@ -918,7 +887,7 @@ HRESULT DirectX::SaveWICTextureToFile( PROPVARIANT value; PropVariantInit(&value); - value.vt = VT_LPSTR; + value.vt = VT_LPSTR; value.pszVal = const_cast("DirectXTK"); if (memcmp(&guidContainerFormat, &GUID_ContainerFormatPng, sizeof(GUID)) == 0) @@ -934,7 +903,7 @@ HRESULT DirectX::SaveWICTextureToFile( } D3DLOCKED_RECT lockedRect = {}; - hr = pSource->LockRect(&lockedRect, nullptr, D3DLOCK_READONLY); + hr = pSource->LockRect(&lockedRect, nullptr, D3DLOCK_READONLY); if (FAILED(hr)) return hr; @@ -949,10 +918,13 @@ HRESULT DirectX::SaveWICTextureToFile( { // Conversion required to write ComPtr source; - hr = pWIC->CreateBitmapFromMemory(desc.Width, desc.Height, + hr = pWIC->CreateBitmapFromMemory(desc.Width, + desc.Height, pfGuid, - static_cast(lockedRect.Pitch), static_cast(imageSize), - static_cast(lockedRect.pBits), source.GetAddressOf()); + static_cast(lockedRect.Pitch), + static_cast(imageSize), + static_cast(lockedRect.pBits), + source.GetAddressOf()); if (FAILED(hr)) { pSource->UnlockRect(); @@ -968,7 +940,7 @@ HRESULT DirectX::SaveWICTextureToFile( } BOOL canConvert = FALSE; - hr = FC->CanConvert(pfGuid, targetGuid, &canConvert); + hr = FC->CanConvert(pfGuid, targetGuid, &canConvert); if (FAILED(hr) || !canConvert) { pSource->UnlockRect(); @@ -983,13 +955,14 @@ HRESULT DirectX::SaveWICTextureToFile( } WICRect rect = { 0, 0, static_cast(desc.Width), static_cast(desc.Height) }; - hr = frame->WriteSource(FC.Get(), &rect); + hr = frame->WriteSource(FC.Get(), &rect); } else { // No conversion required hr = frame->WritePixels(desc.Height, - static_cast(lockedRect.Pitch), static_cast(imageSize), + static_cast(lockedRect.Pitch), + static_cast(imageSize), static_cast(lockedRect.pBits)); } diff --git a/ScreenGrab/ScreenGrab9.h b/ScreenGrab/ScreenGrab9.h index 05a04140..9648a2b6 100644 --- a/ScreenGrab/ScreenGrab9.h +++ b/ScreenGrab/ScreenGrab9.h @@ -31,17 +31,13 @@ #include - namespace DirectX { - HRESULT __cdecl SaveDDSTextureToFile( - _In_ LPDIRECT3DSURFACE9 pSource, - _In_z_ const wchar_t* fileName) noexcept; - - HRESULT __cdecl SaveWICTextureToFile( - _In_ LPDIRECT3DSURFACE9 pSource, - _In_ REFGUID guidContainerFormat, - _In_z_ const wchar_t* fileName, - _In_opt_ const GUID* targetFormat = nullptr, - _In_ std::function setCustomProps = nullptr); -} + HRESULT __cdecl SaveDDSTextureToFile(_In_ LPDIRECT3DSURFACE9 pSource, _In_z_ const wchar_t* fileName) noexcept; + + HRESULT __cdecl SaveWICTextureToFile(_In_ LPDIRECT3DSURFACE9 pSource, + _In_ REFGUID guidContainerFormat, + _In_z_ const wchar_t* fileName, + _In_opt_ const GUID* targetFormat = nullptr, + _In_ std::function setCustomProps = nullptr); +} // namespace DirectX diff --git a/Texassemble/AnimatedGif.cpp b/Texassemble/AnimatedGif.cpp index 07237f7b..14d140df 100644 --- a/Texassemble/AnimatedGif.cpp +++ b/Texassemble/AnimatedGif.cpp @@ -13,7 +13,7 @@ // https://go.microsoft.com/fwlink/?LinkId=248926 //-------------------------------------------------------------------------------------- -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4005) #endif @@ -24,7 +24,7 @@ #define NOMCX #define NOSERVICE #define NOHELP -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(pop) #endif @@ -39,7 +39,7 @@ #include -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(disable : 4619 4616 26812) #endif @@ -52,22 +52,18 @@ namespace { enum { - DM_UNDEFINED = 0, - DM_NONE = 1, + DM_UNDEFINED = 0, + DM_NONE = 1, DM_BACKGROUND = 2, - DM_PREVIOUS = 3 + DM_PREVIOUS = 3 }; - void FillRectangle(const Image& img, const RECT& destRect, uint32_t color) { - RECT clipped = - { - (destRect.left < 0) ? 0 : destRect.left, + RECT clipped = { (destRect.left < 0) ? 0 : destRect.left, (destRect.top < 0) ? 0 : destRect.top, (destRect.right > static_cast(img.width)) ? static_cast(img.width) : destRect.right, - (destRect.bottom > static_cast(img.height)) ? static_cast(img.height) : destRect.bottom - }; + (destRect.bottom > static_cast(img.height)) ? static_cast(img.height) : destRect.bottom }; auto ptr = reinterpret_cast(img.pixels + size_t(clipped.top) * img.rowPitch + size_t(clipped.left) * sizeof(uint32_t)); @@ -83,26 +79,20 @@ namespace } } - void BlendRectangle(const Image& composed, const Image& raw, const RECT& destRect, uint32_t transparent) { - RECT clipped = - { - (destRect.left < 0) ? 0 : destRect.left, + RECT clipped = { (destRect.left < 0) ? 0 : destRect.left, (destRect.top < 0) ? 0 : destRect.top, (destRect.right > static_cast(composed.width)) ? static_cast(composed.width) : destRect.right, - (destRect.bottom > static_cast(composed.height)) ? static_cast(composed.height) : destRect.bottom - }; + (destRect.bottom > static_cast(composed.height)) ? static_cast(composed.height) : destRect.bottom }; - auto rawPtr = reinterpret_cast(raw.pixels); + auto rawPtr = reinterpret_cast(raw.pixels); auto composedPtr = reinterpret_cast( - composed.pixels - + size_t(clipped.top) * composed.rowPitch - + size_t(clipped.left) * sizeof(uint32_t)); + composed.pixels + size_t(clipped.top) * composed.rowPitch + size_t(clipped.left) * sizeof(uint32_t)); for (long y = clipped.top; y < clipped.bottom; ++y) { - auto srcPtr = reinterpret_cast(rawPtr); + auto srcPtr = reinterpret_cast(rawPtr); auto destPtr = reinterpret_cast(composedPtr); for (long x = clipped.left; x < clipped.right; ++x, ++srcPtr, ++destPtr) { @@ -116,7 +106,7 @@ namespace composedPtr += composed.rowPitch; } } -} +} // namespace HRESULT LoadAnimatedGif(const wchar_t* szFile, std::vector>& loadedImages, bool usebgcolor) { @@ -153,7 +143,7 @@ HRESULT LoadAnimatedGif(const wchar_t* szFile, std::vector palette; hr = pWIC->CreatePalette(palette.GetAddressOf()); @@ -201,7 +191,7 @@ HRESULT LoadAnimatedGif(const wchar_t* szFile, std::vectorGetMetadataByName(L"/logscrdesc/Width", &propValue); @@ -230,7 +220,7 @@ HRESULT LoadAnimatedGif(const wchar_t* szFile, std::vectorGetMetadataByName(L"/grctlext/Disposal", &propValue); + hr = frameMeta->GetMetadataByName(L"/grctlext/Disposal", &propValue); if (SUCCEEDED(hr)) { hr = (propValue.vt == VT_UI1 ? S_OK : E_FAIL); @@ -363,7 +353,6 @@ HRESULT LoadAnimatedGif(const wchar_t* szFile, std::vector #include -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(disable : 4619 4616 26812) #endif @@ -86,7 +86,7 @@ using Microsoft::WRL::ComPtr; namespace { - const wchar_t* g_ToolName = L"texassemble"; + const wchar_t* g_ToolName = L"texassemble"; const wchar_t* g_Description = L"Microsoft (R) DirectX Texture Assembler [DirectXTex]"; const wchar_t* g_FeedbackURL = L"https://github.com/microsoft/DirectXTex/issues"; @@ -156,6 +156,7 @@ namespace ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// + // clang-format off const SValue g_pCommands[] = { { L"cube", CMD_CUBE }, @@ -458,15 +459,14 @@ namespace { L"12.2", 2048 }, { nullptr, 0 }, }; -} + // clang-format on +} // namespace ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -HRESULT LoadAnimatedGif(const wchar_t* szFile, - std::vector>& loadedImages, - bool usebgcolor); +HRESULT LoadAnimatedGif(const wchar_t* szFile, std::vector>& loadedImages, bool usebgcolor); ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// @@ -492,9 +492,7 @@ namespace switch (info.dimension) { - case TEX_DIMENSION_TEXTURE1D: - wprintf(L"%ls", (info.arraySize > 1) ? L" 1DArray" : L" 1D"); - break; + case TEX_DIMENSION_TEXTURE1D: wprintf(L"%ls", (info.arraySize > 1) ? L" 1DArray" : L" 1D"); break; case TEX_DIMENSION_TEXTURE2D: if (info.IsCubemap()) @@ -507,27 +505,16 @@ namespace } break; - case TEX_DIMENSION_TEXTURE3D: - wprintf(L" 3D"); - break; + case TEX_DIMENSION_TEXTURE3D: wprintf(L" 3D"); break; } switch (info.GetAlphaMode()) { - case TEX_ALPHA_MODE_OPAQUE: - wprintf(L" \x0e0:Opaque"); - break; - case TEX_ALPHA_MODE_PREMULTIPLIED: - wprintf(L" \x0e0:PM"); - break; - case TEX_ALPHA_MODE_STRAIGHT: - wprintf(L" \x0e0:NonPM"); - break; - case TEX_ALPHA_MODE_CUSTOM: - wprintf(L" \x0e0:Custom"); - break; - case TEX_ALPHA_MODE_UNKNOWN: - break; + case TEX_ALPHA_MODE_OPAQUE: wprintf(L" \x0e0:Opaque"); break; + case TEX_ALPHA_MODE_PREMULTIPLIED: wprintf(L" \x0e0:PM"); break; + case TEX_ALPHA_MODE_STRAIGHT: wprintf(L" \x0e0:NonPM"); break; + case TEX_ALPHA_MODE_CUSTOM: wprintf(L" \x0e0:Custom"); break; + case TEX_ALPHA_MODE_UNKNOWN: break; } wprintf(L")"); @@ -537,70 +524,69 @@ namespace { PrintLogo(false, g_ToolName, g_Description); - static const wchar_t* const s_usage = - L"Usage: texassemble [--] \n\n"; - - static const wchar_t* const s_fullUsage = - L"COMMANDS\n" - L" cube create cubemap\n" - L" volume create volume map\n" - L" array create texture array\n" - L" cubearray create cubemap array\n" - L" h-cross or v-cross create a cross image from a cubemap\n" - L" v-cross-fnz create a cross image flipping the -Z face\n" - L" h-tee create a 'T' image from a cubemap\n" - L" h-strip or v-strip create a strip image from a cubemap\n" - L" array-strip create a strip image from a 1D/2D array\n" - L" merge create texture from rgb image and alpha image\n" - L" gif create array from animated gif\n" - L" cube-from-hc create cubemap from a h-cross image\n" - L" cube-from-vc create cubemap from a v-cross image\n" - L" cube-from-vc-fnz create cubemap from a v-cross image flipping the -Z face\n" - L" cube-from-ht create cubemap from a h-tee image\n" - L" cube-from-hs create cubemap from a h-strip image\n" - L" cube-from-vs create cubemap from a v-strip image\n" - L" from-mips create texture with provided mipmap images\n" - L" cube-from-mips create cubemap with provided mipmap images per face\n" - L"\nOPTIONS\n" - L" -r wildcard filename search is recursive\n" - L" -flist , --file-list \n" - L" use text file with a list of input files (one per line)\n" - L"\n" - L" -w , --width width for output\n" - L" -h , --height height for output\n" - L" -m , --mip-levels miplevels for output (*-from-mips only)\n" - L" -f , --format pixel format for output\n" - L"\n" - L" -if , --image-filter image filtering\n" - L" -srgb{i|o}, --srgb-in, --srgb-out sRGB {input, output}\n" - L"\n" - L" -o output filename\n" - L" -l, --to-lowercase force output filename to lower case\n" - L" -y, --overwrite overwrite existing output file (if any)\n" - L"\n" - L" -sepalpha, --separate-alpha resize/generate mips alpha channel separately from color channels\n" - L"\n" - L" -nowic Force non-WIC filtering\n" - L" -wrap, -mirror texture addressing mode (wrap, mirror, or clamp)\n" - L" -alpha convert premultiplied alpha to straight alpha\n" - L" -dx10 Force use of 'DX10' extended header\n" - L" -nologo suppress copyright message\n" - L"\n" - L" -fl , --feature-level \n" - L" Set maximum feature level target (defaults to 11.0)\n" - L"\n" - L" -tonemap Apply a tonemap operator based on maximum luminance\n" - L"\n" - L" (gif only)\n" - L" --gif-bg-color Use background color instead of transparency\n" - L"\n" - L" (merge only)\n" - L" --swizzle Select channels for merge (defaults to rgbB)\n" - L"\n" - L" (cube, volume, array, cubearray, merge only)\n" - L" --strip-mips Use only base image from input dds files\n" - L"\n" - L" '-- ' is needed if any input filepath starts with the '-' or '/' character\n"; + static const wchar_t* const s_usage = L"Usage: texassemble [--] \n\n"; + + static const wchar_t* const s_fullUsage + = L"COMMANDS\n" + L" cube create cubemap\n" + L" volume create volume map\n" + L" array create texture array\n" + L" cubearray create cubemap array\n" + L" h-cross or v-cross create a cross image from a cubemap\n" + L" v-cross-fnz create a cross image flipping the -Z face\n" + L" h-tee create a 'T' image from a cubemap\n" + L" h-strip or v-strip create a strip image from a cubemap\n" + L" array-strip create a strip image from a 1D/2D array\n" + L" merge create texture from rgb image and alpha image\n" + L" gif create array from animated gif\n" + L" cube-from-hc create cubemap from a h-cross image\n" + L" cube-from-vc create cubemap from a v-cross image\n" + L" cube-from-vc-fnz create cubemap from a v-cross image flipping the -Z face\n" + L" cube-from-ht create cubemap from a h-tee image\n" + L" cube-from-hs create cubemap from a h-strip image\n" + L" cube-from-vs create cubemap from a v-strip image\n" + L" from-mips create texture with provided mipmap images\n" + L" cube-from-mips create cubemap with provided mipmap images per face\n" + L"\nOPTIONS\n" + L" -r wildcard filename search is recursive\n" + L" -flist , --file-list \n" + L" use text file with a list of input files (one per line)\n" + L"\n" + L" -w , --width width for output\n" + L" -h , --height height for output\n" + L" -m , --mip-levels miplevels for output (*-from-mips only)\n" + L" -f , --format pixel format for output\n" + L"\n" + L" -if , --image-filter image filtering\n" + L" -srgb{i|o}, --srgb-in, --srgb-out sRGB {input, output}\n" + L"\n" + L" -o output filename\n" + L" -l, --to-lowercase force output filename to lower case\n" + L" -y, --overwrite overwrite existing output file (if any)\n" + L"\n" + L" -sepalpha, --separate-alpha resize/generate mips alpha channel separately from color channels\n" + L"\n" + L" -nowic Force non-WIC filtering\n" + L" -wrap, -mirror texture addressing mode (wrap, mirror, or clamp)\n" + L" -alpha convert premultiplied alpha to straight alpha\n" + L" -dx10 Force use of 'DX10' extended header\n" + L" -nologo suppress copyright message\n" + L"\n" + L" -fl , --feature-level \n" + L" Set maximum feature level target (defaults to 11.0)\n" + L"\n" + L" -tonemap Apply a tonemap operator based on maximum luminance\n" + L"\n" + L" (gif only)\n" + L" --gif-bg-color Use background color instead of transparency\n" + L"\n" + L" (merge only)\n" + L" --swizzle Select channels for merge (defaults to rgbB)\n" + L"\n" + L" (cube, volume, array, cubearray, merge only)\n" + L" --strip-mips Use only base image from input dds files\n" + L"\n" + L" '-- ' is needed if any input filepath starts with the '-' or '/' character\n"; wprintf(L"%ls", s_usage); @@ -625,45 +611,37 @@ namespace { switch (fileType) { - case CODEC_DDS: - return SaveToDDSFile(img, DDS_FLAGS_NONE, szOutputFile); - - case CODEC_TGA: - return SaveToTGAFile(img, TGA_FLAGS_NONE, szOutputFile); - - case CODEC_HDR: - return SaveToHDRFile(img, szOutputFile); - - #ifdef USE_OPENEXR - case CODEC_EXR: - return SaveToEXRFile(img, szOutputFile); - #endif - #ifdef USE_LIBJPEG - case CODEC_JPEG: - return SaveToJPEGFile(img, JPEG_FLAGS_NONE, szOutputFile); - #endif - #ifdef USE_LIBPNG - case CODEC_PNG: - return SaveToPNGFile(img, PNG_FLAGS_NONE, szOutputFile); - #endif + case CODEC_DDS: return SaveToDDSFile(img, DDS_FLAGS_NONE, szOutputFile); - default: + case CODEC_TGA: return SaveToTGAFile(img, TGA_FLAGS_NONE, szOutputFile); + + case CODEC_HDR: return SaveToHDRFile(img, szOutputFile); + +#ifdef USE_OPENEXR + case CODEC_EXR: return SaveToEXRFile(img, szOutputFile); +#endif +#ifdef USE_LIBJPEG + case CODEC_JPEG: return SaveToJPEGFile(img, JPEG_FLAGS_NONE, szOutputFile); +#endif +#ifdef USE_LIBPNG + case CODEC_PNG: return SaveToPNGFile(img, PNG_FLAGS_NONE, szOutputFile); +#endif + + default: { + HRESULT hr = SaveToWICFile(img, WIC_FLAGS_NONE, GetWICCodec(static_cast(fileType)), szOutputFile); + if ((hr == static_cast(0xc00d5212) /* MF_E_TOPO_CODEC_NOT_FOUND */) && (fileType == WIC_CODEC_HEIF)) { - HRESULT hr = SaveToWICFile(img, WIC_FLAGS_NONE, GetWICCodec(static_cast(fileType)), szOutputFile); - if ((hr == static_cast(0xc00d5212) /* MF_E_TOPO_CODEC_NOT_FOUND */) && (fileType == WIC_CODEC_HEIF)) - { - wprintf(L"\nINFO: This format requires installing the HEIF Image Extensions - https://aka.ms/heif\n"); - } - return hr; + wprintf(L"\nINFO: This format requires installing the HEIF Image Extensions - https://aka.ms/heif\n"); } + return hr; + } } } - bool ParseSwizzleMask( - _In_reads_(4) const wchar_t* mask, - _Out_writes_(4) uint32_t* permuteElements, - _Out_writes_(4) uint32_t* zeroElements, - _Out_writes_(4) uint32_t* oneElements) noexcept + bool ParseSwizzleMask(_In_reads_(4) const wchar_t* mask, + _Out_writes_(4) uint32_t* permuteElements, + _Out_writes_(4) uint32_t* zeroElements, + _Out_writes_(4) uint32_t* oneElements) noexcept { if (!mask || !permuteElements || !zeroElements || !oneElements) return false; @@ -683,8 +661,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = 0; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -693,8 +671,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = 4; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -703,8 +681,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = 1; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -713,8 +691,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = 5; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -723,8 +701,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = 2; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -733,8 +711,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = 6; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -743,8 +721,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = 3; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -753,8 +731,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = 7; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -762,8 +740,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = k; - zeroElements[k] = 1; - oneElements[k] = 0; + zeroElements[k] = 1; + oneElements[k] = 0; } break; @@ -771,19 +749,18 @@ namespace for (uint32_t k = j; k < 4; ++k) { permuteElements[k] = k; - zeroElements[k] = 0; - oneElements[k] = 1; + zeroElements[k] = 0; + oneElements[k] = 1; } break; - default: - return false; + default: return false; } } return true; } -} +} // namespace //-------------------------------------------------------------------------------------- // Entry-point @@ -795,24 +772,24 @@ namespace int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { // Parameters and defaults - size_t width = 0; - size_t height = 0; + size_t width = 0; + size_t height = 0; size_t mipLevels = 0; - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; - TEX_FILTER_FLAGS dwFilter = TEX_FILTER_DEFAULT; - TEX_FILTER_FLAGS dwSRGB = TEX_FILTER_DEFAULT; + DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; + TEX_FILTER_FLAGS dwFilter = TEX_FILTER_DEFAULT; + TEX_FILTER_FLAGS dwSRGB = TEX_FILTER_DEFAULT; TEX_FILTER_FLAGS dwFilterOpts = TEX_FILTER_DEFAULT; - uint32_t fileType = WIC_CODEC_BMP; - uint32_t maxSize = 16384; - uint32_t maxCube = 16384; - uint32_t maxArray = 2048; - uint32_t maxVolume = 2048; + uint32_t fileType = WIC_CODEC_BMP; + uint32_t maxSize = 16384; + uint32_t maxCube = 16384; + uint32_t maxArray = 2048; + uint32_t maxVolume = 2048; // DXTex's Open Alpha onto Surface always loaded alpha from the blue channel uint32_t permuteElements[4] = { 0, 1, 2, 6 }; - uint32_t zeroElements[4] = {}; - uint32_t oneElements[4] = {}; + uint32_t zeroElements[4] = {}; + uint32_t oneElements[4] = {}; std::wstring outputFile; @@ -877,16 +854,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) case CMD_CUBE_FROM_HS: case CMD_CUBE_FROM_VS: case CMD_FROM_MIPS: - case CMD_CUBE_FROM_MIPS: - break; + case CMD_CUBE_FROM_MIPS: break; - case CMD_HELP: - PrintUsage(true); - return 0; + case CMD_HELP: PrintUsage(true); return 0; - case CMD_FEEDBACK: - std::ignore = ShellExecuteW(nullptr, L"open", g_FeedbackURL, nullptr, nullptr, SW_SHOW); - return 0; + case CMD_FEEDBACK: std::ignore = ShellExecuteW(nullptr, L"open", g_FeedbackURL, nullptr, nullptr, SW_SHOW); return 0; default: wprintf(L"Must use one of: "); @@ -894,9 +866,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - uint32_t dwOptions = 0; + uint32_t dwOptions = 0; std::list conversion; - bool allowOpts = true; + bool allowOpts = true; for (int iArg = 2; iArg < argc; ++iArg) { @@ -905,13 +877,14 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (allowOpts && (('-' == pArg[0]) || ('/' == pArg[0]))) { uint32_t dwOption = 0; - PWSTR pValue = nullptr; + PWSTR pValue = nullptr; if (('-' == pArg[0]) && ('-' == pArg[1])) { if (pArg[2] == 0) { - // "-- " is the POSIX standard for "end of options" marking to escape the '-' and '/' characters at the start of filepaths. + // "-- " is the POSIX standard for "end of options" marking to escape the '-' and '/' characters at the start of + // filepaths. allowOpts = false; continue; } @@ -919,7 +892,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { pArg += 2; - for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue); + for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue) + ; if (*pValue) *pValue++ = 0; @@ -931,7 +905,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { pArg++; - for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue); + for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue) + ; if (*pValue) *pValue++ = 0; @@ -950,9 +925,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) switch (dwOption) { - case 0: - wprintf(L"ERROR: Unknown option: `%ls`\n\nUse %ls --help\n", pArg, g_ToolName); - return 1; + case 0: wprintf(L"ERROR: Unknown option: `%ls`\n\nUse %ls --help\n", pArg, g_ToolName); return 1; case OPT_FILELIST: case OPT_WIDTH: @@ -969,13 +942,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) // These don't use flag bits break; - case OPT_VERSION: - PrintLogo(true, g_ToolName, g_Description); - return 0; + case OPT_VERSION: PrintLogo(true, g_ToolName, g_Description); return 0; - case OPT_HELP: - PrintUsage(); - return 0; + case OPT_HELP: PrintUsage(); return 0; default: if (dwOptions & (UINT32_C(1) << dwOption)) @@ -1013,8 +982,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - default: - break; + default: break; } switch (dwOption) @@ -1070,54 +1038,42 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - case OPT_SRGBI: - dwSRGB |= TEX_FILTER_SRGB_IN; - break; + case OPT_SRGBI: dwSRGB |= TEX_FILTER_SRGB_IN; break; - case OPT_SRGBO: - dwSRGB |= TEX_FILTER_SRGB_OUT; - break; + case OPT_SRGBO: dwSRGB |= TEX_FILTER_SRGB_OUT; break; - case OPT_SRGB: - dwSRGB |= TEX_FILTER_SRGB; - break; + case OPT_SRGB: dwSRGB |= TEX_FILTER_SRGB; break; - case OPT_SEPALPHA: - dwFilterOpts |= TEX_FILTER_SEPARATE_ALPHA; - break; + case OPT_SEPALPHA: dwFilterOpts |= TEX_FILTER_SEPARATE_ALPHA; break; - case OPT_NO_WIC: - dwFilterOpts |= TEX_FILTER_FORCE_NON_WIC; - break; + case OPT_NO_WIC: dwFilterOpts |= TEX_FILTER_FORCE_NON_WIC; break; - case OPT_OUTPUTFILE: - { - std::filesystem::path path(pValue); - outputFile = path.make_preferred().native(); + case OPT_OUTPUTFILE: { + std::filesystem::path path(pValue); + outputFile = path.make_preferred().native(); + + fileType = LookupByName(path.extension().c_str(), g_pExtFileTypes); - fileType = LookupByName(path.extension().c_str(), g_pExtFileTypes); + switch (dwCommand) + { + case CMD_H_CROSS: + case CMD_V_CROSS: + case CMD_V_CROSS_FNZ: + case CMD_H_TEE: + case CMD_H_STRIP: + case CMD_V_STRIP: + case CMD_MERGE: + case CMD_ARRAY_STRIP: break; - switch (dwCommand) + default: + if (fileType != CODEC_DDS) { - case CMD_H_CROSS: - case CMD_V_CROSS: - case CMD_V_CROSS_FNZ: - case CMD_H_TEE: - case CMD_H_STRIP: - case CMD_V_STRIP: - case CMD_MERGE: - case CMD_ARRAY_STRIP: - break; - - default: - if (fileType != CODEC_DDS) - { - wprintf(L"Assembled output file must be a dds\n"); - return 1; - } + wprintf(L"Assembled output file must be a dds\n"); + return 1; } - break; } + break; + } case OPT_TA_WRAP: if (dwFilterOpts & TEX_FILTER_MIRROR) @@ -1139,26 +1095,25 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) dwFilterOpts |= TEX_FILTER_MIRROR; break; - case OPT_FILELIST: + case OPT_FILELIST: { + std::filesystem::path path(pValue); + std::wifstream inFile(path.make_preferred().c_str()); + if (!inFile) { - std::filesystem::path path(pValue); - std::wifstream inFile(path.make_preferred().c_str()); - if (!inFile) - { - wprintf(L"Error opening -flist file %ls\n", pValue); - return 1; - } + wprintf(L"Error opening -flist file %ls\n", pValue); + return 1; + } - inFile.imbue(std::locale::classic()); + inFile.imbue(std::locale::classic()); - ProcessFileList(inFile, conversion); - } - break; + ProcessFileList(inFile, conversion); + } + break; case OPT_FEATURE_LEVEL: - maxSize = LookupByName(pValue, g_pFeatureLevels); - maxCube = LookupByName(pValue, g_pFeatureLevelsCube); - maxArray = LookupByName(pValue, g_pFeatureLevelsArray); + maxSize = LookupByName(pValue, g_pFeatureLevels); + maxCube = LookupByName(pValue, g_pFeatureLevelsCube); + maxArray = LookupByName(pValue, g_pFeatureLevelsArray); maxVolume = LookupByName(pValue, g_pFeatureLevelsVolume); if (!maxSize || !maxCube || !maxArray || !maxVolume) { @@ -1190,7 +1145,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else if (!ParseSwizzleMask(pValue, permuteElements, zeroElements, oneElements)) { - wprintf(L"-swizzle requires a 1 to 4 character mask composed of these letters: r, g, b, a, x, y, w, z, 0, 1.\n Lowercase letters are from the first image, upper-case letters are from the second image.\n"); + wprintf( + L"-swizzle requires a 1 to 4 character mask composed of these letters: r, g, b, a, x, y, w, z, 0, 1.\n " + L"Lowercase letters are from the first image, upper-case letters are from the second image.\n"); return 1; } break; @@ -1202,22 +1159,18 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) case CMD_VOLUME: case CMD_ARRAY: case CMD_CUBEARRAY: - case CMD_MERGE: - break; + case CMD_MERGE: break; - default: - wprintf(L"-stripmips only applies to cube, volume, array, cubearray, or merge commands\n"); - return 1; + default: wprintf(L"-stripmips only applies to cube, volume, array, cubearray, or merge commands\n"); return 1; } break; - default: - break; + default: break; } } else if (wcspbrk(pArg, L"?*") != nullptr) { - const size_t count = conversion.size(); + const size_t count = conversion.size(); std::filesystem::path path(pArg); SearchForFiles(path.make_preferred(), conversion, (dwOptions & (UINT32_C(1) << OPT_RECURSIVE)) != 0, nullptr); if (conversion.size() <= count) @@ -1228,7 +1181,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else { - SConversion conv = {}; + SConversion conv = {}; std::filesystem::path path(pArg); conv.szSrc = path.make_preferred().native(); conversion.push_back(conv); @@ -1291,8 +1244,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (conversion.size() != mipLevels) { - wprintf(L"ERROR: number of input files (%zu) doesn't match the specified mip levels for given dimensions (%zu x %zu, %zu mip levels)\n", - conversion.size(), width, height, mipLevels); + wprintf( + L"ERROR: number of input files (%zu) doesn't match the specified mip levels for given dimensions (%zu x %zu, %zu mip " + L"levels)\n", + conversion.size(), + width, + height, + mipLevels); return 1; } } @@ -1319,15 +1277,19 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (conversion.size() != (mipLevels * 6)) { - wprintf(L"ERROR: number of input files (%zu) doesn't match the specified mip levels for given dimensions (%zu x %zu, %zu mip levels)\n", - conversion.size(), width, height, mipLevels); + wprintf( + L"ERROR: number of input files (%zu) doesn't match the specified mip levels for given dimensions (%zu x %zu, %zu mip " + L"levels)\n", + conversion.size(), + width, + height, + mipLevels); return 1; } } break; - default: - break; + default: break; } // Convert images @@ -1360,7 +1322,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) for (auto pConv = conversion.begin(); pConv != conversion.end(); ++pConv) { std::filesystem::path curpath(pConv->szSrc); - const auto ext = curpath.extension(); + const auto ext = curpath.extension(); // Load source image if (pConv != conversion.begin()) @@ -1375,9 +1337,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) case CMD_H_TEE: case CMD_H_STRIP: case CMD_V_STRIP: - case CMD_ARRAY_STRIP: - outputFile = curpath.stem().concat(L".bmp").native(); - break; + case CMD_ARRAY_STRIP: outputFile = curpath.stem().concat(L".bmp").native(); break; default: if (_wcsicmp(curpath.extension().c_str(), L".dds") == 0) @@ -1394,7 +1354,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"reading %ls", curpath.c_str()); fflush(stdout); - TexMetadata info; + TexMetadata info; std::unique_ptr image(new (std::nothrow) ScratchImage); if (!image) { @@ -1486,8 +1446,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"\nERROR: Can't assemble using input mips. To ignore mips, try again with -stripmips\n"); return 1; - default: - break; + default: break; } } } @@ -1511,7 +1470,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } } - #ifdef USE_OPENEXR +#ifdef USE_OPENEXR else if (_wcsicmp(ext.c_str(), L".exr") == 0) { hr = LoadFromEXRFile(curpath.c_str(), &info, *image); @@ -1521,8 +1480,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } } - #endif - #ifdef USE_LIBJPEG +#endif +#ifdef USE_LIBJPEG else if (_wcsicmp(ext.c_str(), L".jpg") == 0 || _wcsicmp(ext.c_str(), L".jpeg") == 0) { hr = LoadFromJPEGFile(curpath.c_str(), JPEG_FLAGS_NONE, &info, *image); @@ -1532,8 +1491,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } } - #endif - #ifdef USE_LIBPNG +#endif +#ifdef USE_LIBPNG else if (_wcsicmp(ext.c_str(), L".png") == 0) { PNG_FLAGS pngFlags = (IsBGR(format)) ? PNG_FLAGS_BGR : PNG_FLAGS_NONE; @@ -1545,17 +1504,23 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } } - #endif +#endif else { // WIC shares the same filter values for mode and dither - static_assert(static_cast(WIC_FLAGS_DITHER) == static_cast(TEX_FILTER_DITHER), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_DITHER_DIFFUSION) == static_cast(TEX_FILTER_DITHER_DIFFUSION), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_POINT) == static_cast(TEX_FILTER_POINT), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_LINEAR) == static_cast(TEX_FILTER_LINEAR), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_CUBIC) == static_cast(TEX_FILTER_CUBIC), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_FANT) == static_cast(TEX_FILTER_FANT), "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_DITHER) == static_cast(TEX_FILTER_DITHER), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_DITHER_DIFFUSION) == static_cast(TEX_FILTER_DITHER_DIFFUSION), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_POINT) == static_cast(TEX_FILTER_POINT), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_LINEAR) == static_cast(TEX_FILTER_LINEAR), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_CUBIC) == static_cast(TEX_FILTER_CUBIC), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_FANT) == static_cast(TEX_FILTER_FANT), + "WIC_FLAGS_* & TEX_FILTER_* should match"); hr = LoadFromWICFile(curpath.c_str(), WIC_FLAGS_ALL_FRAMES | dwFilter, &info, *image); if (FAILED(hr)) @@ -1569,7 +1534,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else if (_wcsicmp(ext.c_str(), L".webp") == 0) { - wprintf(L"INFO: This format requires installing the WEBP Image Extensions - https://www.microsoft.com/p/webp-image-extensions/9pg2dk419drg\n"); + wprintf( + L"INFO: This format requires installing the WEBP Image Extensions - " + L"https://www.microsoft.com/p/webp-image-extensions/9pg2dk419drg\n"); } } return 1; @@ -1666,8 +1633,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } TexMetadata mdata = info; - mdata.mipLevels = 1; - hr = timage->Initialize(mdata); + mdata.mipLevels = 1; + hr = timage->Initialize(mdata); if (FAILED(hr)) { wprintf(L" FAILED [copy to single level] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -1678,8 +1645,12 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { for (size_t d = 0; d < info.depth; ++d) { - hr = CopyRectangle(*image->GetImage(0, 0, d), Rect(0, 0, info.width, info.height), - *timage->GetImage(0, 0, d), TEX_FILTER_DEFAULT, 0, 0); + hr = CopyRectangle(*image->GetImage(0, 0, d), + Rect(0, 0, info.width, info.height), + *timage->GetImage(0, 0, d), + TEX_FILTER_DEFAULT, + 0, + 0); if (FAILED(hr)) { wprintf(L" FAILED [copy to single level] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -1691,8 +1662,12 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { for (size_t i = 0; i < info.arraySize; ++i) { - hr = CopyRectangle(*image->GetImage(0, i, 0), Rect(0, 0, info.width, info.height), - *timage->GetImage(0, i, 0), TEX_FILTER_DEFAULT, 0, 0); + hr = CopyRectangle(*image->GetImage(0, i, 0), + Rect(0, 0, info.width, info.height), + *timage->GetImage(0, i, 0), + TEX_FILTER_DEFAULT, + 0, + 0); if (FAILED(hr)) { wprintf(L" FAILED [copy to single level] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -1706,9 +1681,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } // --- Undo Premultiplied Alpha (if requested) --------------------------------- - if ((dwOptions & (UINT32_C(1) << OPT_DEMUL_ALPHA)) - && HasAlpha(info.format) - && info.format != DXGI_FORMAT_A8_UNORM) + if ((dwOptions & (UINT32_C(1) << OPT_DEMUL_ALPHA)) && HasAlpha(info.format) && info.format != DXGI_FORMAT_A8_UNORM) { if (info.GetAlphaMode() == TEX_ALPHA_MODE_STRAIGHT) { @@ -1738,7 +1711,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - auto& tinfo = timage->GetMetadata(); + auto& tinfo = timage->GetMetadata(); info.miscFlags2 = tinfo.miscFlags2; assert(info.width == tinfo.width); @@ -1763,78 +1736,81 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) height = info.height; } - size_t targetWidth = width; + size_t targetWidth = width; size_t targetHeight = height; - switch(dwCommand) + switch (dwCommand) { - case CMD_FROM_MIPS: + case CMD_FROM_MIPS: { + if (!conversionIndex) { - if (!conversionIndex) - { - if (mipLevels == 0) - { - mipLevels = conversion.size(); - } - - if (!CalculateMipLevels(width, height, mipLevels)) - { - wprintf(L"\nERROR: Too many input mips provided for the given dimensions of %zu x %zu.\n", width, height); - return 1; - } - } - - size_t mipdiv = 1; - for (size_t i = 0; i < conversionIndex; ++i) + if (mipLevels == 0) { - mipdiv = mipdiv + mipdiv; + mipLevels = conversion.size(); } - targetWidth /= mipdiv; - targetHeight /= mipdiv; - if (targetWidth == 0 || targetHeight == 0) + if (!CalculateMipLevels(width, height, mipLevels)) { - wprintf(L"\nERROR: Too many input mips provided. For the dimensions of the first mip provided, only %zu input mips can be used.\n", conversionIndex); + wprintf(L"\nERROR: Too many input mips provided for the given dimensions of %zu x %zu.\n", width, height); return 1; } } - break; - case CMD_CUBE_FROM_MIPS: + size_t mipdiv = 1; + for (size_t i = 0; i < conversionIndex; ++i) { - if (!conversionIndex) - { - if (mipLevels == 0) - { - mipLevels = conversion.size() / 6; - } - - if (!CalculateMipLevels(width, height, mipLevels)) - { - wprintf(L"\nERROR: Too many input mips provided for the given dimensions of %zu x %zu.\n", width, height); - return 1; - } - } + mipdiv = mipdiv + mipdiv; + } - size_t t = conversionIndex % mipLevels; + targetWidth /= mipdiv; + targetHeight /= mipdiv; + if (targetWidth == 0 || targetHeight == 0) + { + wprintf( + L"\nERROR: Too many input mips provided. For the dimensions of the first mip provided, only %zu input mips can be " + L"used.\n", + conversionIndex); + return 1; + } + } + break; - size_t mipdiv = 1; - for (size_t i = 0; i < t; ++i) + case CMD_CUBE_FROM_MIPS: { + if (!conversionIndex) + { + if (mipLevels == 0) { - mipdiv = mipdiv + mipdiv; + mipLevels = conversion.size() / 6; } - targetWidth /= mipdiv; - targetHeight /= mipdiv; - if (targetWidth == 0 || targetHeight == 0) + if (!CalculateMipLevels(width, height, mipLevels)) { - wprintf(L"\nERROR: Too many input mips provided. For the dimensions of the first mip provided, only %zu input mips can be used.\n", conversionIndex); + wprintf(L"\nERROR: Too many input mips provided for the given dimensions of %zu x %zu.\n", width, height); return 1; } } - break; - default: - break; + size_t t = conversionIndex % mipLevels; + + size_t mipdiv = 1; + for (size_t i = 0; i < t; ++i) + { + mipdiv = mipdiv + mipdiv; + } + + targetWidth /= mipdiv; + targetHeight /= mipdiv; + if (targetWidth == 0 || targetHeight == 0) + { + wprintf( + L"\nERROR: Too many input mips provided. For the dimensions of the first mip provided, only %zu input mips can be " + L"used.\n", + conversionIndex); + return 1; + } + } + break; + + default: break; } if (info.width != targetWidth || info.height != targetHeight) @@ -1846,7 +1822,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - hr = Resize(image->GetImages(), image->GetImageCount(), image->GetMetadata(), targetWidth, targetHeight, dwFilter | dwFilterOpts, *timage.get()); + hr = Resize(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), + targetWidth, + targetHeight, + dwFilter | dwFilterOpts, + *timage.get()); if (FAILED(hr)) { wprintf(L" FAILED [resize] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -1856,8 +1838,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) auto& tinfo = timage->GetMetadata(); assert(tinfo.width == targetWidth && tinfo.height == targetHeight && tinfo.mipLevels == 1); - info.width = tinfo.width; - info.height = tinfo.height; + info.width = tinfo.width; + info.height = tinfo.height; info.mipLevels = 1; assert(info.depth == tinfo.depth); @@ -1881,7 +1863,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) // Compute max luminosity across all images XMVECTOR maxLum = XMVectorZero(); - hr = EvaluateImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = EvaluateImage(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](const XMVECTOR* pixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -1907,7 +1891,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) // http://www.cs.utah.edu/~reinhard/cdrom/ maxLum = XMVectorMultiply(maxLum, maxLum); - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -1916,25 +1903,25 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { XMVECTOR value = inPixels[j]; - const XMVECTOR scale = XMVectorDivide( - XMVectorAdd(g_XMOne, XMVectorDivide(value, maxLum)), - XMVectorAdd(g_XMOne, value)); + const XMVECTOR scale + = XMVectorDivide(XMVectorAdd(g_XMOne, XMVectorDivide(value, maxLum)), XMVectorAdd(g_XMOne, value)); const XMVECTOR nvalue = XMVectorMultiply(value, scale); value = XMVectorSelect(value, nvalue, g_XMSelect1110); outPixels[j] = value; } - }, *timage); + }, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [tonemap apply] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(info.width == tinfo.width); assert(info.height == tinfo.height); @@ -1962,8 +1949,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - hr = Convert(image->GetImages(), image->GetImageCount(), image->GetMetadata(), format, - dwFilter | dwFilterOpts | dwSRGB, TEX_THRESHOLD_DEFAULT, *timage.get()); + hr = Convert(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), + format, + dwFilter | dwFilterOpts | dwSRGB, + TEX_THRESHOLD_DEFAULT, + *timage.get()); if (FAILED(hr)) { wprintf(L" FAILED [convert] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -2022,8 +2014,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) case CMD_CUBE_FROM_VC_FNZ: case CMD_CUBE_FROM_HT: case CMD_CUBE_FROM_HS: - case CMD_CUBE_FROM_VS: - break; + case CMD_CUBE_FROM_VS: break; default: if (images < 2) @@ -2042,734 +2033,720 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) case CMD_V_CROSS_FNZ: case CMD_H_TEE: case CMD_H_STRIP: - case CMD_V_STRIP: + case CMD_V_STRIP: { + size_t twidth = 0; + size_t theight = 0; + + switch (dwCommand) { - size_t twidth = 0; - size_t theight = 0; + case CMD_H_CROSS: + case CMD_H_TEE: + twidth = width * 4; + theight = height * 3; + break; - switch (dwCommand) - { - case CMD_H_CROSS: - case CMD_H_TEE: - twidth = width * 4; - theight = height * 3; - break; + case CMD_V_CROSS: + case CMD_V_CROSS_FNZ: + twidth = width * 3; + theight = height * 4; + break; - case CMD_V_CROSS: - case CMD_V_CROSS_FNZ: - twidth = width * 3; - theight = height * 4; - break; + case CMD_H_STRIP: + twidth = width * 6; + theight = height; + break; - case CMD_H_STRIP: - twidth = width * 6; - theight = height; - break; + case CMD_V_STRIP: + twidth = width; + theight = height * 6; + break; - case CMD_V_STRIP: - twidth = width; - theight = height * 6; - break; + default: break; + } - default: - break; - } + ScratchImage result; + hr = result.Initialize2D(format, twidth, theight, 1, 1); + if (FAILED(hr)) + { + wprintf(L"FAILED setting up result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } - ScratchImage result; - hr = result.Initialize2D(format, twidth, theight, 1, 1); - if (FAILED(hr)) + auto src = loadedImages.cbegin(); + auto dest = result.GetImage(0, 0, 0); + + for (size_t index = 0; index < 6; ++index) + { + auto img = (*src)->GetImage(0, index, 0); + if (!img) { - wprintf(L"FAILED setting up result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + wprintf(L"FAILED: Unexpected error\n"); return 1; } - auto src = loadedImages.cbegin(); - auto dest = result.GetImage(0, 0, 0); - - for (size_t index = 0; index < 6; ++index) - { - auto img = (*src)->GetImage(0, index, 0); - if (!img) - { - wprintf(L"FAILED: Unexpected error\n"); - return 1; - } - - const Rect rect(0, 0, width, height); - - size_t offsetx = 0; - size_t offsety = 0; - TEX_FR_FLAGS flipRotate = TEX_FR_ROTATE0; - - switch (dwCommand) - { - case CMD_H_CROSS: - { - // +Y - // -X +Z +X -Z - // -Y - - static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 3 }; - static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 1 }; - - offsetx = s_offsetx[index] * width; - offsety = s_offsety[index] * height; - break; - } - - case CMD_V_CROSS: - { - // +Y - // -X +Z +X - // -Y - // -Z - static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 1 }; - static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 3 }; - - offsetx = s_offsetx[index] * width; - offsety = s_offsety[index] * height; - break; - } - - case CMD_V_CROSS_FNZ: - { - // +Y - // -X +Z +X - // -Y - // -Z (flipped H/V) - static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 1 }; - static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 3 }; + const Rect rect(0, 0, width, height); - offsetx = s_offsetx[index] * width; - offsety = s_offsety[index] * height; + size_t offsetx = 0; + size_t offsety = 0; + TEX_FR_FLAGS flipRotate = TEX_FR_ROTATE0; - if (index == 5) - { - flipRotate = TEX_FR_ROTATE180; - } - break; - } + switch (dwCommand) + { + case CMD_H_CROSS: { + // +Y + // -X +Z +X -Z + // -Y - case CMD_H_TEE: - { - // +Y - // +Z +X -Z -X - // -Y + static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 3 }; + static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 1 }; - static const size_t s_offsetx[6] = { 1, 3, 0, 0, 0, 2 }; - static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 1 }; + offsetx = s_offsetx[index] * width; + offsety = s_offsety[index] * height; + break; + } - offsetx = s_offsetx[index] * width; - offsety = s_offsety[index] * height; - break; - } + case CMD_V_CROSS: { + // +Y + // -X +Z +X + // -Y + // -Z + static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 1 }; + static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 3 }; - case CMD_H_STRIP: - // +X -X +Y -Y +Z -Z - offsetx = index * width; - break; + offsetx = s_offsetx[index] * width; + offsety = s_offsety[index] * height; + break; + } - case CMD_V_STRIP: - // +X - // -X - // +Y - // -Y - // +Z - // -Z - offsety = index * height; - break; + case CMD_V_CROSS_FNZ: { + // +Y + // -X +Z +X + // -Y + // -Z (flipped H/V) + static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 1 }; + static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 3 }; - default: - break; - } + offsetx = s_offsetx[index] * width; + offsety = s_offsety[index] * height; - if (flipRotate != TEX_FR_ROTATE0) - { - ScratchImage tmp; - hr = FlipRotate(*img, flipRotate, tmp); - if (SUCCEEDED(hr)) - { - hr = CopyRectangle(*tmp.GetImage(0, 0, 0), rect, *dest, dwFilter | dwFilterOpts, offsetx, offsety); - } - } - else + if (index == 5) { - hr = CopyRectangle(*img, rect, *dest, dwFilter | dwFilterOpts, offsetx, offsety); + flipRotate = TEX_FR_ROTATE180; } + break; + } - if (FAILED(hr)) - { - wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); - return 1; - } + case CMD_H_TEE: { + // +Y + // +Z +X -Z -X + // -Y + + static const size_t s_offsetx[6] = { 1, 3, 0, 0, 0, 2 }; + static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 1 }; + + offsetx = s_offsetx[index] * width; + offsety = s_offsety[index] * height; + break; } - // Write cross/strip - wprintf(L"\nWriting %ls ", outputFile.c_str()); - PrintInfo(result.GetMetadata()); - wprintf(L"\n"); - fflush(stdout); + case CMD_H_STRIP: + // +X -X +Y -Y +Z -Z + offsetx = index * width; + break; - if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) - { - std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); + case CMD_V_STRIP: + // +X + // -X + // +Y + // -Y + // +Z + // -Z + offsety = index * height; + break; + + default: break; } - if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + if (flipRotate != TEX_FR_ROTATE0) { - if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) + ScratchImage tmp; + hr = FlipRotate(*img, flipRotate, tmp); + if (SUCCEEDED(hr)) { - wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); - return 1; + hr = CopyRectangle(*tmp.GetImage(0, 0, 0), rect, *dest, dwFilter | dwFilterOpts, offsetx, offsety); } } + else + { + hr = CopyRectangle(*img, rect, *dest, dwFilter | dwFilterOpts, offsetx, offsety); + } - hr = SaveImageFile(*dest, fileType, outputFile.c_str()); if (FAILED(hr)) { - wprintf(L" FAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } - break; } - case CMD_MERGE: + // Write cross/strip + wprintf(L"\nWriting %ls ", outputFile.c_str()); + PrintInfo(result.GetMetadata()); + wprintf(L"\n"); + fflush(stdout); + + if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) { - // Capture data from our second source image - ScratchImage tempImage; - hr = Convert(*loadedImages[1]->GetImage(0, 0, 0), DXGI_FORMAT_R32G32B32A32_FLOAT, - dwFilter | dwFilterOpts | dwSRGB, TEX_THRESHOLD_DEFAULT, tempImage); - if (FAILED(hr)) + std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); + } + + if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + { + if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) { - wprintf(L" FAILED [convert second input] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); return 1; } + } - const Image& img = *tempImage.GetImage(0, 0, 0); - - // Merge with our first source image - const Image& rgb = *loadedImages[0]->GetImage(0, 0, 0); + hr = SaveImageFile(*dest, fileType, outputFile.c_str()); + if (FAILED(hr)) + { + wprintf(L" FAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } + break; + } - const XMVECTOR zc = XMVectorSelectControl(zeroElements[0], zeroElements[1], zeroElements[2], zeroElements[3]); - const XMVECTOR oc = XMVectorSelectControl(oneElements[0], oneElements[1], oneElements[2], oneElements[3]); + case CMD_MERGE: { + // Capture data from our second source image + ScratchImage tempImage; + hr = Convert(*loadedImages[1]->GetImage(0, 0, 0), + DXGI_FORMAT_R32G32B32A32_FLOAT, + dwFilter | dwFilterOpts | dwSRGB, + TEX_THRESHOLD_DEFAULT, + tempImage); + if (FAILED(hr)) + { + wprintf(L" FAILED [convert second input] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } - ScratchImage result; - hr = TransformImage(rgb, [&, zc, oc](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) - { - const XMVECTOR *inPixels2 = reinterpret_cast(img.pixels + img.rowPitch * y); + const Image& img = *tempImage.GetImage(0, 0, 0); - for (size_t j = 0; j < w; ++j) - { - XMVECTOR pixel = XMVectorPermute(inPixels[j], inPixels2[j], - permuteElements[0], permuteElements[1], permuteElements[2], permuteElements[3]); - pixel = XMVectorSelect(pixel, g_XMZero, zc); - outPixels[j] = XMVectorSelect(pixel, g_XMOne, oc); - } - }, result); - if (FAILED(hr)) - { - wprintf(L" FAILED [merge image] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); - return 1; - } + // Merge with our first source image + const Image& rgb = *loadedImages[0]->GetImage(0, 0, 0); - // Write merged texture - wprintf(L"\nWriting %ls ", outputFile.c_str()); - PrintInfo(result.GetMetadata()); - wprintf(L"\n"); - fflush(stdout); + const XMVECTOR zc = XMVectorSelectControl(zeroElements[0], zeroElements[1], zeroElements[2], zeroElements[3]); + const XMVECTOR oc = XMVectorSelectControl(oneElements[0], oneElements[1], oneElements[2], oneElements[3]); - if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) + ScratchImage result; + hr = TransformImage( + rgb, + [&, zc, oc](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { - std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); - } + const XMVECTOR* inPixels2 = reinterpret_cast(img.pixels + img.rowPitch * y); - if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) - { - if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) + for (size_t j = 0; j < w; ++j) { - wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); - return 1; + XMVECTOR pixel = XMVectorPermute(inPixels[j], + inPixels2[j], + permuteElements[0], + permuteElements[1], + permuteElements[2], + permuteElements[3]); + pixel = XMVectorSelect(pixel, g_XMZero, zc); + outPixels[j] = XMVectorSelect(pixel, g_XMOne, oc); } - } - - hr = SaveImageFile(*result.GetImage(0, 0, 0), fileType, outputFile.c_str()); - if (FAILED(hr)) - { - wprintf(L" FAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); - return 1; - } - break; + }, + result); + if (FAILED(hr)) + { + wprintf(L" FAILED [merge image] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; } - case CMD_ARRAY_STRIP: + // Write merged texture + wprintf(L"\nWriting %ls ", outputFile.c_str()); + PrintInfo(result.GetMetadata()); + wprintf(L"\n"); + fflush(stdout); + + if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) { - const size_t twidth = width; - const size_t theight = height * images; + std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); + } - ScratchImage result; - hr = result.Initialize2D(format, twidth, theight, 1, 1); - if (FAILED(hr)) + if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + { + if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) { - wprintf(L"FAILED setting up result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); return 1; } + } - auto src = loadedImages.cbegin(); - auto dest = result.GetImage(0, 0, 0); - - for (size_t index = 0; index < images; ++index) - { - auto img = (*src)->GetImage(0, index, 0); - if (!img) - { - wprintf(L"FAILED: Unexpected error\n"); - return 1; - } + hr = SaveImageFile(*result.GetImage(0, 0, 0), fileType, outputFile.c_str()); + if (FAILED(hr)) + { + wprintf(L" FAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } + break; + } - const Rect rect(0, 0, width, height); + case CMD_ARRAY_STRIP: { + const size_t twidth = width; + const size_t theight = height * images; - constexpr size_t offsetx = 0; - size_t offsety = 0; + ScratchImage result; + hr = result.Initialize2D(format, twidth, theight, 1, 1); + if (FAILED(hr)) + { + wprintf(L"FAILED setting up result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } - offsety = index * height; + auto src = loadedImages.cbegin(); + auto dest = result.GetImage(0, 0, 0); - hr = CopyRectangle(*img, rect, *dest, dwFilter | dwFilterOpts, offsetx, offsety); - if (FAILED(hr)) - { - wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); - return 1; - } + for (size_t index = 0; index < images; ++index) + { + auto img = (*src)->GetImage(0, index, 0); + if (!img) + { + wprintf(L"FAILED: Unexpected error\n"); + return 1; } - // Write array strip - wprintf(L"\nWriting %ls ", outputFile.c_str()); - PrintInfo(result.GetMetadata()); - wprintf(L"\n"); - fflush(stdout); + const Rect rect(0, 0, width, height); - if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) - { - std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); - } + constexpr size_t offsetx = 0; + size_t offsety = 0; + + offsety = index * height; - if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + hr = CopyRectangle(*img, rect, *dest, dwFilter | dwFilterOpts, offsetx, offsety); + if (FAILED(hr)) { - if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) - { - wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); - return 1; - } + wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; } + } - hr = SaveImageFile(*dest, fileType, outputFile.c_str()); - if (FAILED(hr)) + // Write array strip + wprintf(L"\nWriting %ls ", outputFile.c_str()); + PrintInfo(result.GetMetadata()); + wprintf(L"\n"); + fflush(stdout); + + if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) + { + std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); + } + + if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + { + if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) { - wprintf(L" FAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); return 1; } - break; } + hr = SaveImageFile(*dest, fileType, outputFile.c_str()); + if (FAILED(hr)) + { + wprintf(L" FAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } + break; + } + case CMD_CUBE_FROM_HC: case CMD_CUBE_FROM_VC: case CMD_CUBE_FROM_VC_FNZ: case CMD_CUBE_FROM_HT: case CMD_CUBE_FROM_HS: - case CMD_CUBE_FROM_VS: + case CMD_CUBE_FROM_VS: { + auto src = loadedImages.cbegin(); + auto img = (*src)->GetImage(0, 0, 0); + size_t ratio_w = 1; + size_t ratio_h = 1; + + switch (dwCommand) { - auto src = loadedImages.cbegin(); - auto img = (*src)->GetImage(0, 0, 0); - size_t ratio_w = 1; - size_t ratio_h = 1; + case CMD_CUBE_FROM_HC: + case CMD_CUBE_FROM_HT: + ratio_w = 4; + ratio_h = 3; + break; - switch (dwCommand) - { - case CMD_CUBE_FROM_HC: - case CMD_CUBE_FROM_HT: - ratio_w = 4; - ratio_h = 3; - break; + case CMD_CUBE_FROM_VC: + case CMD_CUBE_FROM_VC_FNZ: + ratio_w = 3; + ratio_h = 4; + break; - case CMD_CUBE_FROM_VC: - case CMD_CUBE_FROM_VC_FNZ: - ratio_w = 3; - ratio_h = 4; - break; + case CMD_CUBE_FROM_HS: ratio_w = 6; break; - case CMD_CUBE_FROM_HS: - ratio_w = 6; - break; + case CMD_CUBE_FROM_VS: ratio_h = 6; break; - case CMD_CUBE_FROM_VS: - ratio_h = 6; - break; + default: break; + } - default: - break; - } + size_t twidth = width / ratio_w; + size_t theight = height / ratio_h; - size_t twidth = width / ratio_w; - size_t theight = height / ratio_h; + if (((width % ratio_w) != 0) || ((height % ratio_h) != 0)) + { + wprintf(L"\nWARNING: %ls expects %zu:%zu aspect ratio\n", g_pCommands[dwCommand - 1].name, ratio_w, ratio_h); + } - if (((width % ratio_w) != 0) || ((height % ratio_h) != 0)) - { - wprintf(L"\nWARNING: %ls expects %zu:%zu aspect ratio\n", g_pCommands[dwCommand - 1].name, ratio_w, ratio_h); - } + if (twidth > maxCube || theight > maxCube) + { + wprintf(L"\nWARNING: Target size exceeds maximum cube dimensions for feature level (%u)\n", maxCube); + } - if (twidth > maxCube || theight > maxCube) - { - wprintf(L"\nWARNING: Target size exceeds maximum cube dimensions for feature level (%u)\n", maxCube); - } + ScratchImage result; + hr = result.InitializeCube(format, twidth, theight, 1, 1); + if (FAILED(hr)) + { + wprintf(L"FAILED setting up result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } - ScratchImage result; - hr = result.InitializeCube(format, twidth, theight, 1, 1); - if (FAILED(hr)) - { - wprintf(L"FAILED setting up result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); - return 1; - } + for (size_t index = 0; index < 6; ++index) + { + size_t offsetx = 0; + size_t offsety = 0; + TEX_FR_FLAGS flipRotate = TEX_FR_ROTATE0; - for (size_t index = 0; index < 6; ++index) + switch (dwCommand) { - size_t offsetx = 0; - size_t offsety = 0; - TEX_FR_FLAGS flipRotate = TEX_FR_ROTATE0; - - switch (dwCommand) - { - case CMD_CUBE_FROM_HC: - { - // +Y - // -X +Z +X -Z - // -Y - - static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 3 }; - static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 1 }; - - offsetx = s_offsetx[index] * twidth; - offsety = s_offsety[index] * theight; - break; - } - - case CMD_CUBE_FROM_VC: - { - // +Y - // -X +Z +X - // -Y - // -Z + case CMD_CUBE_FROM_HC: { + // +Y + // -X +Z +X -Z + // -Y - static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 1 }; - static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 3 }; + static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 3 }; + static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 1 }; - offsetx = s_offsetx[index] * twidth; - offsety = s_offsety[index] * theight; - break; - } + offsetx = s_offsetx[index] * twidth; + offsety = s_offsety[index] * theight; + break; + } - case CMD_CUBE_FROM_VC_FNZ: - { - // +Y - // -X +Z +X - // -Y - // -Z (flipped H/V) + case CMD_CUBE_FROM_VC: { + // +Y + // -X +Z +X + // -Y + // -Z - static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 1 }; - static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 3 }; + static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 1 }; + static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 3 }; - offsetx = s_offsetx[index] * twidth; - offsety = s_offsety[index] * theight; + offsetx = s_offsetx[index] * twidth; + offsety = s_offsety[index] * theight; + break; + } - if (index == 5) - { - flipRotate = TEX_FR_ROTATE180; - } - break; - } + case CMD_CUBE_FROM_VC_FNZ: { + // +Y + // -X +Z +X + // -Y + // -Z (flipped H/V) - case CMD_CUBE_FROM_HT: - { - // +Y - // +Z +X -Z -X - // -Y + static const size_t s_offsetx[6] = { 2, 0, 1, 1, 1, 1 }; + static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 3 }; - static const size_t s_offsetx[6] = { 1, 3, 0, 0, 0, 2 }; - static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 1 }; + offsetx = s_offsetx[index] * twidth; + offsety = s_offsety[index] * theight; - offsetx = s_offsetx[index] * twidth; - offsety = s_offsety[index] * theight; - break; - } + if (index == 5) + { + flipRotate = TEX_FR_ROTATE180; + } + break; + } - case CMD_CUBE_FROM_HS: - // +X -X +Y -Y +Z -Z - offsetx = index * twidth; - break; + case CMD_CUBE_FROM_HT: { + // +Y + // +Z +X -Z -X + // -Y - case CMD_CUBE_FROM_VS: - // +X - // -X - // +Y - // -Y - // +Z - // -Z - offsety = index * theight; - break; + static const size_t s_offsetx[6] = { 1, 3, 0, 0, 0, 2 }; + static const size_t s_offsety[6] = { 1, 1, 0, 2, 1, 1 }; - default: - break; - } + offsetx = s_offsetx[index] * twidth; + offsety = s_offsety[index] * theight; + break; + } - const Rect rect(offsetx, offsety, twidth, theight); - const Image* dest = result.GetImage(0, index, 0); - hr = CopyRectangle(*img, rect, *dest, dwFilter | dwFilterOpts, 0, 0); + case CMD_CUBE_FROM_HS: + // +X -X +Y -Y +Z -Z + offsetx = index * twidth; + break; - if (FAILED(hr)) - { - wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); - return 1; - } + case CMD_CUBE_FROM_VS: + // +X + // -X + // +Y + // -Y + // +Z + // -Z + offsety = index * theight; + break; - if (flipRotate != TEX_FR_ROTATE0) - { - ScratchImage tmp; - hr = FlipRotate(*dest, flipRotate, tmp); - if (SUCCEEDED(hr)) - { - hr = CopyRectangle(*tmp.GetImage(0, 0, 0), Rect(0, 0, twidth, theight), *dest, dwFilter | dwFilterOpts, 0, 0); - } - } + default: break; } - // Write texture - wprintf(L"\nWriting %ls ", outputFile.c_str()); - PrintInfo(result.GetMetadata()); - wprintf(L"\n"); - fflush(stdout); + const Rect rect(offsetx, offsety, twidth, theight); + const Image* dest = result.GetImage(0, index, 0); + hr = CopyRectangle(*img, rect, *dest, dwFilter | dwFilterOpts, 0, 0); - if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) + if (FAILED(hr)) { - std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); + wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; } - if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + if (flipRotate != TEX_FR_ROTATE0) { - if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) + ScratchImage tmp; + hr = FlipRotate(*dest, flipRotate, tmp); + if (SUCCEEDED(hr)) { - wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); - return 1; + hr = CopyRectangle(*tmp.GetImage(0, 0, 0), Rect(0, 0, twidth, theight), *dest, dwFilter | dwFilterOpts, 0, 0); } } + } - hr = SaveToDDSFile(result.GetImages(), result.GetImageCount(), result.GetMetadata(), - (dwOptions & (UINT32_C(1) << OPT_USE_DX10)) ? (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2) : DDS_FLAGS_NONE, - outputFile.c_str()); - if (FAILED(hr)) + // Write texture + wprintf(L"\nWriting %ls ", outputFile.c_str()); + PrintInfo(result.GetMetadata()); + wprintf(L"\n"); + fflush(stdout); + + if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) + { + std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); + } + + if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + { + if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) { - wprintf(L"\nFAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); return 1; } - break; } + + hr = SaveToDDSFile(result.GetImages(), + result.GetImageCount(), + result.GetMetadata(), + (dwOptions & (UINT32_C(1) << OPT_USE_DX10)) ? (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2) : DDS_FLAGS_NONE, + outputFile.c_str()); + if (FAILED(hr)) + { + wprintf(L"\nFAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } + break; + } case CMD_FROM_MIPS: - case CMD_CUBE_FROM_MIPS: + case CMD_CUBE_FROM_MIPS: { + ScratchImage result; + switch (dwCommand) { - ScratchImage result; - switch(dwCommand) - { - case CMD_FROM_MIPS: - hr = result.Initialize2D(format, width, height, 1, mipLevels); - break; + case CMD_FROM_MIPS: hr = result.Initialize2D(format, width, height, 1, mipLevels); break; - case CMD_CUBE_FROM_MIPS: - hr = result.InitializeCube(format, width, height, 1, mipLevels); - break; + case CMD_CUBE_FROM_MIPS: hr = result.InitializeCube(format, width, height, 1, mipLevels); break; - default: - break; + default: break; + } + if (FAILED(hr)) + { + wprintf(L"FAILED setting up result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } + + size_t mipIndex = 0; + size_t index = 0; + size_t arrayIndex = 0; + auto src = loadedImages.cbegin(); + for (auto it = src; it != loadedImages.cend(); ++it) + { + const ScratchImage* simage = it->get(); + assert(simage != nullptr); + const Image* img = simage->GetImage(0, 0, 0); + assert(img != nullptr); + + auto dest = result.GetImage(mipIndex, arrayIndex, 0); + if (!dest) + { + wprintf(L"FAILED building result image\n"); + return 1; } + + hr = CopyRectangle(*img, Rect(0, 0, dest->width, dest->height), *dest, dwFilter | dwFilterOpts, 0, 0); if (FAILED(hr)) { - wprintf(L"FAILED setting up result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } + index++; + mipIndex++; - size_t mipIndex = 0; - size_t index = 0; - size_t arrayIndex = 0; - auto src = loadedImages.cbegin(); - for (auto it = src; it != loadedImages.cend(); ++it) + if ((dwCommand == CMD_CUBE_FROM_MIPS) && (index % mipLevels) == 0) { - const ScratchImage* simage = it->get(); - assert(simage != nullptr); - const Image* img = simage->GetImage(0, 0, 0); - assert(img != nullptr); + arrayIndex++; + mipIndex = 0; + } + } - auto dest = result.GetImage(mipIndex, arrayIndex, 0); - if (!dest) - { - wprintf(L"FAILED building result image\n"); - return 1; - } + // Write texture2D + wprintf(L"\nWriting %ls ", outputFile.c_str()); + PrintInfo(result.GetMetadata()); + wprintf(L"\n"); + fflush(stdout); - hr = CopyRectangle(*img, Rect(0, 0, dest->width, dest->height), *dest, dwFilter | dwFilterOpts, 0, 0); - if (FAILED(hr)) - { - wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); - return 1; - } - index++; - mipIndex++; + if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) + { + std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); + } - if ((dwCommand == CMD_CUBE_FROM_MIPS) && (index % mipLevels) == 0) - { - arrayIndex++; - mipIndex = 0; - } + if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + { + if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) + { + wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); + return 1; } + } - // Write texture2D - wprintf(L"\nWriting %ls ", outputFile.c_str()); - PrintInfo(result.GetMetadata()); - wprintf(L"\n"); - fflush(stdout); + hr = SaveToDDSFile(result.GetImages(), + result.GetImageCount(), + result.GetMetadata(), + (dwOptions & (UINT32_C(1) << OPT_USE_DX10)) ? (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2) : DDS_FLAGS_NONE, + outputFile.c_str()); + if (FAILED(hr)) + { + wprintf(L"\nFAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } + break; + } - if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) + default: { + std::vector imageArray; + imageArray.reserve(images); + + for (auto it = loadedImages.cbegin(); it != loadedImages.cend(); ++it) + { + const ScratchImage* simage = it->get(); + assert(simage != nullptr); + for (size_t j = 0; j < simage->GetMetadata().arraySize; ++j) { - std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); + const Image* img = simage->GetImage(0, j, 0); + assert(img != nullptr); + imageArray.push_back(*img); } + } - if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + switch (dwCommand) + { + case CMD_CUBE: + if (imageArray[0].width > maxCube || imageArray[0].height > maxCube) { - if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) - { - wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); - return 1; - } + wprintf(L"\nWARNING: Target size exceeds maximum cube dimensions for feature level (%u)\n", maxCube); } + break; - hr = SaveToDDSFile(result.GetImages(), result.GetImageCount(), result.GetMetadata(), - (dwOptions & (UINT32_C(1) << OPT_USE_DX10)) ? (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2) : DDS_FLAGS_NONE, - outputFile.c_str()); - if (FAILED(hr)) + case CMD_VOLUME: + if (imageArray[0].width > maxVolume || imageArray[0].height > maxVolume || imageArray.size() > maxVolume) { - wprintf(L"\nFAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); - return 1; + wprintf(L"\nWARNING: Target size exceeds volume extent for feature level (%u)\n", maxVolume); } break; - } - - default: - { - std::vector imageArray; - imageArray.reserve(images); - for (auto it = loadedImages.cbegin(); it != loadedImages.cend(); ++it) + case CMD_ARRAY: + if (imageArray[0].width > maxSize || imageArray[0].height > maxSize || imageArray.size() > maxArray) { - const ScratchImage* simage = it->get(); - assert(simage != nullptr); - for (size_t j = 0; j < simage->GetMetadata().arraySize; ++j) - { - const Image* img = simage->GetImage(0, j, 0); - assert(img != nullptr); - imageArray.push_back(*img); - } + wprintf(L"\nWARNING: Target size exceeds maximum size for feature level (size %u, array %u)\n", maxSize, maxArray); } + break; - switch (dwCommand) + case CMD_CUBEARRAY: + if (imageArray[0].width > maxCube || imageArray[0].height > maxCube || imageArray.size() > maxArray) { - case CMD_CUBE: - if (imageArray[0].width > maxCube || imageArray[0].height > maxCube) - { - wprintf(L"\nWARNING: Target size exceeds maximum cube dimensions for feature level (%u)\n", maxCube); - } - break; - - case CMD_VOLUME: - if (imageArray[0].width > maxVolume || imageArray[0].height > maxVolume || imageArray.size() > maxVolume) - { - wprintf(L"\nWARNING: Target size exceeds volume extent for feature level (%u)\n", maxVolume); - } - break; - - case CMD_ARRAY: - if (imageArray[0].width > maxSize || imageArray[0].height > maxSize || imageArray.size() > maxArray) - { - wprintf(L"\nWARNING: Target size exceeds maximum size for feature level (size %u, array %u)\n", maxSize, maxArray); - } - break; - - case CMD_CUBEARRAY: - if (imageArray[0].width > maxCube || imageArray[0].height > maxCube || imageArray.size() > maxArray) - { - wprintf(L"\nWARNING: Target size exceeds maximum cube dimensions for feature level (size %u, array %u)\n", maxCube, maxArray); - } - break; - - default: - if (imageArray[0].width > maxSize || imageArray[0].height > maxSize) - { - wprintf(L"\nWARNING: Target size exceeds maximum size for feature level (%u)\n", maxSize); - } - break; + wprintf(L"\nWARNING: Target size exceeds maximum cube dimensions for feature level (size %u, array %u)\n", + maxCube, + maxArray); } + break; - ScratchImage result; - switch (dwCommand) + default: + if (imageArray[0].width > maxSize || imageArray[0].height > maxSize) { - case CMD_VOLUME: - hr = result.Initialize3DFromImages(&imageArray[0], imageArray.size()); - break; + wprintf(L"\nWARNING: Target size exceeds maximum size for feature level (%u)\n", maxSize); + } + break; + } - case CMD_ARRAY: - case CMD_GIF: - hr = result.InitializeArrayFromImages(&imageArray[0], imageArray.size(), (dwOptions & (UINT32_C(1) << OPT_USE_DX10)) != 0); - break; + ScratchImage result; + switch (dwCommand) + { + case CMD_VOLUME: hr = result.Initialize3DFromImages(&imageArray[0], imageArray.size()); break; - case CMD_CUBE: - case CMD_CUBEARRAY: - hr = result.InitializeCubeFromImages(&imageArray[0], imageArray.size()); - break; + case CMD_ARRAY: + case CMD_GIF: + hr = result.InitializeArrayFromImages(&imageArray[0], imageArray.size(), (dwOptions & (UINT32_C(1) << OPT_USE_DX10)) != 0); + break; - default: - break; - } + case CMD_CUBE: + case CMD_CUBEARRAY: hr = result.InitializeCubeFromImages(&imageArray[0], imageArray.size()); break; - if (FAILED(hr)) - { - wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); - return 1; - } + default: break; + } - // Write texture - wprintf(L"\nWriting %ls ", outputFile.c_str()); - PrintInfo(result.GetMetadata()); - wprintf(L"\n"); - fflush(stdout); + if (FAILED(hr)) + { + wprintf(L"FAILED building result image (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } - if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) - { - std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); - } + // Write texture + wprintf(L"\nWriting %ls ", outputFile.c_str()); + PrintInfo(result.GetMetadata()); + wprintf(L"\n"); + fflush(stdout); - if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) - { - if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) - { - wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); - return 1; - } - } + if (dwOptions & (UINT32_C(1) << OPT_TOLOWER)) + { + std::transform(outputFile.begin(), outputFile.end(), outputFile.begin(), towlower); + } - hr = SaveToDDSFile(result.GetImages(), result.GetImageCount(), result.GetMetadata(), - (dwOptions & (UINT32_C(1) << OPT_USE_DX10)) ? (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2) : DDS_FLAGS_NONE, - outputFile.c_str()); - if (FAILED(hr)) + if (~dwOptions & (UINT32_C(1) << OPT_OVERWRITE)) + { + if (GetFileAttributesW(outputFile.c_str()) != INVALID_FILE_ATTRIBUTES) { - wprintf(L"\nFAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + wprintf(L"\nERROR: Output file already exists, use -y to overwrite\n"); return 1; } - break; } + + hr = SaveToDDSFile(result.GetImages(), + result.GetImageCount(), + result.GetMetadata(), + (dwOptions & (UINT32_C(1) << OPT_USE_DX10)) ? (DDS_FLAGS_FORCE_DX10_EXT | DDS_FLAGS_FORCE_DX10_EXT_MISC2) : DDS_FLAGS_NONE, + outputFile.c_str()); + if (FAILED(hr)) + { + wprintf(L"\nFAILED (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); + return 1; + } + break; + } } return 0; diff --git a/Texconv/ExtendedBMP.cpp b/Texconv/ExtendedBMP.cpp index 27ec5b18..62838ea2 100644 --- a/Texconv/ExtendedBMP.cpp +++ b/Texconv/ExtendedBMP.cpp @@ -12,7 +12,7 @@ // https://go.microsoft.com/fwlink/?LinkId=248926 //-------------------------------------------------------------------------------------- -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4005) #endif @@ -22,7 +22,7 @@ #define NOMCX #define NOSERVICE #define NOHELP -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(pop) #endif @@ -39,20 +39,27 @@ using namespace DirectX; namespace { - struct handle_closer { void operator()(HANDLE h) noexcept { if (h) CloseHandle(h); } }; + struct handle_closer + { + void operator()(HANDLE h) noexcept + { + if (h) + CloseHandle(h); + } + }; using ScopedHandle = std::unique_ptr; - inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } + inline HANDLE safe_handle(HANDLE h) noexcept + { + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; + } HRESULT ReadData(_In_z_ const wchar_t* szFile, std::unique_ptr& blob, size_t& blobSize) { blob.reset(); - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -100,11 +107,10 @@ namespace return S_OK; } - HRESULT LoadFromExtendedBMPMemory( - _In_reads_bytes_(size) const void* pSource, - _In_ size_t size, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) + HRESULT LoadFromExtendedBMPMemory(_In_reads_bytes_(size) const void* pSource, + _In_ size_t size, + _Out_opt_ TexMetadata* metadata, + _Out_ ScratchImage& image) { // This loads from non-standard BMP files that are not supported by WIC image.Release(); @@ -142,8 +148,7 @@ namespace format = DXGI_FORMAT_BC3_UNORM; break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } HRESULT hr = image.Initialize2D(format, size_t(header->biWidth), size_t(header->biHeight), 1, 1); @@ -171,17 +176,14 @@ namespace return S_OK; } -} +} // namespace -HRESULT __cdecl LoadFromBMPEx( - _In_z_ const wchar_t* szFile, - _In_ WIC_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) noexcept +HRESULT __cdecl +LoadFromBMPEx(_In_z_ const wchar_t* szFile, _In_ WIC_FLAGS flags, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept { std::unique_ptr bmpData; - size_t bmpSize; - HRESULT hr = ReadData(szFile, bmpData, bmpSize); + size_t bmpSize; + HRESULT hr = ReadData(szFile, bmpData, bmpSize); if (FAILED(hr)) return hr; diff --git a/Texconv/PortablePixMap.cpp b/Texconv/PortablePixMap.cpp index 6d7f0b3c..5c479f02 100644 --- a/Texconv/PortablePixMap.cpp +++ b/Texconv/PortablePixMap.cpp @@ -9,7 +9,7 @@ // https://go.microsoft.com/fwlink/?LinkId=248926 //-------------------------------------------------------------------------------------- -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4005) #endif @@ -19,7 +19,7 @@ #define NOMCX #define NOSERVICE #define NOHELP -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(pop) #endif @@ -39,18 +39,30 @@ using namespace DirectX; namespace { - struct handle_closer { void operator()(HANDLE h) noexcept { if (h) CloseHandle(h); } }; + struct handle_closer + { + void operator()(HANDLE h) noexcept + { + if (h) + CloseHandle(h); + } + }; using ScopedHandle = std::unique_ptr; - inline HANDLE safe_handle(HANDLE h) noexcept { return (h == INVALID_HANDLE_VALUE) ? nullptr : h; } + inline HANDLE safe_handle(HANDLE h) noexcept + { + return (h == INVALID_HANDLE_VALUE) ? nullptr : h; + } class auto_delete_file { public: - auto_delete_file(HANDLE hFile) noexcept : m_handle(hFile) {} + auto_delete_file(HANDLE hFile) noexcept + : m_handle(hFile) + {} - auto_delete_file(const auto_delete_file&) = delete; + auto_delete_file(const auto_delete_file&) = delete; auto_delete_file& operator=(const auto_delete_file&) = delete; ~auto_delete_file() @@ -58,8 +70,8 @@ namespace if (m_handle) { FILE_DISPOSITION_INFO info = {}; - info.DeleteFile = TRUE; - std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); + info.DeleteFile = TRUE; + std::ignore = SetFileInformationByHandle(m_handle, FileDispositionInfo, &info, sizeof(info)); } } @@ -73,7 +85,7 @@ namespace { size_t pos = 0; - //find endl + // find endl while (pos < max) { if (pString[pos] == '\n') @@ -91,10 +103,7 @@ namespace blob.reset(); - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_READ, FILE_SHARE_READ, OPEN_EXISTING, nullptr))); if (!hFile) { return HRESULT_FROM_WIN32(GetLastError()); @@ -141,22 +150,18 @@ namespace return S_OK; } -} - +} // namespace //============================================================================ // PPM (Portable PixMap) // http://paulbourke.net/dataformats/ppm/ //============================================================================ -HRESULT __cdecl LoadFromPortablePixMap( - _In_z_ const wchar_t* szFile, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) noexcept +HRESULT __cdecl LoadFromPortablePixMap(_In_z_ const wchar_t* szFile, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept { std::unique_ptr ppmData; - size_t ppmSize; - HRESULT hr = ReadData(szFile, ppmData, ppmSize); + size_t ppmSize; + HRESULT hr = ReadData(szFile, ppmData, ppmSize); if (FAILED(hr)) return hr; @@ -170,7 +175,12 @@ HRESULT __cdecl LoadFromPortablePixMap( enum { - PPM_WIDTH, PPM_HEIGHT, PPM_MAX, PPM_DATA_R, PPM_DATA_G, PPM_DATA_B + PPM_WIDTH, + PPM_HEIGHT, + PPM_MAX, + PPM_DATA_R, + PPM_DATA_G, + PPM_DATA_B }; int mode = PPM_WIDTH; @@ -178,10 +188,10 @@ HRESULT __cdecl LoadFromPortablePixMap( auto pData = ppmData.get() + 2; ppmSize -= 2; - size_t width = 0; - uint32_t max = 255; - uint32_t *pixels = nullptr; - uint32_t *pixelEnd = nullptr; + size_t width = 0; + uint32_t max = 255; + uint32_t* pixels = nullptr; + uint32_t* pixelEnd = nullptr; while (ppmSize > 0) { @@ -213,10 +223,7 @@ HRESULT __cdecl LoadFromPortablePixMap( return HRESULT_FROM_WIN32(ERROR_HANDLE_EOF); } - *pixels++ = (255 * pData[0] / max) - | ((255 * pData[1] / max) << 8) - | ((255 * pData[2] / max) << 16) - | 0xff000000; + *pixels++ = (255 * pData[0] / max) | ((255 * pData[1] / max) << 8) | ((255 * pData[2] / max) << 16) | 0xff000000; pData += 3; ppmSize -= 3; @@ -276,42 +283,41 @@ HRESULT __cdecl LoadFromPortablePixMap( width = u; break; - case PPM_HEIGHT: - { - if (u == 0 || width == 0) - return E_FAIL; + case PPM_HEIGHT: { + if (u == 0 || width == 0) + return E_FAIL; - if (u > INT32_MAX) - { - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); - } + if (u > INT32_MAX) + { + return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + } - uint64_t sizeBytes = uint64_t(width) * uint64_t(u) * 4; - if (sizeBytes > UINT32_MAX) - { - return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - } + uint64_t sizeBytes = uint64_t(width) * uint64_t(u) * 4; + if (sizeBytes > UINT32_MAX) + { + return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); + } - if (metadata) - { - *metadata = {}; - metadata->width = width; - metadata->height = u; - metadata->depth = metadata->arraySize = metadata->mipLevels = 1; - metadata->format = DXGI_FORMAT_R8G8B8A8_UNORM; - metadata->dimension = TEX_DIMENSION_TEXTURE2D; - } + if (metadata) + { + *metadata = {}; + metadata->width = width; + metadata->height = u; + metadata->depth = metadata->arraySize = metadata->mipLevels = 1; + metadata->format = DXGI_FORMAT_R8G8B8A8_UNORM; + metadata->dimension = TEX_DIMENSION_TEXTURE2D; + } - hr = image.Initialize2D(DXGI_FORMAT_R8G8B8A8_UNORM, width, u, 1, 1); - if (FAILED(hr)) - return hr; + hr = image.Initialize2D(DXGI_FORMAT_R8G8B8A8_UNORM, width, u, 1, 1); + if (FAILED(hr)) + return hr; - auto img = image.GetImage(0, 0, 0); + auto img = image.GetImage(0, 0, 0); - pixels = reinterpret_cast(img->pixels); - pixelEnd = pixels + width * u; - } - break; + pixels = reinterpret_cast(img->pixels); + pixelEnd = pixels + width * u; + } + break; case PPM_MAX: if (u == 0) @@ -346,8 +352,7 @@ HRESULT __cdecl LoadFromPortablePixMap( mode = PPM_DATA_R - 1; break; - default: - break; + default: break; } mode++; @@ -357,10 +362,7 @@ HRESULT __cdecl LoadFromPortablePixMap( return E_FAIL; } - -HRESULT __cdecl SaveToPortablePixMap( - _In_ const Image& image, - _In_z_ const wchar_t* szFile) noexcept +HRESULT __cdecl SaveToPortablePixMap(_In_ const Image& image, _In_z_ const wchar_t* szFile) noexcept { if (!szFile) return E_INVALIDARG; @@ -372,11 +374,9 @@ HRESULT __cdecl SaveToPortablePixMap( case DXGI_FORMAT_B8G8R8A8_UNORM: case DXGI_FORMAT_B8G8R8X8_UNORM: case DXGI_FORMAT_B8G8R8A8_UNORM_SRGB: - case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: - break; + case DXGI_FORMAT_B8G8R8X8_UNORM_SRGB: break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } if ((image.width > INT32_MAX) || (image.height > INT32_MAX)) @@ -384,8 +384,8 @@ HRESULT __cdecl SaveToPortablePixMap( return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } - char header[256] = {}; - const int len = sprintf_s(header, "P6\n%zu %zu\n255\n", image.width, image.height); + char header[256] = {}; + const int len = sprintf_s(header, "P6\n%zu %zu\n255\n", image.width, image.height); if (len == -1) return E_UNEXPECTED; @@ -398,7 +398,9 @@ HRESULT __cdecl SaveToPortablePixMap( { HRESULT hr = Convert(image, IsSRGB(image.format) ? DXGI_FORMAT_R8G8B8A8_UNORM_SRGB : DXGI_FORMAT_R8G8B8A8_UNORM, - TEX_FILTER_DEFAULT, 0.f, tmpImage); + TEX_FILTER_DEFAULT, + 0.f, + tmpImage); if (FAILED(hr)) return hr; } @@ -406,8 +408,8 @@ HRESULT __cdecl SaveToPortablePixMap( ScratchImage data; data.Initialize2D(DXGI_FORMAT_R8G8B8A8_UNORM, image.width, image.height, 1, 1, CP_FLAGS_24BPP); - const auto& img = tmpImage.GetImage(0, 0, 0); - auto dptr = data.GetPixels(); + const auto& img = tmpImage.GetImage(0, 0, 0); + auto dptr = data.GetPixels(); for (size_t y = 0; y < image.height; ++y) { auto sptr = img->pixels + y * image.rowPitch; @@ -421,10 +423,7 @@ HRESULT __cdecl SaveToPortablePixMap( } } - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_WRITE, 0, CREATE_ALWAYS, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) return HRESULT_FROM_WIN32(GetLastError()); @@ -442,21 +441,17 @@ HRESULT __cdecl SaveToPortablePixMap( return S_OK; } - //============================================================================ // PFM (Portable Float Map) / PHM (Portable Half Map) // http://paulbourke.net/dataformats/pbmhdr/ // https://github.com/syoyo/libphm //============================================================================ -HRESULT __cdecl LoadFromPortablePixMapHDR( - _In_z_ const wchar_t* szFile, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) noexcept +HRESULT __cdecl LoadFromPortablePixMapHDR(_In_z_ const wchar_t* szFile, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept { std::unique_ptr pfmData; - size_t pfmSize; - HRESULT hr = ReadData(szFile, pfmData, pfmSize); + size_t pfmSize; + HRESULT hr = ReadData(szFile, pfmData, pfmSize); if (FAILED(hr)) return hr; @@ -466,18 +461,33 @@ HRESULT __cdecl LoadFromPortablePixMapHDR( if (pfmData[0] != 'P' || !isspace(pfmData[2])) return E_FAIL; - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; - bool monochrome = false; - bool half16 = false; - unsigned int bpp = 0; + DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; + bool monochrome = false; + bool half16 = false; + unsigned int bpp = 0; switch (pfmData[1]) { - case 'f': format = DXGI_FORMAT_R32_FLOAT; monochrome = true; bpp = 4u; break; - case 'F': format = DXGI_FORMAT_R32G32B32A32_FLOAT; bpp = 16u; break; - case 'h': format = DXGI_FORMAT_R16_FLOAT; monochrome = true; half16 = true; bpp = 2u; break; - case 'H': format = DXGI_FORMAT_R16G16B16A16_FLOAT; half16 = true; bpp = 8u; break; - default: - return E_FAIL; + case 'f': + format = DXGI_FORMAT_R32_FLOAT; + monochrome = true; + bpp = 4u; + break; + case 'F': + format = DXGI_FORMAT_R32G32B32A32_FLOAT; + bpp = 16u; + break; + case 'h': + format = DXGI_FORMAT_R16_FLOAT; + monochrome = true; + half16 = true; + bpp = 2u; + break; + case 'H': + format = DXGI_FORMAT_R16G16B16A16_FLOAT; + half16 = true; + bpp = 8u; + break; + default: return E_FAIL; } auto pData = reinterpret_cast(pfmData.get()) + 3; @@ -578,12 +588,12 @@ HRESULT __cdecl LoadFromPortablePixMapHDR( if (metadata) { - *metadata = {}; - metadata->width = width; + *metadata = {}; + metadata->width = width; metadata->height = height; metadata->depth = metadata->arraySize = metadata->mipLevels = 1; - metadata->format = format; - metadata->dimension = TEX_DIMENSION_TEXTURE2D; + metadata->format = format; + metadata->dimension = TEX_DIMENSION_TEXTURE2D; } hr = image.Initialize2D(format, width, height, 1, 1); @@ -683,11 +693,8 @@ HRESULT __cdecl LoadFromPortablePixMapHDR( return S_OK; } - // We always save as PF or Pf as that's the most common PFM implementation. -HRESULT __cdecl SaveToPortablePixMapHDR( - _In_ const Image& image, - _In_z_ const wchar_t* szFile) noexcept +HRESULT __cdecl SaveToPortablePixMapHDR(_In_ const Image& image, _In_z_ const wchar_t* szFile) noexcept { if (!szFile) return E_INVALIDARG; @@ -697,11 +704,9 @@ HRESULT __cdecl SaveToPortablePixMapHDR( case DXGI_FORMAT_R32G32B32A32_FLOAT: case DXGI_FORMAT_R32G32B32_FLOAT: case DXGI_FORMAT_R16G16B16A16_FLOAT: - case DXGI_FORMAT_R32_FLOAT: - break; + case DXGI_FORMAT_R32_FLOAT: break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } if ((image.width > INT32_MAX) || (image.height > INT32_MAX)) @@ -709,10 +714,9 @@ HRESULT __cdecl SaveToPortablePixMapHDR( return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } - char header[256] = {}; - const int len = sprintf_s(header, "P%c\n%zu %zu\n-1.000000\n", - (image.format == DXGI_FORMAT_R32_FLOAT) ? 'f' : 'F', - image.width, image.height); + char header[256] = {}; + const int len + = sprintf_s(header, "P%c\n%zu %zu\n-1.000000\n", (image.format == DXGI_FORMAT_R32_FLOAT) ? 'f' : 'F', image.width, image.height); if (len == -1) return E_UNEXPECTED; @@ -730,16 +734,13 @@ HRESULT __cdecl SaveToPortablePixMapHDR( } ScratchImage flipImage; - HRESULT hr = FlipRotate(*tmpImage.GetImage(0, 0, 0), TEX_FR_FLIP_VERTICAL, flipImage); + HRESULT hr = FlipRotate(*tmpImage.GetImage(0, 0, 0), TEX_FR_FLIP_VERTICAL, flipImage); if (FAILED(hr)) return hr; tmpImage.Release(); - ScopedHandle hFile(safe_handle(CreateFile2( - szFile, - GENERIC_WRITE, 0, CREATE_ALWAYS, - nullptr))); + ScopedHandle hFile(safe_handle(CreateFile2(szFile, GENERIC_WRITE, 0, CREATE_ALWAYS, nullptr))); if (!hFile) return HRESULT_FROM_WIN32(GetLastError()); diff --git a/Texconv/texconv.cpp b/Texconv/texconv.cpp index 708558f9..834cfe66 100644 --- a/Texconv/texconv.cpp +++ b/Texconv/texconv.cpp @@ -9,7 +9,7 @@ // https://go.microsoft.com/fwlink/?LinkId=248926 //-------------------------------------------------------------------------------------- -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4005) #endif @@ -19,7 +19,7 @@ #define NOMCX #define NOSERVICE #define NOHELP -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(pop) #endif @@ -56,7 +56,7 @@ #include -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(disable : 4619 4616 26812) #endif @@ -145,10 +145,10 @@ namespace OPT_RECONSTRUCT_Z, OPT_BCNONMULT4FIX, OPT_IGNORE_SRGB_METADATA, - #ifdef USE_XBOX_EXTS +#ifdef USE_XBOX_EXTS OPT_USE_XBOX, OPT_XGMODE, - #endif +#endif OPT_FLAGS_MAX, OPT_FILELIST, OPT_WIDTH, @@ -197,6 +197,7 @@ namespace static_assert(OPT_FLAGS_MAX <= 64, "dwOptions is a unsigned int bitfield"); + // clang-format off const SValue g_pOptions[] = { { L"r", OPT_RECURSIVE }, @@ -618,42 +619,31 @@ namespace { L"12.2", 16384 }, { nullptr, 0 }, }; -} + // clang-format on +} // namespace ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -HRESULT __cdecl LoadFromBMPEx( - _In_z_ const wchar_t* szFile, - _In_ WIC_FLAGS flags, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) noexcept; +HRESULT __cdecl +LoadFromBMPEx(_In_z_ const wchar_t* szFile, _In_ WIC_FLAGS flags, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; -HRESULT __cdecl LoadFromPortablePixMap( - _In_z_ const wchar_t* szFile, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) noexcept; +HRESULT __cdecl LoadFromPortablePixMap(_In_z_ const wchar_t* szFile, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; -HRESULT __cdecl SaveToPortablePixMap( - _In_ const Image& image, - _In_z_ const wchar_t* szFile) noexcept; +HRESULT __cdecl SaveToPortablePixMap(_In_ const Image& image, _In_z_ const wchar_t* szFile) noexcept; -HRESULT __cdecl LoadFromPortablePixMapHDR( - _In_z_ const wchar_t* szFile, - _Out_opt_ TexMetadata* metadata, - _Out_ ScratchImage& image) noexcept; +HRESULT __cdecl +LoadFromPortablePixMapHDR(_In_z_ const wchar_t* szFile, _Out_opt_ TexMetadata* metadata, _Out_ ScratchImage& image) noexcept; -HRESULT __cdecl SaveToPortablePixMapHDR( - _In_ const Image& image, - _In_z_ const wchar_t* szFile) noexcept; +HRESULT __cdecl SaveToPortablePixMapHDR(_In_ const Image& image, _In_z_ const wchar_t* szFile) noexcept; ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// -#ifdef _MSC_VER -#pragma warning( disable : 4616 6211 ) +#ifdef _MSC_VER +#pragma warning(disable : 4616 6211) #endif namespace @@ -681,9 +671,7 @@ namespace switch (info.dimension) { - case TEX_DIMENSION_TEXTURE1D: - wprintf(L"%ls", (info.arraySize > 1) ? L" 1DArray" : L" 1D"); - break; + case TEX_DIMENSION_TEXTURE1D: wprintf(L"%ls", (info.arraySize > 1) ? L" 1DArray" : L" 1D"); break; case TEX_DIMENSION_TEXTURE2D: if (info.IsCubemap()) @@ -696,27 +684,16 @@ namespace } break; - case TEX_DIMENSION_TEXTURE3D: - wprintf(L" 3D"); - break; + case TEX_DIMENSION_TEXTURE3D: wprintf(L" 3D"); break; } switch (info.GetAlphaMode()) { - case TEX_ALPHA_MODE_OPAQUE: - wprintf(L" \x03B1:Opaque"); - break; - case TEX_ALPHA_MODE_PREMULTIPLIED: - wprintf(L" \x03B1:PM"); - break; - case TEX_ALPHA_MODE_STRAIGHT: - wprintf(L" \x03B1:NonPM"); - break; - case TEX_ALPHA_MODE_CUSTOM: - wprintf(L" \x03B1:Custom"); - break; - case TEX_ALPHA_MODE_UNKNOWN: - break; + case TEX_ALPHA_MODE_OPAQUE: wprintf(L" \x03B1:Opaque"); break; + case TEX_ALPHA_MODE_PREMULTIPLIED: wprintf(L" \x03B1:PM"); break; + case TEX_ALPHA_MODE_STRAIGHT: wprintf(L" \x03B1:NonPM"); break; + case TEX_ALPHA_MODE_CUSTOM: wprintf(L" \x03B1:Custom"); break; + case TEX_ALPHA_MODE_UNKNOWN: break; } if (isXbox) @@ -727,15 +704,14 @@ namespace wprintf(L")"); } - _Success_(return) - bool GetDXGIFactory(_Outptr_ IDXGIFactory1** pFactory) noexcept + _Success_(return) bool GetDXGIFactory(_Outptr_ IDXGIFactory1** pFactory) noexcept { if (!pFactory) return false; *pFactory = nullptr; - typedef HRESULT(WINAPI* pfn_CreateDXGIFactory1)(REFIID riid, _Out_ void **ppFactory); + typedef HRESULT(WINAPI * pfn_CreateDXGIFactory1)(REFIID riid, _Out_ void** ppFactory); static pfn_CreateDXGIFactory1 s_CreateDXGIFactory1 = nullptr; @@ -745,7 +721,8 @@ namespace if (!hModDXGI) return false; - s_CreateDXGIFactory1 = reinterpret_cast(reinterpret_cast(GetProcAddress(hModDXGI, "CreateDXGIFactory1"))); + s_CreateDXGIFactory1 + = reinterpret_cast(reinterpret_cast(GetProcAddress(hModDXGI, "CreateDXGIFactory1"))); if (!s_CreateDXGIFactory1) return false; } @@ -757,121 +734,120 @@ namespace { PrintLogo(false, g_ToolName, g_Description); - static const wchar_t* const s_usage = - L"Usage: texconv [--] \n\n"; - - static const wchar_t* const s_fullUsage = - L" -r wildcard filename search is recursive\n" - L" -r:flatten flatten the directory structure (default)\n" - L" -r:keep keep the directory structure\n" - L" -flist , --file-list \n" - L" use text file with a list of input files (one per line)\n" - L"\n" - L" -w , --width width for output\n" - L" -h , --height height for output\n" - L" -m , --mip-levels miplevels for output\n" - L" -f , --format pixel format for output\n" - L"\n" - L" -if , --image-filter image filtering\n" - L" -srgb{i|o}, --srgb-in, --srgb-out sRGB {input, output}\n" - L"\n" - L" -px , --prefix name prefix\n" - L" -sx , --suffix name suffix\n" - L" -o output directory\n" - L" -l, --to-lowercase force output filename to lower case\n" - L" -y, --overwrite overwrite existing output file (if any)\n" - L" -ft , --file-type output file type\n" - L"\n" - L" -hflip, --horizontal-flip horizonal flip of source image\n" - L" -vflip, --vertical-flip vertical flip of source image\n" - L"\n" - L" -sepalpha, --separate-alpha resize/generate mips alpha channel separately from color channels\n" - L" --keep-coverage Preserve alpha coverage in mips for alpha test ref\n" - L"\n" - L" -nowic Force non-WIC filtering\n" - L" -wrap, -mirror texture addressing mode (wrap, mirror, or clamp)\n" - L" -pmalpha, --premultiplied-alpha convert final texture to use premultiplied alpha\n" - L" -alpha convert premultiplied alpha to straight alpha\n" - L" -at , --alpha-threshold \n" - L" Alpha threshold used for BC1, RGBA5551, and WIC\n" - L" (defaults to 0.5)\n" - L"\n" - L" -fl , --feature-level \n" - L" Set maximum feature level target (defaults to 11.0)\n" - L" -pow2, --fit-power-of-2\n" - L" resize to fit a power-of-2, respecting aspect ratio\n" - L"\n" - L" -nmap , --normal-map \n" - L" converts height-map to normal-map\n" - L" options must be one or more of\n" - L" r, g, b, a, l, m, u, v, i, o\n" - L" -nmapamp , --normal-map-amplitude \n" - L" normal map amplitude (defaults to 1.0)\n" - L"\n" - L" (DDS input only)\n" - L" -tu, --typeless-unorm TYPELESS format is treated as UNORM\n" - L" -tf, --typeless-float TYPELESS format is treated as FLOAT\n" - L" -dword, --dword-alignment Use DWORD instead of BYTE alignment\n" - L" --bad-tails Fix for older DXTn with bad mipchain tails\n" - L" --permissive Allow some DX9 variants with unusual header values\n" - L" --ignore-mips Reads just the top-level mip which reads some invalid files\n" - L" --fix-bc-4x4 Fix for odd-sized BC files that Direct3D can't load\n" - L" -xlum, --expand-luminance Expand legacy L8, L16, and A8P8 formats\n" - L"\n" - L" (DDS output only)\n" - L" -dx10 Force use of 'DX10' extended header\n" - L" -dx9 Force use of legacy DX9 header\n" - #ifdef USE_XBOX_EXTS - L" -xbox Tile/swizzle and use 'XBOX' variant of DDS\n" - L" -xgmode , --xbox-mode \n"\ - L" Tile/swizzle using provided memory layout mode\n" - #endif - L"\n" - L" (PNG, JPG, TIF, TGA input only)\n" - L" --ignore-srgb Ignores any gamma setting in the metadata\n" - L"\n" - L" (TGA input only)\n" - L" --tga-zero-alpha Allow all zero alpha channel files to be loaded 'as is'\n" - L"\n" - L" (TGA output only)\n" - L" -tga20 Write file including TGA 2.0 extension area\n" - L"\n" - L" (BMP, PNG, JPG, TIF, WDP, and HIEF output only)\n" - L" -wicq , --wic-quality \n" - L" When writing images with WIC use quality (0.0 to 1.0)\n" - L" --wic-lossless When writing images with WIC use lossless mode\n" - L" --wic-uncompressed When writing images with WIC use uncompressed mode\n" - L" --wic-multiframe When writing images with WIC encode multiframe images\n" - L"\n" - L" -nologo suppress copyright message\n" - L" --timing display elapsed processing time\n" - L"\n" - #ifdef _OPENMP - L" --single-proc Do not use multi-threaded compression\n" - #endif - L" -gpu Select GPU for DirectCompute-based codecs (0 is default)\n" - L" -nogpu Do not use DirectCompute-based codecs\n" - L"\n" - L" -bc , --block-compress \n" - L" Sets options for BC compression\n" - L" options must be one or more of\n" - L" d, u, q, x\n" - L" -aw , --alpha-weight \n" - L" BC7 GPU compressor weighting for alpha error metric\n" - L" (defaults to 1.0)\n" - L"\n" - L" -c , --color-key colorkey (a.k.a. chromakey) transparency\n" - L" --rotate-color rotates color primaries and/or applies a curve\n" - L"\n" - L" -nits , --paper-white-nits \n" - L" paper-white value in nits to use for HDR10 (def: 200.0)\n" - L" --tonemap Apply a tonemap operator based on maximum luminance\n" - L" --x2-bias Enable *2 - 1 conversion cases for unorm/pos-only-float\n" - L" --invert-y Invert Y (i.e. green) channel values\n" - L" --reconstruct-z Rebuild Z (blue) channel assuming X/Y are normals\n" - L" --swizzle Swizzle image channels using HLSL-style mask\n" - L"\n" - L" '-- ' is needed if any input filepath starts with the '-' or '/' character\n"; + static const wchar_t* const s_usage = L"Usage: texconv [--] \n\n"; + + static const wchar_t* const s_fullUsage + = L" -r wildcard filename search is recursive\n" + L" -r:flatten flatten the directory structure (default)\n" + L" -r:keep keep the directory structure\n" + L" -flist , --file-list \n" + L" use text file with a list of input files (one per line)\n" + L"\n" + L" -w , --width width for output\n" + L" -h , --height height for output\n" + L" -m , --mip-levels miplevels for output\n" + L" -f , --format pixel format for output\n" + L"\n" + L" -if , --image-filter image filtering\n" + L" -srgb{i|o}, --srgb-in, --srgb-out sRGB {input, output}\n" + L"\n" + L" -px , --prefix name prefix\n" + L" -sx , --suffix name suffix\n" + L" -o output directory\n" + L" -l, --to-lowercase force output filename to lower case\n" + L" -y, --overwrite overwrite existing output file (if any)\n" + L" -ft , --file-type output file type\n" + L"\n" + L" -hflip, --horizontal-flip horizonal flip of source image\n" + L" -vflip, --vertical-flip vertical flip of source image\n" + L"\n" + L" -sepalpha, --separate-alpha resize/generate mips alpha channel separately from color channels\n" + L" --keep-coverage Preserve alpha coverage in mips for alpha test ref\n" + L"\n" + L" -nowic Force non-WIC filtering\n" + L" -wrap, -mirror texture addressing mode (wrap, mirror, or clamp)\n" + L" -pmalpha, --premultiplied-alpha convert final texture to use premultiplied alpha\n" + L" -alpha convert premultiplied alpha to straight alpha\n" + L" -at , --alpha-threshold \n" + L" Alpha threshold used for BC1, RGBA5551, and WIC\n" + L" (defaults to 0.5)\n" + L"\n" + L" -fl , --feature-level \n" + L" Set maximum feature level target (defaults to 11.0)\n" + L" -pow2, --fit-power-of-2\n" + L" resize to fit a power-of-2, respecting aspect ratio\n" + L"\n" + L" -nmap , --normal-map \n" + L" converts height-map to normal-map\n" + L" options must be one or more of\n" + L" r, g, b, a, l, m, u, v, i, o\n" + L" -nmapamp , --normal-map-amplitude \n" + L" normal map amplitude (defaults to 1.0)\n" + L"\n" + L" (DDS input only)\n" + L" -tu, --typeless-unorm TYPELESS format is treated as UNORM\n" + L" -tf, --typeless-float TYPELESS format is treated as FLOAT\n" + L" -dword, --dword-alignment Use DWORD instead of BYTE alignment\n" + L" --bad-tails Fix for older DXTn with bad mipchain tails\n" + L" --permissive Allow some DX9 variants with unusual header values\n" + L" --ignore-mips Reads just the top-level mip which reads some invalid files\n" + L" --fix-bc-4x4 Fix for odd-sized BC files that Direct3D can't load\n" + L" -xlum, --expand-luminance Expand legacy L8, L16, and A8P8 formats\n" + L"\n" + L" (DDS output only)\n" + L" -dx10 Force use of 'DX10' extended header\n" + L" -dx9 Force use of legacy DX9 header\n" +#ifdef USE_XBOX_EXTS + L" -xbox Tile/swizzle and use 'XBOX' variant of DDS\n" + L" -xgmode , --xbox-mode \n" + L" Tile/swizzle using provided memory layout mode\n" +#endif + L"\n" + L" (PNG, JPG, TIF, TGA input only)\n" + L" --ignore-srgb Ignores any gamma setting in the metadata\n" + L"\n" + L" (TGA input only)\n" + L" --tga-zero-alpha Allow all zero alpha channel files to be loaded 'as is'\n" + L"\n" + L" (TGA output only)\n" + L" -tga20 Write file including TGA 2.0 extension area\n" + L"\n" + L" (BMP, PNG, JPG, TIF, WDP, and HIEF output only)\n" + L" -wicq , --wic-quality \n" + L" When writing images with WIC use quality (0.0 to 1.0)\n" + L" --wic-lossless When writing images with WIC use lossless mode\n" + L" --wic-uncompressed When writing images with WIC use uncompressed mode\n" + L" --wic-multiframe When writing images with WIC encode multiframe images\n" + L"\n" + L" -nologo suppress copyright message\n" + L" --timing display elapsed processing time\n" + L"\n" +#ifdef _OPENMP + L" --single-proc Do not use multi-threaded compression\n" +#endif + L" -gpu Select GPU for DirectCompute-based codecs (0 is default)\n" + L" -nogpu Do not use DirectCompute-based codecs\n" + L"\n" + L" -bc , --block-compress \n" + L" Sets options for BC compression\n" + L" options must be one or more of\n" + L" d, u, q, x\n" + L" -aw , --alpha-weight \n" + L" BC7 GPU compressor weighting for alpha error metric\n" + L" (defaults to 1.0)\n" + L"\n" + L" -c , --color-key colorkey (a.k.a. chromakey) transparency\n" + L" --rotate-color rotates color primaries and/or applies a curve\n" + L"\n" + L" -nits , --paper-white-nits \n" + L" paper-white value in nits to use for HDR10 (def: 200.0)\n" + L" --tonemap Apply a tonemap operator based on maximum luminance\n" + L" --x2-bias Enable *2 - 1 conversion cases for unorm/pos-only-float\n" + L" --invert-y Invert Y (i.e. green) channel values\n" + L" --reconstruct-z Rebuild Z (blue) channel assuming X/Y are normals\n" + L" --swizzle Swizzle image channels using HLSL-style mask\n" + L"\n" + L" '-- ' is needed if any input filepath starts with the '-' or '/' character\n"; wprintf(L"%ls", s_usage); @@ -905,8 +881,7 @@ namespace wprintf(L"\n :\n"); ComPtr adapter; - for (UINT adapterIndex = 0; - SUCCEEDED(dxgiFactory->EnumAdapters(adapterIndex, adapter.ReleaseAndGetAddressOf())); + for (UINT adapterIndex = 0; SUCCEEDED(dxgiFactory->EnumAdapters(adapterIndex, adapter.ReleaseAndGetAddressOf())); ++adapterIndex) { DXGI_ADAPTER_DESC desc; @@ -918,8 +893,7 @@ namespace } } - _Success_(return) - bool CreateDevice(int adapter, _Outptr_ ID3D11Device** pDevice) noexcept + _Success_(return) bool CreateDevice(int adapter, _Outptr_ ID3D11Device** pDevice) noexcept { if (!pDevice) return false; @@ -934,22 +908,22 @@ namespace if (!hModD3D11) return false; - s_DynamicD3D11CreateDevice = reinterpret_cast(reinterpret_cast(GetProcAddress(hModD3D11, "D3D11CreateDevice"))); + s_DynamicD3D11CreateDevice + = reinterpret_cast(reinterpret_cast(GetProcAddress(hModD3D11, "D3D11CreateDevice"))); if (!s_DynamicD3D11CreateDevice) return false; } - const D3D_FEATURE_LEVEL featureLevels[] = - { + const D3D_FEATURE_LEVEL featureLevels[] = { D3D_FEATURE_LEVEL_11_0, D3D_FEATURE_LEVEL_10_1, D3D_FEATURE_LEVEL_10_0, }; UINT createDeviceFlags = 0; - #ifdef _DEBUG +#ifdef _DEBUG createDeviceFlags |= D3D11_CREATE_DEVICE_DEBUG; - #endif +#endif ComPtr pAdapter; if (adapter >= 0) @@ -966,10 +940,16 @@ namespace } D3D_FEATURE_LEVEL fl; - HRESULT hr = s_DynamicD3D11CreateDevice(pAdapter.Get(), + HRESULT hr = s_DynamicD3D11CreateDevice(pAdapter.Get(), (pAdapter) ? D3D_DRIVER_TYPE_UNKNOWN : D3D_DRIVER_TYPE_HARDWARE, - nullptr, createDeviceFlags, featureLevels, static_cast(std::size(featureLevels)), - D3D11_SDK_VERSION, pDevice, &fl, nullptr); + nullptr, + createDeviceFlags, + featureLevels, + static_cast(std::size(featureLevels)), + D3D11_SDK_VERSION, + pDevice, + &fl, + nullptr); if (SUCCEEDED(hr)) { if (fl < D3D_FEATURE_LEVEL_11_0) @@ -1005,7 +985,8 @@ namespace if (SUCCEEDED(hr)) { wprintf(L"\n[Using DirectCompute %ls on \"%ls\"]\n", - (fl >= D3D_FEATURE_LEVEL_11_0) ? L"5.0" : L"4.0", desc.Description); + (fl >= D3D_FEATURE_LEVEL_11_0) ? L"5.0" : L"4.0", + desc.Description); } } } @@ -1023,7 +1004,11 @@ namespace if (origx > origy) { size_t x; - for (x = maxsize; x > 1; x >>= 1) { if (x <= targetx) break; } + for (x = maxsize; x > 1; x >>= 1) + { + if (x <= targetx) + break; + } targetx = x; float bestScore = FLT_MAX; @@ -1033,14 +1018,18 @@ namespace if (score < bestScore) { bestScore = score; - targety = y; + targety = y; } } } else { size_t y; - for (y = maxsize; y > 1; y >>= 1) { if (y <= targety) break; } + for (y = maxsize; y > 1; y >>= 1) + { + if (y <= targety) + break; + } targety = y; float bestScore = FLT_MAX; @@ -1050,7 +1039,7 @@ namespace if (score < bestScore) { bestScore = score; - targetx = x; + targetx = x; } } } @@ -1097,6 +1086,7 @@ namespace const XMVECTORF32 c_MaxNitsFor2084 = { { { 10000.0f, 10000.0f, 10000.0f, 1.f } } }; + // clang-format off // HDTV to UHDTV (Rec.709 color primaries into Rec.2020) const XMMATRIX c_from709to2020 = { @@ -1141,24 +1131,28 @@ namespace 0.0000000f, 0.0000000f, 1.098273600f, 0.f, 0.f, 0.f, 0.f, 1.f }; + // clang-format on inline float LinearToST2084(float normalizedLinearValue) noexcept { - const float ST2084 = pow((0.8359375f + 18.8515625f * pow(abs(normalizedLinearValue), 0.1593017578f)) / (1.0f + 18.6875f * pow(abs(normalizedLinearValue), 0.1593017578f)), 78.84375f); - return ST2084; // Don't clamp between [0..1], so we can still perform operations on scene values higher than 10,000 nits + const float ST2084 = pow((0.8359375f + 18.8515625f * pow(abs(normalizedLinearValue), 0.1593017578f)) + / (1.0f + 18.6875f * pow(abs(normalizedLinearValue), 0.1593017578f)), + 78.84375f); + return ST2084; // Don't clamp between [0..1], so we can still perform operations on scene values higher than 10,000 nits } inline float ST2084ToLinear(float ST2084) noexcept { - const float normalizedLinear = pow(std::max(pow(abs(ST2084), 1.0f / 78.84375f) - 0.8359375f, 0.0f) / (18.8515625f - 18.6875f * pow(abs(ST2084), 1.0f / 78.84375f)), 1.0f / 0.1593017578f); + const float normalizedLinear = pow(std::max(pow(abs(ST2084), 1.0f / 78.84375f) - 0.8359375f, 0.0f) + / (18.8515625f - 18.6875f * pow(abs(ST2084), 1.0f / 78.84375f)), + 1.0f / 0.1593017578f); return normalizedLinear; } - bool ParseSwizzleMask( - _In_reads_(4) const wchar_t* mask, - _Out_writes_(4) uint32_t* swizzleElements, - _Out_writes_(4) uint32_t* zeroElements, - _Out_writes_(4) uint32_t* oneElements) noexcept + bool ParseSwizzleMask(_In_reads_(4) const wchar_t* mask, + _Out_writes_(4) uint32_t* swizzleElements, + _Out_writes_(4) uint32_t* zeroElements, + _Out_writes_(4) uint32_t* oneElements) noexcept { if (!mask || !swizzleElements || !zeroElements || !oneElements) return false; @@ -1180,8 +1174,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { swizzleElements[k] = 0; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -1192,8 +1186,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { swizzleElements[k] = 1; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -1204,8 +1198,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { swizzleElements[k] = 2; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -1216,8 +1210,8 @@ namespace for (size_t k = j; k < 4; ++k) { swizzleElements[k] = 3; - zeroElements[k] = 0; - oneElements[k] = 0; + zeroElements[k] = 0; + oneElements[k] = 0; } break; @@ -1225,8 +1219,8 @@ namespace for (uint32_t k = j; k < 4; ++k) { swizzleElements[k] = k; - zeroElements[k] = 1; - oneElements[k] = 0; + zeroElements[k] = 1; + oneElements[k] = 0; } break; @@ -1234,19 +1228,18 @@ namespace for (uint32_t k = j; k < 4; ++k) { swizzleElements[k] = k; - zeroElements[k] = 0; - oneElements[k] = 1; + zeroElements[k] = 0; + oneElements[k] = 1; } break; - default: - return false; + default: return false; } } return true; } -} +} // namespace //-------------------------------------------------------------------------------------- // Entry-point @@ -1258,37 +1251,37 @@ namespace int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { // Parameters and defaults - size_t width = 0; - size_t height = 0; - size_t mipLevels = 0; - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; - TEX_FILTER_FLAGS dwFilter = TEX_FILTER_DEFAULT; - TEX_FILTER_FLAGS dwSRGB = TEX_FILTER_DEFAULT; - TEX_FILTER_FLAGS dwConvert = TEX_FILTER_DEFAULT; - TEX_COMPRESS_FLAGS dwCompress = TEX_COMPRESS_DEFAULT; - TEX_FILTER_FLAGS dwFilterOpts = TEX_FILTER_DEFAULT; - uint32_t FileType = CODEC_DDS; - uint32_t maxSize = 16384; - int adapter = -1; - float alphaThreshold = TEX_THRESHOLD_DEFAULT; - float alphaWeight = 1.f; - CNMAP_FLAGS dwNormalMap = CNMAP_DEFAULT; - float nmapAmplitude = 1.f; - float wicQuality = -1.f; - uint32_t colorKey = 0; - uint32_t dwRotateColor = 0; - float paperWhiteNits = 200.f; - float preserveAlphaCoverageRef = 0.0f; - bool keepRecursiveDirs = false; - bool dxt5nm = false; - bool dxt5rxgb = false; - bool use24bpp = false; - uint32_t swizzleElements[4] = { 0, 1, 2, 3 }; - uint32_t zeroElements[4] = {}; - uint32_t oneElements[4] = {}; - - wchar_t szPrefix[MAX_PATH] = {}; - wchar_t szSuffix[MAX_PATH] = {}; + size_t width = 0; + size_t height = 0; + size_t mipLevels = 0; + DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN; + TEX_FILTER_FLAGS dwFilter = TEX_FILTER_DEFAULT; + TEX_FILTER_FLAGS dwSRGB = TEX_FILTER_DEFAULT; + TEX_FILTER_FLAGS dwConvert = TEX_FILTER_DEFAULT; + TEX_COMPRESS_FLAGS dwCompress = TEX_COMPRESS_DEFAULT; + TEX_FILTER_FLAGS dwFilterOpts = TEX_FILTER_DEFAULT; + uint32_t FileType = CODEC_DDS; + uint32_t maxSize = 16384; + int adapter = -1; + float alphaThreshold = TEX_THRESHOLD_DEFAULT; + float alphaWeight = 1.f; + CNMAP_FLAGS dwNormalMap = CNMAP_DEFAULT; + float nmapAmplitude = 1.f; + float wicQuality = -1.f; + uint32_t colorKey = 0; + uint32_t dwRotateColor = 0; + float paperWhiteNits = 200.f; + float preserveAlphaCoverageRef = 0.0f; + bool keepRecursiveDirs = false; + bool dxt5nm = false; + bool dxt5rxgb = false; + bool use24bpp = false; + uint32_t swizzleElements[4] = { 0, 1, 2, 3 }; + uint32_t zeroElements[4] = {}; + uint32_t oneElements[4] = {}; + + wchar_t szPrefix[MAX_PATH] = {}; + wchar_t szSuffix[MAX_PATH] = {}; std::filesystem::path outputDir; // Set locale for output since GetErrorDesc can get localized strings. @@ -1321,9 +1314,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 0; } - uint64_t dwOptions = 0; + uint64_t dwOptions = 0; std::list conversion; - bool allowOpts = true; + bool allowOpts = true; for (int iArg = 1; iArg < argc; ++iArg) { @@ -1332,13 +1325,14 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (allowOpts && (('-' == pArg[0]) || ('/' == pArg[0]))) { uint64_t dwOption = 0; - PWSTR pValue = nullptr; + PWSTR pValue = nullptr; if (('-' == pArg[0]) && ('-' == pArg[1])) { if (pArg[2] == 0) { - // "-- " is the POSIX standard for "end of options" marking to escape the '-' and '/' characters at the start of filepaths. + // "-- " is the POSIX standard for "end of options" marking to escape the '-' and '/' characters at the start of + // filepaths. allowOpts = false; continue; } @@ -1346,7 +1340,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { pArg += 2; - for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue); + for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue) + ; if (*pValue) *pValue++ = 0; @@ -1358,7 +1353,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { pArg++; - for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue); + for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue) + ; if (*pValue) *pValue++ = 0; @@ -1377,9 +1373,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) switch (dwOption) { - case 0: - wprintf(L"ERROR: Unknown option: `%ls`\n\nUse %ls --help\n", pArg, g_ToolName); - return 1; + case 0: wprintf(L"ERROR: Unknown option: `%ls`\n\nUse %ls --help\n", pArg, g_ToolName); return 1; case OPT_FILELIST: case OPT_WIDTH: @@ -1406,13 +1400,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) // These don't use flag bits break; - case OPT_VERSION: - PrintLogo(true, g_ToolName, g_Description); - return 0; + case OPT_VERSION: PrintLogo(true, g_ToolName, g_Description); return 0; - case OPT_HELP: - PrintUsage(true); - return 0; + case OPT_HELP: PrintUsage(true); return 0; default: if (dwOptions & (UINT64_C(1) << dwOption)) @@ -1451,10 +1441,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) case OPT_PAPER_WHITE_NITS: case OPT_PRESERVE_ALPHA_COVERAGE: case OPT_SWIZZLE: - #ifdef USE_XBOX_EXTS +#ifdef USE_XBOX_EXTS case OPT_XGMODE: - #endif - // These support either "-arg:value" or "-arg value" +#endif + // These support either "-arg:value" or "-arg value" if (!*pValue) { if ((iArg + 1 >= argc)) @@ -1514,12 +1504,12 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) break; case FORMAT_DXT5_RXGB: - format = DXGI_FORMAT_BC3_UNORM; + format = DXGI_FORMAT_BC3_UNORM; dxt5rxgb = true; break; case FORMAT_24BPP_LEGACY: - format = DXGI_FORMAT_B8G8R8X8_UNORM; + format = DXGI_FORMAT_B8G8R8X8_UNORM; use24bpp = true; break; @@ -1552,40 +1542,25 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - case OPT_SRGBI: - dwSRGB |= TEX_FILTER_SRGB_IN; - break; + case OPT_SRGBI: dwSRGB |= TEX_FILTER_SRGB_IN; break; - case OPT_SRGBO: - dwSRGB |= TEX_FILTER_SRGB_OUT; - break; + case OPT_SRGBO: dwSRGB |= TEX_FILTER_SRGB_OUT; break; - case OPT_SRGB: - dwSRGB |= TEX_FILTER_SRGB; - break; + case OPT_SRGB: dwSRGB |= TEX_FILTER_SRGB; break; - case OPT_SEPALPHA: - dwFilterOpts |= TEX_FILTER_SEPARATE_ALPHA; - break; + case OPT_SEPALPHA: dwFilterOpts |= TEX_FILTER_SEPARATE_ALPHA; break; - case OPT_NO_WIC: - dwFilterOpts |= TEX_FILTER_FORCE_NON_WIC; - break; + case OPT_NO_WIC: dwFilterOpts |= TEX_FILTER_FORCE_NON_WIC; break; - case OPT_PREFIX: - wcscpy_s(szPrefix, MAX_PATH, pValue); - break; + case OPT_PREFIX: wcscpy_s(szPrefix, MAX_PATH, pValue); break; - case OPT_SUFFIX: - wcscpy_s(szSuffix, MAX_PATH, pValue); - break; + case OPT_SUFFIX: wcscpy_s(szSuffix, MAX_PATH, pValue); break; - case OPT_OUTPUTDIR: - { - std::filesystem::path path(pValue); - outputDir = path.make_preferred(); - } - break; + case OPT_OUTPUTDIR: { + std::filesystem::path path(pValue); + outputDir = path.make_preferred(); + } + break; case OPT_FILETYPE: FileType = LookupByName(pValue, g_pSaveFileTypes); @@ -1635,63 +1610,62 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) dwFilterOpts |= TEX_FILTER_MIRROR; break; - case OPT_NORMAL_MAP: - { - dwNormalMap = CNMAP_DEFAULT; + case OPT_NORMAL_MAP: { + dwNormalMap = CNMAP_DEFAULT; - if (wcschr(pValue, L'l')) - { - dwNormalMap |= CNMAP_CHANNEL_LUMINANCE; - } - else if (wcschr(pValue, L'r')) - { - dwNormalMap |= CNMAP_CHANNEL_RED; - } - else if (wcschr(pValue, L'g')) - { - dwNormalMap |= CNMAP_CHANNEL_GREEN; - } - else if (wcschr(pValue, L'b')) - { - dwNormalMap |= CNMAP_CHANNEL_BLUE; - } - else if (wcschr(pValue, L'a')) - { - dwNormalMap |= CNMAP_CHANNEL_ALPHA; - } - else - { - wprintf(L"Invalid value specified for -nmap (%ls), missing l, r, g, b, or a\n\n", pValue); - return 1; - } + if (wcschr(pValue, L'l')) + { + dwNormalMap |= CNMAP_CHANNEL_LUMINANCE; + } + else if (wcschr(pValue, L'r')) + { + dwNormalMap |= CNMAP_CHANNEL_RED; + } + else if (wcschr(pValue, L'g')) + { + dwNormalMap |= CNMAP_CHANNEL_GREEN; + } + else if (wcschr(pValue, L'b')) + { + dwNormalMap |= CNMAP_CHANNEL_BLUE; + } + else if (wcschr(pValue, L'a')) + { + dwNormalMap |= CNMAP_CHANNEL_ALPHA; + } + else + { + wprintf(L"Invalid value specified for -nmap (%ls), missing l, r, g, b, or a\n\n", pValue); + return 1; + } - if (wcschr(pValue, L'm')) + if (wcschr(pValue, L'm')) + { + dwNormalMap |= CNMAP_MIRROR; + } + else + { + if (wcschr(pValue, L'u')) { - dwNormalMap |= CNMAP_MIRROR; + dwNormalMap |= CNMAP_MIRROR_U; } - else + if (wcschr(pValue, L'v')) { - if (wcschr(pValue, L'u')) - { - dwNormalMap |= CNMAP_MIRROR_U; - } - if (wcschr(pValue, L'v')) - { - dwNormalMap |= CNMAP_MIRROR_V; - } + dwNormalMap |= CNMAP_MIRROR_V; } + } - if (wcschr(pValue, L'i')) - { - dwNormalMap |= CNMAP_INVERT_SIGN; - } + if (wcschr(pValue, L'i')) + { + dwNormalMap |= CNMAP_INVERT_SIGN; + } - if (wcschr(pValue, L'o')) - { - dwNormalMap |= CNMAP_COMPUTE_OCCLUSION; - } + if (wcschr(pValue, L'o')) + { + dwNormalMap |= CNMAP_COMPUTE_OCCLUSION; } - break; + } + break; case OPT_NORMAL_MAP_AMPLITUDE: if (!dwNormalMap) @@ -1766,54 +1740,52 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - case OPT_BC_COMPRESS: - { - dwCompress = TEX_COMPRESS_DEFAULT; + case OPT_BC_COMPRESS: { + dwCompress = TEX_COMPRESS_DEFAULT; - bool found = false; - if (wcschr(pValue, L'u')) - { - dwCompress |= TEX_COMPRESS_UNIFORM; - found = true; - } + bool found = false; + if (wcschr(pValue, L'u')) + { + dwCompress |= TEX_COMPRESS_UNIFORM; + found = true; + } - if (wcschr(pValue, L'd')) - { - dwCompress |= TEX_COMPRESS_DITHER; - found = true; - } + if (wcschr(pValue, L'd')) + { + dwCompress |= TEX_COMPRESS_DITHER; + found = true; + } - if (wcschr(pValue, L'q')) - { - dwCompress |= TEX_COMPRESS_BC7_QUICK; - found = true; - } + if (wcschr(pValue, L'q')) + { + dwCompress |= TEX_COMPRESS_BC7_QUICK; + found = true; + } - if (wcschr(pValue, L'x')) - { - dwCompress |= TEX_COMPRESS_BC7_USE_3SUBSETS; - found = true; - } + if (wcschr(pValue, L'x')) + { + dwCompress |= TEX_COMPRESS_BC7_USE_3SUBSETS; + found = true; + } - if ((dwCompress & (TEX_COMPRESS_BC7_QUICK | TEX_COMPRESS_BC7_USE_3SUBSETS)) == (TEX_COMPRESS_BC7_QUICK | TEX_COMPRESS_BC7_USE_3SUBSETS)) - { - wprintf(L"Can't use -bc x (max) and -bc q (quick) at same time\n\n"); - PrintUsage(); - return 1; - } + if ((dwCompress & (TEX_COMPRESS_BC7_QUICK | TEX_COMPRESS_BC7_USE_3SUBSETS)) + == (TEX_COMPRESS_BC7_QUICK | TEX_COMPRESS_BC7_USE_3SUBSETS)) + { + wprintf(L"Can't use -bc x (max) and -bc q (quick) at same time\n\n"); + PrintUsage(); + return 1; + } - if (!found) - { - wprintf(L"Invalid value specified for -bc (%ls), missing d, u, q, or x\n\n", pValue); - return 1; - } + if (!found) + { + wprintf(L"Invalid value specified for -bc (%ls), missing d, u, q, or x\n\n", pValue); + return 1; } - break; + } + break; case OPT_WIC_QUALITY: - if (swscanf_s(pValue, L"%f", &wicQuality) != 1 - || (wicQuality < 0.f) - || (wicQuality > 1.f)) + if (swscanf_s(pValue, L"%f", &wicQuality) != 1 || (wicQuality < 0.f) || (wicQuality > 1.f)) { wprintf(L"Invalid value specified with -wicq (%ls)\n", pValue); printf("\n"); @@ -1833,9 +1805,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) colorKey &= 0xFFFFFF; break; - case OPT_X2_BIAS: - dwConvert |= TEX_FILTER_FLOAT_X2BIAS; - break; + case OPT_X2_BIAS: dwConvert |= TEX_FILTER_FLOAT_X2BIAS; break; case OPT_USE_DX10: if (dwOptions & (UINT64_C(1) << OPT_USE_DX9)) @@ -1872,21 +1842,20 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - case OPT_FILELIST: + case OPT_FILELIST: { + std::filesystem::path path(pValue); + std::wifstream inFile(path.make_preferred().c_str()); + if (!inFile) { - std::filesystem::path path(pValue); - std::wifstream inFile(path.make_preferred().c_str()); - if (!inFile) - { - wprintf(L"Error opening -flist file %ls\n", pValue); - return 1; - } + wprintf(L"Error opening -flist file %ls\n", pValue); + return 1; + } - inFile.imbue(std::locale::classic()); + inFile.imbue(std::locale::classic()); - ProcessFileList(inFile, conversion); - } - break; + ProcessFileList(inFile, conversion); + } + break; case OPT_PAPER_WHITE_NITS: if (swscanf_s(pValue, L"%f", &paperWhiteNits) != 1) @@ -1930,44 +1899,41 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - #ifdef USE_XBOX_EXTS - case OPT_XGMODE: - { - #ifdef _USE_SCARLETT - static const SValue s_pXGModes[] = - { - { L"xboxseriess", XG_HARDWARE_VERSION_XBOX_SCARLETT_LOCKHART }, - { L"xboxseriesx", XG_HARDWARE_VERSION_XBOX_SCARLETT_ANACONDA }, - { nullptr, 0 }, - }; - #else - static const SValue s_pXGModes[] = - { - { L"xboxone", XG_HARDWARE_VERSION_XBOX_ONE }, - { L"xboxonex", XG_HARDWARE_VERSION_XBOX_ONE_X }, - { L"scorpio", XG_HARDWARE_VERSION_SCORPIO }, - { nullptr, 0 }, - }; - #endif - - const uint32_t mode = LookupByName(pValue, s_pXGModes); - if (!mode) - { - printf("Invalid value specified with -xgmode (%ls)\n", pValue); - wprintf(L"\n : "); - PrintList(14, s_pXGModes); - return 1; - } +#ifdef USE_XBOX_EXTS + case OPT_XGMODE: { +#ifdef _USE_SCARLETT + static const SValue s_pXGModes[] = { + { L"xboxseriess", XG_HARDWARE_VERSION_XBOX_SCARLETT_LOCKHART }, + { L"xboxseriesx", XG_HARDWARE_VERSION_XBOX_SCARLETT_ANACONDA }, + { nullptr, 0 }, + }; +#else + static const SValue s_pXGModes[] = { + { L"xboxone", XG_HARDWARE_VERSION_XBOX_ONE }, + { L"xboxonex", XG_HARDWARE_VERSION_XBOX_ONE_X }, + { L"scorpio", XG_HARDWARE_VERSION_SCORPIO }, + { nullptr, 0 }, + }; +#endif - XGSetHardwareVersion(static_cast(mode)); - break; + const uint32_t mode = LookupByName(pValue, s_pXGModes); + if (!mode) + { + printf("Invalid value specified with -xgmode (%ls)\n", pValue); + wprintf(L"\n : "); + PrintList(14, s_pXGModes); + return 1; } - #endif // USE_XBOX_EXTS + + XGSetHardwareVersion(static_cast(mode)); + break; + } +#endif // USE_XBOX_EXTS } } else if (wcspbrk(pArg, L"?*") != nullptr) { - const size_t count = conversion.size(); + const size_t count = conversion.size(); std::filesystem::path path(pArg); SearchForFiles(path.make_preferred(), conversion, (dwOptions & (UINT64_C(1) << OPT_RECURSIVE)) != 0, nullptr); if (conversion.size() <= count) @@ -1978,7 +1944,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else { - SConversion conv = {}; + SConversion conv = {}; std::filesystem::path path(pArg); conv.szSrc = path.make_preferred().native(); conversion.push_back(conv); @@ -2012,16 +1978,16 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } LARGE_INTEGER qpcFreq = {}; - std::ignore = QueryPerformanceFrequency(&qpcFreq); + std::ignore = QueryPerformanceFrequency(&qpcFreq); LARGE_INTEGER qpcStart = {}; - std::ignore = QueryPerformanceCounter(&qpcStart); + std::ignore = QueryPerformanceCounter(&qpcStart); // Convert images - bool sizewarn = false; - bool nonpow2warn = false; - bool non4bc = false; - bool preserveAlphaCoverage = false; + bool sizewarn = false; + bool nonpow2warn = false; + bool non4bc = false; + bool preserveAlphaCoverage = false; ComPtr pDevice; int retVal = 0; @@ -2035,7 +2001,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"reading %ls", pConv->szSrc.c_str()); fflush(stdout); - TexMetadata info; + TexMetadata info; std::unique_ptr image(new (std::nothrow) ScratchImage); if (!image) @@ -2045,15 +2011,16 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } std::filesystem::path curpath(pConv->szSrc); - const auto ext = curpath.extension(); + const auto ext = curpath.extension(); - #ifndef USE_XBOX_EXTS +#ifndef USE_XBOX_EXTS constexpr - #endif - bool isXbox = false; +#endif + bool isXbox + = false; if (_wcsicmp(ext.c_str(), L".dds") == 0 || _wcsicmp(ext.c_str(), L".ddx") == 0) { - #ifdef USE_XBOX_EXTS +#ifdef USE_XBOX_EXTS hr = Xbox::GetMetadataFromDDSFile(curpath.c_str(), info, isXbox); if (FAILED(hr)) { @@ -2073,7 +2040,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } } else - #endif // USE_XBOX_EXTS +#endif // USE_XBOX_EXTS { DDS_FLAGS ddsFlags = DDS_FLAGS_ALLOW_LARGE_FILES; if (dwOptions & (UINT64_C(1) << OPT_DDS_DWORD_ALIGN)) @@ -2177,7 +2144,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) continue; } } - #ifdef USE_OPENEXR +#ifdef USE_OPENEXR else if (_wcsicmp(ext.c_str(), L".exr") == 0) { hr = LoadFromEXRFile(curpath.c_str(), &info, *image); @@ -2188,8 +2155,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) continue; } } - #endif - #ifdef USE_LIBJPEG +#endif +#ifdef USE_LIBJPEG else if (_wcsicmp(ext.c_str(), L".jpg") == 0 || _wcsicmp(ext.c_str(), L".jpeg") == 0) { JPEG_FLAGS jpegFlags = JPEG_FLAGS_NONE; @@ -2206,8 +2173,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) continue; } } - #endif - #ifdef USE_LIBPNG +#endif +#ifdef USE_LIBPNG else if (_wcsicmp(ext.c_str(), L".png") == 0) { PNG_FLAGS pngFlags = (IsBGR(format)) ? PNG_FLAGS_BGR : PNG_FLAGS_NONE; @@ -2224,16 +2191,22 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) continue; } } - #endif +#endif else { // WIC shares the same filter values for mode and dither - static_assert(static_cast(WIC_FLAGS_DITHER) == static_cast(TEX_FILTER_DITHER), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_DITHER_DIFFUSION) == static_cast(TEX_FILTER_DITHER_DIFFUSION), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_POINT) == static_cast(TEX_FILTER_POINT), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_LINEAR) == static_cast(TEX_FILTER_LINEAR), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_CUBIC) == static_cast(TEX_FILTER_CUBIC), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_FANT) == static_cast(TEX_FILTER_FANT), "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_DITHER) == static_cast(TEX_FILTER_DITHER), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_DITHER_DIFFUSION) == static_cast(TEX_FILTER_DITHER_DIFFUSION), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_POINT) == static_cast(TEX_FILTER_POINT), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_LINEAR) == static_cast(TEX_FILTER_LINEAR), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_CUBIC) == static_cast(TEX_FILTER_CUBIC), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_FANT) == static_cast(TEX_FILTER_FANT), + "WIC_FLAGS_* & TEX_FILTER_* should match"); WIC_FLAGS wicFlags = WIC_FLAGS_NONE | dwFilter; if (FileType == CODEC_DDS) @@ -2258,7 +2231,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else if (_wcsicmp(ext.c_str(), L".webp") == 0) { - wprintf(L"INFO: This format requires installing the WEBP Image Extensions - https://apps.microsoft.com/detail/9PG2DK419DRG\n"); + wprintf( + L"INFO: This format requires installing the WEBP Image Extensions - " + L"https://apps.microsoft.com/detail/9PG2DK419DRG\n"); } } continue; @@ -2290,8 +2265,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = ConvertToSinglePlane(img, nimg, info, *timage); if (FAILED(hr)) { - wprintf(L" FAILED [converttosingleplane] (%08X%ls)\n", - static_cast(hr), GetErrorDesc(hr)); + wprintf(L" FAILED [converttosingleplane] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); retVal = 1; continue; } @@ -2337,14 +2311,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) // Fix by changing size but also have to trim any mip-levels which can be invalid TexMetadata mdata = image->GetMetadata(); - mdata.width = (info.width + 3u) & ~0x3u; - mdata.height = (info.height + 3u) & ~0x3u; - mdata.mipLevels = 1; - hr = timage->Initialize(mdata); + mdata.width = (info.width + 3u) & ~0x3u; + mdata.height = (info.height + 3u) & ~0x3u; + mdata.mipLevels = 1; + hr = timage->Initialize(mdata); if (FAILED(hr)) { - wprintf(L" FAILED [BC non-multiple-of-4 fixup] (%08X%ls)\n", - static_cast(hr), GetErrorDesc(hr)); + wprintf(L" FAILED [BC non-multiple-of-4 fixup] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } @@ -2369,8 +2342,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } } - info.width = mdata.width; - info.height = mdata.height; + info.width = mdata.width; + info.height = mdata.height; info.mipLevels = mdata.mipLevels; image.swap(timage); } @@ -2397,22 +2370,17 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) switch (info.format) { case DXGI_FORMAT_BC4_SNORM: - if ((dwOptions & ((UINT64_C(1) << OPT_INVERT_Y) | (UINT64_C(1)) << OPT_RECONSTRUCT_Z)) - || swizzleElements[1] != 1 || swizzleElements[2] != 2 || swizzleElements[3] != 3 - || zeroElements[1] != 0 || zeroElements[2] != 0 || zeroElements[3] != 0 - || oneElements[1] != 0 || oneElements[2] != 0 || oneElements[3] != 0 - || dxt5nm || dxt5rxgb) + if ((dwOptions & ((UINT64_C(1) << OPT_INVERT_Y) | (UINT64_C(1)) << OPT_RECONSTRUCT_Z)) || swizzleElements[1] != 1 + || swizzleElements[2] != 2 || swizzleElements[3] != 3 || zeroElements[1] != 0 || zeroElements[2] != 0 + || zeroElements[3] != 0 || oneElements[1] != 0 || oneElements[2] != 0 || oneElements[3] != 0 || dxt5nm || dxt5rxgb) { formatDecompress = DXGI_FORMAT_R8G8B8A8_SNORM; } break; case DXGI_FORMAT_BC5_SNORM: - if ((dwOptions & (UINT64_C(1) << OPT_RECONSTRUCT_Z)) - || swizzleElements[2] != 2 || swizzleElements[3] != 3 - || zeroElements[2] != 0 || zeroElements[3] != 0 - || oneElements[2] != 0 || oneElements[3] != 0 - || dxt5nm || dxt5rxgb) + if ((dwOptions & (UINT64_C(1) << OPT_RECONSTRUCT_Z)) || swizzleElements[2] != 2 || swizzleElements[3] != 3 + || zeroElements[2] != 0 || zeroElements[3] != 0 || oneElements[2] != 0 || oneElements[3] != 0 || dxt5nm || dxt5rxgb) { formatDecompress = DXGI_FORMAT_R8G8B8A8_SNORM; } @@ -2420,11 +2388,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) case DXGI_FORMAT_BC4_TYPELESS: case DXGI_FORMAT_BC4_UNORM: - if ((dwOptions & ((UINT64_C(1) << OPT_INVERT_Y) | (UINT64_C(1)) << OPT_RECONSTRUCT_Z)) - || swizzleElements[1] != 1 || swizzleElements[2] != 2 || swizzleElements[3] != 3 - || zeroElements[1] != 0 || zeroElements[2] != 0 || zeroElements[3] != 0 - || oneElements[1] != 0 || oneElements[2] != 0 || oneElements[3] != 0 - || dxt5nm || dxt5rxgb) + if ((dwOptions & ((UINT64_C(1) << OPT_INVERT_Y) | (UINT64_C(1)) << OPT_RECONSTRUCT_Z)) || swizzleElements[1] != 1 + || swizzleElements[2] != 2 || swizzleElements[3] != 3 || zeroElements[1] != 0 || zeroElements[2] != 0 + || zeroElements[3] != 0 || oneElements[1] != 0 || oneElements[2] != 0 || oneElements[3] != 0 || dxt5nm || dxt5rxgb) { formatDecompress = DXGI_FORMAT_R8G8B8A8_UNORM; } @@ -2432,11 +2398,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) case DXGI_FORMAT_BC5_TYPELESS: case DXGI_FORMAT_BC5_UNORM: - if ((dwOptions & (UINT64_C(1) << OPT_RECONSTRUCT_Z)) - || swizzleElements[2] != 2 || swizzleElements[3] != 3 - || zeroElements[2] != 0 || zeroElements[3] != 0 - || oneElements[2] != 0 || oneElements[3] != 0 - || dxt5nm || dxt5rxgb) + if ((dwOptions & (UINT64_C(1) << OPT_RECONSTRUCT_Z)) || swizzleElements[2] != 2 || swizzleElements[3] != 3 + || zeroElements[2] != 0 || zeroElements[3] != 0 || oneElements[2] != 0 || oneElements[3] != 0 || dxt5nm || dxt5rxgb) { formatDecompress = DXGI_FORMAT_R8G8B8A8_UNORM; } @@ -2480,9 +2443,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } // --- Undo Premultiplied Alpha (if requested) --------------------------------- - if ((dwOptions & (UINT64_C(1) << OPT_DEMUL_ALPHA)) - && HasAlpha(info.format) - && info.format != DXGI_FORMAT_A8_UNORM) + if ((dwOptions & (UINT64_C(1) << OPT_DEMUL_ALPHA)) && HasAlpha(info.format) && info.format != DXGI_FORMAT_A8_UNORM) { if (info.GetAlphaMode() == TEX_ALPHA_MODE_STRAIGHT) { @@ -2508,13 +2469,12 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = PremultiplyAlpha(img, nimg, info, TEX_PMALPHA_REVERSE | dwSRGB, *timage); if (FAILED(hr)) { - wprintf(L" FAILED [demultiply alpha] (%08X%ls)\n", - static_cast(hr), GetErrorDesc(hr)); + wprintf(L" FAILED [demultiply alpha] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); retVal = 1; continue; } - auto& tinfo = timage->GetMetadata(); + auto& tinfo = timage->GetMetadata(); info.miscFlags2 = tinfo.miscFlags2; assert(info.width == tinfo.width); @@ -2559,7 +2519,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) auto& tinfo = timage->GetMetadata(); - info.width = tinfo.width; + info.width = tinfo.width; info.height = tinfo.height; assert(info.depth == tinfo.depth); @@ -2606,7 +2566,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - hr = Resize(image->GetImages(), image->GetImageCount(), image->GetMetadata(), twidth, theight, dwFilter | dwFilterOpts, *timage); + hr = Resize(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), + twidth, + theight, + dwFilter | dwFilterOpts, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [resize] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -2616,8 +2582,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) auto& tinfo = timage->GetMetadata(); assert(tinfo.width == twidth && tinfo.height == theight && tinfo.mipLevels == 1); - info.width = tinfo.width; - info.height = tinfo.height; + info.width = tinfo.width; + info.height = tinfo.height; info.mipLevels = 1; assert(info.depth == tinfo.depth); @@ -2631,9 +2597,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (tMips > 0) { - const size_t maxMips = (info.depth > 1) - ? CountMips3D(info.width, info.height, info.depth) - : CountMips(info.width, info.height); + const size_t maxMips + = (info.depth > 1) ? CountMips3D(info.width, info.height, info.depth) : CountMips(info.width, info.height); if (tMips > maxMips) { @@ -2643,9 +2608,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } // --- Swizzle (if requested) -------------------------------------------------- - if (swizzleElements[0] != 0 || swizzleElements[1] != 1 || swizzleElements[2] != 2 || swizzleElements[3] != 3 - || zeroElements[0] != 0 || zeroElements[1] != 0 || zeroElements[2] != 0 || zeroElements[3] != 0 - || oneElements[0] != 0 || oneElements[1] != 0 || oneElements[2] != 0 || oneElements[3] != 0) + if (swizzleElements[0] != 0 || swizzleElements[1] != 1 || swizzleElements[2] != 2 || swizzleElements[3] != 3 || zeroElements[0] != 0 + || zeroElements[1] != 0 || zeroElements[2] != 0 || zeroElements[3] != 0 || oneElements[0] != 0 || oneElements[1] != 0 + || oneElements[2] != 0 || oneElements[3] != 0) { std::unique_ptr timage(new (std::nothrow) ScratchImage); if (!timage) @@ -2657,28 +2622,32 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) const XMVECTOR zc = XMVectorSelectControl(zeroElements[0], zeroElements[1], zeroElements[2], zeroElements[3]); const XMVECTOR oc = XMVectorSelectControl(oneElements[0], oneElements[1], oneElements[2], oneElements[3]); - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&, zc, oc](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); for (size_t j = 0; j < w; ++j) { - XMVECTOR pixel = XMVectorSwizzle(inPixels[j], - swizzleElements[0], swizzleElements[1], swizzleElements[2], swizzleElements[3]); - pixel = XMVectorSelect(pixel, g_XMZero, zc); + XMVECTOR pixel + = XMVectorSwizzle(inPixels[j], swizzleElements[0], swizzleElements[1], swizzleElements[2], swizzleElements[3]); + pixel = XMVectorSelect(pixel, g_XMZero, zc); outPixels[j] = XMVectorSelect(pixel, g_XMOne, oc); } - }, *timage); + }, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [swizzle] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(info.width == tinfo.width); assert(info.height == tinfo.height); @@ -2705,17 +2674,22 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - hr = Convert(image->GetImages(), image->GetImageCount(), image->GetMetadata(), DXGI_FORMAT_R16G16B16A16_FLOAT, - dwFilter | dwFilterOpts | dwSRGB | dwConvert, alphaThreshold, *timage); + hr = Convert(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), + DXGI_FORMAT_R16G16B16A16_FLOAT, + dwFilter | dwFilterOpts | dwSRGB | dwConvert, + alphaThreshold, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [convert] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(tinfo.format == DXGI_FORMAT_R16G16B16A16_FLOAT); info.format = DXGI_FORMAT_R16G16B16A16_FLOAT; @@ -2742,7 +2716,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) switch (dwRotateColor) { case ROTATE_709_TO_HDR10: - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -2771,11 +2748,15 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = value; } - }, *timage); + }, + *timage); break; case ROTATE_709_TO_2020: - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -2790,11 +2771,15 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = value; } - }, *timage); + }, + *timage); break; case ROTATE_HDR10_TO_709: - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -2823,11 +2808,15 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = value; } - }, *timage); + }, + *timage); break; case ROTATE_2020_TO_709: - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -2842,11 +2831,15 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = value; } - }, *timage); + }, + *timage); break; case ROTATE_P3D65_TO_HDR10: - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -2875,11 +2868,15 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = value; } - }, *timage); + }, + *timage); break; case ROTATE_P3D65_TO_2020: - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -2894,11 +2891,15 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = value; } - }, *timage); + }, + *timage); break; case ROTATE_709_TO_P3D65: - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -2913,11 +2914,15 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = value; } - }, *timage); + }, + *timage); break; case ROTATE_P3D65_TO_709: - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -2932,23 +2937,21 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = value; } - }, *timage); + }, + *timage); break; - default: - hr = E_NOTIMPL; - break; + default: hr = E_NOTIMPL; break; } if (FAILED(hr)) { - wprintf(L" FAILED [rotate color apply] (%08X%ls)\n", - static_cast(hr), GetErrorDesc(hr)); + wprintf(L" FAILED [rotate color apply] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(info.width == tinfo.width); assert(info.height == tinfo.height); @@ -2975,7 +2978,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) // Compute max luminosity across all images XMVECTOR maxLum = XMVectorZero(); - hr = EvaluateImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = EvaluateImage(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](const XMVECTOR* pixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -3001,7 +3006,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) // http://www.cs.utah.edu/~reinhard/cdrom/ maxLum = XMVectorMultiply(maxLum, maxLum); - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -3010,25 +3018,25 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { XMVECTOR value = inPixels[j]; - const XMVECTOR scale = XMVectorDivide( - XMVectorAdd(g_XMOne, XMVectorDivide(value, maxLum)), - XMVectorAdd(g_XMOne, value)); + const XMVECTOR scale + = XMVectorDivide(XMVectorAdd(g_XMOne, XMVectorDivide(value, maxLum)), XMVectorAdd(g_XMOne, value)); const XMVECTOR nvalue = XMVectorMultiply(value, scale); value = XMVectorSelect(value, nvalue, g_XMSelect1110); outPixels[j] = value; } - }, *timage); + }, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [tonemap apply] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(info.width == tinfo.width); assert(info.height == tinfo.height); @@ -3064,17 +3072,19 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) break; case DXGI_FORMAT_BC6H_SF16: - case DXGI_FORMAT_BC6H_UF16: - nmfmt = DXGI_FORMAT_R32G32B32_FLOAT; - break; + case DXGI_FORMAT_BC6H_UF16: nmfmt = DXGI_FORMAT_R32G32B32_FLOAT; break; - default: - nmfmt = (BitsPerColor(info.format) > 8) ? DXGI_FORMAT_R16G16B16A16_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM; - break; + default: nmfmt = (BitsPerColor(info.format) > 8) ? DXGI_FORMAT_R16G16B16A16_UNORM : DXGI_FORMAT_R8G8B8A8_UNORM; break; } } - hr = ComputeNormalMap(image->GetImages(), image->GetImageCount(), image->GetMetadata(), dwNormalMap, nmapAmplitude, nmfmt, *timage); + hr = ComputeNormalMap(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), + dwNormalMap, + nmapAmplitude, + nmfmt, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [normalmap] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -3106,8 +3116,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - hr = Convert(image->GetImages(), image->GetImageCount(), image->GetMetadata(), tformat, - dwFilter | dwFilterOpts | dwSRGB | dwConvert, alphaThreshold, *timage); + hr = Convert(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), + tformat, + dwFilter | dwFilterOpts | dwSRGB | dwConvert, + alphaThreshold, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [convert] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -3132,8 +3147,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } // --- ColorKey/ChromaKey ------------------------------------------------------ - if ((dwOptions & (UINT64_C(1) << OPT_COLORKEY)) - && HasAlpha(info.format)) + if ((dwOptions & (UINT64_C(1) << OPT_COLORKEY)) && HasAlpha(info.format)) { std::unique_ptr timage(new (std::nothrow) ScratchImage); if (!timage) @@ -3144,7 +3158,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) XMVECTOR colorKeyValue = XMLoadColor(reinterpret_cast(&colorKey)); - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { static const XMVECTORF32 s_tolerance = { { { 0.2f, 0.2f, 0.2f, 0.f } } }; @@ -3166,16 +3183,17 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = value; } - }, *timage); + }, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [colorkey] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(info.width == tinfo.width); assert(info.height == tinfo.height); @@ -3200,7 +3218,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { static const XMVECTORU32 s_selecty = { { { XM_SELECT_0, XM_SELECT_1, XM_SELECT_0, XM_SELECT_0 } } }; @@ -3215,16 +3236,17 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = XMVectorSelect(value, inverty, s_selecty); } - }, *timage); + }, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [inverty] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(info.width == tinfo.width); assert(info.height == tinfo.height); @@ -3251,7 +3273,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) bool isunorm = (FormatDataType(info.format) == FORMAT_TYPE_UNORM) != 0; - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { static const XMVECTORU32 s_selectz = { { { XM_SELECT_0, XM_SELECT_0, XM_SELECT_1, XM_SELECT_0 } } }; @@ -3266,8 +3291,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (isunorm) { XMVECTOR x2 = XMVectorMultiplyAdd(value, g_XMTwo, g_XMNegativeOne); - x2 = XMVectorSqrt(XMVectorSubtract(g_XMOne, XMVector2Dot(x2, x2))); - z = XMVectorMultiplyAdd(x2, g_XMOneHalf, g_XMOneHalf); + x2 = XMVectorSqrt(XMVectorSubtract(g_XMOne, XMVector2Dot(x2, x2))); + z = XMVectorMultiplyAdd(x2, g_XMOneHalf, g_XMOneHalf); } else { @@ -3276,16 +3301,17 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) outPixels[j] = XMVectorSelect(value, z, s_selectz); } - }, *timage); + }, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [reconstructz] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(info.width == tinfo.width); assert(info.height == tinfo.height); @@ -3335,12 +3361,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } TexMetadata mdata = info; - mdata.mipLevels = 1; - hr = timage->Initialize(mdata); + mdata.mipLevels = 1; + hr = timage->Initialize(mdata); if (FAILED(hr)) { - wprintf(L" FAILED [copy to single level] (%08X%ls)\n", - static_cast(hr), GetErrorDesc(hr)); + wprintf(L" FAILED [copy to single level] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } @@ -3348,12 +3373,15 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { for (size_t d = 0; d < info.depth; ++d) { - hr = CopyRectangle(*image->GetImage(0, 0, d), Rect(0, 0, info.width, info.height), - *timage->GetImage(0, 0, d), TEX_FILTER_DEFAULT, 0, 0); + hr = CopyRectangle(*image->GetImage(0, 0, d), + Rect(0, 0, info.width, info.height), + *timage->GetImage(0, 0, d), + TEX_FILTER_DEFAULT, + 0, + 0); if (FAILED(hr)) { - wprintf(L" FAILED [copy to single level] (%08X%ls)\n", - static_cast(hr), GetErrorDesc(hr)); + wprintf(L" FAILED [copy to single level] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); return 1; } } @@ -3362,8 +3390,12 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { for (size_t i = 0; i < info.arraySize; ++i) { - hr = CopyRectangle(*image->GetImage(0, i, 0), Rect(0, 0, info.width, info.height), - *timage->GetImage(0, i, 0), TEX_FILTER_DEFAULT, 0, 0); + hr = CopyRectangle(*image->GetImage(0, i, 0), + Rect(0, 0, info.width, info.height), + *timage->GetImage(0, i, 0), + TEX_FILTER_DEFAULT, + 0, + 0); if (FAILED(hr)) { wprintf(L" FAILED [copy to single level] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -3378,9 +3410,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (cimage && (tMips == 1)) { // Special case for trimming mips off compressed images and keeping the original compressed highest level mip - mdata = cimage->GetMetadata(); + mdata = cimage->GetMetadata(); mdata.mipLevels = 1; - hr = timage->Initialize(mdata); + hr = timage->Initialize(mdata); if (FAILED(hr)) { wprintf(L" FAILED [copy compressed to single level] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -3427,11 +3459,21 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (info.dimension == TEX_DIMENSION_TEXTURE3D) { - hr = GenerateMipMaps3D(image->GetImages(), image->GetImageCount(), image->GetMetadata(), dwFilter3D | dwFilterOpts, tMips, *timage); + hr = GenerateMipMaps3D(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), + dwFilter3D | dwFilterOpts, + tMips, + *timage); } else { - hr = GenerateMipMaps(image->GetImages(), image->GetImageCount(), image->GetMetadata(), dwFilter | dwFilterOpts, tMips, *timage); + hr = GenerateMipMaps(image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), + dwFilter | dwFilterOpts, + tMips, + *timage); } if (FAILED(hr)) { @@ -3439,7 +3481,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - auto& tinfo = timage->GetMetadata(); + auto& tinfo = timage->GetMetadata(); info.mipLevels = tinfo.mipLevels; assert(info.width == tinfo.width); @@ -3485,9 +3527,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(info.width == tinfo.width); assert(info.height == tinfo.height); @@ -3502,9 +3544,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } // --- Premultiplied alpha (if requested) -------------------------------------- - if ((dwOptions & (UINT64_C(1) << OPT_PREMUL_ALPHA)) - && HasAlpha(info.format) - && info.format != DXGI_FORMAT_A8_UNORM) + if ((dwOptions & (UINT64_C(1) << OPT_PREMUL_ALPHA)) && HasAlpha(info.format) && info.format != DXGI_FORMAT_A8_UNORM) { if (info.IsPMAlpha()) { @@ -3531,7 +3571,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) continue; } - auto& tinfo = timage->GetMetadata(); + auto& tinfo = timage->GetMetadata(); info.miscFlags2 = tinfo.miscFlags2; assert(info.width == tinfo.width); @@ -3564,7 +3604,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (dxt5nm) { - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [=](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -3573,7 +3616,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { outPixels[j] = XMVectorPermute<4, 1, 5, 0>(inPixels[j], g_XMIdentityR0); } - }, *timage); + }, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [DXT5nm] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -3582,7 +3626,10 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else { - hr = TransformImage(image->GetImages(), image->GetImageCount(), image->GetMetadata(), + hr = TransformImage( + image->GetImages(), + image->GetImageCount(), + image->GetMetadata(), [=](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t w, size_t y) { UNREFERENCED_PARAMETER(y); @@ -3591,7 +3638,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { outPixels[j] = XMVectorSwizzle<3, 1, 2, 0>(inPixels[j]); } - }, *timage); + }, + *timage); if (FAILED(hr)) { wprintf(L" FAILED [DXT5 RXGB] (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -3599,9 +3647,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } } - #ifndef NDEBUG +#ifndef NDEBUG auto& tinfo = timage->GetMetadata(); - #endif +#endif assert(info.width == tinfo.width); assert(info.height == tinfo.height); @@ -3685,17 +3733,16 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - default: - break; + default: break; } TEX_COMPRESS_FLAGS cflags = dwCompress; - #ifdef _OPENMP +#ifdef _OPENMP if (!(dwOptions & (UINT64_C(1) << OPT_FORCE_SINGLEPROC))) { cflags |= TEX_COMPRESS_PARALLEL; } - #endif +#endif if ((img->width % 4) != 0 || (img->height % 4) != 0) { @@ -3736,8 +3783,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) cimage.reset(); // --- Set alpha mode ---------------------------------------------------------- - if (HasAlpha(info.format) - && info.format != DXGI_FORMAT_A8_UNORM) + if (HasAlpha(info.format) && info.format != DXGI_FORMAT_A8_UNORM) { if (dxt5nm || dxt5rxgb) { @@ -3771,11 +3817,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) assert(img); const size_t nimg = image->GetImageCount(); - #ifdef USE_XBOX_EXTS +#ifdef USE_XBOX_EXTS const bool isXboxOut = ((FileType == CODEC_DDS) && (dwOptions & (UINT64_C(1) << OPT_USE_XBOX))) != 0; - #else +#else constexpr bool isXboxOut = false; - #endif +#endif PrintInfo(info, isXboxOut); wprintf(L"\n"); @@ -3787,7 +3833,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) dest.append(pConv->szFolder.c_str()); std::error_code ec; - auto apath = std::filesystem::absolute(dest, ec); + auto apath = std::filesystem::absolute(dest, ec); if (ec) { @@ -3800,7 +3846,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (err != ERROR_SUCCESS && err != ERROR_ALREADY_EXISTS) { wprintf(L" directory creation FAILED (%08X%ls)\n", - static_cast(HRESULT_FROM_WIN32(err)), GetErrorDesc(HRESULT_FROM_WIN32(err))); + static_cast(HRESULT_FROM_WIN32(err)), + GetErrorDesc(HRESULT_FROM_WIN32(err))); retVal = 1; continue; } @@ -3841,7 +3888,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) switch (FileType) { case CODEC_DDS: - #ifdef USE_XBOX_EXTS +#ifdef USE_XBOX_EXTS if (isXboxOut) { Xbox::XboxImage xbox; @@ -3853,7 +3900,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } } else - #endif // USE_XBOX_EXTS +#endif // USE_XBOX_EXTS { DDS_FLAGS ddsFlags = DDS_FLAGS_NONE; if (dwOptions & (UINT64_C(1) << OPT_USE_DX10)) @@ -3882,128 +3929,117 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = SaveToTGAFile(img[0], TGA_FLAGS_NONE, destName.c_str(), (dwOptions & (UINT64_C(1) << OPT_TGA20)) ? &info : nullptr); break; - case CODEC_HDR: - hr = SaveToHDRFile(img[0], destName.c_str()); - break; + case CODEC_HDR: hr = SaveToHDRFile(img[0], destName.c_str()); break; - case CODEC_PPM: - hr = SaveToPortablePixMap(img[0], destName.c_str()); - break; + case CODEC_PPM: hr = SaveToPortablePixMap(img[0], destName.c_str()); break; - case CODEC_PFM: - hr = SaveToPortablePixMapHDR(img[0], destName.c_str()); - break; + case CODEC_PFM: hr = SaveToPortablePixMapHDR(img[0], destName.c_str()); break; - #ifdef USE_OPENEXR - case CODEC_EXR: - hr = SaveToEXRFile(img[0], destName.c_str()); - break; - #endif - #ifdef USE_LIBJPEG - case CODEC_JPEG: - hr = SaveToJPEGFile(img[0], JPEG_FLAGS_NONE, destName.c_str()); - break; - #endif - #ifdef USE_LIBPNG - case CODEC_PNG: - hr = SaveToPNGFile(img[0], PNG_FLAGS_NONE, destName.c_str()); - break; - #endif +#ifdef USE_OPENEXR + case CODEC_EXR: hr = SaveToEXRFile(img[0], destName.c_str()); break; +#endif +#ifdef USE_LIBJPEG + case CODEC_JPEG: hr = SaveToJPEGFile(img[0], JPEG_FLAGS_NONE, destName.c_str()); break; +#endif +#ifdef USE_LIBPNG + case CODEC_PNG: hr = SaveToPNGFile(img[0], PNG_FLAGS_NONE, destName.c_str()); break; +#endif - default: - { - const WICCodecs codec = (FileType == CODEC_HDP || FileType == CODEC_JXR) ? WIC_CODEC_WMP : static_cast(FileType); - const size_t nimages = (dwOptions & (UINT64_C(1) << OPT_WIC_MULTIFRAME)) ? nimg : 1; - hr = SaveToWICFile(img, nimages, WIC_FLAGS_NONE, GetWICCodec(codec), destName.c_str(), nullptr, - [&](IPropertyBag2* props) + default: { + const WICCodecs codec = (FileType == CODEC_HDP || FileType == CODEC_JXR) ? WIC_CODEC_WMP : static_cast(FileType); + const size_t nimages = (dwOptions & (UINT64_C(1) << OPT_WIC_MULTIFRAME)) ? nimg : 1; + hr = SaveToWICFile(img, + nimages, + WIC_FLAGS_NONE, + GetWICCodec(codec), + destName.c_str(), + nullptr, + [&](IPropertyBag2* props) + { + const bool lossless = (dwOptions & (UINT64_C(1) << OPT_WIC_LOSSLESS)) != 0; + const bool uncompressed = (dwOptions & (UINT64_C(1) << OPT_WIC_UNCOMPRESSED)) != 0; + + switch (FileType) { - const bool lossless = (dwOptions & (UINT64_C(1) << OPT_WIC_LOSSLESS)) != 0; - const bool uncompressed = (dwOptions & (UINT64_C(1) << OPT_WIC_UNCOMPRESSED)) != 0; - - switch (FileType) + default: + case WIC_CODEC_JPEG: + if (wicQuality >= 0.f) { - default: - case WIC_CODEC_JPEG: - if (wicQuality >= 0.f) - { - PROPBAG2 options = {}; - VARIANT varValues = {}; - options.pstrName = const_cast(L"ImageQuality"); - varValues.vt = VT_R4; - varValues.fltVal = wicQuality; - std::ignore = props->Write(1, &options, &varValues); - } - break; + PROPBAG2 options = {}; + VARIANT varValues = {}; + options.pstrName = const_cast(L"ImageQuality"); + varValues.vt = VT_R4; + varValues.fltVal = wicQuality; + std::ignore = props->Write(1, &options, &varValues); + } + break; - case WIC_CODEC_TIFF: - { - PROPBAG2 options = {}; - VARIANT varValues = {}; - if (uncompressed) - { - options.pstrName = const_cast(L"TiffCompressionMethod"); - varValues.vt = VT_UI1; - varValues.bVal = WICTiffCompressionNone; - } - else if (wicQuality >= 0.f) - { - options.pstrName = const_cast(L"CompressionQuality"); - varValues.vt = VT_R4; - varValues.fltVal = wicQuality; - } - std::ignore = props->Write(1, &options, &varValues); - } - break; + case WIC_CODEC_TIFF: { + PROPBAG2 options = {}; + VARIANT varValues = {}; + if (uncompressed) + { + options.pstrName = const_cast(L"TiffCompressionMethod"); + varValues.vt = VT_UI1; + varValues.bVal = WICTiffCompressionNone; + } + else if (wicQuality >= 0.f) + { + options.pstrName = const_cast(L"CompressionQuality"); + varValues.vt = VT_R4; + varValues.fltVal = wicQuality; + } + std::ignore = props->Write(1, &options, &varValues); + } + break; - case WIC_CODEC_HEIF: - { - PROPBAG2 options = {}; - VARIANT varValues = {}; - if (uncompressed) - { - options.pstrName = const_cast(L"HeifCompressionMethod"); - varValues.vt = VT_UI1; - #if defined(NTDDI_WIN10_CU) && !defined(__MINGW32__) - varValues.bVal = WICHeifCompressionNone; - #else + case WIC_CODEC_HEIF: { + PROPBAG2 options = {}; + VARIANT varValues = {}; + if (uncompressed) + { + options.pstrName = const_cast(L"HeifCompressionMethod"); + varValues.vt = VT_UI1; +#if defined(NTDDI_WIN10_CU) && !defined(__MINGW32__) + varValues.bVal = WICHeifCompressionNone; +#else varValues.bVal = 0x1 /* WICHeifCompressionNone */; - #endif - } - else if (wicQuality >= 0.f) - { - options.pstrName = const_cast(L"ImageQuality"); - varValues.vt = VT_R4; - varValues.fltVal = wicQuality; - } - std::ignore = props->Write(1, &options, &varValues); - } - break; +#endif + } + else if (wicQuality >= 0.f) + { + options.pstrName = const_cast(L"ImageQuality"); + varValues.vt = VT_R4; + varValues.fltVal = wicQuality; + } + std::ignore = props->Write(1, &options, &varValues); + } + break; - case WIC_CODEC_WMP: - case CODEC_HDP: - case CODEC_JXR: - { - PROPBAG2 options = {}; - VARIANT varValues = {}; - if (lossless) - { - options.pstrName = const_cast(L"Lossless"); - varValues.vt = VT_BOOL; - varValues.bVal = TRUE; - } - else if (wicQuality >= 0.f) - { - options.pstrName = const_cast(L"ImageQuality"); - varValues.vt = VT_R4; - varValues.fltVal = wicQuality; - } - std::ignore = props->Write(1, &options, &varValues); - } - break; + case WIC_CODEC_WMP: + case CODEC_HDP: + case CODEC_JXR: { + PROPBAG2 options = {}; + VARIANT varValues = {}; + if (lossless) + { + options.pstrName = const_cast(L"Lossless"); + varValues.vt = VT_BOOL; + varValues.bVal = TRUE; } - }); - } - break; + else if (wicQuality >= 0.f) + { + options.pstrName = const_cast(L"ImageQuality"); + varValues.vt = VT_R4; + varValues.fltVal = wicQuality; + } + std::ignore = props->Write(1, &options, &varValues); + } + break; + } + }); + } + break; } if (FAILED(hr)) @@ -4037,7 +4073,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (dwOptions & (UINT64_C(1) << OPT_TIMING)) { LARGE_INTEGER qpcEnd = {}; - std::ignore = QueryPerformanceCounter(&qpcEnd); + std::ignore = QueryPerformanceCounter(&qpcEnd); const LONGLONG delta = qpcEnd.QuadPart - qpcStart.QuadPart; wprintf(L"\n Processing time: %f seconds\n", double(delta) / double(qpcFreq.QuadPart)); diff --git a/Texdiag/texdiag.cpp b/Texdiag/texdiag.cpp index ea6b548e..5f19b111 100644 --- a/Texdiag/texdiag.cpp +++ b/Texdiag/texdiag.cpp @@ -9,7 +9,7 @@ // https://go.microsoft.com/fwlink/?LinkId=248926 //-------------------------------------------------------------------------------------- -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(push) #pragma warning(disable : 4005) #endif @@ -20,7 +20,7 @@ #define NOMCX #define NOSERVICE #define NOHELP -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(pop) #endif @@ -50,7 +50,7 @@ #include -#ifdef _MSC_VER +#ifdef _MSC_VER #pragma warning(disable : 4619 4616 26812) #endif @@ -81,7 +81,7 @@ using namespace DirectX; namespace { - const wchar_t* g_ToolName = L"texdiag"; + const wchar_t* g_ToolName = L"texdiag"; const wchar_t* g_Description = L"Microsoft (R) DirectX Texture Diagnostic Tool [DirectXTex]"; const wchar_t* g_FeedbackURL = L"https://github.com/microsoft/DirectXTex/issues"; @@ -131,6 +131,7 @@ namespace ////////////////////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////////////////// + // clang-format off const SValue g_pCommands[] = { { L"info", CMD_INFO }, @@ -454,60 +455,60 @@ namespace #endif { nullptr, CODEC_DDS } }; + // clang-format on void PrintUsage(bool full = false) noexcept { PrintLogo(false, g_ToolName, g_Description); - static const wchar_t* const s_usage = - L"Usage: texdiag [--] \n\n"; - - static const wchar_t* const s_fullUsage = - L"COMMANDS\n" - L" info Output image metadata\n" - L" analyze Analyze and summarize image information\n" - L" compare Compare two images with MSE error metric\n" - L" diff Generate difference image from two images\n" - L" dumpbc Dump out compressed blocks (DDS BC only)\n" - L" dumpdds Dump out all the images in a complex DDS\n" - L"\nOPTIONS\n" - L" -r wildcard filename search is recursive\n" - L" -flist , --file-list \n" - L" use text file with a list of input files (one per line)\n" - L"\n" - L" -if , --image-filter image filtering\n" - L"\n" - L" (DDS input only)\n" - L" -tu, --typeless-unorm TYPELESS format is treated as UNORM\n" - L" -tf, --typeless-float TYPELESS format is treated as FLOAT\n" - L" -dword, --dword-alignment Use DWORD instead of BYTE alignment\n" - L" --bad-tails Fix for older DXTn with bad mipchain tails\n" - L" --permissive Allow some DX9 variants with unusual header values\n" - L" --ignore-mips Reads just the top-level mip which reads some invalid files\n" - L" -xlum, --expand-luminance Expand legacy L8, L16, and A8P8 formats\n" - L"\n" - L" (diff only)\n" - L" -f , --format pixel format for output\n" - L" -o output filename for diff\n" - L" -l, --to-lowercase force output filename to lower case\n" - L" -y, --overwrite overwrite existing output file (if any)\n" - L" -c , --diff-color \n" - L" highlight difference color (defaults to off)\n" - L" -t , --threshold \n" - L" highlight threshold (defaults to 0.25)\n" - L"\n" - L" (dumpbc only)\n" - L" --target-x dump pixels at location x (defaults to all)\n" - L" --target-y dump pixels at location y (defaults to all)\n" - L"\n" - L" (dumpdds only)\n" - L" -o output path for dumpdds\n" - L" -ft , --file-type \n" - " output file type\n" - L"\n" - L" -nologo suppress copyright message\n" - L"\n" - L" '-- ' is needed if any input filepath starts with the '-' or '/' character\n"; + static const wchar_t* const s_usage = L"Usage: texdiag [--] \n\n"; + + static const wchar_t* const s_fullUsage + = L"COMMANDS\n" + L" info Output image metadata\n" + L" analyze Analyze and summarize image information\n" + L" compare Compare two images with MSE error metric\n" + L" diff Generate difference image from two images\n" + L" dumpbc Dump out compressed blocks (DDS BC only)\n" + L" dumpdds Dump out all the images in a complex DDS\n" + L"\nOPTIONS\n" + L" -r wildcard filename search is recursive\n" + L" -flist , --file-list \n" + L" use text file with a list of input files (one per line)\n" + L"\n" + L" -if , --image-filter image filtering\n" + L"\n" + L" (DDS input only)\n" + L" -tu, --typeless-unorm TYPELESS format is treated as UNORM\n" + L" -tf, --typeless-float TYPELESS format is treated as FLOAT\n" + L" -dword, --dword-alignment Use DWORD instead of BYTE alignment\n" + L" --bad-tails Fix for older DXTn with bad mipchain tails\n" + L" --permissive Allow some DX9 variants with unusual header values\n" + L" --ignore-mips Reads just the top-level mip which reads some invalid files\n" + L" -xlum, --expand-luminance Expand legacy L8, L16, and A8P8 formats\n" + L"\n" + L" (diff only)\n" + L" -f , --format pixel format for output\n" + L" -o output filename for diff\n" + L" -l, --to-lowercase force output filename to lower case\n" + L" -y, --overwrite overwrite existing output file (if any)\n" + L" -c , --diff-color \n" + L" highlight difference color (defaults to off)\n" + L" -t , --threshold \n" + L" highlight threshold (defaults to 0.25)\n" + L"\n" + L" (dumpbc only)\n" + L" --target-x dump pixels at location x (defaults to all)\n" + L" --target-y dump pixels at location y (defaults to all)\n" + L"\n" + L" (dumpdds only)\n" + L" -o output path for dumpdds\n" + L" -ft , --file-type \n" + " output file type\n" + L"\n" + L" -nologo suppress copyright message\n" + L"\n" + L" '-- ' is needed if any input filepath starts with the '-' or '/' character\n"; wprintf(L"%ls", s_usage); @@ -528,11 +529,10 @@ namespace PrintList(15, g_pDumpFileTypes); } - HRESULT LoadImage( - const wchar_t *fileName, - uint32_t dwOptions, - TEX_FILTER_FLAGS dwFilter, - TexMetadata& info, + HRESULT LoadImage(const wchar_t* fileName, + uint32_t dwOptions, + TEX_FILTER_FLAGS dwFilter, + TexMetadata& info, std::unique_ptr& image) noexcept { if (!fileName) @@ -543,7 +543,7 @@ namespace return E_OUTOFMEMORY; std::filesystem::path fname(fileName); - const auto ext = fname.extension(); + const auto ext = fname.extension(); if (_wcsicmp(ext.c_str(), L".dds") == 0) { @@ -590,33 +590,39 @@ namespace { return LoadFromHDRFile(fileName, &info, *image); } - #ifdef USE_OPENEXR +#ifdef USE_OPENEXR else if (_wcsicmp(ext.c_str(), L".exr") == 0) { return LoadFromEXRFile(fileName, &info, *image); } - #endif - #ifdef USE_LIBJPEG +#endif +#ifdef USE_LIBJPEG else if (_wcsicmp(ext.c_str(), L".jpg") == 0 || _wcsicmp(ext.c_str(), L".jpeg") == 0) { return LoadFromJPEGFile(fileName, JPEG_FLAGS_NONE, &info, *image); } - #endif - #ifdef USE_LIBPNG +#endif +#ifdef USE_LIBPNG else if (_wcsicmp(ext.c_str(), L".png") == 0) { return LoadFromPNGFile(fileName, PNG_FLAGS_NONE, &info, *image); } - #endif +#endif else { // WIC shares the same filter values for mode and dither - static_assert(static_cast(WIC_FLAGS_DITHER) == static_cast(TEX_FILTER_DITHER), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_DITHER_DIFFUSION) == static_cast(TEX_FILTER_DITHER_DIFFUSION), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_POINT) == static_cast(TEX_FILTER_POINT), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_LINEAR) == static_cast(TEX_FILTER_LINEAR), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_CUBIC) == static_cast(TEX_FILTER_CUBIC), "WIC_FLAGS_* & TEX_FILTER_* should match"); - static_assert(static_cast(WIC_FLAGS_FILTER_FANT) == static_cast(TEX_FILTER_FANT), "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_DITHER) == static_cast(TEX_FILTER_DITHER), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_DITHER_DIFFUSION) == static_cast(TEX_FILTER_DITHER_DIFFUSION), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_POINT) == static_cast(TEX_FILTER_POINT), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_LINEAR) == static_cast(TEX_FILTER_LINEAR), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_CUBIC) == static_cast(TEX_FILTER_CUBIC), + "WIC_FLAGS_* & TEX_FILTER_* should match"); + static_assert(static_cast(WIC_FLAGS_FILTER_FANT) == static_cast(TEX_FILTER_FANT), + "WIC_FLAGS_* & TEX_FILTER_* should match"); HRESULT hr = LoadFromWICFile(fileName, dwFilter | WIC_FLAGS_ALL_FRAMES, &info, *image); if (hr == static_cast(0xc00d5212) /* MF_E_TOPO_CODEC_NOT_FOUND */) @@ -627,40 +633,35 @@ namespace } else if (_wcsicmp(ext.c_str(), L".webp") == 0) { - wprintf(L"\nINFO: This format requires installing the WEBP Image Extensions - https://www.microsoft.com/p/webp-image-extensions/9pg2dk419drg\n"); + wprintf( + L"\nINFO: This format requires installing the WEBP Image Extensions - " + L"https://www.microsoft.com/p/webp-image-extensions/9pg2dk419drg\n"); } } return hr; } } - HRESULT SaveImage(const Image* image, const wchar_t *fileName, uint32_t codec) noexcept + HRESULT SaveImage(const Image* image, const wchar_t* fileName, uint32_t codec) noexcept { switch (codec) { - case CODEC_DDS: - return SaveToDDSFile(*image, DDS_FLAGS_NONE, fileName); - - case CODEC_TGA: - return SaveToTGAFile(*image, TGA_FLAGS_NONE, fileName); - - case CODEC_HDR: - return SaveToHDRFile(*image, fileName); - - #ifdef USE_OPENEXR - case CODEC_EXR: - return SaveToEXRFile(*image, fileName); - #endif - #ifdef USE_LIBJPEG - case CODEC_JPEG: - return SaveToJPEGFile(*image, JPEG_FLAGS_NONE, fileName); - #endif - #ifdef USE_LIBPNG - case CODEC_PNG: - return SaveToPNGFile(*image, PNG_FLAGS_NONE, fileName); - #endif - default: - return SaveToWICFile(*image, WIC_FLAGS_NONE, GetWICCodec(static_cast(codec)), fileName); + case CODEC_DDS: return SaveToDDSFile(*image, DDS_FLAGS_NONE, fileName); + + case CODEC_TGA: return SaveToTGAFile(*image, TGA_FLAGS_NONE, fileName); + + case CODEC_HDR: return SaveToHDRFile(*image, fileName); + +#ifdef USE_OPENEXR + case CODEC_EXR: return SaveToEXRFile(*image, fileName); +#endif +#ifdef USE_LIBJPEG + case CODEC_JPEG: return SaveToJPEGFile(*image, JPEG_FLAGS_NONE, fileName); +#endif +#ifdef USE_LIBPNG + case CODEC_PNG: return SaveToPNGFile(*image, PNG_FLAGS_NONE, fileName); +#endif + default: return SaveToWICFile(*image, WIC_FLAGS_NONE, GetWICCodec(static_cast(codec)), fileName); } } @@ -672,7 +673,7 @@ namespace XMFLOAT4 imageAvg; XMFLOAT4 imageVariance; XMFLOAT4 imageStdDev; - float luminance; + float luminance; size_t specials_x; size_t specials_y; size_t specials_z; @@ -700,26 +701,27 @@ namespace memset(&result, 0, sizeof(AnalyzeData)); // First pass - XMVECTOR minv = g_XMFltMax; - XMVECTOR maxv = XMVectorNegate(g_XMFltMax); - XMVECTOR acc = g_XMZero; + XMVECTOR minv = g_XMFltMax; + XMVECTOR maxv = XMVectorNegate(g_XMFltMax); + XMVECTOR acc = g_XMZero; XMVECTOR luminance = g_XMZero; size_t totalPixels = 0; - HRESULT hr = EvaluateImage(image, [&](const XMVECTOR * pixels, size_t width, size_t y) + HRESULT hr = EvaluateImage(image, + [&](const XMVECTOR* pixels, size_t width, size_t y) { - static const XMVECTORF32 s_luminance = { { { 0.3f, 0.59f, 0.11f, 0.f } } }; + static const XMVECTORF32 s_luminance = { { { 0.3f, 0.59f, 0.11f, 0.f } } }; UNREFERENCED_PARAMETER(y); for (size_t x = 0; x < width; ++x) { const XMVECTOR v = *pixels++; - luminance = XMVectorMax(luminance, XMVector3Dot(v, s_luminance)); - minv = XMVectorMin(minv, v); - maxv = XMVectorMax(maxv, v); - acc = XMVectorAdd(v, acc); + luminance = XMVectorMax(luminance, XMVector3Dot(v, s_luminance)); + minv = XMVectorMin(minv, v); + maxv = XMVectorMax(maxv, v); + acc = XMVectorAdd(v, acc); ++totalPixels; XMFLOAT4 f; @@ -756,13 +758,14 @@ namespace XMStoreFloat4(&result.imageMax, maxv); const XMVECTOR pixelv = XMVectorReplicate(float(totalPixels)); - XMVECTOR avgv = XMVectorDivide(acc, pixelv); + XMVECTOR avgv = XMVectorDivide(acc, pixelv); XMStoreFloat4(&result.imageAvg, avgv); // Second pass acc = g_XMZero; - hr = EvaluateImage(image, [&](const XMVECTOR * pixels, size_t width, size_t y) + hr = EvaluateImage(image, + [&](const XMVECTOR* pixels, size_t width, size_t y) { UNREFERENCED_PARAMETER(y); @@ -771,7 +774,7 @@ namespace const XMVECTOR v = *pixels++; const XMVECTOR diff = XMVectorSubtract(v, avgv); - acc = XMVectorMultiplyAdd(diff, diff, acc); + acc = XMVectorMultiplyAdd(diff, diff, acc); } }); if (FAILED(hr)) @@ -850,30 +853,29 @@ namespace wprintf(L"\tReserved mode blcks - %zu\n", blockHist[8]); break; - default: - break; + default: break; } } }; -#pragma pack(push,1) +#pragma pack(push, 1) struct BC1Block { - uint16_t rgb[2]; // 565 colors - uint32_t bitmap; // 2bpp rgb bitmap + uint16_t rgb[2]; // 565 colors + uint32_t bitmap; // 2bpp rgb bitmap }; struct BC2Block { - uint32_t bitmap[2]; // 4bpp alpha bitmap - BC1Block bc1; // BC1 rgb data + uint32_t bitmap[2]; // 4bpp alpha bitmap + BC1Block bc1; // BC1 rgb data }; struct BC3Block { - uint8_t alpha[2]; // alpha values - uint8_t bitmap[6]; // 3bpp alpha bitmap - BC1Block bc1; // BC1 rgb data + uint8_t alpha[2]; // alpha values + uint8_t bitmap[6]; // 3bpp alpha bitmap + BC1Block bc1; // BC1 rgb data }; struct BC4UBlock @@ -885,8 +887,8 @@ namespace struct BC4SBlock { - int8_t red_0; - int8_t red_1; + int8_t red_0; + int8_t red_1; uint8_t indices[6]; }; @@ -913,9 +915,7 @@ namespace case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - sbpp = 8; - break; + case DXGI_FORMAT_BC4_SNORM: sbpp = 8; break; case DXGI_FORMAT_BC2_UNORM: case DXGI_FORMAT_BC2_UNORM_SRGB: @@ -926,152 +926,143 @@ namespace case DXGI_FORMAT_BC6H_UF16: case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - sbpp = 16; - break; + case DXGI_FORMAT_BC7_UNORM_SRGB: sbpp = 16; break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } - const uint8_t *pSrc = image.pixels; - const size_t rowPitch = image.rowPitch; + const uint8_t* pSrc = image.pixels; + const size_t rowPitch = image.rowPitch; for (size_t h = 0; h < image.height; h += 4) { - const uint8_t *sptr = pSrc; + const uint8_t* sptr = pSrc; for (size_t count = 0; count < rowPitch; count += sbpp) { switch (image.format) { case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: - { - auto block = reinterpret_cast(sptr); + case DXGI_FORMAT_BC1_UNORM_SRGB: { + auto block = reinterpret_cast(sptr); - if (block->rgb[0] <= block->rgb[1]) - { - // Transparent block - ++result.blockHist[1]; - } - else - { - // Opaque block - ++result.blockHist[0]; - } + if (block->rgb[0] <= block->rgb[1]) + { + // Transparent block + ++result.blockHist[1]; } - break; + else + { + // Opaque block + ++result.blockHist[0]; + } + } + break; // BC2 only has a single 'type' of block case DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT_BC3_UNORM_SRGB: - { - auto block = reinterpret_cast(sptr); + case DXGI_FORMAT_BC3_UNORM_SRGB: { + auto block = reinterpret_cast(sptr); - if (block->alpha[0] > block->alpha[1]) - { - // 8 alpha block - ++result.blockHist[0]; - } - else - { - // 6 alpha block - ++result.blockHist[1]; - } + if (block->alpha[0] > block->alpha[1]) + { + // 8 alpha block + ++result.blockHist[0]; } - break; - - case DXGI_FORMAT_BC4_UNORM: + else { - auto block = reinterpret_cast(sptr); - - if (block->red_0 > block->red_1) - { - // 8 red block - ++result.blockHist[0]; - } - else - { - // 6 red block - ++result.blockHist[1]; - } + // 6 alpha block + ++result.blockHist[1]; } - break; + } + break; - case DXGI_FORMAT_BC4_SNORM: - { - auto block = reinterpret_cast(sptr); + case DXGI_FORMAT_BC4_UNORM: { + auto block = reinterpret_cast(sptr); - if (block->red_0 > block->red_1) - { - // 8 red block - ++result.blockHist[0]; - } - else - { - // 6 red block - ++result.blockHist[1]; - } + if (block->red_0 > block->red_1) + { + // 8 red block + ++result.blockHist[0]; } - break; + else + { + // 6 red block + ++result.blockHist[1]; + } + } + break; - case DXGI_FORMAT_BC5_UNORM: + case DXGI_FORMAT_BC4_SNORM: { + auto block = reinterpret_cast(sptr); + + if (block->red_0 > block->red_1) { - auto block = reinterpret_cast(sptr); + // 8 red block + ++result.blockHist[0]; + } + else + { + // 6 red block + ++result.blockHist[1]; + } + } + break; - if (block->u.red_0 > block->u.red_1) - { - // 8 red block - ++result.blockHist[0]; - } - else - { - // 6 red block - ++result.blockHist[1]; - } + case DXGI_FORMAT_BC5_UNORM: { + auto block = reinterpret_cast(sptr); - if (block->v.red_0 > block->v.red_1) - { - // 8 green block - ++result.blockHist[2]; - } - else - { - // 6 green block - ++result.blockHist[3]; - } + if (block->u.red_0 > block->u.red_1) + { + // 8 red block + ++result.blockHist[0]; + } + else + { + // 6 red block + ++result.blockHist[1]; } - break; - case DXGI_FORMAT_BC5_SNORM: + if (block->v.red_0 > block->v.red_1) { - auto block = reinterpret_cast(sptr); + // 8 green block + ++result.blockHist[2]; + } + else + { + // 6 green block + ++result.blockHist[3]; + } + } + break; - if (block->u.red_0 > block->u.red_1) - { - // 8 red block - ++result.blockHist[0]; - } - else - { - // 6 red block - ++result.blockHist[1]; - } + case DXGI_FORMAT_BC5_SNORM: { + auto block = reinterpret_cast(sptr); - if (block->v.red_0 > block->v.red_1) - { - // 8 green block - ++result.blockHist[2]; - } - else - { - // 6 green block - ++result.blockHist[3]; - } + if (block->u.red_0 > block->u.red_1) + { + // 8 red block + ++result.blockHist[0]; } - break; + else + { + // 6 red block + ++result.blockHist[1]; + } + + if (block->v.red_0 > block->v.red_1) + { + // 8 green block + ++result.blockHist[2]; + } + else + { + // 6 green block + ++result.blockHist[3]; + } + } + break; case DXGI_FORMAT_BC6H_UF16: case DXGI_FORMAT_BC6H_SF16: @@ -1154,9 +1145,7 @@ namespace case 0x17: // Reserved mode (5 bits, 10111) case 0x1B: // Reserved mode (5 bits, 11011) case 0x1F: // Reserved mode (5 bits, 11111) - default: - ++result.blockHist[0]; - break; + default: ++result.blockHist[0]; break; } break; } @@ -1211,8 +1200,7 @@ namespace } break; - default: - break; + default: break; } sptr += sbpp; @@ -1226,20 +1214,18 @@ namespace } //-------------------------------------------------------------------------------------- - HRESULT Difference( - const Image& image1, - const Image& image2, - TEX_FILTER_FLAGS dwFilter, - DXGI_FORMAT format, - uint32_t diffColor, - float threshold, - ScratchImage& result) + HRESULT Difference(const Image& image1, + const Image& image2, + TEX_FILTER_FLAGS dwFilter, + DXGI_FORMAT format, + uint32_t diffColor, + float threshold, + ScratchImage& result) { if (!image1.pixels || !image2.pixels) return E_POINTER; - if (image1.width != image2.width - || image1.height != image2.height) + if (image1.width != image2.width || image1.height != image2.height) return E_FAIL; ScratchImage tempA; @@ -1279,18 +1265,20 @@ namespace return E_POINTER; XMVECTOR colorValue = PackedVector::XMLoadColor(reinterpret_cast(&diffColor)); - colorValue = XMVectorSelect(g_XMIdentityR3, colorValue, g_XMSelect1110); + colorValue = XMVectorSelect(g_XMIdentityR3, colorValue, g_XMSelect1110); ScratchImage diffImage; - HRESULT hr = TransformImage(*imageA, [&](XMVECTOR* outPixels, const XMVECTOR * inPixels, size_t width, size_t y) + HRESULT hr = TransformImage( + *imageA, + [&](XMVECTOR* outPixels, const XMVECTOR* inPixels, size_t width, size_t y) { const XMVECTOR tolerance = XMVectorReplicate(threshold); - auto *inPixelsB = reinterpret_cast(imageB->pixels + (y*imageB->rowPitch)); + auto* inPixelsB = reinterpret_cast(imageB->pixels + (y * imageB->rowPitch)); for (size_t x = 0; x < width; ++x) { - XMVECTOR v1 = *inPixels++; + XMVECTOR v1 = *inPixels++; const XMVECTOR v2 = *inPixelsB++; v1 = XMVectorSubtract(v1, v2); @@ -1306,7 +1294,8 @@ namespace *outPixels++ = v1; } } - }, (format == DXGI_FORMAT_R32G32B32A32_FLOAT) ? result : diffImage); + }, + (format == DXGI_FORMAT_R32G32B32A32_FLOAT) ? result : diffImage); if (FAILED(hr)) return hr; @@ -1316,78 +1305,220 @@ namespace return S_OK; } - return Convert(diffImage.GetImages(), diffImage.GetImageCount(), diffImage.GetMetadata(), format, dwFilter, TEX_THRESHOLD_DEFAULT, result); + return Convert(diffImage.GetImages(), + diffImage.GetImageCount(), + diffImage.GetMetadata(), + format, + dwFilter, + TEX_THRESHOLD_DEFAULT, + result); } #pragma region DumpBC //-------------------------------------------------------------------------------------- // Partition, Shape, Fixup - const uint8_t g_aFixUp[3][64][3] = - { - { // No fix-ups for 1st subset for BC6H or BC7 - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 }, - { 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 },{ 0, 0, 0 } - }, - - { // BC6H/BC7 Partition Set Fixups for 2 Subsets - { 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 }, - { 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 }, - { 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 }, - { 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 }, - { 0,15, 0 },{ 0, 2, 0 },{ 0, 8, 0 },{ 0, 2, 0 }, - { 0, 2, 0 },{ 0, 8, 0 },{ 0, 8, 0 },{ 0,15, 0 }, - { 0, 2, 0 },{ 0, 8, 0 },{ 0, 2, 0 },{ 0, 2, 0 }, - { 0, 8, 0 },{ 0, 8, 0 },{ 0, 2, 0 },{ 0, 2, 0 }, + const uint8_t g_aFixUp[3][64][3] = { { // No fix-ups for 1st subset for BC6H or BC7 + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 }, + { 0, 0, 0 } }, + + { // BC6H/BC7 Partition Set Fixups for 2 Subsets + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 2, 0 }, + { 0, 8, 0 }, + { 0, 2, 0 }, + { 0, 2, 0 }, + { 0, 8, 0 }, + { 0, 8, 0 }, + { 0, 15, 0 }, + { 0, 2, 0 }, + { 0, 8, 0 }, + { 0, 2, 0 }, + { 0, 2, 0 }, + { 0, 8, 0 }, + { 0, 8, 0 }, + { 0, 2, 0 }, + { 0, 2, 0 }, // BC7 Partition Set Fixups for 2 Subsets (second-half) - { 0,15, 0 },{ 0,15, 0 },{ 0, 6, 0 },{ 0, 8, 0 }, - { 0, 2, 0 },{ 0, 8, 0 },{ 0,15, 0 },{ 0,15, 0 }, - { 0, 2, 0 },{ 0, 8, 0 },{ 0, 2, 0 },{ 0, 2, 0 }, - { 0, 2, 0 },{ 0,15, 0 },{ 0,15, 0 },{ 0, 6, 0 }, - { 0, 6, 0 },{ 0, 2, 0 },{ 0, 6, 0 },{ 0, 8, 0 }, - { 0,15, 0 },{ 0,15, 0 },{ 0, 2, 0 },{ 0, 2, 0 }, - { 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 },{ 0,15, 0 }, - { 0,15, 0 },{ 0, 2, 0 },{ 0, 2, 0 },{ 0,15, 0 } - }, - - { // BC7 Partition Set Fixups for 3 Subsets - { 0, 3,15 },{ 0, 3, 8 },{ 0,15, 8 },{ 0,15, 3 }, - { 0, 8,15 },{ 0, 3,15 },{ 0,15, 3 },{ 0,15, 8 }, - { 0, 8,15 },{ 0, 8,15 },{ 0, 6,15 },{ 0, 6,15 }, - { 0, 6,15 },{ 0, 5,15 },{ 0, 3,15 },{ 0, 3, 8 }, - { 0, 3,15 },{ 0, 3, 8 },{ 0, 8,15 },{ 0,15, 3 }, - { 0, 3,15 },{ 0, 3, 8 },{ 0, 6,15 },{ 0,10, 8 }, - { 0, 5, 3 },{ 0, 8,15 },{ 0, 8, 6 },{ 0, 6,10 }, - { 0, 8,15 },{ 0, 5,15 },{ 0,15,10 },{ 0,15, 8 }, - { 0, 8,15 },{ 0,15, 3 },{ 0, 3,15 },{ 0, 5,10 }, - { 0, 6,10 },{ 0,10, 8 },{ 0, 8, 9 },{ 0,15,10 }, - { 0,15, 6 },{ 0, 3,15 },{ 0,15, 8 },{ 0, 5,15 }, - { 0,15, 3 },{ 0,15, 6 },{ 0,15, 6 },{ 0,15, 8 }, - { 0, 3,15 },{ 0,15, 3 },{ 0, 5,15 },{ 0, 5,15 }, - { 0, 5,15 },{ 0, 8,15 },{ 0, 5,15 },{ 0,10,15 }, - { 0, 5,15 },{ 0,10,15 },{ 0, 8,15 },{ 0,13,15 }, - { 0,15, 3 },{ 0,12,15 },{ 0, 3,15 },{ 0, 3, 8 } - } - }; - - inline static bool IsFixUpOffset( - _In_range_(0, 2) size_t uPartitions, - _In_range_(0, 63) uint64_t uShape, - _In_range_(0, 15) size_t uOffset) noexcept + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 6, 0 }, + { 0, 8, 0 }, + { 0, 2, 0 }, + { 0, 8, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 2, 0 }, + { 0, 8, 0 }, + { 0, 2, 0 }, + { 0, 2, 0 }, + { 0, 2, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 6, 0 }, + { 0, 6, 0 }, + { 0, 2, 0 }, + { 0, 6, 0 }, + { 0, 8, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 2, 0 }, + { 0, 2, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 15, 0 }, + { 0, 2, 0 }, + { 0, 2, 0 }, + { 0, 15, 0 } }, + + { // BC7 Partition Set Fixups for 3 Subsets + { 0, 3, 15 }, + { 0, 3, 8 }, + { 0, 15, 8 }, + { 0, 15, 3 }, + { 0, 8, 15 }, + { 0, 3, 15 }, + { 0, 15, 3 }, + { 0, 15, 8 }, + { 0, 8, 15 }, + { 0, 8, 15 }, + { 0, 6, 15 }, + { 0, 6, 15 }, + { 0, 6, 15 }, + { 0, 5, 15 }, + { 0, 3, 15 }, + { 0, 3, 8 }, + { 0, 3, 15 }, + { 0, 3, 8 }, + { 0, 8, 15 }, + { 0, 15, 3 }, + { 0, 3, 15 }, + { 0, 3, 8 }, + { 0, 6, 15 }, + { 0, 10, 8 }, + { 0, 5, 3 }, + { 0, 8, 15 }, + { 0, 8, 6 }, + { 0, 6, 10 }, + { 0, 8, 15 }, + { 0, 5, 15 }, + { 0, 15, 10 }, + { 0, 15, 8 }, + { 0, 8, 15 }, + { 0, 15, 3 }, + { 0, 3, 15 }, + { 0, 5, 10 }, + { 0, 6, 10 }, + { 0, 10, 8 }, + { 0, 8, 9 }, + { 0, 15, 10 }, + { 0, 15, 6 }, + { 0, 3, 15 }, + { 0, 15, 8 }, + { 0, 5, 15 }, + { 0, 15, 3 }, + { 0, 15, 6 }, + { 0, 15, 6 }, + { 0, 15, 8 }, + { 0, 3, 15 }, + { 0, 15, 3 }, + { 0, 5, 15 }, + { 0, 5, 15 }, + { 0, 5, 15 }, + { 0, 8, 15 }, + { 0, 5, 15 }, + { 0, 10, 15 }, + { 0, 5, 15 }, + { 0, 10, 15 }, + { 0, 8, 15 }, + { 0, 13, 15 }, + { 0, 15, 3 }, + { 0, 12, 15 }, + { 0, 3, 15 }, + { 0, 3, 8 } } }; + + inline static bool + IsFixUpOffset(_In_range_(0, 2) size_t uPartitions, _In_range_(0, 63) uint64_t uShape, _In_range_(0, 15) size_t uOffset) noexcept { for (size_t p = 0; p <= uPartitions; p++) { @@ -1400,7 +1531,7 @@ namespace } //-------------------------------------------------------------------------------------- -#define SIGN_EXTEND(x,nb) ((((x)&(1<<((nb)-1)))?((~0)^((1<<(nb))-1)):0)|(x)) +#define SIGN_EXTEND(x, nb) ((((x) & (1 << ((nb) - 1))) ? ((~0) ^ ((1 << (nb)) - 1)) : 0) | (x)) constexpr size_t NUM_PIXELS_PER_BLOCK = 16; @@ -1494,9 +1625,9 @@ namespace { switch (rot) { - case 1: return L" (R<->A)"; - case 2: return L" (G<->A)"; - case 3: return L" (B<->A)"; + case 1: return L" (R<->A)"; + case 2: return L" (G<->A)"; + case 3: return L" (B<->A)"; default: return L""; } } @@ -1509,9 +1640,7 @@ namespace case DXGI_FORMAT_BC1_UNORM: case DXGI_FORMAT_BC1_UNORM_SRGB: case DXGI_FORMAT_BC4_UNORM: - case DXGI_FORMAT_BC4_SNORM: - sbpp = 8; - break; + case DXGI_FORMAT_BC4_SNORM: sbpp = 8; break; case DXGI_FORMAT_BC2_UNORM: case DXGI_FORMAT_BC2_UNORM_SRGB: @@ -1522,16 +1651,13 @@ namespace case DXGI_FORMAT_BC6H_UF16: case DXGI_FORMAT_BC6H_SF16: case DXGI_FORMAT_BC7_UNORM: - case DXGI_FORMAT_BC7_UNORM_SRGB: - sbpp = 16; - break; + case DXGI_FORMAT_BC7_UNORM_SRGB: sbpp = 16; break; - default: - return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); + default: return HRESULT_FROM_WIN32(ERROR_NOT_SUPPORTED); } - const uint8_t *pSrc = image.pixels; - const size_t rowPitch = image.rowPitch; + const uint8_t* pSrc = image.pixels; + const size_t rowPitch = image.rowPitch; size_t nblock = 0; for (size_t h = 0; h < image.height; h += 4, pSrc += rowPitch) @@ -1542,7 +1668,7 @@ namespace continue; } - const uint8_t *sptr = pSrc; + const uint8_t* sptr = pSrc; size_t w = 0; for (size_t count = 0; count < rowPitch; count += sbpp, w += 4, ++nblock, sptr += sbpp) @@ -1557,156 +1683,156 @@ namespace switch (image.format) { case DXGI_FORMAT_BC1_UNORM: - case DXGI_FORMAT_BC1_UNORM_SRGB: - { - auto block = reinterpret_cast(sptr); + case DXGI_FORMAT_BC1_UNORM_SRGB: { + auto block = reinterpret_cast(sptr); - if (block->rgb[0] <= block->rgb[1]) - { - // Transparent block - wprintf(L"\tTransparent - E0: "); - } - else - { - // Opaque block - wprintf(L"\t Opaque - E0: "); - } - - Print565(block->rgb[0]); - wprintf(L"\n\t E1: "); - Print565(block->rgb[1]); - wprintf(L"\n\t Index: "); - PrintIndex2bpp(block->bitmap); - wprintf(L"\n"); + if (block->rgb[0] <= block->rgb[1]) + { + // Transparent block + wprintf(L"\tTransparent - E0: "); } - break; - - case DXGI_FORMAT_BC2_UNORM: - case DXGI_FORMAT_BC2_UNORM_SRGB: + else { - auto block = reinterpret_cast(sptr); - - wprintf(L"\tColor - E0: "); - Print565(block->bc1.rgb[0]); - wprintf(L"\n\t E1: "); - Print565(block->bc1.rgb[1]); - wprintf(L"\n\t Index: "); - PrintIndex2bpp(block->bc1.bitmap); - wprintf(L"\n"); + // Opaque block + wprintf(L"\t Opaque - E0: "); + } - wprintf(L"\tAlpha - "); + Print565(block->rgb[0]); + wprintf(L"\n\t E1: "); + Print565(block->rgb[1]); + wprintf(L"\n\t Index: "); + PrintIndex2bpp(block->bitmap); + wprintf(L"\n"); + } + break; - size_t j = 0; - uint32_t bitmap = block->bitmap[0]; - for (; j < (NUM_PIXELS_PER_BLOCK / 2); ++j, bitmap >>= 4) - { - wprintf(L"%X%ls", bitmap & 0xF, ((j % 4) == 3) ? L" | " : L" "); - } + case DXGI_FORMAT_BC2_UNORM: + case DXGI_FORMAT_BC2_UNORM_SRGB: { + auto block = reinterpret_cast(sptr); + + wprintf(L"\tColor - E0: "); + Print565(block->bc1.rgb[0]); + wprintf(L"\n\t E1: "); + Print565(block->bc1.rgb[1]); + wprintf(L"\n\t Index: "); + PrintIndex2bpp(block->bc1.bitmap); + wprintf(L"\n"); - bitmap = block->bitmap[1]; - for (; j < NUM_PIXELS_PER_BLOCK; ++j, bitmap >>= 4) - { - wprintf(L"%X%ls", bitmap & 0xF, ((j < (NUM_PIXELS_PER_BLOCK - 1)) && ((j % 4) == 3)) ? L" | " : L" "); - } + wprintf(L"\tAlpha - "); - wprintf(L"\n"); + size_t j = 0; + uint32_t bitmap = block->bitmap[0]; + for (; j < (NUM_PIXELS_PER_BLOCK / 2); ++j, bitmap >>= 4) + { + wprintf(L"%X%ls", bitmap & 0xF, ((j % 4) == 3) ? L" | " : L" "); } - break; - case DXGI_FORMAT_BC3_UNORM: - case DXGI_FORMAT_BC3_UNORM_SRGB: + bitmap = block->bitmap[1]; + for (; j < NUM_PIXELS_PER_BLOCK; ++j, bitmap >>= 4) { - auto block = reinterpret_cast(sptr); - - wprintf(L"\tColor - E0: "); - Print565(block->bc1.rgb[0]); - wprintf(L"\n\t E1: "); - Print565(block->bc1.rgb[1]); - wprintf(L"\n\t Index: "); - PrintIndex2bpp(block->bc1.bitmap); - wprintf(L"\n"); + wprintf(L"%X%ls", bitmap & 0xF, ((j < (NUM_PIXELS_PER_BLOCK - 1)) && ((j % 4) == 3)) ? L" | " : L" "); + } - wprintf(L"\tAlpha - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", - (float(block->alpha[0]) / 255.f), - (float(block->alpha[1]) / 255.f), (block->alpha[0] > block->alpha[1]) ? 8u : 6u); + wprintf(L"\n"); + } + break; - PrintIndex3bpp(block->bitmap); + case DXGI_FORMAT_BC3_UNORM: + case DXGI_FORMAT_BC3_UNORM_SRGB: { + auto block = reinterpret_cast(sptr); + + wprintf(L"\tColor - E0: "); + Print565(block->bc1.rgb[0]); + wprintf(L"\n\t E1: "); + Print565(block->bc1.rgb[1]); + wprintf(L"\n\t Index: "); + PrintIndex2bpp(block->bc1.bitmap); + wprintf(L"\n"); - wprintf(L"\n"); - } - break; + wprintf(L"\tAlpha - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", + (float(block->alpha[0]) / 255.f), + (float(block->alpha[1]) / 255.f), + (block->alpha[0] > block->alpha[1]) ? 8u : 6u); - case DXGI_FORMAT_BC4_UNORM: - { - auto block = reinterpret_cast(sptr); + PrintIndex3bpp(block->bitmap); - wprintf(L"\t E0: %0.3f E1: %0.3f (%u)\n\tIndex: ", - (float(block->red_0) / 255.f), - (float(block->red_1) / 255.f), (block->red_0 > block->red_1) ? 8u : 6u); + wprintf(L"\n"); + } + break; - PrintIndex3bpp(block->indices); + case DXGI_FORMAT_BC4_UNORM: { + auto block = reinterpret_cast(sptr); - wprintf(L"\n"); - } - break; + wprintf(L"\t E0: %0.3f E1: %0.3f (%u)\n\tIndex: ", + (float(block->red_0) / 255.f), + (float(block->red_1) / 255.f), + (block->red_0 > block->red_1) ? 8u : 6u); - case DXGI_FORMAT_BC4_SNORM: - { - auto block = reinterpret_cast(sptr); + PrintIndex3bpp(block->indices); - wprintf(L"\t E0: %0.3f E1: %0.3f (%u)\n\tIndex: ", - (float(block->red_0) / 127.f), - (float(block->red_1) / 127.f), (block->red_0 > block->red_1) ? 8u : 6u); + wprintf(L"\n"); + } + break; - PrintIndex3bpp(block->indices); + case DXGI_FORMAT_BC4_SNORM: { + auto block = reinterpret_cast(sptr); - wprintf(L"\n"); - } - break; + wprintf(L"\t E0: %0.3f E1: %0.3f (%u)\n\tIndex: ", + (float(block->red_0) / 127.f), + (float(block->red_1) / 127.f), + (block->red_0 > block->red_1) ? 8u : 6u); - case DXGI_FORMAT_BC5_UNORM: - { - auto block = reinterpret_cast(sptr); + PrintIndex3bpp(block->indices); - wprintf(L"\tU - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", - (float(block->u.red_0) / 255.f), - (float(block->u.red_1) / 255.f), (block->u.red_0 > block->u.red_1) ? 8u : 6u); + wprintf(L"\n"); + } + break; - PrintIndex3bpp(block->u.indices); + case DXGI_FORMAT_BC5_UNORM: { + auto block = reinterpret_cast(sptr); - wprintf(L"\n"); + wprintf(L"\tU - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", + (float(block->u.red_0) / 255.f), + (float(block->u.red_1) / 255.f), + (block->u.red_0 > block->u.red_1) ? 8u : 6u); - wprintf(L"\tV - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", - (float(block->v.red_0) / 255.f), - (float(block->v.red_1) / 255.f), (block->v.red_0 > block->v.red_1) ? 8u : 6u); + PrintIndex3bpp(block->u.indices); - PrintIndex3bpp(block->v.indices); + wprintf(L"\n"); - wprintf(L"\n"); - } - break; + wprintf(L"\tV - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", + (float(block->v.red_0) / 255.f), + (float(block->v.red_1) / 255.f), + (block->v.red_0 > block->v.red_1) ? 8u : 6u); - case DXGI_FORMAT_BC5_SNORM: - { - auto block = reinterpret_cast(sptr); + PrintIndex3bpp(block->v.indices); - wprintf(L"\tU - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", - (float(block->u.red_0) / 127.f), - (float(block->u.red_1) / 127.f), (block->u.red_0 > block->u.red_1) ? 8u : 6u); + wprintf(L"\n"); + } + break; - PrintIndex3bpp(block->u.indices); + case DXGI_FORMAT_BC5_SNORM: { + auto block = reinterpret_cast(sptr); - wprintf(L"\n"); + wprintf(L"\tU - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", + (float(block->u.red_0) / 127.f), + (float(block->u.red_1) / 127.f), + (block->u.red_0 > block->u.red_1) ? 8u : 6u); - wprintf(L"\tV - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", - (float(block->v.red_0) / 127.f), - (float(block->v.red_1) / 127.f), (block->v.red_0 > block->v.red_1) ? 8u : 6u); + PrintIndex3bpp(block->u.indices); - PrintIndex3bpp(block->v.indices); + wprintf(L"\n"); - wprintf(L"\n"); - } - break; + wprintf(L"\tV - E0: %0.3f E1: %0.3f (%u)\n\t Index: ", + (float(block->v.red_0) / 127.f), + (float(block->v.red_1) / 127.f), + (block->v.red_0 > block->v.red_1) ? 8u : 6u); + + PrintIndex3bpp(block->v.indices); + + wprintf(L"\n"); + } + break; case DXGI_FORMAT_BC6H_UF16: case DXGI_FORMAT_BC6H_SF16: @@ -1723,24 +1849,27 @@ namespace uint64_t gy4 : 1; // {GY, 4} uint64_t by4 : 1; // {BY, 4} uint64_t bz4 : 1; // {BZ, 4} - uint64_t rw : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} - uint64_t gw : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} - uint64_t bw : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} - uint64_t rx : 5; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3}, {RX, 4} - uint64_t gz4 : 1; // {GZ, 4} - uint64_t gy : 4; // {GY, 0}, {GY, 1}, {GY, 2}, {GY, 3} - uint64_t gx : 5; // {GX, 0}, {GX, 1}, {GX, 2}, {GX, 3}, {GX, 4} - uint64_t bz0 : 1; // {BZ, 0}, - uint64_t gz : 4; // {GZ, 0}, {GZ, 1}, {GZ, 2}, {GZ, 3} - uint64_t bx : 5; // {BX, 0}, {BX, 1}, {BX, 2}, {BX, 3}, {BX, 4} - uint64_t bz1 : 1; // {BZ, 1} - uint64_t by : 3; // {BY, 0}, {BY, 1}, {BY, 2} - uint64_t by3 : 1; // {BY, 3} - uint64_t ry : 5; // {RY, 0}, {RY, 1}, {RY, 2}, {RY, 3}, {RY, 4} - uint64_t bz2 : 1; // {BZ, 2} - uint64_t rz : 5; // {RZ, 0}, {RZ, 1}, {RZ, 2}, {RZ, 3}, {RZ, 4} - uint64_t bz3 : 1; // {BZ, 3} - uint64_t d : 5; // { D, 0}, { D, 1}, { D, 2}, { D, 3}, { D, 4} + uint64_t rw + : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} + uint64_t gw + : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} + uint64_t bw + : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} + uint64_t rx : 5; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3}, {RX, 4} + uint64_t gz4 : 1; // {GZ, 4} + uint64_t gy : 4; // {GY, 0}, {GY, 1}, {GY, 2}, {GY, 3} + uint64_t gx : 5; // {GX, 0}, {GX, 1}, {GX, 2}, {GX, 3}, {GX, 4} + uint64_t bz0 : 1; // {BZ, 0}, + uint64_t gz : 4; // {GZ, 0}, {GZ, 1}, {GZ, 2}, {GZ, 3} + uint64_t bx : 5; // {BX, 0}, {BX, 1}, {BX, 2}, {BX, 3}, {BX, 4} + uint64_t bz1 : 1; // {BZ, 1} + uint64_t by : 3; // {BY, 0}, {BY, 1}, {BY, 2} + uint64_t by3 : 1; // {BY, 3} + uint64_t ry : 5; // {RY, 0}, {RY, 1}, {RY, 2}, {RY, 3}, {RY, 4} + uint64_t bz2 : 1; // {BZ, 2} + uint64_t rz : 5; // {RZ, 0}, {RZ, 1}, {RZ, 2}, {RZ, 3}, {RZ, 4} + uint64_t bz3 : 1; // {BZ, 3} + uint64_t d : 5; // { D, 0}, { D, 1}, { D, 2}, { D, 3}, { D, 4} uint64_t indices : 46; }; static_assert(sizeof(bc6h_mode1) == 16, "Block size must be 16 bytes"); @@ -1751,9 +1880,7 @@ namespace XMINT3 e0_A(int(m->rw), int(m->gw), int(m->bw)); XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx)); - XMINT3 e1_A(int(m->ry), - int(m->gy | (m->gy4 << 4)), - int(m->by | (m->by3 << 3) | (m->by4 << 4))); + XMINT3 e1_A(int(m->ry), int(m->gy | (m->gy4 << 4)), int(m->by | (m->by3 << 3) | (m->by4 << 4))); XMINT3 e1_B(int(m->rz), int(m->gz | (m->gz4 << 4)), int(m->bz0 | (m->bz1 << 1) | (m->bz2 << 2) | (m->bz3 << 3) | (m->bz4 << 4))); @@ -1817,7 +1944,6 @@ namespace uint64_t rz : 6; // {RZ, 0}, {RZ, 1}, {RZ, 2}, {RZ, 3}, {RZ, 4}, {RZ, 5}, uint64_t d : 5; // { D, 0}, { D, 1}, { D, 2}, { D, 3}, { D, 4} uint64_t indices : 46; - }; static_assert(sizeof(bc6h_mode2) == 16, "Block size must be 16 bytes"); @@ -1827,9 +1953,7 @@ namespace XMINT3 e0_A(int(m->rw), int(m->gw), int(m->bw)); XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx)); - XMINT3 e1_A(int(m->ry), - int(m->gy | (m->gy4 << 4) | (m->gy5 << 5)), - int(m->by | (m->by4 << 4) | (m->by5 << 5))); + XMINT3 e1_A(int(m->ry), int(m->gy | (m->gy4 << 4) | (m->gy5 << 5)), int(m->by | (m->by4 << 4) | (m->by5 << 5))); XMINT3 e1_B(int(m->rz), int(m->gz | (m->gz45 << 4)), int(m->bz | (m->bz2 << 2) | (m->bz3 << 3) | (m->bz4 << 4) | (m->bz5 << 5))); @@ -1873,9 +1997,12 @@ namespace struct bc6h_mode3 { uint64_t mode : 5; // { M, 0}, { M, 1}, { M, 2}, { M, 3}, { M, 4} - uint64_t rw : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} - uint64_t gw : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} - uint64_t bw : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} + uint64_t rw + : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} + uint64_t gw + : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} + uint64_t bw + : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} uint64_t rx : 5; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3}, {RX, 4} uint64_t rw10 : 1; // {RW,10} uint64_t gy : 4; // {GY, 0}, {GY, 1}, {GY, 2}, {GY, 3} @@ -1894,7 +2021,6 @@ namespace uint64_t bz3 : 1; // {BZ, 3} uint64_t d : 5; // { D, 0}, { D, 1}, { D, 2}, { D, 3}, { D, 4} uint64_t indices : 46; - }; static_assert(sizeof(bc6h_mode3) == 16, "Block size must be 16 bytes"); @@ -1902,15 +2028,10 @@ namespace auto m = reinterpret_cast(sptr); - XMINT3 e0_A(int(m->rw | (m->rw10 << 10)), - int(m->gw | (m->gw10 << 10)), - int(m->bw | (m->bw10 << 10))); + XMINT3 e0_A(int(m->rw | (m->rw10 << 10)), int(m->gw | (m->gw10 << 10)), int(m->bw | (m->bw10 << 10))); XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx)); - XMINT3 e1_A(int(m->ry), int(m->gy), - int(m->by | (m->by3 << 3))); - XMINT3 e1_B(int(m->rz), - int(m->gz), - int(m->bz0 | (m->bz1 << 1) | (m->bz2 << 2) | (m->bz3 << 3))); + XMINT3 e1_A(int(m->ry), int(m->gy), int(m->by | (m->by3 << 3))); + XMINT3 e1_B(int(m->rz), int(m->gz), int(m->bz0 | (m->bz1 << 1) | (m->bz2 << 2) | (m->bz3 << 3))); if (bSigned) { @@ -1948,9 +2069,12 @@ namespace struct bc6h_mode4 { uint64_t mode : 5; // { M, 0}, { M, 1}, { M, 2}, { M, 3}, { M, 4} - uint64_t rw : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} - uint64_t gw : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} - uint64_t bw : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} + uint64_t rw + : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} + uint64_t gw + : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} + uint64_t bw + : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} uint64_t rx : 4; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3} uint64_t rw10 : 1; // {RW,10} uint64_t gz4 : 1; // {GZ, 4} @@ -1971,7 +2095,6 @@ namespace uint64_t bz3 : 1; // {BZ, 3} uint64_t d : 5; // { D, 0}, { D, 1}, { D, 2}, { D, 3}, { D, 4} uint64_t indices : 46; - }; static_assert(sizeof(bc6h_mode4) == 16, "Block size must be 16 bytes"); @@ -1979,13 +2102,9 @@ namespace auto m = reinterpret_cast(sptr); - XMINT3 e0_A(int(m->rw | (m->rw10 << 10)), - int(m->gw | (m->gw10 << 10)), - int(m->bw | (m->bw10 << 10))); + XMINT3 e0_A(int(m->rw | (m->rw10 << 10)), int(m->gw | (m->gw10 << 10)), int(m->bw | (m->bw10 << 10))); XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx)); - XMINT3 e1_A(int(m->ry), - int(m->gy | (m->gy4 << 4)), - int(m->by | (m->by3 << 3))); + XMINT3 e1_A(int(m->ry), int(m->gy | (m->gy4 << 4)), int(m->by | (m->by3 << 3))); XMINT3 e1_B(int(m->rz), int(m->gz | (m->gz4 << 4)), int(m->bz0 | (m->bz1 << 1) | (m->bz2 << 2) | (m->bz3 << 3))); @@ -2026,9 +2145,12 @@ namespace struct bc6h_mode5 { uint64_t mode : 5; // { M, 0}, { M, 1}, { M, 2}, { M, 3}, { M, 4} - uint64_t rw : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} - uint64_t gw : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} - uint64_t bw : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} + uint64_t rw + : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} + uint64_t gw + : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} + uint64_t bw + : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} uint64_t rx : 4; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3} uint64_t rw10 : 1; // {RW,10} uint64_t by4 : 1; // {BY, 4} @@ -2054,14 +2176,10 @@ namespace auto m = reinterpret_cast(sptr); - XMINT3 e0_A(int(m->rw | (m->rw10 << 10)), - int(m->gw | (m->gw10 << 10)), - int(m->bw | (m->bw10 << 10))); + XMINT3 e0_A(int(m->rw | (m->rw10 << 10)), int(m->gw | (m->gw10 << 10)), int(m->bw | (m->bw10 << 10))); XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx)); - XMINT3 e1_A(int(m->ry), int(m->gy), - int(m->by | (m->by3 << 3) | (m->by4 << 4))); - XMINT3 e1_B(int(m->rz), int(m->gz), - int(m->bz0 | (m->bz12 << 1) | (m->bz3 << 3))); + XMINT3 e1_A(int(m->ry), int(m->gy), int(m->by | (m->by3 << 3) | (m->by4 << 4))); + XMINT3 e1_B(int(m->rz), int(m->gz), int(m->bz0 | (m->bz12 << 1) | (m->bz3 << 3))); if (bSigned) { @@ -2130,9 +2248,7 @@ namespace XMINT3 e0_A(int(m->rw), int(m->gw), int(m->bw)); XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx)); - XMINT3 e1_A(int(m->ry), - int(m->gy | (m->gy4 << 4)), - int(m->by | (m->by3 << 3) | (m->by4 << 4))); + XMINT3 e1_A(int(m->ry), int(m->gy | (m->gy4 << 4)), int(m->by | (m->by3 << 3) | (m->by4 << 4))); XMINT3 e1_B(int(m->rz), int(m->gz | (m->gz4 << 4)), int(m->bz0 | (m->bz1 << 1) | (m->bz2 << 2) | (m->bz3 << 3) | (m->bz4 << 4))); @@ -2204,9 +2320,7 @@ namespace XMINT3 e0_A(int(m->rw), int(m->gw), int(m->bw)); XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx)); - XMINT3 e1_A(int(m->ry), - int(m->gy | (m->gy4 << 4)), - int(m->by | (m->by3 << 3) | (m->by4 << 4))); + XMINT3 e1_A(int(m->ry), int(m->gy | (m->gy4 << 4)), int(m->by | (m->by3 << 3) | (m->by4 << 4))); XMINT3 e1_B(int(m->rz), int(m->gz | (m->gz4 << 4)), int(m->bz0 | (m->bz1 << 1) | (m->bz2 << 2) | (m->bz3 << 3) | (m->bz4 << 4))); @@ -2401,7 +2515,7 @@ namespace uint64_t mode : 5; // { M, 0}, { M, 1}, { M, 2}, { M, 3}, { M, 4} uint64_t rw : 6; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5} uint64_t gz4 : 1; // {GZ, 4} - uint64_t bz : 2; // {BZ, 0}, {BZ, 1} + uint64_t bz : 2; // {BZ, 0}, {BZ, 1} uint64_t by4 : 1; // {BY, 4} uint64_t gw : 6; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5} uint64_t gy5 : 1; // {GY, 5} @@ -2475,13 +2589,18 @@ namespace struct bc6h_mode11 { uint64_t mode : 5; // { M, 0}, { M, 1}, { M, 2}, { M, 3}, { M, 4} - uint64_t rw : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} - uint64_t gw : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} - uint64_t bw : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} - uint64_t rx : 10; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3}, {RX, 4}, {RX, 5}, {RX, 6}, {RX, 7}, {RX, 8}, {RX, 9} - uint64_t gx : 10; // {GX, 0}, {GX, 1}, {GX, 2}, {GX, 3}, {GX, 4}, {GX, 5}, {GX, 6}, {GX, 7}, {GX, 8}, {GX, 9} - uint64_t bx : 9; // {BX, 0}, {BX, 1}, {BX, 2}, {BX, 3}, {BX, 4}, {BX, 5}, {BX, 6}, {BX, 7}, {BX, 8} - uint64_t bx9 : 1; // {BX, 9} + uint64_t rw + : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} + uint64_t gw + : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} + uint64_t bw + : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} + uint64_t rx + : 10; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3}, {RX, 4}, {RX, 5}, {RX, 6}, {RX, 7}, {RX, 8}, {RX, 9} + uint64_t gx + : 10; // {GX, 0}, {GX, 1}, {GX, 2}, {GX, 3}, {GX, 4}, {GX, 5}, {GX, 6}, {GX, 7}, {GX, 8}, {GX, 9} + uint64_t bx : 9; // {BX, 0}, {BX, 1}, {BX, 2}, {BX, 3}, {BX, 4}, {BX, 5}, {BX, 6}, {BX, 7}, {BX, 8} + uint64_t bx9 : 1; // {BX, 9} uint64_t indices : 63; }; static_assert(sizeof(bc6h_mode11) == 16, "Block size must be 16 bytes"); @@ -2491,8 +2610,7 @@ namespace auto m = reinterpret_cast(sptr); XMINT3 e0_A(int(m->rw), int(m->gw), int(m->bw)); - XMINT3 e0_B(int(m->rx), int(m->gx), - int(m->bx | (m->bx9 << 9))); + XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx | (m->bx9 << 9))); if (bSigned) { @@ -2520,9 +2638,12 @@ namespace struct bc6h_mode12 { uint64_t mode : 5; // { M, 0}, { M, 1}, { M, 2}, { M, 3}, { M, 4} - uint64_t rw : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} - uint64_t gw : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} - uint64_t bw : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} + uint64_t rw + : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} + uint64_t gw + : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} + uint64_t bw + : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} uint64_t rx : 9; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3}, {RX, 4}, {RX, 5}, {RX, 6}, {RX, 7}, {RX, 8} uint64_t rw10 : 1; // {RW,10} uint64_t gx : 9; // {GX, 0}, {GX, 1}, {GX, 2}, {GX, 3}, {GX, 4}, {GX, 5}, {GX, 6}, {GX, 7}, {GX, 8} @@ -2537,9 +2658,7 @@ namespace auto m = reinterpret_cast(sptr); - XMINT3 e0_A(int(m->rw | (m->rw10 << 10)), - int(m->gw | (m->gw10 << 10)), - int(m->bw | (m->bw10 << 10))); + XMINT3 e0_A(int(m->rw | (m->rw10 << 10)), int(m->gw | (m->gw10 << 10)), int(m->bw | (m->bw10 << 10))); XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx)); if (bSigned) @@ -2568,9 +2687,12 @@ namespace struct bc6h_mode13 { uint64_t mode : 5; // { M, 0}, { M, 1}, { M, 2}, { M, 3}, { M, 4} - uint64_t rw : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} - uint64_t gw : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} - uint64_t bw : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} + uint64_t rw + : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} + uint64_t gw + : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} + uint64_t bw + : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} uint64_t rx : 8; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3}, {RX, 4}, {RX, 5}, {RX, 6}, {RX, 7} uint64_t rw11 : 1; // {RW,11} uint64_t rw10 : 1; // {RW,10} @@ -2619,9 +2741,12 @@ namespace struct bc6h_mode14 { uint64_t mode : 5; // { M, 0}, { M, 1}, { M, 2}, { M, 3}, { M, 4} - uint64_t rw : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} - uint64_t gw : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} - uint64_t bw : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} + uint64_t rw + : 10; // {RW, 0}, {RW, 1}, {RW, 2}, {RW, 3}, {RW, 4}, {RW, 5}, {RW, 6}, {RW, 7}, {RW, 8}, {RW, 9} + uint64_t gw + : 10; // {GW, 0}, {GW, 1}, {GW, 2}, {GW, 3}, {GW, 4}, {GW, 5}, {GW, 6}, {GW, 7}, {GW, 8}, {GW, 9} + uint64_t bw + : 10; // {BW, 0}, {BW, 1}, {BW, 2}, {BW, 3}, {BW, 4}, {BW, 5}, {BW, 6}, {BW, 7}, {BW, 8}, {BW, 9} uint64_t rx : 4; // {RX, 0}, {RX, 1}, {RX, 2}, {RX, 3} uint64_t rw15 : 1; // {RW,15} uint64_t rw14 : 1; // {RW,14} @@ -2651,9 +2776,12 @@ namespace auto m = reinterpret_cast(sptr); - XMINT3 e0_A(int(m->rw | (m->rw10 << 10) | (m->rw11 << 11) | (m->rw12 << 12) | (m->rw13 << 13) | (m->rw14 << 14) | (m->rw15 << 15)), - int(m->gw | (m->gw10 << 10) | (m->gw11 << 11) | (m->gw12 << 12) | (m->gw13 << 13) | (m->gw14 << 14) | (m->gw15 << 15)), - int(m->bw | (m->bw10 << 10) | (m->bw11 << 11) | (m->bw12 << 12) | (m->bw13 << 13) | (m->bw14 << 14) | (m->bw15 << 15))); + XMINT3 e0_A(int(m->rw | (m->rw10 << 10) | (m->rw11 << 11) | (m->rw12 << 12) | (m->rw13 << 13) + | (m->rw14 << 14) | (m->rw15 << 15)), + int(m->gw | (m->gw10 << 10) | (m->gw11 << 11) | (m->gw12 << 12) | (m->gw13 << 13) | (m->gw14 << 14) + | (m->gw15 << 15)), + int(m->bw | (m->bw10 << 10) | (m->bw11 << 11) | (m->bw12 << 12) | (m->bw13 << 13) | (m->bw14 << 14) + | (m->bw15 << 15))); XMINT3 e0_B(int(m->rx), int(m->gx), int(m->bx)); if (bSigned) @@ -2692,8 +2820,7 @@ namespace wprintf(L"\tERROR - Reserved mode 11111\n"); break; - default: - break; + default: break; } break; } @@ -2742,12 +2869,30 @@ namespace auto m = reinterpret_cast(sptr); wprintf(L"\tMode 0 - [4 4 4] partition %llu\n", m->part); - wprintf(L"\t E0:(%0.3f, %0.3f, %0.3f)\n", float((m->r0 << 1) | m->P0) / 31.f, float((m->g0 << 1) | m->P0) / 31.f, float((m->b0 << 1) | m->P0) / 31.f); - wprintf(L"\t E1:(%0.3f, %0.3f, %0.3f)\n", float((m->r1 << 1) | m->P1) / 31.f, float((m->g1 << 1) | m->P1) / 31.f, float((m->b1 << 1) | m->P1) / 31.f); - wprintf(L"\t E2:(%0.3f, %0.3f, %0.3f)\n", float((m->r2 << 1) | m->P2) / 31.f, float((m->g2 << 1) | m->P2) / 31.f, float(((m->b2 | (m->b2n << 3)) << 1) | m->P2) / 31.f); - wprintf(L"\t E3:(%0.3f, %0.3f, %0.3f)\n", float((m->r3 << 1) | m->P3) / 31.f, float((m->g3 << 1) | m->P3) / 31.f, float((m->b3 << 1) | m->P3) / 31.f); - wprintf(L"\t E4:(%0.3f, %0.3f, %0.3f)\n", float((m->r4 << 1) | m->P4) / 31.f, float((m->g4 << 1) | m->P4) / 31.f, float((m->b4 << 1) | m->P4) / 31.f); - wprintf(L"\t E5:(%0.3f, %0.3f, %0.3f)\n", float((m->r5 << 1) | m->P5) / 31.f, float((m->g5 << 1) | m->P5) / 31.f, float((m->b5 << 1) | m->P5) / 31.f); + wprintf(L"\t E0:(%0.3f, %0.3f, %0.3f)\n", + float((m->r0 << 1) | m->P0) / 31.f, + float((m->g0 << 1) | m->P0) / 31.f, + float((m->b0 << 1) | m->P0) / 31.f); + wprintf(L"\t E1:(%0.3f, %0.3f, %0.3f)\n", + float((m->r1 << 1) | m->P1) / 31.f, + float((m->g1 << 1) | m->P1) / 31.f, + float((m->b1 << 1) | m->P1) / 31.f); + wprintf(L"\t E2:(%0.3f, %0.3f, %0.3f)\n", + float((m->r2 << 1) | m->P2) / 31.f, + float((m->g2 << 1) | m->P2) / 31.f, + float(((m->b2 | (m->b2n << 3)) << 1) | m->P2) / 31.f); + wprintf(L"\t E3:(%0.3f, %0.3f, %0.3f)\n", + float((m->r3 << 1) | m->P3) / 31.f, + float((m->g3 << 1) | m->P3) / 31.f, + float((m->b3 << 1) | m->P3) / 31.f); + wprintf(L"\t E4:(%0.3f, %0.3f, %0.3f)\n", + float((m->r4 << 1) | m->P4) / 31.f, + float((m->g4 << 1) | m->P4) / 31.f, + float((m->b4 << 1) | m->P4) / 31.f); + wprintf(L"\t E5:(%0.3f, %0.3f, %0.3f)\n", + float((m->r5 << 1) | m->P5) / 31.f, + float((m->g5 << 1) | m->P5) / 31.f, + float((m->b5 << 1) | m->P5) / 31.f); wprintf(L"\t Index: "); PrintIndex2bpp(m->index, 2, m->part); wprintf(L"\n"); @@ -2781,10 +2926,22 @@ namespace auto m = reinterpret_cast(sptr); wprintf(L"\tMode 1 - [6 6 6] partition %llu\n", m->part); - wprintf(L"\t E0:(%0.3f, %0.3f, %0.3f)\n", float((m->r0 << 1) | m->P0) / 127.f, float((m->g0 << 1) | m->P0) / 127.f, float((m->b0 << 1) | m->P0) / 127.f); - wprintf(L"\t E1:(%0.3f, %0.3f, %0.3f)\n", float((m->r1 << 1) | m->P0) / 127.f, float((m->g1 << 1) | m->P0) / 127.f, float(((m->b1 | (m->b1n << 2)) << 1) | m->P0) / 127.f); - wprintf(L"\t E2:(%0.3f, %0.3f, %0.3f)\n", float((m->r2 << 1) | m->P1) / 127.f, float((m->g2 << 1) | m->P1) / 127.f, float((m->b2 << 1) | m->P1) / 127.f); - wprintf(L"\t E3:(%0.3f, %0.3f, %0.3f)\n", float((m->r3 << 1) | m->P1) / 127.f, float((m->g3 << 1) | m->P1) / 127.f, float((m->b3 << 1) | m->P1) / 127.f); + wprintf(L"\t E0:(%0.3f, %0.3f, %0.3f)\n", + float((m->r0 << 1) | m->P0) / 127.f, + float((m->g0 << 1) | m->P0) / 127.f, + float((m->b0 << 1) | m->P0) / 127.f); + wprintf(L"\t E1:(%0.3f, %0.3f, %0.3f)\n", + float((m->r1 << 1) | m->P0) / 127.f, + float((m->g1 << 1) | m->P0) / 127.f, + float(((m->b1 | (m->b1n << 2)) << 1) | m->P0) / 127.f); + wprintf(L"\t E2:(%0.3f, %0.3f, %0.3f)\n", + float((m->r2 << 1) | m->P1) / 127.f, + float((m->g2 << 1) | m->P1) / 127.f, + float((m->b2 << 1) | m->P1) / 127.f); + wprintf(L"\t E3:(%0.3f, %0.3f, %0.3f)\n", + float((m->r3 << 1) | m->P1) / 127.f, + float((m->g3 << 1) | m->P1) / 127.f, + float((m->b3 << 1) | m->P1) / 127.f); wprintf(L"\t Index: "); PrintIndex3bpp(m->index, 1, m->part); wprintf(L"\n"); @@ -2862,10 +3019,22 @@ namespace auto m = reinterpret_cast(sptr); wprintf(L"\tMode 3 - [7 7 7] partition %llu\n", m->part); - wprintf(L"\t E0:(%0.3f, %0.3f, %0.3f)\n", float((m->r0 << 1) | m->P0) / 255.f, float((m->g0 << 1) | m->P0) / 255.f, float((m->b0 << 1) | m->P0) / 255.f); - wprintf(L"\t E1:(%0.3f, %0.3f, %0.3f)\n", float((m->r1 << 1) | m->P1) / 255.f, float((m->g1 << 1) | m->P1) / 255.f, float((m->b1 << 1) | m->P1) / 255.f); - wprintf(L"\t E2:(%0.3f, %0.3f, %0.3f)\n", float((m->r2 << 1) | m->P2) / 255.f, float((m->g2 << 1) | m->P2) / 255.f, float((m->b2 << 1) | m->P2) / 255.f); - wprintf(L"\t E3:(%0.3f, %0.3f, %0.3f)\n", float((m->r3 << 1) | m->P3) / 255.f, float(((m->g3 | (m->g3n << 5)) << 1) | m->P3) / 255.f, float((m->b3 << 1) | m->P3) / 255.f); + wprintf(L"\t E0:(%0.3f, %0.3f, %0.3f)\n", + float((m->r0 << 1) | m->P0) / 255.f, + float((m->g0 << 1) | m->P0) / 255.f, + float((m->b0 << 1) | m->P0) / 255.f); + wprintf(L"\t E1:(%0.3f, %0.3f, %0.3f)\n", + float((m->r1 << 1) | m->P1) / 255.f, + float((m->g1 << 1) | m->P1) / 255.f, + float((m->b1 << 1) | m->P1) / 255.f); + wprintf(L"\t E2:(%0.3f, %0.3f, %0.3f)\n", + float((m->r2 << 1) | m->P2) / 255.f, + float((m->g2 << 1) | m->P2) / 255.f, + float((m->b2 << 1) | m->P2) / 255.f); + wprintf(L"\t E3:(%0.3f, %0.3f, %0.3f)\n", + float((m->r3 << 1) | m->P3) / 255.f, + float(((m->g3 | (m->g3n << 5)) << 1) | m->P3) / 255.f, + float((m->b3 << 1) | m->P3) / 255.f); wprintf(L"\t Index: "); PrintIndex2bpp(m->index, 1, m->part); wprintf(L"\n"); @@ -2894,7 +3063,10 @@ namespace auto m = reinterpret_cast(sptr); - wprintf(L"\tMode 4 - [5 5 5 A6] indx mode %ls, rot-bits %llu%ls\n", m->idx ? L"3-bit" : L"2-bit", m->rot, GetRotBits(m->rot)); + wprintf(L"\tMode 4 - [5 5 5 A6] indx mode %ls, rot-bits %llu%ls\n", + m->idx ? L"3-bit" : L"2-bit", + m->rot, + GetRotBits(m->rot)); wprintf(L"\t C0:(%0.3f, %0.3f, %0.3f)\n", float(m->r0) / 31.f, float(m->g0) / 31.f, float(m->b0) / 31.f); wprintf(L"\t C1:(%0.3f, %0.3f, %0.3f)\n", float(m->r1) / 31.f, float(m->g1) / 31.f, float(m->b1) / 31.f); wprintf(L"\t A0:(%0.3f)\n", float(m->a0) / 63.f); @@ -2963,15 +3135,20 @@ namespace uint64_t P0 : 1; uint64_t P1 : 1; uint64_t index : 63; - }; static_assert(sizeof(bc7_mode6) == 16, "Block size must be 16 bytes"); auto m = reinterpret_cast(sptr); wprintf(L"\tMode 6 - [7 7 7 A7]\n"); - wprintf(L"\t C0:(%0.3f, %0.3f, %0.3f)\n", float((m->r0 << 1) | m->P0) / 255.f, float((m->g0 << 1) | m->P0) / 255.f, float((m->b0 << 1) | m->P0) / 255.f); - wprintf(L"\t C1:(%0.3f, %0.3f, %0.3f)\n", float((m->r1 << 1) | m->P1) / 255.f, float((m->g1 << 1) | m->P1) / 255.f, float((m->b1 << 1) | m->P1) / 255.f); + wprintf(L"\t C0:(%0.3f, %0.3f, %0.3f)\n", + float((m->r0 << 1) | m->P0) / 255.f, + float((m->g0 << 1) | m->P0) / 255.f, + float((m->b0 << 1) | m->P0) / 255.f); + wprintf(L"\t C1:(%0.3f, %0.3f, %0.3f)\n", + float((m->r1 << 1) | m->P1) / 255.f, + float((m->g1 << 1) | m->P1) / 255.f, + float((m->b1 << 1) | m->P1) / 255.f); wprintf(L"\t A0:(%0.3f)\n", float((m->a0 << 1) | m->P0) / 255.f); wprintf(L"\t A1:(%0.3f)\n", float((m->a1 << 1) | m->P1) / 255.f); wprintf(L"\t Index: "); @@ -3006,17 +3183,28 @@ namespace uint64_t P2 : 1; uint64_t P3 : 1; uint64_t index : 30; - }; static_assert(sizeof(bc7_mode7) == 16, "Block size must be 16 bytes"); auto m = reinterpret_cast(sptr); wprintf(L"\tMode 7 - [5 5 5 A5] partition %llu\n", m->part); - wprintf(L"\t C0:(%0.3f, %0.3f, %0.3f)\n", float((m->r0 << 1) | m->P0) / 63.f, float((m->g0 << 1) | m->P0) / 63.f, float((m->b0 << 1) | m->P0) / 63.f); - wprintf(L"\t C1:(%0.3f, %0.3f, %0.3f)\n", float((m->r1 << 1) | m->P1) / 63.f, float((m->g1 << 1) | m->P1) / 63.f, float((m->b1 << 1) | m->P1) / 63.f); - wprintf(L"\t C2:(%0.3f, %0.3f, %0.3f)\n", float((m->r2 << 1) | m->P2) / 63.f, float((m->g2 << 1) | m->P2) / 63.f, float((m->b2 << 1) | m->P2) / 63.f); - wprintf(L"\t C3:(%0.3f, %0.3f, %0.3f)\n", float((m->r3 << 1) | m->P3) / 63.f, float((m->g3 << 1) | m->P3) / 63.f, float((m->b3 << 1) | m->P3) / 63.f); + wprintf(L"\t C0:(%0.3f, %0.3f, %0.3f)\n", + float((m->r0 << 1) | m->P0) / 63.f, + float((m->g0 << 1) | m->P0) / 63.f, + float((m->b0 << 1) | m->P0) / 63.f); + wprintf(L"\t C1:(%0.3f, %0.3f, %0.3f)\n", + float((m->r1 << 1) | m->P1) / 63.f, + float((m->g1 << 1) | m->P1) / 63.f, + float((m->b1 << 1) | m->P1) / 63.f); + wprintf(L"\t C2:(%0.3f, %0.3f, %0.3f)\n", + float((m->r2 << 1) | m->P2) / 63.f, + float((m->g2 << 1) | m->P2) / 63.f, + float((m->b2 << 1) | m->P2) / 63.f); + wprintf(L"\t C3:(%0.3f, %0.3f, %0.3f)\n", + float((m->r3 << 1) | m->P3) / 63.f, + float((m->g3 << 1) | m->P3) / 63.f, + float((m->b3 << 1) | m->P3) / 63.f); wprintf(L"\t A0:(%0.3f)\n", float((m->a0 << 1) | m->P0) / 63.f); wprintf(L"\t A1:(%0.3f)\n", float((m->a1 << 1) | m->P1) / 63.f); wprintf(L"\t A2:(%0.3f)\n", float((m->a2 << 1) | m->P2) / 63.f); @@ -3038,8 +3226,7 @@ namespace return S_OK; } #pragma endregion -} - +} // namespace //-------------------------------------------------------------------------------------- // Entry-point @@ -3051,14 +3238,14 @@ namespace int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { // Parameters and defaults - TEX_FILTER_FLAGS dwFilter = TEX_FILTER_DEFAULT; - int pixelx = -1; - int pixely = -1; - uint32_t diffColor = 0; - float threshold = 0.25f; - DXGI_FORMAT diffFormat = DXGI_FORMAT_B8G8R8A8_UNORM; - uint32_t fileType = WIC_CODEC_BMP; - std::wstring outputFile; + TEX_FILTER_FLAGS dwFilter = TEX_FILTER_DEFAULT; + int pixelx = -1; + int pixely = -1; + uint32_t diffColor = 0; + float threshold = 0.25f; + DXGI_FORMAT diffFormat = DXGI_FORMAT_B8G8R8A8_UNORM; + uint32_t fileType = WIC_CODEC_BMP; + std::wstring outputFile; // Set locale for output since GetErrorDesc can get localized strings. std::locale::global(std::locale("")); @@ -3106,16 +3293,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) case CMD_COMPARE: case CMD_DIFF: case CMD_DUMPBC: - case CMD_DUMPDDS: - break; + case CMD_DUMPDDS: break; - case CMD_HELP: - PrintUsage(true); - return 0; + case CMD_HELP: PrintUsage(true); return 0; - case CMD_FEEDBACK: - std::ignore = ShellExecuteW(nullptr, L"open", g_FeedbackURL, nullptr, nullptr, SW_SHOW); - return 0; + case CMD_FEEDBACK: std::ignore = ShellExecuteW(nullptr, L"open", g_FeedbackURL, nullptr, nullptr, SW_SHOW); return 0; default: wprintf(L"Must use one of: "); @@ -3123,9 +3305,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - uint32_t dwOptions = 0; + uint32_t dwOptions = 0; std::list conversion; - bool allowOpts = true; + bool allowOpts = true; for (int iArg = 2; iArg < argc; ++iArg) { @@ -3134,13 +3316,14 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (allowOpts && (('-' == pArg[0]) || ('/' == pArg[0]))) { uint32_t dwOption = 0; - PWSTR pValue = nullptr; + PWSTR pValue = nullptr; if (('-' == pArg[0]) && ('-' == pArg[1])) { if (pArg[2] == 0) { - // "-- " is the POSIX standard for "end of options" marking to escape the '-' and '/' characters at the start of filepaths. + // "-- " is the POSIX standard for "end of options" marking to escape the '-' and '/' characters at the start of + // filepaths. allowOpts = false; continue; } @@ -3148,7 +3331,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { pArg += 2; - for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue); + for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue) + ; if (*pValue) *pValue++ = 0; @@ -3160,7 +3344,8 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) { pArg++; - for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue); + for (pValue = pArg; *pValue && (':' != *pValue) && ('=' != *pValue); ++pValue) + ; if (*pValue) *pValue++ = 0; @@ -3179,9 +3364,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) switch (dwOption) { - case 0: - wprintf(L"ERROR: Unknown option: `%ls`\n\nUse %ls --help\n", pArg, g_ToolName); - return 1; + case 0: wprintf(L"ERROR: Unknown option: `%ls`\n\nUse %ls --help\n", pArg, g_ToolName); return 1; case OPT_FORMAT: case OPT_FILTER: @@ -3195,13 +3378,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) // These don't use flag bits break; - case OPT_VERSION: - PrintLogo(true, g_ToolName, g_Description); - return 0; + case OPT_VERSION: PrintLogo(true, g_ToolName, g_Description); return 0; - case OPT_HELP: - PrintUsage(); - return 0; + case OPT_HELP: PrintUsage(); return 0; default: if (dwOptions & (UINT32_C(1) << dwOption)) @@ -3239,8 +3418,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - default: - break; + default: break; } switch (dwOption) @@ -3358,29 +3536,27 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - case OPT_FILELIST: + case OPT_FILELIST: { + std::filesystem::path path(pValue); + std::wifstream inFile(path.make_preferred().c_str()); + if (!inFile) { - std::filesystem::path path(pValue); - std::wifstream inFile(path.make_preferred().c_str()); - if (!inFile) - { - wprintf(L"Error opening -flist file %ls\n", pValue); - return 1; - } + wprintf(L"Error opening -flist file %ls\n", pValue); + return 1; + } - inFile.imbue(std::locale::classic()); + inFile.imbue(std::locale::classic()); - ProcessFileList(inFile, conversion); - } - break; + ProcessFileList(inFile, conversion); + } + break; - default: - break; + default: break; } } else if (wcspbrk(pArg, L"?*") != nullptr) { - const size_t count = conversion.size(); + const size_t count = conversion.size(); std::filesystem::path path(pArg); SearchForFiles(path.make_preferred(), conversion, (dwOptions & (UINT32_C(1) << OPT_RECURSIVE)) != 0, nullptr); if (conversion.size() <= count) @@ -3391,7 +3567,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } else { - SConversion conv = {}; + SConversion conv = {}; std::filesystem::path path(pArg); conv.szSrc = path.make_preferred().native(); conversion.push_back(conv); @@ -3424,7 +3600,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"1: %ls", pImage1->szSrc.c_str()); fflush(stdout); - TexMetadata info1; + TexMetadata info1; std::unique_ptr image1; hr = LoadImage(pImage1->szSrc.c_str(), dwOptions, dwFilter, info1, image1); if (FAILED(hr)) @@ -3439,7 +3615,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"\n2: %ls", pImage2->szSrc.c_str()); fflush(stdout); - TexMetadata info2; + TexMetadata info2; std::unique_ptr image2; hr = LoadImage(pImage2->szSrc.c_str(), dwOptions, dwFilter, info2, image2); if (FAILED(hr)) @@ -3451,8 +3627,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"\n"); fflush(stdout); - if (info1.height != info2.height - || info1.width != info2.width) + if (info1.height != info2.height || info1.width != info2.width) { wprintf(L"ERROR: Can only compare/diff images of the same width & height\n"); return 1; @@ -3463,7 +3638,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) if (outputFile.empty()) { std::filesystem::path curpath(pImage1->szSrc); - const auto ext = curpath.extension(); + const auto ext = curpath.extension(); if (_wcsicmp(ext.c_str(), L".bmp") == 0) { @@ -3478,7 +3653,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"WARNING: ignoring all images but first one in each file\n"); ScratchImage diffImage; - hr = Difference(*image1->GetImage(0, 0, 0), *image2->GetImage(0, 0, 0), dwFilter, diffFormat, diffColor, threshold, diffImage); + hr = Difference(*image1->GetImage(0, 0, 0), + *image2->GetImage(0, 0, 0), + dwFilter, + diffFormat, + diffColor, + threshold, + diffImage); if (FAILED(hr)) { wprintf(L"Failed diffing images (%08X%ls)\n", static_cast(hr), GetErrorDesc(hr)); @@ -3508,13 +3689,9 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"Difference %ls\n", outputFile.c_str()); } - else if ((info1.depth == 1 - && info1.arraySize == 1 - && info1.mipLevels == 1) - || info1.depth != info2.depth - || info1.arraySize != info2.arraySize - || info1.mipLevels != info2.mipLevels - || image1->GetImageCount() != image2->GetImageCount()) + else if ((info1.depth == 1 && info1.arraySize == 1 && info1.mipLevels == 1) || info1.depth != info2.depth + || info1.arraySize != info2.arraySize || info1.mipLevels != info2.mipLevels + || image1->GetImageCount() != image2->GetImageCount()) { // Compare single image if (image1->GetImageCount() > 1 || image2->GetImageCount() > 1) @@ -3528,19 +3705,24 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - wprintf(L"Result: %f (%f %f %f %f) PSNR %f dB\n", mse, mseV[0], mseV[1], mseV[2], mseV[3], + wprintf(L"Result: %f (%f %f %f %f) PSNR %f dB\n", + mse, + mseV[0], + mseV[1], + mseV[2], + mseV[3], 10.0 * log10(3.0 / (double(mseV[0]) + double(mseV[1]) + double(mseV[2])))); } else { // Compare all images - float min_mse = FLT_MAX; + float min_mse = FLT_MAX; float min_mseV[4] = { FLT_MAX, FLT_MAX, FLT_MAX, FLT_MAX }; - float max_mse = -FLT_MAX; + float max_mse = -FLT_MAX; float max_mseV[4] = { -FLT_MAX, -FLT_MAX, -FLT_MAX, -FLT_MAX }; - double sum_mse = 0; + double sum_mse = 0; double sum_mseV[4] = { 0, 0, 0, 0 }; size_t total_images = 0; @@ -3557,10 +3739,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) const Image* img1 = image1->GetImage(mip, 0, slice); const Image* img2 = image2->GetImage(mip, 0, slice); - if (!img1 - || !img2 - || img1->height != img2->height - || img1->width != img2->width) + if (!img1 || !img2 || img1->height != img2->height || img1->width != img2->width) { wprintf(L"ERROR: Unexpected mismatch at slice %3zu, mip %3zu\n", slice, mip); return 1; @@ -3571,7 +3750,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = ComputeMSE(*img1, *img2, mse, mseV); if (FAILED(hr)) { - wprintf(L"Failed comparing images at slice %3zu, mip %3zu (%08X%ls)\n", slice, mip, static_cast(hr), GetErrorDesc(hr)); + wprintf(L"Failed comparing images at slice %3zu, mip %3zu (%08X%ls)\n", + slice, + mip, + static_cast(hr), + GetErrorDesc(hr)); return 1; } @@ -3588,7 +3771,14 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) ++total_images; - wprintf(L"[%3zu,%3zu]: %f (%f %f %f %f) PSNR %f dB\n", mip, slice, mse, mseV[0], mseV[1], mseV[2], mseV[3], + wprintf(L"[%3zu,%3zu]: %f (%f %f %f %f) PSNR %f dB\n", + mip, + slice, + mse, + mseV[0], + mseV[1], + mseV[2], + mseV[3], 10.0 * log10(3.0 / (double(mseV[0]) + double(mseV[1]) + double(mseV[2])))); } } @@ -3608,10 +3798,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) const Image* img1 = image1->GetImage(mip, item, 0); const Image* img2 = image2->GetImage(mip, item, 0); - if (!img1 - || !img2 - || img1->height != img2->height - || img1->width != img2->width) + if (!img1 || !img2 || img1->height != img2->height || img1->width != img2->width) { wprintf(L"ERROR: Unexpected mismatch at item %3zu, mip %3zu\n", item, mip); return 1; @@ -3622,7 +3809,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = ComputeMSE(*img1, *img2, mse, mseV); if (FAILED(hr)) { - wprintf(L"Failed comparing images at item %3zu, mip %3zu (%08X%ls)\n", item, mip, static_cast(hr), GetErrorDesc(hr)); + wprintf(L"Failed comparing images at item %3zu, mip %3zu (%08X%ls)\n", + item, + mip, + static_cast(hr), + GetErrorDesc(hr)); return 1; } @@ -3639,7 +3830,14 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) ++total_images; - wprintf(L"[%3zu,%3zu]: %f (%f %f %f %f) PSNR %f dB\n", item, mip, mse, mseV[0], mseV[1], mseV[2], mseV[3], + wprintf(L"[%3zu,%3zu]: %f (%f %f %f %f) PSNR %f dB\n", + item, + mip, + mse, + mseV[0], + mseV[1], + mseV[2], + mseV[3], 10.0 * log10(3.0 / (double(mseV[0]) + double(mseV[1]) + double(mseV[2])))); } } @@ -3649,18 +3847,29 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) // Output multi-image stats if (total_images > 1) { - wprintf(L"\n Minimum MSE: %f (%f %f %f %f) PSNR %f dB\n", min_mse, min_mseV[0], min_mseV[1], min_mseV[2], min_mseV[3], + wprintf(L"\n Minimum MSE: %f (%f %f %f %f) PSNR %f dB\n", + min_mse, + min_mseV[0], + min_mseV[1], + min_mseV[2], + min_mseV[3], 10.0 * log10(3.0 / (double(min_mseV[0]) + double(min_mseV[1]) + double(min_mseV[2])))); const double total_mseV0 = sum_mseV[0] / double(total_images); const double total_mseV1 = sum_mseV[1] / double(total_images); const double total_mseV2 = sum_mseV[2] / double(total_images); - wprintf(L" Average MSE: %f (%f %f %f %f) PSNR %f dB\n", sum_mse / double(total_images), + wprintf(L" Average MSE: %f (%f %f %f %f) PSNR %f dB\n", + sum_mse / double(total_images), total_mseV0, total_mseV1, total_mseV2, sum_mseV[3] / double(total_images), 10.0 * log10(3.0 / (total_mseV0 + total_mseV1 + total_mseV2))); - wprintf(L" Maximum MSE: %f (%f %f %f %f) PSNR %f dB\n", max_mse, max_mseV[0], max_mseV[1], max_mseV[2], max_mseV[3], + wprintf(L" Maximum MSE: %f (%f %f %f %f) PSNR %f dB\n", + max_mse, + max_mseV[0], + max_mseV[1], + max_mseV[2], + max_mseV[3], 10.0 * log10(3.0 / (double(max_mseV[0]) + double(max_mseV[1]) + double(max_mseV[2])))); } } @@ -3679,7 +3888,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"%ls", curpath.c_str()); fflush(stdout); - TexMetadata info; + TexMetadata info; std::unique_ptr image; hr = LoadImage(curpath.c_str(), dwOptions, dwFilter, info, image); if (FAILED(hr)) @@ -3704,9 +3913,7 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) wprintf(L"\n dimension = "); switch (info.dimension) { - case TEX_DIMENSION_TEXTURE1D: - wprintf(L"%ls", (info.arraySize > 1) ? L"1DArray\n" : L"1D\n"); - break; + case TEX_DIMENSION_TEXTURE1D: wprintf(L"%ls", (info.arraySize > 1) ? L"1DArray\n" : L"1D\n"); break; case TEX_DIMENSION_TEXTURE2D: if (info.IsCubemap()) @@ -3719,29 +3926,17 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) } break; - case TEX_DIMENSION_TEXTURE3D: - wprintf(L" 3D"); - break; + case TEX_DIMENSION_TEXTURE3D: wprintf(L" 3D"); break; } wprintf(L" alpha mode = "); switch (info.GetAlphaMode()) { - case TEX_ALPHA_MODE_OPAQUE: - wprintf(L"Opaque"); - break; - case TEX_ALPHA_MODE_PREMULTIPLIED: - wprintf(L"Premultiplied"); - break; - case TEX_ALPHA_MODE_STRAIGHT: - wprintf(L"Straight"); - break; - case TEX_ALPHA_MODE_CUSTOM: - wprintf(L"Custom"); - break; - case TEX_ALPHA_MODE_UNKNOWN: - wprintf(L"Unknown"); - break; + case TEX_ALPHA_MODE_OPAQUE: wprintf(L"Opaque"); break; + case TEX_ALPHA_MODE_PREMULTIPLIED: wprintf(L"Premultiplied"); break; + case TEX_ALPHA_MODE_STRAIGHT: wprintf(L"Straight"); break; + case TEX_ALPHA_MODE_CUSTOM: wprintf(L"Custom"); break; + case TEX_ALPHA_MODE_UNKNOWN: wprintf(L"Unknown"); break; } wprintf(L"\n images = %zu\n", image->GetImageCount()); @@ -3862,10 +4057,13 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) return 1; } - if (pixelx >= int(info.width) - || pixely >= int(info.height)) + if (pixelx >= int(info.width) || pixely >= int(info.height)) { - wprintf(L"WARNING: Specified pixel location (%d x %d) is out of range for image (%zu x %zu)\n", pixelx, pixely, info.width, info.height); + wprintf(L"WARNING: Specified pixel location (%d x %d) is out of range for image (%zu x %zu)\n", + pixelx, + pixely, + info.width, + info.height); continue; } @@ -3896,7 +4094,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = DumpBCImage(*img, pixelx, pixely); if (FAILED(hr)) { - wprintf(L"ERROR: Failed dumping image at slice %3zu, mip %3zu (%08X%ls)\n", slice, mip, static_cast(hr), GetErrorDesc(hr)); + wprintf(L"ERROR: Failed dumping image at slice %3zu, mip %3zu (%08X%ls)\n", + slice, + mip, + static_cast(hr), + GetErrorDesc(hr)); return 1; } } @@ -3939,7 +4141,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = DumpBCImage(*img, tpixelx, tpixely); if (FAILED(hr)) { - wprintf(L"ERROR: Failed dumping image at item %3zu, mip %3zu (%08X%ls)\n", item, mip, static_cast(hr), GetErrorDesc(hr)); + wprintf(L"ERROR: Failed dumping image at item %3zu, mip %3zu (%08X%ls)\n", + item, + mip, + static_cast(hr), + GetErrorDesc(hr)); return 1; } } @@ -4013,7 +4219,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = Analyze(*img, data); if (FAILED(hr)) { - wprintf(L"ERROR: Failed analyzing image at slice %3zu, mip %3zu (%08X%ls)\n", slice, mip, static_cast(hr), GetErrorDesc(hr)); + wprintf(L"ERROR: Failed analyzing image at slice %3zu, mip %3zu (%08X%ls)\n", + slice, + mip, + static_cast(hr), + GetErrorDesc(hr)); return 1; } @@ -4027,7 +4237,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = AnalyzeBC(*img, data); if (FAILED(hr)) { - wprintf(L"ERROR: Failed analyzing BC image at slice %3zu, mip %3zu (%08X%ls)\n", slice, mip, static_cast(hr), GetErrorDesc(hr)); + wprintf(L"ERROR: Failed analyzing BC image at slice %3zu, mip %3zu (%08X%ls)\n", + slice, + mip, + static_cast(hr), + GetErrorDesc(hr)); return 1; } @@ -4061,7 +4275,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = Analyze(*img, data); if (FAILED(hr)) { - wprintf(L"ERROR: Failed analyzing image at item %3zu, mip %3zu (%08X%ls)\n", item, mip, static_cast(hr), GetErrorDesc(hr)); + wprintf(L"ERROR: Failed analyzing image at item %3zu, mip %3zu (%08X%ls)\n", + item, + mip, + static_cast(hr), + GetErrorDesc(hr)); return 1; } @@ -4078,7 +4296,11 @@ int __cdecl wmain(_In_ int argc, _In_z_count_(argc) wchar_t* argv[]) hr = AnalyzeBC(*img, data); if (FAILED(hr)) { - wprintf(L"ERROR: Failed analyzing BC image at item %3zu, mip %3zu (%08X%ls)\n", item, mip, static_cast(hr), GetErrorDesc(hr)); + wprintf(L"ERROR: Failed analyzing BC image at item %3zu, mip %3zu (%08X%ls)\n", + item, + mip, + static_cast(hr), + GetErrorDesc(hr)); return 1; } diff --git a/WICTextureLoader/WICTextureLoader11.cpp b/WICTextureLoader/WICTextureLoader11.cpp index 04fa1cec..b035316d 100644 --- a/WICTextureLoader/WICTextureLoader11.cpp +++ b/WICTextureLoader/WICTextureLoader11.cpp @@ -64,34 +64,34 @@ using Microsoft::WRL::ComPtr; namespace { //-------------------------------------------------------------------------------------- -#if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#if !defined(NO_D3D11_DEBUG_NAME) && (defined(_DEBUG) || defined(PROFILE)) template - inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_ const char(&name)[TNameLength]) noexcept + inline void SetDebugObjectName(_In_ ID3D11DeviceChild* resource, _In_ const char (&name)[TNameLength]) noexcept { resource->SetPrivateData(WKPDID_D3DDebugObjectName, TNameLength - 1, name); } #else template - inline void SetDebugObjectName(_In_ ID3D11DeviceChild*, _In_ const char(&)[TNameLength]) noexcept + inline void SetDebugObjectName(_In_ ID3D11DeviceChild*, _In_ const char (&)[TNameLength]) noexcept {} #endif -//------------------------------------------------------------------------------------- -// WIC Pixel Format Translation Data -//------------------------------------------------------------------------------------- + //------------------------------------------------------------------------------------- + // WIC Pixel Format Translation Data + //------------------------------------------------------------------------------------- struct WICTranslate { - const GUID& wic; - DXGI_FORMAT format; + const GUID& wic; + DXGI_FORMAT format; - constexpr WICTranslate(const GUID& wg, DXGI_FORMAT fmt) noexcept : - wic(wg), - format(fmt) + constexpr WICTranslate(const GUID& wg, DXGI_FORMAT fmt) noexcept + : wic(wg), + format(fmt) {} }; - constexpr WICTranslate g_WICFormats[] = - { + constexpr WICTranslate g_WICFormats[] = { + // clang-format off { GUID_WICPixelFormat128bppRGBAFloat, DXGI_FORMAT_R32G32B32A32_FLOAT }, { GUID_WICPixelFormat64bppRGBAHalf, DXGI_FORMAT_R16G16B16A16_FLOAT }, @@ -113,6 +113,7 @@ namespace { GUID_WICPixelFormat8bppGray, DXGI_FORMAT_R8_UNORM }, { GUID_WICPixelFormat8bppAlpha, DXGI_FORMAT_A8_UNORM }, + // clang-format on }; //------------------------------------------------------------------------------------- @@ -123,14 +124,14 @@ namespace const GUID& source; const GUID& target; - constexpr WICConvert(const GUID& src, const GUID& tgt) noexcept : - source(src), - target(tgt) + constexpr WICConvert(const GUID& src, const GUID& tgt) noexcept + : source(src), + target(tgt) {} }; - constexpr WICConvert g_WICConvert[] = - { + constexpr WICConvert g_WICConvert[] = { + // clang-format off // Note target GUID in this conversion table must be one of those directly supported formats (above). { GUID_WICPixelFormatBlackWhite, GUID_WICPixelFormat8bppGray }, // DXGI_FORMAT_R8_UNORM @@ -185,19 +186,14 @@ namespace { GUID_WICPixelFormat64bppPRGBAHalf, GUID_WICPixelFormat64bppRGBAHalf }, // DXGI_FORMAT_R16G16B16A16_FLOAT // We don't support n-channel formats + // clang-format on }; bool g_WIC2 = false; - BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID *ifactory) noexcept + BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID* ifactory) noexcept { - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - ifactory - ); + HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory2, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory2), ifactory); if (SUCCEEDED(hr)) { @@ -207,13 +203,7 @@ namespace } else { - hr = CoCreateInstance( - CLSID_WICImagingFactory1, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory), - ifactory - ); + hr = CoCreateInstance(CLSID_WICImagingFactory1, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory), ifactory); return SUCCEEDED(hr) ? TRUE : FALSE; } } @@ -223,11 +213,7 @@ namespace static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; IWICImagingFactory* factory = nullptr; - if (!InitOnceExecuteOnce( - &s_initOnce, - InitializeWICFactory, - nullptr, - reinterpret_cast(&factory))) + if (!InitOnceExecuteOnce(&s_initOnce, InitializeWICFactory, nullptr, reinterpret_cast(&factory))) { return nullptr; } @@ -282,39 +268,29 @@ namespace return bpp; } - //-------------------------------------------------------------------------------------- DXGI_FORMAT MakeSRGB(_In_ DXGI_FORMAT format) noexcept { switch (format) { - case DXGI_FORMAT_R8G8B8A8_UNORM: - return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + case DXGI_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - case DXGI_FORMAT_BC1_UNORM: - return DXGI_FORMAT_BC1_UNORM_SRGB; + case DXGI_FORMAT_BC1_UNORM: return DXGI_FORMAT_BC1_UNORM_SRGB; - case DXGI_FORMAT_BC2_UNORM: - return DXGI_FORMAT_BC2_UNORM_SRGB; + case DXGI_FORMAT_BC2_UNORM: return DXGI_FORMAT_BC2_UNORM_SRGB; - case DXGI_FORMAT_BC3_UNORM: - return DXGI_FORMAT_BC3_UNORM_SRGB; + case DXGI_FORMAT_BC3_UNORM: return DXGI_FORMAT_BC3_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8A8_UNORM: - return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8X8_UNORM: - return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8X8_UNORM: return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; - case DXGI_FORMAT_BC7_UNORM: - return DXGI_FORMAT_BC7_UNORM_SRGB; + case DXGI_FORMAT_BC7_UNORM: return DXGI_FORMAT_BC7_UNORM_SRGB; - default: - return format; + default: return format; } } - //--------------------------------------------------------------------------------- void FitPowerOf2(UINT origx, UINT origy, UINT& targetx, UINT& targety, size_t maxsize) { @@ -323,7 +299,11 @@ namespace if (origx > origy) { size_t x; - for (x = maxsize; x > 1; x >>= 1) { if (x <= targetx) break; } + for (x = maxsize; x > 1; x >>= 1) + { + if (x <= targetx) + break; + } targetx = UINT(x); float bestScore = FLT_MAX; @@ -333,14 +313,18 @@ namespace if (score < bestScore) { bestScore = score; - targety = UINT(y); + targety = UINT(y); } } } else { size_t y; - for (y = maxsize; y > 1; y >>= 1) { if (y <= targety) break; } + for (y = maxsize; y > 1; y >>= 1) + { + if (y <= targety) + break; + } targety = UINT(y); float bestScore = FLT_MAX; @@ -350,27 +334,26 @@ namespace if (score < bestScore) { bestScore = score; - targetx = UINT(x); + targetx = UINT(x); } } } } - //--------------------------------------------------------------------------------- HRESULT CreateTextureFromWIC(_In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_ IWICBitmapFrameDecode* frame, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ WIC_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_ IWICBitmapFrameDecode* frame, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ WIC_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept { - UINT width, height; + UINT width, height; HRESULT hr = frame->GetSize(&width, &height); if (FAILED(hr)) return hr; @@ -389,28 +372,20 @@ namespace switch (d3dDevice->GetFeatureLevel()) { case D3D_FEATURE_LEVEL_9_1: - case D3D_FEATURE_LEVEL_9_2: - maxsize = 2048u /*D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; - break; + case D3D_FEATURE_LEVEL_9_2: maxsize = 2048u /*D3D_FL9_1_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; break; - case D3D_FEATURE_LEVEL_9_3: - maxsize = 4096u /*D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; - break; + case D3D_FEATURE_LEVEL_9_3: maxsize = 4096u /*D3D_FL9_3_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; break; case D3D_FEATURE_LEVEL_10_0: - case D3D_FEATURE_LEVEL_10_1: - maxsize = 8192u /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; - break; + case D3D_FEATURE_LEVEL_10_1: maxsize = 8192u /*D3D10_REQ_TEXTURE2D_U_OR_V_DIMENSION*/; break; - default: - maxsize = size_t(D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION); - break; + default: maxsize = size_t(D3D11_REQ_TEXTURE2D_U_OR_V_DIMENSION); break; } } assert(maxsize > 0); - UINT twidth = width; + UINT twidth = width; UINT theight = height; if (loadFlags & WIC_LOADER_FIT_POW2) { @@ -421,20 +396,20 @@ namespace const float ar = static_cast(height) / static_cast(width); if (width > height) { - twidth = static_cast(maxsize); + twidth = static_cast(maxsize); theight = std::max(1, static_cast(static_cast(maxsize) * ar)); } else { theight = static_cast(maxsize); - twidth = std::max(1, static_cast(static_cast(maxsize) / ar)); + twidth = std::max(1, static_cast(static_cast(maxsize) / ar)); } assert(twidth <= maxsize && theight <= maxsize); } if (loadFlags & WIC_LOADER_MAKE_SQUARE) { - twidth = std::max(twidth, theight); + twidth = std::max(twidth, theight); theight = twidth; } @@ -458,13 +433,13 @@ namespace { memcpy_s(&convertGUID, sizeof(WICPixelFormatGUID), &GUID_WICPixelFormat96bppRGBFloat, sizeof(GUID)); format = DXGI_FORMAT_R32G32B32_FLOAT; - bpp = 96; + bpp = 96; } else { memcpy_s(&convertGUID, sizeof(WICPixelFormatGUID), &GUID_WICPixelFormat128bppRGBAFloat, sizeof(GUID)); format = DXGI_FORMAT_R32G32B32A32_FLOAT; - bpp = 128; + bpp = 128; } } else @@ -495,13 +470,13 @@ namespace { // Special case test for optional device support for autogen mipchains for R32G32B32_FLOAT UINT fmtSupport = 0; - hr = d3dDevice->CheckFormatSupport(DXGI_FORMAT_R32G32B32_FLOAT, &fmtSupport); + hr = d3dDevice->CheckFormatSupport(DXGI_FORMAT_R32G32B32_FLOAT, &fmtSupport); if (FAILED(hr) || !(fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN)) { // Use R32G32B32A32_FLOAT instead which is required for Feature Level 10.0 and up memcpy_s(&convertGUID, sizeof(WICPixelFormatGUID), &GUID_WICPixelFormat128bppRGBAFloat, sizeof(GUID)); format = DXGI_FORMAT_R32G32B32A32_FLOAT; - bpp = 128; + bpp = 128; } } @@ -509,7 +484,7 @@ namespace { memcpy_s(&convertGUID, sizeof(WICPixelFormatGUID), &GUID_WICPixelFormat32bppRGBA, sizeof(GUID)); format = DXGI_FORMAT_R8G8B8A8_UNORM; - bpp = 32; + bpp = 32; } if (!bpp) @@ -569,13 +544,13 @@ namespace // Verify our target format is supported by the current device // (handles WDDM 1.0 or WDDM 1.1 device driver cases as well as DirectX 11.0 Runtime without 16bpp format support) UINT support = 0; - hr = d3dDevice->CheckFormatSupport(format, &support); + hr = d3dDevice->CheckFormatSupport(format, &support); if (FAILED(hr) || !(support & D3D11_FORMAT_SUPPORT_TEXTURE2D)) { // Fallback to RGBA 32-bit format which is supported by all devices memcpy_s(&convertGUID, sizeof(WICPixelFormatGUID), &GUID_WICPixelFormat32bppRGBA, sizeof(GUID)); format = DXGI_FORMAT_R8G8B8A8_UNORM; - bpp = 32; + bpp = 32; } // Allocate temporary memory for image @@ -585,7 +560,7 @@ namespace if (rowBytes > UINT32_MAX || numBytes > UINT32_MAX) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - const auto rowPitch = static_cast(rowBytes); + const auto rowPitch = static_cast(rowBytes); const auto imageSize = static_cast(numBytes); std::unique_ptr temp(new (std::nothrow) uint8_t[imageSize]); @@ -593,9 +568,7 @@ namespace return E_OUTOFMEMORY; // Load image data - if (memcmp(&convertGUID, &pixelFormat, sizeof(GUID)) == 0 - && twidth == width - && theight == height) + if (memcmp(&convertGUID, &pixelFormat, sizeof(GUID)) == 0 && twidth == width && theight == height) { // No format conversion or resize needed hr = frame->CopyPixels(nullptr, static_cast(rowPitch), static_cast(imageSize), temp.get()); @@ -638,13 +611,18 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pfScaler, convertGUID, &canConvert); + hr = FC->CanConvert(pfScaler, convertGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; } - hr = FC->Initialize(scaler.Get(), convertGUID, WICBitmapDitherTypeErrorDiffusion, nullptr, 0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(scaler.Get(), + convertGUID, + WICBitmapDitherTypeErrorDiffusion, + nullptr, + 0, + WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; @@ -666,7 +644,7 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pixelFormat, convertGUID, &canConvert); + hr = FC->CanConvert(pixelFormat, convertGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; @@ -686,7 +664,7 @@ namespace if (d3dContext && textureView) // Must have context and shader-view to auto generate mipmaps { UINT fmtSupport = 0; - hr = d3dDevice->CheckFormatSupport(format, &fmtSupport); + hr = d3dDevice->CheckFormatSupport(format, &fmtSupport); if (SUCCEEDED(hr) && (fmtSupport & D3D11_FORMAT_SUPPORT_MIP_AUTOGEN)) { autogen = true; @@ -695,15 +673,15 @@ namespace // Create texture D3D11_TEXTURE2D_DESC desc = {}; - desc.Width = twidth; - desc.Height = theight; - desc.MipLevels = (autogen) ? 0u : 1u; - desc.ArraySize = 1; - desc.Format = format; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Usage = usage; - desc.CPUAccessFlags = cpuAccessFlags; + desc.Width = twidth; + desc.Height = theight; + desc.MipLevels = (autogen) ? 0u : 1u; + desc.ArraySize = 1; + desc.Format = format; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Usage = usage; + desc.CPUAccessFlags = cpuAccessFlags; if (autogen) { @@ -717,20 +695,20 @@ namespace } D3D11_SUBRESOURCE_DATA initData; - initData.pSysMem = temp.get(); - initData.SysMemPitch = static_cast(rowPitch); + initData.pSysMem = temp.get(); + initData.SysMemPitch = static_cast(rowPitch); initData.SysMemSlicePitch = static_cast(imageSize); ID3D11Texture2D* tex = nullptr; - hr = d3dDevice->CreateTexture2D(&desc, (autogen) ? nullptr : &initData, &tex); + hr = d3dDevice->CreateTexture2D(&desc, (autogen) ? nullptr : &initData, &tex); if (SUCCEEDED(hr) && tex) { if (textureView) { D3D11_SHADER_RESOURCE_VIEW_DESC SRVDesc = {}; - SRVDesc.Format = desc.Format; + SRVDesc.Format = desc.Format; - SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; + SRVDesc.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D; SRVDesc.Texture2D.MipLevels = (autogen) ? unsigned(-1) : 1u; hr = d3dDevice->CreateShaderResourceView(tex, &SRVDesc, textureView); @@ -762,125 +740,119 @@ namespace return hr; } - //-------------------------------------------------------------------------------------- - void SetDebugTextureInfo( - _In_z_ const wchar_t* fileName, - _In_opt_ ID3D11Resource** texture, - _In_opt_ ID3D11ShaderResourceView** textureView) noexcept + void SetDebugTextureInfo(_In_z_ const wchar_t* fileName, + _In_opt_ ID3D11Resource** texture, + _In_opt_ ID3D11ShaderResourceView** textureView) noexcept { - #if !defined(NO_D3D11_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#if !defined(NO_D3D11_DEBUG_NAME) && (defined(_DEBUG) || defined(PROFILE)) if (texture || textureView) { - CHAR strFileA[MAX_PATH]; - const int result = WideCharToMultiByte(CP_UTF8, - WC_NO_BEST_FIT_CHARS, - fileName, - -1, - strFileA, - MAX_PATH, - nullptr, - nullptr - ); + CHAR strFileA[MAX_PATH]; + const int result = WideCharToMultiByte(CP_UTF8, WC_NO_BEST_FIT_CHARS, fileName, -1, strFileA, MAX_PATH, nullptr, nullptr); if (result > 0) { if (texture && *texture) { - (*texture)->SetPrivateData(WKPDID_D3DDebugObjectName, - static_cast(result), - strFileA - ); + (*texture)->SetPrivateData(WKPDID_D3DDebugObjectName, static_cast(result), strFileA); } if (textureView && *textureView) { - (*textureView)->SetPrivateData(WKPDID_D3DDebugObjectName, - static_cast(result), - strFileA - ); + (*textureView)->SetPrivateData(WKPDID_D3DDebugObjectName, static_cast(result), strFileA); } } } - #else +#else UNREFERENCED_PARAMETER(fileName); UNREFERENCED_PARAMETER(texture); UNREFERENCED_PARAMETER(textureView); - #endif +#endif } } // anonymous namespace //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromMemory( - ID3D11Device* d3dDevice, - const uint8_t* wicData, - size_t wicDataSize, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - size_t maxsize) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromMemory(ID3D11Device* d3dDevice, + const uint8_t* wicData, + size_t wicDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize) noexcept { - return CreateWICTextureFromMemoryEx(d3dDevice, nullptr, - wicData, wicDataSize, + return CreateWICTextureFromMemoryEx(d3dDevice, + nullptr, + wicData, + wicDataSize, maxsize, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, WIC_LOADER_DEFAULT, - texture, textureView); + texture, + textureView); } -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromMemory( - ID3D11Device* d3dDevice, - ID3D11DeviceContext* d3dContext, - const uint8_t* wicData, - size_t wicDataSize, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - size_t maxsize) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromMemory(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const uint8_t* wicData, + size_t wicDataSize, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize) noexcept { - return CreateWICTextureFromMemoryEx(d3dDevice, d3dContext, - wicData, wicDataSize, + return CreateWICTextureFromMemoryEx(d3dDevice, + d3dContext, + wicData, + wicDataSize, maxsize, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, WIC_LOADER_DEFAULT, - texture, textureView); + texture, + textureView); } -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromMemoryEx( - ID3D11Device* d3dDevice, - const uint8_t* wicData, - size_t wicDataSize, - size_t maxsize, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - WIC_LOADER_FLAGS loadFlags, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromMemoryEx(ID3D11Device* d3dDevice, + const uint8_t* wicData, + size_t wicDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + WIC_LOADER_FLAGS loadFlags, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView) noexcept { - return CreateWICTextureFromMemoryEx(d3dDevice, nullptr, - wicData, wicDataSize, + return CreateWICTextureFromMemoryEx(d3dDevice, + nullptr, + wicData, + wicDataSize, maxsize, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, - texture, textureView); + texture, + textureView); } -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromMemoryEx( - ID3D11Device* d3dDevice, - ID3D11DeviceContext* d3dContext, - const uint8_t* wicData, - size_t wicDataSize, - size_t maxsize, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - WIC_LOADER_FLAGS loadFlags, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromMemoryEx(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const uint8_t* wicData, + size_t wicDataSize, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + WIC_LOADER_FLAGS loadFlags, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView) noexcept { if (texture) { @@ -913,7 +885,7 @@ HRESULT DirectX::CreateWICTextureFromMemoryEx( // Create input stream for memory ComPtr stream; - HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); + HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); if (FAILED(hr)) return hr; @@ -932,12 +904,17 @@ HRESULT DirectX::CreateWICTextureFromMemoryEx( if (FAILED(hr)) return hr; - hr = CreateTextureFromWIC(d3dDevice, d3dContext, + hr = CreateTextureFromWIC(d3dDevice, + d3dContext, frame.Get(), maxsize, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, - texture, textureView); + texture, + textureView); if (FAILED(hr)) return hr; @@ -955,72 +932,80 @@ HRESULT DirectX::CreateWICTextureFromMemoryEx( } //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromFile( - ID3D11Device* d3dDevice, - const wchar_t* fileName, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - size_t maxsize) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromFile(ID3D11Device* d3dDevice, + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize) noexcept { - return CreateWICTextureFromFileEx(d3dDevice, nullptr, - fileName, maxsize, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + return CreateWICTextureFromFileEx(d3dDevice, + nullptr, + fileName, + maxsize, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, WIC_LOADER_DEFAULT, - texture, textureView); + texture, + textureView); } -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromFile( - ID3D11Device* d3dDevice, - ID3D11DeviceContext* d3dContext, - const wchar_t* fileName, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView, - size_t maxsize) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromFile(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const wchar_t* fileName, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView, + size_t maxsize) noexcept { - return CreateWICTextureFromFileEx(d3dDevice, d3dContext, + return CreateWICTextureFromFileEx(d3dDevice, + d3dContext, fileName, maxsize, - D3D11_USAGE_DEFAULT, D3D11_BIND_SHADER_RESOURCE, 0, 0, + D3D11_USAGE_DEFAULT, + D3D11_BIND_SHADER_RESOURCE, + 0, + 0, WIC_LOADER_DEFAULT, - texture, textureView); + texture, + textureView); } -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromFileEx( - ID3D11Device* d3dDevice, - const wchar_t* fileName, - size_t maxsize, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - WIC_LOADER_FLAGS loadFlags, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromFileEx(ID3D11Device* d3dDevice, + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + WIC_LOADER_FLAGS loadFlags, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView) noexcept { - return CreateWICTextureFromFileEx(d3dDevice, nullptr, + return CreateWICTextureFromFileEx(d3dDevice, + nullptr, fileName, maxsize, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, - texture, textureView); + texture, + textureView); } -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromFileEx( - ID3D11Device* d3dDevice, - ID3D11DeviceContext* d3dContext, - const wchar_t* fileName, - size_t maxsize, - D3D11_USAGE usage, - unsigned int bindFlags, - unsigned int cpuAccessFlags, - unsigned int miscFlags, - WIC_LOADER_FLAGS loadFlags, - ID3D11Resource** texture, - ID3D11ShaderResourceView** textureView) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromFileEx(ID3D11Device* d3dDevice, + ID3D11DeviceContext* d3dContext, + const wchar_t* fileName, + size_t maxsize, + D3D11_USAGE usage, + unsigned int bindFlags, + unsigned int cpuAccessFlags, + unsigned int miscFlags, + WIC_LOADER_FLAGS loadFlags, + ID3D11Resource** texture, + ID3D11ShaderResourceView** textureView) noexcept { if (texture) { @@ -1047,11 +1032,7 @@ HRESULT DirectX::CreateWICTextureFromFileEx( // Initialize WIC ComPtr decoder; - HRESULT hr = pWIC->CreateDecoderFromFilename(fileName, - nullptr, - GENERIC_READ, - WICDecodeMetadataCacheOnDemand, - decoder.GetAddressOf()); + HRESULT hr = pWIC->CreateDecoderFromFilename(fileName, nullptr, GENERIC_READ, WICDecodeMetadataCacheOnDemand, decoder.GetAddressOf()); if (FAILED(hr)) return hr; @@ -1060,12 +1041,17 @@ HRESULT DirectX::CreateWICTextureFromFileEx( if (FAILED(hr)) return hr; - hr = CreateTextureFromWIC(d3dDevice, d3dContext, + hr = CreateTextureFromWIC(d3dDevice, + d3dContext, frame.Get(), maxsize, - usage, bindFlags, cpuAccessFlags, miscFlags, + usage, + bindFlags, + cpuAccessFlags, + miscFlags, loadFlags, - texture, textureView); + texture, + textureView); if (SUCCEEDED(hr)) { diff --git a/WICTextureLoader/WICTextureLoader11.h b/WICTextureLoader/WICTextureLoader11.h index 3a6b627f..e2d9b1d4 100644 --- a/WICTextureLoader/WICTextureLoader11.h +++ b/WICTextureLoader/WICTextureLoader11.h @@ -25,8 +25,8 @@ #include -#pragma comment(lib,"dxguid.lib") -#pragma comment(lib,"windowscodecs.lib") +#pragma comment(lib, "dxguid.lib") +#pragma comment(lib, "windowscodecs.lib") #include #include @@ -37,12 +37,12 @@ namespace DirectX #define WIC_LOADER_FLAGS_DEFINED enum WIC_LOADER_FLAGS : uint32_t { - WIC_LOADER_DEFAULT = 0, - WIC_LOADER_FORCE_SRGB = 0x1, - WIC_LOADER_IGNORE_SRGB = 0x2, + WIC_LOADER_DEFAULT = 0, + WIC_LOADER_FORCE_SRGB = 0x1, + WIC_LOADER_IGNORE_SRGB = 0x2, WIC_LOADER_SRGB_DEFAULT = 0x4, - WIC_LOADER_FIT_POW2 = 0x20, - WIC_LOADER_MAKE_SQUARE = 0x40, + WIC_LOADER_FIT_POW2 = 0x20, + WIC_LOADER_MAKE_SQUARE = 0x40, WIC_LOADER_FORCE_RGBA32 = 0x80, }; @@ -60,90 +60,82 @@ namespace DirectX #endif // Standard version - HRESULT CreateWICTextureFromMemory( - _In_ ID3D11Device* d3dDevice, - _In_reads_bytes_(wicDataSize) const uint8_t* wicData, - _In_ size_t wicDataSize, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _In_ size_t maxsize = 0) noexcept; - - HRESULT CreateWICTextureFromFile( - _In_ ID3D11Device* d3dDevice, - _In_z_ const wchar_t* szFileName, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _In_ size_t maxsize = 0) noexcept; + HRESULT CreateWICTextureFromMemory(_In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0) noexcept; + + HRESULT CreateWICTextureFromFile(_In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0) noexcept; // Standard version with optional auto-gen mipmap support - HRESULT CreateWICTextureFromMemory( - _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_reads_bytes_(wicDataSize) const uint8_t* wicData, - _In_ size_t wicDataSize, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _In_ size_t maxsize = 0) noexcept; - - HRESULT CreateWICTextureFromFile( - _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_z_ const wchar_t* szFileName, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView, - _In_ size_t maxsize = 0) noexcept; + HRESULT CreateWICTextureFromMemory(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0) noexcept; + + HRESULT CreateWICTextureFromFile(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_z_ const wchar_t* szFileName, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView, + _In_ size_t maxsize = 0) noexcept; // Extended version - HRESULT CreateWICTextureFromMemoryEx( - _In_ ID3D11Device* d3dDevice, - _In_reads_bytes_(wicDataSize) const uint8_t* wicData, - _In_ size_t wicDataSize, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ WIC_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept; - - HRESULT CreateWICTextureFromFileEx( - _In_ ID3D11Device* d3dDevice, - _In_z_ const wchar_t* szFileName, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ WIC_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept; + HRESULT CreateWICTextureFromMemoryEx(_In_ ID3D11Device* d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ WIC_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept; + + HRESULT CreateWICTextureFromFileEx(_In_ ID3D11Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ WIC_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept; // Extended version with optional auto-gen mipmap support - HRESULT CreateWICTextureFromMemoryEx( - _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_reads_bytes_(wicDataSize) const uint8_t* wicData, - _In_ size_t wicDataSize, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ WIC_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept; - - HRESULT CreateWICTextureFromFileEx( - _In_ ID3D11Device* d3dDevice, - _In_opt_ ID3D11DeviceContext* d3dContext, - _In_z_ const wchar_t* szFileName, - _In_ size_t maxsize, - _In_ D3D11_USAGE usage, - _In_ unsigned int bindFlags, - _In_ unsigned int cpuAccessFlags, - _In_ unsigned int miscFlags, - _In_ WIC_LOADER_FLAGS loadFlags, - _Outptr_opt_ ID3D11Resource** texture, - _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept; -} + HRESULT CreateWICTextureFromMemoryEx(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ WIC_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept; + + HRESULT CreateWICTextureFromFileEx(_In_ ID3D11Device* d3dDevice, + _In_opt_ ID3D11DeviceContext* d3dContext, + _In_z_ const wchar_t* szFileName, + _In_ size_t maxsize, + _In_ D3D11_USAGE usage, + _In_ unsigned int bindFlags, + _In_ unsigned int cpuAccessFlags, + _In_ unsigned int miscFlags, + _In_ WIC_LOADER_FLAGS loadFlags, + _Outptr_opt_ ID3D11Resource** texture, + _Outptr_opt_ ID3D11ShaderResourceView** textureView) noexcept; +} // namespace DirectX diff --git a/WICTextureLoader/WICTextureLoader12.cpp b/WICTextureLoader/WICTextureLoader12.cpp index 8412ec11..a86774da 100644 --- a/WICTextureLoader/WICTextureLoader12.cpp +++ b/WICTextureLoader/WICTextureLoader12.cpp @@ -73,17 +73,17 @@ namespace //------------------------------------------------------------------------------------- struct WICTranslate { - const GUID& wic; - DXGI_FORMAT format; + const GUID& wic; + DXGI_FORMAT format; - constexpr WICTranslate(const GUID& wg, DXGI_FORMAT fmt) noexcept : - wic(wg), - format(fmt) + constexpr WICTranslate(const GUID& wg, DXGI_FORMAT fmt) noexcept + : wic(wg), + format(fmt) {} }; - constexpr WICTranslate g_WICFormats[] = - { + constexpr WICTranslate g_WICFormats[] = { + // clang-format off { GUID_WICPixelFormat128bppRGBAFloat, DXGI_FORMAT_R32G32B32A32_FLOAT }, { GUID_WICPixelFormat64bppRGBAHalf, DXGI_FORMAT_R16G16B16A16_FLOAT }, @@ -107,6 +107,7 @@ namespace { GUID_WICPixelFormat8bppAlpha, DXGI_FORMAT_A8_UNORM }, { GUID_WICPixelFormat96bppRGBFloat, DXGI_FORMAT_R32G32B32_FLOAT }, + // clang-format on }; //------------------------------------------------------------------------------------- @@ -117,14 +118,14 @@ namespace const GUID& source; const GUID& target; - constexpr WICConvert(const GUID& src, const GUID& tgt) noexcept : - source(src), - target(tgt) + constexpr WICConvert(const GUID& src, const GUID& tgt) noexcept + : source(src), + target(tgt) {} }; - constexpr WICConvert g_WICConvert[] = - { + constexpr WICConvert g_WICConvert[] = { + // clang-format off // Note target GUID in this conversion table must be one of those directly supported formats (above). { GUID_WICPixelFormatBlackWhite, GUID_WICPixelFormat8bppGray }, // DXGI_FORMAT_R8_UNORM @@ -181,16 +182,15 @@ namespace { GUID_WICPixelFormat96bppRGBFixedPoint, GUID_WICPixelFormat96bppRGBFloat }, // DXGI_FORMAT_R32G32B32_FLOAT // We don't support n-channel formats + // clang-format on }; BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID* ifactory) noexcept { - return SUCCEEDED(CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - ifactory)) ? TRUE : FALSE; + return SUCCEEDED( + CoCreateInstance(CLSID_WICImagingFactory2, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory2), ifactory)) ? + TRUE : + FALSE; } IWICImagingFactory2* GetWIC() noexcept @@ -198,11 +198,7 @@ namespace static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; IWICImagingFactory2* factory = nullptr; - if (!InitOnceExecuteOnce( - &s_initOnce, - InitializeWICFactory, - nullptr, - reinterpret_cast(&factory))) + if (!InitOnceExecuteOnce(&s_initOnce, InitializeWICFactory, nullptr, reinterpret_cast(&factory))) { return nullptr; } @@ -211,15 +207,15 @@ namespace } //--------------------------------------------------------------------------------- -#if !defined(NO_D3D12_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#if !defined(NO_D3D12_DEBUG_NAME) && (defined(_DEBUG) || defined(PROFILE)) template - inline void SetDebugObjectName(_In_ ID3D12DeviceChild* resource, _In_z_ const wchar_t(&name)[TNameLength]) noexcept + inline void SetDebugObjectName(_In_ ID3D12DeviceChild* resource, _In_z_ const wchar_t (&name)[TNameLength]) noexcept { resource->SetName(name); } #else template - inline void SetDebugObjectName(_In_ ID3D12DeviceChild*, _In_z_ const wchar_t(&)[TNameLength]) noexcept + inline void SetDebugObjectName(_In_ ID3D12DeviceChild*, _In_z_ const wchar_t (&)[TNameLength]) noexcept {} #endif @@ -243,29 +239,21 @@ namespace { switch (format) { - case DXGI_FORMAT_R8G8B8A8_UNORM: - return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; + case DXGI_FORMAT_R8G8B8A8_UNORM: return DXGI_FORMAT_R8G8B8A8_UNORM_SRGB; - case DXGI_FORMAT_BC1_UNORM: - return DXGI_FORMAT_BC1_UNORM_SRGB; + case DXGI_FORMAT_BC1_UNORM: return DXGI_FORMAT_BC1_UNORM_SRGB; - case DXGI_FORMAT_BC2_UNORM: - return DXGI_FORMAT_BC2_UNORM_SRGB; + case DXGI_FORMAT_BC2_UNORM: return DXGI_FORMAT_BC2_UNORM_SRGB; - case DXGI_FORMAT_BC3_UNORM: - return DXGI_FORMAT_BC3_UNORM_SRGB; + case DXGI_FORMAT_BC3_UNORM: return DXGI_FORMAT_BC3_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8A8_UNORM: - return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8A8_UNORM: return DXGI_FORMAT_B8G8R8A8_UNORM_SRGB; - case DXGI_FORMAT_B8G8R8X8_UNORM: - return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; + case DXGI_FORMAT_B8G8R8X8_UNORM: return DXGI_FORMAT_B8G8R8X8_UNORM_SRGB; - case DXGI_FORMAT_BC7_UNORM: - return DXGI_FORMAT_BC7_UNORM_SRGB; + case DXGI_FORMAT_BC7_UNORM: return DXGI_FORMAT_BC7_UNORM_SRGB; - default: - return format; + default: return format; } } @@ -318,7 +306,11 @@ namespace if (origx > origy) { size_t x; - for (x = maxsize; x > 1; x >>= 1) { if (x <= targetx) break; } + for (x = maxsize; x > 1; x >>= 1) + { + if (x <= targetx) + break; + } targetx = UINT(x); float bestScore = FLT_MAX; @@ -328,14 +320,18 @@ namespace if (score < bestScore) { bestScore = score; - targety = UINT(y); + targety = UINT(y); } } } else { size_t y; - for (y = maxsize; y > 1; y >>= 1) { if (y <= targety) break; } + for (y = maxsize; y > 1; y >>= 1) + { + if (y <= targety) + break; + } targety = UINT(y); float bestScore = FLT_MAX; @@ -345,7 +341,7 @@ namespace if (score < bestScore) { bestScore = score; - targetx = UINT(x); + targetx = UINT(x); } } } @@ -353,15 +349,15 @@ namespace //--------------------------------------------------------------------------------- HRESULT CreateTextureFromWIC(_In_ ID3D12Device* d3dDevice, - _In_ IWICBitmapFrameDecode *frame, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - unsigned int loadFlags, - _Outptr_ ID3D12Resource** texture, - std::unique_ptr& decodedData, - D3D12_SUBRESOURCE_DATA& subresource) noexcept + _In_ IWICBitmapFrameDecode* frame, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + unsigned int loadFlags, + _Outptr_ ID3D12Resource** texture, + std::unique_ptr& decodedData, + D3D12_SUBRESOURCE_DATA& subresource) noexcept { - UINT width, height; + UINT width, height; HRESULT hr = frame->GetSize(&width, &height); if (FAILED(hr)) return hr; @@ -376,7 +372,7 @@ namespace maxsize = size_t(D3D12_REQ_TEXTURE2D_U_OR_V_DIMENSION); } - UINT twidth = width; + UINT twidth = width; UINT theight = height; if (loadFlags & WIC_LOADER_FIT_POW2) { @@ -387,20 +383,20 @@ namespace const float ar = static_cast(height) / static_cast(width); if (width > height) { - twidth = static_cast(maxsize); + twidth = static_cast(maxsize); theight = std::max(1, static_cast(static_cast(maxsize) * ar)); } else { theight = static_cast(maxsize); - twidth = std::max(1, static_cast(static_cast(maxsize) / ar)); + twidth = std::max(1, static_cast(static_cast(maxsize) / ar)); } assert(twidth <= maxsize && theight <= maxsize); } if (loadFlags & WIC_LOADER_MAKE_SQUARE) { - twidth = std::max(twidth, theight); + twidth = std::max(twidth, theight); theight = twidth; } @@ -443,7 +439,7 @@ namespace { memcpy_s(&convertGUID, sizeof(WICPixelFormatGUID), &GUID_WICPixelFormat32bppRGBA, sizeof(GUID)); format = DXGI_FORMAT_R8G8B8A8_UNORM; - bpp = 32; + bpp = 32; } if (!bpp) @@ -507,7 +503,7 @@ namespace if (rowBytes > UINT32_MAX || numBytes > UINT32_MAX) return HRESULT_FROM_WIN32(ERROR_ARITHMETIC_OVERFLOW); - const auto rowPitch = static_cast(rowBytes); + const auto rowPitch = static_cast(rowBytes); const auto imageSize = static_cast(numBytes); decodedData.reset(new (std::nothrow) uint8_t[imageSize]); @@ -515,9 +511,7 @@ namespace return E_OUTOFMEMORY; // Load image data - if (memcmp(&convertGUID, &pixelFormat, sizeof(GUID)) == 0 - && twidth == width - && theight == height) + if (memcmp(&convertGUID, &pixelFormat, sizeof(GUID)) == 0 && twidth == width && theight == height) { // No format conversion or resize needed hr = frame->CopyPixels(nullptr, static_cast(rowPitch), static_cast(imageSize), decodedData.get()); @@ -560,13 +554,18 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pfScaler, convertGUID, &canConvert); + hr = FC->CanConvert(pfScaler, convertGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; } - hr = FC->Initialize(scaler.Get(), convertGUID, WICBitmapDitherTypeErrorDiffusion, nullptr, 0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(scaler.Get(), + convertGUID, + WICBitmapDitherTypeErrorDiffusion, + nullptr, + 0, + WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; @@ -588,7 +587,7 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pixelFormat, convertGUID, &canConvert); + hr = FC->CanConvert(pixelFormat, convertGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; @@ -604,26 +603,24 @@ namespace } // Count the number of mips - const uint32_t mipCount = (loadFlags & (WIC_LOADER_MIP_AUTOGEN | WIC_LOADER_MIP_RESERVE)) - ? CountMips(twidth, theight) : 1u; + const uint32_t mipCount = (loadFlags & (WIC_LOADER_MIP_AUTOGEN | WIC_LOADER_MIP_RESERVE)) ? CountMips(twidth, theight) : 1u; // Create texture D3D12_RESOURCE_DESC desc = {}; - desc.Width = twidth; - desc.Height = theight; - desc.MipLevels = static_cast(mipCount); - desc.DepthOrArraySize = 1; - desc.Format = format; - desc.SampleDesc.Count = 1; - desc.SampleDesc.Quality = 0; - desc.Flags = resFlags; - desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; + desc.Width = twidth; + desc.Height = theight; + desc.MipLevels = static_cast(mipCount); + desc.DepthOrArraySize = 1; + desc.Format = format; + desc.SampleDesc.Count = 1; + desc.SampleDesc.Quality = 0; + desc.Flags = resFlags; + desc.Dimension = D3D12_RESOURCE_DIMENSION_TEXTURE2D; const CD3DX12_HEAP_PROPERTIES defaultHeapProperties(D3D12_HEAP_TYPE_DEFAULT); ID3D12Resource* tex = nullptr; - hr = d3dDevice->CreateCommittedResource( - &defaultHeapProperties, + hr = d3dDevice->CreateCommittedResource(&defaultHeapProperties, D3D12_HEAP_FLAG_NONE, &desc, D3D12_RESOURCE_STATE_COMMON, @@ -638,8 +635,8 @@ namespace _Analysis_assume_(tex != nullptr); - subresource.pData = decodedData.get(); - subresource.RowPitch = static_cast(rowPitch); + subresource.pData = decodedData.get(); + subresource.RowPitch = static_cast(rowPitch); subresource.SlicePitch = static_cast(imageSize); *texture = tex; @@ -647,11 +644,9 @@ namespace } //-------------------------------------------------------------------------------------- - void SetDebugTextureInfo( - _In_z_ const wchar_t* fileName, - _In_ ID3D12Resource* texture) noexcept + void SetDebugTextureInfo(_In_z_ const wchar_t* fileName, _In_ ID3D12Resource* texture) noexcept { - #if !defined(NO_D3D12_DEBUG_NAME) && ( defined(_DEBUG) || defined(PROFILE) ) +#if !defined(NO_D3D12_DEBUG_NAME) && (defined(_DEBUG) || defined(PROFILE)) const wchar_t* pstrName = wcsrchr(fileName, '\\'); if (!pstrName) { @@ -662,27 +657,23 @@ namespace pstrName++; } texture->SetName(pstrName); - #else +#else UNREFERENCED_PARAMETER(fileName); UNREFERENCED_PARAMETER(texture); - #endif +#endif } } // anonymous namespace - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadWICTextureFromMemory( - ID3D12Device* d3dDevice, - const uint8_t* wicData, - size_t wicDataSize, - ID3D12Resource** texture, - std::unique_ptr& decodedData, - D3D12_SUBRESOURCE_DATA& subresource, - size_t maxsize) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadWICTextureFromMemory(ID3D12Device* d3dDevice, + const uint8_t* wicData, + size_t wicDataSize, + ID3D12Resource** texture, + std::unique_ptr& decodedData, + D3D12_SUBRESOURCE_DATA& subresource, + size_t maxsize) noexcept { - return LoadWICTextureFromMemoryEx( - d3dDevice, + return LoadWICTextureFromMemoryEx(d3dDevice, wicData, wicDataSize, maxsize, @@ -693,19 +684,16 @@ HRESULT DirectX::LoadWICTextureFromMemory( subresource); } - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadWICTextureFromMemoryEx( - ID3D12Device* d3dDevice, - const uint8_t* wicData, - size_t wicDataSize, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - WIC_LOADER_FLAGS loadFlags, - ID3D12Resource** texture, - std::unique_ptr& decodedData, - D3D12_SUBRESOURCE_DATA& subresource) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadWICTextureFromMemoryEx(ID3D12Device* d3dDevice, + const uint8_t* wicData, + size_t wicDataSize, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + WIC_LOADER_FLAGS loadFlags, + ID3D12Resource** texture, + std::unique_ptr& decodedData, + D3D12_SUBRESOURCE_DATA& subresource) noexcept { if (texture) { @@ -727,7 +715,7 @@ HRESULT DirectX::LoadWICTextureFromMemoryEx( // Create input stream for memory ComPtr stream; - HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); + HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); if (FAILED(hr)) return hr; @@ -746,10 +734,7 @@ HRESULT DirectX::LoadWICTextureFromMemoryEx( if (FAILED(hr)) return hr; - hr = CreateTextureFromWIC(d3dDevice, - frame.Get(), maxsize, - resFlags, loadFlags, - texture, decodedData, subresource); + hr = CreateTextureFromWIC(d3dDevice, frame.Get(), maxsize, resFlags, loadFlags, texture, decodedData, subresource); if (FAILED(hr)) return hr; @@ -759,19 +744,15 @@ HRESULT DirectX::LoadWICTextureFromMemoryEx( return hr; } - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadWICTextureFromFile( - ID3D12Device* d3dDevice, - const wchar_t* fileName, - ID3D12Resource** texture, - std::unique_ptr& wicData, - D3D12_SUBRESOURCE_DATA& subresource, - size_t maxsize) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadWICTextureFromFile(ID3D12Device* d3dDevice, + const wchar_t* fileName, + ID3D12Resource** texture, + std::unique_ptr& wicData, + D3D12_SUBRESOURCE_DATA& subresource, + size_t maxsize) noexcept { - return LoadWICTextureFromFileEx( - d3dDevice, + return LoadWICTextureFromFileEx(d3dDevice, fileName, maxsize, D3D12_RESOURCE_FLAG_NONE, @@ -781,18 +762,15 @@ HRESULT DirectX::LoadWICTextureFromFile( subresource); } - //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::LoadWICTextureFromFileEx( - ID3D12Device* d3dDevice, - const wchar_t* fileName, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - WIC_LOADER_FLAGS loadFlags, - ID3D12Resource** texture, - std::unique_ptr& decodedData, - D3D12_SUBRESOURCE_DATA& subresource) noexcept +_Use_decl_annotations_ HRESULT DirectX::LoadWICTextureFromFileEx(ID3D12Device* d3dDevice, + const wchar_t* fileName, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + WIC_LOADER_FLAGS loadFlags, + ID3D12Resource** texture, + std::unique_ptr& decodedData, + D3D12_SUBRESOURCE_DATA& subresource) noexcept { if (texture) { @@ -808,11 +786,7 @@ HRESULT DirectX::LoadWICTextureFromFileEx( // Initialize WIC ComPtr decoder; - HRESULT hr = pWIC->CreateDecoderFromFilename(fileName, - nullptr, - GENERIC_READ, - WICDecodeMetadataCacheOnDemand, - decoder.GetAddressOf()); + HRESULT hr = pWIC->CreateDecoderFromFilename(fileName, nullptr, GENERIC_READ, WICDecodeMetadataCacheOnDemand, decoder.GetAddressOf()); if (FAILED(hr)) return hr; @@ -821,9 +795,7 @@ HRESULT DirectX::LoadWICTextureFromFileEx( if (FAILED(hr)) return hr; - hr = CreateTextureFromWIC(d3dDevice, frame.Get(), maxsize, - resFlags, loadFlags, - texture, decodedData, subresource); + hr = CreateTextureFromWIC(d3dDevice, frame.Get(), maxsize, resFlags, loadFlags, texture, decodedData, subresource); if (SUCCEEDED(hr)) { diff --git a/WICTextureLoader/WICTextureLoader12.h b/WICTextureLoader/WICTextureLoader12.h index 73c92837..eb7243b2 100644 --- a/WICTextureLoader/WICTextureLoader12.h +++ b/WICTextureLoader/WICTextureLoader12.h @@ -33,30 +33,29 @@ #include #else #include -#pragma comment(lib,"dxguid.lib") +#pragma comment(lib, "dxguid.lib") #endif -#pragma comment(lib,"windowscodecs.lib") +#pragma comment(lib, "windowscodecs.lib") #include #include #include - namespace DirectX { #ifndef WIC_LOADER_FLAGS_DEFINED #define WIC_LOADER_FLAGS_DEFINED enum WIC_LOADER_FLAGS : uint32_t { - WIC_LOADER_DEFAULT = 0, - WIC_LOADER_FORCE_SRGB = 0x1, - WIC_LOADER_IGNORE_SRGB = 0x2, + WIC_LOADER_DEFAULT = 0, + WIC_LOADER_FORCE_SRGB = 0x1, + WIC_LOADER_IGNORE_SRGB = 0x2, WIC_LOADER_SRGB_DEFAULT = 0x4, - WIC_LOADER_MIP_AUTOGEN = 0x8, - WIC_LOADER_MIP_RESERVE = 0x10, - WIC_LOADER_FIT_POW2 = 0x20, - WIC_LOADER_MAKE_SQUARE = 0x40, + WIC_LOADER_MIP_AUTOGEN = 0x8, + WIC_LOADER_MIP_RESERVE = 0x10, + WIC_LOADER_FIT_POW2 = 0x20, + WIC_LOADER_MAKE_SQUARE = 0x40, WIC_LOADER_FORCE_RGBA32 = 0x80, }; @@ -74,42 +73,38 @@ namespace DirectX #endif // Standard version - HRESULT __cdecl LoadWICTextureFromMemory( - _In_ ID3D12Device* d3dDevice, - _In_reads_bytes_(wicDataSize) const uint8_t* wicData, - size_t wicDataSize, - _Outptr_ ID3D12Resource** texture, - std::unique_ptr& decodedData, - D3D12_SUBRESOURCE_DATA& subresource, - size_t maxsize = 0) noexcept; + HRESULT __cdecl LoadWICTextureFromMemory(_In_ ID3D12Device* d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + size_t wicDataSize, + _Outptr_ ID3D12Resource** texture, + std::unique_ptr& decodedData, + D3D12_SUBRESOURCE_DATA& subresource, + size_t maxsize = 0) noexcept; - HRESULT __cdecl LoadWICTextureFromFile( - _In_ ID3D12Device* d3dDevice, - _In_z_ const wchar_t* szFileName, - _Outptr_ ID3D12Resource** texture, - std::unique_ptr& decodedData, - D3D12_SUBRESOURCE_DATA& subresource, - size_t maxsize = 0) noexcept; + HRESULT __cdecl LoadWICTextureFromFile(_In_ ID3D12Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + _Outptr_ ID3D12Resource** texture, + std::unique_ptr& decodedData, + D3D12_SUBRESOURCE_DATA& subresource, + size_t maxsize = 0) noexcept; // Extended version - HRESULT __cdecl LoadWICTextureFromMemoryEx( - _In_ ID3D12Device* d3dDevice, - _In_reads_bytes_(wicDataSize) const uint8_t* wicData, - size_t wicDataSize, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - WIC_LOADER_FLAGS loadFlags, - _Outptr_ ID3D12Resource** texture, - std::unique_ptr& decodedData, - D3D12_SUBRESOURCE_DATA& subresource) noexcept; + HRESULT __cdecl LoadWICTextureFromMemoryEx(_In_ ID3D12Device* d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + size_t wicDataSize, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + WIC_LOADER_FLAGS loadFlags, + _Outptr_ ID3D12Resource** texture, + std::unique_ptr& decodedData, + D3D12_SUBRESOURCE_DATA& subresource) noexcept; - HRESULT __cdecl LoadWICTextureFromFileEx( - _In_ ID3D12Device* d3dDevice, - _In_z_ const wchar_t* szFileName, - size_t maxsize, - D3D12_RESOURCE_FLAGS resFlags, - WIC_LOADER_FLAGS loadFlags, - _Outptr_ ID3D12Resource** texture, - std::unique_ptr& decodedData, - D3D12_SUBRESOURCE_DATA& subresource) noexcept; -} + HRESULT __cdecl LoadWICTextureFromFileEx(_In_ ID3D12Device* d3dDevice, + _In_z_ const wchar_t* szFileName, + size_t maxsize, + D3D12_RESOURCE_FLAGS resFlags, + WIC_LOADER_FLAGS loadFlags, + _Outptr_ ID3D12Resource** texture, + std::unique_ptr& decodedData, + D3D12_SUBRESOURCE_DATA& subresource) noexcept; +} // namespace DirectX diff --git a/WICTextureLoader/WICTextureLoader9.cpp b/WICTextureLoader/WICTextureLoader9.cpp index 6e66c16b..c0ee2dca 100644 --- a/WICTextureLoader/WICTextureLoader9.cpp +++ b/WICTextureLoader/WICTextureLoader9.cpp @@ -61,17 +61,17 @@ namespace //------------------------------------------------------------------------------------- struct WICTranslate { - const GUID& wic; - D3DFORMAT format; + const GUID& wic; + D3DFORMAT format; - constexpr WICTranslate(const GUID& wg, D3DFORMAT fmt) noexcept : - wic(wg), - format(fmt) + constexpr WICTranslate(const GUID& wg, D3DFORMAT fmt) noexcept + : wic(wg), + format(fmt) {} }; - constexpr WICTranslate g_WICFormats[] = - { + constexpr WICTranslate g_WICFormats[] = { + // clang-format off { GUID_WICPixelFormat128bppRGBAFloat, D3DFMT_A32B32G32R32F }, { GUID_WICPixelFormat64bppRGBAHalf, D3DFMT_A16B16G16R16F }, @@ -91,6 +91,7 @@ namespace { GUID_WICPixelFormat8bppGray, D3DFMT_L8 }, { GUID_WICPixelFormat8bppAlpha, D3DFMT_A8 }, + // clang-format on }; //------------------------------------------------------------------------------------- @@ -101,14 +102,14 @@ namespace const GUID& source; const GUID& target; - constexpr WICConvert(const GUID& src, const GUID& tgt) noexcept : - source(src), - target(tgt) + constexpr WICConvert(const GUID& src, const GUID& tgt) noexcept + : source(src), + target(tgt) {} }; - constexpr WICConvert g_WICConvert[] = - { + constexpr WICConvert g_WICConvert[] = { + // clang-format off // Note target GUID in this conversion table must be one of those directly supported formats (above). { GUID_WICPixelFormatBlackWhite, GUID_WICPixelFormat8bppGray }, // D3DFMT_L8 @@ -164,18 +165,13 @@ namespace { GUID_WICPixelFormat96bppRGBFloat, GUID_WICPixelFormat128bppRGBAFloat }, // D3DFMT_A32B32G32R32F // We don't support n-channel formats + // clang-format on }; //-------------------------------------------------------------------------------------- BOOL WINAPI InitializeWICFactory(PINIT_ONCE, PVOID, PVOID* ifactory) noexcept { - HRESULT hr = CoCreateInstance( - CLSID_WICImagingFactory2, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory2), - ifactory - ); + HRESULT hr = CoCreateInstance(CLSID_WICImagingFactory2, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory2), ifactory); if (SUCCEEDED(hr)) { @@ -184,13 +180,7 @@ namespace } else { - hr = CoCreateInstance( - CLSID_WICImagingFactory1, - nullptr, - CLSCTX_INPROC_SERVER, - __uuidof(IWICImagingFactory), - ifactory - ); + hr = CoCreateInstance(CLSID_WICImagingFactory1, nullptr, CLSCTX_INPROC_SERVER, __uuidof(IWICImagingFactory), ifactory); return SUCCEEDED(hr) ? TRUE : FALSE; } } @@ -200,11 +190,7 @@ namespace static INIT_ONCE s_initOnce = INIT_ONCE_STATIC_INIT; IWICImagingFactory* factory = nullptr; - if (!InitOnceExecuteOnce( - &s_initOnce, - InitializeWICFactory, - nullptr, - reinterpret_cast(&factory))) + if (!InitOnceExecuteOnce(&s_initOnce, InitializeWICFactory, nullptr, reinterpret_cast(&factory))) { return nullptr; } @@ -232,7 +218,11 @@ namespace if (origx > origy) { size_t x; - for (x = maxsize; x > 1; x >>= 1) { if (x <= targetx) break; } + for (x = maxsize; x > 1; x >>= 1) + { + if (x <= targetx) + break; + } targetx = UINT(x); float bestScore = FLT_MAX; @@ -242,14 +232,18 @@ namespace if (score < bestScore) { bestScore = score; - targety = UINT(y); + targety = UINT(y); } } } else { size_t y; - for (y = maxsize; y > 1; y >>= 1) { if (y <= targety) break; } + for (y = maxsize; y > 1; y >>= 1) + { + if (y <= targety) + break; + } targety = UINT(y); float bestScore = FLT_MAX; @@ -259,23 +253,22 @@ namespace if (score < bestScore) { bestScore = score; - targetx = UINT(x); + targetx = UINT(x); } } } } //--------------------------------------------------------------------------------- - HRESULT CreateTextureFromWIC( - _In_ LPDIRECT3DDEVICE9 device, - _In_ IWICBitmapFrameDecode* frame, - _In_ size_t maxsize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - _In_ WIC_LOADER_FLAGS loadFlags, - _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept + HRESULT CreateTextureFromWIC(_In_ LPDIRECT3DDEVICE9 device, + _In_ IWICBitmapFrameDecode* frame, + _In_ size_t maxsize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + _In_ WIC_LOADER_FLAGS loadFlags, + _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept { - UINT width, height; + UINT width, height; HRESULT hr = frame->GetSize(&width, &height); if (FAILED(hr)) return hr; @@ -292,7 +285,7 @@ namespace assert(maxsize > 0); - UINT twidth = width; + UINT twidth = width; UINT theight = height; if (loadFlags & WIC_LOADER_FIT_POW2) { @@ -303,20 +296,20 @@ namespace const float ar = static_cast(height) / static_cast(width); if (width > height) { - twidth = static_cast(maxsize); + twidth = static_cast(maxsize); theight = std::max(1, static_cast(static_cast(maxsize) * ar)); } else { theight = static_cast(maxsize); - twidth = std::max(1, static_cast(static_cast(maxsize) / ar)); + twidth = std::max(1, static_cast(static_cast(maxsize) / ar)); } assert(twidth <= maxsize && theight <= maxsize); } if (loadFlags & WIC_LOADER_MAKE_SQUARE) { - twidth = std::max(twidth, theight); + twidth = std::max(twidth, theight); theight = twidth; } @@ -359,9 +352,7 @@ namespace usage |= D3DUSAGE_AUTOGENMIPMAP; ComPtr pTexture; - hr = device->CreateTexture(twidth, theight, 1u, - usage, format, pool, - pTexture.GetAddressOf(), nullptr); + hr = device->CreateTexture(twidth, theight, 1u, usage, format, pool, pTexture.GetAddressOf(), nullptr); if (FAILED(hr)) return hr; @@ -369,9 +360,7 @@ namespace ComPtr pStagingTexture; if (pool == D3DPOOL_DEFAULT) { - hr = device->CreateTexture(twidth, theight, 1u, - 0u, format, D3DPOOL_SYSTEMMEM, - pStagingTexture.GetAddressOf(), nullptr); + hr = device->CreateTexture(twidth, theight, 1u, 0u, format, D3DPOOL_SYSTEMMEM, pStagingTexture.GetAddressOf(), nullptr); if (FAILED(hr)) return hr; } @@ -381,7 +370,7 @@ namespace } D3DLOCKED_RECT LockedRect = {}; - hr = pStagingTexture->LockRect(0, &LockedRect, nullptr, 0); + hr = pStagingTexture->LockRect(0, &LockedRect, nullptr, 0); if (FAILED(hr)) return hr; @@ -395,16 +384,16 @@ namespace } // Load image data - if (memcmp(&convertGUID, &pixelFormat, sizeof(GUID)) == 0 - && twidth == width - && theight == height) + if (memcmp(&convertGUID, &pixelFormat, sizeof(GUID)) == 0 && twidth == width && theight == height) { // No format conversion or resize needed hr = pStagingTexture->LockRect(0, &LockedRect, nullptr, 0); if (FAILED(hr)) return hr; - hr = frame->CopyPixels(nullptr, static_cast(LockedRect.Pitch), static_cast(numBytes), + hr = frame->CopyPixels(nullptr, + static_cast(LockedRect.Pitch), + static_cast(numBytes), static_cast(LockedRect.pBits)); pStagingTexture->UnlockRect(0); @@ -440,7 +429,9 @@ namespace if (FAILED(hr)) return hr; - hr = scaler->CopyPixels(nullptr, static_cast(LockedRect.Pitch), static_cast(numBytes), + hr = scaler->CopyPixels(nullptr, + static_cast(LockedRect.Pitch), + static_cast(numBytes), static_cast(LockedRect.pBits)); pStagingTexture->UnlockRect(0); @@ -456,13 +447,18 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pfScaler, convertGUID, &canConvert); + hr = FC->CanConvert(pfScaler, convertGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; } - hr = FC->Initialize(scaler.Get(), convertGUID, WICBitmapDitherTypeErrorDiffusion, nullptr, 0, WICBitmapPaletteTypeMedianCut); + hr = FC->Initialize(scaler.Get(), + convertGUID, + WICBitmapDitherTypeErrorDiffusion, + nullptr, + 0, + WICBitmapPaletteTypeMedianCut); if (FAILED(hr)) return hr; @@ -470,7 +466,9 @@ namespace if (FAILED(hr)) return hr; - hr = FC->CopyPixels(nullptr, static_cast(LockedRect.Pitch), static_cast(numBytes), + hr = FC->CopyPixels(nullptr, + static_cast(LockedRect.Pitch), + static_cast(numBytes), static_cast(LockedRect.pBits)); pStagingTexture->UnlockRect(0); @@ -492,7 +490,7 @@ namespace return hr; BOOL canConvert = FALSE; - hr = FC->CanConvert(pixelFormat, convertGUID, &canConvert); + hr = FC->CanConvert(pixelFormat, convertGUID, &canConvert); if (FAILED(hr) || !canConvert) { return E_UNEXPECTED; @@ -506,7 +504,9 @@ namespace if (FAILED(hr)) return hr; - hr = FC->CopyPixels(nullptr, static_cast(LockedRect.Pitch), static_cast(numBytes), + hr = FC->CopyPixels(nullptr, + static_cast(LockedRect.Pitch), + static_cast(numBytes), static_cast(LockedRect.pBits)); pStagingTexture->UnlockRect(0); @@ -529,29 +529,24 @@ namespace } // anonymous namespace //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromMemory( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* wicData, - size_t wicDataSize, - LPDIRECT3DTEXTURE9* texture, - size_t maxsize, - WIC_LOADER_FLAGS loadFlags) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromMemory(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* wicData, + size_t wicDataSize, + LPDIRECT3DTEXTURE9* texture, + size_t maxsize, + WIC_LOADER_FLAGS loadFlags) noexcept { return CreateWICTextureFromMemoryEx(d3dDevice, wicData, wicDataSize, maxsize, 0u, D3DPOOL_DEFAULT, loadFlags, texture); } - -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromMemoryEx( - LPDIRECT3DDEVICE9 d3dDevice, - const uint8_t* wicData, - size_t wicDataSize, - _In_ size_t maxsize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - _In_ WIC_LOADER_FLAGS loadFlags, - LPDIRECT3DTEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromMemoryEx(LPDIRECT3DDEVICE9 d3dDevice, + const uint8_t* wicData, + size_t wicDataSize, + _In_ size_t maxsize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + _In_ WIC_LOADER_FLAGS loadFlags, + LPDIRECT3DTEXTURE9* texture) noexcept { if (texture) { @@ -573,7 +568,7 @@ HRESULT DirectX::CreateWICTextureFromMemoryEx( // Create input stream for memory ComPtr stream; - HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); + HRESULT hr = pWIC->CreateStream(stream.GetAddressOf()); if (FAILED(hr)) return hr; @@ -596,26 +591,22 @@ HRESULT DirectX::CreateWICTextureFromMemoryEx( } //-------------------------------------------------------------------------------------- -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromFile( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* fileName, - LPDIRECT3DTEXTURE9* texture, - size_t maxsize, - WIC_LOADER_FLAGS loadFlags) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromFile(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* fileName, + LPDIRECT3DTEXTURE9* texture, + size_t maxsize, + WIC_LOADER_FLAGS loadFlags) noexcept { return CreateWICTextureFromFileEx(d3dDevice, fileName, maxsize, 0u, D3DPOOL_DEFAULT, loadFlags, texture); } -_Use_decl_annotations_ -HRESULT DirectX::CreateWICTextureFromFileEx( - LPDIRECT3DDEVICE9 d3dDevice, - const wchar_t* fileName, - size_t maxsize, - DWORD usage, - D3DPOOL pool, - WIC_LOADER_FLAGS loadFlags, - LPDIRECT3DTEXTURE9* texture) noexcept +_Use_decl_annotations_ HRESULT DirectX::CreateWICTextureFromFileEx(LPDIRECT3DDEVICE9 d3dDevice, + const wchar_t* fileName, + size_t maxsize, + DWORD usage, + D3DPOOL pool, + WIC_LOADER_FLAGS loadFlags, + LPDIRECT3DTEXTURE9* texture) noexcept { if (texture) { @@ -631,11 +622,7 @@ HRESULT DirectX::CreateWICTextureFromFileEx( // Initialize WIC ComPtr decoder; - HRESULT hr = pWIC->CreateDecoderFromFilename(fileName, - nullptr, - GENERIC_READ, - WICDecodeMetadataCacheOnDemand, - decoder.GetAddressOf()); + HRESULT hr = pWIC->CreateDecoderFromFilename(fileName, nullptr, GENERIC_READ, WICDecodeMetadataCacheOnDemand, decoder.GetAddressOf()); if (FAILED(hr)) return hr; diff --git a/WICTextureLoader/WICTextureLoader9.h b/WICTextureLoader/WICTextureLoader9.h index 4a9024ba..1d7a659a 100644 --- a/WICTextureLoader/WICTextureLoader9.h +++ b/WICTextureLoader/WICTextureLoader9.h @@ -24,7 +24,7 @@ #endif #include -#pragma comment(lib,"windowscodecs.lib") +#pragma comment(lib, "windowscodecs.lib") #include #include @@ -35,10 +35,10 @@ namespace DirectX #define WIC_LOADER_FLAGS_DEFINED enum WIC_LOADER_FLAGS : uint32_t { - WIC_LOADER_DEFAULT = 0, - WIC_LOADER_MIP_AUTOGEN = 0x8, - WIC_LOADER_FIT_POW2 = 0x20, - WIC_LOADER_MAKE_SQUARE = 0x40, + WIC_LOADER_DEFAULT = 0, + WIC_LOADER_MIP_AUTOGEN = 0x8, + WIC_LOADER_FIT_POW2 = 0x20, + WIC_LOADER_MAKE_SQUARE = 0x40, WIC_LOADER_FORCE_RGBA32 = 0x80, }; @@ -56,38 +56,34 @@ namespace DirectX #endif // Standard version - HRESULT CreateWICTextureFromMemory( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(wicDataSize) const uint8_t* wicData, - _In_ size_t wicDataSize, - _Outptr_ LPDIRECT3DTEXTURE9* texture, - _In_ size_t maxsize = 0, - _In_ WIC_LOADER_FLAGS loadFlags = WIC_LOADER_DEFAULT) noexcept; + HRESULT CreateWICTextureFromMemory(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _Outptr_ LPDIRECT3DTEXTURE9* texture, + _In_ size_t maxsize = 0, + _In_ WIC_LOADER_FLAGS loadFlags = WIC_LOADER_DEFAULT) noexcept; - HRESULT CreateWICTextureFromFile( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _Outptr_ LPDIRECT3DTEXTURE9* texture, - _In_ size_t maxsize = 0, - _In_ WIC_LOADER_FLAGS loadFlags = WIC_LOADER_DEFAULT) noexcept; + HRESULT CreateWICTextureFromFile(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _Outptr_ LPDIRECT3DTEXTURE9* texture, + _In_ size_t maxsize = 0, + _In_ WIC_LOADER_FLAGS loadFlags = WIC_LOADER_DEFAULT) noexcept; // Extended version - HRESULT CreateWICTextureFromMemoryEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_reads_bytes_(wicDataSize) const uint8_t* wicData, - _In_ size_t wicDataSize, - _In_ size_t maxsize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - _In_ WIC_LOADER_FLAGS loadFlags, - _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept; + HRESULT CreateWICTextureFromMemoryEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_reads_bytes_(wicDataSize) const uint8_t* wicData, + _In_ size_t wicDataSize, + _In_ size_t maxsize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + _In_ WIC_LOADER_FLAGS loadFlags, + _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept; - HRESULT CreateWICTextureFromFileEx( - _In_ LPDIRECT3DDEVICE9 d3dDevice, - _In_z_ const wchar_t* fileName, - _In_ size_t maxsize, - _In_ DWORD usage, - _In_ D3DPOOL pool, - _In_ WIC_LOADER_FLAGS loadFlags, - _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept; -} + HRESULT CreateWICTextureFromFileEx(_In_ LPDIRECT3DDEVICE9 d3dDevice, + _In_z_ const wchar_t* fileName, + _In_ size_t maxsize, + _In_ DWORD usage, + _In_ D3DPOOL pool, + _In_ WIC_LOADER_FLAGS loadFlags, + _Outptr_ LPDIRECT3DTEXTURE9* texture) noexcept; +} // namespace DirectX diff --git a/build/Format.ps1 b/build/Format.ps1 new file mode 100644 index 00000000..e7342aca --- /dev/null +++ b/build/Format.ps1 @@ -0,0 +1,105 @@ +<# + +.NOTES +Copyright (c) Microsoft Corporation. +Licensed under the MIT License. + +.SYNOPSIS +Runs clang-format on the source code. + +.DESCRIPTION +This is use to clang-format the code using the rules in .github\linters\.clang-format. + +The clang-format version must match the version used by GitHub Super-Linter or false positives can be found. +You can install this version locally using: + +winget install --id=LLVM.LLVM --version 21.1.2 + +.PARAMETER Check +Runs clang-format without modifying the files in place. + +.PARAMETER LLVM +Normally clang-format is found on the path. If you use this switch, then it looks for it in C:\Program Files\LLVM\bin. + +.LINKS +https://github.com/microsoft/DirectXTex + +#> + +[CmdletBinding()] +param( + [switch] $Check, + [Alias('UseLLVM')] + [switch] $LLVM +) + +$ErrorActionPreference = 'Stop' + +$repoRoot = (Resolve-Path (Join-Path $PSScriptRoot '..')).Path +$configFile = Join-Path $repoRoot '.github\linters\.clang-format' + +if (-not (Test-Path -LiteralPath $configFile -PathType Leaf)) { + throw "clang-format configuration was not found: $configFile" +} + +$clangFormatPath = if ($LLVM) { + 'C:\Program Files\LLVM\bin\clang-format.exe' +} +else { + (Get-Command clang-format -ErrorAction SilentlyContinue).Source +} + +if (-not $clangFormatPath -or -not (Test-Path -LiteralPath $clangFormatPath -PathType Leaf)) { + if ($LLVM) { + throw "clang-format was not found at: $clangFormatPath" + } + + throw 'clang-format was not found on PATH.' +} + +# This has to match the version used by GitHub super-linter or results will not match. +$requiredClangFormatVersion = '21.1.2' +$clangFormatVersion = (& $clangFormatPath '--version' 2>&1 | Out-String).Trim() +if ($LASTEXITCODE -ne 0) { + throw "Unable to determine clang-format version." +} + +if ($clangFormatVersion -notmatch "\b$([regex]::Escape($requiredClangFormatVersion))\b") { + throw "clang-format version $requiredClangFormatVersion is required; found: $clangFormatVersion" +} + +$sourceFiles = Get-ChildItem -LiteralPath $repoRoot -Recurse| + Where-Object { + $_.FullName -notmatch '\\(?:\.git|\.vs|build|Tests|vcpkg_installed|wiki)\\' -and $_.Extension -in '.c','.cc','.cpp','.cxx','.h','.hh','.hpp','.inl' + } + +if ($sourceFiles.Count -eq 0) { + Write-Output 'No C/C++ source files found.' + exit 0 +} + +$arguments = @( + '--style=file:{0}' -f $configFile +) + +if ($Check) { + $arguments += '--dry-run' + $arguments += '--Werror' +} +else { + $arguments += '-i' +} + +foreach ($sourceFile in $sourceFiles) { + & $clangFormatPath @arguments $sourceFile.FullName + if ($LASTEXITCODE -ne 0) { + throw "clang-format failed for $($sourceFile.FullName)." + } +} + +if ($Check) { + Write-Output "Checked $($sourceFiles.Count) C/C++ source files." +} +else { + Write-Output "Formatted $($sourceFiles.Count) C/C++ source files." +}