From 8c814ce89fcfe67c338ab909206a74c0716d388c Mon Sep 17 00:00:00 2001 From: jmsgrogan Date: Wed, 11 Jan 2023 17:34:40 +0000 Subject: [PATCH] Initial WIC image writing. --- src/image/PlatformImageWriter.h | 12 +++++++ src/image/png/PngWriter.cpp | 16 +++++++++ src/image/png/PngWriter.h | 2 ++ src/image/win32/Win32WicImageWriter.cpp | 38 +++++++++++++++++++++ src/image/win32/Win32WicImageWriter.h | 5 +-- test/graphics/TestD2dOffScreenRendering.cpp | 2 +- 6 files changed, 72 insertions(+), 3 deletions(-) diff --git a/src/image/PlatformImageWriter.h b/src/image/PlatformImageWriter.h index 71a5bcb..7f315b1 100644 --- a/src/image/PlatformImageWriter.h +++ b/src/image/PlatformImageWriter.h @@ -1,6 +1,18 @@ #pragma once +#include + +using Path = std::filesystem::path; + +class Image; + class PlatformImageWriter { +public: + enum class ImgFormat + { + PNG + }; + virtual void write(const Path& path, Image* image, ImgFormat format = ImgFormat::PNG) = 0; }; \ No newline at end of file diff --git a/src/image/png/PngWriter.cpp b/src/image/png/PngWriter.cpp index 6ae31c1..b2b4cc5 100644 --- a/src/image/png/PngWriter.cpp +++ b/src/image/png/PngWriter.cpp @@ -15,6 +15,10 @@ #include "ByteUtils.h" +#ifdef _WIN32 +#include "Win32WicImageWriter.h" +#endif + #include PngWriter::PngWriter() @@ -157,8 +161,20 @@ void PngWriter::writeDataChunks(const BufferBitStream& buffer) } } +void PngWriter::writePlatform(Image* image) +{ + mPlatformWriter = std::make_unique(); + mPlatformWriter->write(mPath, image, PlatformImageWriter::ImgFormat::PNG); +} + void PngWriter::write(Image* image) { + if (image->getPlatformImage()) + { + writePlatform(image); + return; + } + if (!mPath.empty()) { mWorkingFile = std::make_unique(mPath); diff --git a/src/image/png/PngWriter.h b/src/image/png/PngWriter.h index 1532896..d149c08 100644 --- a/src/image/png/PngWriter.h +++ b/src/image/png/PngWriter.h @@ -33,6 +33,8 @@ public: void write(Image* image); private: + void writePlatform(Image* image); + void writeSignature(); void writeHeader(); diff --git a/src/image/win32/Win32WicImageWriter.cpp b/src/image/win32/Win32WicImageWriter.cpp index 720986d..d532045 100644 --- a/src/image/win32/Win32WicImageWriter.cpp +++ b/src/image/win32/Win32WicImageWriter.cpp @@ -1,2 +1,40 @@ #include "Win32WicImageWriter.h" +#include "Image.h" +#include "Win32WicInterface.h" +#include "Win32WicImage.h" +#include "StringUtils.h" + +#include +#include + +void Win32WicImageWriter::write(const Path& path, Image* image, ImgFormat format ) +{ + Win32WicInterface wic_interface; + + Microsoft::WRL::ComPtr pStream; + auto hr = wic_interface.getFactory()->CreateStream(&pStream); + + hr = pStream->InitializeFromFilename(path.wstring().c_str(), GENERIC_WRITE); + + Microsoft::WRL::ComPtr pEncoder; + hr = wic_interface.getFactory()->CreateEncoder(GUID_ContainerFormatPng, NULL, &pEncoder); + + hr = pEncoder->Initialize(pStream.Get(), WICBitmapEncoderNoCache); + + Microsoft::WRL::ComPtr pFrameEncode; + hr = pEncoder->CreateNewFrame(&pFrameEncode, NULL); + + hr = pFrameEncode->Initialize(NULL); + + hr = pFrameEncode->SetSize(image->getWidth(), image->getHeight()); + + WICPixelFormatGUID out_format = GUID_WICPixelFormatDontCare; + hr = pFrameEncode->SetPixelFormat(&out_format); + + hr = pFrameEncode->WriteSource(dynamic_cast(image->getPlatformImage())->getBitmap(), NULL); + + hr = pFrameEncode->Commit(); + + hr = pEncoder->Commit(); +} diff --git a/src/image/win32/Win32WicImageWriter.h b/src/image/win32/Win32WicImageWriter.h index 6d775f9..4d683c9 100644 --- a/src/image/win32/Win32WicImageWriter.h +++ b/src/image/win32/Win32WicImageWriter.h @@ -2,7 +2,8 @@ #include "PlatformImageWriter.h" -class Win32WicImageWriter +class Win32WicImageWriter : public PlatformImageWriter { - +public: + void write(const Path& path, Image* image, ImgFormat format = ImgFormat::PNG) override; }; \ No newline at end of file diff --git a/test/graphics/TestD2dOffScreenRendering.cpp b/test/graphics/TestD2dOffScreenRendering.cpp index 08930fb..8635986 100644 --- a/test/graphics/TestD2dOffScreenRendering.cpp +++ b/test/graphics/TestD2dOffScreenRendering.cpp @@ -33,5 +33,5 @@ TEST_CASE(TestD2dOffScreenRendering, "graphics") PngWriter writer; writer.setPath(TestUtils::getTestOutputDir(__FILE__) / "out.png"); - //writer.write(image); + writer.write(image); }; \ No newline at end of file