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