From 75a150ecc0672bc04c2db428ffbc7fdf7926e74a Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Fri, 19 Sep 2014 13:17:45 -0400 Subject: [PATCH] make computation of OS X pango text width correction less intrusive/more efficient. Compute the correction only once after each font specification setting. --- libs/canvas/canvas/text.h | 3 +-- libs/canvas/text.cc | 48 +++++++++++++++++++++------------------ 2 files changed, 27 insertions(+), 24 deletions(-) diff --git a/libs/canvas/canvas/text.h b/libs/canvas/canvas/text.h index d4dacbfa4f..3c0f7ab147 100644 --- a/libs/canvas/canvas/text.h +++ b/libs/canvas/canvas/text.h @@ -52,8 +52,6 @@ public: double text_width() const { return _width; } private: - double _width_correction; - std::string _text; uint32_t _color; Pango::FontDescription* _font_description; @@ -63,6 +61,7 @@ private: mutable double _width; mutable double _height; mutable bool _need_redraw; + mutable double _width_correction; double _clamped_width; void redraw (Cairo::RefPtr) const; diff --git a/libs/canvas/text.cc b/libs/canvas/text.cc index 0ce3f1d737..7cfdf9422b 100644 --- a/libs/canvas/text.cc +++ b/libs/canvas/text.cc @@ -35,13 +35,13 @@ using namespace ArdourCanvas; Text::Text (Canvas* c) : Item (c) - , _width_correction (0) , _color (0x000000ff) , _font_description (0) , _alignment (Pango::ALIGN_LEFT) , _width (0) , _height (0) , _need_redraw (false) + , _width_correction (-1) , _clamped_width (COORD_MAX) { _outline = false; @@ -49,13 +49,13 @@ Text::Text (Canvas* c) Text::Text (Item* parent) : Item (parent) - , _width_correction (0) , _color (0x000000ff) , _font_description (0) , _alignment (Pango::ALIGN_LEFT) , _width (0) , _height (0) , _need_redraw (false) + , _width_correction (-1) , _clamped_width (COORD_MAX) { _outline = false; @@ -105,6 +105,29 @@ Text::redraw (Glib::RefPtr context) const void Text::_redraw (Glib::RefPtr layout) const { +#ifdef __APPLE__ + if (_width_correction < 0.0) { + // Pango returns incorrect text width on some OS X + // So we have to make a correction + // To determine the correct indent take the largest symbol for which the width is correct + // and make the calculation + Gtk::Window win; + Gtk::Label foo; + win.add (foo); + + int width = 0; + int height = 0; + Glib::RefPtr test_layout = foo.create_pango_layout ("H"); + test_layout->set_font_description (*_font_description); + test_layout->get_pixel_size (width, height); + + _width_correction = width*1.5; + } +#else + /* don't bother with a conditional here */ + _width_correction = 0.0; +#endif + layout->set_text (_text); if (_font_description) { @@ -112,26 +135,6 @@ Text::_redraw (Glib::RefPtr layout) const } layout->set_alignment (_alignment); - - // Pango returns incorrect text width on some platforms - // So we have to make a correction - // To determine the correct indent take the largest symbol for which the width is correct - // and make the calculation - Gtk::Window win; - Gtk::Label foo; - win.add (foo); - - int width = 0; - int height = 0; - Glib::RefPtr test_layout = foo.create_pango_layout ("H"); - test_layout->set_font_description (*_font_description); - test_layout->get_pixel_size (width, height); - -#ifdef __APPLE__ - double _width_correction = width*1.5; -#else if - double _width_correction = 0; -#endif int w; int h; @@ -234,6 +237,7 @@ Text::set_font_description (Pango::FontDescription font_description) _font_description = new Pango::FontDescription (font_description); _need_redraw = true; + _width_correction = -1.0; _bounding_box_dirty = true; end_change ();