aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/cru/platform/graphics/cairo/Base.h10
-rw-r--r--include/cru/platform/graphics/cairo/CairoGeometry.h4
-rw-r--r--src/platform/graphics/cairo/Base.cpp18
-rw-r--r--src/platform/graphics/cairo/CMakeLists.txt3
-rw-r--r--src/platform/graphics/cairo/CairoGeometry.cpp6
-rw-r--r--test/platform/CMakeLists.txt4
-rw-r--r--test/platform/graphics/cairo/BaseTest.cpp40
-rw-r--r--test/platform/graphics/cairo/CMakeLists.txt6
8 files changed, 87 insertions, 4 deletions
diff --git a/include/cru/platform/graphics/cairo/Base.h b/include/cru/platform/graphics/cairo/Base.h
index 7e8eeaa1..a776f90c 100644
--- a/include/cru/platform/graphics/cairo/Base.h
+++ b/include/cru/platform/graphics/cairo/Base.h
@@ -9,3 +9,13 @@
#else
#define CRU_PLATFORM_GRAPHICS_CAIRO_API
#endif
+
+#include <cairo/cairo.h>
+
+#include "../Base.h"
+
+namespace cru::platform::graphics::cairo {
+cairo_matrix_t CRU_PLATFORM_GRAPHICS_CAIRO_API Convert(const Matrix& matrix);
+Matrix CRU_PLATFORM_GRAPHICS_CAIRO_API Convert(const cairo_matrix_t* matrix);
+Matrix CRU_PLATFORM_GRAPHICS_CAIRO_API Convert(const cairo_matrix_t& matrix);
+} // namespace cru::platform::graphics::cairo
diff --git a/include/cru/platform/graphics/cairo/CairoGeometry.h b/include/cru/platform/graphics/cairo/CairoGeometry.h
index 0ddedba4..f8391670 100644
--- a/include/cru/platform/graphics/cairo/CairoGeometry.h
+++ b/include/cru/platform/graphics/cairo/CairoGeometry.h
@@ -9,7 +9,8 @@ class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGeometry : public CairoResource,
public virtual IGeometry {
public:
CairoGeometry(CairoGraphicsFactory* factory, cairo_path_t* cairo_path,
- bool auto_destroy);
+ const Matrix& transform = Matrix::Identity(),
+ bool auto_destroy = true);
~CairoGeometry();
bool FillContains(const Point& point) override;
@@ -21,6 +22,7 @@ class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGeometry : public CairoResource,
private:
cairo_path_t* cairo_path_;
+ Matrix transform_;
bool auto_destroy_;
};
diff --git a/src/platform/graphics/cairo/Base.cpp b/src/platform/graphics/cairo/Base.cpp
new file mode 100644
index 00000000..3e24efc9
--- /dev/null
+++ b/src/platform/graphics/cairo/Base.cpp
@@ -0,0 +1,18 @@
+#include "cru/platform/graphics/cairo/Base.h"
+#include <cairo/cairo.h>
+
+namespace cru::platform::graphics::cairo {
+cairo_matrix_t Convert(const Matrix& matrix) {
+ cairo_matrix_t m;
+ cairo_matrix_init(&m, matrix.m11, matrix.m12, matrix.m21, matrix.m22,
+ matrix.m31, matrix.m32);
+ return m;
+}
+
+Matrix Convert(const cairo_matrix_t* matrix) {
+ return Matrix(matrix->xx, matrix->yx, matrix->xy, matrix->yy, matrix->x0,
+ matrix->y0);
+}
+
+Matrix Convert(const cairo_matrix_t& matrix) { return Convert(&matrix); }
+} // namespace cru::platform::graphics::cairo
diff --git a/src/platform/graphics/cairo/CMakeLists.txt b/src/platform/graphics/cairo/CMakeLists.txt
index 0fa618a0..31fa46d2 100644
--- a/src/platform/graphics/cairo/CMakeLists.txt
+++ b/src/platform/graphics/cairo/CMakeLists.txt
@@ -3,11 +3,12 @@ if (UNIX)
find_library(LIB_PANGO NAMES pango pango-1.0 REQUIRED)
add_library(CruPlatformGraphicsCairo SHARED
+ Base.cpp
CairoBrush.cpp
CairoGeometry.cpp
CairoGraphicsFactory.cpp
CairoResource.cpp
)
target_compile_definitions(CruPlatformGraphicsCairo PRIVATE CRU_PLATFORM_GRAPHICS_CAIRO_EXPORT_API)
- target_link_libraries(CruPlatformGraphicsCairo PUBLIC CruPlatformGraphics PRIVATE ${LIB_CAIRO} ${LIB_PANGO})
+ target_link_libraries(CruPlatformGraphicsCairo PUBLIC CruPlatformGraphics PUBLIC ${LIB_CAIRO} ${LIB_PANGO})
endif()
diff --git a/src/platform/graphics/cairo/CairoGeometry.cpp b/src/platform/graphics/cairo/CairoGeometry.cpp
index 7abe273c..43ba08d8 100644
--- a/src/platform/graphics/cairo/CairoGeometry.cpp
+++ b/src/platform/graphics/cairo/CairoGeometry.cpp
@@ -3,9 +3,11 @@
namespace cru::platform::graphics::cairo {
CairoGeometry::CairoGeometry(CairoGraphicsFactory* factory,
- cairo_path_t* cairo_path, bool auto_destroy)
+ cairo_path_t* cairo_path, const Matrix& transform,
+ bool auto_destroy)
: CairoResource(factory),
cairo_path_(cairo_path),
+ transform_(transform),
auto_destroy_(auto_destroy) {
Expects(cairo_path);
}
@@ -39,7 +41,7 @@ Rect CairoGeometry::GetBounds() {
}
std::unique_ptr<IGeometry> CairoGeometry::Transform(const Matrix& matrix) {
- throw Exception(u"Not implemented");
+
}
std::unique_ptr<IGeometry> CairoGeometry::CreateStrokeGeometry(float width) {
diff --git a/test/platform/CMakeLists.txt b/test/platform/CMakeLists.txt
index 5116d54d..01f6966b 100644
--- a/test/platform/CMakeLists.txt
+++ b/test/platform/CMakeLists.txt
@@ -8,4 +8,8 @@ if (WIN32)
add_subdirectory(graphics/direct2d)
endif()
+if (UNIX)
+ add_subdirectory(graphics/cairo)
+endif()
+
catch_discover_tests(CruPlatformBaseTest)
diff --git a/test/platform/graphics/cairo/BaseTest.cpp b/test/platform/graphics/cairo/BaseTest.cpp
new file mode 100644
index 00000000..29e53ff0
--- /dev/null
+++ b/test/platform/graphics/cairo/BaseTest.cpp
@@ -0,0 +1,40 @@
+#include "cru/platform/graphics/cairo/Base.h"
+
+#include <cairo/cairo.h>
+#include <catch2/catch_test_macros.hpp>
+#include "catch2/catch_approx.hpp"
+
+using Catch::Approx;
+
+TEST_CASE("Cairo Matrix Convert", "[matrix]") {
+ using namespace cru::platform;
+ using namespace cru::platform::graphics;
+ using namespace cru::platform::graphics::cairo;
+
+ SECTION("Cairo to cru should work") {
+ cairo_matrix_t cairo_matrix;
+ cairo_matrix_init_identity(&cairo_matrix);
+ cairo_matrix_scale(&cairo_matrix, 2, 2);
+ cairo_matrix_rotate(&cairo_matrix, 1);
+ cairo_matrix_translate(&cairo_matrix, 10, 10);
+ auto cru_matrix = Convert(cairo_matrix);
+ Point original_point(3, 5);
+ double cairo_point_x = original_point.x, cairo_point_y = original_point.y;
+ cairo_matrix_transform_point(&cairo_matrix, &cairo_point_x, &cairo_point_y);
+ Point cru_point = cru_matrix.TransformPoint(original_point);
+ REQUIRE(Approx(cru_point.x) == cairo_point_x);
+ REQUIRE(Approx(cru_point.y) == cairo_point_y);
+ }
+
+ SECTION("Cru to cairo should work") {
+ auto cru_matrix = Matrix::Identity() * Matrix::Scale(2, 2) *
+ Matrix::Rotation(60) * Matrix::Translation(10, 10);
+ cairo_matrix_t cairo_matrix = Convert(cru_matrix);
+ Point original_point(3, 5);
+ double cairo_point_x = original_point.x, cairo_point_y = original_point.y;
+ cairo_matrix_transform_point(&cairo_matrix, &cairo_point_x, &cairo_point_y);
+ Point cru_point = cru_matrix.TransformPoint(original_point);
+ REQUIRE(Approx(cru_point.x) == cairo_point_x);
+ REQUIRE(Approx(cru_point.y) == cairo_point_y);
+ }
+}
diff --git a/test/platform/graphics/cairo/CMakeLists.txt b/test/platform/graphics/cairo/CMakeLists.txt
new file mode 100644
index 00000000..5d055aa2
--- /dev/null
+++ b/test/platform/graphics/cairo/CMakeLists.txt
@@ -0,0 +1,6 @@
+add_executable(CruPlatformGraphicsCairoTest
+ BaseTest.cpp
+)
+target_link_libraries(CruPlatformGraphicsCairoTest PRIVATE CruPlatformGraphicsCairo CruTestBase)
+
+catch_discover_tests(CruPlatformGraphicsCairoTest)