[Libreoffice-commits] core.git: Branch 'libreoffice-4-4' - 3 commits - canvas/source desktop/source include/canvas include/vcl vcl/source

Caolán McNamara caolanm at redhat.com
Thu Dec 11 12:46:21 PST 2014


 canvas/source/cairo/cairo_canvashelper.hxx      |    3 
 canvas/source/cairo/cairo_canvashelper_text.cxx |  117 +++++++++---------------
 canvas/source/cairo/cairo_quartz_cairo.cxx      |    2 
 canvas/source/cairo/cairo_win32_cairo.cxx       |    2 
 canvas/source/cairo/cairo_xlib_cairo.cxx        |    7 +
 canvas/source/tools/canvastools.cxx             |   75 +++++++++++++++
 canvas/source/vcl/canvashelper.cxx              |   80 ----------------
 desktop/source/lib/init.cxx                     |    2 
 include/canvas/canvastools.hxx                  |    6 +
 include/vcl/virdev.hxx                          |    3 
 vcl/source/gdi/virdev.cxx                       |    6 -
 11 files changed, 149 insertions(+), 154 deletions(-)

New commits:
commit 3a108b0600ce61f7960d561cee9989ab3a48780f
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Dec 11 17:48:44 2014 +0000

    Resolves: fdo#87242 reuse vcl clip for cairo during animations
    
    Change-Id: I0a26d4c4092226732620c3852b0402ee45d4fa1d
    (cherry picked from commit 94d935eecbba0161de2616c2234b4a5d9d3cad88)

diff --git a/canvas/source/cairo/cairo_canvashelper.hxx b/canvas/source/cairo/cairo_canvashelper.hxx
index 4adcb3b..f6f0099 100644
--- a/canvas/source/cairo/cairo_canvashelper.hxx
+++ b/canvas/source/cairo/cairo_canvashelper.hxx
@@ -310,6 +310,9 @@ namespace cairocanvas
         ::cairo::CairoSharedPtr     mpCairo;
         ::cairo::SurfaceSharedPtr   mpSurface;
         ::basegfx::B2ISize maSize;
+
+        void clip_cairo_from_dev(::OutputDevice& rOutDev);
+
     };
 
     /// also needed from SpriteHelper
diff --git a/canvas/source/cairo/cairo_canvashelper_text.cxx b/canvas/source/cairo/cairo_canvashelper_text.cxx
index 4be8390..f7b5fce 100644
--- a/canvas/source/cairo/cairo_canvashelper_text.cxx
+++ b/canvas/source/cairo/cairo_canvashelper_text.cxx
@@ -176,12 +176,15 @@ namespace cairocanvas
     {
     private:
         OutputDevice *mpVirtualDevice;
+        cairo_t *mpCairo;
         bool mbMappingWasEnabled;
     public:
-        DeviceSettingsGuard(OutputDevice *pVirtualDevice)
+        DeviceSettingsGuard(OutputDevice *pVirtualDevice, cairo_t *pCairo)
             : mpVirtualDevice(pVirtualDevice)
+            , mpCairo(pCairo)
             , mbMappingWasEnabled(mpVirtualDevice->IsMapModeEnabled())
         {
+            cairo_save(mpCairo);
             mpVirtualDevice->Push();
             mpVirtualDevice->EnableMapMode(false);
         }
@@ -190,6 +193,7 @@ namespace cairocanvas
         {
             mpVirtualDevice->EnableMapMode(mbMappingWasEnabled);
             mpVirtualDevice->Pop();
+            cairo_restore(mpCairo);
         }
     };
 
@@ -229,6 +233,17 @@ namespace cairocanvas
         return true;
     }
 
+    //set the clip of the rOutDev to the cairo surface
+    void CanvasHelper::clip_cairo_from_dev(::OutputDevice& rOutDev)
+    {
+        vcl::Region aRegion(rOutDev.GetClipRegion());
+        if (!aRegion.IsEmpty() && !aRegion.IsNull())
+        {
+            doPolyPolygonImplementation(aRegion.GetAsB2DPolyPolygon(), Clip, mpCairo.get(),
+                                        NULL, mpSurfaceProvider, rendering::FillRule_EVEN_ODD);
+        }
+    }
+
     uno::Reference< rendering::XCachedPrimitive > CanvasHelper::drawText( const rendering::XCanvas*                         pOwner,
                                                                           const rendering::StringContext&                   text,
                                                                           const uno::Reference< rendering::XCanvasFont >&   xFont,
@@ -249,7 +264,7 @@ namespace cairocanvas
 
         if( mpVirtualDevice )
         {
-            DeviceSettingsGuard aGuard(mpVirtualDevice.get());
+            DeviceSettingsGuard aGuard(mpVirtualDevice.get(), mpCairo.get());
 
 #if defined CAIRO_HAS_WIN32_SURFACE
             // FIXME: Some kind of work-araound...
@@ -283,6 +298,8 @@ namespace cairocanvas
             // TODO(F2): alpha
             mpVirtualDevice->SetLayoutMode( nLayoutMode );
 
+            clip_cairo_from_dev(*mpVirtualDevice);
+
             OSL_TRACE(":cairocanvas::CanvasHelper::drawText(O,t,f,v,r,d): %s", OUStringToOString( text.Text.copy( text.StartPosition, text.Length ),
                                                                                                          RTL_TEXTENCODING_UTF8 ).getStr());
 
@@ -310,7 +327,7 @@ namespace cairocanvas
 
             if( mpVirtualDevice )
             {
-                DeviceSettingsGuard aGuard(mpVirtualDevice.get());
+                DeviceSettingsGuard aGuard(mpVirtualDevice.get(), mpCairo.get());
 
 #if defined CAIRO_HAS_WIN32_SURFACE
                 // FIXME: Some kind of work-araound...
@@ -326,6 +343,8 @@ namespace cairocanvas
                 if( !setupTextOutput( *mpVirtualDevice, pOwner, aOutpos, viewState, renderState, xLayoutedText->getFont() ) )
                     return uno::Reference< rendering::XCachedPrimitive >(NULL); // no output necessary
 
+                clip_cairo_from_dev(*mpVirtualDevice);
+
                 // TODO(F2): What about the offset scalings?
                 pTextLayout->draw( mpSurface, *mpVirtualDevice, aOutpos, viewState, renderState );
             }
commit e0e96579ce3a248ee5d3b07ecf90f38e2020c555
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Dec 11 16:31:22 2014 +0000

    Related: fdo#87242 merge duplicate clip setup code
    
    favoring the vclcanvas one for the places where
    they diverge
    
    Change-Id: I18e3d4e7659ebd4cb90c86718c1b1035671b4be3
    (cherry picked from commit f88b5ab8692ee7ecf58b570e703d0e7f10cc2f0d)

diff --git a/canvas/source/cairo/cairo_canvashelper_text.cxx b/canvas/source/cairo/cairo_canvashelper_text.cxx
index c9c3702..4be8390 100644
--- a/canvas/source/cairo/cairo_canvashelper_text.cxx
+++ b/canvas/source/cairo/cairo_canvashelper_text.cxx
@@ -127,73 +127,7 @@ namespace cairocanvas
 
         // TODO(P2): Don't change clipping all the time, maintain current clip
         // state and change only when update is necessary
-
-        // accumulate non-empty clips into one region
-        // ==========================================
-
-        vcl::Region aClipRegion;
-
-        if( viewState.Clip.is() )
-        {
-            ::basegfx::B2DPolyPolygon aClipPoly(
-                ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(
-                    viewState.Clip) );
-
-            if( aClipPoly.count() )
-            {
-                // setup non-empty clipping
-                ::basegfx::B2DHomMatrix aMatrix;
-                aClipPoly.transform(
-                    ::basegfx::unotools::homMatrixFromAffineMatrix( aMatrix,
-                                                                    viewState.AffineTransform ) );
-
-                aClipRegion = vcl::Region::GetRegionFromPolyPolygon( tools::PolyPolygon( aClipPoly ) );
-            }
-        }
-
-        if( renderState.Clip.is() )
-        {
-            ::basegfx::B2DPolyPolygon aClipPoly(
-                ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(
-                    renderState.Clip) );
-
-            ::basegfx::B2DHomMatrix aMatrix;
-            aClipPoly.transform(
-                ::canvas::tools::mergeViewAndRenderTransform( aMatrix,
-                                                              viewState,
-                                                              renderState ) );
-
-            if( aClipPoly.count() )
-            {
-                // setup non-empty clipping
-                vcl::Region aRegion = vcl::Region::GetRegionFromPolyPolygon( tools::PolyPolygon( aClipPoly ) );
-
-                if( aClipRegion.IsEmpty() )
-                    aClipRegion = aRegion;
-                else
-                    aClipRegion.Intersect( aRegion );
-            }
-            else
-            {
-                // clip polygon is empty
-                aClipRegion.SetEmpty();
-            }
-        }
-
-        // setup accumulated clip region. Note that setting an
-        // empty clip region denotes "clip everything" on the
-        // OutputDevice (which is why we translate that into
-        // SetClipRegion() here). When both view and render clip
-        // are empty, aClipRegion remains default-constructed,
-        // i.e. empty, too.
-        if( aClipRegion.IsEmpty() )
-        {
-            rOutDev.SetClipRegion();
-        }
-        else
-        {
-            rOutDev.SetClipRegion( aClipRegion );
-        }
+        ::canvas::tools::clipOutDev(viewState, renderState, rOutDev);
 
         if( eColorType != IGNORE_COLOR )
         {
@@ -238,6 +172,27 @@ namespace cairocanvas
         return nTransparency;
     }
 
+    class DeviceSettingsGuard
+    {
+    private:
+        OutputDevice *mpVirtualDevice;
+        bool mbMappingWasEnabled;
+    public:
+        DeviceSettingsGuard(OutputDevice *pVirtualDevice)
+            : mpVirtualDevice(pVirtualDevice)
+            , mbMappingWasEnabled(mpVirtualDevice->IsMapModeEnabled())
+        {
+            mpVirtualDevice->Push();
+            mpVirtualDevice->EnableMapMode(false);
+        }
+
+        ~DeviceSettingsGuard()
+        {
+            mpVirtualDevice->EnableMapMode(mbMappingWasEnabled);
+            mpVirtualDevice->Pop();
+        }
+    };
+
     bool setupTextOutput( OutputDevice&                                     rOutDev,
                           const rendering::XCanvas*                         pOwner,
                           ::Point&                                          o_rOutPos,
@@ -247,14 +202,12 @@ namespace cairocanvas
     {
         setupOutDevState( rOutDev, pOwner, viewState, renderState, TEXT_COLOR );
 
-        vcl::Font aVCLFont;
-
         CanvasFont* pFont = dynamic_cast< CanvasFont* >( xFont.get() );
 
         ENSURE_ARG_OR_THROW( pFont,
                          "CanvasHelper::setupTextOutput(): Font not compatible with this canvas" );
 
-        aVCLFont = pFont->getVCLFont();
+        vcl::Font aVCLFont = pFont->getVCLFont();
 
         Color aColor( COL_BLACK );
 
@@ -273,7 +226,6 @@ namespace cairocanvas
 
         rOutDev.SetFont( aVCLFont );
 
-
         return true;
     }
 
@@ -297,6 +249,8 @@ namespace cairocanvas
 
         if( mpVirtualDevice )
         {
+            DeviceSettingsGuard aGuard(mpVirtualDevice.get());
+
 #if defined CAIRO_HAS_WIN32_SURFACE
             // FIXME: Some kind of work-araound...
             cairo_rectangle (mpSurface->getCairo().get(), 0, 0, 0, 0);
@@ -356,6 +310,8 @@ namespace cairocanvas
 
             if( mpVirtualDevice )
             {
+                DeviceSettingsGuard aGuard(mpVirtualDevice.get());
+
 #if defined CAIRO_HAS_WIN32_SURFACE
                 // FIXME: Some kind of work-araound...
                 cairo_rectangle( mpSurface->getCairo().get(), 0, 0, 0, 0);
diff --git a/canvas/source/tools/canvastools.cxx b/canvas/source/tools/canvastools.cxx
index 3feb235..7b3ae29 100644
--- a/canvas/source/tools/canvastools.cxx
+++ b/canvas/source/tools/canvastools.cxx
@@ -1291,6 +1291,81 @@ namespace canvas
                                    nColorSteps ) );
         }
 
+        void clipOutDev(const rendering::ViewState& viewState,
+                        const rendering::RenderState& renderState,
+                        OutputDevice& rOutDev,
+                        OutputDevice* p2ndOutDev)
+        {
+            // accumulate non-empty clips into one region
+            vcl::Region aClipRegion(true);
+
+            if( viewState.Clip.is() )
+            {
+                ::basegfx::B2DPolyPolygon aClipPoly(
+                    ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(viewState.Clip) );
+
+                if( aClipPoly.count() )
+                {
+                    // setup non-empty clipping
+                    ::basegfx::B2DHomMatrix aMatrix;
+                    aClipPoly.transform(
+                        ::basegfx::unotools::homMatrixFromAffineMatrix( aMatrix,
+                                                                        viewState.AffineTransform ) );
+
+                    aClipRegion = vcl::Region::GetRegionFromPolyPolygon( ::tools::PolyPolygon( aClipPoly ) );
+                }
+                else
+                {
+                    // clip polygon is empty
+                    aClipRegion.SetEmpty();
+                }
+            }
+
+            if( renderState.Clip.is() )
+            {
+                ::basegfx::B2DPolyPolygon aClipPoly(
+                    ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(renderState.Clip) );
+
+                ::basegfx::B2DHomMatrix aMatrix;
+                aClipPoly.transform(
+                    ::canvas::tools::mergeViewAndRenderTransform( aMatrix,
+                                                                  viewState,
+                                                                  renderState ) );
+
+                if( aClipPoly.count() )
+                {
+                    // setup non-empty clipping
+                    vcl::Region aRegion = vcl::Region::GetRegionFromPolyPolygon( ::tools::PolyPolygon( aClipPoly ) );
+                    aClipRegion.Intersect( aRegion );
+                }
+                else
+                {
+                    // clip polygon is empty
+                    aClipRegion.SetEmpty();
+                }
+            }
+
+            // setup accumulated clip region. Note that setting an
+            // empty clip region denotes "clip everything" on the
+            // OutputDevice (which is why we translate that into
+            // SetClipRegion() here). When both view and render clip
+            // are empty, aClipRegion remains default-constructed,
+            // i.e. empty, too.
+            if( aClipRegion.IsNull() )
+            {
+                rOutDev.SetClipRegion();
+
+                if( p2ndOutDev )
+                    p2ndOutDev->SetClipRegion();
+            }
+            else
+            {
+                rOutDev.SetClipRegion( aClipRegion );
+
+                if( p2ndOutDev )
+                    p2ndOutDev->SetClipRegion( aClipRegion );
+            }
+        }
     } // namespace tools
 
 } // namespace canvas
diff --git a/canvas/source/vcl/canvashelper.cxx b/canvas/source/vcl/canvashelper.cxx
index 9510d7e..c9fe640 100644
--- a/canvas/source/vcl/canvashelper.cxx
+++ b/canvas/source/vcl/canvashelper.cxx
@@ -1228,78 +1228,7 @@ namespace vclcanvas
 
         // TODO(P2): Don't change clipping all the time, maintain current clip
         // state and change only when update is necessary
-
-        // accumulate non-empty clips into one region
-        // ==========================================
-
-        vcl::Region aClipRegion(true);
-
-        if( viewState.Clip.is() )
-        {
-            ::basegfx::B2DPolyPolygon aClipPoly(
-                ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(viewState.Clip) );
-
-            if( aClipPoly.count() )
-            {
-                // setup non-empty clipping
-                ::basegfx::B2DHomMatrix aMatrix;
-                aClipPoly.transform(
-                    ::basegfx::unotools::homMatrixFromAffineMatrix( aMatrix,
-                                                                    viewState.AffineTransform ) );
-
-                aClipRegion = vcl::Region::GetRegionFromPolyPolygon( ::tools::PolyPolygon( aClipPoly ) );
-            }
-            else
-            {
-                // clip polygon is empty
-                aClipRegion.SetEmpty();
-            }
-        }
-
-        if( renderState.Clip.is() )
-        {
-            ::basegfx::B2DPolyPolygon aClipPoly(
-                ::basegfx::unotools::b2DPolyPolygonFromXPolyPolygon2D(renderState.Clip) );
-
-            ::basegfx::B2DHomMatrix aMatrix;
-            aClipPoly.transform(
-                ::canvas::tools::mergeViewAndRenderTransform( aMatrix,
-                                                              viewState,
-                                                              renderState ) );
-
-            if( aClipPoly.count() )
-            {
-                // setup non-empty clipping
-                vcl::Region aRegion = vcl::Region::GetRegionFromPolyPolygon( ::tools::PolyPolygon( aClipPoly ) );
-                aClipRegion.Intersect( aRegion );
-            }
-            else
-            {
-                // clip polygon is empty
-                aClipRegion.SetEmpty();
-            }
-        }
-
-        // setup accumulated clip region. Note that setting an
-        // empty clip region denotes "clip everything" on the
-        // OutputDevice (which is why we translate that into
-        // SetClipRegion() here). When both view and render clip
-        // are empty, aClipRegion remains default-constructed,
-        // i.e. empty, too.
-        if( aClipRegion.IsNull() )
-        {
-            rOutDev.SetClipRegion();
-
-            if( p2ndOutDev )
-                p2ndOutDev->SetClipRegion();
-        }
-        else
-        {
-            rOutDev.SetClipRegion( aClipRegion );
-
-            if( p2ndOutDev )
-                p2ndOutDev->SetClipRegion( aClipRegion );
-        }
+        ::canvas::tools::clipOutDev(viewState, renderState, rOutDev, p2ndOutDev);
 
         Color aColor( COL_WHITE );
 
@@ -1365,18 +1294,17 @@ namespace vclcanvas
         ENSURE_OR_THROW( mpOutDev.get(),
                          "outdev null. Are we disposed?" );
 
-        setupOutDevState( viewState, renderState, TEXT_COLOR );
-
         OutputDevice& rOutDev( mpOutDev->getOutDev() );
 
-        vcl::Font aVCLFont;
+        rOutDev.SetClipRegion(vcl::Region(true));
+        setupOutDevState( viewState, renderState, TEXT_COLOR );
 
         CanvasFont* pFont = dynamic_cast< CanvasFont* >( xFont.get() );
 
         ENSURE_ARG_OR_THROW( pFont,
                              "Font not compatible with this canvas" );
 
-        aVCLFont = pFont->getVCLFont();
+        vcl::Font aVCLFont = pFont->getVCLFont();
 
         Color aColor( COL_BLACK );
 
diff --git a/include/canvas/canvastools.hxx b/include/canvas/canvastools.hxx
index de5a76c..3881537 100644
--- a/include/canvas/canvastools.hxx
+++ b/include/canvas/canvastools.hxx
@@ -77,6 +77,7 @@ namespace com { namespace sun { namespace star { namespace awt
 } } } }
 
 class Color;
+class OutputDevice;
 
 namespace canvas
 {
@@ -579,6 +580,11 @@ namespace canvas
             ::std::size_t       mnEntries;
             bool                mbCaseSensitive;
         };
+
+        CANVASTOOLS_DLLPUBLIC void clipOutDev(const css::rendering::ViewState& viewState,
+                        const css::rendering::RenderState& renderState,
+                        OutputDevice& rOutDev,
+                        OutputDevice* p2ndOutDev=NULL);
     }
 }
 
commit e2be2c23c1ad61b3bd640be6f16d66f5cd925d38
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Dec 11 16:20:49 2014 +0000

    Related: fdo#87242 init VirtualDevice with size of surface
    
    otherwise vcl's clipping doesn't work quite right when the render text
    with vcl apis fallback is used.
    
    Manually forced in my case, but it should happen in practice with vertical
    text, so if there is a bug about vertical text not appearing in slideshows then
    this is part of the fix for that.
    
    Windows and Mac remain unchanged as initialized with 1, 1. If the same problem
    affects those platforms then they'll need to be adjusted to remember their
    height/widths from the ctor and those values plugged in here instead
    
    Change-Id: I2f82f0db0cf446d7db21f0a7ee4f8c15c7ebdb42
    (cherry picked from commit f95b0743da4239e047db8638c61f90f8bbe54306)

diff --git a/canvas/source/cairo/cairo_quartz_cairo.cxx b/canvas/source/cairo/cairo_quartz_cairo.cxx
index 390402a..b87b993 100644
--- a/canvas/source/cairo/cairo_quartz_cairo.cxx
+++ b/canvas/source/cairo/cairo_quartz_cairo.cxx
@@ -269,7 +269,7 @@ namespace cairo
         aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
         aSystemGraphicsData.rCGContext = getCGContext();
         return boost::shared_ptr<VirtualDevice>(
-            new VirtualDevice( &aSystemGraphicsData, getDepth() ));
+            new VirtualDevice( &aSystemGraphicsData, Size(1, 1), getDepth() ));
     }
 
     /**
diff --git a/canvas/source/cairo/cairo_win32_cairo.cxx b/canvas/source/cairo/cairo_win32_cairo.cxx
index 8d4a4d2..6e1cf6f 100644
--- a/canvas/source/cairo/cairo_win32_cairo.cxx
+++ b/canvas/source/cairo/cairo_win32_cairo.cxx
@@ -197,7 +197,7 @@ namespace cairo
         aSystemGraphicsData.hDC = cairo_win32_surface_get_dc( mpSurface.get() );
 
         return boost::shared_ptr<VirtualDevice>(
-            new VirtualDevice( &aSystemGraphicsData, sal::static_int_cast<USHORT>(getDepth()) ));
+            new VirtualDevice( &aSystemGraphicsData, Size(1, 1), sal::static_int_cast<USHORT>(getDepth()) ));
     }
 
 
diff --git a/canvas/source/cairo/cairo_xlib_cairo.cxx b/canvas/source/cairo/cairo_xlib_cairo.cxx
index a9e2069..ae9cecb 100644
--- a/canvas/source/cairo/cairo_xlib_cairo.cxx
+++ b/canvas/source/cairo/cairo_xlib_cairo.cxx
@@ -278,8 +278,13 @@ namespace cairo
         aSystemGraphicsData.hDrawable = getDrawable();
         aSystemGraphicsData.pXRenderFormat = getRenderFormat();
 
+        int width = cairo_xlib_surface_get_width(mpSurface.get());
+        int height = cairo_xlib_surface_get_height(mpSurface.get());
+
         return boost::shared_ptr<VirtualDevice>(
-            new VirtualDevice( &aSystemGraphicsData, std::max( getDepth(), 0 ) ));
+            new VirtualDevice(&aSystemGraphicsData,
+                              Size(width, height),
+                              std::max(getDepth(), 0)));
     }
 
     /**
diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 261b2f6..ce32535 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -550,7 +550,7 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
     SvpSalInstance* pSalInstance = static_cast< SvpSalInstance* >(pSVData->mpDefInst);
     pSalInstance->setBitCountFormatMapping( 32, ::basebmp::FORMAT_THIRTYTWO_BIT_TC_MASK_RGBA );
 
-    VirtualDevice aDevice(0, (sal_uInt16)32);
+    VirtualDevice aDevice(0, Size(1, 1), (sal_uInt16)32);
     boost::shared_array< sal_uInt8 > aBuffer( pBuffer, NoDelete< sal_uInt8 >() );
     aDevice.SetOutputSizePixelScaleOffsetAndBuffer(
                 Size(nCanvasWidth, nCanvasHeight), Fraction(1.0), Point(),
diff --git a/include/vcl/virdev.hxx b/include/vcl/virdev.hxx
index 624cb2f..b6361bf 100644
--- a/include/vcl/virdev.hxx
+++ b/include/vcl/virdev.hxx
@@ -116,7 +116,8 @@ public:
         Any rendering will happen directly on the context and not on any intermediate bitmap.
         Note: This might not be supported on all platforms !
     */
-    explicit            VirtualDevice( const SystemGraphicsData *pData, sal_uInt16 nBitCount );
+    explicit            VirtualDevice(const SystemGraphicsData *pData, const Size &rSize,
+                                      sal_uInt16 nBitCount);
 
     virtual             ~VirtualDevice();
 
diff --git a/vcl/source/gdi/virdev.cxx b/vcl/source/gdi/virdev.cxx
index 063bef1..eec2fa9 100644
--- a/vcl/source/gdi/virdev.cxx
+++ b/vcl/source/gdi/virdev.cxx
@@ -241,13 +241,15 @@ VirtualDevice::VirtualDevice( const OutputDevice& rCompDev, sal_uInt16 nBitCount
     mnAlphaDepth = sal::static_int_cast<sal_Int8>(nAlphaBitCount);
 }
 
-VirtualDevice::VirtualDevice( const SystemGraphicsData *pData, sal_uInt16 nBitCount )
+VirtualDevice::VirtualDevice(const SystemGraphicsData *pData, const Size &rSize,
+                             sal_uInt16 nBitCount)
 :   mpVirDev( NULL ),
     meRefDevMode( REFDEV_NONE )
 {
     SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << nBitCount << " )" );
 
-    ImplInitVirDev( Application::GetDefaultDevice(), 1, 1, nBitCount, pData );
+    ImplInitVirDev(Application::GetDefaultDevice(), rSize.Width(), rSize.Height(),
+                   nBitCount, pData);
 }
 
 VirtualDevice::~VirtualDevice()


More information about the Libreoffice-commits mailing list