aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorcrupest <crupest@outlook.com>2022-06-07 20:12:46 +0800
committercrupest <crupest@outlook.com>2022-06-07 20:12:46 +0800
commitb922e4271166c9edf034109a42d403a147f0720d (patch)
tree43ff48592c6057daec3b01bb95e513d0579c0ace
parent3035bafa40f0814c4a780e38ef37256e3506838a (diff)
downloadcru-b922e4271166c9edf034109a42d403a147f0720d.tar.gz
cru-b922e4271166c9edf034109a42d403a147f0720d.tar.bz2
cru-b922e4271166c9edf034109a42d403a147f0720d.zip
...
-rw-r--r--include/cru/platform/graphics/cairo/PangoTextLayout.h8
-rw-r--r--src/platform/graphics/cairo/PangoTextLayout.cpp58
2 files changed, 64 insertions, 2 deletions
diff --git a/include/cru/platform/graphics/cairo/PangoTextLayout.h b/include/cru/platform/graphics/cairo/PangoTextLayout.h
index 3f3a67b5..7e2bb2a9 100644
--- a/include/cru/platform/graphics/cairo/PangoTextLayout.h
+++ b/include/cru/platform/graphics/cairo/PangoTextLayout.h
@@ -36,7 +36,15 @@ class PangoTextLayout : public CairoResource, public virtual ITextLayout {
TextHitTestResult HitTest(const Point& point) override;
private:
+ Index FromUtf8IndexToUtf16Index(Index index);
+ Index FromUtf16IndexToUtf8Index(Index index);
+
+ private:
String text_;
+ std::string utf8_text_;
+
+ bool edit_mode_ = false;
+
std::shared_ptr<PangoFont> font_;
PangoLayout* pango_layout_;
diff --git a/src/platform/graphics/cairo/PangoTextLayout.cpp b/src/platform/graphics/cairo/PangoTextLayout.cpp
index 2fcb9158..9f43af11 100644
--- a/src/platform/graphics/cairo/PangoTextLayout.cpp
+++ b/src/platform/graphics/cairo/PangoTextLayout.cpp
@@ -1,4 +1,5 @@
#include "cru/platform/graphics/cairo/PangoTextLayout.h"
+#include "cru/common/StringUtil.h"
#include "cru/platform/Check.h"
#include "cru/platform/graphics/cairo/CairoGraphicsFactory.h"
#include "cru/platform/graphics/cairo/PangoFont.h"
@@ -20,8 +21,8 @@ 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());
+ utf8_text_ = text_.ToUtf8();
+ pango_layout_set_text(pango_layout_, utf8_text_.c_str(), utf8_text_.size());
}
std::shared_ptr<IFont> PangoTextLayout::GetFont() { return font_; }
@@ -32,4 +33,57 @@ void PangoTextLayout::SetFont(std::shared_ptr<IFont> font) {
pango_layout_set_font_description(pango_layout_,
font_->GetPangoFontDescription());
}
+
+void PangoTextLayout::SetMaxWidth(float max_width) {
+ return pango_layout_set_width(pango_layout_, max_width);
+}
+
+void PangoTextLayout::SetMaxHeight(float max_height) {
+ return pango_layout_set_height(pango_layout_, max_height);
+}
+
+bool PangoTextLayout::IsEditMode() { return edit_mode_; }
+
+void PangoTextLayout::SetEditMode(bool enable) { edit_mode_ = enable; }
+
+Index PangoTextLayout::GetLineIndexFromCharIndex(Index char_index) {
+ int line;
+ pango_layout_index_to_line_x(pango_layout_,
+ FromUtf16IndexToUtf8Index(char_index), false,
+ &line, nullptr);
+ return line;
+}
+
+Index PangoTextLayout::GetLineCount() {
+ return pango_layout_get_line_count(pango_layout_);
+}
+
+float PangoTextLayout::GetLineHeight(Index line_index) {
+ auto line = pango_layout_get_line_readonly(pango_layout_, line_index);
+ int height;
+ pango_layout_line_get_height(line, &height);
+ return height;
+}
+
+Index PangoTextLayout::FromUtf8IndexToUtf16Index(Index index) {
+ Utf8CodePointIterator iter(utf8_text_.data(), utf8_text_.size());
+ int cp_count = 0;
+ while ((!iter.IsPastEnd()) && iter.GetPosition() < index) {
+ ++iter;
+ cp_count++;
+ }
+ return text_.IndexFromCodePointToCodeUnit(cp_count);
+}
+
+Index PangoTextLayout::FromUtf16IndexToUtf8Index(Index index) {
+ Index cp_index = text_.IndexFromCodeUnitToCodePoint(index);
+ Utf8CodePointIterator iter(utf8_text_.data(), utf8_text_.size());
+
+ for (Index i = 0; i < cp_index; ++i) {
+ ++iter;
+ }
+
+ return iter.GetPosition();
+}
+
} // namespace cru::platform::graphics::cairo