aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-03-02 19:51:06 +0800
committercrupest <crupest@outlook.com>2022-03-02 19:51:06 +0800
commit7adfe813c23d20abe936aa0624fd68e0112717b3 (patch)
tree295e52ea32dcc9716beaefbc02489c946de5ecd6 /src
parent3e11b954a73d4718750b130abd6f511e624ffce7 (diff)
downloadcru-7adfe813c23d20abe936aa0624fd68e0112717b3.tar.gz
cru-7adfe813c23d20abe936aa0624fd68e0112717b3.tar.bz2
cru-7adfe813c23d20abe936aa0624fd68e0112717b3.zip
...
Diffstat (limited to 'src')
-rw-r--r--src/win/graphics/direct/Geometry.cpp31
1 files changed, 30 insertions, 1 deletions
diff --git a/src/win/graphics/direct/Geometry.cpp b/src/win/graphics/direct/Geometry.cpp
index b59cdf61..bb7ea06a 100644
--- a/src/win/graphics/direct/Geometry.cpp
+++ b/src/win/graphics/direct/Geometry.cpp
@@ -2,6 +2,7 @@
#include <d2d1.h>
#include <d2d1helper.h>
+#include "cru/common/platform/win/Exception.h"
#include "cru/win/graphics/direct/ConvertUtil.h"
#include "cru/win/graphics/direct/Exception.h"
#include "cru/win/graphics/direct/Factory.h"
@@ -83,7 +84,7 @@ std::unique_ptr<IGeometry> D2DGeometryBuilder::Build() {
}
D2DGeometry::D2DGeometry(DirectGraphicsFactory* factory,
- Microsoft::WRL::ComPtr<ID2D1PathGeometry> geometry)
+ Microsoft::WRL::ComPtr<ID2D1Geometry> geometry)
: DirectGraphicsResource(factory), geometry_(std::move(geometry)) {}
bool D2DGeometry::FillContains(const Point& point) {
@@ -92,4 +93,32 @@ bool D2DGeometry::FillContains(const Point& point) {
Convert(point), D2D1::Matrix3x2F::Identity(), &result));
return result != 0;
}
+
+Rect D2DGeometry::GetBounds() {
+ D2D1_RECT_F bounds;
+ ThrowIfFailed(geometry_->GetBounds(D2D1::Matrix3x2F::Identity(), &bounds));
+ return Convert(bounds);
+}
+
+std::unique_ptr<IGeometry> D2DGeometry::Transform(const Matrix& matrix) {
+ Microsoft::WRL::ComPtr<ID2D1TransformedGeometry> d2d1_geometry;
+ ThrowIfFailed(GetDirectFactory()->GetD2D1Factory()->CreateTransformedGeometry(
+ geometry_.Get(), Convert(matrix), &d2d1_geometry));
+ return std::make_unique<D2DGeometry>(GetDirectFactory(),
+ std::move(d2d1_geometry));
+}
+
+std::unique_ptr<IGeometry> D2DGeometry::CreateStrokeGeometry(float width) {
+ Microsoft::WRL::ComPtr<ID2D1PathGeometry> d2d1_geometry;
+ ThrowIfFailed(
+ GetDirectFactory()->GetD2D1Factory()->CreatePathGeometry(&d2d1_geometry));
+ Microsoft::WRL::ComPtr<ID2D1GeometrySink> d2d1_geometry_sink;
+ ThrowIfFailed(d2d1_geometry->Open(&d2d1_geometry_sink));
+ ThrowIfFailed(
+ geometry_->Widen(width, nullptr, nullptr, d2d1_geometry_sink.Get()));
+ d2d1_geometry_sink->Close();
+
+ return std::make_unique<D2DGeometry>(GetDirectFactory(),
+ std::move(d2d1_geometry));
+}
} // namespace cru::platform::graphics::win::direct