|
|
a9add1 |
From add0b75abd601d5d80e5ad6f20ab63ac1489f028 Mon Sep 17 00:00:00 2001
|
|
|
a9add1 |
From: rpmbuild <rpmbuild@fedoraproject.org>
|
|
|
a9add1 |
Date: Wed, 16 Dec 2015 10:18:52 +0000
|
|
|
a9add1 |
Subject: [PATCH] Resolves: rhbz#1291925 implement SAL_INVERT_TRACKFRAME
|
|
|
a9add1 |
|
|
|
a9add1 |
Change-Id: Iec7df66f9bfddcb916047aff569cf2070dd2fa4f
|
|
|
a9add1 |
---
|
|
|
a9add1 |
vcl/headless/svpgdi.cxx | 85 +++++++++++++++++++++++++++----------------------
|
|
|
a9add1 |
1 file changed, 47 insertions(+), 38 deletions(-)
|
|
|
a9add1 |
|
|
|
a9add1 |
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
|
|
|
a9add1 |
index a79142c..ed2c8cf 100644
|
|
|
a9add1 |
--- a/vcl/headless/svpgdi.cxx
|
|
|
a9add1 |
+++ b/vcl/headless/svpgdi.cxx
|
|
|
a9add1 |
@@ -109,13 +109,9 @@ namespace
|
|
|
a9add1 |
if (rBuffer->getScanlineFormat() != basebmp::FORMAT_THIRTYTWO_BIT_TC_MASK_BGRX)
|
|
|
a9add1 |
return false;
|
|
|
a9add1 |
|
|
|
a9add1 |
-#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)
|
|
|
a9add1 |
basegfx::B2IVector size = rBuffer->getSize();
|
|
|
a9add1 |
sal_Int32 nStride = rBuffer->getScanlineStride();
|
|
|
a9add1 |
return (cairo_format_stride_for_width(CAIRO_FORMAT_RGB24, size.getX()) == nStride);
|
|
|
a9add1 |
-#else
|
|
|
a9add1 |
- return false;
|
|
|
a9add1 |
-#endif
|
|
|
a9add1 |
}
|
|
|
a9add1 |
}
|
|
|
a9add1 |
|
|
|
a9add1 |
@@ -135,7 +131,7 @@ void SvpSalGraphics::clipRegion(cairo_t* cr)
|
|
|
a9add1 |
cairo_clip(cr);
|
|
|
a9add1 |
}
|
|
|
a9add1 |
}
|
|
|
a9add1 |
-#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)
|
|
|
a9add1 |
+
|
|
|
a9add1 |
namespace
|
|
|
a9add1 |
{
|
|
|
a9add1 |
cairo_rectangle_int_t getFillDamage(cairo_t* cr)
|
|
|
a9add1 |
@@ -163,22 +159,20 @@ namespace
|
|
|
a9add1 |
double x1, y1, x2, y2;
|
|
|
a9add1 |
|
|
|
a9add1 |
cairo_clip_extents(cr, &x1, &y1, &x2, &y2;;
|
|
|
a9add1 |
- extents.x = x1, extents.y = x2, extents.width = x2-x1, extents.height = y2-y1;
|
|
|
a9add1 |
-#if CAIRO_VERSION_MAJOR > 1 || (CAIRO_VERSION_MAJOR == 1 && CAIRO_VERSION_MINOR >= 10)
|
|
|
a9add1 |
+ extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
|
|
|
a9add1 |
+
|
|
|
a9add1 |
cairo_region_t *region = cairo_region_create_rectangle(&extents);
|
|
|
a9add1 |
|
|
|
a9add1 |
cairo_stroke_extents(cr, &x1, &y1, &x2, &y2;;
|
|
|
a9add1 |
- extents.x = x1, extents.y = x2, extents.width = x2-x1, extents.height = y2-y1;
|
|
|
a9add1 |
+ extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
|
|
|
a9add1 |
cairo_region_intersect_rectangle(region, &extents);
|
|
|
a9add1 |
|
|
|
a9add1 |
cairo_region_get_extents(region, &extents);
|
|
|
a9add1 |
cairo_region_destroy(region);
|
|
|
a9add1 |
-#endif
|
|
|
a9add1 |
|
|
|
a9add1 |
return extents;
|
|
|
a9add1 |
}
|
|
|
a9add1 |
}
|
|
|
a9add1 |
-#endif
|
|
|
a9add1 |
|
|
|
a9add1 |
#endif
|
|
|
a9add1 |
|
|
|
a9add1 |
@@ -213,7 +207,7 @@ bool SvpSalGraphics::drawAlphaRect(long nX, long nY, long nWidth, long nHeight,
|
|
|
a9add1 |
fTransparency);
|
|
|
a9add1 |
cairo_rectangle(cr, nX, nY, nWidth, nHeight);
|
|
|
a9add1 |
|
|
|
a9add1 |
- cairo_rectangle_int_t extents;
|
|
|
a9add1 |
+ cairo_rectangle_int_t extents = {0, 0, 0, 0};
|
|
|
a9add1 |
basebmp::IBitmapDeviceDamageTrackerSharedPtr xDamageTracker(m_aOrigDevice->getDamageTracker());
|
|
|
a9add1 |
if (xDamageTracker)
|
|
|
a9add1 |
extents = getFillDamage(cr);
|
|
|
a9add1 |
@@ -798,7 +792,7 @@ bool SvpSalGraphics::drawPolyLine(
|
|
|
a9add1 |
|
|
|
a9add1 |
AddPolygonToPath(cr, rPolyLine, rPolyLine.isClosed());
|
|
|
a9add1 |
|
|
|
a9add1 |
- cairo_rectangle_int_t extents;
|
|
|
a9add1 |
+ cairo_rectangle_int_t extents = {0, 0, 0, 0};
|
|
|
a9add1 |
basebmp::IBitmapDeviceDamageTrackerSharedPtr xDamageTracker(m_aDevice->getDamageTracker());
|
|
|
a9add1 |
|
|
|
a9add1 |
cairo_set_source_rgba(cr, m_aLineColor.getRed()/255.0,
|
|
|
a9add1 |
@@ -884,7 +878,7 @@ bool SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly, d
|
|
|
a9add1 |
for (const basegfx::B2DPolygon* pPoly = rPolyPoly.begin(); pPoly != rPolyPoly.end(); ++pPoly)
|
|
|
a9add1 |
AddPolygonToPath(cr, *pPoly, true);
|
|
|
a9add1 |
|
|
|
a9add1 |
- cairo_rectangle_int_t extents;
|
|
|
a9add1 |
+ cairo_rectangle_int_t extents = {0, 0, 0, 0};
|
|
|
a9add1 |
basebmp::IBitmapDeviceDamageTrackerSharedPtr xDamageTracker(m_aOrigDevice->getDamageTracker());
|
|
|
a9add1 |
if (xDamageTracker)
|
|
|
a9add1 |
extents = getFillDamage(cr);
|
|
|
a9add1 |
@@ -1067,15 +1061,10 @@ namespace
|
|
|
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 |
+ if (m_aDrawMode != basebmp::DrawMode_XOR)
|
|
|
a9add1 |
{
|
|
|
a9add1 |
- if (cairo_t* cr = createCairoContext(m_aOrigDevice))
|
|
|
a9add1 |
+ cairo_t* cr = createCairoContext(m_aOrigDevice);
|
|
|
a9add1 |
+ if (cr && cairo_version() >= CAIRO_VERSION_ENCODE(1, 10, 0))
|
|
|
a9add1 |
{
|
|
|
a9add1 |
if (!m_aOrigDevice->isTopDown())
|
|
|
a9add1 |
{
|
|
|
a9add1 |
@@ -1085,36 +1074,56 @@ void SvpSalGraphics::invert( long nX, long nY, long nWidth, long nHeight, SalInv
|
|
|
a9add1 |
|
|
|
a9add1 |
clipRegion(cr);
|
|
|
a9add1 |
|
|
|
a9add1 |
- cairo_pattern_t *pattern = create_stipple();
|
|
|
a9add1 |
-
|
|
|
a9add1 |
- cairo_rectangle_int_t extents;
|
|
|
a9add1 |
+ cairo_rectangle_int_t extents = {0, 0, 0, 0};
|
|
|
a9add1 |
basebmp::IBitmapDeviceDamageTrackerSharedPtr xDamageTracker(m_aOrigDevice->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 |
+ if (nFlags & SAL_INVERT_TRACKFRAME)
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ cairo_set_line_width(cr, 2.0);
|
|
|
a9add1 |
+ const double dashLengths[2] = { 4.0, 4.0 };
|
|
|
a9add1 |
+ cairo_set_dash(cr, dashLengths, 2, 0);
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ if (xDamageTracker)
|
|
|
a9add1 |
+ extents = getStrokeDamage(cr);
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ cairo_stroke(cr);
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
+ else
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ if (xDamageTracker)
|
|
|
a9add1 |
+ extents = getFillDamage(cr);
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ cairo_clip(cr);
|
|
|
a9add1 |
+
|
|
|
a9add1 |
+ if (nFlags & SAL_INVERT_50)
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ cairo_pattern_t *pattern = create_stipple();
|
|
|
a9add1 |
+ cairo_mask(cr, pattern);
|
|
|
a9add1 |
+ cairo_pattern_destroy(pattern);
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
+ else
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ cairo_paint(cr);
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
+ }
|
|
|
a9add1 |
|
|
|
a9add1 |
cairo_surface_flush(cairo_get_target(cr));
|
|
|
a9add1 |
cairo_destroy(cr); // unref
|
|
|
a9add1 |
|
|
|
a9add1 |
+ if (xDamageTracker)
|
|
|
a9add1 |
+ {
|
|
|
a9add1 |
+ xDamageTracker->damaged(basegfx::B2IBox(extents.x, extents.y, extents.x + extents.width,
|
|
|
a9add1 |
+ extents.y + extents.height));
|
|
|
a9add1 |
+ }
|
|
|
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 |
--
|
|
|
a9add1 |
2.5.0
|
|
|
a9add1 |
|