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

Chris Sherlock chris.sherlock79 at gmail.com
Mon Mar 31 14:06:43 PDT 2014


 include/vcl/outdev.hxx       |    1 +
 include/vcl/print.hxx        |    1 +
 include/vcl/virdev.hxx       |    3 +++
 include/vcl/window.hxx       |    5 +++--
 vcl/source/gdi/outdev4.cxx   |    3 +--
 vcl/source/gdi/print.cxx     |    5 +++++
 vcl/source/gdi/virdev.cxx    |    5 +++++
 vcl/source/window/window.cxx |    8 ++++++++
 8 files changed, 27 insertions(+), 4 deletions(-)

New commits:
commit 6d0273b70b228af6b18e0dfdb89759ccad30a03c
Author: Chris Sherlock <chris.sherlock79 at gmail.com>
Date:   Tue Apr 1 01:28:02 2014 +1100

    fdo#74702 New abstract function UsePolyPolygonForComplexGradient()
    
    A new protected abstract function has been introduced only for
    complex gradients. As it stands, we currently need to work out if
    we should use a PolyPolygon or a Polygon because, as the comments
    say:
    
        // Determine if we output via Polygon or PolyPolygon
        // For all rasteroperations other then Overpaint always use
        // PolyPolygon, as we will get wrong results if we output multiple
        // times on top of each other.
        // Also for printers always use PolyPolygon, as not all printers
        // can print polygons on top of each other.
    
    Interestingly, the next line is either wrong or expressed badly,
    because the check uses PolyPolygons when a VirtualDevice is in use:
    
        // Also virtual devices are excluded, as some drivers are too slow.
    
    Therefore, I've removed that comment as it seems rather misleading.
    
    Change-Id: Ic496284cb2be8e7e2d348eae76aeeec994e1029c
    Reviewed-on: https://gerrit.libreoffice.org/8802
    Reviewed-by: Chris Sherlock <chris.sherlock79 at gmail.com>
    Tested-by: Chris Sherlock <chris.sherlock79 at gmail.com>

diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx
index 363cdbf..56aa073 100644
--- a/include/vcl/outdev.hxx
+++ b/include/vcl/outdev.hxx
@@ -805,6 +805,7 @@ protected:
                                                 const Point& rSrcPtPixel, const Size& rSrcSizePixel );
 
     virtual long                ImplGetGradientStepCount( long nMinRect );
+    virtual bool                UsePolyPolygonForComplexGradient() = 0;
 
     /** Transform and draw a bitmap directly
 
diff --git a/include/vcl/print.hxx b/include/vcl/print.hxx
index 0271f0b..d70e7c0 100644
--- a/include/vcl/print.hxx
+++ b/include/vcl/print.hxx
@@ -274,6 +274,7 @@ public:
 
 protected:
     long                        ImplGetGradientStepCount( long nMinRect ) SAL_OVERRIDE;
+    virtual bool                UsePolyPolygonForComplexGradient() SAL_OVERRIDE;
     void                        ScaleBitmap ( Bitmap&, SalTwoRect& ) SAL_OVERRIDE { };
 
 public:
diff --git a/include/vcl/virdev.hxx b/include/vcl/virdev.hxx
index 0436b5d..b2a29be 100644
--- a/include/vcl/virdev.hxx
+++ b/include/vcl/virdev.hxx
@@ -140,6 +140,9 @@ public:
 private:
     SAL_DLLPRIVATE void ImplSetReferenceDevice( RefDevMode, sal_Int32 i_nDPIX, sal_Int32 i_nDPIY );
 
+protected:
+    virtual bool                UsePolyPolygonForComplexGradient() SAL_OVERRIDE;
+
 };
 
 #endif // INCLUDED_VCL_VIRDEV_HXX
diff --git a/include/vcl/window.hxx b/include/vcl/window.hxx
index 5751489..a527a8f 100644
--- a/include/vcl/window.hxx
+++ b/include/vcl/window.hxx
@@ -579,8 +579,9 @@ protected:
     virtual sal_uInt16 getDefaultAccessibleRole() const;
     virtual OUString getDefaultAccessibleName() const;
 
-    virtual void               CopyAreaFinal( SalTwoRect& aPosAry, sal_uInt32 nFlags) SAL_OVERRIDE;
-    virtual void               ClipToPaintRegion( Rectangle& rDstRect ) SAL_OVERRIDE;
+    virtual void                CopyAreaFinal( SalTwoRect& aPosAry, sal_uInt32 nFlags) SAL_OVERRIDE;
+    virtual void                ClipToPaintRegion( Rectangle& rDstRect ) SAL_OVERRIDE;
+    virtual bool                UsePolyPolygonForComplexGradient() SAL_OVERRIDE;
 
 public:
     bool HasMirroredGraphics() const SAL_OVERRIDE;
diff --git a/vcl/source/gdi/outdev4.cxx b/vcl/source/gdi/outdev4.cxx
index c3873b6..4d23620 100644
--- a/vcl/source/gdi/outdev4.cxx
+++ b/vcl/source/gdi/outdev4.cxx
@@ -372,7 +372,6 @@ void OutputDevice::ImplDrawComplexGradient( const Rectangle& rRect,
     // as we will get wrong results if we output multiple times on top of each other.
     // Also for printers always use PolyPolygon, as not all printers
     // can print polygons on top of each other.
-    // Also virtual devices are excluded, as some drivers are too slow.
 
     boost::scoped_ptr<PolyPolygon> pPolyPoly;
     Rectangle       aRect;
@@ -393,7 +392,7 @@ void OutputDevice::ImplDrawComplexGradient( const Rectangle& rRect,
 
     rGradient.GetBoundRect( rRect, aRect, aCenter );
 
-    if( (meRasterOp != ROP_OVERPAINT) || (meOutDevType != OUTDEV_WINDOW) || bMtf )
+    if ( UsePolyPolygonForComplexGradient() || bMtf )
         pPolyPoly.reset(new PolyPolygon( 2 ));
 
     long nMinRect = std::min( aRect.GetWidth(), aRect.GetHeight() );
diff --git a/vcl/source/gdi/print.cxx b/vcl/source/gdi/print.cxx
index c83757b..f6ebc67 100644
--- a/vcl/source/gdi/print.cxx
+++ b/vcl/source/gdi/print.cxx
@@ -1863,4 +1863,9 @@ void Printer::updatePrinters()
     }
 }
 
+bool Printer::UsePolyPolygonForComplexGradient()
+{
+    return true;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx
index df30533..1b3fba2 100644
--- a/vcl/source/gdi/virdev.cxx
+++ b/vcl/source/gdi/virdev.cxx
@@ -543,6 +543,11 @@ sal_uInt16 VirtualDevice::GetAlphaBitCount() const
     return 0;
 }
 
+bool VirtualDevice::UsePolyPolygonForComplexGradient()
+{
+    return true;
+}
+
 void VirtualDevice::Compat_ZeroExtleadBug()
 {
     meRefDevMode = (sal_uInt8)meRefDevMode | REFDEV_FORCE_ZERO_EXTLEAD;
diff --git a/vcl/source/window/window.cxx b/vcl/source/window/window.cxx
index 6ae5700..5bed7e1 100644
--- a/vcl/source/window/window.cxx
+++ b/vcl/source/window/window.cxx
@@ -9840,4 +9840,12 @@ Selection Window::GetSurroundingTextSelection() const
   return Selection( 0, 0 );
 }
 
+bool Window::UsePolyPolygonForComplexGradient()
+{
+    if ( meRasterOp != ROP_OVERPAINT )
+        return true;
+
+    return false;
+}
+
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list