summaryrefslogtreecommitdiff
path: root/libs/canvas/text.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-09-19 13:17:45 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2015-04-29 08:20:31 -0400
commit2828dcaaf9e1c56fb66df09e0994a5bdc8121658 (patch)
treed1ac989dde386911be0e1cd04ecf84f48c4bc626 /libs/canvas/text.cc
parenta83050a2552827c6224df07017ea4f6f32efd258 (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/text.cc')
-rw-r--r--libs/canvas/text.cc48
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 ();