[Libreoffice-commits] core.git: include/vcl vcl/source

Chris Sherlock chris.sherlock79 at gmail.com
Mon Nov 3 01:12:26 PST 2014


 include/vcl/outdev.hxx         |   14 +----
 vcl/source/outdev/polyline.cxx |   96 ++++++++++++++++++-----------------------
 2 files changed, 48 insertions(+), 62 deletions(-)

New commits:
commit 886eadd0862963de36f2a4a6901b6752c767ac9c
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Sun Nov 2 13:42:34 2014 +1100

    vcl: merge DrawPolyLineDirect() and drawPolyLineDirectNoAACheck()
    
    I've merged these two functions, I just added a new function parameter to switch on and off
    the AA check, this function parameter defaults to false so DrawPolyLineDirect needs to do the
    AA check each time. If bBypassAACheck is set to true, then we automatically enable AA.
    
    Change-Id: Id2d9b2036a41716590f7b87f658f5bb210964392
    Reviewed-on: https://gerrit.libreoffice.org/12191
    Reviewed-by: Chris Sherlock <chris.sherlock79 at gmail.com>
    Tested-by: Chris Sherlock <chris.sherlock79 at gmail.com>

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index f505f04..30da2ea 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -726,12 +726,15 @@ public:
     void                        DrawPolyLine( const Polygon& rPoly,
                                               const LineInfo& rLineInfo );
 
+    // #i101491#
+    // Helper who tries to use SalGDI's DrawPolyLine direct and returns it's bool.
     bool                        DrawPolyLineDirect(
                                     const basegfx::B2DPolygon& rB2DPolygon,
                                     double fLineWidth = 0.0,
                                     double fTransparency = 0.0,
                                     basegfx::B2DLineJoin eLineJoin = basegfx::B2DLINEJOIN_NONE,
-                                    css::drawing::LineCap eLineCap = css::drawing::LineCap_BUTT);
+                                    css::drawing::LineCap eLineCap = css::drawing::LineCap_BUTT,
+                                    bool bBypassAACheck = false );
 private:
 
     // #i101491#
@@ -739,15 +742,6 @@ private:
     // switched on. Advantage is that line geometry is only temporarily used for paint
     SAL_DLLPRIVATE void         drawPolyLine(const Polygon& rPoly, const LineInfo& rLineInfo);
 
-
-    // #i101491#
-    // Helper who tries to use SalGDI's DrawPolyLine direct and returns it's bool. Contains no AA check.
-    SAL_DLLPRIVATE bool         drawPolyLineDirectNoAACheck(
-                                    const basegfx::B2DPolygon& rB2DPolygon,
-                                    double fLineWidth = 0.0,
-                                    double fTransparency = 0.0,
-                                    basegfx::B2DLineJoin eLineJoin = basegfx::B2DLINEJOIN_NONE,
-                                    css::drawing::LineCap eLineCap = css::drawing::LineCap_BUTT);
     ///@}
 
 
diff --git a/vcl/source/outdev/polyline.cxx b/vcl/source/outdev/polyline.cxx
index d896bd1..fd71306 100644
--- a/vcl/source/outdev/polyline.cxx
+++ b/vcl/source/outdev/polyline.cxx
@@ -197,14 +197,11 @@ void OutputDevice::DrawPolyLine( const basegfx::B2DPolygon& rB2DPolygon,
                           ROP_OVERPAINT == GetRasterOp() &&
                           IsLineColor());
 
-        if(bTryAA)
+        // when AA it is necessary to also paint the filled polygon's outline
+        // to avoid optical gaps
+        for(sal_uInt32 a(0); a < aAreaPolyPolygon.count(); a++)
         {
-            // when AA it is necessary to also paint the filled polygon's outline
-            // to avoid optical gaps
-            for(sal_uInt32 a(0); a < aAreaPolyPolygon.count(); a++)
-            {
-                drawPolyLineDirectNoAACheck(aAreaPolyPolygon.getB2DPolygon(a));
-            }
+            DrawPolyLineDirect( aAreaPolyPolygon.getB2DPolygon(a), 0.0, 0.0, basegfx::B2DLINEJOIN_NONE, css::drawing::LineCap_BUTT, bTryAA );
         }
     }
     else
@@ -267,49 +264,12 @@ void OutputDevice::drawPolyLine(const Polygon& rPoly, const LineInfo& rLineInfo)
         mpAlphaVDev->DrawPolyLine( rPoly, rLineInfo );
 }
 
-bool OutputDevice::drawPolyLineDirectNoAACheck( const basegfx::B2DPolygon& rB2DPolygon,
-                                              double fLineWidth,
-                                              double fTransparency,
-                                              basegfx::B2DLineJoin eLineJoin,
-                                              css::drawing::LineCap eLineCap)
-{
-    const basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
-    basegfx::B2DVector aB2DLineWidth(1.0, 1.0);
-
-    // transform the line width if used
-    if( fLineWidth != 0.0 )
-    {
-        aB2DLineWidth = aTransform * ::basegfx::B2DVector( fLineWidth, 0.0 );
-    }
-
-    // transform the polygon
-    basegfx::B2DPolygon aB2DPolygon(rB2DPolygon);
-    aB2DPolygon.transform(aTransform);
-
-    if((mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE) &&
-       aB2DPolygon.count() < 1000)
-    {
-        // #i98289#, #i101491#
-        // better to remove doubles on device coordinates. Also assume from a given amount
-        // of points that the single edges are not long enough to smooth
-        aB2DPolygon.removeDoublePoints();
-        aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon);
-    }
-
-    // draw the polyline
-    return mpGraphics->DrawPolyLine( aB2DPolygon,
-                                     fTransparency,
-                                     aB2DLineWidth,
-                                     eLineJoin,
-                                     eLineCap,
-                                     this);
-}
-
 bool OutputDevice::DrawPolyLineDirect( const basegfx::B2DPolygon& rB2DPolygon,
-                                          double fLineWidth,
-                                          double fTransparency,
-                                          basegfx::B2DLineJoin eLineJoin,
-                                          css::drawing::LineCap eLineCap)
+                                       double fLineWidth,
+                                       double fTransparency,
+                                       basegfx::B2DLineJoin eLineJoin,
+                                       css::drawing::LineCap eLineCap,
+                                       bool bBypassAACheck )
 {
     // AW: Do NOT paint empty PolyPolygons
     if(!rB2DPolygon.count())
@@ -328,14 +288,46 @@ bool OutputDevice::DrawPolyLineDirect( const basegfx::B2DPolygon& rB2DPolygon,
     if( mbInitLineColor )
         InitLineColor();
 
-    const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) &&
+    const bool bTryAA( bBypassAACheck ||
+                      ((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) &&
                       mpGraphics->supportsOperation(OutDevSupport_B2DDraw) &&
                       ROP_OVERPAINT == GetRasterOp() &&
-                      IsLineColor());
+                      IsLineColor()));
 
     if(bTryAA)
     {
-        if(drawPolyLineDirectNoAACheck(rB2DPolygon, fLineWidth, fTransparency, eLineJoin, eLineCap))
+        const basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
+        basegfx::B2DVector aB2DLineWidth(1.0, 1.0);
+
+        // transform the line width if used
+        if( fLineWidth != 0.0 )
+        {
+            aB2DLineWidth = aTransform * ::basegfx::B2DVector( fLineWidth, 0.0 );
+        }
+
+        // transform the polygon
+        basegfx::B2DPolygon aB2DPolygon(rB2DPolygon);
+        aB2DPolygon.transform(aTransform);
+
+        if((mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE) &&
+           aB2DPolygon.count() < 1000)
+        {
+            // #i98289#, #i101491#
+            // better to remove doubles on device coordinates. Also assume from a given amount
+            // of points that the single edges are not long enough to smooth
+            aB2DPolygon.removeDoublePoints();
+            aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon);
+        }
+
+        // draw the polyline
+        bool bDrawSuccess = mpGraphics->DrawPolyLine( aB2DPolygon,
+                                                      fTransparency,
+                                                      aB2DLineWidth,
+                                                      eLineJoin,
+                                                      eLineCap,
+                                                      this );
+
+        if( bDrawSuccess )
         {
             // worked, add metafile action (if recorded) and return true
             if( mpMetaFile )


More information about the Libreoffice-commits mailing list