diff options
author | crupest <crupest@outlook.com> | 2022-05-15 13:56:40 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-05-15 13:56:40 +0800 |
commit | 9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752 (patch) | |
tree | 7342f6991771fa31b16fd6a5ed892ff6025f3d05 /src/platform/graphics/direct2d/Image.cpp | |
parent | 41de54bad2c0f857821fcc83f41af3334d068b6d (diff) | |
download | cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.gz cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.tar.bz2 cru-9e0c9d3499bc50c3534b4dc500d8b5d0b5f22752.zip |
...
Diffstat (limited to 'src/platform/graphics/direct2d/Image.cpp')
-rw-r--r-- | src/platform/graphics/direct2d/Image.cpp | 45 |
1 files changed, 45 insertions, 0 deletions
diff --git a/src/platform/graphics/direct2d/Image.cpp b/src/platform/graphics/direct2d/Image.cpp new file mode 100644 index 00000000..78cccd6a --- /dev/null +++ b/src/platform/graphics/direct2d/Image.cpp @@ -0,0 +1,45 @@ +#include "cru/platform/graphics/direct2d/Image.h" +#include <d2d1_1.h> +#include "cru/common/platform/win/Exception.h" +#include "cru/platform/graphics/direct2d/ConvertUtil.h" +#include "cru/platform/graphics/direct2d/Exception.h" +#include "cru/platform/graphics/direct2d/Factory.h" +#include "cru/platform/graphics/direct2d/Painter.h" + +namespace cru::platform::graphics::direct2d { +Direct2DImage::Direct2DImage(DirectGraphicsFactory* graphics_factory, + Microsoft::WRL::ComPtr<ID2D1Bitmap1> d2d_bitmap) + : DirectGraphicsResource(graphics_factory), + d2d_bitmap_(std::move(d2d_bitmap)) { + Expects(d2d_bitmap_); +} + +Direct2DImage::~Direct2DImage() {} + +float Direct2DImage::GetWidth() { return d2d_bitmap_->GetSize().width; } + +float Direct2DImage::GetHeight() { return d2d_bitmap_->GetSize().height; } + +std::unique_ptr<IImage> Direct2DImage::CreateWithRect(const Rect& rect) { + auto device_context = GetDirectFactory()->CreateD2D1DeviceContext(); + Microsoft::WRL::ComPtr<ID2D1Bitmap1> bitmap; + ThrowIfFailed(device_context->CreateBitmap( + D2D1::SizeU(rect.width, rect.height), nullptr, 0, + D2D1::BitmapProperties1(D2D1_BITMAP_OPTIONS_TARGET, + D2D1::PixelFormat(DXGI_FORMAT_B8G8R8A8_UNORM, + D2D1_ALPHA_MODE_PREMULTIPLIED)), + &bitmap)); + device_context->SetTarget(bitmap.Get()); + device_context->BeginDraw(); + device_context->DrawBitmap(d2d_bitmap_.Get(), Convert(rect)); + ThrowIfFailed(device_context->EndDraw()); + return std::make_unique<Direct2DImage>(GetDirectFactory(), std::move(bitmap)); +} + +std::unique_ptr<IPainter> Direct2DImage::CreatePainter() { + auto device_context = GetDirectFactory()->CreateD2D1DeviceContext(); + device_context->SetTarget(d2d_bitmap_.Get()); + return std::make_unique<D2DDeviceContextPainter>(device_context.Detach(), + true); +} +} // namespace cru::platform::graphics::direct2d |