vcl/headless/svpgdi.cxx           |    4 ++--
 vcl/headless/svpinst.cxx          |    6 ++++--
 vcl/headless/svpvd.cxx            |   14 ++++++++++++--
 vcl/inc/headless/svpgdi.hxx       |    1 +
 vcl/inc/headless/svpvd.hxx        |    8 ++------
 vcl/qt5/Qt5Instance.cxx           |    9 ++++++---
 vcl/source/bitmap/BitmapTools.cxx |    4 ++--
 vcl/unx/gtk/gtkinst.cxx           |    2 +-
 8 files changed, 30 insertions(+), 18 deletions(-)

New commits:
commit 6eea5cffc4399fd31f97b19359eb6ae9c75d21b8
Author: Caolán McNamara <caol...@redhat.com>
Date:   Wed Apr 11 11:06:37 2018 +0100

    Related: rhbz#1396729 use cairo_surface_create_similar_image
    
    don't expect it to make much of a difference but does allow bubbling
    the initial widget surface type around through the virtual devices
    
    Change-Id: I414a4b10b0ae4195345b81d9da7f748652d4f566
    Reviewed-on: https://gerrit.libreoffice.org/52718
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Caolán McNamara <caol...@redhat.com>
    Tested-by: Caolán McNamara <caol...@redhat.com>

diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx
index 487796755ec5..cad5f5ea21a5 100644
--- a/vcl/headless/svpgdi.cxx
+++ b/vcl/headless/svpgdi.cxx
@@ -1320,7 +1320,7 @@ SalBitmap* SvpSalGraphics::getBitmap( long nX, long nY, 
long nWidth, long nHeigh
 
 Color SvpSalGraphics::getPixel( long nX, long nY )
 {
-    cairo_surface_t *target = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 
1, 1);
+    cairo_surface_t *target = cairo_surface_create_similar_image(m_pSurface, 
CAIRO_FORMAT_ARGB32, 1, 1);
     cairo_t* cr = cairo_create(target);
 
     cairo_rectangle(cr, 0, 0, 1, 1);
@@ -1484,7 +1484,7 @@ cairo_surface_t* SvpSalGraphics::createCairoSurface(const 
BitmapBuffer *pBuffer)
 
 cairo_t* SvpSalGraphics::createTmpCompatibleCairoContext() const
 {
-    cairo_surface_t *target = cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
+    cairo_surface_t *target = cairo_surface_create_similar_image(m_pSurface, 
CAIRO_FORMAT_ARGB32,
                                                          m_aFrameSize.getX() * 
m_fScale,
                                                          m_aFrameSize.getY() * 
m_fScale);
 #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0)
diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx
index 412e86c55351..81a8f332723b 100644
--- a/vcl/headless/svpinst.cxx
+++ b/vcl/headless/svpinst.cxx
@@ -236,12 +236,14 @@ void SvpSalInstance::DestroyObject( SalObject* pObject )
 
 #ifndef IOS
 
-SalVirtualDevice* SvpSalInstance::CreateVirtualDevice( SalGraphics* /* 
pGraphics */,
+SalVirtualDevice* SvpSalInstance::CreateVirtualDevice( SalGraphics* pGraphics,
                                                        long &nDX, long &nDY,
                                                        DeviceFormat eFormat,
                                                        const 
SystemGraphicsData* /* pData */ )
 {
-    SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice(eFormat, 1);
+    SvpSalGraphics *pSvpSalGraphics = dynamic_cast<SvpSalGraphics*>(pGraphics);
+    assert(pSvpSalGraphics);
+    SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice(eFormat, 
pSvpSalGraphics->getScale(), pSvpSalGraphics->getSurface());
     pNew->SetSize( nDX, nDY );
     return pNew;
 }
diff --git a/vcl/headless/svpvd.cxx b/vcl/headless/svpvd.cxx
index cf78ebc8eb7d..decca08a76eb 100644
--- a/vcl/headless/svpvd.cxx
+++ b/vcl/headless/svpvd.cxx
@@ -30,9 +30,19 @@
 
 using namespace basegfx;
 
+SvpSalVirtualDevice::SvpSalVirtualDevice(DeviceFormat eFormat, double fScale, 
cairo_surface_t* pRefSurface)
+    : m_eFormat(eFormat)
+    , m_pRefSurface(pRefSurface)
+    , m_pSurface(nullptr)
+    , m_fScale(fScale)
+{
+    cairo_surface_reference(m_pRefSurface);
+}
+
 SvpSalVirtualDevice::~SvpSalVirtualDevice()
 {
     cairo_surface_destroy(m_pSurface);
+    cairo_surface_destroy(m_pRefSurface);
 }
 
 SalGraphics* SvpSalVirtualDevice::AcquireGraphics()
@@ -77,7 +87,7 @@ bool SvpSalVirtualDevice::SetSizeUsingBuffer( long nNewDX, 
long nNewDY,
 
         if (m_eFormat == DeviceFormat::BITMASK)
         {
-            m_pSurface = cairo_image_surface_create(CAIRO_FORMAT_A1,
+            m_pSurface = cairo_surface_create_similar_image(m_pRefSurface, 
CAIRO_FORMAT_A1,
                                 nNewDX, nNewDY);
         }
         else
@@ -87,7 +97,7 @@ bool SvpSalVirtualDevice::SetSizeUsingBuffer( long nNewDX, 
long nNewDY,
                                    nNewDX, nNewDY,
                                    
cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, nNewDX))
                                  :
-                             cairo_image_surface_create(CAIRO_FORMAT_ARGB32,
+                             cairo_surface_create_similar_image(m_pRefSurface, 
CAIRO_FORMAT_ARGB32,
                                    nNewDX, nNewDY);
         }
 
diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx
index 28c453d0cfbe..7569476c1600 100644
--- a/vcl/inc/headless/svpgdi.hxx
+++ b/vcl/inc/headless/svpgdi.hxx
@@ -93,6 +93,7 @@ class VCL_DLLPUBLIC SvpSalGraphics : public SalGraphics
 public:
     static GlyphCache& getPlatformGlyphCache();
     void setSurface(cairo_surface_t* pSurface, const basegfx::B2IVector& 
rSize);
+    cairo_surface_t* getSurface() const { return m_pSurface; }
     static cairo_user_data_key_t* getDamageKey();
 
 private:
diff --git a/vcl/inc/headless/svpvd.hxx b/vcl/inc/headless/svpvd.hxx
index 704488cdfae0..990915169d56 100644
--- a/vcl/inc/headless/svpvd.hxx
+++ b/vcl/inc/headless/svpvd.hxx
@@ -30,18 +30,14 @@ typedef struct _cairo_surface cairo_surface_t;
 class VCL_DLLPUBLIC SvpSalVirtualDevice : public SalVirtualDevice
 {
     DeviceFormat                        m_eFormat;
+    cairo_surface_t*                    m_pRefSurface;
     cairo_surface_t*                    m_pSurface;
     basegfx::B2IVector                  m_aFrameSize;
     double                              m_fScale;
     std::vector< SvpSalGraphics* >      m_aGraphics;
 
 public:
-    SvpSalVirtualDevice(DeviceFormat eFormat, double fScale)
-        : m_eFormat(eFormat)
-        , m_pSurface(nullptr)
-        , m_fScale(fScale)
-    {
-    }
+    SvpSalVirtualDevice(DeviceFormat eFormat, double fScale, cairo_surface_t* 
pRefSurface);
     virtual ~SvpSalVirtualDevice() override;
 
     // SalVirtualDevice
diff --git a/vcl/qt5/Qt5Instance.cxx b/vcl/qt5/Qt5Instance.cxx
index b9464fa7fc20..26f0fafcafb8 100644
--- a/vcl/qt5/Qt5Instance.cxx
+++ b/vcl/qt5/Qt5Instance.cxx
@@ -84,13 +84,16 @@ SalObject* Qt5Instance::CreateObject(SalFrame* pParent, 
SystemWindowData*, bool
 
 void Qt5Instance::DestroyObject(SalObject* pObject) { delete pObject; }
 
-SalVirtualDevice* Qt5Instance::CreateVirtualDevice(SalGraphics* /* pGraphics 
*/, long& nDX,
-                                                   long& nDY, DeviceFormat 
eFormat,
+SalVirtualDevice* Qt5Instance::CreateVirtualDevice(SalGraphics* pGraphics, 
long& nDX, long& nDY,
+                                                   DeviceFormat eFormat,
                                                    const SystemGraphicsData* 
/* pData */)
 {
     if (m_bUseCairo)
     {
-        SvpSalVirtualDevice* pVD = new SvpSalVirtualDevice(eFormat, 1);
+        SvpSalGraphics* pSvpSalGraphics = 
dynamic_cast<SvpSalGraphics*>(pGraphics);
+        assert(pSvpSalGraphics);
+        SvpSalVirtualDevice* pVD = new SvpSalVirtualDevice(eFormat, 
pSvpSalGraphics->getScale(),
+                                                           
pSvpSalGraphics->getSurface());
         pVD->SetSize(nDX, nDY);
         return pVD;
     }
diff --git a/vcl/source/bitmap/BitmapTools.cxx 
b/vcl/source/bitmap/BitmapTools.cxx
index 28fc6f0b962a..77583f28e3f9 100644
--- a/vcl/source/bitmap/BitmapTools.cxx
+++ b/vcl/source/bitmap/BitmapTools.cxx
@@ -235,8 +235,8 @@ BitmapEx* CreateFromCairoSurface(Size aSize, 
cairo_surface_t * pSurface)
 {
     // FIXME: if we could teach VCL/ about cairo handles, life could
     // be significantly better here perhaps.
-    cairo_surface_t *pPixels = cairo_image_surface_create( CAIRO_FORMAT_ARGB32,
-                                              aSize.Width(), aSize.Height() );
+    cairo_surface_t *pPixels = cairo_surface_create_similar_image(pSurface, 
CAIRO_FORMAT_ARGB32,
+                                              aSize.Width(), aSize.Height());
     cairo_t *pCairo = cairo_create( pPixels );
     if( !pPixels || !pCairo || cairo_status(pCairo) != CAIRO_STATUS_SUCCESS )
         return nullptr;
diff --git a/vcl/unx/gtk/gtkinst.cxx b/vcl/unx/gtk/gtkinst.cxx
index 1d3dbf2f0294..3899e2d5d692 100644
--- a/vcl/unx/gtk/gtkinst.cxx
+++ b/vcl/unx/gtk/gtkinst.cxx
@@ -331,7 +331,7 @@ SalVirtualDevice* GtkInstance::CreateVirtualDevice( 
SalGraphics *pG,
     (void) pGd;
     SvpSalGraphics *pSvpSalGraphics = dynamic_cast<SvpSalGraphics*>(pG);
     assert(pSvpSalGraphics);
-    SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice(eFormat, 
pSvpSalGraphics->getScale());
+    SvpSalVirtualDevice* pNew = new SvpSalVirtualDevice(eFormat, 
pSvpSalGraphics->getScale(), pSvpSalGraphics->getSurface());
     pNew->SetSize( nDX, nDY );
     return pNew;
 #else
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to