diff options
author | crupest <crupest@outlook.com> | 2022-05-24 23:14:45 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-05-24 23:14:45 +0800 |
commit | ad4f06c133dc0475ef6a98cac0fa97f6e0527bf1 (patch) | |
tree | 63b07dc8674afd7ec99380e121eca0f1762ae11e | |
parent | ae0694c91602fa1cd278394132bc1320c00deba8 (diff) | |
download | cru-ad4f06c133dc0475ef6a98cac0fa97f6e0527bf1.tar.gz cru-ad4f06c133dc0475ef6a98cac0fa97f6e0527bf1.tar.bz2 cru-ad4f06c133dc0475ef6a98cac0fa97f6e0527bf1.zip |
...
-rw-r--r-- | include/cru/platform/graphics/cairo/Base.h | 10 | ||||
-rw-r--r-- | include/cru/platform/graphics/cairo/CairoGeometry.h | 4 | ||||
-rw-r--r-- | src/platform/graphics/cairo/Base.cpp | 18 | ||||
-rw-r--r-- | src/platform/graphics/cairo/CMakeLists.txt | 3 | ||||
-rw-r--r-- | src/platform/graphics/cairo/CairoGeometry.cpp | 6 | ||||
-rw-r--r-- | test/platform/CMakeLists.txt | 4 | ||||
-rw-r--r-- | test/platform/graphics/cairo/BaseTest.cpp | 40 | ||||
-rw-r--r-- | test/platform/graphics/cairo/CMakeLists.txt | 6 |
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) |