aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/win/graphics/direct/Image.cpp7
-rw-r--r--src/win/graphics/direct/ImageFactory.cpp20
-rw-r--r--src/win/graphics/direct/Painter.cpp17
-rw-r--r--src/win/graphics/direct/WindowPainter.cpp11
4 files changed, 46 insertions, 9 deletions
diff --git a/src/win/graphics/direct/Image.cpp b/src/win/graphics/direct/Image.cpp
index 11f5e763..855098d7 100644
--- a/src/win/graphics/direct/Image.cpp
+++ b/src/win/graphics/direct/Image.cpp
@@ -3,6 +3,7 @@
#include "cru/win/graphics/direct/ConvertUtil.h"
#include "cru/win/graphics/direct/Exception.h"
#include "cru/win/graphics/direct/Factory.h"
+#include "cru/win/graphics/direct/Painter.h"
namespace cru::platform::graphics::win::direct {
Direct2DImage::Direct2DImage(DirectGraphicsFactory* graphics_factory,
@@ -29,4 +30,10 @@ std::unique_ptr<IImage> Direct2DImage::CreateWithRect(const Rect& rect) {
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::win::direct
diff --git a/src/win/graphics/direct/ImageFactory.cpp b/src/win/graphics/direct/ImageFactory.cpp
index e7794aa5..76694e30 100644
--- a/src/win/graphics/direct/ImageFactory.cpp
+++ b/src/win/graphics/direct/ImageFactory.cpp
@@ -1,4 +1,5 @@
#include "cru/win/graphics/direct/ImageFactory.h"
+#include "cru/common/platform/win/Exception.h"
#include "cru/common/platform/win/StreamConvert.h"
#include "cru/win/graphics/direct/Exception.h"
#include "cru/win/graphics/direct/Factory.h"
@@ -42,4 +43,23 @@ std::unique_ptr<IImage> WinImageFactory::DecodeFromStream(io::Stream* stream) {
return std::make_unique<Direct2DImage>(graphics_factory_,
std::move(d2d_image));
}
+
+std::unique_ptr<IImage> WinImageFactory::CreateBitmap(int width, int height) {
+ if (width <= 0) throw Exception(u"Bitmap width must be greater than 0.");
+ if (height <= 0) throw Exception(u"Bitmap height must be greater than 0.");
+
+ Microsoft::WRL::ComPtr<ID2D1Bitmap> bitmap;
+
+ auto d2d_context = graphics_factory_->GetDefaultD2D1DeviceContext();
+ d2d_context->CreateBitmap(
+ D2D1::SizeU(width, height),
+ D2D1::BitmapProperties(D2D1::PixelFormat(DXGI_FORMAT_R8G8B8A8_TYPELESS,
+ D2D1_ALPHA_MODE_STRAIGHT)),
+ &bitmap);
+
+ Microsoft::WRL::ComPtr<ID2D1Bitmap1> bitmap1;
+ ThrowIfFailed(bitmap.As(&bitmap1), "Failed to convert bitmap to bitmap1.");
+
+ return std::make_unique<Direct2DImage>(graphics_factory_, std::move(bitmap1));
+}
} // namespace cru::platform::graphics::win::direct
diff --git a/src/win/graphics/direct/Painter.cpp b/src/win/graphics/direct/Painter.cpp
index 32386877..3e8bd5c1 100644
--- a/src/win/graphics/direct/Painter.cpp
+++ b/src/win/graphics/direct/Painter.cpp
@@ -1,5 +1,6 @@
#include "cru/win/graphics/direct/Painter.h"
+#include "cru/common/log/Logger.h"
#include "cru/platform/Check.h"
#include "cru/win/graphics/direct/Brush.h"
#include "cru/win/graphics/direct/ConvertUtil.h"
@@ -12,9 +13,22 @@
namespace cru::platform::graphics::win::direct {
D2DDeviceContextPainter::D2DDeviceContextPainter(
- ID2D1DeviceContext1* device_context) {
+ ID2D1DeviceContext1* device_context, bool release) {
Expects(device_context);
device_context_ = device_context;
+ release_ = release;
+ device_context->BeginDraw();
+}
+
+D2DDeviceContextPainter::~D2DDeviceContextPainter() {
+ if (is_drawing_) {
+ CRU_LOG_INFO(u"You may forget to call EndDraw before destroying painter.");
+ }
+
+ if (release_) {
+ device_context_->Release();
+ device_context_ = nullptr;
+ }
}
platform::Matrix D2DDeviceContextPainter::GetTransform() {
@@ -155,6 +169,7 @@ void D2DDeviceContextPainter::PopState() {
void D2DDeviceContextPainter::EndDraw() {
if (is_drawing_) {
is_drawing_ = false;
+ ThrowIfFailed(device_context_->EndDraw());
DoEndDraw();
}
}
diff --git a/src/win/graphics/direct/WindowPainter.cpp b/src/win/graphics/direct/WindowPainter.cpp
index 0f78119e..c0808887 100644
--- a/src/win/graphics/direct/WindowPainter.cpp
+++ b/src/win/graphics/direct/WindowPainter.cpp
@@ -7,14 +7,9 @@
namespace cru::platform::graphics::win::direct {
D2DWindowPainter::D2DWindowPainter(D2DWindowRenderTarget* render_target)
: D2DDeviceContextPainter(render_target->GetD2D1DeviceContext()),
- render_target_(render_target) {
- render_target_->GetD2D1DeviceContext()->BeginDraw();
-}
+ render_target_(render_target) {}
-D2DWindowPainter::~D2DWindowPainter() { EndDraw(); }
+D2DWindowPainter::~D2DWindowPainter() {}
-void D2DWindowPainter::DoEndDraw() {
- ThrowIfFailed(render_target_->GetD2D1DeviceContext()->EndDraw());
- render_target_->Present();
-}
+void D2DWindowPainter::DoEndDraw() { render_target_->Present(); }
} // namespace cru::platform::graphics::win::direct