#include <gdk/gdk.h>
#include <cairomm/cairomm.h>
+#include <gtkmm/window.h>
#include <gtkmm/label.h>
#include "pbd/stacktrace.h"
using namespace std;
using namespace ArdourCanvas;
+
Text::Text (Canvas* c)
: Item (c)
, _color (0x000000ff)
, _width (0)
, _height (0)
, _need_redraw (false)
+ , _width_correction (-1)
, _clamped_width (COORD_MAX)
{
_outline = false;
, _width (0)
, _height (0)
, _need_redraw (false)
+ , _width_correction (-1)
, _clamped_width (COORD_MAX)
{
_outline = false;
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");
+ if (_font_description) {
+ 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) {
}
layout->set_alignment (_alignment);
-
+
int w;
int h;
layout->get_pixel_size (w, h);
- _width = w;
+ _width = w + _width_correction;
_height = h;
+#ifdef __APPLE__
+ _image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, _width * 2, _height * 2);
+#else
_image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, _width, _height);
-
+#endif
+
Cairo::RefPtr<Cairo::Context> img_context = Cairo::Context::create (_image);
+#ifdef __APPLE__
+ /* Below, the rendering scaling is set to support retina display
+ */
+ img_context->scale (2, 2);
+#endif
+
/* and draw, in the appropriate color of course */
if (_outline) {
Rect intersection (i.get());
context->rectangle (intersection.x0, intersection.y0, intersection.width(), intersection.height());
+#ifdef __APPLE__
+ /* Below, the rendering scaling is set to support retina display
+ */
+ Cairo::Matrix original_matrix = context->get_matrix();
+ context->scale (0.5, 0.5);
+ context->set_source (_image, self.x0 * 2, self.y0 * 2);
+ context->fill ();
+ context->set_matrix (original_matrix);
+#else
context->set_source (_image, self.x0, self.y0);
context->fill ();
+#endif
}
void
_font_description = new Pango::FontDescription (font_description);
_need_redraw = true;
+ _width_correction = -1.0;
_bounding_box_dirty = true;
end_change ();
o << endl;
}
+
+
+double
+Text::text_width() const
+{
+ if (_need_redraw) {
+ redraw ();
+ }
+
+ return _width;
+}