Author: alg
Date: Fri May 10 08:48:11 2013
New Revision: 1480935

URL: http://svn.apache.org/r1480935
Log:
i110384 added better fat line rendering where possible

Modified:
    
openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclpixelprocessor2d.hxx
    
openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx
    
openoffice/trunk/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
    openoffice/trunk/main/drawinglayer/source/processor2d/vclprocessor2d.cxx
    openoffice/trunk/main/vcl/inc/vcl/outdev.hxx
    openoffice/trunk/main/vcl/source/gdi/outdev.cxx

Modified: 
openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclpixelprocessor2d.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclpixelprocessor2d.hxx?rev=1480935&r1=1480934&r2=1480935&view=diff
==============================================================================
--- 
openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclpixelprocessor2d.hxx
 (original)
+++ 
openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclpixelprocessor2d.hxx
 Fri May 10 08:48:11 2013
@@ -29,6 +29,15 @@
 #include <vcl/outdev.hxx>
 
 //////////////////////////////////////////////////////////////////////////////
+// predefines
+
+namespace drawinglayer { namespace primitive2d {
+    class PolyPolygonColorPrimitive2D;
+    class PolygonHairlinePrimitive2D;
+    class PolygonStrokePrimitive2D;
+}}
+
+//////////////////////////////////////////////////////////////////////////////
 
 namespace drawinglayer
 {
@@ -49,6 +58,11 @@ namespace drawinglayer
              */
                        virtual void processBasePrimitive2D(const 
primitive2d::BasePrimitive2D& rCandidate);
 
+            // some helpers to try direct paints (shortcuts)
+            bool tryDrawPolyPolygonColorPrimitive2DDirect(const 
drawinglayer::primitive2d::PolyPolygonColorPrimitive2D& rSource, double 
fTransparency);
+            bool tryDrawPolygonHairlinePrimitive2DDirect(const 
drawinglayer::primitive2d::PolygonHairlinePrimitive2D& rSource, double 
fTransparency);
+            bool tryDrawPolygonStrokePrimitive2DDirect(const 
drawinglayer::primitive2d::PolygonStrokePrimitive2D& rSource, double 
fTransparency);
+
         public:
                        /// constructor/destructor
                        VclPixelProcessor2D(

Modified: 
openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx?rev=1480935&r1=1480934&r2=1480935&view=diff
==============================================================================
--- 
openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx
 (original)
+++ 
openoffice/trunk/main/drawinglayer/inc/drawinglayer/processor2d/vclprocessor2d.hxx
 Fri May 10 08:48:11 2013
@@ -41,7 +41,6 @@ namespace drawinglayer { namespace primi
        class FillGraphicPrimitive2D;
        class PolyPolygonGradientPrimitive2D;
        class PolyPolygonGraphicPrimitive2D;
-       class PolyPolygonColorPrimitive2D;
        class MetafilePrimitive2D;
        class MaskPrimitive2D;
        class UnifiedTransparencePrimitive2D;
@@ -98,7 +97,6 @@ namespace drawinglayer
                        void RenderBitmapPrimitive2D(const 
primitive2d::BitmapPrimitive2D& rBitmapCandidate);
                        void RenderFillGraphicPrimitive2D(const 
primitive2d::FillGraphicPrimitive2D& rFillBitmapCandidate);
                        void RenderPolyPolygonGraphicPrimitive2D(const 
primitive2d::PolyPolygonGraphicPrimitive2D& rPolygonCandidate);
-                       void RenderPolyPolygonColorPrimitive2D(const 
primitive2d::PolyPolygonColorPrimitive2D& rPolygonCandidate);
                        void RenderMaskPrimitive2DPixel(const 
primitive2d::MaskPrimitive2D& rMaskCandidate);
                        void RenderModifiedColorPrimitive2D(const 
primitive2d::ModifiedColorPrimitive2D& rModifiedCandidate);
                        void RenderUnifiedTransparencePrimitive2D(const 
primitive2d::UnifiedTransparencePrimitive2D& rTransCandidate);

Modified: 
openoffice/trunk/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx?rev=1480935&r1=1480934&r2=1480935&view=diff
==============================================================================
--- 
openoffice/trunk/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx 
(original)
+++ 
openoffice/trunk/main/drawinglayer/source/processor2d/vclpixelprocessor2d.cxx 
Fri May 10 08:48:11 2013
@@ -99,6 +99,141 @@ namespace drawinglayer
             mpOutputDevice->SetAntialiasing(mpOutputDevice->GetAntialiasing() 
& ~ANTIALIASING_ENABLE_B2DDRAW);
                }
 
+        bool 
VclPixelProcessor2D::tryDrawPolyPolygonColorPrimitive2DDirect(const 
drawinglayer::primitive2d::PolyPolygonColorPrimitive2D& rSource, double 
fTransparency)
+        {
+            basegfx::B2DPolyPolygon 
aLocalPolyPolygon(rSource.getB2DPolyPolygon());
+
+            if(!aLocalPolyPolygon.count())
+            {
+                // no geometry, done
+                return true;
+            }
+
+            const basegfx::BColor 
aPolygonColor(maBColorModifierStack.getModifiedColor(rSource.getBColor()));
+
+            mpOutputDevice->SetFillColor(Color(aPolygonColor));
+            mpOutputDevice->SetLineColor();
+            aLocalPolyPolygon.transform(maCurrentTransformation);
+            mpOutputDevice->DrawTransparent(
+                aLocalPolyPolygon, 
+                fTransparency);
+
+            return true;
+        }
+
+        bool 
VclPixelProcessor2D::tryDrawPolygonHairlinePrimitive2DDirect(const 
drawinglayer::primitive2d::PolygonHairlinePrimitive2D& rSource, double 
fTransparency)
+        {
+            basegfx::B2DPolygon aLocalPolygon(rSource.getB2DPolygon());
+
+            if(!aLocalPolygon.count())
+            {
+                // no geometry, done
+                return true;
+            }
+
+            const basegfx::BColor 
aLineColor(maBColorModifierStack.getModifiedColor(rSource.getBColor()));
+
+            mpOutputDevice->SetFillColor();
+            mpOutputDevice->SetLineColor(Color(aLineColor));
+            aLocalPolygon.transform(maCurrentTransformation);
+
+            // try drawing; if it did not work, use standard fallback
+            if(mpOutputDevice->TryDrawPolyLineDirect(
+                aLocalPolygon, 
+                0.0, 
+                fTransparency))
+            {
+                return true;
+            }
+
+            return false;
+        }
+
+        bool VclPixelProcessor2D::tryDrawPolygonStrokePrimitive2DDirect(const 
drawinglayer::primitive2d::PolygonStrokePrimitive2D& rSource, double 
fTransparency)
+        {
+            basegfx::B2DPolygon aLocalPolygon(rSource.getB2DPolygon());
+
+            if(!aLocalPolygon.count())
+            {
+                // no geometry, done
+                return true;
+            }
+
+            aLocalPolygon = 
basegfx::tools::simplifyCurveSegments(aLocalPolygon);
+            basegfx::B2DPolyPolygon aHairLinePolyPolygon;
+
+            if(rSource.getStrokeAttribute().isDefault() || 0.0 == 
rSource.getStrokeAttribute().getFullDotDashLen())
+            {
+                // no line dashing, just copy
+                aHairLinePolyPolygon.append(aLocalPolygon);
+            }
+            else
+            {
+                // apply LineStyle
+                basegfx::tools::applyLineDashing(
+                    aLocalPolygon, 
+                    rSource.getStrokeAttribute().getDotDashArray(), 
+                    &aHairLinePolyPolygon, 
+                    0, 
+                    rSource.getStrokeAttribute().getFullDotDashLen());
+            }
+
+            if(!aHairLinePolyPolygon.count())
+            {
+                // no geometry, done
+                return true;
+            }
+
+            const basegfx::BColor aLineColor(
+                maBColorModifierStack.getModifiedColor(
+                    rSource.getLineAttribute().getColor()));
+
+            mpOutputDevice->SetFillColor();
+            mpOutputDevice->SetLineColor(Color(aLineColor));
+            aHairLinePolyPolygon.transform(maCurrentTransformation);
+
+            double fLineWidth(rSource.getLineAttribute().getWidth());
+
+            if(basegfx::fTools::more(fLineWidth, 0.0))
+            {
+                basegfx::B2DVector aLineWidth(fLineWidth, 0.0);
+
+                aLineWidth = maCurrentTransformation * aLineWidth;
+                fLineWidth = aLineWidth.getLength();
+            }
+
+            bool bHasPoints(false);
+            bool bTryWorked(false);
+
+            for(sal_uInt32 a(0); a < aHairLinePolyPolygon.count(); a++)
+            {
+                const basegfx::B2DPolygon 
aSingle(aHairLinePolyPolygon.getB2DPolygon(a));
+
+                if(aSingle.count())
+                {
+                    bHasPoints = true;
+
+                    if(mpOutputDevice->TryDrawPolyLineDirect(
+                        aSingle, 
+                        fLineWidth, 
+                        fTransparency,
+                        rSource.getLineAttribute().getLineJoin(),
+                        rSource.getLineAttribute().getLineCap()))
+                    {
+                        bTryWorked = true;
+                    }
+                }
+            }
+
+            if(!bTryWorked && !bHasPoints)
+            {
+                // no geometry despite try
+                bTryWorked = true;
+            }
+
+            return bTryWorked;
+        }
+
                void VclPixelProcessor2D::processBasePrimitive2D(const 
primitive2d::BasePrimitive2D& rCandidate)
                {
                        switch(rCandidate.getPrimitive2DID())
@@ -176,8 +311,17 @@ namespace drawinglayer
                                }
                                case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D :
                                {
-                                       // direct draw of hairline
-                                       
RenderPolygonHairlinePrimitive2D(static_cast< const 
primitive2d::PolygonHairlinePrimitive2D& >(rCandidate), true);
+                    // try to use directly
+                    const primitive2d::PolygonHairlinePrimitive2D& 
rPolygonHairlinePrimitive2D = static_cast< const 
primitive2d::PolygonHairlinePrimitive2D& >(rCandidate);
+                    static bool bAllowed(true);
+
+                    if(bAllowed && 
tryDrawPolygonHairlinePrimitive2DDirect(rPolygonHairlinePrimitive2D, 0.0))
+                    {
+                        break;
+                    }
+
+                    // direct draw of hairline
+                    
RenderPolygonHairlinePrimitive2D(rPolygonHairlinePrimitive2D, true);
                                        break;
                                }
                                case PRIMITIVE2D_ID_BITMAPPRIMITIVE2D :
@@ -247,8 +391,53 @@ namespace drawinglayer
                                }
                                case PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D 
:
                                {
-                                       // direct draw of PolyPolygon with color
-                                       
RenderPolyPolygonColorPrimitive2D(static_cast< const 
primitive2d::PolyPolygonColorPrimitive2D& >(rCandidate));
+                    // try to use directly
+                    const primitive2d::PolyPolygonColorPrimitive2D& 
rPolyPolygonColorPrimitive2D = static_cast< const 
primitive2d::PolyPolygonColorPrimitive2D& >(rCandidate);
+                    basegfx::B2DPolyPolygon aLocalPolyPolygon;
+                    static bool bAllowed(true);
+
+                    if(bAllowed && 
tryDrawPolyPolygonColorPrimitive2DDirect(rPolyPolygonColorPrimitive2D, 0.0))
+                    {
+                        // okay, done. In this case no gaps should have to be 
repaired, too
+                    }
+                    else
+                    {
+                        // direct draw of PolyPolygon with color
+                        const basegfx::BColor 
aPolygonColor(maBColorModifierStack.getModifiedColor(rPolyPolygonColorPrimitive2D.getBColor()));
+
+                        mpOutputDevice->SetFillColor(Color(aPolygonColor));
+                        mpOutputDevice->SetLineColor();
+                        aLocalPolyPolygon = 
rPolyPolygonColorPrimitive2D.getB2DPolyPolygon();
+                        aLocalPolyPolygon.transform(maCurrentTransformation);
+                        mpOutputDevice->DrawPolyPolygon(aLocalPolyPolygon);
+                    }
+
+                    // when AA is on and this filled polygons are the result 
of stroked line geometry,
+                    // draw the geometry once extra as lines to avoid AA 
'gaps' between partial polygons
+                    // Caution: This is needed in both cases (!)
+                    if(mnPolygonStrokePrimitive2D
+                        && getOptionsDrawinglayer().IsAntiAliasing()
+                        && (mpOutputDevice->GetAntialiasing() & 
ANTIALIASING_ENABLE_B2DDRAW))
+                    {
+                        const basegfx::BColor 
aPolygonColor(maBColorModifierStack.getModifiedColor(rPolyPolygonColorPrimitive2D.getBColor()));
+                        sal_uInt32 nCount(aLocalPolyPolygon.count());
+
+                        if(!nCount)
+                        {
+                            aLocalPolyPolygon = 
rPolyPolygonColorPrimitive2D.getB2DPolyPolygon();
+                            
aLocalPolyPolygon.transform(maCurrentTransformation);
+                            nCount = aLocalPolyPolygon.count();
+                        }
+
+                        mpOutputDevice->SetFillColor();
+                        mpOutputDevice->SetLineColor(Color(aPolygonColor));
+
+                        for(sal_uInt32 a(0); a < nCount; a++)
+                        {
+                            
mpOutputDevice->DrawPolyLine(aLocalPolyPolygon.getB2DPolygon(a), 0.0);
+                        }
+                    }
+
                                        break;
                                }
                                case PRIMITIVE2D_ID_METAFILEPRIMITIVE2D :
@@ -317,28 +506,44 @@ namespace drawinglayer
                                                                        {
                                                                                
case PRIMITIVE2D_ID_POLYPOLYGONCOLORPRIMITIVE2D:
                                                                                
{
-                                                                               
        // single transparent PolyPolygon identified, use directly
-                                                                               
        const primitive2d::PolyPolygonColorPrimitive2D* pPoPoColor = 
static_cast< const primitive2d::PolyPolygonColorPrimitive2D* >(pBasePrimitive);
-                                                                               
        OSL_ENSURE(pPoPoColor, "OOps, PrimitiveID and PrimitiveType do not 
match (!)");
-                                                                               
        const basegfx::BColor 
aPolygonColor(maBColorModifierStack.getModifiedColor(pPoPoColor->getBColor()));
-                                                                               
        mpOutputDevice->SetFillColor(Color(aPolygonColor));
-                                                                               
        mpOutputDevice->SetLineColor();
-                                                                               
-                                                                               
        basegfx::B2DPolyPolygon 
aLocalPolyPolygon(pPoPoColor->getB2DPolyPolygon());
-                                                                               
        aLocalPolyPolygon.transform(maCurrentTransformation);
-                                                                               
-                                                                               
        mpOutputDevice->DrawTransparent(aLocalPolyPolygon, 
rUniTransparenceCandidate.getTransparence());
-                                                                               
        bDrawTransparentUsed = true;
-                                                                               
        break;
-                                                                               
}
-                                                                               
// #i# need to wait for #i101378# which is in CWS vcl112 to directly paint 
transparent hairlines
-                                                                               
//case PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D:
-                                                                               
//{
-                                                                               
//      // single transparent PolygonHairlinePrimitive2D identified, use 
directly
-                                                                               
//      const primitive2d::PolygonHairlinePrimitive2D* pPoHair = static_cast< 
const primitive2d::PolygonHairlinePrimitive2D* >(pBasePrimitive);
-                                                                               
//      OSL_ENSURE(pPoHair, "OOps, PrimitiveID and PrimitiveType do not match 
(!)");
-                                                                               
//      break;
-                                                                               
//}
+                                            // single transparent PolyPolygon 
identified, use directly
+                                            const 
primitive2d::PolyPolygonColorPrimitive2D* pPoPoColor = static_cast< const 
primitive2d::PolyPolygonColorPrimitive2D* >(pBasePrimitive);
+                                            OSL_ENSURE(pPoPoColor, "OOps, 
PrimitiveID and PrimitiveType do not match (!)");
+                                            bDrawTransparentUsed = 
tryDrawPolyPolygonColorPrimitive2DDirect(*pPoPoColor, 
rUniTransparenceCandidate.getTransparence());
+                                            break;
+                                        }
+                                        case 
PRIMITIVE2D_ID_POLYGONHAIRLINEPRIMITIVE2D:
+                                        {
+                                            // single transparent 
PolygonHairlinePrimitive2D identified, use directly
+                                            const 
primitive2d::PolygonHairlinePrimitive2D* pPoHair = static_cast< const 
primitive2d::PolygonHairlinePrimitive2D* >(pBasePrimitive);
+                                            OSL_ENSURE(pPoHair, "OOps, 
PrimitiveID and PrimitiveType do not match (!)");
+
+                                            // do no tallow by default - 
problem is that self-overlapping parts of this geometry will
+                                            // not be in a all-same 
transparency but will already alpha-cover themselves with blending.
+                                            // This is not what the 
UnifiedTransparencePrimitive2D defines: It requires all it's
+                                            // content to be uniformely 
transparent.
+                                            // For hairline the effect is 
pretty minimal, but still not correct.
+                                            static bool bAllowed(false);
+
+                                            bDrawTransparentUsed = bAllowed && 
tryDrawPolygonHairlinePrimitive2DDirect(*pPoHair, 
rUniTransparenceCandidate.getTransparence());
+                                            break;
+                                        }
+                                        case 
PRIMITIVE2D_ID_POLYGONSTROKEPRIMITIVE2D:
+                                        {
+                                            // single transparent 
PolygonStrokePrimitive2D identified, use directly
+                                            const 
primitive2d::PolygonStrokePrimitive2D* pPoStroke = static_cast< const 
primitive2d::PolygonStrokePrimitive2D* >(pBasePrimitive);
+                                            OSL_ENSURE(pPoStroke, "OOps, 
PrimitiveID and PrimitiveType do not match (!)");
+
+                                            // do no tallow by default - 
problem is that self-overlapping parts of this geometry will
+                                            // not be in a all-same 
transparency but will already alpha-cover themselves with blending.
+                                            // This is not what the 
UnifiedTransparencePrimitive2D defines: It requires all it's
+                                            // content to be uniformely 
transparent.
+                                            // To check, acitvate and draw a 
wide transparent self-crossing line/curve
+                                            static bool bAllowed(false);
+
+                                            bDrawTransparentUsed = bAllowed && 
tryDrawPolygonStrokePrimitive2DDirect(*pPoStroke, 
rUniTransparenceCandidate.getTransparence());
+                                            break;
+                                        }
                                                                        }
                                                                }
                                                }
@@ -438,6 +643,14 @@ namespace drawinglayer
                                }
                                case PRIMITIVE2D_ID_POLYGONSTROKEPRIMITIVE2D:
                                {
+                    // try to use directly
+                    const primitive2d::PolygonStrokePrimitive2D& 
rPolygonStrokePrimitive2D = static_cast< const 
primitive2d::PolygonStrokePrimitive2D& >(rCandidate);
+
+                    
if(tryDrawPolygonStrokePrimitive2DDirect(rPolygonStrokePrimitive2D, 0.0))
+                    {
+                        break;
+                    }
+
                                        // the stroke primitive may be 
decomposed to filled polygons. To keep
                                        // evtl. set DrawModes aka 
DRAWMODE_BLACKLINE, DRAWMODE_GRAYLINE,
                                        // DRAWMODE_GHOSTEDLINE, 
DRAWMODE_WHITELINE or DRAWMODE_SETTINGSLINE
@@ -466,9 +679,7 @@ namespace drawinglayer
                                                // as filled polygons is 
geometrically corret but looks wrong since polygon filling avoids
                                                // the right and bottom pixels. 
The used method evaluates that and takes the correct action,
                                                // including calling 
recursively with decomposition if line is wide enough
-                                               const 
primitive2d::PolygonStrokePrimitive2D& rPolygonStrokePrimitive = static_cast< 
const primitive2d::PolygonStrokePrimitive2D& >(rCandidate);
-                                               
-                                               
RenderPolygonStrokePrimitive2D(rPolygonStrokePrimitive);
+                                               
RenderPolygonStrokePrimitive2D(rPolygonStrokePrimitive2D);
                                        }
 
                                        // restore DrawMode

Modified: 
openoffice/trunk/main/drawinglayer/source/processor2d/vclprocessor2d.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/drawinglayer/source/processor2d/vclprocessor2d.cxx?rev=1480935&r1=1480934&r2=1480935&view=diff
==============================================================================
--- openoffice/trunk/main/drawinglayer/source/processor2d/vclprocessor2d.cxx 
(original)
+++ openoffice/trunk/main/drawinglayer/source/processor2d/vclprocessor2d.cxx 
Fri May 10 08:48:11 2013
@@ -756,86 +756,6 @@ namespace drawinglayer
             }
         }
 
-               // direct draw of PolyPolygon with color
-               void VclProcessor2D::RenderPolyPolygonColorPrimitive2D(const 
primitive2d::PolyPolygonColorPrimitive2D& rPolygonCandidate)
-               {
-                       const basegfx::BColor 
aPolygonColor(maBColorModifierStack.getModifiedColor(rPolygonCandidate.getBColor()));
-                       mpOutputDevice->SetFillColor(Color(aPolygonColor));
-                       mpOutputDevice->SetLineColor();
-
-                       basegfx::B2DPolyPolygon 
aLocalPolyPolygon(rPolygonCandidate.getB2DPolyPolygon());
-                       aLocalPolyPolygon.transform(maCurrentTransformation);
-
-            static bool bCheckTrapezoidDecomposition(false);
-            static bool bShowOutlinesThere(false);
-            if(bCheckTrapezoidDecomposition)
-            {
-                // clip against discrete ViewPort
-                const basegfx::B2DRange& rDiscreteViewport = 
getViewInformation2D().getDiscreteViewport();
-                aLocalPolyPolygon = basegfx::tools::clipPolyPolygonOnRange(
-                    aLocalPolyPolygon, rDiscreteViewport, true, false);
-
-                if(aLocalPolyPolygon.count())
-                {
-                    // subdivide
-                    aLocalPolyPolygon = 
basegfx::tools::adaptiveSubdivideByDistance(
-                        aLocalPolyPolygon, 0.5);
-
-                    // trapezoidize
-                    basegfx::B2DTrapezoidVector aB2DTrapezoidVector;
-                    basegfx::tools::trapezoidSubdivide(aB2DTrapezoidVector, 
aLocalPolyPolygon);
-
-                    const sal_uInt32 nCount(aB2DTrapezoidVector.size());
-
-                    if(nCount)
-                    {
-                        basegfx::BColor aInvPolygonColor(aPolygonColor);
-                        aInvPolygonColor.invert();
-
-                        for(sal_uInt32 a(0); a < nCount; a++)
-                        {
-                            const basegfx::B2DPolygon 
aTempPolygon(aB2DTrapezoidVector[a].getB2DPolygon());
-
-                            if(bShowOutlinesThere)
-                            {
-                                
mpOutputDevice->SetFillColor(Color(aPolygonColor));
-                                           mpOutputDevice->SetLineColor();
-                            }
-
-                            mpOutputDevice->DrawPolygon(aTempPolygon);
-
-                            if(bShowOutlinesThere)
-                            {
-                                mpOutputDevice->SetFillColor();
-                                       
mpOutputDevice->SetLineColor(Color(aInvPolygonColor));
-                                   mpOutputDevice->DrawPolyLine(aTempPolygon, 
0.0);
-                            }
-                        }
-                    }
-                }
-            }
-            else
-            {
-                           mpOutputDevice->DrawPolyPolygon(aLocalPolyPolygon);
-
-                if(mnPolygonStrokePrimitive2D
-                    && getOptionsDrawinglayer().IsAntiAliasing()
-                    && (mpOutputDevice->GetAntialiasing() & 
ANTIALIASING_ENABLE_B2DDRAW))
-                {
-                    // when AA is on and this filled polygons are the result 
of stroked line geometry,
-                    // draw the geometry once extra as lines to avoid AA 
'gaps' between partial polygons
-                               mpOutputDevice->SetFillColor();
-                               
mpOutputDevice->SetLineColor(Color(aPolygonColor));
-                    const sal_uInt32 nCount(aLocalPolyPolygon.count());
-
-                    for(sal_uInt32 a(0); a < nCount; a++)
-                    {
-                        
mpOutputDevice->DrawPolyLine(aLocalPolyPolygon.getB2DPolygon(a), 0.0);
-                    }
-                }
-            }
-               }
-
                // mask group. Force output to VDev and create mask from given 
mask
                void VclProcessor2D::RenderMaskPrimitive2DPixel(const 
primitive2d::MaskPrimitive2D& rMaskCandidate)
                {

Modified: openoffice/trunk/main/vcl/inc/vcl/outdev.hxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/inc/vcl/outdev.hxx?rev=1480935&r1=1480934&r2=1480935&view=diff
==============================================================================
--- openoffice/trunk/main/vcl/inc/vcl/outdev.hxx (original)
+++ openoffice/trunk/main/vcl/inc/vcl/outdev.hxx Fri May 10 08:48:11 2013
@@ -562,6 +562,7 @@ public:
        SAL_DLLPRIVATE bool ImpTryDrawPolyLineDirect(
         const basegfx::B2DPolygon& rB2DPolygon, 
         double fLineWidth = 0.0, 
+        double fTransparency = 0.0,
         basegfx::B2DLineJoin eLineJoin = basegfx::B2DLINEJOIN_NONE,
         com::sun::star::drawing::LineCap eLineCap = 
com::sun::star::drawing::LineCap_BUTT);
 
@@ -699,6 +700,12 @@ public:
         double fLineWidth = 0.0, 
         basegfx::B2DLineJoin = basegfx::B2DLINEJOIN_ROUND,
         com::sun::star::drawing::LineCap = 
com::sun::star::drawing::LineCap_BUTT);
+    bool TryDrawPolyLineDirect(
+        const basegfx::B2DPolygon& rB2DPolygon, 
+        double fLineWidth = 0.0, 
+        double fTransparency = 0.0,
+        basegfx::B2DLineJoin eLineJoin = basegfx::B2DLINEJOIN_NONE,
+        com::sun::star::drawing::LineCap eLineCap = 
com::sun::star::drawing::LineCap_BUTT);
 
     /** Render the given polygon as a line stroke
 

Modified: openoffice/trunk/main/vcl/source/gdi/outdev.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/vcl/source/gdi/outdev.cxx?rev=1480935&r1=1480934&r2=1480935&view=diff
==============================================================================
--- openoffice/trunk/main/vcl/source/gdi/outdev.cxx (original)
+++ openoffice/trunk/main/vcl/source/gdi/outdev.cxx Fri May 10 08:48:11 2013
@@ -2260,6 +2260,7 @@ void OutputDevice::ImpDrawPolyPolygonWit
 bool OutputDevice::ImpTryDrawPolyLineDirect(
        const basegfx::B2DPolygon& rB2DPolygon,
     double fLineWidth,
+    double fTransparency,
     basegfx::B2DLineJoin eLineJoin,
     com::sun::star::drawing::LineCap eLineCap)
 {
@@ -2289,13 +2290,64 @@ bool OutputDevice::ImpTryDrawPolyLineDir
     // draw the polyline
     return mpGraphics->DrawPolyLine( 
         aB2DPolygon, 
-        0.0, 
+        fTransparency, 
         aB2DLineWidth, 
         eLineJoin, 
         eLineCap,
         this);
 }
 
+bool OutputDevice::TryDrawPolyLineDirect(
+    const basegfx::B2DPolygon& rB2DPolygon, 
+    double fLineWidth, 
+    double fTransparency,
+    basegfx::B2DLineJoin eLineJoin,
+    com::sun::star::drawing::LineCap eLineCap)
+{
+    // AW: Do NOT paint empty PolyPolygons
+    if(!rB2DPolygon.count())
+        return true;
+
+    // we need a graphics
+    if( !mpGraphics )
+        if( !ImplGetGraphics() )
+            return false;
+
+    if( mbInitClipRegion )
+        ImplInitClipRegion();
+
+    if( mbOutputClipped )
+        return true;
+
+    if( mbInitLineColor )
+        ImplInitLineColor();
+
+    const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
+        && ROP_OVERPAINT == GetRasterOp()
+        && IsLineColor());
+
+    if(bTryAA)
+    {
+        if(ImpTryDrawPolyLineDirect(rB2DPolygon, fLineWidth, fTransparency, 
eLineJoin, eLineCap))
+        {
+            // worked, add metafile action (if recorded) and return true
+            if( mpMetaFile )
+            {
+                LineInfo aLineInfo;
+                if( fLineWidth != 0.0 )
+                    aLineInfo.SetWidth( static_cast<long>(fLineWidth+0.5) );
+                const Polygon aToolsPolygon( rB2DPolygon );
+                mpMetaFile->AddAction( new MetaPolyLineAction( aToolsPolygon, 
aLineInfo ) );
+            }
+
+            return true;
+        }
+    }
+
+    return false;
+}
+
 void OutputDevice::DrawPolyLine(
     const basegfx::B2DPolygon& rB2DPolygon,
     double fLineWidth,
@@ -2304,8 +2356,6 @@ void OutputDevice::DrawPolyLine(
 {
        DBG_TRACE( "OutputDevice::DrawPolyLine(B2D&)" );
        DBG_CHKTHIS( OutputDevice, ImplDbgCheckOutputDevice );
-    (void)eLineJoin; // ATM used in UNX, but not in WNT, access it for 
warning-free
-    (void)eLineCap;
 
 #if 0 // MetaB2DPolyLineAction is not implemented yet:
       // according to AW adding it is very dangerous since there is a lot
@@ -2347,7 +2397,7 @@ void OutputDevice::DrawPolyLine(
         && IsLineColor());
 
        // use b2dpolygon drawing if possible
-       if(bTryAA && ImpTryDrawPolyLineDirect(rB2DPolygon, fLineWidth, 
eLineJoin, eLineCap))
+       if(bTryAA && ImpTryDrawPolyLineDirect(rB2DPolygon, fLineWidth, 0.0, 
eLineJoin, eLineCap))
        {
                return;
        }


Reply via email to