[ooo-build-commit] Branch 'ooo/master' - 3 commits - basegfx/inc basegfx/source i18npool/source svtools/source tools/source tools/workben unotools/inc unotools/source vcl/inc vcl/source

Jan Holesovsky kendy at kemper.freedesktop.org
Mon Jul 27 18:21:55 PDT 2009


 basegfx/inc/basegfx/polygon/b2dpolypolygoncutter.hxx |    9 
 basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx  |   14 +
 basegfx/source/curve/b2dcubicbezier.cxx              |   38 ++-
 basegfx/source/polygon/b2dpolypolygoncutter.cxx      |   79 +++++++
 basegfx/source/polygon/b2dpolypolygontools.cxx       |   12 +
 i18npool/source/paper/paper.cxx                      |    9 
 svtools/source/misc1/adrparse.cxx                    |   16 -
 tools/source/fsys/urlobj.cxx                         |    9 
 tools/workben/urltest.cxx                            |   19 +
 unotools/inc/unotools/confignode.hxx                 |    2 
 unotools/source/config/confignode.cxx                |    5 
 vcl/inc/vcl/graph.hxx                                |   44 +++-
 vcl/inc/vcl/impgraph.hxx                             |    5 
 vcl/source/gdi/graph.cxx                             |   38 ---
 vcl/source/gdi/impgraph.cxx                          |   38 ++-
 vcl/source/gdi/outdev.cxx                            |  197 +++++++++++++++----
 vcl/source/gdi/outdev6.cxx                           |   14 -
 17 files changed, 425 insertions(+), 123 deletions(-)

New commits:
commit e820a7993feec123688826246a0391a1f6582aff
Author: Jens-Heiner Rechtien <hr at openoffice.org>
Date:   Mon Jul 27 17:18:56 2009 +0000

    CWS-TOOLING: integrate CWS cmcfixes60
    2009-07-03 21:56:04 +0200 cmc  r273718 : #i103313# org.openoffice.System not org.openoffice.Setup for looking up default locale
    2009-07-01 17:15:31 +0200 cmc  r273606 : #i102636# extra rounding precision
    2009-07-01 11:04:47 +0200 cmc  r273556 : #i100000# workaround build issue
    2009-06-30 17:27:41 +0200 cmc  r273525 : #i102636# extra rounding precision
    2009-06-30 09:42:46 +0200 cmc  r273491 : #i102634# numbers got mixed up somehow
    2009-06-30 09:19:56 +0200 cmc  r273490 : CWS-TOOLING: rebase CWS cmcfixes60 to trunk at 273468 (milestone: DEV300:m51)
    2009-06-22 12:54:45 +0200 cmc  r273217 : #i103000# micro-optimization to remove unused symbols from fpicker etc.
    2009-06-19 10:06:21 +0200 cmc  r273148 : #i102932# put same type into an Any as we take out of that Any, affect 64bit
    2009-06-13 17:38:42 +0200 cmc  r272957 : #i102742# gcc44 warnings, return of const primitive type doesn't mean anything
    2009-06-13 16:22:40 +0200 cmc  r272955 : #i102737# keep existing logic and silence new gcc44 warnings
    2009-06-13 16:06:25 +0200 cmc  r272954 : #i102736# confirm existing logic to be gcc44 warnings free
    2009-06-10 19:40:24 +0200 cmc  r272837 : #i87461# 64bit color lossage
    2009-06-10 19:23:38 +0200 cmc  r272836 : #i102636# tidy up UI rounding errors

diff --git a/i18npool/source/paper/paper.cxx b/i18npool/source/paper/paper.cxx
index 40f6deb..88ccdcc 100644
--- a/i18npool/source/paper/paper.cxx
+++ b/i18npool/source/paper/paper.cxx
@@ -63,7 +63,7 @@ struct PageDesc
     (long)(((v) * 35.27777778) + 0.5)
 
 #define IN2MM100( v ) \
-    ((long)((v) * 2540))
+    ((long)(((v) * 2540) + 0.5))
 
 #define MM2MM100( v ) \
     ((long)((v) * 100))
@@ -362,11 +362,16 @@ PaperInfo PaperInfo::getSystemDefaultPaper()
     {
         // if set to "use system", try to get locale from system
         if( aLocaleStr.getLength() == 0 )
+        {
+            aArgs[ 0 ] <<= CREATE_OUSTRING( "org.openoffice.System/L10N/" );
+            xConfigNA.set( xConfigProv->createInstanceWithArguments(
+                CREATE_OUSTRING( "com.sun.star.configuration.ConfigurationAccess" ), aArgs ),
+                UNO_QUERY_THROW );
             xConfigNA->getByName( CREATE_OUSTRING( "Locale" ) ) >>= aLocaleStr;
+        }
     }
     catch( Exception& ) {}
 
-
     if (aLocaleStr.getLength() == 0)
         aLocaleStr = CREATE_OUSTRING("en-US");
 
diff --git a/svtools/source/misc1/adrparse.cxx b/svtools/source/misc1/adrparse.cxx
index d6bc8ae..31bdf7b 100644
--- a/svtools/source/misc1/adrparse.cxx
+++ b/svtools/source/misc1/adrparse.cxx
@@ -172,8 +172,8 @@ inline void SvAddressParser_Impl::addTokenToRealName()
         if (!m_pRealNameBegin)
             m_pRealNameBegin = m_pRealNameContentBegin = m_pCurTokenBegin;
         else if (m_pRealNameEnd < m_pCurTokenBegin - 1
-                 || m_pRealNameEnd == m_pCurTokenBegin - 1
-                    && *m_pRealNameEnd != ' ')
+                 || (m_pRealNameEnd == m_pCurTokenBegin - 1
+                    && *m_pRealNameEnd != ' '))
             m_bRealNameReparse = true;
         m_pRealNameEnd = m_pRealNameContentEnd = m_pCurTokenEnd;
     }
@@ -634,8 +634,8 @@ SvAddressParser_Impl::SvAddressParser_Impl(SvAddressParser * pParser,
                 else
                 {
                     m_pAddrSpec = m_aInnerAddrSpec.isValid()
-                                  || !m_aOuterAddrSpec.isValid()
-                                         && m_aInnerAddrSpec.isPoorlyValid() ?
+                                  || (!m_aOuterAddrSpec.isValid()
+                                         && m_aInnerAddrSpec.isPoorlyValid()) ?
                                       &m_aInnerAddrSpec :
                                   m_aOuterAddrSpec.isPoorlyValid() ?
                                       &m_aOuterAddrSpec : 0;
@@ -663,11 +663,11 @@ SvAddressParser_Impl::SvAddressParser_Impl(SvAddressParser * pParser,
                         }
                         UniString aTheRealName;
                         if (!m_pRealNameBegin
-                            || m_pAddrSpec == &m_aOuterAddrSpec
+                            || (m_pAddrSpec == &m_aOuterAddrSpec
                                && m_pRealNameBegin
                                       == m_aOuterAddrSpec.m_pBegin
                                && m_pRealNameEnd == m_aOuterAddrSpec.m_pEnd
-                               && m_pFirstCommentBegin)
+                               && m_pFirstCommentBegin))
                             if (!m_pFirstCommentBegin)
                                 aTheRealName = aTheAddrSpec;
                             else if (m_bFirstCommentReparse)
@@ -820,7 +820,7 @@ bool SvAddressParser::createRFC822Mailbox(String const & rPhrase,
                     return false;
                 if (*p == '"')
                     break;
-                if (*p == '\x0D' || *p == '\\' && ++p == pEnd
+                if (*p == '\x0D' || (*p == '\\' && ++p == pEnd)
                     || !INetMIME::isUSASCII(*p))
                     return false;
                 if (INetMIME::needsQuotedStringEscape(*p))
@@ -868,7 +868,7 @@ bool SvAddressParser::createRFC822Mailbox(String const & rPhrase,
                     return false;
                 if (*p == ']')
                     break;
-                if (*p == '\x0D' || *p == '[' || *p == '\\' && ++p == pEnd
+                if (*p == '\x0D' || *p == '[' || (*p == '\\' && ++p == pEnd)
                     || !INetMIME::isUSASCII(*p))
                     return false;
                 if (*p >= '[' && *p <= ']')
diff --git a/unotools/inc/unotools/confignode.hxx b/unotools/inc/unotools/confignode.hxx
index a02b0c6..70711b3 100644
--- a/unotools/inc/unotools/confignode.hxx
+++ b/unotools/inc/unotools/confignode.hxx
@@ -86,7 +86,7 @@ namespace utl
         const OConfigurationNode& operator=(const OConfigurationNode& _rSource);
 
         /// dtor
-        ~OConfigurationNode();
+        ~OConfigurationNode() {}
 
         /** open a sub node
             @param		_rPath		access path of the to-be-opened sub node. May be a hierarchical path.
diff --git a/unotools/source/config/confignode.cxx b/unotools/source/config/confignode.cxx
index cd14ce2..0072420 100644
--- a/unotools/source/config/confignode.cxx
+++ b/unotools/source/config/confignode.cxx
@@ -130,11 +130,6 @@ namespace utl
     }
 
     //------------------------------------------------------------------------
-    OConfigurationNode::~OConfigurationNode()
-    {
-    }
-
-    //------------------------------------------------------------------------
     void OConfigurationNode::_disposing( const EventObject& _rSource )
     {
         Reference< XComponent > xDisposingSource(_rSource.Source, UNO_QUERY);
commit 482e0b562d9944093e3058c7cd05184fc5fd8b99
Author: Jens-Heiner Rechtien <hr at openoffice.org>
Date:   Mon Jul 27 16:24:52 2009 +0000

    CWS-TOOLING: integrate CWS aw073
    2009-07-16 11:21:19 +0200 aw  r274036 : corrections after resync
    2009-07-15 13:34:18 +0200 aw  r274009 : CWS-TOOLING: rebase CWS aw073 to trunk at 273858 (milestone: DEV300:m52)
    2009-07-01 20:04:27 +0200 aw  r273613 : CWS-TOOLING: rebase CWS aw073 to trunk at 273468 (milestone: DEV300:m51)
    2009-06-24 11:51:03 +0200 aw  r273324 : #i102062# added using statement for solaris compiler
    2009-06-23 12:53:50 +0200 aw  r273278 : #i100158# force filled polygons to closed state
    2009-06-23 12:28:33 +0200 aw  r273276 : #i100158#, #i102371# corrected all (mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) shortcuts to support line/fill and to be not used when FillMode is not overpaint
    2009-06-23 12:15:14 +0200 aw  r273274 : #i100158# added PolyPolygon support for snapPointsOfHorizontalOrVerticalEdges helper
    2009-06-22 17:28:33 +0200 aw  r273244 : #i101508# added taking care of cell's distance-to-border values for cell text primitive creation
    2009-06-22 12:59:10 +0200 aw  r273218 : #i102253# applied patch from OD (see task)
    2009-06-18 17:00:52 +0200 aw  r273125 : #i102251# added EE_CNTRL_ONLINESPELLING switch off at DrawOutliner during GraphicExporter::GetGraphic
    2009-06-18 14:35:57 +0200 aw  r273120 : #i102241# added mergeToSinglePolyPolygon usage to SdrObject::ImpConvertToContourObj
    2009-06-18 14:35:20 +0200 aw  r273119 : #i102241# improved PolygonStrokePrimitive2D::createLocalDecomposition
    2009-06-18 14:34:49 +0200 aw  r273118 : #i102241# Made B2DCubicBezier::testAndSolveTrivialBezier() numerically more stable
    2009-06-17 16:11:21 +0200 aw  r273078 : #i102062# added compare support for OutlireParaObject's WrongList in an extra method; using in primitive comparators
    2009-06-16 19:10:18 +0200 aw  r273037 : #i101957# corrected: offset needs to be added before rotation and shear
    2009-06-16 18:58:43 +0200 aw  r273035 : #i101957# added needed offset by object width to SdrTextObj::impDecomposeStretchTextPrimitive for vertical texts
    2009-06-16 18:35:55 +0200 aw  r273034 : #i101941# corrected object initialisation for 3D Scenes on Clone operator
    2009-06-16 16:07:30 +0200 aw  r273024 : #i101811# extended renderChartPrimitive2D to create a correct embedding in a new MapMode
    2009-06-12 19:38:07 +0200 aw  r272940 : #i101734# added test code to experiment on demand with more complex transformations for virtual objects than only translations
    2009-06-12 19:37:07 +0200 aw  r272939 : #i101734# corrected SvtGraphicStroke preparation in MetaFile renderer (AFAP)
    2009-06-12 16:31:55 +0200 aw  r272931 : #i101648# re-enabled object creation with objecttype OBJ_NONE for SW Frame creation
    2009-06-12 13:59:05 +0200 aw  r272917 : #i101598# supported AAed single line paint in VCL
    2009-06-12 11:34:25 +0200 aw  r272907 : #i101598# adapted Graphic::GetBitmap() usage
    2009-06-10 16:34:19 +0200 aw  r272830 : #i101598# added VCL_DLLPUBLIC to parameter class
    2009-06-10 16:30:27 +0200 aw  r272829 : #i101598# extended calls to Graphic::GetBitmap/Ex where conversions to Bitmap objects is needed to user defined parameters like AntiAlisasing
    2009-06-10 16:28:44 +0200 aw  r272828 : #i101598# extended Graphic::GetBitmap/Ex interfaces to transport raster conversion parameters since these calls potentially need to rasterconvert a contained MetaFile
    2009-06-09 16:26:40 +0200 aw  r272781 : #i100945# checked in proposed patch for now
    2009-06-08 18:01:42 +0200 aw  r272742 : #i101239# teached BinTextObject to register at EditEngineItemPool sub-pool, not on given pool directly

diff --git a/basegfx/inc/basegfx/polygon/b2dpolypolygoncutter.hxx b/basegfx/inc/basegfx/polygon/b2dpolypolygoncutter.hxx
index 4b5f297..6ed293a 100644
--- a/basegfx/inc/basegfx/polygon/b2dpolypolygoncutter.hxx
+++ b/basegfx/inc/basegfx/polygon/b2dpolypolygoncutter.hxx
@@ -104,6 +104,15 @@ namespace basegfx
         // DIFF: Return all areas where CandidateA is not covered by CandidateB (cut B out of A)
         B2DPolyPolygon solvePolygonOperationDiff(const B2DPolyPolygon& rCandidateA, const B2DPolyPolygon& rCandidateB);
 
+        /** merge all single PolyPolygons to a single, OR-ed PolyPolygon
+
+            @param rInput
+            The source PolyPolygons
+
+            @return A single PolyPolygon containing the Or-merged result
+        */
+        B2DPolyPolygon mergeToSinglePolyPolygon(const std::vector< basegfx::B2DPolyPolygon >& rInput);
+
     } // end of namespace tools
 } // end of namespace basegfx
 
diff --git a/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx b/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx
index 896ed8a..8334822 100644
--- a/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx
+++ b/basegfx/inc/basegfx/polygon/b2dpolypolygontools.hxx
@@ -262,6 +262,20 @@ namespace basegfx
         bool equal(const B2DPolyPolygon& rCandidateA, const B2DPolyPolygon& rCandidateB, const double& rfSmallValue);
         bool equal(const B2DPolyPolygon& rCandidateA, const B2DPolyPolygon& rCandidateB);
 
+        /** snap some polygon coordinates to discrete coordinates
+
+            This method allows to snap some polygon points to discrete (integer) values
+            which equals e.g. a snap to discrete coordinates. It will snap points of 
+            horizontal and vertical edges
+
+            @param rCandidate
+            The source polygon
+
+            @return
+            The modified version of the source polygon
+        */
+        B2DPolyPolygon snapPointsOfHorizontalOrVerticalEdges(const B2DPolyPolygon& rCandidate);
+
     } // end of namespace tools
 } // end of namespace basegfx
 
diff --git a/basegfx/source/curve/b2dcubicbezier.cxx b/basegfx/source/curve/b2dcubicbezier.cxx
index 7a167d3..ebc9316 100644
--- a/basegfx/source/curve/b2dcubicbezier.cxx
+++ b/basegfx/source/curve/b2dcubicbezier.cxx
@@ -443,21 +443,32 @@ namespace basegfx
                 bool bAIsTrivial(aVecA.equalZero());
                 bool bBIsTrivial(aVecB.equalZero());
 
+                // #i102241# prepare inverse edge length to normalize cross values;
+                // else the small compare value used in fTools::equalZero
+                // will be length dependent and this detection will work as less
+                // precise as longer the edge is. In principle, the length of the control
+                // vector would need to be used too, but to be trivial it is assumed to
+                // be of roughly equal length to the edge, so edge length can be used
+                // for both. Only needed when one of both is not trivial per se.
+                const double fInverseEdgeLength(bAIsTrivial && bBIsTrivial 
+                    ? 1.0 
+                    : 1.0 / aEdge.getLength());
+
                 // if A is not zero, check if it could be
                 if(!bAIsTrivial)
                 {
-                    // parallel to edge? Check aVecA, aEdge
-                    // B2DVector::areParallel is too correct, uses differences in the e15 region,
-                    // thus do own test here
-                    const double fValA(aVecA.getX() * aEdge.getY());
-                    const double fValB(aVecA.getY() * aEdge.getX());
-                    
-                    if(fTools::equalZero(fabs(fValA) - fabs(fValB)))
+                    // #i102241# parallel to edge? Check aVecA, aEdge. Use cross() which does what
+                    // we need here with the precision we need
+                    const double fCross(aVecA.cross(aEdge) * fInverseEdgeLength);
+
+                    if(fTools::equalZero(fCross))
                     {
                         // get scale to edge. Use bigger distance for numeric quality
-                        const double fScale(fabs(aEdge.getX()) > fabs(aEdge.getY()) ? aVecA.getX() / aEdge.getX() : aVecA.getY() / aEdge.getY());
+                        const double fScale(fabs(aEdge.getX()) > fabs(aEdge.getY()) 
+                            ? aVecA.getX() / aEdge.getX() 
+                            : aVecA.getY() / aEdge.getY());
 
-                        // end point of vector in edge range?
+                        // relative end point of vector in edge range?
                         if(fTools::moreOrEqual(fScale, 0.0) && fTools::lessOrEqual(fScale, 1.0))
                         {
                             bAIsTrivial = true;
@@ -470,13 +481,14 @@ namespace basegfx
                 if(bAIsTrivial && !bBIsTrivial)
                 {
                     // parallel to edge? Check aVecB, aEdge
-                    const double fValA(aVecB.getX() * aEdge.getY());
-                    const double fValB(aVecB.getY() * aEdge.getX());
+                    const double fCross(aVecB.cross(aEdge) * fInverseEdgeLength);
                     
-                    if(fTools::equalZero(fabs(fValA) - fabs(fValB)))
+                    if(fTools::equalZero(fCross))
                     {
                         // get scale to edge. Use bigger distance for numeric quality
-                        const double fScale(fabs(aEdge.getX()) > fabs(aEdge.getY()) ? aVecB.getX() / aEdge.getX() : aVecB.getY() / aEdge.getY());
+                        const double fScale(fabs(aEdge.getX()) > fabs(aEdge.getY()) 
+                            ? aVecB.getX() / aEdge.getX() 
+                            : aVecB.getY() / aEdge.getY());
 
                         // end point of vector in edge range? Caution: controlB is directed AGAINST edge
                         if(fTools::lessOrEqual(fScale, 0.0) && fTools::moreOrEqual(fScale, -1.0))
diff --git a/basegfx/source/polygon/b2dpolypolygoncutter.cxx b/basegfx/source/polygon/b2dpolypolygoncutter.cxx
index d8f5886..83e92ed 100644
--- a/basegfx/source/polygon/b2dpolypolygoncutter.cxx
+++ b/basegfx/source/polygon/b2dpolypolygoncutter.cxx
@@ -929,6 +929,85 @@ namespace basegfx
             }
         }
 
+        B2DPolyPolygon mergeToSinglePolyPolygon(const std::vector< basegfx::B2DPolyPolygon >& rInput)
+        {
+            std::vector< basegfx::B2DPolyPolygon > aInput(rInput);
+            
+            // first step: prepareForPolygonOperation and simple merge of non-overlapping
+            // PolyPolygons for speedup; this is possible for the wanted OR-operation
+            if(aInput.size())
+            {
+                std::vector< basegfx::B2DPolyPolygon > aResult;
+                aResult.reserve(aInput.size());
+
+                for(sal_uInt32 a(0); a < aInput.size(); a++)
+                {
+                    const basegfx::B2DPolyPolygon aCandidate(prepareForPolygonOperation(aInput[a]));
+
+                    if(aResult.size())
+                    {
+                        const B2DRange aCandidateRange(aCandidate.getB2DRange());
+                        bool bCouldMergeSimple(false);
+
+                        for(sal_uInt32 b(0); !bCouldMergeSimple && b < aResult.size(); b++)
+                        {
+                            basegfx::B2DPolyPolygon aTarget(aResult[b]);
+                            const B2DRange aTargetRange(aTarget.getB2DRange());
+
+                            if(!aCandidateRange.overlaps(aTargetRange))
+                            {
+                                aTarget.append(aCandidate);
+                                aResult[b] = aTarget;
+                                bCouldMergeSimple = true;
+                            }
+                        }
+
+                        if(!bCouldMergeSimple)
+                        {
+                            aResult.push_back(aCandidate);
+                        }
+                    }
+                    else
+                    {
+                        aResult.push_back(aCandidate);
+                    }
+                }
+
+                aInput = aResult;
+            }
+
+            // second step: melt pairwise to a single PolyPolygon
+            while(aInput.size() > 1)
+            {
+                std::vector< basegfx::B2DPolyPolygon > aResult;
+                aResult.reserve((aInput.size() / 2) + 1);
+
+                for(sal_uInt32 a(0); a < aInput.size(); a += 2)
+                {
+                    if(a + 1 < aInput.size())
+                    {
+                        // a pair for processing
+                        aResult.push_back(solvePolygonOperationOr(aInput[a], aInput[a + 1]));
+                    }
+                    else
+                    {
+                        // last single PolyPolygon; copy to target to not lose it
+                        aResult.push_back(aInput[a]);
+                    }
+                }
+
+                aInput = aResult;
+            }
+
+            // third step: get result
+            if(1 == aInput.size())
+            {
+                return aInput[0];
+            }
+
+            return B2DPolyPolygon();
+        }
+
         //////////////////////////////////////////////////////////////////////////////
 
     } // end of namespace tools
diff --git a/basegfx/source/polygon/b2dpolypolygontools.cxx b/basegfx/source/polygon/b2dpolypolygontools.cxx
index afec1dd..bf2525a 100644
--- a/basegfx/source/polygon/b2dpolypolygontools.cxx
+++ b/basegfx/source/polygon/b2dpolypolygontools.cxx
@@ -569,6 +569,18 @@ namespace basegfx
             return equal(rCandidateA, rCandidateB, fSmallValue);
         }
 
+        B2DPolyPolygon snapPointsOfHorizontalOrVerticalEdges(const B2DPolyPolygon& rCandidate)
+        {
+            B2DPolyPolygon aRetval;
+
+            for(sal_uInt32 a(0L); a < rCandidate.count(); a++)
+            {
+                aRetval.append(snapPointsOfHorizontalOrVerticalEdges(rCandidate.getB2DPolygon(a)));
+            }
+
+            return aRetval;
+        }
+
     } // end of namespace tools
 } // end of namespace basegfx
 
diff --git a/vcl/inc/vcl/graph.hxx b/vcl/inc/vcl/graph.hxx
index df04789..15e298f 100644
--- a/vcl/inc/vcl/graph.hxx
+++ b/vcl/inc/vcl/graph.hxx
@@ -53,6 +53,36 @@ class   OutputDevice;
 class   Font;
 class   GfxLink;
 
+class VCL_DLLPUBLIC GraphicConversionParameters
+{
+private:
+    Size            maSizePixel;            // default is (0,0)
+
+    // bitfield
+    unsigned        mbUnlimitedSize : 1;    // default is false
+    unsigned        mbAntiAliase : 1;       // default is false
+    unsigned        mbSnapHorVerLines : 1;  // default is false
+
+public:
+    GraphicConversionParameters(
+        const Size& rSizePixel = Size(),
+        bool bUnlimitedSize = false,
+        bool bAntiAliase = false,
+        bool bSnapHorVerLines = false)
+    :   maSizePixel(rSizePixel),
+        mbUnlimitedSize(bUnlimitedSize),
+        mbAntiAliase(bAntiAliase),
+        mbSnapHorVerLines(bSnapHorVerLines)
+    {
+    }
+
+    // data read access
+    const Size getSizePixel() const { return maSizePixel; }
+    bool getUnlimitedSize() const { return mbUnlimitedSize; }
+    bool getAntiAliase() const { return mbAntiAliase; }
+    bool getSnapHorVerLines() const { return mbSnapHorVerLines; }
+};
+
 class VCL_DLLPUBLIC Graphic : public SvDataCopyStream
 {
 private:
@@ -96,12 +126,14 @@ public:
     BOOL                IsAlpha() const;
     BOOL                IsAnimated() const;
 
-    Bitmap              GetBitmap() const;
-    Bitmap              GetBitmap( const Size* pSizePixel ) const;
-    BitmapEx            GetBitmapEx() const;
-    BitmapEx            GetBitmapEx( const Size* pSizePixel ) const;
-    Bitmap              GetUnlimitedBitmap( const Size* pSizePixel ) const;
-    BitmapEx            GetUnlimitedBitmapEx( const Size* pSizePixel ) const;
+    // #i102089# Access of Bitmap potentially will have to rasterconvert the Graphic
+    // if it is a MetaFile. To be able to control this conversion it is necessary to
+    // allow giving parameters which control AntiAliasing and LineSnapping of the
+    // MetaFile when played. Defaults will use a no-AAed, not snapped conversion as
+    // before.
+    Bitmap              GetBitmap(const GraphicConversionParameters& rParameters = GraphicConversionParameters()) const;
+    BitmapEx            GetBitmapEx(const GraphicConversionParameters& rParameters = GraphicConversionParameters()) const;
+
     Animation           GetAnimation() const;
     const GDIMetaFile&  GetGDIMetaFile() const;
 
diff --git a/vcl/inc/vcl/impgraph.hxx b/vcl/inc/vcl/impgraph.hxx
index 256fc7c..09d2613 100644
--- a/vcl/inc/vcl/impgraph.hxx
+++ b/vcl/inc/vcl/impgraph.hxx
@@ -55,6 +55,7 @@ struct ImpSwapInfo
 class	OutputDevice;
 class	GfxLink;
 struct	ImpSwapFile;
+class GraphicConversionParameters;
 
 class ImpGraphic
 {
@@ -102,8 +103,8 @@ private:
     BOOL				ImplIsAlpha() const;
     BOOL				ImplIsAnimated() const;
 
-    Bitmap				ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) const;
-    BitmapEx			ImplGetBitmapEx( const Size* pSizePixel, BOOL bUnlimited ) const;
+    Bitmap				ImplGetBitmap(const GraphicConversionParameters& rParameters) const;
+    BitmapEx			ImplGetBitmapEx(const GraphicConversionParameters& rParameters) const;
     Animation			ImplGetAnimation() const;
     const GDIMetaFile&	ImplGetGDIMetaFile() const;
 
diff --git a/vcl/source/gdi/graph.cxx b/vcl/source/gdi/graph.cxx
index 0401ed9..87ca480 100644
--- a/vcl/source/gdi/graph.cxx
+++ b/vcl/source/gdi/graph.cxx
@@ -430,44 +430,16 @@ BOOL Graphic::IsAnimated() const
 
 // ------------------------------------------------------------------------
 
-Bitmap Graphic::GetBitmap() const
+Bitmap Graphic::GetBitmap(const GraphicConversionParameters& rParameters) const
 {
-    return GetBitmap( NULL );
+    return mpImpGraphic->ImplGetBitmap(rParameters);
 }
 
 // ------------------------------------------------------------------------
 
-BitmapEx Graphic::GetBitmapEx() const
+BitmapEx Graphic::GetBitmapEx(const GraphicConversionParameters& rParameters) const
 {
-    return GetBitmapEx( NULL );
-}
-
-// ------------------------------------------------------------------------
-
-Bitmap Graphic::GetBitmap( const Size* pSizePixel ) const
-{
-    return mpImpGraphic->ImplGetBitmap( pSizePixel, FALSE );
-}
-
-// ------------------------------------------------------------------------
-
-BitmapEx Graphic::GetBitmapEx( const Size* pSizePixel ) const
-{
-    return mpImpGraphic->ImplGetBitmapEx( pSizePixel, FALSE );
-}
-
-// ------------------------------------------------------------------------
-
-Bitmap Graphic::GetUnlimitedBitmap( const Size* pSizePixel ) const
-{
-    return mpImpGraphic->ImplGetBitmap( pSizePixel, TRUE ) ;
-}
-
-// ------------------------------------------------------------------------
-
-BitmapEx Graphic::GetUnlimitedBitmapEx( const Size* pSizePixel ) const
-{
-    return mpImpGraphic->ImplGetBitmapEx( pSizePixel, TRUE ) ;
+    return mpImpGraphic->ImplGetBitmapEx(rParameters);
 }
 
 // ------------------------------------------------------------------------
@@ -553,7 +525,7 @@ Size Graphic::GetSizePixel( const OutputDevice* pRefDevice ) const
     Size aRet;
 
     if( GRAPHIC_BITMAP == mpImpGraphic->ImplGetType() )
-        aRet = mpImpGraphic->ImplGetBitmapEx( NULL, FALSE ).GetSizePixel();
+        aRet = mpImpGraphic->ImplGetBitmapEx(GraphicConversionParameters()).GetSizePixel();
     else
         aRet = ( pRefDevice ? pRefDevice : Application::GetDefaultDevice() )->LogicToPixel( GetPrefSize(), GetPrefMapMode() );
 
diff --git a/vcl/source/gdi/impgraph.cxx b/vcl/source/gdi/impgraph.cxx
index cd41f21..add20ce 100644
--- a/vcl/source/gdi/impgraph.cxx
+++ b/vcl/source/gdi/impgraph.cxx
@@ -483,7 +483,7 @@ BOOL ImpGraphic::ImplIsAnimated() const
 
 // ------------------------------------------------------------------------
 
-Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) const
+Bitmap ImpGraphic::ImplGetBitmap(const GraphicConversionParameters& rParameters) const
 {
     Bitmap aRetBmp;
 
@@ -494,8 +494,8 @@ Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) cons
 
         aRetBmp = rRetBmpEx.GetBitmap( &aReplaceColor );
 
-        if( pSizePixel )
-            aRetBmp.Scale( *pSizePixel );
+        if(rParameters.getSizePixel().Width() || rParameters.getSizePixel().Height())
+            aRetBmp.Scale(rParameters.getSizePixel());
     }
     else if( ( meType != GRAPHIC_DEFAULT ) && ImplIsSupportedGraphic() )
     {
@@ -508,16 +508,18 @@ Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) cons
         Size            aDrawSize( aVDev.LogicToPixel( maMetaFile.GetPrefSize(), maMetaFile.GetPrefMapMode() ) );
         Size			aSizePix( labs( aBRPix.X() - aTLPix.X() ) + 1, labs( aBRPix.Y() - aTLPix.Y() ) + 1 );
 
-        if( pSizePixel && aSizePix.Width() && aSizePix.Height() )
+        if(rParameters.getSizePixel().Width() && rParameters.getSizePixel().Height())
         {
-            aDrawSize.Width() = FRound( (double) pSizePixel->Width() * (double) aDrawSize.Width() / (double) aSizePix.Width() );
-            aDrawSize.Height() = FRound( (double) pSizePixel->Height() * (double) aDrawSize.Height() / (double) aSizePix.Height() );
+            aDrawSize.Width() = FRound((double)rParameters.getSizePixel().Width() * 
+                (double)aDrawSize.Width() / (double)aSizePix.Width());
+            aDrawSize.Height() = FRound((double)rParameters.getSizePixel().Height() * 
+                (double)aDrawSize.Height() / (double)aSizePix.Height());
 
-            aSizePix = *pSizePixel;
+            aSizePix = rParameters.getSizePixel();
         }
 
-        if( aSizePix.Width() && aSizePix.Height() && !bUnlimited &&
-            ( aSizePix.Width() > GRAPHIC_MTFTOBMP_MAXEXT || aSizePix.Height() > GRAPHIC_MTFTOBMP_MAXEXT ) )
+        if( aSizePix.Width() && aSizePix.Height() && !rParameters.getUnlimitedSize() 
+            && (aSizePix.Width() > GRAPHIC_MTFTOBMP_MAXEXT || aSizePix.Height() > GRAPHIC_MTFTOBMP_MAXEXT))
         {
             const Size  aOldSizePix( aSizePix );
             double      fWH = (double) aSizePix.Width() / aSizePix.Height();
@@ -533,6 +535,16 @@ Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) cons
 
         if( aVDev.SetOutputSizePixel( aSizePix ) )
         {
+            if(rParameters.getAntiAliase())
+            {
+                aVDev.SetAntialiasing(aVDev.GetAntialiasing() | ANTIALIASING_ENABLE_B2DDRAW);
+            }
+            
+            if(rParameters.getSnapHorVerLines())
+            {
+                aVDev.SetAntialiasing(aVDev.GetAntialiasing() | ANTIALIASING_PIXELSNAPHAIRLINE);
+            }
+
             ImplDraw( &aVDev, aNullPt, aDrawSize );
             aRetBmp =  aVDev.GetBitmap( aNullPt, aVDev.GetOutputSizePixel() );
         }
@@ -549,7 +561,7 @@ Bitmap ImpGraphic::ImplGetBitmap( const Size* pSizePixel, BOOL bUnlimited ) cons
 
 // ------------------------------------------------------------------------
 
-BitmapEx ImpGraphic::ImplGetBitmapEx( const Size* pSizePixel, BOOL bUnlimited ) const
+BitmapEx ImpGraphic::ImplGetBitmapEx(const GraphicConversionParameters& rParameters) const
 {
     BitmapEx aRetBmpEx;
 
@@ -557,13 +569,13 @@ BitmapEx ImpGraphic::ImplGetBitmapEx( const Size* pSizePixel, BOOL bUnlimited )
     {
         aRetBmpEx = ( mpAnimation ? mpAnimation->GetBitmapEx() : maEx );
 
-        if( pSizePixel )
-            aRetBmpEx.Scale( *pSizePixel );
+        if(rParameters.getSizePixel().Width() || rParameters.getSizePixel().Height())
+            aRetBmpEx.Scale(rParameters.getSizePixel());
     }
     else if( ( meType != GRAPHIC_DEFAULT ) && ImplIsSupportedGraphic() )
     {
         const ImpGraphic aMonoMask( maMetaFile.GetMonochromeMtf( COL_BLACK ) );
-        aRetBmpEx = BitmapEx( ImplGetBitmap( pSizePixel, bUnlimited ), aMonoMask.ImplGetBitmap( pSizePixel, bUnlimited ) );
+        aRetBmpEx = BitmapEx(ImplGetBitmap(rParameters), aMonoMask.ImplGetBitmap(rParameters));
     }
 
     return aRetBmpEx;
diff --git a/vcl/source/gdi/outdev.cxx b/vcl/source/gdi/outdev.cxx
index 739012f..f0eee90 100644
--- a/vcl/source/gdi/outdev.cxx
+++ b/vcl/source/gdi/outdev.cxx
@@ -68,6 +68,7 @@
 #include <basegfx/polygon/b2dpolypolygon.hxx>
 #include <basegfx/matrix/b2dhommatrix.hxx>
 #include <basegfx/polygon/b2dpolygontools.hxx>
+#include <basegfx/polygon/b2dpolypolygontools.hxx>
 
 #include <com/sun/star/awt/XGraphics.hpp>
 #include <com/sun/star/uno/Sequence.hxx>
@@ -2285,8 +2286,35 @@ void OutputDevice::DrawLine( const Point& rStartPt, const Point& rEndPt )
     if ( mbInitLineColor )
         ImplInitLineColor();
 
-    Point aStartPt = ImplLogicToDevicePixel( rStartPt );
-    Point aEndPt = ImplLogicToDevicePixel( rEndPt );
+    // #i101598# support AA and snap for lines, too
+    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
+        && ROP_OVERPAINT == GetRasterOp()
+        && IsLineColor())
+    {
+        // at least transform with double precision to device coordinates; this will
+        // avoid pixel snap of single, appended lines
+        const basegfx::B2DHomMatrix aTransform(ImplGetDeviceTransformation());
+        const basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
+        basegfx::B2DPolygon aB2DPolyLine;
+
+        aB2DPolyLine.append(basegfx::B2DPoint(rStartPt.X(), rStartPt.Y()));
+        aB2DPolyLine.append(basegfx::B2DPoint(rEndPt.X(), rEndPt.Y()));
+        aB2DPolyLine.transform( aTransform );
+
+        if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
+        {
+            aB2DPolyLine = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyLine);
+        }
+
+        if(mpGraphics->DrawPolyLine(aB2DPolyLine, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this))
+        {
+            return;
+        }
+    }
+
+    const Point aStartPt(ImplLogicToDevicePixel(rStartPt));
+    const Point aEndPt(ImplLogicToDevicePixel(rEndPt));
 
     mpGraphics->DrawLine( aStartPt.X(), aStartPt.Y(), aEndPt.X(), aEndPt.Y(), this );
 
@@ -2445,21 +2473,27 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly )
         ImplInitLineColor();
 
     // use b2dpolygon drawing if possible
-    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw))
+    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
+        && ROP_OVERPAINT == GetRasterOp()
+        && IsLineColor())
     {
-        ::basegfx::B2DPolygon aB2DPolyLine = rPoly.getB2DPolygon();
+        basegfx::B2DPolygon aB2DPolyLine(rPoly.getB2DPolygon());
         const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
-        aB2DPolyLine.transform( aTransform );
         const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
 
-        if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && (mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE))
+        // transform the polygon
+        aB2DPolyLine.transform( aTransform );
+
+        if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
         {
-            // #i98289#
             aB2DPolyLine = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyLine);
         }
 
-        if( mpGraphics->DrawPolyLine( aB2DPolyLine, aB2DLineWidth, basegfx::B2DLINEJOIN_ROUND, this ) )
+        if(mpGraphics->DrawPolyLine(aB2DPolyLine, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this))
+        {
             return;
+        }
     }
 
     Polygon aPoly = ImplLogicToDevicePixel( rPoly );
@@ -2598,13 +2632,40 @@ void OutputDevice::DrawPolygon( const Polygon& rPoly )
         ImplInitFillColor();
 
     // use b2dpolygon drawing if possible
-    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw))
+    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
+        && ROP_OVERPAINT == GetRasterOp()
+        && (IsLineColor() || IsFillColor()))
     {
-        ::basegfx::B2DPolyPolygon aB2DPolyPolygon( rPoly.getB2DPolygon() );
         const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
-        aB2DPolyPolygon.transform( aTransform );
-        if( mpGraphics->DrawPolyPolygon( aB2DPolyPolygon, 0.0, this ) )
+        basegfx::B2DPolygon aB2DPolygon(rPoly.getB2DPolygon());
+        bool bSuccess(true);
+
+        // transform the polygon and ensure closed
+        aB2DPolygon.transform(aTransform);
+        aB2DPolygon.setClosed(true);
+
+        if(IsFillColor())
+        {
+            bSuccess = mpGraphics->DrawPolyPolygon(basegfx::B2DPolyPolygon(aB2DPolygon), 0.0, this);
+        }
+
+        if(bSuccess && IsLineColor())
+        {
+            const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
+
+            if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
+            {
+                aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon);
+            }
+
+            bSuccess = mpGraphics->DrawPolyLine(aB2DPolygon, aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this);
+        }
+
+        if(bSuccess)
+        {
             return;
+        }
     }
 
     Polygon aPoly = ImplLogicToDevicePixel( rPoly );
@@ -2661,13 +2722,43 @@ void OutputDevice::DrawPolyPolygon( const PolyPolygon& rPolyPoly )
         ImplInitFillColor();
 
     // use b2dpolygon drawing if possible
-    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw))
+    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
+        && ROP_OVERPAINT == GetRasterOp()
+        && (IsLineColor() || IsFillColor()))
     {
-        ::basegfx::B2DPolyPolygon aB2DPolyPolygon = rPolyPoly.getB2DPolyPolygon();
         const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
-        aB2DPolyPolygon.transform( aTransform );
-        if( mpGraphics->DrawPolyPolygon( aB2DPolyPolygon, 0.0, this ) )
+        basegfx::B2DPolyPolygon aB2DPolyPolygon(rPolyPoly.getB2DPolyPolygon());
+        bool bSuccess(true);
+
+        // transform the polygon and ensure closed
+        aB2DPolyPolygon.transform(aTransform);
+        aB2DPolyPolygon.setClosed(true);
+
+        if(IsFillColor())
+        {
+            bSuccess = mpGraphics->DrawPolyPolygon(aB2DPolyPolygon, 0.0, this);
+        }
+
+        if(bSuccess && IsLineColor())
+        {
+            const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
+
+            if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
+            {
+                aB2DPolyPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyPolygon);
+            }
+
+            for(sal_uInt32 a(0); bSuccess && a < aB2DPolyPolygon.count(); a++)
+            {
+                bSuccess = mpGraphics->DrawPolyLine(aB2DPolyPolygon.getB2DPolygon(a), aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this);
+            }
+        }
+
+        if(bSuccess)
+        {
             return;
+        }
     }
 
     if ( nPoly == 1 )
@@ -2748,13 +2839,43 @@ void OutputDevice::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rB2DPolyPoly
     if( mbInitFillColor )
         ImplInitFillColor();
 
-    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw))
+    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
+        && ROP_OVERPAINT == GetRasterOp()
+        && (IsLineColor() || IsFillColor()))
     {
-        const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
-        ::basegfx::B2DPolyPolygon aB2DPP = rB2DPolyPoly;
-        aB2DPP.transform( aTransform );
-        if( mpGraphics->DrawPolyPolygon( aB2DPP, 0.0, this ) )
+        const basegfx::B2DHomMatrix aTransform(ImplGetDeviceTransformation());
+        basegfx::B2DPolyPolygon aB2DPolyPolygon(rB2DPolyPoly);
+        bool bSuccess(true);
+
+        // transform the polygon and ensure closed
+        aB2DPolyPolygon.transform(aTransform);
+        aB2DPolyPolygon.setClosed(true);
+
+        if(IsFillColor())
+        {
+            bSuccess = mpGraphics->DrawPolyPolygon(aB2DPolyPolygon, 0.0, this);
+        }
+
+        if(bSuccess && IsLineColor())
+        {
+            const ::basegfx::B2DVector aB2DLineWidth( 1.0, 1.0 );
+
+            if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
+            {
+                aB2DPolyPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolyPolygon);
+            }
+
+            for(sal_uInt32 a(0);bSuccess && a < aB2DPolyPolygon.count(); a++)
+            {
+                bSuccess = mpGraphics->DrawPolyLine(aB2DPolyPolygon.getB2DPolygon(a), aB2DLineWidth, basegfx::B2DLINEJOIN_NONE, this);
+            }
+        }
+
+        if(bSuccess)
+        {
             return;
+        }
     }
 
     // fallback to old polygon drawing if needed
@@ -2809,28 +2930,34 @@ void OutputDevice::DrawPolyLine(
         ImplInitLineColor();
 
     // #i98289# use b2dpolygon drawing if possible
-    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw))
-    {
-        const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
-        ::basegfx::B2DVector aB2DLineWidth(1.0, 1.0);
+    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
+        && ROP_OVERPAINT == GetRasterOp()
+        && IsLineColor())
+    {
+        const basegfx::B2DHomMatrix aTransform(ImplGetDeviceTransformation());
+        basegfx::B2DPolygon aB2DPolygon(rB2DPolygon);
+        basegfx::B2DVector aB2DLineWidth(1.0, 1.0);
         
-        // transform the line width if used
-        if( fLineWidth != 0.0 )
-            aB2DLineWidth = aTransform * ::basegfx::B2DVector( fLineWidth, fLineWidth );
-
         // transform the polygon
-        ::basegfx::B2DPolygon aB2DPL = rB2DPolygon;
-        aB2DPL.transform( aTransform );
+        aB2DPolygon.transform(aTransform);
+
+        // transform the line width if used
+        if(fLineWidth != 0.0)
+        {
+            aB2DLineWidth = aTransform * ::basegfx::B2DVector(fLineWidth, fLineWidth);
+        }
         
-        if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && (mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE))
+        if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
         {
-            // #i98289#
-            aB2DPL = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPL);
+            aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon);
         }
 
         // draw the polyline
-        if( mpGraphics->DrawPolyLine( aB2DPL, aB2DLineWidth, eLineJoin, this ) )
+        if(mpGraphics->DrawPolyLine(aB2DPolygon, aB2DLineWidth, eLineJoin, this))
+        {
             return;
+        }
     }
 
     // fallback to old polygon drawing if needed
diff --git a/vcl/source/gdi/outdev6.cxx b/vcl/source/gdi/outdev6.cxx
index 85889e1..8110ce8 100644
--- a/vcl/source/gdi/outdev6.cxx
+++ b/vcl/source/gdi/outdev6.cxx
@@ -185,14 +185,20 @@ void OutputDevice::DrawTransparent( const basegfx::B2DPolyPolygon& rB2DPolyPoly,
     if( mbInitFillColor )
         ImplInitFillColor();
 
-    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) && mpGraphics->supportsOperation(OutDevSupport_B2DDraw))
+    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
+        && ROP_OVERPAINT == GetRasterOp()
+        && IsFillColor())
     {
         // b2dpolygon support not implemented yet on non-UNX platforms
         const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
-        ::basegfx::B2DPolyPolygon aB2DPP = rB2DPolyPoly;
-        aB2DPP.transform( aTransform );
+        basegfx::B2DPolyPolygon aB2DPolyPolygon(rB2DPolyPoly);
+
+        // transform the polygon and ensure closed
+        aB2DPolyPolygon.transform(aTransform);
+        aB2DPolyPolygon.setClosed(true);
         
-        if( mpGraphics->DrawPolyPolygon( aB2DPP, fTransparency, this ) )
+        if(mpGraphics->DrawPolyPolygon(aB2DPolyPolygon, fTransparency, this))
         {
 #if 0 
             // MetaB2DPolyPolygonAction is not implemented yet:
commit f0f351803e75b28f50f1a124126a5149058d4232
Author: Jens-Heiner Rechtien <hr at openoffice.org>
Date:   Mon Jul 27 15:26:29 2009 +0000

    CWS-TOOLING: integrate CWS kso32fixes
    2009-07-10 15:25:24 +0200 kso  r273899 : #i53184# - fix probs with UNC server names containing underscores.
    2009-07-10 14:31:59 +0200 kso  r273893 : CWS-TOOLING: rebase CWS kso32fixes to trunk at 273858 (milestone: DEV300:m52)
    2009-07-09 13:46:16 +0200 kso  r273861 : #i53184# - withdrew patch.
    2009-07-08 13:39:00 +0200 kso  r273829 : #i63159# - added license header
    2009-07-08 11:44:08 +0200 kso  r273824 : i53184 - cannot open files from shell if UNC server has a _ (underscore)
    2009-07-08 11:21:12 +0200 kso  r273822 : #i93271# - mingw build error
    2009-07-08 11:13:48 +0200 kso  r273821 : #i91247 - Adhere to one more xdg spec
    2009-07-08 11:02:53 +0200 kso  r273820 : #i89017# - osl_trace now emits trailing line feed to the debugger
    2009-07-08 10:55:04 +0200 kso  r273819 : #i88663# - not waiting on successful forks but subsequent process failure
    2009-07-07 17:05:27 +0200 kso  r273810 : #i88382# - It's nice to leave the modal mode in gtk+ too ;-)
    2009-07-07 16:53:34 +0200 kso  r273808 : i88331# - Typo in include guard
    2009-07-07 16:48:17 +0200 kso  r273807 : i82831# - crashrep: warnings when size_t != int
    2009-07-07 16:39:49 +0200 kso  r273806 : i63159# - Patch to use d_type field in dirent structure if possible
    2009-06-24 12:52:27 +0200 kso  r273333 : #i100274# - solved win2k missing symbol problem (again).
    2009-05-20 13:58:48 +0200 kso  r272124 : CWS-TOOLING: rebase CWS kso32fixes to trunk at 271830 (milestone: DEV300:m48)
    2009-04-17 14:50:54 +0200 kso  r270950 : CWS-TOOLING: rebase CWS kso32fixes to trunk at 270723 (milestone: DEV300:m46)
    2009-03-26 09:27:28 +0100 kso  r270054 : #i100274# NTLM code cleanup.
    2009-03-20 14:13:38 +0100 kso  r269807 : #i100274# - Fixed potential buffer overflow in NTLM code.
    2009-03-19 14:53:03 +0100 kso  r269748 : #i100274. Added NTLM support for Non-Windows platforms.
    2009-03-17 15:52:44 +0100 kso  r269613 : CWS-TOOLING: rebase CWS kso32fixes to trunk at 269297 (milestone: DEV300:m43)

diff --git a/tools/source/fsys/urlobj.cxx b/tools/source/fsys/urlobj.cxx
index 7ba963e..9442426 100644
--- a/tools/source/fsys/urlobj.cxx
+++ b/tools/source/fsys/urlobj.cxx
@@ -1523,8 +1523,15 @@ bool INetURLObject::convertRelToAbs(rtl::OUString const & rTheRelURIRef,
             else if (pEnd - q >= 2 && q[0] == '\\' && q[1] == '\\')
             {
                 q += 2;
-                if (scanDomain(q, pEnd) > 0 && (q == pEnd || *q == '\\'))
+                sal_Int32 n = rtl_ustr_indexOfChar_WithLength(
+                    q, pEnd - q, '\\');
+                sal_Unicode const * qe = n == -1 ? pEnd : q + n;
+                if (parseHostOrNetBiosName(
+                        q, qe, bOctets, ENCODE_ALL, RTL_TEXTENCODING_DONTKNOW,
+                        true, NULL))
+                {
                     bFSys = true; // 1st
+                }
             }
             if (bFSys)
             {
diff --git a/tools/workben/urltest.cxx b/tools/workben/urltest.cxx
index 688179a..591e3ee 100644
--- a/tools/workben/urltest.cxx
+++ b/tools/workben/urltest.cxx
@@ -799,6 +799,25 @@ main()
                 bSuccess = false;
             }
         }
+        {
+            bool bWasAbsolute;
+            if (!rtl::OUString(INetURLObject(rtl::OUString(
+                                                 RTL_CONSTASCII_USTRINGPARAM(
+                                                     "file:///"))).
+                                   smartRel2Abs(
+                                           rtl::OUString(
+                                               RTL_CONSTASCII_USTRINGPARAM(
+                                                   "\\\\unc_host\\path")),
+                                           bWasAbsolute).
+                                       GetMainURL(INetURLObject::NO_DECODE)).
+                     equalsAsciiL(
+                         RTL_CONSTASCII_STRINGPARAM("file://unc_host/path"))
+                || !bWasAbsolute)
+            {
+                printf("BAD smartRel2Abs(\"\\\\unc_host\\path\")\n");
+                bSuccess = false;
+            }
+        }
     }
 
     if (true)


More information about the ooo-build-commit mailing list