summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-08-04 17:23:30 +0100
committerCaolán McNamara <caolanm@redhat.com>2016-08-04 17:27:49 +0100
commit705d7597480b2307d7e4929ce9386d80ce2a0f16 (patch)
tree312ed61c5f02fa289a27eb5e8a66cd1744296f4b
parentf13b2af50ebb4c32694c4fea5703796586b5b8ee (diff)
Related: tdf#101213 speculative drop of CAIRO_OPERATOR_DIFFERENCE use
for tdf#99446 and rhbz#1283420 there is a hackaround which ended up in 5.1.5, which is not in 5.1.4, for corrupt glyphs under X. I can still reproduce the problem if I drop the CAIRO_OPERATOR_DIFFERENCE usage here with master and gtk2. This alternative hackaround to force a read of the underlying surface works just as well (help->license information is the reproducer). Change-Id: Ie3c5b07409537a1734226b4ce034620351297e25
-rw-r--r--vcl/unx/generic/gdi/x11cairotextrender.cxx23
1 files changed, 9 insertions, 14 deletions
diff --git a/vcl/unx/generic/gdi/x11cairotextrender.cxx b/vcl/unx/generic/gdi/x11cairotextrender.cxx
index cf8bc9986fa6..f25ed1fc92e9 100644
--- a/vcl/unx/generic/gdi/x11cairotextrender.cxx
+++ b/vcl/unx/generic/gdi/x11cairotextrender.cxx
@@ -38,10 +38,6 @@ struct _XRegion
BOX extents;
};
-#if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1, 10, 0)
-# define CAIRO_OPERATOR_DIFFERENCE (static_cast<cairo_operator_t>(23))
-#endif
-
X11CairoTextRender::X11CairoTextRender(X11SalGraphics& rParent)
: mrParent(rParent)
{
@@ -56,17 +52,16 @@ cairo_t* X11CairoTextRender::getCairoContext()
{
cairo_t *cr = mrParent.getCairoContext();
- //rhbz#1283420 bodge to draw and undraw something which has the side effect
- //of making the mysterious xrender related problem go away
- if (cairo_version() >= CAIRO_VERSION_ENCODE(1, 10, 0))
+ //rhbz#1283420 bodge to force a read from the underlying surface which has
+ //the side effect of making the mysterious xrender related problem go away
{
- cairo_save(cr);
- cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
- cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE);
- cairo_rectangle(cr, 0, 0, 1, 1);
- cairo_fill_preserve(cr);
- cairo_fill(cr);
- cairo_restore(cr);
+ cairo_surface_t *target = cairo_get_target(cr);
+ cairo_surface_t *throw_away = cairo_surface_create_similar(target, cairo_surface_get_content(target), 1, 1);
+ cairo_t *force_read_cr = cairo_create(throw_away);
+ cairo_set_source_surface(force_read_cr, target, 0, 0);
+ cairo_paint(force_read_cr);
+ cairo_destroy(force_read_cr);
+ cairo_surface_destroy(throw_away);
}
return cr;