aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-06-06 11:27:39 +0800
committercrupest <crupest@outlook.com>2022-06-06 11:27:39 +0800
commit3035bafa40f0814c4a780e38ef37256e3506838a (patch)
tree36eb36dd2afce8a1e8fade4d29592d78acb483bc
parenta49064e065eef5de51ba188f691c610dd0a9fcaf (diff)
downloadcru-3035bafa40f0814c4a780e38ef37256e3506838a.tar.gz
cru-3035bafa40f0814c4a780e38ef37256e3506838a.tar.bz2
cru-3035bafa40f0814c4a780e38ef37256e3506838a.zip
...
-rw-r--r--include/cru/platform/graphics/cairo/CairoGraphicsFactory.h4
-rw-r--r--include/cru/platform/graphics/cairo/PangoTextLayout.h8
-rw-r--r--src/platform/graphics/cairo/CairoGraphicsFactory.cpp2
-rw-r--r--src/platform/graphics/cairo/PangoTextLayout.cpp32
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