From b9750bac72f480e5473b15f4abb16ad3dd0d13e0 Mon Sep 17 00:00:00 2001 From: Paul Davis Date: Sat, 6 Apr 2013 18:35:32 -0400 Subject: pre-render text canvas items so that ::render() is just a blit from an image surface --- libs/canvas/text.cc | 69 ++++++++++++++++++++++++++++++++--------------------- 1 file changed, 42 insertions(+), 27 deletions(-) (limited to 'libs/canvas/text.cc') diff --git a/libs/canvas/text.cc b/libs/canvas/text.cc index feb88e1996..6333d7fae7 100644 --- a/libs/canvas/text.cc +++ b/libs/canvas/text.cc @@ -1,5 +1,8 @@ +#include #include + #include "pbd/xml++.h" + #include "canvas/text.h" #include "canvas/canvas.h" #include "canvas/utils.h" @@ -9,9 +12,12 @@ using namespace ArdourCanvas; Text::Text (Group* parent) : Item (parent) - , _font_description (0) + , _image (0) , _color (0x000000ff) + , _font_description (0) , _alignment (Pango::ALIGN_LEFT) + , _width (0) + , _height (0) { } @@ -27,49 +33,56 @@ Text::set (string const & text) begin_change (); _text = text; - + + redraw (); + _bounding_box_dirty = true; end_change (); } void -Text::compute_bounding_box () const +Text::redraw () { - if (!_canvas || !_canvas->context ()) { - _bounding_box = boost::optional (); - _bounding_box_dirty = false; - return; - } - - Pango::Rectangle const r = layout (_canvas->context())->get_ink_extents (); - - _bounding_box = Rect ( - r.get_x() / Pango::SCALE, - r.get_y() / Pango::SCALE, - (r.get_x() + r.get_width()) / Pango::SCALE, - (r.get_y() + r.get_height()) / Pango::SCALE - ); - - _bounding_box_dirty = false; -} + _image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, _width, _height); -Glib::RefPtr -Text::layout (Cairo::RefPtr context) const -{ + Cairo::RefPtr context = Cairo::Context::create (_image); Glib::RefPtr layout = Pango::Layout::create (context); + layout->set_text (_text); + if (_font_description) { layout->set_font_description (*_font_description); } + layout->set_alignment (_alignment); - return layout; + + Pango::Rectangle ink_rect = layout->get_ink_extents(); + + _origin.x = ink_rect.get_x() / Pango::SCALE; + _origin.y = ink_rect.get_y() / Pango::SCALE; + _width = (ink_rect.get_width() + Pango::SCALE / 2) / Pango::SCALE; + _height = (ink_rect.get_height() + Pango::SCALE / 2) / Pango::SCALE; + + set_source_rgba (context, _color); + + layout->show_in_cairo_context (context); + + /* text has now been rendered */ +} + +void +Text::compute_bounding_box () const +{ + _bounding_box = Rect (_origin.x, _origin.y, _origin.x + _width, _origin.y + _height); + _bounding_box_dirty = false; } void Text::render (Rect const & /*area*/, Cairo::RefPtr context) const { - set_source_rgba (context, _color); - layout (context)->show_in_cairo_context (context); + context->set_source (_image, 0, 0); + context->rectangle (0, 0, _width, _height); + context->fill (); } XMLNode * @@ -96,7 +109,7 @@ Text::set_alignment (Pango::Alignment alignment) begin_change (); _alignment = alignment; - + redraw (); _bounding_box_dirty = true; end_change (); } @@ -107,6 +120,7 @@ Text::set_font_description (Pango::FontDescription font_description) begin_change (); _font_description = new Pango::FontDescription (font_description); + redraw (); _bounding_box_dirty = true; end_change (); @@ -118,6 +132,7 @@ Text::set_color (Color color) begin_change (); _color = color; + redraw (); end_change (); } -- cgit v1.2.3