|
|
a9add1 |
From 63d5cc018d268a8d269cb2353ddaeb68fc74d64c Mon Sep 17 00:00:00 2001
|
|
|
a9add1 |
From: =?UTF-8?q?Caol=C3=A1n=20McNamara?= <caolanm@redhat.com>
|
|
|
a9add1 |
Date: Mon, 30 Nov 2015 10:22:46 +0000
|
|
|
a9add1 |
Subject: [PATCH] gtk3: implement SAL_INVERT_50 rectangle case
|
|
|
a9add1 |
|
|
|
a9add1 |
missing stipple effect around slides in layout panel
|
|
|
a9add1 |
|
|
|
a9add1 |
(cherry picked from commit a80dea3e77c2a8465cdd309c5f740fb8102dd826)
|
|
|
a9add1 |
(cherry picked from commit 442d064188a2d50406e485d033accfffe4bd54e9)
|
|
|
a9add1 |
|
|
|
a9add1 |
Change-Id: I8a55c6bda1e742e105ba22e4566658099ea16f46
|
|
|
a9add1 |
---
|
|
|
a9add1 |
vcl/headless/svpgdi.cxx | 73 +++++++++++++++++++++++++++++++++++++++++++++++--
|
|
|
a9add1 |
1 file changed, 71 insertions(+), 2 deletions(-)
|
|
|
a9add1 |
|
|
|
a9add1 |
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
|
|
|
a9add1 |
index 06030d9..0afce7e 100644
|
|
|
a9add1 |
--- a/vcl/headless/svpgdi.cxx
|
|
|
a9add1 |
+++ b/vcl/headless/svpgdi.cxx
|
|
|
a9add1 |
@@ -913,9 +913,76 @@ SalColor SvpSalGraphics::getPixel( long nX, long nY )
|
|
|
a9add1 |
return aColor.toInt32();
|
|
|
a9add1 |
}
|
|
|
a9add1 |
|
|
|
a9add1 |
-void SvpSalGraphics::invert( long nX, long nY, long nWidth, long nHeight, SalInvert /*nFlags*/ )
|
|
|
a9add1 |
+namespace
|
|
|
a9add1 |
{
|
|
|
a9add1 |
- // FIXME: handle SAL_INVERT_50 and SAL_INVERT_TRACKFRAME
|
|
|
a9add1 |
+ cairo_pattern_t * create_stipple()
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ static unsigned char data[16] = { 0xFF, 0xFF, 0x00, 0x00,
|
|
|
a9add1 |
+ 0xFF, 0xFF, 0x00, 0x00,
|
|
|
a9add1 |
+ 0x00, 0x00, 0xFF, 0xFF,
|
|
|
a9add1 |
+ 0x00, 0x00, 0xFF, 0xFF };
|
|
|
a9add1 |
+ cairo_surface_t* surface = cairo_image_surface_create_for_data(data, CAIRO_FORMAT_A8, 4, 4, 4);
|
|
|
a9add1 |
+ cairo_pattern_t* pattern = cairo_pattern_create_for_surface(surface);
|
|
|
a9add1 |
+ cairo_surface_destroy(surface);
|
|
|
a9add1 |
+ cairo_pattern_set_extend(pattern, CAIRO_EXTEND_REPEAT);
|
|
|
a9add1 |
+ cairo_pattern_set_filter(pattern, CAIRO_FILTER_NEAREST);
|
|
|
a9add1 |
+ return pattern;
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
+}
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+void SvpSalGraphics::invert( long nX, long nY, long nWidth, long nHeight, SalInvert nFlags )
|
|
|
a9add1 |
+{
|
|
|
a9add1 |
+#if ENABLE_CAIRO_CANVAS
|
|
|
a9add1 |
+#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)
|
|
|
a9add1 |
+ // FIXME: handle SAL_INVERT_TRACKFRAME
|
|
|
a9add1 |
+ if ( nFlags & SAL_INVERT_TRACKFRAME )
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ SAL_WARN("vcl.gdi", "SvpSalGraphics::invert, unhandled SAL_INVERT_TRACKFRAME");
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
+ else if ( nFlags & SAL_INVERT_50 )
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ if (cairo_t* cr = createCairoContext(m_aDevice))
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ if (!m_aDevice->isTopDown())
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ cairo_scale(cr, 1, -1.0);
|
|
|
a9add1 |
+ cairo_translate(cr, 0.0, -m_aDevice->getSize().getY());
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ clipRegion(cr);
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ cairo_pattern_t *pattern = create_stipple();
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ cairo_rectangle_int_t extents;
|
|
|
a9add1 |
+ basebmp::IBitmapDeviceDamageTrackerSharedPtr xDamageTracker(m_aDevice->getDamageTracker());
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ cairo_rectangle(cr, nX, nY, nWidth, nHeight);
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ if (xDamageTracker)
|
|
|
a9add1 |
+ extents = getFillDamage(cr);
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ cairo_clip(cr);
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ cairo_set_source_rgb(cr, 1.0, 1.0, 1.0);
|
|
|
a9add1 |
+ cairo_set_operator(cr, CAIRO_OPERATOR_DIFFERENCE);
|
|
|
a9add1 |
+ cairo_mask(cr, pattern);
|
|
|
a9add1 |
+ cairo_pattern_destroy(pattern);
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ cairo_surface_flush(cairo_get_target(cr));
|
|
|
a9add1 |
+ cairo_destroy(cr); // unref
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ return;
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
+ else
|
|
|
a9add1 |
+ SAL_WARN("vcl.gdi", "SvpSalGraphics::invert unhandled XOR (?)");
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
+ else
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ SAL_WARN("vcl.gdi", "SvpSalGraphics::invert, unhandled SAL_INVERT_TRACKFRAME");
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
+#endif
|
|
|
a9add1 |
+#endif
|
|
|
a9add1 |
+
|
|
|
a9add1 |
basegfx::B2DPolygon aRect = basegfx::tools::createPolygonFromRect( basegfx::B2DRectangle( nX, nY, nX+nWidth, nY+nHeight ) );
|
|
|
a9add1 |
basegfx::B2DPolyPolygon aPolyPoly( aRect );
|
|
|
a9add1 |
basegfx::B2IBox aDestRange( nX, nY, nX + nWidth, nY + nHeight );
|
|
|
a9add1 |
@@ -928,6 +995,8 @@ void SvpSalGraphics::invert( long nX, long nY, long nWidth, long nHeight, SalInv
|
|
|
a9add1 |
|
|
|
a9add1 |
void SvpSalGraphics::invert( sal_uInt32 nPoints, const SalPoint* pPtAry, SalInvert /*nFlags*/ )
|
|
|
a9add1 |
{
|
|
|
a9add1 |
+ SAL_WARN("vcl.gdi", "SvpSalGraphics::invert, unhandled points case");
|
|
|
a9add1 |
+
|
|
|
a9add1 |
// FIXME: handle SAL_INVERT_50 and SAL_INVERT_TRACKFRAME
|
|
|
a9add1 |
basegfx::B2DPolygon aPoly;
|
|
|
a9add1 |
aPoly.append( basegfx::B2DPoint( pPtAry->mnX, pPtAry->mnY ), nPoints );
|
|
|
a9add1 |
--
|
|
|
a9add1 |
2.5.0
|
|
|
a9add1 |
|