aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-05-10 00:04:53 +0800
committercrupest <crupest@outlook.com>2022-05-10 00:04:53 +0800
commit350422ac613a4a5f1eb8ccf3893aa32150e89694 (patch)
treecc73d14874ae2a936f8cf48b29c0f19c1c25885e /src
parent3a60174667d7ff741ec4a90c3b5cfcc6fd2fd024 (diff)
downloadcru-350422ac613a4a5f1eb8ccf3893aa32150e89694.tar.gz
cru-350422ac613a4a5f1eb8ccf3893aa32150e89694.tar.bz2
cru-350422ac613a4a5f1eb8ccf3893aa32150e89694.zip
...
Diffstat (limited to 'src')
-rw-r--r--src/win/graphics/direct/Image.cpp4
-rw-r--r--src/win/graphics/direct/ImageFactory.cpp51
2 files changed, 27 insertions, 28 deletions
diff --git a/src/win/graphics/direct/Image.cpp b/src/win/graphics/direct/Image.cpp
index 855098d7..c8230fd5 100644
--- a/src/win/graphics/direct/Image.cpp
+++ b/src/win/graphics/direct/Image.cpp
@@ -9,7 +9,9 @@ namespace cru::platform::graphics::win::direct {
Direct2DImage::Direct2DImage(DirectGraphicsFactory* graphics_factory,
Microsoft::WRL::ComPtr<ID2D1Bitmap1> d2d_bitmap)
: DirectGraphicsResource(graphics_factory),
- d2d_bitmap_(std::move(d2d_bitmap)) {}
+ d2d_bitmap_(std::move(d2d_bitmap)) {
+ Expects(d2d_bitmap_);
+}
Direct2DImage::~Direct2DImage() {}
diff --git a/src/win/graphics/direct/ImageFactory.cpp b/src/win/graphics/direct/ImageFactory.cpp
index 9a90bdca..26e84ae4 100644
--- a/src/win/graphics/direct/ImageFactory.cpp
+++ b/src/win/graphics/direct/ImageFactory.cpp
@@ -10,6 +10,7 @@
#include <d2d1_1helper.h>
#include <d2d1helper.h>
#include <dcommon.h>
+#include <dxgiformat.h>
#include <wincodec.h>
#include <wrl/client.h>
@@ -48,7 +49,7 @@ std::unique_ptr<IImage> WinImageFactory::DecodeFromStream(io::Stream* stream) {
d2d_context->CreateBitmapFromWicBitmap(
wic_bitmap_frame_decode.Get(),
D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_TARGET,
- D2D1::PixelFormat(DXGI_FORMAT_R8G8B8A8_UINT,
+ D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
D2D1_ALPHA_MODE_PREMULTIPLIED)),
&d2d_image);
@@ -81,6 +82,24 @@ void WinImageFactory::EncodeToStream(IImage* image, io::Stream* stream,
Microsoft::WRL::ComPtr<IStream> com_stream(
platform::win::ConvertStreamToComStream(stream));
+ auto d2d_bitmap = direct_image->GetD2DBitmap();
+ auto size = d2d_bitmap->GetSize();
+ FLOAT dpi_x, dpi_y;
+ d2d_bitmap->GetDpi(&dpi_x, &dpi_y);
+ auto pixel_format = d2d_bitmap->GetPixelFormat();
+ Ensures(pixel_format.format == DXGI_FORMAT_B8G8R8A8_UNORM);
+ Ensures(pixel_format.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED);
+
+ D2D1_MAPPED_RECT mapped_rect;
+ ThrowIfFailed(d2d_bitmap->Map(D2D1_MAP_OPTIONS_READ, &mapped_rect));
+
+ Microsoft::WRL::ComPtr<IWICBitmap> wic_bitmap;
+ ThrowIfFailed(wic_imaging_factory_->CreateBitmapFromMemory(
+ size.width, size.height, GUID_WICPixelFormat32bppPBGRA, mapped_rect.pitch,
+ mapped_rect.pitch * size.height, mapped_rect.bits, &wic_bitmap));
+
+ ThrowIfFailed(d2d_bitmap->Unmap());
+
Microsoft::WRL::ComPtr<IWICBitmapEncoder> wic_bitmap_encoder;
ThrowIfFailed(wic_imaging_factory_->CreateEncoder(
@@ -105,30 +124,8 @@ void WinImageFactory::EncodeToStream(IImage* image, io::Stream* stream,
}
ThrowIfFailed(wic_bitmap_frame_encode->Initialize(property_bag.Get()));
-
- auto d2d_bitmap = direct_image->GetD2DBitmap();
- auto size = d2d_bitmap->GetSize();
- FLOAT dpi_x, dpi_y;
- d2d_bitmap->GetDpi(&dpi_x, &dpi_y);
- auto pixel_format = d2d_bitmap->GetPixelFormat();
- Ensures(pixel_format.format == DXGI_FORMAT_R8G8B8A8_UINT);
- Ensures(pixel_format.alphaMode == D2D1_ALPHA_MODE_PREMULTIPLIED);
-
- ThrowIfFailed(wic_bitmap_frame_encode->SetSize(size.width, size.height));
ThrowIfFailed(wic_bitmap_frame_encode->SetResolution(dpi_x, dpi_y));
-
- GUID wic_pixel_format = GUID_WICPixelFormat32bppPRGBA;
- ThrowIfFailed(wic_bitmap_frame_encode->SetPixelFormat(&wic_pixel_format));
-
- D2D1_MAPPED_RECT mapped_rect;
- ThrowIfFailed(d2d_bitmap->Map(D2D1_MAP_OPTIONS_READ, &mapped_rect));
-
- ThrowIfFailed(wic_bitmap_frame_encode->WritePixels(
- size.height, mapped_rect.pitch, size.height * mapped_rect.pitch,
- mapped_rect.bits));
-
- ThrowIfFailed(d2d_bitmap->Unmap());
-
+ ThrowIfFailed(wic_bitmap_frame_encode->WriteSource(wic_bitmap.Get(), NULL));
ThrowIfFailed(wic_bitmap_frame_encode->Commit());
ThrowIfFailed(wic_bitmap_encoder->Commit());
@@ -143,12 +140,12 @@ std::unique_ptr<IImage> WinImageFactory::CreateBitmap(int width, int height) {
Microsoft::WRL::ComPtr<ID2D1Bitmap1> bitmap;
auto d2d_context = graphics_factory->GetDefaultD2D1DeviceContext();
- d2d_context->CreateBitmap(
+ ThrowIfFailed(d2d_context->CreateBitmap(
D2D1::SizeU(width, height), nullptr, 0,
D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_TARGET,
- D2D1::PixelFormat(DXGI_FORMAT_R8G8B8A8_UINT,
+ D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM,
D2D1_ALPHA_MODE_PREMULTIPLIED)),
- &bitmap);
+ &bitmap));
return std::make_unique<Direct2DImage>(graphics_factory, std::move(bitmap));
}