summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVitaly Dyachkov <obyknovenius@me.com>2023-03-14 12:50:36 +0100
committerKjell Ahlstedt <kjellahlstedt@gmail.com>2023-03-14 12:50:36 +0100
commit70a162188ffa0301589fdaf0e0d8d3058829ce06 (patch)
tree3354e55a90c95473dceaab449e67339061ca3066
parent49172c7d5bf2559623450d501b59c9941dcd7051 (diff)
Implement get_text_extents() and get_glyph_extents() of ScaledFont
ScaledFont::get_text_extents() and ScaledFont::get_glyph_extents() were declared in the header but their implementations were missing. Fixes #30
-rw-r--r--cairomm/scaledfont.cc12
-rw-r--r--cairomm/scaledfont.h2
-rw-r--r--tests/test-scaled-font.cc35
3 files changed, 48 insertions, 1 deletions
diff --git a/cairomm/scaledfont.cc b/cairomm/scaledfont.cc
index c9c6b99..4974e90 100644
--- a/cairomm/scaledfont.cc
+++ b/cairomm/scaledfont.cc
@@ -62,6 +62,18 @@ void ScaledFont::get_extents(FontExtents& extents) const
check_object_status_and_throw_exception(*this);
}
+void ScaledFont::get_text_extents(const std::string& utf8, TextExtents& extents) const
+{
+ cairo_scaled_font_text_extents(m_cobject, utf8.c_str(), static_cast<cairo_text_extents_t*>(&extents));
+ check_object_status_and_throw_exception(*this);
+}
+
+void ScaledFont::get_glyph_extents(const std::vector<Glyph>& glyphs, TextExtents& extents) const
+{
+ cairo_scaled_font_glyph_extents(m_cobject, glyphs.data(), glyphs.size(), static_cast<cairo_text_extents_t*>(&extents));
+ check_object_status_and_throw_exception(*this);
+}
+
RefPtr<FontFace> ScaledFont::get_font_face() const
{
auto face = cairo_scaled_font_get_font_face(m_cobject);
diff --git a/cairomm/scaledfont.h b/cairomm/scaledfont.h
index 4f1ae3a..fa76bb0 100644
--- a/cairomm/scaledfont.h
+++ b/cairomm/scaledfont.h
@@ -137,7 +137,7 @@ public:
*
* @since 1.8
**/
- void get_glyph_extents(const std::vector<Glyph>& glyphs, TextExtents& extents);
+ void get_glyph_extents(const std::vector<Glyph>& glyphs, TextExtents& extents) const;
/** The FontFace with which this ScaledFont was created.
* @since 1.2
diff --git a/tests/test-scaled-font.cc b/tests/test-scaled-font.cc
index ff5f1a7..110c088 100644
--- a/tests/test-scaled-font.cc
+++ b/tests/test-scaled-font.cc
@@ -52,6 +52,41 @@ BOOST_AUTO_TEST_CASE(test_scale_matrix)
// no real test, just excercising the functionality
}
+BOOST_AUTO_TEST_CASE(test_get_text_extents)
+{
+ auto face = ToyFontFace::create("sans", ToyFontFace::Slant::NORMAL, ToyFontFace::Weight::NORMAL);
+ Matrix m;
+ cairo_matrix_init_scale(&m, 2.0, 4.0);
+ auto font = ScaledFont::create(face, m, m, FontOptions());
+ BOOST_REQUIRE(font);
+
+ TextExtents extents;
+ font->get_text_extents("sans", extents);
+
+ BOOST_CHECK_LE(0, extents.width);
+ BOOST_CHECK_LE(0, extents.height);
+}
+
+BOOST_AUTO_TEST_CASE(test_get_glyph_extents)
+{
+ auto face = ToyFontFace::create("sans", ToyFontFace::Slant::NORMAL, ToyFontFace::Weight::NORMAL);
+ Matrix m;
+ cairo_matrix_init_scale(&m, 2.0, 4.0);
+ auto font = ScaledFont::create(face, m, m, FontOptions());
+ BOOST_REQUIRE(font);
+
+ std::vector<Glyph> glyphs;
+ std::vector<TextCluster> clusters;
+ TextClusterFlags flags;
+ font->text_to_glyphs(0, 0, "sans", glyphs, clusters, flags);
+
+ TextExtents extents;
+ font->get_glyph_extents(glyphs, extents);
+
+ BOOST_CHECK_LE(0, extents.width);
+ BOOST_CHECK_LE(0, extents.height);
+}
+
BOOST_AUTO_TEST_CASE(test_get_font_face)
{
// this is to test for a bug where we were accidentally freeing the resulting