diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-09-19 13:17:45 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2015-04-29 08:20:31 -0400 |
commit | 2828dcaaf9e1c56fb66df09e0994a5bdc8121658 (patch) | |
tree | d1ac989dde386911be0e1cd04ecf84f48c4bc626 /libs/canvas | |
parent | a83050a2552827c6224df07017ea4f6f32efd258 (diff) |
make computation of OS X pango text width correction less intrusive/more efficient.
Compute the correction only once after each font specification setting.
Conflicts:
libs/canvas/canvas/text.h
Diffstat (limited to 'libs/canvas')
-rw-r--r-- | libs/canvas/text.cc | 48 |
1 files changed, 26 insertions, 22 deletions
diff --git a/libs/canvas/text.cc b/libs/canvas/text.cc index 488e0c1540..dd57888214 100644 --- a/libs/canvas/text.cc +++ b/libs/canvas/text.cc @@ -36,13 +36,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; @@ -50,13 +50,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; @@ -106,6 +106,29 @@ Text::_redraw (Glib::RefPtr<Pango::Context> context) const void Text::__redraw (Glib::RefPtr<Pango::Layout> 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<Pango::Layout> 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) { @@ -113,26 +136,6 @@ Text::__redraw (Glib::RefPtr<Pango::Layout> 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<Pango::Layout> 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; @@ -238,6 +241,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 (); |