[ooo-build-commit] Branch 'ooo/master' - 5 commits - basegfx/source canvas/source sot/inc sot/source svtools/inc svtools/prj svtools/source toolkit/source vcl/aqua vcl/inc vcl/source vcl/unx vcl/win

Jan Holesovsky kendy at kemper.freedesktop.org
Fri Jul 31 18:24:46 PDT 2009


 basegfx/source/polygon/b2dlinegeometry.cxx       |  105 
 basegfx/source/polygon/b2dpolygoncutandtouch.cxx |    9 
 canvas/source/cairo/cairo_canvashelper.cxx       |    2 
 sot/inc/sot/exchange.hxx                         |   11 
 sot/source/base/exchange.cxx                     |   34 
 svtools/inc/docmspasswdrequest.hxx               |   72 
 svtools/inc/pch/precompiled_svtools.hxx          |    1 
 svtools/prj/d.lst                                |    1 
 svtools/source/control/scrwin.cxx                |    4 
 svtools/source/misc1/docmspasswdrequest.cxx      |  143 +
 svtools/source/misc1/makefile.mk                 |    1 
 toolkit/source/awt/vclxwindow.cxx                |    2 
 vcl/aqua/source/gdi/salgdi.cxx                   |    5 
 vcl/inc/vcl/outdev.hxx                           |   14 
 vcl/source/gdi/outdev.cxx                        |  159 -
 vcl/source/glyphs/gcach_ftyp.cxx                 |   24 
 vcl/unx/source/gdi/salgdi.cxx                    | 3087 +++++++++++------------
 vcl/win/source/gdi/salgdi_gdiplus.cxx            |  162 -
 18 files changed, 2092 insertions(+), 1744 deletions(-)

New commits:
commit a6ff776ede114535b93491040f161fc7e797c97a
Author: Jens-Heiner Rechtien <hr at openoffice.org>
Date:   Thu Jul 30 10:52:48 2009 +0000

    CWS-TOOLING: integrate CWS fwk114
    2009-07-08 Mikhail Voytenko #i102448# fix typo
    2009-07-08 Mikhail Voytenko #i102448# detect the document of new format correctly
    2009-07-03 Mikhail Voytenko #i101418# adjust header
    2009-07-02 Mikhail Voytenko #i103001# Integrate the patch
    2009-07-01 Mikhail Voytenko rebase to DEV300_m51
    2009-06-25 Mikhail Voytenko #i71512# integrate the patch
    2009-06-19 Mikhail Voytenko #i102931# check whether the file was changed even in case of system file locking
    2009-06-10 Mikhail Voytenko #i102448# allow to turn the office update dialog off
    2009-06-10 Mikhail Voytenko #i102448# allow to turn the office update dialog off
    2009-06-09 Mikhail Voytenko #i96091# the disposed frame should throw DisposedException
    2009-06-09 Mikhail Voytenko #i100835# commit the patch
    2009-05-26 Mikhail Voytenko #i89514# integrate the patch
    2009-05-26 Mikhail Voytenko #i30373# integrate the patch
    2009-05-26 Mikhail Voytenko #i101418# fix the error handling

diff --git a/sot/inc/sot/exchange.hxx b/sot/inc/sot/exchange.hxx
index 2b29963..c23a1b3 100644
--- a/sot/inc/sot/exchange.hxx
+++ b/sot/inc/sot/exchange.hxx
@@ -196,10 +196,7 @@ public:
     static ULONG 	RegisterFormatMimeType( const String& rMimeType );
 
     static ULONG	GetFormat( const ::com::sun::star::datatransfer::DataFlavor& rFlavor );
-    static ULONG	GetStaticNameFormat( const String& rName );
-
     static String	GetFormatName( ULONG nFormat );
-    static String	GetFormatStaticName( ULONG nFormat );
     static sal_Bool	GetFormatDataFlavor( ULONG nFormat, ::com::sun::star::datatransfer::DataFlavor& rFlavor );
     static String 	GetFormatMimeType( ULONG nFormat );
     static BOOL     IsInternal( const SvGlobalName& );
@@ -216,14 +213,6 @@ public:
     static ULONG RegisterSotFormatName( SotFormatStringId nId )
         { return nId; }
 
-    // Anzahl der bereits registrierten Formate bzw. der hoechsten
-    // registrierten ID abfragen (fuer System-Registrierung)
-    // ACHTUNG: Die Algorithmen zur Registrierung beim System
-    // verlassen sich darauf, dass die hier gelieferte maximale
-    // Format-ID 'klein' ist, so dass eine Schleife ueber alle
-    // Formate laufen kann.
-    static ULONG	GetMaxFormat( void );
-
     // same for XTransferable interface
     static USHORT 	GetExchangeAction(
         // XTransferable
diff --git a/sot/source/base/exchange.cxx b/sot/source/base/exchange.cxx
index c2949f7..dc60f76 100644
--- a/sot/source/base/exchange.cxx
+++ b/sot/source/base/exchange.cxx
@@ -481,18 +481,6 @@ ULONG SotExchange::GetFormat( const DataFlavor& rFlavor )
 
 /*************************************************************************
 |*
-|*    SotExchange::GetStaticNameFormat()
-|*
-|*    Beschreibung      CLIP.SDW
-*************************************************************************/
-ULONG SotExchange::GetStaticNameFormat( const String& rName )
-{
-    // has to be changed to return the format for the static name (KA 27.09.2001)
-    return SotExchange::RegisterFormatName( rName );
-}
-
-/*************************************************************************
-|*
 |*    SotExchange::GetFormatName()
 |*
 |*    Beschreibung      CLIP.SDW
@@ -508,28 +496,6 @@ String SotExchange::GetFormatName( ULONG nFormat )
     return aRet;
 }
 
-/*************************************************************************
-|*
-|*    SotExchange::GetFormatStaticName()
-|*
-|*    Beschreibung      CLIP.SDW
-*************************************************************************/
-String SotExchange::GetFormatStaticName( ULONG nFormat )
-{
-    // has to be changed to return the static format name (KA 27.09.2001)
-    return SotExchange::GetFormatName( nFormat );
-}
-
-/*************************************************************************
-|*
-|*    SotExchange::GetMaxFormat()
-|*
-*************************************************************************/
-ULONG SotExchange::GetMaxFormat( void )
-{
-    return( SOT_FORMATSTR_ID_USER_END + InitFormats_Impl().Count() );
-}
-
 BOOL SotExchange::IsInternal( const SvGlobalName& rName )
 {
     if ( rName == SvGlobalName(SO3_SW_CLASSID_60) ||
commit 405f3e1b5a29249f53842bddfc8be484bdae7be6
Author: Jens-Heiner Rechtien <hr at openoffice.org>
Date:   Thu Jul 30 10:40:37 2009 +0000

    CWS-TOOLING: integrate CWS aw074_DEV300
    2009-07-06 13:21:50 +0200 aw  r273737 : CWS-TOOLING: rebase CWS aw074 to branches/OOO310 at 273700 (milestone: OOO310:m15)
    2009-07-06 11:12:35 +0200 aw  r273728 : #i102637# corrected condition to add gray frame to page visualisation objects
    2009-07-03 14:43:00 +0200 aw  r273702 : #i102380# always swap n GrafObjects on MasterPages synchronously
    2009-07-03 12:14:57 +0200 aw  r273686 : #i102548# corrected SdrPathPrimitive2D's usage of unit polygon
    2009-07-02 16:06:16 +0200 aw  r273662 : #i103255# added control when to show the draft graphic visualisation (in VOC, of course) and when not. Changed text visualisation to BlockText
    2009-07-01 17:36:55 +0200 aw  r273609 : #i103116# clear GaphicLink for interaction clone of graphic objets
    2009-07-01 16:42:09 +0200 aw  r273601 : #i101491# corrected some minor glitches in line geometry creation
    2009-06-30 18:47:44 +0200 aw  r273532 : #i102380# committed the cleanups/additions for the fix
    2009-06-26 13:16:17 +0200 aw  r273404 : #i101491# finetuning changes
    2009-06-26 13:15:57 +0200 aw  r273403 : #i101491# finetuning changes
    2009-06-25 16:31:26 +0200 aw  r273387 : #i101491# first version checkin for linux/mac tests
    2009-06-25 16:31:04 +0200 aw  r273386 : #i101491# first version checkin for linux/mac tests
    2009-06-24 15:35:05 +0200 aw  r273350 : #i101734# corrected VclMetafileProcessor2D::impTryToCreateSvtGraphicStroke to use the current ObjectTransformation
    2009-06-24 15:01:58 +0200 aw  r273348 : #i101811# added ViewInformation2D to renderChartPrimitive2D to allow embedding of object transformation to target MapMode
    2009-06-24 12:27:05 +0200 aw  r273328 : #i101980# use a hairline LineWitdth for SdrObject::TakeContour() calculation (like the old implementation did)
    2009-06-24 11:29:43 +0200 aw  r273321 : #i101781# corrected creation fallback for FullDrag for circle objects
    2009-06-23 17:26:58 +0200 aw  r273300 : #i101556# made primitive text attributes take versioned base text attribute sets into account

diff --git a/basegfx/source/polygon/b2dlinegeometry.cxx b/basegfx/source/polygon/b2dlinegeometry.cxx
index a6e6652..cb14766 100644
--- a/basegfx/source/polygon/b2dlinegeometry.cxx
+++ b/basegfx/source/polygon/b2dlinegeometry.cxx
@@ -352,13 +352,12 @@ namespace basegfx
             // Unfortunately, while it would be geometrically correct to not add
             // the in-between points EdgeEnd and EdgeStart, it leads to rounding
             // errors when converting to integer polygon coordinates for painting
-            const B2DVector aEdgeVector(rEdge.getEndPoint() - rEdge.getStartPoint());
-
             if(rEdge.isBezier())
             {
                 // prepare target and data common for upper and lower
                 B2DPolygon aBezierPolygon;
-                const double fEdgeLength(aEdgeVector.getLength());
+                const B2DVector aPureEdgeVector(rEdge.getEndPoint() - rEdge.getStartPoint());
+                const double fEdgeLength(aPureEdgeVector.getLength());
                 const bool bIsEdgeLengthZero(fTools::equalZero(fEdgeLength));
                 const B2DVector aTangentA(rEdge.getTangent(0.0));
                 const B2DVector aTangentB(rEdge.getTangent(1.0));
@@ -441,7 +440,11 @@ namespace basegfx
             }
             else
             {
-                const B2DVector aPerpendEdgeVector(getNormalizedPerpendicular(aEdgeVector) * fHalfLineWidth);
+                // #i101491# emulate rEdge.getTangent call which applies a factor of 0.3 to the
+                // full-length edge vector to have numerically exactly the same results as in the
+                // createAreaGeometryForJoin implementation
+                const B2DVector aEdgeTangent((rEdge.getEndPoint() - rEdge.getStartPoint()) * 0.3);
+                const B2DVector aPerpendEdgeVector(getNormalizedPerpendicular(aEdgeTangent) * fHalfLineWidth);
                 B2DPolygon aEdgePolygon;
                 
                 // create upper edge
@@ -495,45 +498,75 @@ namespace basegfx
                 }
             }
 
-            // create first polygon part for edge
-            aEdgePolygon.append(aEndPoint);
-            aEdgePolygon.append(rPoint);
-            aEdgePolygon.append(aStartPoint);
-
-            if(B2DLINEJOIN_MITER == eJoin)
+            switch(eJoin)
             {
-                // Look for the cut point between start point along rTangentPrev and
-                // end point along rTangentEdge. -rTangentEdge should be used, but since
-                // the cut value is used for interpolating along the first edge, the negation
-                // is not needed since the same fCut will be found on the first edge.
-                // If it exists, insert it to complete the mitered fill polygon.
-                double fCutPos(0.0);
-                tools::findCut(aStartPoint, rTangentPrev, aEndPoint, rTangentEdge, CUTFLAG_ALL, &fCutPos);
-
-                if(0.0 != fCutPos)
+                case B2DLINEJOIN_MITER :
                 {
-                    const B2DPoint aCutPoint(interpolate(aStartPoint, aStartPoint + rTangentPrev, fCutPos));
-                    aEdgePolygon.append(aCutPoint);
+                    aEdgePolygon.append(aEndPoint);
+                    aEdgePolygon.append(rPoint);
+                    aEdgePolygon.append(aStartPoint);
+                    
+                    // Look for the cut point between start point along rTangentPrev and
+                    // end point along rTangentEdge. -rTangentEdge should be used, but since
+                    // the cut value is used for interpolating along the first edge, the negation
+                    // is not needed since the same fCut will be found on the first edge.
+                    // If it exists, insert it to complete the mitered fill polygon.
+                    double fCutPos(0.0);
+                    tools::findCut(aStartPoint, rTangentPrev, aEndPoint, rTangentEdge, CUTFLAG_ALL, &fCutPos);
+
+                    if(0.0 != fCutPos)
+                    {
+                        const B2DPoint aCutPoint(interpolate(aStartPoint, aStartPoint + rTangentPrev, fCutPos));
+                        aEdgePolygon.append(aCutPoint);
+                    }
+                    
+                    break;
                 }
-            }
-            else if(B2DLINEJOIN_ROUND == eJoin)
-            {
-                // use tooling to add needed EllipseSegment
-                double fAngleStart(atan2(rPerpendPrev.getY(), rPerpendPrev.getX()));
-                double fAngleEnd(atan2(rPerpendEdge.getY(), rPerpendEdge.getX()));
-                
-                // atan2 results are [-PI .. PI], consolidate to [0.0 .. 2PI]
-                if(fAngleStart < 0.0)
+                case B2DLINEJOIN_ROUND :
                 {
-                    fAngleStart += F_2PI;
-                }
+                    // use tooling to add needed EllipseSegment
+                    double fAngleStart(atan2(rPerpendPrev.getY(), rPerpendPrev.getX()));
+                    double fAngleEnd(atan2(rPerpendEdge.getY(), rPerpendEdge.getX()));
+                    
+                    // atan2 results are [-PI .. PI], consolidate to [0.0 .. 2PI]
+                    if(fAngleStart < 0.0)
+                    {
+                        fAngleStart += F_2PI;
+                    }
+
+                    if(fAngleEnd < 0.0)
+                    {
+                        fAngleEnd += F_2PI;
+                    }
 
-                if(fAngleEnd < 0.0)
+                    const B2DPolygon aBow(tools::createPolygonFromEllipseSegment(rPoint, fHalfLineWidth, fHalfLineWidth, fAngleStart, fAngleEnd));
+
+                    if(aBow.count() > 1)
+                    {
+                        // #i101491#
+                        // use the original start/end positions; the ones from bow creation may be numerically
+                        // different due to their different creation. To guarantee good merging quality with edges
+                        // and edge roundings (and to reduce point count)
+                        aEdgePolygon = aBow;
+                        aEdgePolygon.setB2DPoint(0, aStartPoint);
+                        aEdgePolygon.setB2DPoint(aEdgePolygon.count() - 1, aEndPoint);
+                        aEdgePolygon.append(rPoint);
+
+                        break;
+                    }
+                    else
+                    {
+                        // wanted fall-through to default
+                    }
+                }
+                default: // B2DLINEJOIN_BEVEL
                 {
-                    fAngleEnd += F_2PI;
+                    aEdgePolygon.append(aEndPoint);
+                    aEdgePolygon.append(rPoint);
+                    aEdgePolygon.append(aStartPoint);
+                    
+                    break;
                 }
-
-                aEdgePolygon.append(tools::createPolygonFromEllipseSegment(rPoint, fHalfLineWidth, fHalfLineWidth, fAngleStart, fAngleEnd));
             }
 
             // create last polygon part for edge
diff --git a/basegfx/source/polygon/b2dpolygoncutandtouch.cxx b/basegfx/source/polygon/b2dpolygoncutandtouch.cxx
index 02ab827..5757d42 100644
--- a/basegfx/source/polygon/b2dpolygoncutandtouch.cxx
+++ b/basegfx/source/polygon/b2dpolygoncutandtouch.cxx
@@ -110,7 +110,10 @@ namespace basegfx
         {
             // #i76891# mergeTemporaryPointsAndPolygon redesigned to be able to correctly handle
             // single edges with/without control points
-            if(rTempPoints.size())
+            // #i101491# added counter for non-changing element count
+            const sal_uInt32 nTempPointCount(rTempPoints.size());
+
+            if(nTempPointCount)
             {
                 B2DPolygon aRetval;
                 const sal_uInt32 nCount(rCandidate.count());
@@ -138,7 +141,7 @@ namespace basegfx
                             double fLeftStart(0.0);
 
                             // now add all points targeted to be at this index
-                            while(nNewInd < rTempPoints.size() && rTempPoints[nNewInd].getIndex() == a)
+                            while(nNewInd < nTempPointCount && rTempPoints[nNewInd].getIndex() == a)
                             {
                                 const temporaryPoint& rTempPoint = rTempPoints[nNewInd++];
 
@@ -160,7 +163,7 @@ namespace basegfx
                         else
                         {
                             // add all points targeted to be at this index
-                            while(nNewInd < rTempPoints.size() && rTempPoints[nNewInd].getIndex() == a)
+                            while(nNewInd < nTempPointCount && rTempPoints[nNewInd].getIndex() == a)
                             {
                                 const temporaryPoint& rTempPoint = rTempPoints[nNewInd++];
                                 const B2DPoint aNewPoint(rTempPoint.getPoint());
diff --git a/vcl/aqua/source/gdi/salgdi.cxx b/vcl/aqua/source/gdi/salgdi.cxx
index 582e090..775431d 100644
--- a/vcl/aqua/source/gdi/salgdi.cxx
+++ b/vcl/aqua/source/gdi/salgdi.cxx
@@ -974,6 +974,11 @@ bool AquaSalGraphics::drawPolyLine( const ::basegfx::B2DPolygon& rPolyLine,
     if( rLineWidths.getX() != rLineWidths.getY() )
         return false;
 
+    // #i101491# Aqua does not support B2DLINEJOIN_NONE; return false to use
+    // the fallback (own geometry preparation)
+    if(basegfx::B2DLINEJOIN_NONE == eLineJoin)
+        return false;
+
     // setup line attributes
     CGLineJoin aCGLineJoin = kCGLineJoinMiter;
     switch( eLineJoin ) {
diff --git a/vcl/inc/vcl/outdev.hxx b/vcl/inc/vcl/outdev.hxx
index 90f6680..c9f056c 100644
--- a/vcl/inc/vcl/outdev.hxx
+++ b/vcl/inc/vcl/outdev.hxx
@@ -563,6 +563,20 @@ public:
     // tells whether this output device is RTL in an LTR UI or LTR in a RTL UI
     SAL_DLLPRIVATE bool ImplIsAntiparallel() const ;
 
+    // #i101491#
+    // Helper which holds the old line geometry creation and is extended to use AA when
+    // switched on. Advantage is that line geometry is only temporarily used for paint
+    SAL_DLLPRIVATE void ImpDrawPolyLineWithLineInfo(const Polygon& rPoly, const LineInfo& rLineInfo);
+    
+    // #i101491#
+    // Helper who implements the DrawPolyPolygon functionality for basegfx::B2DPolyPolygon
+    // without MetaFile processing
+    SAL_DLLPRIVATE void ImpDrawPolyPolygonWithB2DPolyPolygon(const basegfx::B2DPolyPolygon& rB2DPolyPoly);
+
+    // #i101491#
+    // Helper who tries to use SalGDI's DrawPolyLine direct and returns it's bool. Contains no AA check.
+    SAL_DLLPRIVATE bool ImpTryDrawPolyLineDirect(const basegfx::B2DPolygon& rB2DPolygon, double fLineWidth, basegfx::B2DLineJoin eLineJoin);
+
 protected:
                         OutputDevice();
 
diff --git a/vcl/source/gdi/outdev.cxx b/vcl/source/gdi/outdev.cxx
index f0eee90..64087c9 100644
--- a/vcl/source/gdi/outdev.cxx
+++ b/vcl/source/gdi/outdev.cxx
@@ -69,6 +69,7 @@
 #include <basegfx/matrix/b2dhommatrix.hxx>
 #include <basegfx/polygon/b2dpolygontools.hxx>
 #include <basegfx/polygon/b2dpolypolygontools.hxx>
+#include <basegfx/polygon/b2dlinegeometry.hxx>
 
 #include <com/sun/star/awt/XGraphics.hpp>
 #include <com/sun/star/uno/Sequence.hxx>
@@ -2472,11 +2473,13 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly )
     if ( mbInitLineColor )
         ImplInitLineColor();
 
-    // use b2dpolygon drawing if possible
-    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+    const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
         && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
         && ROP_OVERPAINT == GetRasterOp()
-        && IsLineColor())
+        && IsLineColor());
+
+    // use b2dpolygon drawing if possible
+    if(bTryAA && ImpTryDrawPolyLineDirect(rPoly.getB2DPolygon(), 0.0, basegfx::B2DLINEJOIN_NONE))
     {
         basegfx::B2DPolygon aB2DPolyLine(rPoly.getB2DPolygon());
         const ::basegfx::B2DHomMatrix aTransform = ImplGetDeviceTransformation();
@@ -2533,9 +2536,23 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly, const LineInfo& rLineInfo
         return;
     }
 
+    // #i101491#
+    // Try direct Fallback to B2D-Version of DrawPolyLine
+    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && LINE_SOLID == rLineInfo.GetStyle())
+    {
+        DrawPolyLine(rPoly.getB2DPolygon(), (double)rLineInfo.GetWidth(), basegfx::B2DLINEJOIN_ROUND);
+        return;
+    }
+
     if ( mpMetaFile )
         mpMetaFile->AddAction( new MetaPolyLineAction( rPoly, rLineInfo ) );
 
+    ImpDrawPolyLineWithLineInfo(rPoly, rLineInfo);
+}
+
+void OutputDevice::ImpDrawPolyLineWithLineInfo(const Polygon& rPoly, const LineInfo& rLineInfo)
+{
     USHORT nPoints = rPoly.GetSize();
 
     if ( !IsDeviceOutputNecessary() || !mbLineColor || ( nPoints < 2 ) || ( LINE_NONE == rLineInfo.GetStyle() ) || ImplIsRecordLayout() )
@@ -2561,6 +2578,10 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly, const LineInfo& rLineInfo
         return;
 
     const LineInfo aInfo( ImplLogicToDevicePixel( rLineInfo ) );
+    const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+        && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
+        && ROP_OVERPAINT == GetRasterOp()
+        && IsLineColor());
 
     if( aInfo.GetWidth() > 1L )
     {
@@ -2574,9 +2595,32 @@ void OutputDevice::DrawPolyLine( const Polygon& rPoly, const LineInfo& rLineInfo
         ImplInitLineColor();
         SetFillColor( aOldLineColor );
         ImplInitFillColor();
+        bool bDone(false);
+
+        if(bTryAA)
+        {
+            // #i101491# try AAed version
+            // Use old on-the-fly geometry preparation, combine with AA
+            bool bSuccess(true);
+
+            for(const Polygon* pPoly = aLineCvt.ImplGetFirst(); bSuccess && pPoly; pPoly = aLineCvt.ImplGetNext())
+            {
+                bSuccess = mpGraphics->DrawPolyPolygon(basegfx::B2DPolyPolygon(pPoly->getB2DPolygon()), 0.0, this);
+            }
 
-        for( const Polygon* pPoly = aLineCvt.ImplGetFirst(); pPoly; pPoly = aLineCvt.ImplGetNext() )
-            mpGraphics->DrawPolygon( pPoly->GetSize(), (const SalPoint*) pPoly->GetConstPointAry(), this );
+            if(bSuccess)
+            {
+                bDone = true;
+            }
+        }
+
+        if(!bDone)
+        {
+            for( const Polygon* pPoly = aLineCvt.ImplGetFirst(); pPoly; pPoly = aLineCvt.ImplGetNext() )
+            {
+                mpGraphics->DrawPolygon( pPoly->GetSize(), (const SalPoint*) pPoly->GetConstPointAry(), this );
+            }
+        }
 
         SetLineColor( aOldLineColor );
         SetFillColor( aOldFillColor );
@@ -2820,6 +2864,12 @@ void OutputDevice::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rB2DPolyPoly
         mpMetaFile->AddAction( new MetaPolyPolygonAction( PolyPolygon( rB2DPolyPoly ) ) );
 #endif
 
+    // call helper
+    ImpDrawPolyPolygonWithB2DPolyPolygon(rB2DPolyPoly);
+}
+
+void OutputDevice::ImpDrawPolyPolygonWithB2DPolyPolygon(const basegfx::B2DPolyPolygon& rB2DPolyPoly)
+{
     // AW: Do NOT paint empty PolyPolygons
     if(!rB2DPolyPoly.count())
         return;
@@ -2886,6 +2936,38 @@ void OutputDevice::DrawPolyPolygon( const basegfx::B2DPolyPolygon& rB2DPolyPoly
 
 // -----------------------------------------------------------------------
 
+bool OutputDevice::ImpTryDrawPolyLineDirect(
+    const basegfx::B2DPolygon& rB2DPolygon,
+    double fLineWidth,
+    basegfx::B2DLineJoin eLineJoin)
+{
+    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, fLineWidth );
+    }
+
+    // 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, aB2DLineWidth, eLineJoin, this);
+}
+
 void OutputDevice::DrawPolyLine(
     const basegfx::B2DPolygon& rB2DPolygon,
     double fLineWidth,
@@ -2929,43 +3011,62 @@ void OutputDevice::DrawPolyLine(
     if( mbInitLineColor )
         ImplInitLineColor();
 
-    // #i98289# use b2dpolygon drawing if possible
-    if((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
+    const bool bTryAA((mnAntialiasing & ANTIALIASING_ENABLE_B2DDRAW) 
         && mpGraphics->supportsOperation(OutDevSupport_B2DDraw)
         && ROP_OVERPAINT == GetRasterOp()
-        && IsLineColor())
+        && IsLineColor());
+
+    // use b2dpolygon drawing if possible
+    if(bTryAA && ImpTryDrawPolyLineDirect(rB2DPolygon, fLineWidth, eLineJoin))
     {
-        const basegfx::B2DHomMatrix aTransform(ImplGetDeviceTransformation());
-        basegfx::B2DPolygon aB2DPolygon(rB2DPolygon);
-        basegfx::B2DVector aB2DLineWidth(1.0, 1.0);
-        
-        // transform the polygon
-        aB2DPolygon.transform(aTransform);
+        return;
+    }
 
-        // transform the line width if used
-        if(fLineWidth != 0.0)
-        {
-            aB2DLineWidth = aTransform * ::basegfx::B2DVector(fLineWidth, fLineWidth);
-        }
-        
-        if(mnAntialiasing & ANTIALIASING_PIXELSNAPHAIRLINE)
-        {
-            aB2DPolygon = basegfx::tools::snapPointsOfHorizontalOrVerticalEdges(aB2DPolygon);
-        }
+    // #i101491#
+    // no output yet; fallback to geometry decomposition and use filled polygon paint
+    // when line is fat and not too complex. ImpDrawPolyPolygonWithB2DPolyPolygon
+    // will do internal needed AA checks etc.
+    if(fLineWidth >= 2.5 
+        && rB2DPolygon.count()
+        && rB2DPolygon.count() <= 1000)
+    {
+        const double fHalfLineWidth((fLineWidth * 0.5) + 0.5);
+        const basegfx::B2DPolyPolygon aAreaPolyPolygon(basegfx::tools::createAreaGeometry(
+            rB2DPolygon, fHalfLineWidth, eLineJoin));
+
+        const Color aOldLineColor(maLineColor);
+        const Color aOldFillColor(maFillColor);
 
-        // draw the polyline
-        if(mpGraphics->DrawPolyLine(aB2DPolygon, aB2DLineWidth, eLineJoin, this))
+        SetLineColor();
+        ImplInitLineColor();
+        SetFillColor(aOldLineColor);
+        ImplInitFillColor();
+
+        ImpDrawPolyPolygonWithB2DPolyPolygon(aAreaPolyPolygon);
+
+        SetLineColor(aOldLineColor);
+        ImplInitLineColor();
+        SetFillColor(aOldFillColor);
+        ImplInitFillColor();
+
+        if(bTryAA)
         {
-            return;
+            // 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++)
+            {
+                ImpTryDrawPolyLineDirect(aAreaPolyPolygon.getB2DPolygon(a), 0.0, basegfx::B2DLINEJOIN_NONE);
+            }
         }
     }
 
-    // fallback to old polygon drawing if needed
+    // fallback to old polygon drawing if needed. This will really
+    // use ImplLineConverter, but still try to AA lines
     const Polygon aToolsPolygon( rB2DPolygon );
     LineInfo aLineInfo;
     if( fLineWidth != 0.0 )
         aLineInfo.SetWidth( static_cast<long>(fLineWidth+0.5) );
-    DrawPolyLine( aToolsPolygon, aLineInfo );
+    ImpDrawPolyLineWithLineInfo( aToolsPolygon, aLineInfo );
 }
 
 // -----------------------------------------------------------------------
diff --git a/vcl/unx/source/gdi/salgdi.cxx b/vcl/unx/source/gdi/salgdi.cxx
index a3421bf..9a9f648 100644
--- a/vcl/unx/source/gdi/salgdi.cxx
+++ b/vcl/unx/source/gdi/salgdi.cxx
@@ -1,1539 +1,1548 @@
-/*************************************************************************
- *
- * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
- * 
- * Copyright 2008 by Sun Microsystems, Inc.
- *
- * OpenOffice.org - a multi-platform office productivity suite
- *
- * This file is part of OpenOffice.org.
- *
- * OpenOffice.org is free software: you can redistribute it and/or modify
- * it under the terms of the GNU Lesser General Public License version 3
- * only, as published by the Free Software Foundation.
- *
- * OpenOffice.org is distributed in the hope that it will be useful,
- * but WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
- * GNU Lesser General Public License version 3 for more details
- * (a copy is included in the LICENSE file that accompanied this code).
- *
- * You should have received a copy of the GNU Lesser General Public License
- * version 3 along with OpenOffice.org.  If not, see
- * <http://www.openoffice.org/license.html>
- * for a copy of the LGPLv3 License.
- *
- ************************************************************************/
-
-// MARKER(update_precomp.py): autogen include statement, do not remove
-#include "precompiled_vcl.hxx"
-
-#include "Xproto.h"
-
-#include "salunx.h"
-#include "saldata.hxx"
-#include "saldisp.hxx"
-#include "salgdi.h"
-#include "salframe.h"
-#include "salvd.h"
-#include "xrender_peer.hxx"
-
-#include "vcl/printergfx.hxx"
-#include "vcl/jobdata.hxx"
-
-#include "tools/debug.hxx"
-
-#include "basegfx/polygon/b2dpolygon.hxx"
-#include "basegfx/polygon/b2dpolypolygon.hxx"
-#include "basegfx/polygon/b2dpolypolygontools.hxx"
-#include "basegfx/polygon/b2dpolygontools.hxx"
-#include "basegfx/polygon/b2dpolygonclipper.hxx"
-#include "basegfx/polygon/b2dlinegeometry.hxx"
-#include "basegfx/matrix/b2dhommatrix.hxx"
-#include "basegfx/polygon/b2dpolypolygoncutter.hxx"
-
-#include <vector>
-#include <queue>
-#include <set>
-
-// -=-= SalPolyLine =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-#define STATIC_POINTS 64
-
-class SalPolyLine
-{
-            XPoint				Points_[STATIC_POINTS];
-            XPoint			   *pFirst_;
-public:
-    inline						SalPolyLine( ULONG nPoints );
-    inline						SalPolyLine( ULONG nPoints, const SalPoint *p );
-    inline						~SalPolyLine();
-    inline	XPoint			   &operator [] ( ULONG n ) const
-                                { return pFirst_[n]; }
-};
-
-inline SalPolyLine::SalPolyLine( ULONG nPoints )
-    : pFirst_( nPoints+1 > STATIC_POINTS ? new XPoint[nPoints+1] : Points_ )
-{}
-
-inline SalPolyLine::SalPolyLine( ULONG nPoints, const SalPoint *p )
-    : pFirst_( nPoints+1 > STATIC_POINTS ? new XPoint[nPoints+1] : Points_ )
-{
-    for( ULONG i = 0; i < nPoints; i++ )
-    {
-        pFirst_[i].x = (short)p[i].mnX;
-        pFirst_[i].y = (short)p[i].mnY;
-    }
-    pFirst_[nPoints] = pFirst_[0]; // close polyline
-}
-
-inline SalPolyLine::~SalPolyLine()
-{ if( pFirst_ != Points_ ) delete [] pFirst_; }
-
-#undef STATIC_POINTS
-// -=-= X11SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-X11SalGraphics::X11SalGraphics()
-{
-    m_pFrame			= NULL;
-    m_pVDev				= NULL;
-    m_pDeleteColormap	= NULL;
-    hDrawable_			= None;
-    m_aRenderPicture    = 0;
-    m_pRenderFormat     = NULL;
-
-    pClipRegion_			= NULL;
-    pPaintRegion_		= NULL;
-
-    pPenGC_			= NULL;
-    nPenPixel_			= 0;
-    nPenColor_			= MAKE_SALCOLOR( 0x00, 0x00, 0x00 ); // Black
-
-    pFontGC_            = NULL;
-    for( int i = 0; i < MAX_FALLBACK; ++i )
-    {
-        mXFont[i]       = NULL;
-        mpServerFont[i] = NULL;
-    }
-
-    nTextPixel_			= 0;
-    nTextColor_			= MAKE_SALCOLOR( 0x00, 0x00, 0x00 ); // Black
-
-    pBrushGC_			= NULL;
-    nBrushPixel_			= 0;
-    nBrushColor_		= MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ); // White
-    hBrush_				= None;
-
-    pMonoGC_			= NULL;
-    pCopyGC_			= NULL;
-    pMaskGC_			= NULL;
-    pInvertGC_			= NULL;
-    pInvert50GC_		= NULL;
-    pStippleGC_			= NULL;
-    pTrackingGC_		= NULL;
-
-    bWindow_			= FALSE;
-    bPrinter_			= FALSE;
-    bVirDev_			= FALSE;
-    bPenGC_			= FALSE;
-    bFontGC_			= FALSE;
-    bBrushGC_			= FALSE;
-    bMonoGC_			= FALSE;
-    bCopyGC_			= FALSE;
-    bInvertGC_			= FALSE;
-    bInvert50GC_		= FALSE;
-    bStippleGC_			= FALSE;
-    bTrackingGC_		= FALSE;
-    bXORMode_			= FALSE;
-    bDitherBrush_		= FALSE;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-X11SalGraphics::~X11SalGraphics()
-{
-    ReleaseFonts();
-    freeResources();
-}
-
-// -=-= SalGraphics / X11SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-void X11SalGraphics::freeResources()
-{
-    Display *pDisplay = GetXDisplay();
-    
-    DBG_ASSERT( !pPaintRegion_, "pPaintRegion_" );
-    if( pClipRegion_ ) XDestroyRegion( pClipRegion_ ), pClipRegion_ = None;
-    
-    if( hBrush_ )		XFreePixmap( pDisplay, hBrush_ ), hBrush_ = None;
-    if( pPenGC_ )		XFreeGC( pDisplay, pPenGC_ ), pPenGC_ = None;
-    if( pFontGC_ )		XFreeGC( pDisplay, pFontGC_ ), pFontGC_ = None;
-    if( pBrushGC_ )		XFreeGC( pDisplay, pBrushGC_ ), pBrushGC_ = None;
-    if( pMonoGC_ )		XFreeGC( pDisplay, pMonoGC_ ), pMonoGC_ = None;
-    if( pCopyGC_ )		XFreeGC( pDisplay, pCopyGC_ ), pCopyGC_ = None;
-    if( pMaskGC_ )		XFreeGC( pDisplay, pMaskGC_ ), pMaskGC_ = None;
-    if( pInvertGC_ )	XFreeGC( pDisplay, pInvertGC_ ), pInvertGC_ = None;
-    if( pInvert50GC_ )	XFreeGC( pDisplay, pInvert50GC_ ), pInvert50GC_ = None;
-    if( pStippleGC_ )	XFreeGC( pDisplay, pStippleGC_ ), pStippleGC_ = None;
-    if( pTrackingGC_ )	XFreeGC( pDisplay, pTrackingGC_ ), pTrackingGC_ = None;
-    if( m_pDeleteColormap )
-        delete m_pDeleteColormap, m_pColormap = m_pDeleteColormap = NULL;
-
-    if( m_aRenderPicture )
-        XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ), m_aRenderPicture = 0;
-
-    bPenGC_ = bFontGC_ = bBrushGC_ = bMonoGC_ = bCopyGC_ = bInvertGC_ = bInvert50GC_ = bStippleGC_ = bTrackingGC_ = false;
-}
-
-void X11SalGraphics::SetDrawable( Drawable aDrawable, int nScreen )
-{
-    // shortcut if nothing changed
-    if( hDrawable_ == aDrawable )
-        return;
-
-    // free screen specific resources if needed
-    if( nScreen != m_nScreen )
-    {
-        freeResources();
-        m_pColormap = &GetX11SalData()->GetDisplay()->GetColormap( nScreen );
-        m_nScreen = nScreen;
-    }
-
-    hDrawable_ = aDrawable;
-    SetXRenderFormat( NULL );
-    if( m_aRenderPicture )
-    {
-        XRenderPeer::GetInstance().FreePicture( m_aRenderPicture );
-        m_aRenderPicture = 0;
-    }
-
-    if( hDrawable_ )
-    {
-        nPenPixel_		= GetPixel( nPenColor_ );
-        nTextPixel_ 	= GetPixel( nTextColor_ );
-        nBrushPixel_	= GetPixel( nBrushColor_ );
-    }
-}
-
-void X11SalGraphics::Init( SalFrame *pFrame, Drawable aTarget, int nScreen )
-{
-#if 0 // TODO: use SetDrawable() instead
-    m_pColormap		= &GetX11SalData()->GetDisplay()->GetColormap(nScreen);
-    hDrawable_		= aTarget;
-    m_nScreen       = nScreen;
-    SetXRenderFormat( NULL );
-    if( m_aRenderPicture )
-        XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ), m_aRenderPicture = 0;
-
-    nPenPixel_		= GetPixel( nPenColor_ );
-    nTextPixel_ 	= GetPixel( nTextColor_ );
-    nBrushPixel_	= GetPixel( nBrushColor_ );
-#else
-    m_pColormap		= &GetX11SalData()->GetDisplay()->GetColormap(nScreen);
-    m_nScreen = nScreen;
-    SetDrawable( aTarget, nScreen );
-#endif
-
-    bWindow_		= TRUE;
-    m_pFrame		= pFrame;
-    m_pVDev			= NULL;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::DeInit()
-{
-    SetDrawable( None, m_nScreen );
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::SetClipRegion( GC pGC, XLIB_Region pXReg ) const
-{
-    Display *pDisplay = GetXDisplay();
-
-    int n = 0;
-    XLIB_Region Regions[3];
-
-    if( pClipRegion_ /* && !XEmptyRegion( pClipRegion_ ) */ )
-        Regions[n++] = pClipRegion_;
-//	if( pPaintRegion_ /* && !XEmptyRegion( pPaintRegion_ ) */ )
-//		Regions[n++] = pPaintRegion_;
-
-    if( pXReg && !XEmptyRegion( pXReg ) )
-        Regions[n++] = pXReg;
-
-    if( 0 == n )
-        XSetClipMask( pDisplay, pGC, None );
-    else if( 1 == n )
-        XSetRegion( pDisplay, pGC, Regions[0] );
-    else
-    {
-        XLIB_Region pTmpRegion = XCreateRegion();
-        XIntersectRegion( Regions[0], Regions[1], pTmpRegion );
-//		if( 3 == n )
-//			XIntersectRegion( Regions[2], pTmpRegion, pTmpRegion );
-        XSetRegion( pDisplay, pGC, pTmpRegion );
-        XDestroyRegion( pTmpRegion );
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-GC X11SalGraphics::SelectPen()
-{
-    Display *pDisplay = GetXDisplay();
-
-    if( !pPenGC_ )
-    {
-        XGCValues values;
-        values.subwindow_mode		= ClipByChildren;
-        values.fill_rule			= EvenOddRule;		// Pict import/ Gradient
-        values.graphics_exposures	= False;
-
-        pPenGC_ = XCreateGC( pDisplay, hDrawable_,
-                             GCSubwindowMode | GCFillRule | GCGraphicsExposures,
-                             &values );
-    }
-
-    if( !bPenGC_ )
-    {
-        if( nPenColor_ != SALCOLOR_NONE )
-            XSetForeground( pDisplay, pPenGC_, nPenPixel_ );
-        XSetFunction  ( pDisplay, pPenGC_, bXORMode_ ? GXxor : GXcopy );
-        SetClipRegion( pPenGC_ );
-        bPenGC_ = TRUE;
-    }
-
-    return pPenGC_;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-GC X11SalGraphics::SelectBrush()
-{
-    Display *pDisplay = GetXDisplay();
-
-    DBG_ASSERT( nBrushColor_ != SALCOLOR_NONE, "Brush Transparent" );
-
-    if( !pBrushGC_ )
-    {
-        XGCValues values;
-        // values.subwindow_mode		= IncludeInferiors;
-        values.subwindow_mode		= ClipByChildren;
-        values.fill_rule			= EvenOddRule;		// Pict import/ Gradient
-        values.graphics_exposures	= False;
-
-        pBrushGC_ = XCreateGC( pDisplay, hDrawable_,
-                               GCSubwindowMode | GCFillRule | GCGraphicsExposures,
-                               &values );
-    }
-
-    if( !bBrushGC_ )
-    {
-        if( !bDitherBrush_ )
-        {
-            XSetFillStyle ( pDisplay, pBrushGC_, FillSolid );
-            XSetForeground( pDisplay, pBrushGC_, nBrushPixel_ );
-                        #if defined(_USE_PRINT_EXTENSION_)
-                        XSetBackground( pDisplay, pBrushGC_,
-                                        WhitePixel(pDisplay, DefaultScreen(pDisplay)) );
-                        #else
-            if( bPrinter_ )
-                XSetTile( pDisplay, pBrushGC_, None );
-            #endif
-        }
-        else
-        {
-            // Bug in Sun Solaris 2.5.1, XFillPolygon doesn't allways reflect
-            // changes of the tile. PROPERTY_BUG_Tile doesn't fix this !
-            if (GetDisplay()->GetProperties() & PROPERTY_BUG_FillPolygon_Tile)
-                XSetFillStyle ( pDisplay, pBrushGC_, FillSolid );
-
-            XSetFillStyle ( pDisplay, pBrushGC_, FillTiled );
-            XSetTile      ( pDisplay, pBrushGC_, hBrush_ );
-        }
-        XSetFunction  ( pDisplay, pBrushGC_, bXORMode_ ? GXxor : GXcopy );
-        SetClipRegion( pBrushGC_ );
-
-        bBrushGC_ = TRUE;
-    }
-
-    return pBrushGC_;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-GC X11SalGraphics::GetTrackingGC()
-{
-    const char    dash_list[2] = {2, 2};
-
-    if( !pTrackingGC_ )
-    {
-        XGCValues     values;
-
-        values.graphics_exposures   = False;
-        values.foreground           = m_pColormap->GetBlackPixel()
-                                      ^ m_pColormap->GetWhitePixel();
-        values.function             = GXxor;
-        values.line_width           = 1;
-        values.line_style			= LineOnOffDash;
-
-        pTrackingGC_ = XCreateGC( GetXDisplay(), GetDrawable(),
-                                  GCGraphicsExposures | GCForeground | GCFunction
-                                  | GCLineWidth | GCLineStyle,
-                                  &values );
-        XSetDashes( GetXDisplay(), pTrackingGC_, 0, dash_list, 2 );
-    }
-
-    if( !bTrackingGC_ )
-    {
-        SetClipRegion( pTrackingGC_ );
-        bTrackingGC_ = TRUE;
-    }
-
-    return pTrackingGC_;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::DrawLines( ULONG              nPoints,
-                                const SalPolyLine &rPoints,
-                                GC                 pGC,
-                                bool               bClose
-                                )
-{
-    // errechne wie viele Linien XWindow auf einmal zeichnen kann
-    ULONG nMaxLines = (GetDisplay()->GetMaxRequestSize() - sizeof(xPolyPointReq))
-                      / sizeof(xPoint);
-    if( nMaxLines > nPoints ) nMaxLines = nPoints;
-
-    // gebe alle Linien aus, die XWindows zeichnen kann.
-    ULONG n;
-    for( n = 0; nPoints - n > nMaxLines; n += nMaxLines - 1 )
-        XDrawLines( GetXDisplay(),
-                    GetDrawable(),
-                    pGC,
-                    &rPoints[n],
-                    nMaxLines,
-                    CoordModeOrigin );
-
-    if( n < nPoints )
-        XDrawLines( GetXDisplay(),
-                    GetDrawable(),
-                    pGC,
-                    &rPoints[n],
-                    nPoints - n,
-                    CoordModeOrigin );
-    if( bClose )
-    {
-        if( rPoints[nPoints-1].x != rPoints[0].x || rPoints[nPoints-1].y != rPoints[0].y )
-            drawLine( rPoints[nPoints-1].x, rPoints[nPoints-1].y, rPoints[0].x, rPoints[0].y );
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-// Dithern: Calculate a dither-pixmap and make a brush of it
-#define P_DELTA			51
-#define DMAP( v, m )	((v % P_DELTA) > m ? (v / P_DELTA) + 1 : (v / P_DELTA))
-
-BOOL X11SalGraphics::GetDitherPixmap( SalColor nSalColor )
-{
-    static const short nOrdDither8Bit[ 8 ][ 8 ] =
-    {
-        { 0, 38,  9, 48,  2, 40, 12, 50},
-        {25, 12, 35, 22, 28, 15, 37, 24},
-        { 6, 44,  3, 41,  8, 47,  5, 44},
-        {32, 19, 28, 16, 34, 21, 31, 18},
-        { 1, 40, 11, 49,  0, 39, 10, 48},
-        {27, 14, 36, 24, 26, 13, 36, 23},
-        { 8, 46,  4, 43,  7, 45,  4, 42},
-        {33, 20, 30, 17, 32, 20, 29, 16}
-    };
-
-    // test for correct depth (8bit)
-    if( GetColormap().GetVisual().GetDepth() != 8 )
-        return FALSE;
-
-    char    pBits[64];
-    char   *pBitsPtr = pBits;
-
-    // Set the pallette-entries for the dithering tile
-    UINT8 nSalColorRed   = SALCOLOR_RED   ( nSalColor );
-    UINT8 nSalColorGreen = SALCOLOR_GREEN ( nSalColor );
-    UINT8 nSalColorBlue  = SALCOLOR_BLUE  ( nSalColor );
-
-    for( int nY = 0; nY < 8; nY++ )
-    {
-        for( int nX = 0; nX < 8; nX++ )
-        {
-            short nMagic = nOrdDither8Bit[nY][nX];
-            UINT8 nR   = P_DELTA * DMAP( nSalColorRed,   nMagic );
-            UINT8 nG   = P_DELTA * DMAP( nSalColorGreen, nMagic );
-            UINT8 nB   = P_DELTA * DMAP( nSalColorBlue,  nMagic );
-
-            *pBitsPtr++ = GetColormap().GetPixel( MAKE_SALCOLOR( nR, nG, nB ) );
-        }
-    }
-
-    // create the tile as ximage and an according pixmap -> caching
-    XImage *pImage = XCreateImage( GetXDisplay(),
-                                   GetColormap().GetXVisual(),
-                                   8,
-                                   ZPixmap,
-                                   0,				// offset
-                                   pBits,			// data
-                                   8, 8,			// width & height
-                                   8,				// bitmap_pad
-                                   0 );				// (default) bytes_per_line
-
-    if ( GetDisplay()->GetProperties() & PROPERTY_BUG_Tile )
-    {
-        if (hBrush_)
-            XFreePixmap (GetXDisplay(), hBrush_);
-        hBrush_ = XCreatePixmap( GetXDisplay(), GetDrawable(), 8, 8, 8 );
-    }
-    else
-    if( !hBrush_ )
-        hBrush_ = XCreatePixmap( GetXDisplay(), GetDrawable(), 8, 8, 8 );
-
-    // put the ximage to the pixmap
-    XPutImage( GetXDisplay(),
-               hBrush_,
-               GetDisplay()->GetCopyGC( m_nScreen ),
-               pImage,
-               0, 0,						// Source
-               0, 0,						// Destination
-               8, 8 );						// width & height
-
-    // destroy image-frame but not palette-data
-    pImage->data = NULL;
-    XDestroyImage( pImage );
-
-    return TRUE;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::GetResolution( sal_Int32 &rDPIX, sal_Int32 &rDPIY ) // const
-{
-    const SalDisplay *pDisplay = GetDisplay();
-    
-    rDPIX = pDisplay->GetResolution().A();
-    rDPIY = pDisplay->GetResolution().B();
-    if( !pDisplay->GetExactResolution() && rDPIY < 96 )
-    {
-        rDPIX = Divide( rDPIX * 96, rDPIY );
-            rDPIY = 96;
-    }
-    else if ( rDPIY > 200 )
-    {
-        rDPIX = Divide( rDPIX * 200, rDPIY );
-        rDPIY = 200;
-    }
-    
-    // #i12705# equalize x- and y-resolution if they are close enough
-    if( rDPIX != rDPIY )
-    {
-        // different x- and y- resolutions are usually artifacts of
-        // a wrongly calculated screen size. 
-        //if( (13*rDPIX >= 10*rDPIY) && (13*rDPIY >= 10*rDPIX) )  //+-30%
-        {
-#ifdef DEBUG
-            printf("Forcing Resolution from %" SAL_PRIdINT32 "x%" SAL_PRIdINT32 " to %" SAL_PRIdINT32 "x%" SAL_PRIdINT32 "\n",
-                    rDPIX,rDPIY,rDPIY,rDPIY);
-#endif
-            rDPIX = rDPIY; // y-resolution is more trustworthy
-        }
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-USHORT X11SalGraphics::GetBitCount() // const
-{
-    return GetVisual().GetDepth();
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-long X11SalGraphics::GetGraphicsWidth() const
-{
-    if( m_pFrame )
-        return m_pFrame->maGeometry.nWidth;
-    else if( m_pVDev )
-        return m_pVDev->GetWidth();
-    else
-        return 0;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-long X11SalGraphics::GetGraphicsHeight() const
-{
-    if( m_pFrame )
-        return m_pFrame->maGeometry.nHeight;
-    else if( m_pVDev )
-        return m_pVDev->GetHeight();
-    else
-        return 0;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::ResetClipRegion()
-{
-    if( pClipRegion_ )
-    {
-        bPenGC_			= FALSE;
-        bFontGC_		= FALSE;
-        bBrushGC_		= FALSE;
-        bMonoGC_		= FALSE;
-        bCopyGC_		= FALSE;
-        bInvertGC_		= FALSE;
-        bInvert50GC_	= FALSE;
-        bStippleGC_		= FALSE;
-        bTrackingGC_	= FALSE;
-        
-        XDestroyRegion( pClipRegion_ );
-        pClipRegion_	= NULL;
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::BeginSetClipRegion( ULONG )
-{
-    if( pClipRegion_ )
-        XDestroyRegion( pClipRegion_ );
-    pClipRegion_ = XCreateRegion();
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-BOOL X11SalGraphics::unionClipRegion( long nX, long nY, long nDX, long nDY )
-{
-    if (!nDX || !nDY)
-        return TRUE;
-
-    XRectangle aRect;
-    aRect.x			= (short)nX;
-    aRect.y			= (short)nY;
-    aRect.width		= (unsigned short)nDX;
-    aRect.height	= (unsigned short)nDY;
-    
-    XUnionRectWithRegion( &aRect, pClipRegion_, pClipRegion_ );
-    
-    return TRUE;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-bool X11SalGraphics::unionClipRegion( const ::basegfx::B2DPolyPolygon& )
-{
-        // TODO: implement and advertise OutDevSupport_B2DClip support
-        return false;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::EndSetClipRegion()
-{
-    bPenGC_			= FALSE;
-    bFontGC_		= FALSE;
-    bBrushGC_		= FALSE;
-    bMonoGC_		= FALSE;
-    bCopyGC_		= FALSE;
-    bInvertGC_		= FALSE;
-    bInvert50GC_	= FALSE;
-    bStippleGC_		= FALSE;
-    bTrackingGC_	= FALSE;
-    
-    if( XEmptyRegion( pClipRegion_ ) )
-    {
-        XDestroyRegion( pClipRegion_ );
-        pClipRegion_= NULL;
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::SetLineColor()
-{
-    if( nPenColor_ != SALCOLOR_NONE )
-    {
-        nPenColor_		= SALCOLOR_NONE;
-        bPenGC_			= FALSE;
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::SetLineColor( SalColor nSalColor )
-{
-    if( nPenColor_ != nSalColor )
-    {
-        nPenColor_		= nSalColor;
-        nPenPixel_		= GetPixel( nSalColor );
-        bPenGC_			= FALSE;
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::SetFillColor()
-{
-    if( nBrushColor_ != SALCOLOR_NONE )
-    {
-        bDitherBrush_	= FALSE;
-        nBrushColor_	= SALCOLOR_NONE;
-        bBrushGC_		= FALSE;
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::SetFillColor( SalColor nSalColor )
-{
-    if( nBrushColor_ != nSalColor )
-    {
-        bDitherBrush_	= FALSE;
-        nBrushColor_	= nSalColor;
-        nBrushPixel_	= GetPixel( nSalColor );
-        if( TrueColor != GetColormap().GetVisual().GetClass()
-            && GetColormap().GetColor( nBrushPixel_ ) != nBrushColor_
-            && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0x00 ) // black
-            && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0x80 ) // blue
-            && nSalColor != MAKE_SALCOLOR( 0x00, 0x80, 0x00 ) // green
-            && nSalColor != MAKE_SALCOLOR( 0x00, 0x80, 0x80 ) // cyan
-            && nSalColor != MAKE_SALCOLOR( 0x80, 0x00, 0x00 ) // red
-            && nSalColor != MAKE_SALCOLOR( 0x80, 0x00, 0x80 ) // magenta
-            && nSalColor != MAKE_SALCOLOR( 0x80, 0x80, 0x00 ) // brown
-            && nSalColor != MAKE_SALCOLOR( 0x80, 0x80, 0x80 ) // gray
-            && nSalColor != MAKE_SALCOLOR( 0xC0, 0xC0, 0xC0 ) // light gray
-            && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0xFF ) // light blue
-            && nSalColor != MAKE_SALCOLOR( 0x00, 0xFF, 0x00 ) // light green
-            && nSalColor != MAKE_SALCOLOR( 0x00, 0xFF, 0xFF ) // light cyan
-            && nSalColor != MAKE_SALCOLOR( 0xFF, 0x00, 0x00 ) // light red
-            && nSalColor != MAKE_SALCOLOR( 0xFF, 0x00, 0xFF ) // light magenta
-            && nSalColor != MAKE_SALCOLOR( 0xFF, 0xFF, 0x00 ) // light brown
-            && nSalColor != MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ) )
-            bDitherBrush_ = GetDitherPixmap(nSalColor);
-        bBrushGC_		= FALSE;
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::SetROPLineColor( SalROPColor nROPColor )
-{
-    switch( nROPColor )
-    {
-        case SAL_ROP_0 : // 0
-            nPenPixel_ = (Pixel)0;
-            break;
-        case SAL_ROP_1 : // 1
-            nPenPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1;
-            break;
-        case SAL_ROP_INVERT : // 2
-            nPenPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1;
-            break;
-    }
-    nPenColor_	= GetColormap().GetColor( nPenPixel_ );
-    bPenGC_		= FALSE;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::SetROPFillColor( SalROPColor nROPColor )
-{
-    switch( nROPColor )
-    {
-        case SAL_ROP_0 : // 0
-            nBrushPixel_ = (Pixel)0;
-            break;
-        case SAL_ROP_1 : // 1
-            nBrushPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1;
-            break;
-        case SAL_ROP_INVERT : // 2
-            nBrushPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1;
-            break;
-    }
-    bDitherBrush_	= FALSE;
-    nBrushColor_	= GetColormap().GetColor( nBrushPixel_ );
-    bBrushGC_		= FALSE;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::SetXORMode( bool bSet, bool )
-{
-    if( !bXORMode_ == bSet )
-    {
-        bXORMode_ 	= bSet;
-        bPenGC_		= FALSE;
-        bBrushGC_	= FALSE;
-        bMonoGC_		= FALSE;
-        bCopyGC_		= FALSE;
-        bInvertGC_	= FALSE;
-        bInvert50GC_	= FALSE;
-        bStippleGC_	= FALSE;
-        bTrackingGC_	= FALSE;
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::drawPixel( long nX, long nY )
-{
-    if( nPenColor_ !=  SALCOLOR_NONE )
-        XDrawPoint( GetXDisplay(), GetDrawable(), SelectPen(), nX, nY );
-}
-
-void X11SalGraphics::drawPixel( long nX, long nY, SalColor nSalColor )
-{
-    if( nSalColor != SALCOLOR_NONE )
-    {
-        Display *pDisplay = GetXDisplay();
-        
-        if( (nPenColor_ == SALCOLOR_NONE) && !bPenGC_ )
-        {
-            SetLineColor( nSalColor );
-            XDrawPoint( pDisplay, GetDrawable(), SelectPen(), nX, nY );
-            nPenColor_ = SALCOLOR_NONE;
-            bPenGC_ = False;
-        }
-        else
-        {
-            GC pGC = SelectPen();
-            
-            if( nSalColor != nPenColor_ )
-                XSetForeground( pDisplay, pGC, GetPixel( nSalColor ) );
-            
-            XDrawPoint( pDisplay, GetDrawable(), pGC, nX, nY );
-            
-            if( nSalColor != nPenColor_ )
-                XSetForeground( pDisplay, pGC, nPenPixel_ );
-        }
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::drawLine( long nX1, long nY1, long nX2, long nY2 )
-{
-    if( nPenColor_ != SALCOLOR_NONE )
-    {
-        if ( GetDisplay()->GetProperties() & PROPERTY_BUG_DrawLine )
-        {
-            GC aGC = SelectPen();
-            XDrawPoint (GetXDisplay(), GetDrawable(), aGC, (int)nX1, (int)nY1);
-            XDrawPoint (GetXDisplay(), GetDrawable(), aGC, (int)nX2, (int)nY2);
-            XDrawLine  (GetXDisplay(), GetDrawable(), aGC, nX1, nY1, nX2, nY2 );
-        }
-        else
-            XDrawLine( GetXDisplay(), GetDrawable(),SelectPen(),
-                       nX1, nY1, nX2, nY2 );
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::drawRect( long nX, long nY, long nDX, long nDY )
-{
-    if( nBrushColor_ != SALCOLOR_NONE )
-    {
-        XFillRectangle( GetXDisplay(),
-                        GetDrawable(),
-                        SelectBrush(),
-                        nX, nY, nDX, nDY );
-    }
-    // Beschreibung DrawRect verkehrt, deshalb -1
-    if( nPenColor_ != SALCOLOR_NONE )
-        XDrawRectangle( GetXDisplay(),
-                        GetDrawable(),
-                        SelectPen(),
-                        nX, nY, nDX-1, nDY-1 );
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::drawPolyLine( ULONG nPoints, const SalPoint *pPtAry )
-{
-    drawPolyLine( nPoints, pPtAry, false );
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::drawPolyLine( ULONG nPoints, const SalPoint *pPtAry, bool bClose )
-{
-    if( nPenColor_ != 0xFFFFFFFF )
-    {
-        SalPolyLine Points( nPoints, pPtAry );
-        
-        DrawLines( nPoints, Points, SelectPen(), bClose );
-    }
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::drawPolygon( ULONG nPoints, const SalPoint* pPtAry )
-{
-    if( nPoints == 0 )
-        return;
-    
-    if( nPoints < 3 )
-    {
-        if( !bXORMode_ )
-        {
-            if( 1 == nPoints  )
-                drawPixel( pPtAry[0].mnX, pPtAry[0].mnY );
-            else
-                drawLine( pPtAry[0].mnX, pPtAry[0].mnY,
-                          pPtAry[1].mnX, pPtAry[1].mnY );
-        }
-        return;
-    }
-    
-    SalPolyLine Points( nPoints, pPtAry );
-    
-    nPoints++;
-
-    /* WORKAROUND: some Xservers (Xorg, VIA chipset in this case)
-     * do not draw the visible part of a polygon
-     * if it overlaps to the left of screen 0,y.
-     * This happens to be the case in the gradient drawn in the
-     * menubar background. workaround for the special case of
-     * of a rectangle overlapping to the left.
-     */
-    if( nPoints == 5 &&
-    Points[ 0 ].x == Points[ 1 ].x &&
-        Points[ 1 ].y == Points[ 2 ].y &&
-        Points[ 2 ].x == Points[ 3 ].x &&
-        Points[ 0 ].x == Points[ 4 ].x && Points[ 0 ].y == Points[ 4 ].y
-       )
-    {
-        bool bLeft = false;
-        bool bRight = false;
-        for(unsigned int i = 0; i < nPoints; i++ )
-    {
-            if( Points[i].x < 0 )
-                bLeft = true;
-            else
-                bRight= true;
-    }
-    if( bLeft && ! bRight )
-        return;
-    if( bLeft && bRight )
-        {
-            for( unsigned int i = 0; i < nPoints; i++ )
-                if( Points[i].x < 0 )
-                    Points[i].x = 0;
-        }
-    }		
-    
-    if( nBrushColor_ != SALCOLOR_NONE )
-        XFillPolygon( GetXDisplay(),
-                      GetDrawable(),
-                      SelectBrush(),
-                      &Points[0], nPoints,
-                      Complex, CoordModeOrigin );
-    
-    if( nPenColor_ != 0xFFFFFFFF )
-        DrawLines( nPoints, Points, SelectPen(), true );
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-void X11SalGraphics::drawPolyPolygon( sal_uInt32		nPoly,
-                                   const sal_uInt32	   *pPoints,
-                                   PCONSTSALPOINT  *pPtAry )
-{
-    if( nBrushColor_ != SALCOLOR_NONE )
-    {
-        ULONG		i, n;
-        XLIB_Region	pXRegA	= NULL;
-        
-        for( i = 0; i < nPoly; i++ ) {
-            n = pPoints[i];
-            SalPolyLine Points( n, pPtAry[i] );
-            if( n > 2 )
-            {
-                XLIB_Region pXRegB = XPolygonRegion( &Points[0], n+1, WindingRule );
-                if( !pXRegA )
-                    pXRegA = pXRegB;
-                else
-                {
-                    XXorRegion( pXRegA, pXRegB, pXRegA );
-                    XDestroyRegion( pXRegB );
-                }
-            }
-        }
-        
-        if( pXRegA )
-        {
-            XRectangle aXRect;
-            XClipBox( pXRegA, &aXRect );
-            
-            GC pGC = SelectBrush();
-            SetClipRegion( pGC, pXRegA ); // ??? doppelt
-            XDestroyRegion( pXRegA );
-            bBrushGC_ = FALSE;
-            
-            XFillRectangle( GetXDisplay(),
-                            GetDrawable(),
-                            pGC,
-                            aXRect.x, aXRect.y, aXRect.width, aXRect.height );
-        }
-   }
-        
-   if( nPenColor_ != SALCOLOR_NONE )
-       for( ULONG i = 0; i < nPoly; i++ )
-           drawPolyLine( pPoints[i], pPtAry[i], true );
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-sal_Bool X11SalGraphics::drawPolyLineBezier( ULONG, const SalPoint*, const BYTE* )
-{
-    return sal_False;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-sal_Bool X11SalGraphics::drawPolygonBezier( ULONG, const SalPoint*, const BYTE* )
-{
-    return sal_False;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-sal_Bool X11SalGraphics::drawPolyPolygonBezier( sal_uInt32, const sal_uInt32*,
-                                                const SalPoint* const*, const BYTE* const* )
-{
-    return sal_False;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-void X11SalGraphics::invert( ULONG nPoints,
-                             const SalPoint* pPtAry,
-                             SalInvert nFlags )
-{
-    SalPolyLine Points ( nPoints, pPtAry );
-    
-    GC pGC;
-    if( SAL_INVERT_50 & nFlags )
-        pGC = GetInvert50GC();
-    else
-        if ( SAL_INVERT_TRACKFRAME & nFlags )
-            pGC = GetTrackingGC();
-        else
-            pGC = GetInvertGC();
-    
-    if( SAL_INVERT_TRACKFRAME & nFlags )
-        DrawLines ( nPoints, Points, pGC, true );
-    else
-        XFillPolygon( GetXDisplay(),
-                      GetDrawable(),
-                      pGC,
-                      &Points[0], nPoints,
-                      Complex, CoordModeOrigin );
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-BOOL X11SalGraphics::drawEPS( long,long,long,long,void*,ULONG )
-{
-    return FALSE;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-XID X11SalGraphics::GetXRenderPicture()
-{
-    if( !m_aRenderPicture )
-    {
-        // check xrender support for matching visual
-        // find a XRenderPictFormat compatible with the Drawable
-        XRenderPeer& rRenderPeer = XRenderPeer::GetInstance();
-        XRenderPictFormat* pVisualFormat = static_cast<XRenderPictFormat*>(GetXRenderFormat());
-        if( !pVisualFormat )
-        {
-            Visual* pVisual = GetDisplay()->GetVisual( m_nScreen ).GetVisual();
-            pVisualFormat = rRenderPeer.FindVisualFormat( pVisual );
-            if( !pVisualFormat )
-                return 0;
-            // cache the XRenderPictFormat
-            SetXRenderFormat( static_cast<void*>(pVisualFormat) );
-        }
-
-        // get the matching xrender target for drawable
-        m_aRenderPicture = rRenderPeer.CreatePicture( hDrawable_, pVisualFormat, 0, NULL );
-    }
-
-#if 0
-    // setup clipping so the callers don't have to do it themselves
-    // TODO: avoid clipping if already set correctly
-    if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) )
-        rRenderPeer.SetPictureClipRegion( aDstPic, pClipRegion_ );
-#endif
-
-    return m_aRenderPicture;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-SystemGraphicsData X11SalGraphics::GetGraphicsData() const
-{
-    SystemGraphicsData aRes;
-
-    aRes.nSize = sizeof(aRes);
-    aRes.pDisplay  = GetXDisplay();
-    aRes.hDrawable = hDrawable_;
-    aRes.pVisual   = GetDisplay()->GetVisual( m_nScreen ).GetVisual();
-    aRes.nScreen   = m_nScreen;
-    aRes.nDepth    = GetDisplay()->GetVisual( m_nScreen ).GetDepth();
-    aRes.aColormap = GetDisplay()->GetColormap( m_nScreen ).GetXColormap();
-    aRes.pRenderFormat = m_pRenderFormat;
-    return aRes;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-// B2DPolygon support methods
-
-namespace { // anonymous namespace to prevent export
-// the methods and structures here are used by the
-// B2DPolyPolygon->RenderTrapezoid conversion algorithm
-
-// compare two line segments
-// assumption: both segments point downward
-// assumption: they must have at least some y-overlap
-// assumption: rA.p1.y <= rB.p1.y
-bool IsLeftOf( const XLineFixed& rA, const XLineFixed& rB )
-{
-    bool bAbove = (rA.p1.y <= rB.p1.y);
-    const XLineFixed& rU = bAbove ? rA : rB;
-    const XLineFixed& rL = bAbove ? rB : rA;
-
-    const XFixed aXDiff = rU.p2.x - rU.p1.x;
-    const XFixed aYDiff = rU.p2.y - rU.p1.y;
-
-    if( (rU.p1.y != rL.p1.y) || (rU.p1.x != rL.p1.x) )
-    {
-        const sal_Int64 n1 = (sal_Int64)aXDiff * (rL.p1.y - rU.p1.y);
-        const sal_Int64 n2 = (sal_Int64)aYDiff * (rL.p1.x - rU.p1.x);
-        if( n1 != n2 )
-            return ((n1 < n2) == bAbove);
-    }
-
-    if( (rU.p2.y != rL.p2.y) || (rU.p2.x != rL.p2.x) )
-    {
-        const sal_Int64 n3 = (sal_Int64)aXDiff * (rL.p2.y - rU.p1.y);
-        const sal_Int64 n4 = (sal_Int64)aYDiff * (rL.p2.x - rU.p1.x);
-        if( n3 != n4 )
-            return ((n3 < n4) == bAbove);
-    }
-
-    // both segments overlap
-    return false;
-}
-
-struct HalfTrapezoid
-{
-    // assumptions:
-    //    maLine.p1.y <= mnY < maLine.p2.y
-    XLineFixed  maLine;
-    XFixed      mnY;
-};
-
-struct HalfTrapCompare
-{
-    bool operator()( const HalfTrapezoid& rA, const HalfTrapezoid& rB ) const
-    {
-        bool bIsTopLeft = false;
-        if( rA.mnY != rB.mnY )  // sort top-first if possible
-            bIsTopLeft = (rA.mnY < rB.mnY);
-        else                    // else sort left-first
-            bIsTopLeft = IsLeftOf( rA.maLine, rB.maLine );
-        // adjust to priority_queue sorting convention
-        return !bIsTopLeft;
-    }
-};
-
-typedef std::priority_queue< HalfTrapezoid, std::vector<HalfTrapezoid>, HalfTrapCompare > HTQueueBase;
-// we need a priority queue with a reserve() to prevent countless reallocations
-class HTQueue
-:	public HTQueueBase
-{
-public:
-    void	reserve( size_t n ) { c.reserve( n ); }
-    int		capacity() { return c.capacity(); }
-};
-
-typedef std::vector<XTrapezoid> TrapezoidVector;
-
-class TrapezoidXCompare
-{
-    const TrapezoidVector& mrVector;
-public:
-    TrapezoidXCompare( const TrapezoidVector& rVector )
-        : mrVector( rVector ) {}
-    bool operator()( int nA, int nB ) const
-        { return IsLeftOf( mrVector[nA].left, mrVector[nB].left ); }
-};
-
-typedef std::multiset< int, TrapezoidXCompare > ActiveTrapSet;
-
-class TrapezoidYCompare
-{
-    const TrapezoidVector& mrVector;
-public:
-    TrapezoidYCompare( const TrapezoidVector& rVector )
-        : mrVector( rVector ) {}
-    bool operator()( int nA, int nB ) const
-        { return (mrVector[nA].bottom < mrVector[nB].bottom); }
-};
-
-typedef std::multiset< int, TrapezoidYCompare > VerticalTrapSet;
-} // end of anonymous namespace
-
-// draw a poly-polygon
-bool X11SalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPoly, double fTransparency)
-{
-    // nothing to do for empty polypolygons
-    const int nPolygonCount = rPolyPoly.count();
-    if( nPolygonCount <= 0 )
-        return TRUE;
-
-    // nothing to do if everything is transparent
-    if( (nBrushColor_ == SALCOLOR_NONE)
-    &&  (nPenColor_ == SALCOLOR_NONE) )
-        return TRUE;
-
-    // cannot handle pencolor!=brushcolor yet
-    if( (nPenColor_ != SALCOLOR_NONE)
-    &&  (nPenColor_ != nBrushColor_) )
-        return FALSE;
-
-    // TODO: remove the env-variable when no longer needed
-    static const char* pRenderEnv = getenv( "SAL_DISABLE_RENDER_POLY" );
-    if( pRenderEnv )
-        return FALSE;
-
-    // check xrender support for trapezoids
-    XRenderPeer& rRenderPeer = XRenderPeer::GetInstance();
-    if( !rRenderPeer.AreTrapezoidsSupported() )
-        return FALSE;
-    Picture aDstPic = GetXRenderPicture();
-    // check xrender support for this drawable
-    if( !aDstPic )
-        return FALSE;
-
-    // don't bother with polygons outside of visible area
-    const basegfx::B2DRange aViewRange( 0, 0, GetGraphicsWidth(), GetGraphicsHeight() );
-    const basegfx::B2DRange aPolyRange = basegfx::tools::getRange( rPolyPoly );
-    const bool bNeedViewClip = !aPolyRange.isInside( aViewRange );
-    if( !aPolyRange.overlaps( aViewRange ) )
-        return true;
-
-    // convert the polypolygon to trapezoids
-
-    // first convert the B2DPolyPolygon to HalfTrapezoids
-    // #i100922# try to prevent priority-queue reallocations by reservering enough
-    int nHTQueueReserve = 0;
-    for( int nOuterPolyIdx = 0; nOuterPolyIdx < nPolygonCount; ++nOuterPolyIdx )
-    {
-        const ::basegfx::B2DPolygon aOuterPolygon = rPolyPoly.getB2DPolygon( nOuterPolyIdx );
-        const int nPointCount = aOuterPolygon.count();
-        nHTQueueReserve += aOuterPolygon.areControlPointsUsed() ? 8 * nPointCount : nPointCount;
-    }
-    nHTQueueReserve = ((4*nHTQueueReserve) | 0x1FFF) + 1;
-    HTQueue aHTQueue;
-    aHTQueue.reserve( nHTQueueReserve );
-    for( int nOuterPolyIdx = 0; nOuterPolyIdx < nPolygonCount; ++nOuterPolyIdx )
-    {
-        const ::basegfx::B2DPolygon aOuterPolygon = rPolyPoly.getB2DPolygon( nOuterPolyIdx );
-
-        // render-trapezoids should be inside the view => clip polygon against view range
-        basegfx::B2DPolyPolygon aClippedPolygon( aOuterPolygon );
-        if( bNeedViewClip )
-        {
-            aClippedPolygon = basegfx::tools::clipPolygonOnRange( aOuterPolygon, aViewRange, true, false );
-            DBG_ASSERT( aClippedPolygon.count(), "polygon confirmed to overlap with view should not get here" );
-            if( !aClippedPolygon.count() )
-                continue;
-        }
-
-        // render-trapezoids have linear edges => get rid of bezier segments
-        if( aClippedPolygon.areControlPointsUsed() )
-            aClippedPolygon = ::basegfx::tools::adaptiveSubdivideByDistance( aClippedPolygon, 0.125 );
-
-        // test and remove self intersections
-        // TODO: make code intersection save, then remove this test
-        basegfx::B2DPolyPolygon aInnerPolyPoly(basegfx::tools::solveCrossovers( aClippedPolygon));
-        const int nInnerPolyCount = aInnerPolyPoly.count();
-        for( int nInnerPolyIdx = 0; nInnerPolyIdx < nInnerPolyCount; ++nInnerPolyIdx )
-        {
-            ::basegfx::B2DPolygon aInnerPolygon = aInnerPolyPoly.getB2DPolygon( nInnerPolyIdx );
-            const int nPointCount = aInnerPolygon.count();
-            if( !nPointCount )
-                continue;
-
-            aHTQueue.reserve( aHTQueue.size() + 8 * nPointCount );
-
-            // convert polygon point pairs to HalfTrapezoids
-            // connect the polygon point with the first one if needed
-            XPointFixed aOldXPF = { 0, 0 };
-            XPointFixed aNewXPF;
-            for( int nPointIdx = 0; nPointIdx <= nPointCount; ++nPointIdx, aOldXPF = aNewXPF )
-            {
-                const int k = (nPointIdx < nPointCount) ? nPointIdx : 0;
-                const ::basegfx::B2DPoint& aPoint = aInnerPolygon.getB2DPoint( k );
-                
-                // convert the B2DPoint into XRENDER units
-                if(getAntiAliasB2DDraw())
-                {
-                    aNewXPF.x = XDoubleToFixed( aPoint.getX() );
-                    aNewXPF.y = XDoubleToFixed( aPoint.getY() );
-                }
-                else
-                {
-                    aNewXPF.x = XDoubleToFixed( basegfx::fround( aPoint.getX() ) );
-                    aNewXPF.y = XDoubleToFixed( basegfx::fround( aPoint.getY() ) );
-                }
-
-                // check if enough data is available for a new HalfTrapezoid
-                if( nPointIdx == 0 )
-                    continue;
-                // ignore vertical segments
-                if( aNewXPF.y == aOldXPF.y )
-                    continue;
-
-                // construct HalfTrapezoid as topdown segment
-                HalfTrapezoid aHT;
-                if( aNewXPF.y < aOldXPF.y )
-                {
-                    aHT.maLine.p1 = aNewXPF;
-                    aHT.maLine.p2 = aOldXPF;
-                }
-                else
-                {
-                    aHT.maLine.p2 = aNewXPF;
-                    aHT.maLine.p1 = aOldXPF;
-                }
-
-                aHT.mnY = aHT.maLine.p1.y;
-
-#if 0 // ignore clipped HalfTrapezoids
-            if( aHT.mnY < 0 )
-                aHT.mnY = 0;
-            else if( aHT.mnY > 10000 )
-                continue;
-#endif
-
-                // queue up the HalfTrapezoid
-                aHTQueue.push( aHT );
-            }
-        }
-    }
-
-    if( aHTQueue.empty() )
-        return TRUE;
-
-    // then convert the HalfTrapezoids into full Trapezoids
-    TrapezoidVector aTrapVector;
-    aTrapVector.reserve( aHTQueue.size() * 2 ); // just a guess
-
-    TrapezoidXCompare aTrapXCompare( aTrapVector );
-    ActiveTrapSet aActiveTraps( aTrapXCompare );
-
-    TrapezoidYCompare aTrapYCompare( aTrapVector );
-    VerticalTrapSet aVerticalTraps( aTrapYCompare );
-
-    while( !aHTQueue.empty() )
-    {
-        XTrapezoid aTrapezoid;
-
-        // convert a HalfTrapezoid pair
-        const HalfTrapezoid& rLeft = aHTQueue.top();
-        aTrapezoid.top = rLeft.mnY;
-        aTrapezoid.bottom = rLeft.maLine.p2.y;
-        aTrapezoid.left = rLeft.maLine;
-
-#if 0
-        // ignore empty trapezoids
-        if( aTrapezoid.bottom <= aTrapezoid.top )
-            continue;
-#endif
-
-        aHTQueue.pop();
-        if( aHTQueue.empty() ) // TODO: assert
-            break;
-        const HalfTrapezoid& rRight = aHTQueue.top();
-        aTrapezoid.right = rRight.maLine;
-        aHTQueue.pop();
-
-        aTrapezoid.bottom = aTrapezoid.left.p2.y;
-        if( aTrapezoid.bottom > aTrapezoid.right.p2.y )
-            aTrapezoid.bottom = aTrapezoid.right.p2.y;
-
-        // keep the full Trapezoid candidate
-        aTrapVector.push_back( aTrapezoid );
-
-        // unless it splits an older trapezoid
-        bool bSplit = false;
-        for(;;)
-        {
-            // check if the new trapezoid overlaps with an old trapezoid
-            ActiveTrapSet::iterator aActiveTrapsIt
-                = aActiveTraps.upper_bound( aTrapVector.size()-1 );
-            if( aActiveTrapsIt == aActiveTraps.begin() )
-                break;
-            --aActiveTrapsIt;
-
-            XTrapezoid& rLeftTrap = aTrapVector[ *aActiveTrapsIt ];
-
-            // in the ActiveTrapSet there are still trapezoids where
-            // a vertical overlap with new trapezoids is no longer possible
-            // they could have been removed in the verticaltraps loop below
-            // but this would have been expensive and is not needed as we can
-            // simply ignore them now and remove them from the ActiveTrapSet
-            // so they won't bother us in the future
-            if( rLeftTrap.bottom <= aTrapezoid.top )
-            {
-                aActiveTraps.erase( aActiveTrapsIt );
-                continue;
-            }
-
-            // check if there is horizontal overlap
-            // aTrapezoid.left==rLeftTrap.right is allowed though
-            if( !IsLeftOf( aTrapezoid.left, rLeftTrap.right ) )
-                break;
-
-            // split the old trapezoid and keep its upper part
-            // find the old trapezoids entry in the VerticalTrapSet and remove it
-            typedef std::pair<VerticalTrapSet::iterator, VerticalTrapSet::iterator> VTSPair;
-            VTSPair aVTSPair = aVerticalTraps.equal_range( *aActiveTrapsIt );
-            VerticalTrapSet::iterator aVTSit = aVTSPair.first;
-            for(; (aVTSit != aVTSPair.second) && (*aVTSit != *aActiveTrapsIt); ++aVTSit ) ;
-            if( aVTSit != aVTSPair.second )
-                aVerticalTraps.erase( aVTSit );
-            // then update the old trapezoid's bottom
-            rLeftTrap.bottom = aTrapezoid.top;
-            // enter the updated old trapzoid in VerticalTrapSet
-            aVerticalTraps.insert( aVerticalTraps.begin(), *aActiveTrapsIt );
-            // the old trapezoid is no longer active
-            aActiveTraps.erase( aActiveTrapsIt );
-
-            // the trapezoid causing the split has become obsolete
-            // so its both sides have to be re-queued
-            HalfTrapezoid aHT;
-            aHT.mnY = aTrapezoid.top;
-            aHT.maLine = aTrapezoid.left;
-            aHTQueue.push( aHT );
-            aHT.maLine = aTrapezoid.right;
-            aHTQueue.push( aHT );
-
-            bSplit = true;
-            break;
-        }
-
-        // keep or forget the resulting full Trapezoid
-        if( bSplit )
-            aTrapVector.pop_back();
-        else
-        {
-            aActiveTraps.insert( aTrapVector.size()-1 );
-            aVerticalTraps.insert( aTrapVector.size()-1 );
-        }
-
-        // mark trapezoids that can no longer be split as inactive
-        // and recycle their sides which were not fully resolved
-        static const XFixed nMaxTop = +0x7FFFFFFF;
-        XFixed nNewTop = aHTQueue.empty() ? nMaxTop : aHTQueue.top().mnY;
-        while( !aVerticalTraps.empty() )
-        {
-            const XTrapezoid& rOldTrap = aTrapVector[ *aVerticalTraps.begin() ];
-            if( nNewTop < rOldTrap.bottom )
-                break;
-            // the reference Trapezoid can no longer be split
-            aVerticalTraps.erase( aVerticalTraps.begin() );
-
-            // recycle its sides that were not fully resolved
-            HalfTrapezoid aHT;
-            aHT.mnY = rOldTrap.bottom;
-            if( rOldTrap.left.p2.y > rOldTrap.bottom )
-            {
-                aHT.maLine = rOldTrap.left;
-                aHTQueue.push( aHT );
-            }
-            if( rOldTrap.right.p2.y > rOldTrap.bottom )
-            {
-                aHT.maLine = rOldTrap.right;
-                aHTQueue.push( aHT );
-            }
-        }
-    }
-
-    // create xrender Picture for polygon foreground
-    SalDisplay::RenderEntry& rEntry = GetDisplay()->GetRenderEntries( m_nScreen )[ 32 ];
-    if( !rEntry.m_aPicture )
-    {
-        Display* pXDisplay = GetXDisplay();
-
-        rEntry.m_aPixmap = ::XCreatePixmap( pXDisplay, hDrawable_, 1, 1, 32 );
-        XRenderPictureAttributes aAttr;
-        aAttr.repeat = true;
-
-        XRenderPictFormat* pXRPF = rRenderPeer.FindStandardFormat( PictStandardARGB32 );
-        rEntry.m_aPicture = rRenderPeer.CreatePicture( rEntry.m_aPixmap, pXRPF, CPRepeat, &aAttr );
-    }
-
-    // set polygon foreground color and opacity
-    XRenderColor aRenderColor = GetXRenderColor( nBrushColor_ , fTransparency );
-    rRenderPeer.FillRectangle( PictOpSrc, rEntry.m_aPicture, &aRenderColor, 0, 0, 1, 1 );
-
-    // set clipping
-    // TODO: move into GetXRenderPicture?
-    if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) )
-        rRenderPeer.SetPictureClipRegion( aDstPic, pClipRegion_ );
-
-    // render the trapezoids
-    const XRenderPictFormat* pMaskFormat = rRenderPeer.GetStandardFormatA8();
-    rRenderPeer.CompositeTrapezoids( PictOpOver,
-        rEntry.m_aPicture, aDstPic, pMaskFormat, 0, 0, &aTrapVector[0], aTrapVector.size() );
-
-    return TRUE;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
-
-bool X11SalGraphics::drawPolyLine(const ::basegfx::B2DPolygon& rPolygon, const ::basegfx::B2DVector& rLineWidth, basegfx::B2DLineJoin eLineJoin)
-{
-    const XRenderPeer& rRenderPeer = XRenderPeer::GetInstance();
-    if( !rRenderPeer.AreTrapezoidsSupported() )
-        return false;
-
-    // get the area polygon for the line polygon
-    basegfx::B2DPolygon aPolygon = rPolygon;
-    if( (rLineWidth.getX() != rLineWidth.getY())
-    && !basegfx::fTools::equalZero( rLineWidth.getY() ) )
-    {
-        // prepare for createAreaGeometry() with anisotropic linewidth
-        basegfx::B2DHomMatrix aAnisoMatrix;
-        aAnisoMatrix.scale( 1.0, rLineWidth.getX() / rLineWidth.getY() );
-        aPolygon.transform( aAnisoMatrix );
-    }
-
-    // AW: reSegment no longer needed; new createAreaGeometry will remove exteme positions
-    // and create bezier polygons
-    //if( aPolygon.areControlPointsUsed() )
-    //    aPolygon = basegfx::tools::reSegmentPolygonEdges( aPolygon, 8, true, false );
-    //const basegfx::B2DPolyPolygon aAreaPolyPoly = basegfx::tools::createAreaGeometryForSimplePolygon(
-    //    aPolygon, 0.5*rLineWidth.getX(), eLineJoin );
-    const basegfx::B2DPolyPolygon aAreaPolyPoly(basegfx::tools::createAreaGeometry(aPolygon, 0.5*rLineWidth.getX(), eLineJoin));
-    
-    if( (rLineWidth.getX() != rLineWidth.getY())
-    && !basegfx::fTools::equalZero( rLineWidth.getX() ) )
-    {
-        // postprocess createAreaGeometry() for anisotropic linewidth
-        basegfx::B2DHomMatrix aAnisoMatrix;
-        aAnisoMatrix.scale( 1.0, rLineWidth.getY() / rLineWidth.getX() );
-        aPolygon.transform( aAnisoMatrix );
-    }
-
-    // temporarily adjust brush color to pen color
-    // since the line is drawn as an area-polygon
-    const SalColor aKeepBrushColor = nBrushColor_;
-    nBrushColor_ = nPenColor_;
-
-    // draw each area polypolygon component individually
-    // to emulate the polypolygon winding rule "non-zero"
-    bool bDrawOk = true;
-    const int nPolyCount = aAreaPolyPoly.count();
-    for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx )
-    {
-        const ::basegfx::B2DPolyPolygon aOnePoly( aAreaPolyPoly.getB2DPolygon( nPolyIdx ) );
-        bDrawOk = drawPolyPolygon( aOnePoly, 0.0);
-        if( !bDrawOk )
-            break;
-    }
-
-    // restore the original brush GC
-    nBrushColor_ = aKeepBrushColor;
-    return bDrawOk;
-}
-
-// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright 2008 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_vcl.hxx"
+
+#include "Xproto.h"
+
+#include "salunx.h"
+#include "saldata.hxx"
+#include "saldisp.hxx"
+#include "salgdi.h"
+#include "salframe.h"
+#include "salvd.h"
+#include "xrender_peer.hxx"
+
+#include "vcl/printergfx.hxx"
+#include "vcl/jobdata.hxx"
+
+#include "tools/debug.hxx"
+
+#include "basegfx/polygon/b2dpolygon.hxx"
+#include "basegfx/polygon/b2dpolypolygon.hxx"
+#include "basegfx/polygon/b2dpolypolygontools.hxx"
+#include "basegfx/polygon/b2dpolygontools.hxx"
+#include "basegfx/polygon/b2dpolygonclipper.hxx"
+#include "basegfx/polygon/b2dlinegeometry.hxx"
+#include "basegfx/matrix/b2dhommatrix.hxx"
+#include "basegfx/polygon/b2dpolypolygoncutter.hxx"
+
+#include <vector>
+#include <queue>
+#include <set>
+
+// -=-= SalPolyLine =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+#define STATIC_POINTS 64
+
+class SalPolyLine
+{
+            XPoint				Points_[STATIC_POINTS];
+            XPoint			   *pFirst_;
+public:
+    inline						SalPolyLine( ULONG nPoints );
+    inline						SalPolyLine( ULONG nPoints, const SalPoint *p );
+    inline						~SalPolyLine();
+    inline	XPoint			   &operator [] ( ULONG n ) const
+                                { return pFirst_[n]; }
+};
+
+inline SalPolyLine::SalPolyLine( ULONG nPoints )
+    : pFirst_( nPoints+1 > STATIC_POINTS ? new XPoint[nPoints+1] : Points_ )
+{}
+
+inline SalPolyLine::SalPolyLine( ULONG nPoints, const SalPoint *p )
+    : pFirst_( nPoints+1 > STATIC_POINTS ? new XPoint[nPoints+1] : Points_ )
+{
+    for( ULONG i = 0; i < nPoints; i++ )
+    {
+        pFirst_[i].x = (short)p[i].mnX;
+        pFirst_[i].y = (short)p[i].mnY;
+    }
+    pFirst_[nPoints] = pFirst_[0]; // close polyline
+}
+
+inline SalPolyLine::~SalPolyLine()
+{ if( pFirst_ != Points_ ) delete [] pFirst_; }
+
+#undef STATIC_POINTS
+// -=-= X11SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+X11SalGraphics::X11SalGraphics()
+{
+    m_pFrame			= NULL;
+    m_pVDev				= NULL;
+    m_pDeleteColormap	= NULL;
+    hDrawable_			= None;
+    m_aRenderPicture    = 0;
+    m_pRenderFormat     = NULL;
+
+    pClipRegion_			= NULL;
+    pPaintRegion_		= NULL;
+
+    pPenGC_			= NULL;
+    nPenPixel_			= 0;
+    nPenColor_			= MAKE_SALCOLOR( 0x00, 0x00, 0x00 ); // Black
+
+    pFontGC_            = NULL;
+    for( int i = 0; i < MAX_FALLBACK; ++i )
+    {
+        mXFont[i]       = NULL;
+        mpServerFont[i] = NULL;
+    }
+
+    nTextPixel_			= 0;
+    nTextColor_			= MAKE_SALCOLOR( 0x00, 0x00, 0x00 ); // Black
+
+    pBrushGC_			= NULL;
+    nBrushPixel_			= 0;
+    nBrushColor_		= MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ); // White
+    hBrush_				= None;
+
+    pMonoGC_			= NULL;
+    pCopyGC_			= NULL;
+    pMaskGC_			= NULL;
+    pInvertGC_			= NULL;
+    pInvert50GC_		= NULL;
+    pStippleGC_			= NULL;
+    pTrackingGC_		= NULL;
+
+    bWindow_			= FALSE;
+    bPrinter_			= FALSE;
+    bVirDev_			= FALSE;
+    bPenGC_			= FALSE;
+    bFontGC_			= FALSE;
+    bBrushGC_			= FALSE;
+    bMonoGC_			= FALSE;
+    bCopyGC_			= FALSE;
+    bInvertGC_			= FALSE;
+    bInvert50GC_		= FALSE;
+    bStippleGC_			= FALSE;
+    bTrackingGC_		= FALSE;
+    bXORMode_			= FALSE;
+    bDitherBrush_		= FALSE;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+X11SalGraphics::~X11SalGraphics()
+{
+    ReleaseFonts();
+    freeResources();
+}
+
+// -=-= SalGraphics / X11SalGraphics =-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+void X11SalGraphics::freeResources()
+{
+    Display *pDisplay = GetXDisplay();
+    
+    DBG_ASSERT( !pPaintRegion_, "pPaintRegion_" );
+    if( pClipRegion_ ) XDestroyRegion( pClipRegion_ ), pClipRegion_ = None;
+    
+    if( hBrush_ )		XFreePixmap( pDisplay, hBrush_ ), hBrush_ = None;
+    if( pPenGC_ )		XFreeGC( pDisplay, pPenGC_ ), pPenGC_ = None;
+    if( pFontGC_ )		XFreeGC( pDisplay, pFontGC_ ), pFontGC_ = None;
+    if( pBrushGC_ )		XFreeGC( pDisplay, pBrushGC_ ), pBrushGC_ = None;
+    if( pMonoGC_ )		XFreeGC( pDisplay, pMonoGC_ ), pMonoGC_ = None;
+    if( pCopyGC_ )		XFreeGC( pDisplay, pCopyGC_ ), pCopyGC_ = None;
+    if( pMaskGC_ )		XFreeGC( pDisplay, pMaskGC_ ), pMaskGC_ = None;
+    if( pInvertGC_ )	XFreeGC( pDisplay, pInvertGC_ ), pInvertGC_ = None;
+    if( pInvert50GC_ )	XFreeGC( pDisplay, pInvert50GC_ ), pInvert50GC_ = None;
+    if( pStippleGC_ )	XFreeGC( pDisplay, pStippleGC_ ), pStippleGC_ = None;
+    if( pTrackingGC_ )	XFreeGC( pDisplay, pTrackingGC_ ), pTrackingGC_ = None;
+    if( m_pDeleteColormap )
+        delete m_pDeleteColormap, m_pColormap = m_pDeleteColormap = NULL;
+
+    if( m_aRenderPicture )
+        XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ), m_aRenderPicture = 0;
+
+    bPenGC_ = bFontGC_ = bBrushGC_ = bMonoGC_ = bCopyGC_ = bInvertGC_ = bInvert50GC_ = bStippleGC_ = bTrackingGC_ = false;
+}
+
+void X11SalGraphics::SetDrawable( Drawable aDrawable, int nScreen )
+{
+    // shortcut if nothing changed
+    if( hDrawable_ == aDrawable )
+        return;
+
+    // free screen specific resources if needed
+    if( nScreen != m_nScreen )
+    {
+        freeResources();
+        m_pColormap = &GetX11SalData()->GetDisplay()->GetColormap( nScreen );
+        m_nScreen = nScreen;
+    }
+
+    hDrawable_ = aDrawable;
+    SetXRenderFormat( NULL );
+    if( m_aRenderPicture )
+    {
+        XRenderPeer::GetInstance().FreePicture( m_aRenderPicture );
+        m_aRenderPicture = 0;
+    }
+
+    if( hDrawable_ )
+    {
+        nPenPixel_		= GetPixel( nPenColor_ );
+        nTextPixel_ 	= GetPixel( nTextColor_ );
+        nBrushPixel_	= GetPixel( nBrushColor_ );
+    }
+}
+
+void X11SalGraphics::Init( SalFrame *pFrame, Drawable aTarget, int nScreen )
+{
+#if 0 // TODO: use SetDrawable() instead
+    m_pColormap		= &GetX11SalData()->GetDisplay()->GetColormap(nScreen);
+    hDrawable_		= aTarget;
+    m_nScreen       = nScreen;
+    SetXRenderFormat( NULL );
+    if( m_aRenderPicture )
+        XRenderPeer::GetInstance().FreePicture( m_aRenderPicture ), m_aRenderPicture = 0;
+
+    nPenPixel_		= GetPixel( nPenColor_ );
+    nTextPixel_ 	= GetPixel( nTextColor_ );
+    nBrushPixel_	= GetPixel( nBrushColor_ );
+#else
+    m_pColormap		= &GetX11SalData()->GetDisplay()->GetColormap(nScreen);
+    m_nScreen = nScreen;
+    SetDrawable( aTarget, nScreen );
+#endif
+
+    bWindow_		= TRUE;
+    m_pFrame		= pFrame;
+    m_pVDev			= NULL;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::DeInit()
+{
+    SetDrawable( None, m_nScreen );
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::SetClipRegion( GC pGC, XLIB_Region pXReg ) const
+{
+    Display *pDisplay = GetXDisplay();
+
+    int n = 0;
+    XLIB_Region Regions[3];
+
+    if( pClipRegion_ /* && !XEmptyRegion( pClipRegion_ ) */ )
+        Regions[n++] = pClipRegion_;
+//	if( pPaintRegion_ /* && !XEmptyRegion( pPaintRegion_ ) */ )
+//		Regions[n++] = pPaintRegion_;
+
+    if( pXReg && !XEmptyRegion( pXReg ) )
+        Regions[n++] = pXReg;
+
+    if( 0 == n )
+        XSetClipMask( pDisplay, pGC, None );
+    else if( 1 == n )
+        XSetRegion( pDisplay, pGC, Regions[0] );
+    else
+    {
+        XLIB_Region pTmpRegion = XCreateRegion();
+        XIntersectRegion( Regions[0], Regions[1], pTmpRegion );
+//		if( 3 == n )
+//			XIntersectRegion( Regions[2], pTmpRegion, pTmpRegion );
+        XSetRegion( pDisplay, pGC, pTmpRegion );
+        XDestroyRegion( pTmpRegion );
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+GC X11SalGraphics::SelectPen()
+{
+    Display *pDisplay = GetXDisplay();
+
+    if( !pPenGC_ )
+    {
+        XGCValues values;
+        values.subwindow_mode		= ClipByChildren;
+        values.fill_rule			= EvenOddRule;		// Pict import/ Gradient
+        values.graphics_exposures	= False;
+
+        pPenGC_ = XCreateGC( pDisplay, hDrawable_,
+                             GCSubwindowMode | GCFillRule | GCGraphicsExposures,
+                             &values );
+    }
+
+    if( !bPenGC_ )
+    {
+        if( nPenColor_ != SALCOLOR_NONE )
+            XSetForeground( pDisplay, pPenGC_, nPenPixel_ );
+        XSetFunction  ( pDisplay, pPenGC_, bXORMode_ ? GXxor : GXcopy );
+        SetClipRegion( pPenGC_ );
+        bPenGC_ = TRUE;
+    }
+
+    return pPenGC_;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+GC X11SalGraphics::SelectBrush()
+{
+    Display *pDisplay = GetXDisplay();
+
+    DBG_ASSERT( nBrushColor_ != SALCOLOR_NONE, "Brush Transparent" );
+
+    if( !pBrushGC_ )
+    {
+        XGCValues values;
+        // values.subwindow_mode		= IncludeInferiors;
+        values.subwindow_mode		= ClipByChildren;
+        values.fill_rule			= EvenOddRule;		// Pict import/ Gradient
+        values.graphics_exposures	= False;
+
+        pBrushGC_ = XCreateGC( pDisplay, hDrawable_,
+                               GCSubwindowMode | GCFillRule | GCGraphicsExposures,
+                               &values );
+    }
+
+    if( !bBrushGC_ )
+    {
+        if( !bDitherBrush_ )
+        {
+            XSetFillStyle ( pDisplay, pBrushGC_, FillSolid );
+            XSetForeground( pDisplay, pBrushGC_, nBrushPixel_ );
+                        #if defined(_USE_PRINT_EXTENSION_)
+                        XSetBackground( pDisplay, pBrushGC_,
+                                        WhitePixel(pDisplay, DefaultScreen(pDisplay)) );
+                        #else
+            if( bPrinter_ )
+                XSetTile( pDisplay, pBrushGC_, None );
+            #endif
+        }
+        else
+        {
+            // Bug in Sun Solaris 2.5.1, XFillPolygon doesn't allways reflect
+            // changes of the tile. PROPERTY_BUG_Tile doesn't fix this !
+            if (GetDisplay()->GetProperties() & PROPERTY_BUG_FillPolygon_Tile)
+                XSetFillStyle ( pDisplay, pBrushGC_, FillSolid );
+
+            XSetFillStyle ( pDisplay, pBrushGC_, FillTiled );
+            XSetTile      ( pDisplay, pBrushGC_, hBrush_ );
+        }
+        XSetFunction  ( pDisplay, pBrushGC_, bXORMode_ ? GXxor : GXcopy );
+        SetClipRegion( pBrushGC_ );
+
+        bBrushGC_ = TRUE;
+    }
+
+    return pBrushGC_;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+GC X11SalGraphics::GetTrackingGC()
+{
+    const char    dash_list[2] = {2, 2};
+
+    if( !pTrackingGC_ )
+    {
+        XGCValues     values;
+
+        values.graphics_exposures   = False;
+        values.foreground           = m_pColormap->GetBlackPixel()
+                                      ^ m_pColormap->GetWhitePixel();
+        values.function             = GXxor;
+        values.line_width           = 1;
+        values.line_style			= LineOnOffDash;
+
+        pTrackingGC_ = XCreateGC( GetXDisplay(), GetDrawable(),
+                                  GCGraphicsExposures | GCForeground | GCFunction
+                                  | GCLineWidth | GCLineStyle,
+                                  &values );
+        XSetDashes( GetXDisplay(), pTrackingGC_, 0, dash_list, 2 );
+    }
+
+    if( !bTrackingGC_ )
+    {
+        SetClipRegion( pTrackingGC_ );
+        bTrackingGC_ = TRUE;
+    }
+
+    return pTrackingGC_;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::DrawLines( ULONG              nPoints,
+                                const SalPolyLine &rPoints,
+                                GC                 pGC,
+                                bool               bClose
+                                )
+{
+    // errechne wie viele Linien XWindow auf einmal zeichnen kann
+    ULONG nMaxLines = (GetDisplay()->GetMaxRequestSize() - sizeof(xPolyPointReq))
+                      / sizeof(xPoint);
+    if( nMaxLines > nPoints ) nMaxLines = nPoints;
+
+    // gebe alle Linien aus, die XWindows zeichnen kann.
+    ULONG n;
+    for( n = 0; nPoints - n > nMaxLines; n += nMaxLines - 1 )
+        XDrawLines( GetXDisplay(),
+                    GetDrawable(),
+                    pGC,
+                    &rPoints[n],
+                    nMaxLines,
+                    CoordModeOrigin );
+
+    if( n < nPoints )
+        XDrawLines( GetXDisplay(),
+                    GetDrawable(),
+                    pGC,
+                    &rPoints[n],
+                    nPoints - n,
+                    CoordModeOrigin );
+    if( bClose )
+    {
+        if( rPoints[nPoints-1].x != rPoints[0].x || rPoints[nPoints-1].y != rPoints[0].y )
+            drawLine( rPoints[nPoints-1].x, rPoints[nPoints-1].y, rPoints[0].x, rPoints[0].y );
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+// Dithern: Calculate a dither-pixmap and make a brush of it
+#define P_DELTA			51
+#define DMAP( v, m )	((v % P_DELTA) > m ? (v / P_DELTA) + 1 : (v / P_DELTA))
+
+BOOL X11SalGraphics::GetDitherPixmap( SalColor nSalColor )
+{
+    static const short nOrdDither8Bit[ 8 ][ 8 ] =
+    {
+        { 0, 38,  9, 48,  2, 40, 12, 50},
+        {25, 12, 35, 22, 28, 15, 37, 24},
+        { 6, 44,  3, 41,  8, 47,  5, 44},
+        {32, 19, 28, 16, 34, 21, 31, 18},
+        { 1, 40, 11, 49,  0, 39, 10, 48},
+        {27, 14, 36, 24, 26, 13, 36, 23},
+        { 8, 46,  4, 43,  7, 45,  4, 42},
+        {33, 20, 30, 17, 32, 20, 29, 16}
+    };
+
+    // test for correct depth (8bit)
+    if( GetColormap().GetVisual().GetDepth() != 8 )
+        return FALSE;
+
+    char    pBits[64];
+    char   *pBitsPtr = pBits;
+
+    // Set the pallette-entries for the dithering tile
+    UINT8 nSalColorRed   = SALCOLOR_RED   ( nSalColor );
+    UINT8 nSalColorGreen = SALCOLOR_GREEN ( nSalColor );
+    UINT8 nSalColorBlue  = SALCOLOR_BLUE  ( nSalColor );
+
+    for( int nY = 0; nY < 8; nY++ )
+    {
+        for( int nX = 0; nX < 8; nX++ )
+        {
+            short nMagic = nOrdDither8Bit[nY][nX];
+            UINT8 nR   = P_DELTA * DMAP( nSalColorRed,   nMagic );
+            UINT8 nG   = P_DELTA * DMAP( nSalColorGreen, nMagic );
+            UINT8 nB   = P_DELTA * DMAP( nSalColorBlue,  nMagic );
+
+            *pBitsPtr++ = GetColormap().GetPixel( MAKE_SALCOLOR( nR, nG, nB ) );
+        }
+    }
+
+    // create the tile as ximage and an according pixmap -> caching
+    XImage *pImage = XCreateImage( GetXDisplay(),
+                                   GetColormap().GetXVisual(),
+                                   8,
+                                   ZPixmap,
+                                   0,				// offset
+                                   pBits,			// data
+                                   8, 8,			// width & height
+                                   8,				// bitmap_pad
+                                   0 );				// (default) bytes_per_line
+
+    if ( GetDisplay()->GetProperties() & PROPERTY_BUG_Tile )
+    {
+        if (hBrush_)
+            XFreePixmap (GetXDisplay(), hBrush_);
+        hBrush_ = XCreatePixmap( GetXDisplay(), GetDrawable(), 8, 8, 8 );
+    }
+    else
+    if( !hBrush_ )
+        hBrush_ = XCreatePixmap( GetXDisplay(), GetDrawable(), 8, 8, 8 );
+
+    // put the ximage to the pixmap
+    XPutImage( GetXDisplay(),
+               hBrush_,
+               GetDisplay()->GetCopyGC( m_nScreen ),
+               pImage,
+               0, 0,						// Source
+               0, 0,						// Destination
+               8, 8 );						// width & height
+
+    // destroy image-frame but not palette-data
+    pImage->data = NULL;
+    XDestroyImage( pImage );
+
+    return TRUE;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::GetResolution( sal_Int32 &rDPIX, sal_Int32 &rDPIY ) // const
+{
+    const SalDisplay *pDisplay = GetDisplay();
+    
+    rDPIX = pDisplay->GetResolution().A();
+    rDPIY = pDisplay->GetResolution().B();
+    if( !pDisplay->GetExactResolution() && rDPIY < 96 )
+    {
+        rDPIX = Divide( rDPIX * 96, rDPIY );
+            rDPIY = 96;
+    }
+    else if ( rDPIY > 200 )
+    {
+        rDPIX = Divide( rDPIX * 200, rDPIY );
+        rDPIY = 200;
+    }
+    
+    // #i12705# equalize x- and y-resolution if they are close enough
+    if( rDPIX != rDPIY )
+    {
+        // different x- and y- resolutions are usually artifacts of
+        // a wrongly calculated screen size. 
+        //if( (13*rDPIX >= 10*rDPIY) && (13*rDPIY >= 10*rDPIX) )  //+-30%
+        {
+#ifdef DEBUG
+            printf("Forcing Resolution from %" SAL_PRIdINT32 "x%" SAL_PRIdINT32 " to %" SAL_PRIdINT32 "x%" SAL_PRIdINT32 "\n",
+                    rDPIX,rDPIY,rDPIY,rDPIY);
+#endif
+            rDPIX = rDPIY; // y-resolution is more trustworthy
+        }
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+USHORT X11SalGraphics::GetBitCount() // const
+{
+    return GetVisual().GetDepth();
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+long X11SalGraphics::GetGraphicsWidth() const
+{
+    if( m_pFrame )
+        return m_pFrame->maGeometry.nWidth;
+    else if( m_pVDev )
+        return m_pVDev->GetWidth();
+    else
+        return 0;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+long X11SalGraphics::GetGraphicsHeight() const
+{
+    if( m_pFrame )
+        return m_pFrame->maGeometry.nHeight;
+    else if( m_pVDev )
+        return m_pVDev->GetHeight();
+    else
+        return 0;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::ResetClipRegion()
+{
+    if( pClipRegion_ )
+    {
+        bPenGC_			= FALSE;
+        bFontGC_		= FALSE;
+        bBrushGC_		= FALSE;
+        bMonoGC_		= FALSE;
+        bCopyGC_		= FALSE;
+        bInvertGC_		= FALSE;
+        bInvert50GC_	= FALSE;
+        bStippleGC_		= FALSE;
+        bTrackingGC_	= FALSE;
+        
+        XDestroyRegion( pClipRegion_ );
+        pClipRegion_	= NULL;
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::BeginSetClipRegion( ULONG )
+{
+    if( pClipRegion_ )
+        XDestroyRegion( pClipRegion_ );
+    pClipRegion_ = XCreateRegion();
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+BOOL X11SalGraphics::unionClipRegion( long nX, long nY, long nDX, long nDY )
+{
+    if (!nDX || !nDY)
+        return TRUE;
+
+    XRectangle aRect;
+    aRect.x			= (short)nX;
+    aRect.y			= (short)nY;
+    aRect.width		= (unsigned short)nDX;
+    aRect.height	= (unsigned short)nDY;
+    
+    XUnionRectWithRegion( &aRect, pClipRegion_, pClipRegion_ );
+    
+    return TRUE;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+bool X11SalGraphics::unionClipRegion( const ::basegfx::B2DPolyPolygon& )
+{
+        // TODO: implement and advertise OutDevSupport_B2DClip support
+        return false;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::EndSetClipRegion()
+{
+    bPenGC_			= FALSE;
+    bFontGC_		= FALSE;
+    bBrushGC_		= FALSE;
+    bMonoGC_		= FALSE;
+    bCopyGC_		= FALSE;
+    bInvertGC_		= FALSE;
+    bInvert50GC_	= FALSE;
+    bStippleGC_		= FALSE;
+    bTrackingGC_	= FALSE;
+    
+    if( XEmptyRegion( pClipRegion_ ) )
+    {
+        XDestroyRegion( pClipRegion_ );
+        pClipRegion_= NULL;
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::SetLineColor()
+{
+    if( nPenColor_ != SALCOLOR_NONE )
+    {
+        nPenColor_		= SALCOLOR_NONE;
+        bPenGC_			= FALSE;
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::SetLineColor( SalColor nSalColor )
+{
+    if( nPenColor_ != nSalColor )
+    {
+        nPenColor_		= nSalColor;
+        nPenPixel_		= GetPixel( nSalColor );
+        bPenGC_			= FALSE;
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::SetFillColor()
+{
+    if( nBrushColor_ != SALCOLOR_NONE )
+    {
+        bDitherBrush_	= FALSE;
+        nBrushColor_	= SALCOLOR_NONE;
+        bBrushGC_		= FALSE;
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::SetFillColor( SalColor nSalColor )
+{
+    if( nBrushColor_ != nSalColor )
+    {
+        bDitherBrush_	= FALSE;
+        nBrushColor_	= nSalColor;
+        nBrushPixel_	= GetPixel( nSalColor );
+        if( TrueColor != GetColormap().GetVisual().GetClass()
+            && GetColormap().GetColor( nBrushPixel_ ) != nBrushColor_
+            && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0x00 ) // black
+            && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0x80 ) // blue
+            && nSalColor != MAKE_SALCOLOR( 0x00, 0x80, 0x00 ) // green
+            && nSalColor != MAKE_SALCOLOR( 0x00, 0x80, 0x80 ) // cyan
+            && nSalColor != MAKE_SALCOLOR( 0x80, 0x00, 0x00 ) // red
+            && nSalColor != MAKE_SALCOLOR( 0x80, 0x00, 0x80 ) // magenta
+            && nSalColor != MAKE_SALCOLOR( 0x80, 0x80, 0x00 ) // brown
+            && nSalColor != MAKE_SALCOLOR( 0x80, 0x80, 0x80 ) // gray
+            && nSalColor != MAKE_SALCOLOR( 0xC0, 0xC0, 0xC0 ) // light gray
+            && nSalColor != MAKE_SALCOLOR( 0x00, 0x00, 0xFF ) // light blue
+            && nSalColor != MAKE_SALCOLOR( 0x00, 0xFF, 0x00 ) // light green
+            && nSalColor != MAKE_SALCOLOR( 0x00, 0xFF, 0xFF ) // light cyan
+            && nSalColor != MAKE_SALCOLOR( 0xFF, 0x00, 0x00 ) // light red
+            && nSalColor != MAKE_SALCOLOR( 0xFF, 0x00, 0xFF ) // light magenta
+            && nSalColor != MAKE_SALCOLOR( 0xFF, 0xFF, 0x00 ) // light brown
+            && nSalColor != MAKE_SALCOLOR( 0xFF, 0xFF, 0xFF ) )
+            bDitherBrush_ = GetDitherPixmap(nSalColor);
+        bBrushGC_		= FALSE;
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::SetROPLineColor( SalROPColor nROPColor )
+{
+    switch( nROPColor )
+    {
+        case SAL_ROP_0 : // 0
+            nPenPixel_ = (Pixel)0;
+            break;
+        case SAL_ROP_1 : // 1
+            nPenPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1;
+            break;
+        case SAL_ROP_INVERT : // 2
+            nPenPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1;
+            break;
+    }
+    nPenColor_	= GetColormap().GetColor( nPenPixel_ );
+    bPenGC_		= FALSE;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::SetROPFillColor( SalROPColor nROPColor )
+{
+    switch( nROPColor )
+    {
+        case SAL_ROP_0 : // 0
+            nBrushPixel_ = (Pixel)0;
+            break;
+        case SAL_ROP_1 : // 1
+            nBrushPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1;
+            break;
+        case SAL_ROP_INVERT : // 2
+            nBrushPixel_ = (Pixel)(1 << GetVisual().GetDepth()) - 1;
+            break;
+    }
+    bDitherBrush_	= FALSE;
+    nBrushColor_	= GetColormap().GetColor( nBrushPixel_ );
+    bBrushGC_		= FALSE;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::SetXORMode( bool bSet, bool )
+{
+    if( !bXORMode_ == bSet )
+    {
+        bXORMode_ 	= bSet;
+        bPenGC_		= FALSE;
+        bBrushGC_	= FALSE;
+        bMonoGC_		= FALSE;
+        bCopyGC_		= FALSE;
+        bInvertGC_	= FALSE;
+        bInvert50GC_	= FALSE;
+        bStippleGC_	= FALSE;
+        bTrackingGC_	= FALSE;
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::drawPixel( long nX, long nY )
+{
+    if( nPenColor_ !=  SALCOLOR_NONE )
+        XDrawPoint( GetXDisplay(), GetDrawable(), SelectPen(), nX, nY );
+}
+
+void X11SalGraphics::drawPixel( long nX, long nY, SalColor nSalColor )
+{
+    if( nSalColor != SALCOLOR_NONE )
+    {
+        Display *pDisplay = GetXDisplay();
+        
+        if( (nPenColor_ == SALCOLOR_NONE) && !bPenGC_ )
+        {
+            SetLineColor( nSalColor );
+            XDrawPoint( pDisplay, GetDrawable(), SelectPen(), nX, nY );
+            nPenColor_ = SALCOLOR_NONE;
+            bPenGC_ = False;
+        }
+        else
+        {
+            GC pGC = SelectPen();
+            
+            if( nSalColor != nPenColor_ )
+                XSetForeground( pDisplay, pGC, GetPixel( nSalColor ) );
+            
+            XDrawPoint( pDisplay, GetDrawable(), pGC, nX, nY );
+            
+            if( nSalColor != nPenColor_ )
+                XSetForeground( pDisplay, pGC, nPenPixel_ );
+        }
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::drawLine( long nX1, long nY1, long nX2, long nY2 )
+{
+    if( nPenColor_ != SALCOLOR_NONE )
+    {
+        if ( GetDisplay()->GetProperties() & PROPERTY_BUG_DrawLine )
+        {
+            GC aGC = SelectPen();
+            XDrawPoint (GetXDisplay(), GetDrawable(), aGC, (int)nX1, (int)nY1);
+            XDrawPoint (GetXDisplay(), GetDrawable(), aGC, (int)nX2, (int)nY2);
+            XDrawLine  (GetXDisplay(), GetDrawable(), aGC, nX1, nY1, nX2, nY2 );
+        }
+        else
+            XDrawLine( GetXDisplay(), GetDrawable(),SelectPen(),
+                       nX1, nY1, nX2, nY2 );
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::drawRect( long nX, long nY, long nDX, long nDY )
+{
+    if( nBrushColor_ != SALCOLOR_NONE )
+    {
+        XFillRectangle( GetXDisplay(),
+                        GetDrawable(),
+                        SelectBrush(),
+                        nX, nY, nDX, nDY );
+    }
+    // Beschreibung DrawRect verkehrt, deshalb -1
+    if( nPenColor_ != SALCOLOR_NONE )
+        XDrawRectangle( GetXDisplay(),
+                        GetDrawable(),
+                        SelectPen(),
+                        nX, nY, nDX-1, nDY-1 );
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::drawPolyLine( ULONG nPoints, const SalPoint *pPtAry )
+{
+    drawPolyLine( nPoints, pPtAry, false );
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::drawPolyLine( ULONG nPoints, const SalPoint *pPtAry, bool bClose )
+{
+    if( nPenColor_ != 0xFFFFFFFF )
+    {
+        SalPolyLine Points( nPoints, pPtAry );
+        
+        DrawLines( nPoints, Points, SelectPen(), bClose );
+    }
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::drawPolygon( ULONG nPoints, const SalPoint* pPtAry )
+{
+    if( nPoints == 0 )
+        return;
+    
+    if( nPoints < 3 )
+    {
+        if( !bXORMode_ )
+        {
+            if( 1 == nPoints  )
+                drawPixel( pPtAry[0].mnX, pPtAry[0].mnY );
+            else
+                drawLine( pPtAry[0].mnX, pPtAry[0].mnY,
+                          pPtAry[1].mnX, pPtAry[1].mnY );
+        }
+        return;
+    }
+    
+    SalPolyLine Points( nPoints, pPtAry );
+    
+    nPoints++;
+
+    /* WORKAROUND: some Xservers (Xorg, VIA chipset in this case)
+     * do not draw the visible part of a polygon
+     * if it overlaps to the left of screen 0,y.
+     * This happens to be the case in the gradient drawn in the
+     * menubar background. workaround for the special case of
+     * of a rectangle overlapping to the left.
+     */
+    if( nPoints == 5 &&
+    Points[ 0 ].x == Points[ 1 ].x &&
+        Points[ 1 ].y == Points[ 2 ].y &&
+        Points[ 2 ].x == Points[ 3 ].x &&
+        Points[ 0 ].x == Points[ 4 ].x && Points[ 0 ].y == Points[ 4 ].y
+       )
+    {
+        bool bLeft = false;
+        bool bRight = false;
+        for(unsigned int i = 0; i < nPoints; i++ )
+    {
+            if( Points[i].x < 0 )
+                bLeft = true;
+            else
+                bRight= true;
+    }
+    if( bLeft && ! bRight )
+        return;
+    if( bLeft && bRight )
+        {
+            for( unsigned int i = 0; i < nPoints; i++ )
+                if( Points[i].x < 0 )
+                    Points[i].x = 0;
+        }
+    }		
+    
+    if( nBrushColor_ != SALCOLOR_NONE )
+        XFillPolygon( GetXDisplay(),
+                      GetDrawable(),
+                      SelectBrush(),
+                      &Points[0], nPoints,
+                      Complex, CoordModeOrigin );
+    
+    if( nPenColor_ != 0xFFFFFFFF )
+        DrawLines( nPoints, Points, SelectPen(), true );
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+void X11SalGraphics::drawPolyPolygon( sal_uInt32		nPoly,
+                                   const sal_uInt32	   *pPoints,
+                                   PCONSTSALPOINT  *pPtAry )
+{
+    if( nBrushColor_ != SALCOLOR_NONE )
+    {
+        ULONG		i, n;
+        XLIB_Region	pXRegA	= NULL;
+        
+        for( i = 0; i < nPoly; i++ ) {
+            n = pPoints[i];
+            SalPolyLine Points( n, pPtAry[i] );
+            if( n > 2 )
+            {
+                XLIB_Region pXRegB = XPolygonRegion( &Points[0], n+1, WindingRule );
+                if( !pXRegA )
+                    pXRegA = pXRegB;
+                else
+                {
+                    XXorRegion( pXRegA, pXRegB, pXRegA );
+                    XDestroyRegion( pXRegB );
+                }
+            }
+        }
+        
+        if( pXRegA )
+        {
+            XRectangle aXRect;
+            XClipBox( pXRegA, &aXRect );
+            
+            GC pGC = SelectBrush();
+            SetClipRegion( pGC, pXRegA ); // ??? doppelt
+            XDestroyRegion( pXRegA );
+            bBrushGC_ = FALSE;
+            
+            XFillRectangle( GetXDisplay(),
+                            GetDrawable(),
+                            pGC,
+                            aXRect.x, aXRect.y, aXRect.width, aXRect.height );
+        }
+   }
+        
+   if( nPenColor_ != SALCOLOR_NONE )
+       for( ULONG i = 0; i < nPoly; i++ )
+           drawPolyLine( pPoints[i], pPtAry[i], true );
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+sal_Bool X11SalGraphics::drawPolyLineBezier( ULONG, const SalPoint*, const BYTE* )
+{
+    return sal_False;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+sal_Bool X11SalGraphics::drawPolygonBezier( ULONG, const SalPoint*, const BYTE* )
+{
+    return sal_False;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+sal_Bool X11SalGraphics::drawPolyPolygonBezier( sal_uInt32, const sal_uInt32*,
+                                                const SalPoint* const*, const BYTE* const* )
+{
+    return sal_False;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+void X11SalGraphics::invert( ULONG nPoints,
+                             const SalPoint* pPtAry,
+                             SalInvert nFlags )
+{
+    SalPolyLine Points ( nPoints, pPtAry );
+    
+    GC pGC;
+    if( SAL_INVERT_50 & nFlags )
+        pGC = GetInvert50GC();
+    else
+        if ( SAL_INVERT_TRACKFRAME & nFlags )
+            pGC = GetTrackingGC();
+        else
+            pGC = GetInvertGC();
+    
+    if( SAL_INVERT_TRACKFRAME & nFlags )
+        DrawLines ( nPoints, Points, pGC, true );
+    else
+        XFillPolygon( GetXDisplay(),
+                      GetDrawable(),
+                      pGC,
+                      &Points[0], nPoints,
+                      Complex, CoordModeOrigin );
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+BOOL X11SalGraphics::drawEPS( long,long,long,long,void*,ULONG )
+{
+    return FALSE;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+XID X11SalGraphics::GetXRenderPicture()
+{
+    if( !m_aRenderPicture )
+    {
+        // check xrender support for matching visual
+        // find a XRenderPictFormat compatible with the Drawable
+        XRenderPeer& rRenderPeer = XRenderPeer::GetInstance();
+        XRenderPictFormat* pVisualFormat = static_cast<XRenderPictFormat*>(GetXRenderFormat());
+        if( !pVisualFormat )
+        {
+            Visual* pVisual = GetDisplay()->GetVisual( m_nScreen ).GetVisual();
+            pVisualFormat = rRenderPeer.FindVisualFormat( pVisual );
+            if( !pVisualFormat )
+                return 0;
+            // cache the XRenderPictFormat
+            SetXRenderFormat( static_cast<void*>(pVisualFormat) );
+        }
+
+        // get the matching xrender target for drawable
+        m_aRenderPicture = rRenderPeer.CreatePicture( hDrawable_, pVisualFormat, 0, NULL );
+    }
+
+#if 0
+    // setup clipping so the callers don't have to do it themselves
+    // TODO: avoid clipping if already set correctly
+    if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) )
+        rRenderPeer.SetPictureClipRegion( aDstPic, pClipRegion_ );
+#endif
+
+    return m_aRenderPicture;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+SystemGraphicsData X11SalGraphics::GetGraphicsData() const
+{
+    SystemGraphicsData aRes;
+
+    aRes.nSize = sizeof(aRes);
+    aRes.pDisplay  = GetXDisplay();
+    aRes.hDrawable = hDrawable_;
+    aRes.pVisual   = GetDisplay()->GetVisual( m_nScreen ).GetVisual();
+    aRes.nScreen   = m_nScreen;
+    aRes.nDepth    = GetDisplay()->GetVisual( m_nScreen ).GetDepth();
+    aRes.aColormap = GetDisplay()->GetColormap( m_nScreen ).GetXColormap();
+    aRes.pRenderFormat = m_pRenderFormat;
+    return aRes;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+// B2DPolygon support methods
+
+namespace { // anonymous namespace to prevent export
+// the methods and structures here are used by the
+// B2DPolyPolygon->RenderTrapezoid conversion algorithm
+
+// compare two line segments
+// assumption: both segments point downward
+// assumption: they must have at least some y-overlap
+// assumption: rA.p1.y <= rB.p1.y
+bool IsLeftOf( const XLineFixed& rA, const XLineFixed& rB )
+{
+    bool bAbove = (rA.p1.y <= rB.p1.y);
+    const XLineFixed& rU = bAbove ? rA : rB;
+    const XLineFixed& rL = bAbove ? rB : rA;
+
+    const XFixed aXDiff = rU.p2.x - rU.p1.x;
+    const XFixed aYDiff = rU.p2.y - rU.p1.y;
+
+    if( (rU.p1.y != rL.p1.y) || (rU.p1.x != rL.p1.x) )
+    {
+        const sal_Int64 n1 = (sal_Int64)aXDiff * (rL.p1.y - rU.p1.y);
+        const sal_Int64 n2 = (sal_Int64)aYDiff * (rL.p1.x - rU.p1.x);
+        if( n1 != n2 )
+            return ((n1 < n2) == bAbove);
+    }
+
+    if( (rU.p2.y != rL.p2.y) || (rU.p2.x != rL.p2.x) )
+    {
+        const sal_Int64 n3 = (sal_Int64)aXDiff * (rL.p2.y - rU.p1.y);
+        const sal_Int64 n4 = (sal_Int64)aYDiff * (rL.p2.x - rU.p1.x);
+        if( n3 != n4 )
+            return ((n3 < n4) == bAbove);
+    }
+
+    // both segments overlap
+    return false;
+}
+
+struct HalfTrapezoid
+{
+    // assumptions:
+    //    maLine.p1.y <= mnY < maLine.p2.y
+    XLineFixed  maLine;
+    XFixed      mnY;
+};
+
+struct HalfTrapCompare
+{
+    bool operator()( const HalfTrapezoid& rA, const HalfTrapezoid& rB ) const
+    {
+        bool bIsTopLeft = false;
+        if( rA.mnY != rB.mnY )  // sort top-first if possible
+            bIsTopLeft = (rA.mnY < rB.mnY);
+        else                    // else sort left-first
+            bIsTopLeft = IsLeftOf( rA.maLine, rB.maLine );
+        // adjust to priority_queue sorting convention
+        return !bIsTopLeft;
+    }
+};
+
+typedef std::priority_queue< HalfTrapezoid, std::vector<HalfTrapezoid>, HalfTrapCompare > HTQueueBase;
+// we need a priority queue with a reserve() to prevent countless reallocations
+class HTQueue
+:	public HTQueueBase
+{
+public:
+    void	reserve( size_t n ) { c.reserve( n ); }
+    int		capacity() { return c.capacity(); }
+};
+
+typedef std::vector<XTrapezoid> TrapezoidVector;
+
+class TrapezoidXCompare
+{
+    const TrapezoidVector& mrVector;
+public:
+    TrapezoidXCompare( const TrapezoidVector& rVector )
+        : mrVector( rVector ) {}
+    bool operator()( int nA, int nB ) const
+        { return IsLeftOf( mrVector[nA].left, mrVector[nB].left ); }
+};
+
+typedef std::multiset< int, TrapezoidXCompare > ActiveTrapSet;
+
+class TrapezoidYCompare
+{
+    const TrapezoidVector& mrVector;
+public:
+    TrapezoidYCompare( const TrapezoidVector& rVector )
+        : mrVector( rVector ) {}
+    bool operator()( int nA, int nB ) const
+        { return (mrVector[nA].bottom < mrVector[nB].bottom); }
+};
+
+typedef std::multiset< int, TrapezoidYCompare > VerticalTrapSet;
+} // end of anonymous namespace
+
+// draw a poly-polygon
+bool X11SalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPoly, double fTransparency)
+{
+    // nothing to do for empty polypolygons
+    const int nPolygonCount = rPolyPoly.count();
+    if( nPolygonCount <= 0 )
+        return TRUE;
+
+    // nothing to do if everything is transparent
+    if( (nBrushColor_ == SALCOLOR_NONE)
+    &&  (nPenColor_ == SALCOLOR_NONE) )
+        return TRUE;
+
+    // cannot handle pencolor!=brushcolor yet
+    if( (nPenColor_ != SALCOLOR_NONE)
+    &&  (nPenColor_ != nBrushColor_) )
+        return FALSE;
+
+    // TODO: remove the env-variable when no longer needed
+    static const char* pRenderEnv = getenv( "SAL_DISABLE_RENDER_POLY" );
+    if( pRenderEnv )
+        return FALSE;
+
+    // check xrender support for trapezoids
+    XRenderPeer& rRenderPeer = XRenderPeer::GetInstance();
+    if( !rRenderPeer.AreTrapezoidsSupported() )
+        return FALSE;
+    Picture aDstPic = GetXRenderPicture();
+    // check xrender support for this drawable
+    if( !aDstPic )
+        return FALSE;
+
+    // don't bother with polygons outside of visible area
+    const basegfx::B2DRange aViewRange( 0, 0, GetGraphicsWidth(), GetGraphicsHeight() );
+    const basegfx::B2DRange aPolyRange = basegfx::tools::getRange( rPolyPoly );
+    const bool bNeedViewClip = !aPolyRange.isInside( aViewRange );
+    if( !aPolyRange.overlaps( aViewRange ) )
+        return true;
+
+    // convert the polypolygon to trapezoids
+
+    // first convert the B2DPolyPolygon to HalfTrapezoids
+    // #i100922# try to prevent priority-queue reallocations by reservering enough
+    int nHTQueueReserve = 0;
+    for( int nOuterPolyIdx = 0; nOuterPolyIdx < nPolygonCount; ++nOuterPolyIdx )
+    {
+        const ::basegfx::B2DPolygon aOuterPolygon = rPolyPoly.getB2DPolygon( nOuterPolyIdx );
+        const int nPointCount = aOuterPolygon.count();
+        nHTQueueReserve += aOuterPolygon.areControlPointsUsed() ? 8 * nPointCount : nPointCount;
+    }
+    nHTQueueReserve = ((4*nHTQueueReserve) | 0x1FFF) + 1;
+    HTQueue aHTQueue;
+    aHTQueue.reserve( nHTQueueReserve );
+    for( int nOuterPolyIdx = 0; nOuterPolyIdx < nPolygonCount; ++nOuterPolyIdx )
+    {
+        const ::basegfx::B2DPolygon aOuterPolygon = rPolyPoly.getB2DPolygon( nOuterPolyIdx );
+
+        // render-trapezoids should be inside the view => clip polygon against view range
+        basegfx::B2DPolyPolygon aClippedPolygon( aOuterPolygon );
+        if( bNeedViewClip )
+        {
+            aClippedPolygon = basegfx::tools::clipPolygonOnRange( aOuterPolygon, aViewRange, true, false );
+            DBG_ASSERT( aClippedPolygon.count(), "polygon confirmed to overlap with view should not get here" );
+            if( !aClippedPolygon.count() )
+                continue;
+        }
+
+        // render-trapezoids have linear edges => get rid of bezier segments
+        if( aClippedPolygon.areControlPointsUsed() )
+            aClippedPolygon = ::basegfx::tools::adaptiveSubdivideByDistance( aClippedPolygon, 0.125 );
+
+        // test and remove self intersections
+        // TODO: make code intersection save, then remove this test
+        basegfx::B2DPolyPolygon aInnerPolyPoly(basegfx::tools::solveCrossovers( aClippedPolygon));
+        const int nInnerPolyCount = aInnerPolyPoly.count();
+        for( int nInnerPolyIdx = 0; nInnerPolyIdx < nInnerPolyCount; ++nInnerPolyIdx )
+        {
+            ::basegfx::B2DPolygon aInnerPolygon = aInnerPolyPoly.getB2DPolygon( nInnerPolyIdx );
+            const int nPointCount = aInnerPolygon.count();
+            if( !nPointCount )
+                continue;
+
+            aHTQueue.reserve( aHTQueue.size() + 8 * nPointCount );
+
+            // convert polygon point pairs to HalfTrapezoids
+            // connect the polygon point with the first one if needed
+            XPointFixed aOldXPF = { 0, 0 };
+            XPointFixed aNewXPF;
+            for( int nPointIdx = 0; nPointIdx <= nPointCount; ++nPointIdx, aOldXPF = aNewXPF )
+            {
+                const int k = (nPointIdx < nPointCount) ? nPointIdx : 0;
+                const ::basegfx::B2DPoint& aPoint = aInnerPolygon.getB2DPoint( k );
+                
+                // convert the B2DPoint into XRENDER units
+                if(getAntiAliasB2DDraw())
+                {
+                    aNewXPF.x = XDoubleToFixed( aPoint.getX() );
+                    aNewXPF.y = XDoubleToFixed( aPoint.getY() );
+                }
+                else
+                {
+                    aNewXPF.x = XDoubleToFixed( basegfx::fround( aPoint.getX() ) );
+                    aNewXPF.y = XDoubleToFixed( basegfx::fround( aPoint.getY() ) );
+                }
+
+                // check if enough data is available for a new HalfTrapezoid
+                if( nPointIdx == 0 )
+                    continue;
+                // ignore vertical segments
+                if( aNewXPF.y == aOldXPF.y )
+                    continue;
+
+                // construct HalfTrapezoid as topdown segment
+                HalfTrapezoid aHT;
+                if( aNewXPF.y < aOldXPF.y )
+                {
+                    aHT.maLine.p1 = aNewXPF;
+                    aHT.maLine.p2 = aOldXPF;
+                }
+                else
+                {
+                    aHT.maLine.p2 = aNewXPF;
+                    aHT.maLine.p1 = aOldXPF;
+                }
+
+                aHT.mnY = aHT.maLine.p1.y;
+
+#if 0 // ignore clipped HalfTrapezoids
+            if( aHT.mnY < 0 )
+                aHT.mnY = 0;
+            else if( aHT.mnY > 10000 )
+                continue;
+#endif
+
+                // queue up the HalfTrapezoid
+                aHTQueue.push( aHT );
+            }
+        }
+    }
+
+    if( aHTQueue.empty() )
+        return TRUE;
+
+    // then convert the HalfTrapezoids into full Trapezoids
+    TrapezoidVector aTrapVector;
+    aTrapVector.reserve( aHTQueue.size() * 2 ); // just a guess
+
+    TrapezoidXCompare aTrapXCompare( aTrapVector );
+    ActiveTrapSet aActiveTraps( aTrapXCompare );
+
+    TrapezoidYCompare aTrapYCompare( aTrapVector );
+    VerticalTrapSet aVerticalTraps( aTrapYCompare );
+
+    while( !aHTQueue.empty() )
+    {
+        XTrapezoid aTrapezoid;
+
+        // convert a HalfTrapezoid pair
+        const HalfTrapezoid& rLeft = aHTQueue.top();
+        aTrapezoid.top = rLeft.mnY;
+        aTrapezoid.bottom = rLeft.maLine.p2.y;
+        aTrapezoid.left = rLeft.maLine;
+
+#if 0
+        // ignore empty trapezoids
+        if( aTrapezoid.bottom <= aTrapezoid.top )
+            continue;
+#endif
+
+        aHTQueue.pop();
+        if( aHTQueue.empty() ) // TODO: assert
+            break;
+        const HalfTrapezoid& rRight = aHTQueue.top();
+        aTrapezoid.right = rRight.maLine;
+        aHTQueue.pop();
+
+        aTrapezoid.bottom = aTrapezoid.left.p2.y;
+        if( aTrapezoid.bottom > aTrapezoid.right.p2.y )
+            aTrapezoid.bottom = aTrapezoid.right.p2.y;
+
+        // keep the full Trapezoid candidate
+        aTrapVector.push_back( aTrapezoid );
+
+        // unless it splits an older trapezoid
+        bool bSplit = false;
+        for(;;)
+        {
+            // check if the new trapezoid overlaps with an old trapezoid
+            ActiveTrapSet::iterator aActiveTrapsIt
+                = aActiveTraps.upper_bound( aTrapVector.size()-1 );
+            if( aActiveTrapsIt == aActiveTraps.begin() )
+                break;
+            --aActiveTrapsIt;
+
+            XTrapezoid& rLeftTrap = aTrapVector[ *aActiveTrapsIt ];
+
+            // in the ActiveTrapSet there are still trapezoids where
+            // a vertical overlap with new trapezoids is no longer possible
+            // they could have been removed in the verticaltraps loop below
+            // but this would have been expensive and is not needed as we can
+            // simply ignore them now and remove them from the ActiveTrapSet
+            // so they won't bother us in the future
+            if( rLeftTrap.bottom <= aTrapezoid.top )
+            {
+                aActiveTraps.erase( aActiveTrapsIt );
+                continue;
+            }
+
+            // check if there is horizontal overlap
+            // aTrapezoid.left==rLeftTrap.right is allowed though
+            if( !IsLeftOf( aTrapezoid.left, rLeftTrap.right ) )
+                break;
+
+            // split the old trapezoid and keep its upper part
+            // find the old trapezoids entry in the VerticalTrapSet and remove it
+            typedef std::pair<VerticalTrapSet::iterator, VerticalTrapSet::iterator> VTSPair;
+            VTSPair aVTSPair = aVerticalTraps.equal_range( *aActiveTrapsIt );
+            VerticalTrapSet::iterator aVTSit = aVTSPair.first;
+            for(; (aVTSit != aVTSPair.second) && (*aVTSit != *aActiveTrapsIt); ++aVTSit ) ;
+            if( aVTSit != aVTSPair.second )
+                aVerticalTraps.erase( aVTSit );
+            // then update the old trapezoid's bottom
+            rLeftTrap.bottom = aTrapezoid.top;
+            // enter the updated old trapzoid in VerticalTrapSet
+            aVerticalTraps.insert( aVerticalTraps.begin(), *aActiveTrapsIt );
+            // the old trapezoid is no longer active
+            aActiveTraps.erase( aActiveTrapsIt );
+
+            // the trapezoid causing the split has become obsolete
+            // so its both sides have to be re-queued
+            HalfTrapezoid aHT;
+            aHT.mnY = aTrapezoid.top;
+            aHT.maLine = aTrapezoid.left;
+            aHTQueue.push( aHT );
+            aHT.maLine = aTrapezoid.right;
+            aHTQueue.push( aHT );
+
+            bSplit = true;
+            break;
+        }
+
+        // keep or forget the resulting full Trapezoid
+        if( bSplit )
+            aTrapVector.pop_back();
+        else
+        {
+            aActiveTraps.insert( aTrapVector.size()-1 );
+            aVerticalTraps.insert( aTrapVector.size()-1 );
+        }
+
+        // mark trapezoids that can no longer be split as inactive
+        // and recycle their sides which were not fully resolved
+        static const XFixed nMaxTop = +0x7FFFFFFF;
+        XFixed nNewTop = aHTQueue.empty() ? nMaxTop : aHTQueue.top().mnY;
+        while( !aVerticalTraps.empty() )
+        {
+            const XTrapezoid& rOldTrap = aTrapVector[ *aVerticalTraps.begin() ];
+            if( nNewTop < rOldTrap.bottom )
+                break;
+            // the reference Trapezoid can no longer be split
+            aVerticalTraps.erase( aVerticalTraps.begin() );
+
+            // recycle its sides that were not fully resolved
+            HalfTrapezoid aHT;
+            aHT.mnY = rOldTrap.bottom;
+            if( rOldTrap.left.p2.y > rOldTrap.bottom )
+            {
+                aHT.maLine = rOldTrap.left;
+                aHTQueue.push( aHT );
+            }
+            if( rOldTrap.right.p2.y > rOldTrap.bottom )
+            {
+                aHT.maLine = rOldTrap.right;
+                aHTQueue.push( aHT );
+            }
+        }
+    }
+
+    // create xrender Picture for polygon foreground
+    SalDisplay::RenderEntry& rEntry = GetDisplay()->GetRenderEntries( m_nScreen )[ 32 ];
+    if( !rEntry.m_aPicture )
+    {
+        Display* pXDisplay = GetXDisplay();
+
+        rEntry.m_aPixmap = ::XCreatePixmap( pXDisplay, hDrawable_, 1, 1, 32 );
+        XRenderPictureAttributes aAttr;
+        aAttr.repeat = true;
+
+        XRenderPictFormat* pXRPF = rRenderPeer.FindStandardFormat( PictStandardARGB32 );
+        rEntry.m_aPicture = rRenderPeer.CreatePicture( rEntry.m_aPixmap, pXRPF, CPRepeat, &aAttr );
+    }
+
+    // set polygon foreground color and opacity
+    XRenderColor aRenderColor = GetXRenderColor( nBrushColor_ , fTransparency );
+    rRenderPeer.FillRectangle( PictOpSrc, rEntry.m_aPicture, &aRenderColor, 0, 0, 1, 1 );
+
+    // set clipping
+    // TODO: move into GetXRenderPicture?
+    if( pClipRegion_ && !XEmptyRegion( pClipRegion_ ) )
+        rRenderPeer.SetPictureClipRegion( aDstPic, pClipRegion_ );
+
+    // render the trapezoids
+    const XRenderPictFormat* pMaskFormat = rRenderPeer.GetStandardFormatA8();
+    rRenderPeer.CompositeTrapezoids( PictOpOver,
+        rEntry.m_aPicture, aDstPic, pMaskFormat, 0, 0, &aTrapVector[0], aTrapVector.size() );
+
+    return TRUE;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+bool X11SalGraphics::drawPolyLine(const ::basegfx::B2DPolygon& rPolygon, const ::basegfx::B2DVector& rLineWidth, basegfx::B2DLineJoin eLineJoin)
+{
+    // #i101491#
+    if(rPolygon.count() > 1000)
+    {
+        // the used basegfx::tools::createAreaGeometry is simply too
+        // expensive with very big polygons; fallback to caller (who
+        // should use ImplLineConverter normally)
+        return false;
+    }
+
+    const XRenderPeer& rRenderPeer = XRenderPeer::GetInstance();
+    if( !rRenderPeer.AreTrapezoidsSupported() )
+        return false;
+
+    // get the area polygon for the line polygon
+    basegfx::B2DPolygon aPolygon = rPolygon;
+    if( (rLineWidth.getX() != rLineWidth.getY())
+    && !basegfx::fTools::equalZero( rLineWidth.getY() ) )
+    {
+        // prepare for createAreaGeometry() with anisotropic linewidth
+        basegfx::B2DHomMatrix aAnisoMatrix;
+        aAnisoMatrix.scale( 1.0, rLineWidth.getX() / rLineWidth.getY() );
+        aPolygon.transform( aAnisoMatrix );
+    }
+
+    // AW: reSegment no longer needed; new createAreaGeometry will remove exteme positions
+    // and create bezier polygons
+    //if( aPolygon.areControlPointsUsed() )
+    //    aPolygon = basegfx::tools::reSegmentPolygonEdges( aPolygon, 8, true, false );
+    //const basegfx::B2DPolyPolygon aAreaPolyPoly = basegfx::tools::createAreaGeometryForSimplePolygon(
+    //    aPolygon, 0.5*rLineWidth.getX(), eLineJoin );
+    const basegfx::B2DPolyPolygon aAreaPolyPoly(basegfx::tools::createAreaGeometry(aPolygon, 0.5*rLineWidth.getX(), eLineJoin));
+    
+    if( (rLineWidth.getX() != rLineWidth.getY())
+    && !basegfx::fTools::equalZero( rLineWidth.getX() ) )
+    {
+        // postprocess createAreaGeometry() for anisotropic linewidth
+        basegfx::B2DHomMatrix aAnisoMatrix;
+        aAnisoMatrix.scale( 1.0, rLineWidth.getY() / rLineWidth.getX() );
+        aPolygon.transform( aAnisoMatrix );
+    }
+
+    // temporarily adjust brush color to pen color
+    // since the line is drawn as an area-polygon
+    const SalColor aKeepBrushColor = nBrushColor_;
+    nBrushColor_ = nPenColor_;
+
+    // draw each area polypolygon component individually
+    // to emulate the polypolygon winding rule "non-zero"
+    bool bDrawOk = true;
+    const int nPolyCount = aAreaPolyPoly.count();
+    for( int nPolyIdx = 0; nPolyIdx < nPolyCount; ++nPolyIdx )
+    {
+        const ::basegfx::B2DPolyPolygon aOnePoly( aAreaPolyPoly.getB2DPolygon( nPolyIdx ) );
+        bDrawOk = drawPolyPolygon( aOnePoly, 0.0);
+        if( !bDrawOk )
+            break;
+    }
+
+    // restore the original brush GC
+    nBrushColor_ = aKeepBrushColor;
+    return bDrawOk;
+}
+
+// -=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
diff --git a/vcl/win/source/gdi/salgdi_gdiplus.cxx b/vcl/win/source/gdi/salgdi_gdiplus.cxx
index b14be2a..0e91f2e 100644
--- a/vcl/win/source/gdi/salgdi_gdiplus.cxx
+++ b/vcl/win/source/gdi/salgdi_gdiplus.cxx
@@ -64,75 +64,79 @@
 
 void impAddB2DPolygonToGDIPlusGraphicsPath(Gdiplus::GraphicsPath& rPath, const basegfx::B2DPolygon& rPolygon)
 {
-    const sal_uInt32 nCount(rPolygon.count());
-
-    if(nCount)
-    {
-        const sal_uInt32 nEdgeCount(rPolygon.isClosed() ? nCount : nCount - 1);
-        const bool bControls(rPolygon.areControlPointsUsed());
-        basegfx::B2DPoint aCurr(rPolygon.getB2DPoint(0));
-        Gdiplus::PointF aFCurr(Gdiplus::REAL(aCurr.getX()), Gdiplus::REAL(aCurr.getY()));
-
-        for(sal_uInt32 a(0); a < nEdgeCount; a++)
-        {
-            const sal_uInt32 nNextIndex((a + 1) % nCount);
-            const basegfx::B2DPoint aNext(rPolygon.getB2DPoint(nNextIndex));
-            const Gdiplus::PointF aFNext(Gdiplus::REAL(aNext.getX()), Gdiplus::REAL(aNext.getY()));
-
-            if(bControls && (rPolygon.isNextControlPointUsed(a) || rPolygon.isPrevControlPointUsed(nNextIndex)))
-            {
-                const basegfx::B2DPoint aCa(rPolygon.getNextControlPoint(a));
-                const basegfx::B2DPoint aCb(rPolygon.getPrevControlPoint(nNextIndex));
-
-                rPath.AddBezier(
-                    aFCurr, 
-                    Gdiplus::PointF(Gdiplus::REAL(aCa.getX()), Gdiplus::REAL(aCa.getY())),
-                    Gdiplus::PointF(Gdiplus::REAL(aCb.getX()), Gdiplus::REAL(aCb.getY())),
-                    aFNext);
-            }
-            else
-            {
-                rPath.AddLine(aFCurr, aFNext);
-            }
-
-            if(a + 1 < nEdgeCount)
-            {
-                aCurr = aNext;
-                aFCurr = aFNext;
-            }
-        }
-    }
+    const sal_uInt32 nCount(rPolygon.count());
+
+    if(nCount)
+    {
+        const sal_uInt32 nEdgeCount(rPolygon.isClosed() ? nCount : nCount - 1);
+        const bool bControls(rPolygon.areControlPointsUsed());
+        basegfx::B2DPoint aCurr(rPolygon.getB2DPoint(0));
+        Gdiplus::PointF aFCurr(Gdiplus::REAL(aCurr.getX()), Gdiplus::REAL(aCurr.getY()));
+
+        for(sal_uInt32 a(0); a < nEdgeCount; a++)
+        {
+            const sal_uInt32 nNextIndex((a + 1) % nCount);
+            const basegfx::B2DPoint aNext(rPolygon.getB2DPoint(nNextIndex));
+            const Gdiplus::PointF aFNext(Gdiplus::REAL(aNext.getX()), Gdiplus::REAL(aNext.getY()));
+
+            if(bControls && (rPolygon.isNextControlPointUsed(a) || rPolygon.isPrevControlPointUsed(nNextIndex)))
+            {
+                const basegfx::B2DPoint aCa(rPolygon.getNextControlPoint(a));
+                const basegfx::B2DPoint aCb(rPolygon.getPrevControlPoint(nNextIndex));
+
+                rPath.AddBezier(
+                    aFCurr, 
+                    Gdiplus::PointF(Gdiplus::REAL(aCa.getX()), Gdiplus::REAL(aCa.getY())),
+                    Gdiplus::PointF(Gdiplus::REAL(aCb.getX()), Gdiplus::REAL(aCb.getY())),
+                    aFNext);
+            }
+            else
+            {
+                rPath.AddLine(aFCurr, aFNext);
+            }
+
+            if(a + 1 < nEdgeCount)
+            {
+                aCurr = aNext;
+                aFCurr = aFNext;
+            }
+        }
+    }
 }
 
 bool WinSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPolygon, double fTransparency)
 {
-    const sal_uInt32 nCount(rPolyPolygon.count());
+    const sal_uInt32 nCount(rPolyPolygon.count());
 
     if(mbBrush && nCount && (fTransparency >= 0.0 && fTransparency < 1.0))
     {
-        Gdiplus::Graphics aGraphics(mhDC);
+        Gdiplus::Graphics aGraphics(mhDC);
         const sal_uInt8 aTrans((sal_uInt8)255 - (sal_uInt8)basegfx::fround(fTransparency * 255.0));
-        Gdiplus::Color aTestColor(aTrans, SALCOLOR_RED(maFillColor), SALCOLOR_GREEN(maFillColor), SALCOLOR_BLUE(maFillColor));
-        Gdiplus::SolidBrush aTestBrush(aTestColor);
-        Gdiplus::GraphicsPath aPath;
+        Gdiplus::Color aTestColor(aTrans, SALCOLOR_RED(maFillColor), SALCOLOR_GREEN(maFillColor), SALCOLOR_BLUE(maFillColor));
+        Gdiplus::SolidBrush aTestBrush(aTestColor);
+        Gdiplus::GraphicsPath aPath;
 
         for(sal_uInt32 a(0); a < nCount; a++)
         {
-            aPath.StartFigure();
+            if(0 != a)
+            {
+                aPath.StartFigure(); // #i101491# not needed for first run
+            }
+
             impAddB2DPolygonToGDIPlusGraphicsPath(aPath, rPolyPolygon.getB2DPolygon(a));
             aPath.CloseFigure();
         }
 
         if(getAntiAliasB2DDraw())
         {
-            aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
-        }
-        else
-        {
-            aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeNone);
-        }
-
-        aGraphics.FillPath(&aTestBrush, &aPath);
+            aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
+        }
+        else
+        {
+            aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeNone);
+        }
+
+        aGraphics.FillPath(&aTestBrush, &aPath);
     }
 
      return true;
@@ -140,53 +144,59 @@ bool WinSalGraphics::drawPolyPolygon( const ::basegfx::B2DPolyPolygon& rPolyPoly
 
 bool WinSalGraphics::drawPolyLine(const basegfx::B2DPolygon& rPolygon, const basegfx::B2DVector& rLineWidths, basegfx::B2DLineJoin eLineJoin)
 {
-    const sal_uInt32 nCount(rPolygon.count());
+    const sal_uInt32 nCount(rPolygon.count());
 
     if(mbPen && nCount)
     {
-        Gdiplus::Graphics aGraphics(mhDC);
-        Gdiplus::Color aTestColor(255, SALCOLOR_RED(maLineColor), SALCOLOR_GREEN(maLineColor), SALCOLOR_BLUE(maLineColor));
-        Gdiplus::Pen aTestPen(aTestColor, Gdiplus::REAL(rLineWidths.getX()));
-        Gdiplus::GraphicsPath aPath;
-
-        switch(eLineJoin)
-        {
+        Gdiplus::Graphics aGraphics(mhDC);
+        Gdiplus::Color aTestColor(255, SALCOLOR_RED(maLineColor), SALCOLOR_GREEN(maLineColor), SALCOLOR_BLUE(maLineColor));
+        Gdiplus::Pen aTestPen(aTestColor, Gdiplus::REAL(rLineWidths.getX()));
+        Gdiplus::GraphicsPath aPath;
+
+        switch(eLineJoin)
+        {
             default : // basegfx::B2DLINEJOIN_NONE :
             {
                 break;
             }
             case basegfx::B2DLINEJOIN_BEVEL :
             {
-                aTestPen.SetLineJoin(Gdiplus::LineJoinBevel);
+                aTestPen.SetLineJoin(Gdiplus::LineJoinBevel);
                 break;
             }
             case basegfx::B2DLINEJOIN_MIDDLE :
             case basegfx::B2DLINEJOIN_MITER :
             {
                 const Gdiplus::REAL aMiterLimit(15.0);
-                aTestPen.SetMiterLimit(aMiterLimit);
-                aTestPen.SetLineJoin(Gdiplus::LineJoinMiter);
+                aTestPen.SetMiterLimit(aMiterLimit);
+                aTestPen.SetLineJoin(Gdiplus::LineJoinMiter);
                 break;
             }
             case basegfx::B2DLINEJOIN_ROUND :
             {
-                aTestPen.SetLineJoin(Gdiplus::LineJoinRound);
+                aTestPen.SetLineJoin(Gdiplus::LineJoinRound);
                 break;
             }
-        }
+        }
 
         impAddB2DPolygonToGDIPlusGraphicsPath(aPath, rPolygon);
-        
-        if(getAntiAliasB2DDraw())
-        {
-            aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
-        }
-        else
-        {
-            aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeNone);
-        }
-
-        aGraphics.DrawPath(&aTestPen, &aPath);
+
+        if(rPolygon.isClosed())
+        {
+            // #i101491# needed to create the correct line joins
+            aPath.CloseFigure();
+        }
+        
+        if(getAntiAliasB2DDraw())
+        {
+            aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeAntiAlias);
+        }
+        else
+        {
+            aGraphics.SetSmoothingMode(Gdiplus::SmoothingModeNone);
+        }
+
+        aGraphics.DrawPath(&aTestPen, &aPath);
     }
 
     return true;
commit ad92bc5f232d29fb4ff05256693aaaf5a1a6566a
Author: Jens-Heiner Rechtien <hr at openoffice.org>
Date:   Thu Jul 30 10:24:24 2009 +0000

    CWS-TOOLING: integrate CWS wordencryption
    2009-07-10 09:42:25 +0200 mav  r273872 : resolve merge problem
    2009-07-08 07:46:13 +0200 mav  r273815 : CWS-TOOLING: rebase CWS wordencryption to trunk at 273468 (milestone: DEV300:m51)
    2009-07-03 10:38:03 +0200 mav  r273682 : #i10000# resolve conflict
    2009-07-02 08:47:35 +0200 steve_yin  r273618 : Removed IBM(C) from modified files.
    2009-06-22 04:34:44 +0200 steve_yin  r273191 : Based on Mikhail suggestions, I changed some code.
    2009-06-18 09:37:14 +0200 mav  r273100 : #i10000# get rid of windows warnings
    2009-06-17 08:18:33 +0200 mav  r273047 : #i10000# adopt for linux build

diff --git a/svtools/inc/docmspasswdrequest.hxx b/svtools/inc/docmspasswdrequest.hxx
new file mode 100644
index 0000000..7cd0b17
--- /dev/null
+++ b/svtools/inc/docmspasswdrequest.hxx
@@ -0,0 +1,72 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2009.
+ * Copyright 2009 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: docmspasswdrequest.hxx,v $
+ * $Revision: 1.0 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+#ifndef INCLUDED_SVTOOLS_DOCMSPASSWDREQUEST_HXX
+#define INCLUDED_SVTOOLS_DOCMSPASSWDREQUEST_HXX
+
+#include "svtools/svldllapi.h"
+#include <com/sun/star/task/DocumentMSPasswordRequest.hpp>
+#include <com/sun/star/task/XInteractionRequest.hpp>
+#include <rtl/ustring.hxx>
+#include <cppuhelper/implbase1.hxx>
+
+class MSAbortContinuation;
+class MSPasswordContinuation;
+
+class SVL_DLLPUBLIC RequestMSDocumentPassword : public ::cppu::WeakImplHelper1< ::com::sun::star::task::XInteractionRequest >
+{
+    ::com::sun::star::uno::Any m_aRequest;
+        
+    ::com::sun::star::uno::Sequence< 
+                    ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation > 
+                > m_lContinuations;
+        
+    MSAbortContinuation*	    m_pAbort;
+    MSPasswordContinuation*	m_pPassword;
+
+public:
+    RequestMSDocumentPassword( ::com::sun::star::task::PasswordRequestMode nMode, ::rtl::OUString aName );
+    
+    sal_Bool isAbort();
+    sal_Bool isPassword();
+        
+    ::rtl::OUString getPassword();
+        
+    virtual ::com::sun::star::uno::Any SAL_CALL getRequest() 
+        throw( ::com::sun::star::uno::RuntimeException );
+
+    virtual ::com::sun::star::uno::Sequence< 
+                ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation > 
+            > SAL_CALL getContinuations() 
+        throw( ::com::sun::star::uno::RuntimeException );
+};  
+
+#endif /* INCLUDED_SVTOOLS_DOCMSPASSWDREQUEST_HXX */
diff --git a/svtools/inc/pch/precompiled_svtools.hxx b/svtools/inc/pch/precompiled_svtools.hxx
index 2b2da3f..3622cb3 100644
--- a/svtools/inc/pch/precompiled_svtools.hxx
+++ b/svtools/inc/pch/precompiled_svtools.hxx
@@ -227,6 +227,7 @@
 #include <com/sun/star/system/XProxySettings.hpp>
 #include <com/sun/star/system/XSystemShellExecute.hpp>
 #include <com/sun/star/task/DocumentPasswordRequest.hpp>
+#include <com/sun/star/task/DocumentMSPasswordRequest.hpp>
 #include <com/sun/star/task/MasterPasswordRequest.hpp>
 #include <com/sun/star/task/NoMasterException.hpp>
 #include <com/sun/star/task/PasswordRequestMode.hpp>
diff --git a/svtools/prj/d.lst b/svtools/prj/d.lst
index 6b85194..4ff7441 100644
--- a/svtools/prj/d.lst
+++ b/svtools/prj/d.lst
@@ -312,6 +312,7 @@ mkdir: %_DEST%\inc%_EXT%\svtools
 ..\inc\textwindowaccessibility.hxx %_DEST%\inc%_EXT%\svtools\textwindowaccessibility.hxx
 
 ..\inc\docpasswdrequest.hxx %_DEST%\inc%_EXT%\svtools\docpasswdrequest.hxx
+..\inc\docmspasswdrequest.hxx %_DEST%\inc%_EXT%\svtools\docmspasswdrequest.hxx
 ..\inc\fontsubstconfig.hxx %_DEST%\inc%_EXT%\svtools\fontsubstconfig.hxx
 ..\inc\apearcfg.hxx %_DEST%\inc%_EXT%\svtools\apearcfg.hxx
 ..\inc\fltrcfg.hxx %_DEST%\inc%_EXT%\svtools\fltrcfg.hxx
diff --git a/svtools/source/misc1/docmspasswdrequest.cxx b/svtools/source/misc1/docmspasswdrequest.cxx
new file mode 100644
index 0000000..aaada7b
--- /dev/null
+++ b/svtools/source/misc1/docmspasswdrequest.cxx
@@ -0,0 +1,143 @@
+/*************************************************************************
+ *
+ * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
+ * 
+ * Copyright IBM Corporation 2009.
+ * Copyright 2009 by Sun Microsystems, Inc.
+ *
+ * OpenOffice.org - a multi-platform office productivity suite
+ *
+ * $RCSfile: docmspasswdrequest.cxx,v $
+ * $Revision: 1.0 $
+ *
+ * This file is part of OpenOffice.org.
+ *
+ * OpenOffice.org is free software: you can redistribute it and/or modify
+ * it under the terms of the GNU Lesser General Public License version 3
+ * only, as published by the Free Software Foundation.
+ *
+ * OpenOffice.org is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+ * GNU Lesser General Public License version 3 for more details
+ * (a copy is included in the LICENSE file that accompanied this code).
+ *
+ * You should have received a copy of the GNU Lesser General Public License
+ * version 3 along with OpenOffice.org.  If not, see
+ * <http://www.openoffice.org/license.html>
+ * for a copy of the LGPLv3 License.
+ *
+ ************************************************************************/
+
+// MARKER(update_precomp.py): autogen include statement, do not remove
+#include "precompiled_svtools.hxx"
+
+#include "docmspasswdrequest.hxx"
+#include <com/sun/star/task/XInteractionAbort.hpp>
+#include <com/sun/star/task/XInteractionPassword.hpp>
+
+//==========================================================================
+
+class MSAbortContinuation : public ::cppu::WeakImplHelper1< ::com::sun::star::task::XInteractionAbort >
+{
+    sal_Bool mbSelected;
+
+public:
+    MSAbortContinuation() : mbSelected( sal_False ) {}
+    
+    sal_Bool isSelected() { return mbSelected; }
+    
+    void reset() { mbSelected = sal_False; }
+
+    virtual void SAL_CALL select() throw(::com::sun::star::uno::RuntimeException) { mbSelected = sal_True; }
+};
+
+//==========================================================================
+
+class MSPasswordContinuation : public ::cppu::WeakImplHelper1< ::com::sun::star::task::XInteractionPassword >
+{
+    sal_Bool mbSelected;
+    ::rtl::OUString maPassword;
+
+public:
+    MSPasswordContinuation() : mbSelected( sal_False ) {}
+    
+    sal_Bool isSelected() { return mbSelected; }
+    
+    void reset() { mbSelected = sal_False; }
+
+    virtual void SAL_CALL select() throw(::com::sun::star::uno::RuntimeException);
+    virtual void SAL_CALL setPassword( const ::rtl::OUString& aPass ) throw (::com::sun::star::uno::RuntimeException);
+    virtual ::rtl::OUString SAL_CALL getPassword(  ) throw (::com::sun::star::uno::RuntimeException);
+};
+
+void SAL_CALL MSPasswordContinuation::select()
+    throw(::com::sun::star::uno::RuntimeException)
+{
+    mbSelected = sal_True;
+}
+
+void SAL_CALL MSPasswordContinuation::setPassword( const ::rtl::OUString& aPass )
+    throw (::com::sun::star::uno::RuntimeException)
+{
+    maPassword = aPass;
+}
+
+::rtl::OUString SAL_CALL MSPasswordContinuation::getPassword() 
+    throw (::com::sun::star::uno::RuntimeException)
+{
+    return maPassword;
+}
+
+//==========================================================================
+
+RequestMSDocumentPassword::RequestMSDocumentPassword( ::com::sun::star::task::PasswordRequestMode nMode, ::rtl::OUString aName )
+{
+    ::rtl::OUString temp;
+    ::com::sun::star::uno::Reference< ::com::sun::star::uno::XInterface > temp2;
+    ::com::sun::star::task::DocumentMSPasswordRequest 
+        aDocumentMSPasswordRequest( temp,
+                            temp2,
+                          ::com::sun::star::task::InteractionClassification_QUERY,
+                          nMode,
+                          aName );
+
+       m_aRequest <<= aDocumentMSPasswordRequest;
+
+       m_pAbort  = new MSAbortContinuation;
+       m_pPassword = new MSPasswordContinuation;
+
+       m_lContinuations.realloc( 2 );
+       m_lContinuations[0] = ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation >( m_pAbort  );
+       m_lContinuations[1] = ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation >( m_pPassword );
+}
+
+sal_Bool RequestMSDocumentPassword::isAbort()
+{
+    return m_pAbort->isSelected();
+}
+
+sal_Bool RequestMSDocumentPassword::isPassword()
+{
+    return m_pPassword->isSelected();
+}
+        
+::rtl::OUString RequestMSDocumentPassword::getPassword()
+{
+    return m_pPassword->getPassword();
+}
+        
+::com::sun::star::uno::Any SAL_CALL RequestMSDocumentPassword::getRequest()
+        throw( ::com::sun::star::uno::RuntimeException )
+{
+    return m_aRequest;
+}
+
+::com::sun::star::uno::Sequence< ::com::sun::star::uno::Reference< ::com::sun::star::task::XInteractionContinuation > >
+    SAL_CALL RequestMSDocumentPassword::getContinuations()
+        throw( ::com::sun::star::uno::RuntimeException )
+{
+    return m_lContinuations;
+}
+
+
diff --git a/svtools/source/misc1/makefile.mk b/svtools/source/misc1/makefile.mk
index 0d1e67f..3ca57ff 100644
--- a/svtools/source/misc1/makefile.mk
+++ b/svtools/source/misc1/makefile.mk
@@ -50,6 +50,7 @@ SLOFILES=\
     $(EXCEPTIONSFILES) \
     $(SLO)$/adrparse.obj \
     $(SLO)$/docpasswdrequest.obj \
+    $(SLO)$/docmspasswdrequest.obj \
     $(SLO)$/filenotation.obj \
     $(SLO)$/inethist.obj \
     $(SLO)$/inettype.obj \
commit 89198f24acb0720399cabd9a473fb7df300ce3ae
Author: Jens-Heiner Rechtien <hr at openoffice.org>
Date:   Wed Jul 29 15:33:56 2009 +0000

    CWS-TOOLING: integrate CWS cmcfixes61
    2009-07-22 10:53:14 +0200 cmc  r274224 : #i103714# duplicate patch
    2009-07-22 10:45:26 +0200 cmc  r274223 : #i103715# fix up m68k makefile.mk
    2009-07-22 10:32:16 +0200 cmc  r274222 : #i103714# || && new gcc warnings
    2009-07-21 13:29:17 +0200 cmc  r274190 : #i103651# fix for subpixel gray line in cairo canvas animations
    2009-07-20 17:35:58 +0200 cmc  r274151 : #i103668# WaE over use of const
    2009-07-20 15:53:51 +0200 cmc  r274146 : #i103664# use boost::addressof instead
    2009-07-20 15:38:40 +0200 cmc  r274145 : #i103451# long -> INT32 for these streamable values
    2009-07-20 15:33:15 +0200 cmc  r274144 : #i103663 clear low-hanging aliasing warnings
    2009-07-20 15:28:23 +0200 cmc  r274143 : #i103662 clear low-hanging aliasing warnings
    2009-07-20 15:21:46 +0200 cmc  r274142 : #i103661 clear low-hanging aliasing warnings
    2009-07-20 15:16:05 +0200 cmc  r274141 : #i103660 clear low-hanging aliasing warnings

diff --git a/canvas/source/cairo/cairo_canvashelper.cxx b/canvas/source/cairo/cairo_canvashelper.cxx
index 0d04e11..6c9de63 100644
--- a/canvas/source/cairo/cairo_canvashelper.cxx
+++ b/canvas/source/cairo/cairo_canvashelper.cxx
@@ -888,7 +888,7 @@ namespace cairocanvas
             nY = aP.getY();
             cairo_matrix_transform_point( &aOrigMatrix, &nX, &nY );
 
-             if( ! bIsBezier && bIsRectangle ) {
+             if( ! bIsBezier && (bIsRectangle || aOperation == Clip) ) {
                 nX = basegfx::fround( nX );
                 nY = basegfx::fround( nY );
             }
diff --git a/svtools/source/control/scrwin.cxx b/svtools/source/control/scrwin.cxx
index 847e3b3..77830dd 100644
--- a/svtools/source/control/scrwin.cxx
+++ b/svtools/source/control/scrwin.cxx
@@ -273,8 +273,8 @@ void __EXPORT ScrollableWindow::Resize()
     // disable painting in the corner between the scrollbars
     if ( bVVisible && bHVisible )
     {
-        aCornerWin.SetPosSizePixel(
-            *((Point*) &aOutPixSz), Size(nScrSize, nScrSize) );
+        aCornerWin.SetPosSizePixel(Point(aOutPixSz.Width(), aOutPixSz.Height()),
+            Size(nScrSize, nScrSize) );
         aCornerWin.Show();
     }
     else
diff --git a/vcl/source/glyphs/gcach_ftyp.cxx b/vcl/source/glyphs/gcach_ftyp.cxx
index dfdc5f6..1f0ed00 100644
--- a/vcl/source/glyphs/gcach_ftyp.cxx
+++ b/vcl/source/glyphs/gcach_ftyp.cxx
@@ -1058,7 +1058,7 @@ static inline void SplitGlyphFlags( const FreetypeServerFont& rFont, int& nGlyph
 // -----------------------------------------------------------------------
 
 int FreetypeServerFont::ApplyGlyphTransform( int nGlyphFlags,
-    FT_GlyphRec_* pGlyphFT, bool bForBitmapProcessing ) const
+    FT_Glyph pGlyphFT, bool bForBitmapProcessing ) const
 {
     int nAngle = GetFontSelData().mnOrientation;
     // shortcut most common case
@@ -1130,9 +1130,9 @@ int FreetypeServerFont::ApplyGlyphTransform( int nGlyphFlags,
     else
     {
         // FT<=2005 ignores transforms for bitmaps, so do it manually
-        FT_BitmapGlyph& rBmpGlyphFT = reinterpret_cast<FT_BitmapGlyph&>(pGlyphFT);
-        rBmpGlyphFT->left += (aVector.x + 32) >> 6;
-        rBmpGlyphFT->top  += (aVector.y + 32) >> 6;
+        FT_BitmapGlyph pBmpGlyphFT = reinterpret_cast<FT_BitmapGlyph>(pGlyphFT);
+        pBmpGlyphFT->left += (aVector.x + 32) >> 6;
+        pBmpGlyphFT->top  += (aVector.y + 32) >> 6;
     }
 
     return nAngle;
@@ -1440,12 +1440,12 @@ bool FreetypeServerFont::GetGlyphBitmap1( int nGlyphIndex, RawBitmap& rRawBitmap
         }
     }
 
-    const FT_BitmapGlyph& rBmpGlyphFT = reinterpret_cast<const FT_BitmapGlyph&>(pGlyphFT);
+    const FT_BitmapGlyph pBmpGlyphFT = reinterpret_cast<const FT_BitmapGlyph>(pGlyphFT);
     // NOTE: autohinting in FT<=2.0.2 miscalculates the offsets below by +-1
-    rRawBitmap.mnXOffset        = +rBmpGlyphFT->left;
-    rRawBitmap.mnYOffset        = -rBmpGlyphFT->top;
+    rRawBitmap.mnXOffset        = +pBmpGlyphFT->left;
+    rRawBitmap.mnYOffset        = -pBmpGlyphFT->top;
 
-    const FT_Bitmap& rBitmapFT  = rBmpGlyphFT->bitmap;
+    const FT_Bitmap& rBitmapFT  = pBmpGlyphFT->bitmap;
     rRawBitmap.mnHeight         = rBitmapFT.rows;
     rRawBitmap.mnBitCount       = 1;
     if( mbArtBold && !pFTEmbolden )
@@ -1595,11 +1595,11 @@ bool FreetypeServerFont::GetGlyphBitmap8( int nGlyphIndex, RawBitmap& rRawBitmap
         }
     }
 
-    const FT_BitmapGlyph& rBmpGlyphFT = reinterpret_cast<const FT_BitmapGlyph&>(pGlyphFT);
-    rRawBitmap.mnXOffset        = +rBmpGlyphFT->left;
-    rRawBitmap.mnYOffset        = -rBmpGlyphFT->top;
+    const FT_BitmapGlyph pBmpGlyphFT = reinterpret_cast<const FT_BitmapGlyph>(pGlyphFT);
+    rRawBitmap.mnXOffset        = +pBmpGlyphFT->left;
+    rRawBitmap.mnYOffset        = -pBmpGlyphFT->top;
 
-    const FT_Bitmap& rBitmapFT  = rBmpGlyphFT->bitmap;
+    const FT_Bitmap& rBitmapFT  = pBmpGlyphFT->bitmap;
     rRawBitmap.mnHeight         = rBitmapFT.rows;
     rRawBitmap.mnWidth          = rBitmapFT.width;
     rRawBitmap.mnBitCount       = 8;
commit 288087b71850ddbd308b51ba9098040254131b0f
Author: Jens-Heiner Rechtien <hr at openoffice.org>
Date:   Wed Jul 29 14:40:58 2009 +0000

    CWS-TOOLING: integrate CWS dba311b_DEV300
    2009-07-08 11:52:32 +0200 fs  r273825 : #i101701# always Draw (instead of PaintToDevice) when exporting to PDF, there's no reason to care for IsExportFormFields, this is done in higher layers

diff --git a/toolkit/source/awt/vclxwindow.cxx b/toolkit/source/awt/vclxwindow.cxx
index 734ee2a..efa57aa 100644
--- a/toolkit/source/awt/vclxwindow.cxx
+++ b/toolkit/source/awt/vclxwindow.cxx
@@ -2537,7 +2537,7 @@ void VCLXWindow::draw( sal_Int32 nX, sal_Int32 nY ) throw(::com::sun::star::uno:
             vcl::PDFExtOutDevData* pPDFExport   = dynamic_cast<vcl::PDFExtOutDevData*>(pDev->GetExtOutDevData());
             bool bDrawSimple =    ( pDev->GetOutDevType() == OUTDEV_PRINTER )
                                || ( pDev->GetOutDevViewType() == OUTDEV_VIEWTYPE_PRINTPREVIEW )
-                               || ( pPDFExport && ! pPDFExport->GetIsExportFormFields() );
+                               || ( pPDFExport != NULL );
             if ( bDrawSimple )
             {
                 pWindow->Draw( pDev, aP, aSz, WINDOW_DRAW_NOCONTROLS );


More information about the ooo-build-commit mailing list