summaryrefslogtreecommitdiff
path: root/libs/canvas/text.cc
diff options
context:
space:
mode:
authorPaul Davis <paul@linuxaudiosystems.com>2014-06-17 11:34:47 -0400
committerPaul Davis <paul@linuxaudiosystems.com>2014-06-17 11:34:54 -0400
commit93bc93b6f614123536cd03f1b5c8bc0c64873034 (patch)
treea5606a1c7f7375f71522e0a9730da92dbfa1de16 /libs/canvas/text.cc
parentf98e0a07075e9f003369e8d4b597d4a6c9a63fb7 (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.cc27
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 ();
}