summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2015-12-04 15:15:06 +0000
committerCaolán McNamara <caolanm@redhat.com>2015-12-05 20:42:56 +0000
commit8dea939d65cd3cdd744d21a9f60444a97e45962b (patch)
tree57e4a76e57bd2d4ebb820126a78ab958fababaea
parentcfc119c4322e36283ffc4bebfb0757e8e0039a5a (diff)
implement SAL_INVERT_TRACKFRAME invert via cairo
this gives the same (terrible?) pattern as quartz for dragging toolbars around Change-Id: I439826c41f9d4d13d6e0b13859b6fb34899b6494
-rw-r--r--vcl/headless/svpgdi.cxx76
1 files changed, 41 insertions, 35 deletions
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index ad8888a9e3c0..e610ad4c87a2 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -1195,34 +1195,47 @@ namespace
void SvpSalGraphics::invert( long nX, long nY, long nWidth, long nHeight, SalInvert nFlags )
{
- // FIXME: handle SAL_INVERT_TRACKFRAME
- if ( nFlags & SAL_INVERT_TRACKFRAME )
+ if (m_aDrawMode != basebmp::DrawMode::XOR)
{
- SAL_WARN("vcl.gdi", "SvpSalGraphics::invert, unhandled SAL_INVERT_TRACKFRAME");
- }
- else
- {
- if (m_aDrawMode == basebmp::DrawMode::XOR)
- SAL_WARN("vcl.gdi", "SvpSalGraphics::invert unhandled XOR (?)");
+ cairo_t* cr = getCairoContext();
+ assert(cr && m_aDevice->isTopDown());
+
+ clipRegion(cr);
+
+ cairo_rectangle_int_t extents = {0, 0, 0, 0};
+ basebmp::IBitmapDeviceDamageTrackerSharedPtr xDamageTracker(m_aDevice->getDamageTracker());
+
+ cairo_rectangle(cr, nX, nY, nWidth, nHeight);
+
+ cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
+
+ if (cairo_version() >= CAIRO_VERSION_ENCODE(1, 10, 0))
+ {
+ cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE);
+ }
else
{
- cairo_t* cr = getCairoContext();
- assert(cr && m_aDevice->isTopDown());
-
- clipRegion(cr);
+ SAL_WARN("vcl.gdi", "SvpSalGraphics::invert, archaic cairo");
+ }
- cairo_rectangle_int_t extents = {0, 0, 0, 0};
- basebmp::IBitmapDeviceDamageTrackerSharedPtr xDamageTracker(m_aDevice->getDamageTracker());
+ if (nFlags & SAL_INVERT_TRACKFRAME)
+ {
+ cairo_set_line_width(cr, 2.0);
+ const double dashLengths[2] = { 4.0, 4.0 };
+ cairo_set_dash(cr, dashLengths, 2, 0);
- cairo_rectangle(cr, nX, nY, nWidth, nHeight);
+ if (xDamageTracker)
+ extents = getStrokeDamage(cr);
+ cairo_stroke(cr);
+ }
+ else
+ {
if (xDamageTracker)
extents = getFillDamage(cr);
cairo_clip(cr);
- cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
-
if (nFlags & SAL_INVERT_50)
{
cairo_pattern_t *pattern = create_stipple();
@@ -1231,31 +1244,24 @@ void SvpSalGraphics::invert( long nX, long nY, long nWidth, long nHeight, SalInv
}
else
{
- if (cairo_version() >= CAIRO_VERSION_ENCODE(1, 10, 0))
- {
- cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE);
- }
- else
- {
- SAL_WARN("vcl.gdi", "SvpSalGraphics::invert, archaic cairo");
- cairo_set_source_rgb(cr, 0.0, 0.0, 0.0);
- }
cairo_paint(cr);
}
+ }
- cairo_surface_flush(cairo_get_target(cr));
- cairo_destroy(cr); // unref
-
- if (xDamageTracker)
- {
- xDamageTracker->damaged(basegfx::B2IBox(extents.x, extents.y, extents.x + extents.width,
- extents.y + extents.height));
- }
+ cairo_surface_flush(cairo_get_target(cr));
+ cairo_destroy(cr); // unref
- return;
+ if (xDamageTracker)
+ {
+ xDamageTracker->damaged(basegfx::B2IBox(extents.x, extents.y, extents.x + extents.width,
+ extents.y + extents.height));
}
+
+ return;
}
+ SAL_WARN("vcl.gdi", "SvpSalGraphics::invert unhandled XOR (?)");
+
basegfx::B2DPolygon aRect = basegfx::tools::createPolygonFromRect( basegfx::B2DRectangle( nX, nY, nX+nWidth, nY+nHeight ) );
basegfx::B2DPolyPolygon aPolyPoly( aRect );
basegfx::B2IBox aDestRange( nX, nY, nX + nWidth, nY + nHeight );