aboutsummaryrefslogtreecommitdiff
path: root/src/platform/graphics
diff options
context:
space:
mode:
Diffstat (limited to 'src/platform/graphics')
-rw-r--r--src/platform/graphics/cairo/CairoPainter.cpp2
-rw-r--r--src/platform/graphics/cairo/PangoFont.cpp2
-rw-r--r--src/platform/graphics/cairo/PangoTextLayout.cpp52
3 files changed, 39 insertions, 17 deletions
diff --git a/src/platform/graphics/cairo/CairoPainter.cpp b/src/platform/graphics/cairo/CairoPainter.cpp
index b9ab50c4..8dd214cc 100644
--- a/src/platform/graphics/cairo/CairoPainter.cpp
+++ b/src/platform/graphics/cairo/CairoPainter.cpp
@@ -186,6 +186,8 @@ void CairoPainter::DrawText(const Point& offset, ITextLayout* text_layout,
cairo_save(cairo_);
cairo_set_source(cairo_, cairo_pattern);
+ cairo_move_to(cairo_, offset.x, offset.y);
+ pango_cairo_update_layout(cairo_, pango_text_layout->GetPangoLayout());
pango_cairo_show_layout(cairo_, pango_text_layout->GetPangoLayout());
cairo_restore(cairo_);
}
diff --git a/src/platform/graphics/cairo/PangoFont.cpp b/src/platform/graphics/cairo/PangoFont.cpp
index 0de17add..d5c1ad0b 100644
--- a/src/platform/graphics/cairo/PangoFont.cpp
+++ b/src/platform/graphics/cairo/PangoFont.cpp
@@ -10,7 +10,7 @@ PangoFont::PangoFont(CairoGraphicsFactory* factory, String font_family,
auto font_family_str = font_family_.ToUtf8();
pango_font_description_set_family(pango_font_description_,
font_family_str.c_str());
- pango_font_description_set_size(pango_font_description_, font_size);
+ pango_font_description_set_size(pango_font_description_, font_size * PANGO_SCALE);
}
PangoFont::~PangoFont() {
diff --git a/src/platform/graphics/cairo/PangoTextLayout.cpp b/src/platform/graphics/cairo/PangoTextLayout.cpp
index 1033ce9e..0ba7c806 100644
--- a/src/platform/graphics/cairo/PangoTextLayout.cpp
+++ b/src/platform/graphics/cairo/PangoTextLayout.cpp
@@ -6,13 +6,26 @@
#include "cru/platform/graphics/cairo/CairoGraphicsFactory.h"
#include "cru/platform/graphics/cairo/PangoFont.h"
+#include <pango/pangocairo.h>
+
namespace cru::platform::graphics::cairo {
+namespace {
+Rect ConvertFromPango(const Rect& rect) {
+ auto result = rect;
+ result.left /= PANGO_SCALE;
+ result.top /= PANGO_SCALE;
+ result.width /= PANGO_SCALE;
+ result.height /= PANGO_SCALE;
+ return result;
+}
+} // namespace
+
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_ = pango_cairo_create_layout(factory->GetDefaultCairo());
pango_layout_set_font_description(pango_layout_,
font_->GetPangoFontDescription());
};
@@ -37,11 +50,11 @@ void PangoTextLayout::SetFont(std::shared_ptr<IFont> font) {
}
void PangoTextLayout::SetMaxWidth(float max_width) {
- return pango_layout_set_width(pango_layout_, max_width);
+ return pango_layout_set_width(pango_layout_, max_width * PANGO_SCALE);
}
void PangoTextLayout::SetMaxHeight(float max_height) {
- return pango_layout_set_height(pango_layout_, max_height);
+ return pango_layout_set_height(pango_layout_, max_height * PANGO_SCALE);
}
bool PangoTextLayout::IsEditMode() { return edit_mode_; }
@@ -64,7 +77,7 @@ 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;
+ return static_cast<float>(height) / PANGO_SCALE;
}
Index PangoTextLayout::FromUtf8IndexToUtf16Index(Index index) {
@@ -90,8 +103,9 @@ Index PangoTextLayout::FromUtf16IndexToUtf8Index(Index index) {
Rect PangoTextLayout::GetTextBounds(bool includingTrailingSpace) {
PangoRectangle rectangle;
- pango_layout_get_extents(pango_layout_, nullptr, &rectangle);
- return Rect(rectangle.x, rectangle.y, rectangle.width, rectangle.height);
+ pango_layout_get_extents(pango_layout_, &rectangle, nullptr);
+ return ConvertFromPango(
+ Rect(rectangle.x, rectangle.y, rectangle.width, rectangle.height));
}
std::vector<Rect> PangoTextLayout::TextRangeRect(const TextRange& text_range) {
@@ -108,32 +122,36 @@ std::vector<Rect> PangoTextLayout::TextRangeRect(const TextRange& text_range) {
if (start_line_index == end_line_index) {
auto line = pango_layout_get_line(pango_layout_, start_line_index);
PangoRectangle rectangle;
- pango_layout_line_get_extents(line, nullptr, &rectangle);
- return {Rect(rectangle.x + start_x_pos, rectangle.y,
- end_x_pos - start_x_pos, rectangle.height)};
+ pango_layout_line_get_extents(line, &rectangle, nullptr);
+ return {ConvertFromPango(Rect(rectangle.x + start_x_pos, rectangle.y,
+ end_x_pos - start_x_pos, rectangle.height))};
} else {
std::vector<Rect> result;
PangoRectangle rectangle;
auto start_line = pango_layout_get_line(pango_layout_, start_line_index);
- pango_layout_line_get_extents(start_line, nullptr, &rectangle);
+ pango_layout_line_get_extents(start_line, &rectangle, nullptr);
result.push_back(Rect(rectangle.x + start_x_pos, rectangle.y,
rectangle.width - start_x_pos, rectangle.height));
for (int line_index = start_line_index + 1; line_index < end_line_index;
line_index++) {
auto line = pango_layout_get_line(pango_layout_, line_index);
- pango_layout_line_get_extents(line, nullptr, &rectangle);
+ pango_layout_line_get_extents(line, &rectangle, nullptr);
result.push_back(
Rect(rectangle.x, rectangle.y, rectangle.width, rectangle.height));
}
auto end_line = pango_layout_get_line(pango_layout_, end_line_index);
- pango_layout_line_get_extents(end_line, nullptr, &rectangle);
+ pango_layout_line_get_extents(end_line, &rectangle, nullptr);
result.push_back(
Rect(rectangle.x, rectangle.y, end_x_pos, rectangle.height));
+ for (auto& r : result) {
+ r = ConvertFromPango(r);
+ }
+
return result;
}
}
@@ -146,15 +164,17 @@ Rect PangoTextLayout::TextSinglePoint(Index position, bool trailing) {
auto line = pango_layout_get_line(pango_layout_, line_index);
PangoRectangle rectangle;
- pango_layout_line_get_extents(line, nullptr, &rectangle);
+ pango_layout_line_get_extents(line, &rectangle, nullptr);
- return Rect(rectangle.x + x_pos, rectangle.y, 0, rectangle.height);
+ return ConvertFromPango(
+ Rect(rectangle.x + x_pos, rectangle.y, 0, rectangle.height));
}
TextHitTestResult PangoTextLayout::HitTest(const Point& point) {
int index, trailing;
- auto inside_text = pango_layout_xy_to_index(pango_layout_, point.x, point.y,
- &index, &trailing);
+ auto inside_text =
+ pango_layout_xy_to_index(pango_layout_, point.x * PANGO_SCALE,
+ point.y * PANGO_SCALE, &index, &trailing);
return TextHitTestResult{FromUtf8IndexToUtf16Index(index), trailing != 0,
inside_text != 0};
}