diff options
Diffstat (limited to 'src/win/graphics/direct/Image.cpp')
-rw-r--r-- | src/win/graphics/direct/Image.cpp | 31 |
1 files changed, 24 insertions, 7 deletions
diff --git a/src/win/graphics/direct/Image.cpp b/src/win/graphics/direct/Image.cpp index 46b763be..d09a7016 100644 --- a/src/win/graphics/direct/Image.cpp +++ b/src/win/graphics/direct/Image.cpp @@ -1,15 +1,32 @@ #include "cru/win/graphics/direct/Image.hpp" +#include "cru/common/platform/win/Exception.hpp" +#include "cru/win/graphics/direct/ConvertUtil.hpp" +#include "cru/win/graphics/direct/Exception.hpp" +#include "cru/win/graphics/direct/Factory.hpp" namespace cru::platform::graphics::win::direct { Direct2DImage::Direct2DImage(DirectGraphicsFactory* graphics_factory, - ID2D1Image* d2d_image, bool auto_release) + Microsoft::WRL::ComPtr<ID2D1Bitmap1> d2d_bitmap) : DirectGraphicsResource(graphics_factory), - d2d_image_(d2d_image), - auto_release_(auto_release) {} + d2d_bitmap_(std::move(d2d_bitmap)) {} -Direct2DImage::~Direct2DImage() { - if (auto_release_) { - d2d_image_->Release(); - } +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), &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)); } + } // namespace cru::platform::graphics::win::direct |