diff options
author | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-17 11:34:47 -0400 |
---|---|---|
committer | Paul Davis <paul@linuxaudiosystems.com> | 2014-06-17 11:34:54 -0400 |
commit | 93bc93b6f614123536cd03f1b5c8bc0c64873034 (patch) | |
tree | a5606a1c7f7375f71522e0a9730da92dbfa1de16 /libs/canvas/text.cc | |
parent | f98e0a07075e9f003369e8d4b597d4a6c9a63fb7 (diff) |
a set of 3 fixes that cure Canvas::Text leaving dirty pixels when being dragged. or might not - testing is non-deterministic, which is alarming
Diffstat (limited to 'libs/canvas/text.cc')
-rw-r--r-- | libs/canvas/text.cc | 27 |
1 files changed, 17 insertions, 10 deletions
diff --git a/libs/canvas/text.cc b/libs/canvas/text.cc index 12fe3eb6cb..4c2077a70b 100644 --- a/libs/canvas/text.cc +++ b/libs/canvas/text.cc @@ -106,15 +106,15 @@ Text::_redraw (Glib::RefPtr<Pango::Layout> layout) const } layout->set_alignment (_alignment); - + int w; int h; - layout->get_size (w, h); - - _width = w / Pango::SCALE; - _height = h / Pango::SCALE; - + layout->get_pixel_size (w, h); + + _width = w; + _height = h; + _image = Cairo::ImageSurface::create (Cairo::FORMAT_ARGB32, _width, _height); Cairo::RefPtr<Cairo::Context> img_context = Cairo::Context::create (_image); @@ -133,19 +133,26 @@ Text::_redraw (Glib::RefPtr<Pango::Layout> layout) const } void -Text::render (Rect const & /*area*/, Cairo::RefPtr<Cairo::Context> context) const +Text::render (Rect const & area, Cairo::RefPtr<Cairo::Context> context) const { if (_text.empty()) { return; } + Rect self = item_to_window (Rect (0, 0, min (_clamped_width, (double)_image->get_width ()), _image->get_height ())); + boost::optional<Rect> i = self.intersection (area); + + if (!i) { + return; + } + if (_need_redraw) { redraw (context); } - Rect self = item_to_window (Rect (0, 0, min (_clamped_width, _width), _height)); - - context->rectangle (self.x0, self.y0, self.width(), self.height()); + Rect intersection (i.get()); + + context->rectangle (intersection.x0, intersection.y0, intersection.width(), intersection.height()); context->set_source (_image, self.x0, self.y0); context->fill (); } |