diff options
author | crupest <crupest@outlook.com> | 2022-06-06 11:27:39 +0800 |
---|---|---|
committer | crupest <crupest@outlook.com> | 2022-06-06 11:27:39 +0800 |
commit | 3035bafa40f0814c4a780e38ef37256e3506838a (patch) | |
tree | 36eb36dd2afce8a1e8fade4d29592d78acb483bc | |
parent | a49064e065eef5de51ba188f691c610dd0a9fcaf (diff) | |
download | cru-3035bafa40f0814c4a780e38ef37256e3506838a.tar.gz cru-3035bafa40f0814c4a780e38ef37256e3506838a.tar.bz2 cru-3035bafa40f0814c4a780e38ef37256e3506838a.zip |
...
4 files changed, 40 insertions, 6 deletions
diff --git a/include/cru/platform/graphics/cairo/CairoGraphicsFactory.h b/include/cru/platform/graphics/cairo/CairoGraphicsFactory.h index 280ea15f..6932f10a 100644 --- a/include/cru/platform/graphics/cairo/CairoGraphicsFactory.h +++ b/include/cru/platform/graphics/cairo/CairoGraphicsFactory.h @@ -17,11 +17,11 @@ class CRU_PLATFORM_GRAPHICS_CAIRO_API CairoGraphicsFactory public: cairo_surface_t* GetDefaultCairoSurface() { return default_cairo_surface_; } cairo_t* GetDefaultCairo() { return default_cairo_; } + PangoContext* GetDefaultPangoContext() { return default_pango_context_; } private: cairo_surface_t* default_cairo_surface_; cairo_t* default_cairo_; - - PangoContext* pango_context_; + PangoContext* default_pango_context_; }; } // namespace cru::platform::graphics::cairo diff --git a/include/cru/platform/graphics/cairo/PangoTextLayout.h b/include/cru/platform/graphics/cairo/PangoTextLayout.h index 992e5b4a..3f3a67b5 100644 --- a/include/cru/platform/graphics/cairo/PangoTextLayout.h +++ b/include/cru/platform/graphics/cairo/PangoTextLayout.h @@ -1,11 +1,14 @@ #pragma once #include "../TextLayout.h" #include "CairoResource.h" +#include "PangoFont.h" + +#include <pango/pango.h> namespace cru::platform::graphics::cairo { class PangoTextLayout : public CairoResource, public virtual ITextLayout { public: - explicit PangoTextLayout(CairoGraphicsFactory* factory); + PangoTextLayout(CairoGraphicsFactory* factory, std::shared_ptr<IFont> font); ~PangoTextLayout() override; @@ -34,5 +37,8 @@ class PangoTextLayout : public CairoResource, public virtual ITextLayout { private: String text_; + std::shared_ptr<PangoFont> font_; + + PangoLayout* pango_layout_; }; } // namespace cru::platform::graphics::cairo diff --git a/src/platform/graphics/cairo/CairoGraphicsFactory.cpp b/src/platform/graphics/cairo/CairoGraphicsFactory.cpp index f27ca2c4..1fea8979 100644 --- a/src/platform/graphics/cairo/CairoGraphicsFactory.cpp +++ b/src/platform/graphics/cairo/CairoGraphicsFactory.cpp @@ -6,9 +6,11 @@ CairoGraphicsFactory::CairoGraphicsFactory() : CairoResource(this) { default_cairo_surface_ = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 100, 100); default_cairo_ = cairo_create(default_cairo_surface_); + default_pango_context_ = pango_context_new(); } CairoGraphicsFactory::~CairoGraphicsFactory() { + g_object_unref(default_pango_context_); cairo_destroy(default_cairo_); cairo_surface_destroy(default_cairo_surface_); } diff --git a/src/platform/graphics/cairo/PangoTextLayout.cpp b/src/platform/graphics/cairo/PangoTextLayout.cpp index 65f2130e..2fcb9158 100644 --- a/src/platform/graphics/cairo/PangoTextLayout.cpp +++ b/src/platform/graphics/cairo/PangoTextLayout.cpp @@ -1,9 +1,35 @@ #include "cru/platform/graphics/cairo/PangoTextLayout.h" +#include "cru/platform/Check.h" +#include "cru/platform/graphics/cairo/CairoGraphicsFactory.h" +#include "cru/platform/graphics/cairo/PangoFont.h" namespace cru::platform::graphics::cairo { -PangoTextLayout::PangoTextLayout(CairoGraphicsFactory* factory) - : CairoResource(factory) {} +PangoTextLayout::PangoTextLayout(CairoGraphicsFactory* factory, + std::shared_ptr<IFont> font) + : CairoResource(factory) { + Expects(font); + font_ = CheckPlatform<PangoFont>(font, GetPlatformId()); + pango_layout_ = pango_layout_new(factory->GetDefaultPangoContext()); + pango_layout_set_font_description(pango_layout_, + font_->GetPangoFontDescription()); +}; -PangoTextLayout::~PangoTextLayout() {} +PangoTextLayout::~PangoTextLayout() { g_object_unref(pango_layout_); } +String PangoTextLayout::GetText() { return text_; } + +void PangoTextLayout::SetText(String new_text) { + text_ = std::move(new_text); + auto text_utf8 = text_.ToUtf8(); + pango_layout_set_text(pango_layout_, text_utf8.c_str(), text_utf8.size()); +} + +std::shared_ptr<IFont> PangoTextLayout::GetFont() { return font_; } + +void PangoTextLayout::SetFont(std::shared_ptr<IFont> font) { + Expects(font); + font_ = CheckPlatform<PangoFont>(font, GetPlatformId()); + pango_layout_set_font_description(pango_layout_, + font_->GetPangoFontDescription()); +} } // namespace cru::platform::graphics::cairo |