[Libreoffice-commits] core.git: vcl/android vcl/headless vcl/inc

Caolán McNamara caolanm at redhat.com
Mon Feb 1 17:52:59 UTC 2016


 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 <caolanm at 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 <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at 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);
 };


More information about the Libreoffice-commits mailing list