vcl/android/androidinst.cxx | 30 ---------- vcl/headless/svpgdi.cxx | 119 ++++++++++++++++------------------------ vcl/inc/android/androidinst.hxx | 2 vcl/inc/headless/svpgdi.hxx | 3 - 4 files changed, 51 insertions(+), 103 deletions(-)
New commits: commit 74ac2c25a71d820ce187282be6d66f4b66da5b18 Author: Caolán McNamara <caol...@redhat.com> Date: Sun Jan 31 22:25:07 2016 +0000 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 <c...@libreoffice.org> Reviewed-by: Caolán McNamara <caol...@redhat.com> Tested-by: Caolán McNamara <caol...@redhat.com> diff --git a/vcl/android/androidinst.cxx b/vcl/android/androidinst.cxx index b39face..99f4c50 100644 --- a/vcl/android/androidinst.cxx +++ b/vcl/android/androidinst.cxx @@ -37,26 +37,6 @@ public: virtual bool ErrorTrapPop( bool ) { return false; } }; -void AndroidSalInstance::damaged(AndroidSalFrame* /* frame */) -{ - static bool beenHere = false; - static jmethodID nCallbackDamaged = 0; - - // Check if we are running in an app that has registered for damage callbacks - // static public void callbackDamaged(); - // Call the Java layer to post an invalidate if necessary - - if (appClass != 0 && !beenHere) { - nCallbackDamaged = m_pJNIEnv->GetStaticMethodID(appClass, "callbackDamaged", "()V"); - if (nCallbackDamaged == 0) - LOGE("Could not find the callbackDamaged method"); - beenHere = true; - } - - if (appClass != 0 && nCallbackDamaged != 0) - m_pJNIEnv->CallStaticVoidMethod(appClass, nCallbackDamaged); -} - void AndroidSalInstance::GetWorkArea( Rectangle& rRect ) { rRect = Rectangle( Point( 0, 0 ), @@ -131,16 +111,6 @@ public: AndroidSalInstance::getInstance()->GetWorkArea( rRect ); } - virtual void damaged( const basegfx::B2IBox& rDamageRect) - { - if (rDamageRect.getWidth() <= 0 || - rDamageRect.getHeight() <= 0) - { - return; - } - AndroidSalInstance::getInstance()->damaged( this ); - } - virtual void UpdateSettings( AllSettings &rSettings ) { // Clobber the UI fonts diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index 74fd4d8..24220b7 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); diff --git a/vcl/inc/android/androidinst.hxx b/vcl/inc/android/androidinst.hxx index 764d0cf..8a0e1b9 100644 --- a/vcl/inc/android/androidinst.hxx +++ b/vcl/inc/android/androidinst.hxx @@ -38,8 +38,6 @@ public: // mainloop pieces virtual bool AnyInput( VclInputFlags nType ); - - void damaged(AndroidSalFrame *frame); }; #endif // INCLUDED_VCL_INC_ANDROID_ANDROIDINST_HXX diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index 9e1416c..be9aebe 100644 --- a/vcl/inc/headless/svpgdi.hxx +++ b/vcl/inc/headless/svpgdi.hxx @@ -48,7 +48,6 @@ class GlyphCache; class ServerFont; typedef struct _cairo cairo_t; typedef struct _cairo_surface cairo_surface_t; -typedef struct _cairo_rectangle_int cairo_rectangle_int_t; typedef struct _cairo_user_data_key cairo_user_data_key_t; enum PaintMode { OVERPAINT, XOR, INVERT }; @@ -218,7 +217,7 @@ public: #endif // ENABLE_CAIRO_CANVAS cairo_t* getCairoContext(bool bXorModeAllowed) const; - void releaseCairoContext(cairo_t* cr, bool bXorModeAllowed, const cairo_rectangle_int_t& extents) const; + void releaseCairoContext(cairo_t* cr, bool bXorModeAllowed, const basegfx::B2DRange& rExtents) const; static cairo_surface_t* createCairoSurface(const BitmapBuffer *pBuffer); void clipRegion(cairo_t* cr); };
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits