summaryrefslogtreecommitdiff
path: root/vcl/headless
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2016-01-31 22:25:07 +0000
committerCaolán McNamara <caolanm@redhat.com>2016-02-01 17:52:18 +0000
commit74ac2c25a71d820ce187282be6d66f4b66da5b18 (patch)
tree73d530a5dbb82e8a2277e4edd1bcf0a7f082b6b8 /vcl/headless
parent2387d277f7c717f9f4035235f71f15f5ccdc9751 (diff)
work around lack of cairo_rectangle_int_t with basegfx
ditch the CAIRO_VERSION_ENCODE(1, 10, 0) + sub optional damage rect and just use our always-available basegfx foo here. Change-Id: I680453180f4725ac37cabf38d71b935c99edf6c7 Reviewed-on: https://gerrit.libreoffice.org/21971 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Caolán McNamara <caolanm@redhat.com> Tested-by: Caolán McNamara <caolanm@redhat.com>
Diffstat (limited to 'vcl/headless')
-rw-r--r--vcl/headless/svpgdi.cxx119
1 files changed, 50 insertions, 69 deletions
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index 74fd4d85f13c..24220b77408b 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -37,63 +37,51 @@
#include <cairo.h>
#if CAIRO_VERSION < CAIRO_VERSION_ENCODE(1, 10, 0)
-
# define CAIRO_OPERATOR_DIFFERENCE (static_cast<cairo_operator_t>(23))
-
- struct _cairo_rectangle_int
- {
- int x, y;
- int width, height;
- };
-
#endif
namespace
{
- cairo_rectangle_int_t getFillDamage(cairo_t* cr)
+ basegfx::B2DRange getClipBox(cairo_t* cr)
{
- cairo_rectangle_int_t extents;
double x1, y1, x2, y2;
cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
- extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
-#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)
- cairo_region_t *region = cairo_region_create_rectangle(&extents);
+ return basegfx::B2DRange(x1, y1, x2, y2);
+ }
+
+ basegfx::B2DRange getFillDamage(cairo_t* cr)
+ {
+ double x1, y1, x2, y2;
cairo_fill_extents(cr, &x1, &y1, &x2, &y2);
- extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
- cairo_region_intersect_rectangle(region, &extents);
- cairo_region_get_extents(region, &extents);
- cairo_region_destroy(region);
-#endif
+ return basegfx::B2DRange(x1, y1, x2, y2);
+ }
- return extents;
+ basegfx::B2DRange getClippedFillDamage(cairo_t* cr)
+ {
+ basegfx::B2DRange aDamageRect(getFillDamage(cr));
+ aDamageRect.intersect(getClipBox(cr));
+ return aDamageRect;
}
- cairo_rectangle_int_t getStrokeDamage(cairo_t* cr)
+ basegfx::B2DRange getStrokeDamage(cairo_t* cr)
{
- cairo_rectangle_int_t extents;
double x1, y1, x2, y2;
- cairo_clip_extents(cr, &x1, &y1, &x2, &y2);
- extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
-
-#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)
- cairo_region_t *region = cairo_region_create_rectangle(&extents);
-
cairo_stroke_extents(cr, &x1, &y1, &x2, &y2);
- extents.x = x1, extents.y = y1, extents.width = x2-x1, extents.height = y2-y1;
- cairo_region_intersect_rectangle(region, &extents);
- cairo_region_get_extents(region, &extents);
- cairo_region_destroy(region);
-#endif
-
- return extents;
+ return basegfx::B2DRange(x1, y1, x2, y2);
}
+ basegfx::B2DRange getClippedStrokeDamage(cairo_t* cr)
+ {
+ basegfx::B2DRange aDamageRect(getStrokeDamage(cr));
+ aDamageRect.intersect(getClipBox(cr));
+ return aDamageRect;
+ }
}
#ifndef IOS
@@ -243,7 +231,7 @@ bool SvpSalGraphics::drawAlphaBitmap( const SalTwoRect& rTR, const SalBitmap& rS
cairo_rectangle(cr, rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight);
- cairo_rectangle_int_t extents = getFillDamage(cr);
+ basegfx::B2DRange extents = getClippedFillDamage(cr);
cairo_clip(cr);
@@ -309,7 +297,7 @@ bool SvpSalGraphics::drawTransformedBitmap(
cairo_transform(cr, &matrix);
cairo_rectangle(cr, 0, 0, aSize.Width(), aSize.Height());
- cairo_rectangle_int_t extents = getFillDamage(cr);
+ basegfx::B2DRange extents = getClippedFillDamage(cr);
cairo_clip(cr);
cairo_set_source_surface(cr, source, 0, 0);
@@ -349,7 +337,7 @@ bool SvpSalGraphics::drawAlphaRect(long nX, long nY, long nWidth, long nHeight,
const double fTransparency = (100 - nTransparency) * (1.0/100);
- cairo_rectangle_int_t extents = {0, 0, 0, 0};
+ basegfx::B2DRange extents;
cairo_rectangle(cr, nX, nY, nWidth, nHeight);
@@ -361,7 +349,7 @@ bool SvpSalGraphics::drawAlphaRect(long nX, long nY, long nWidth, long nHeight,
fTransparency);
if (m_aLineColor == SALCOLOR_NONE)
- extents = getFillDamage(cr);
+ extents = getClippedFillDamage(cr);
cairo_fill_preserve(cr);
}
@@ -373,7 +361,7 @@ bool SvpSalGraphics::drawAlphaRect(long nX, long nY, long nWidth, long nHeight,
SALCOLOR_BLUE(m_aLineColor)/255.0,
fTransparency);
- extents = getStrokeDamage(cr);
+ extents = getClippedStrokeDamage(cr);
cairo_stroke_preserve(cr);
}
@@ -681,7 +669,7 @@ void SvpSalGraphics::drawLine( long nX1, long nY1, long nX2, long nY2 )
applyColor(cr, m_aLineColor);
- cairo_rectangle_int_t extents = getStrokeDamage(cr);
+ basegfx::B2DRange extents = getClippedStrokeDamage(cr);
cairo_stroke(cr);
@@ -765,12 +753,12 @@ bool SvpSalGraphics::drawPolyLine(
cairo_set_miter_limit(cr, 15.0);
- cairo_rectangle_int_t extents = {0, 0, 0, 0};
+ basegfx::B2DRange extents;
if (!bNoJoin)
{
AddPolygonToPath(cr, rPolyLine, rPolyLine.isClosed(), !getAntiAliasB2DDraw(), true);
- extents = getStrokeDamage(cr);
+ extents = getClippedStrokeDamage(cr);
cairo_stroke(cr);
}
else
@@ -781,8 +769,6 @@ bool SvpSalGraphics::drawPolyLine(
aEdge.append(rPolyLine.getB2DPoint(0));
aEdge.append(basegfx::B2DPoint(0.0, 0.0));
- std::vector<cairo_rectangle_int_t> aExtents;
- aExtents.reserve(nEdgeCount);
for (sal_uInt32 i = 0; i < nEdgeCount; ++i)
{
const sal_uInt32 nNextIndex((i + 1) % nPointCount);
@@ -791,21 +777,16 @@ bool SvpSalGraphics::drawPolyLine(
aEdge.setPrevControlPoint(1, rPolyLine.getPrevControlPoint(nNextIndex));
AddPolygonToPath(cr, aEdge, false, !getAntiAliasB2DDraw(), true);
- aExtents.push_back(getStrokeDamage(cr));
+
+ extents.expand(getStrokeDamage(cr));
+
cairo_stroke(cr);
// prepare next step
aEdge.setB2DPoint(0, aEdge.getB2DPoint(1));
}
-#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 10, 0)
- cairo_region_t* pRegion = cairo_region_create_rectangles(aExtents.data(), aExtents.size());
- cairo_region_get_extents(pRegion, &extents);
- cairo_region_destroy(pRegion);
-#else
- if (!aExtents.empty())
- extents = aExtents[0];
-#endif
+ extents.intersect(getClipBox(cr));
}
releaseCairoContext(cr, false, extents);
@@ -852,7 +833,7 @@ bool SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly, d
setupPolyPolygon(cr, rPolyPoly);
- cairo_rectangle_int_t extents = {0, 0, 0, 0};
+ basegfx::B2DRange extents;
if (m_aFillColor != SALCOLOR_NONE)
{
@@ -862,7 +843,7 @@ bool SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly, d
1.0-fTransparency);
if (m_aLineColor == SALCOLOR_NONE)
- extents = getFillDamage(cr);
+ extents = getClippedFillDamage(cr);
cairo_fill_preserve(cr);
}
@@ -874,7 +855,7 @@ bool SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly, d
SALCOLOR_BLUE(m_aLineColor)/255.0,
1.0-fTransparency);
- extents = getStrokeDamage(cr);
+ extents = getClippedStrokeDamage(cr);
cairo_stroke_preserve(cr);
}
@@ -907,20 +888,20 @@ void SvpSalGraphics::drawPolyPolygon(const basegfx::B2DPolyPolygon& rPolyPoly)
setupPolyPolygon(cr, rPolyPoly);
- cairo_rectangle_int_t extents = {0, 0, 0, 0};
+ basegfx::B2DRange extents;
if (m_aFillColor != SALCOLOR_NONE)
{
applyColor(cr, m_aFillColor);
if (m_aLineColor == SALCOLOR_NONE)
- extents = getFillDamage(cr);
+ extents = getClippedFillDamage(cr);
cairo_fill_preserve(cr);
}
if (m_aLineColor != SALCOLOR_NONE)
{
applyColor(cr, m_aLineColor);
- extents = getStrokeDamage(cr);
+ extents = getClippedStrokeDamage(cr);
cairo_stroke_preserve(cr);
}
@@ -939,12 +920,12 @@ void SvpSalGraphics::copyArea( long nDestX,
copyBits(aTR, this);
}
-static cairo_rectangle_int_t renderSource(cairo_t* cr, const SalTwoRect& rTR,
+static basegfx::B2DRange renderSource(cairo_t* cr, const SalTwoRect& rTR,
cairo_surface_t* source)
{
cairo_rectangle(cr, rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight);
- cairo_rectangle_int_t extents = getFillDamage(cr);
+ basegfx::B2DRange extents = getClippedFillDamage(cr);
cairo_clip(cr);
@@ -962,7 +943,7 @@ void SvpSalGraphics::copySource( const SalTwoRect& rTR,
cairo_t* cr = getCairoContext(false);
clipRegion(cr);
- cairo_rectangle_int_t extents = renderSource(cr, rTR, source);
+ basegfx::B2DRange extents = renderSource(cr, rTR, source);
releaseCairoContext(cr, false, extents);
}
@@ -1089,7 +1070,7 @@ void SvpSalGraphics::drawMask( const SalTwoRect& rTR,
cairo_rectangle(cr, rTR.mnDestX, rTR.mnDestY, rTR.mnDestWidth, rTR.mnDestHeight);
- cairo_rectangle_int_t extents = getFillDamage(cr);
+ basegfx::B2DRange extents = getClippedFillDamage(cr);
cairo_clip(cr);
@@ -1156,7 +1137,7 @@ void SvpSalGraphics::invert(const basegfx::B2DPolygon &rPoly, SalInvert nFlags)
cairo_t* cr = getCairoContext(false);
clipRegion(cr);
- cairo_rectangle_int_t extents = {0, 0, 0, 0};
+ basegfx::B2DRange extents;
AddPolygonToPath(cr, rPoly, true, !getAntiAliasB2DDraw(), false);
@@ -1177,13 +1158,13 @@ void SvpSalGraphics::invert(const basegfx::B2DPolygon &rPoly, SalInvert nFlags)
const double dashLengths[2] = { 4.0, 4.0 };
cairo_set_dash(cr, dashLengths, 2, 0);
- extents = getStrokeDamage(cr);
+ extents = getClippedStrokeDamage(cr);
cairo_stroke(cr);
}
else
{
- extents = getFillDamage(cr);
+ extents = getClippedFillDamage(cr);
cairo_clip(cr);
@@ -1297,10 +1278,10 @@ cairo_user_data_key_t* SvpSalGraphics::getDamageKey()
return &aDamageKey;
}
-void SvpSalGraphics::releaseCairoContext(cairo_t* cr, bool bXorModeAllowed, const cairo_rectangle_int_t& extents) const
+void SvpSalGraphics::releaseCairoContext(cairo_t* cr, bool bXorModeAllowed, const basegfx::B2DRange& rExtents) const
{
- sal_Int32 nExtentsLeft(extents.x), nExtentsTop(extents.y);
- sal_Int32 nExtentsRight(extents.x + extents.width), nExtentsBottom(extents.y + extents.height);
+ sal_Int32 nExtentsLeft(rExtents.getMinX()), nExtentsTop(rExtents.getMinY());
+ sal_Int32 nExtentsRight(rExtents.getMaxX()), nExtentsBottom(rExtents.getMaxY());
sal_Int32 nWidth = cairo_image_surface_get_width(m_pSurface);
sal_Int32 nHeight = cairo_image_surface_get_height(m_pSurface);
nExtentsLeft = std::max<sal_Int32>(nExtentsLeft, 0);