diff options
-rw-r--r-- | libs/canvas/canvas/text.h | 4 | ||||
-rw-r--r-- | libs/canvas/text.cc | 47 | ||||
-rw-r--r-- | libs/gtkmm2ext/utils.cc | 22 |
3 files changed, 37 insertions, 36 deletions
diff --git a/libs/canvas/canvas/text.h b/libs/canvas/canvas/text.h index 3dfe985955..f42a282c8e 100644 --- a/libs/canvas/canvas/text.h +++ b/libs/canvas/canvas/text.h @@ -66,9 +66,7 @@ private: mutable double _width_correction; double _clamped_width; - void _redraw (Cairo::RefPtr<Cairo::Context>) const; - void _redraw (Glib::RefPtr<Pango::Context>) const; - void __redraw (Glib::RefPtr<Pango::Layout>) const; + void _redraw () const; }; } diff --git a/libs/canvas/text.cc b/libs/canvas/text.cc index a77e03020d..9529d7736a 100644 --- a/libs/canvas/text.cc +++ b/libs/canvas/text.cc @@ -81,31 +81,12 @@ Text::set (string const & text) } void -Text::_redraw (Cairo::RefPtr<Cairo::Context> context) const +Text::_redraw () const { - if (_text.empty()) { - return; - } - + assert (!_text.empty()); + Glib::RefPtr<Pango::Context> context = Glib::wrap (gdk_pango_context_get()); Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create (context); - __redraw (layout); -} - -void -Text::_redraw (Glib::RefPtr<Pango::Context> context) const -{ - if (_text.empty()) { - return; - } - - Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create (context); - __redraw (layout); -} - -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 @@ -115,6 +96,7 @@ Text::__redraw (Glib::RefPtr<Pango::Layout> layout) const Gtk::Window win; Gtk::Label foo; win.add (foo); + win.ensure_style (); int width = 0; int height = 0; @@ -197,7 +179,7 @@ Text::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const } if (_need_redraw) { - _redraw (context); + _redraw (); } Rect intersection (i.get()); @@ -220,10 +202,13 @@ Text::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const void Text::clamp_width (double w) { - begin_change (); + if (_clamped_width == w) { + return; + } + begin_change (); _clamped_width = w; - _bounding_box_dirty = true; - end_change (); + _bounding_box_dirty = true; + end_change (); } void @@ -236,11 +221,15 @@ Text::compute_bounding_box () const } if (_bounding_box_dirty) { +#ifdef __APPLE__ + const float retina_factor = 0.5; +#else + const float retina_factor = 1.0; +#endif if (_need_redraw || !_image) { - Glib::RefPtr<Pango::Context> context = Glib::wrap (gdk_pango_context_get()); // context now owns C object and will free it - _redraw (context); + _redraw (); } - _bounding_box = Rect (0, 0, min (_clamped_width, (double) _image->get_width()), _image->get_height()); + _bounding_box = Rect (0, 0, min (_clamped_width, (double) _image->get_width() * retina_factor), _image->get_height() * retina_factor); _bounding_box_dirty = false; } } diff --git a/libs/gtkmm2ext/utils.cc b/libs/gtkmm2ext/utils.cc index f1616f16a1..0a80825880 100644 --- a/libs/gtkmm2ext/utils.cc +++ b/libs/gtkmm2ext/utils.cc @@ -54,8 +54,8 @@ Gtkmm2ext::get_ink_pixel_size (Glib::RefPtr<Pango::Layout> layout, { Pango::Rectangle ink_rect = layout->get_ink_extents (); - width = (ink_rect.get_width() + PANGO_SCALE / 2) / PANGO_SCALE; - height = (ink_rect.get_height() + PANGO_SCALE / 2) / PANGO_SCALE; + width = PANGO_PIXELS(ink_rect.get_width()); + height = PANGO_PIXELS(ink_rect.get_height()); } void @@ -704,14 +704,28 @@ Gtkmm2ext::window_to_draw_on (Gtk::Widget& w, Gtk::Widget** parent) int Gtkmm2ext::pixel_width (const string& str, Pango::FontDescription& font) { - Gtk::Label foo; - Glib::RefPtr<Pango::Layout> layout = foo.create_pango_layout (""); + Glib::RefPtr<Pango::Context> context = Glib::wrap (gdk_pango_context_get()); + Glib::RefPtr<Pango::Layout> layout = Pango::Layout::create (context); layout->set_font_description (font); layout->set_text (str); int width, height; Gtkmm2ext::get_ink_pixel_size (layout, width, height); + +#ifdef __APPLE__ + // 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 + // + // see also libs/canvas/text.cc + int cor_width; + layout->set_text ("H"); + layout->get_pixel_size (cor_width, height); + width += cor_width * 1.5; +#endif + return width; } |