mirror of
https://github.com/Ardour/ardour.git
synced 2025-12-30 18:37:40 +01:00
make computation of OS X pango text width correction less intrusive/more efficient.
Compute the correction only once after each font specification setting.
This commit is contained in:
parent
5fe0c4be63
commit
75a150ecc0
2 changed files with 27 additions and 24 deletions
|
|
@ -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<Cairo::Context>) const;
|
||||
|
|
|
|||
|
|
@ -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<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) {
|
||||
|
|
@ -112,26 +135,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;
|
||||
|
|
@ -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 ();
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue