aboutsummaryrefslogtreecommitdiff
path: root/src/platform/graphics/cairo/PangoTextLayout.cpp
blob: 9f43af112ba7233ef9aabcd20be5bd3cf0a17202 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
#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"

namespace cru::platform::graphics::cairo {
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() { g_object_unref(pango_layout_); }

String PangoTextLayout::GetText() { return text_; }

void PangoTextLayout::SetText(String new_text) {
  text_ = std::move(new_text);
  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_; }

void PangoTextLayout::SetFont(std::shared_ptr<IFont> font) {
  Expects(font);
  font_ = CheckPlatform<PangoFont>(font, GetPlatformId());
  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