diff options
author | Caolán McNamara <caolanm@redhat.com> | 2018-04-11 11:06:37 +0100 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2018-04-23 16:44:56 +0200 |
commit | 33f943e14e27319848c925b9d06bf0cba7b5e1b5 (patch) | |
tree | b345d5bf68e2ea9e28fd470b9290d07d301a625a /vcl | |
parent | f2116ba0af70077f3039d73ca970febd96233c15 (diff) |
Related: rhbz#1396729 use cairo_surface_create_similar
where we can
Change-Id: If6fd729a9cbf834faef33586b5bd886aad2fbe1d
Reviewed-on: https://gerrit.libreoffice.org/52726
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
(cherry picked from commit b524de950c6eb0bc61d05d41fe69b67ab59b16c6)
cairo_surface_create_similar_image is >= cairo 1.12.0
(cherry picked from commit 2ca4b505b25e13c9f422c28252f5b7533b8e3270)
Change-Id: I1805e5680beff6c632016686aa661efe25a8c2f8
Reviewed-on: https://gerrit.libreoffice.org/53021
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
(cherry picked from commit 28f2941680f850e88228e45699ac612ce036cf16)
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/headless/svpgdi.cxx | 20 | ||||
-rw-r--r-- | vcl/headless/svpinst.cxx | 6 | ||||
-rw-r--r-- | vcl/headless/svpvd.cxx | 40 | ||||
-rw-r--r-- | vcl/inc/headless/svpgdi.hxx | 1 | ||||
-rw-r--r-- | vcl/inc/headless/svpvd.hxx | 9 | ||||
-rw-r--r-- | vcl/qt5/Qt5Instance.cxx | 8 | ||||
-rw-r--r-- | vcl/unx/gtk/gtkinst.cxx | 2 |
7 files changed, 55 insertions, 31 deletions
diff --git a/vcl/headless/svpgdi.cxx b/vcl/headless/svpgdi.cxx index d717dc7e39b3..eb352aeb3248 100644 --- a/vcl/headless/svpgdi.cxx +++ b/vcl/headless/svpgdi.cxx @@ -1351,7 +1351,13 @@ SalBitmap* SvpSalGraphics::getBitmap( long nX, long nY, long nWidth, long nHeigh SalColor SvpSalGraphics::getPixel( long nX, long nY ) { - cairo_surface_t *target = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, 1, 1); +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0) + cairo_surface_t *target = cairo_surface_create_similar_image(m_pSurface, +#else + cairo_surface_t *target = cairo_image_surface_create( +#endif + CAIRO_FORMAT_ARGB32, 1, 1); + cairo_t* cr = cairo_create(target); cairo_rectangle(cr, 0, 0, 1, 1); @@ -1515,9 +1521,15 @@ cairo_surface_t* SvpSalGraphics::createCairoSurface(const BitmapBuffer *pBuffer) cairo_t* SvpSalGraphics::createTmpCompatibleCairoContext() const { - cairo_surface_t *target = cairo_image_surface_create(CAIRO_FORMAT_ARGB32, - m_aFrameSize.getX() * m_fScale, - m_aFrameSize.getY() * m_fScale); +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 12, 0) + cairo_surface_t *target = cairo_surface_create_similar_image(m_pSurface, +#else + cairo_surface_t *target = cairo_image_surface_create( +#endif + CAIRO_FORMAT_ARGB32, + m_aFrameSize.getX() * m_fScale, + m_aFrameSize.getY() * m_fScale); + #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) cairo_surface_set_device_scale(target, m_fScale, m_fScale); #endif diff --git a/vcl/headless/svpinst.cxx b/vcl/headless/svpinst.cxx index 41bc04a2d3e4..c7cd3ae0f963 100644 --- a/vcl/headless/svpinst.cxx +++ b/vcl/headless/svpinst.cxx @@ -234,12 +234,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->getSurface()); pNew->SetSize( nDX, nDY ); return pNew; } diff --git a/vcl/headless/svpvd.cxx b/vcl/headless/svpvd.cxx index cf78ebc8eb7d..4172fc383744 100644 --- a/vcl/headless/svpvd.cxx +++ b/vcl/headless/svpvd.cxx @@ -30,9 +30,18 @@ using namespace basegfx; +SvpSalVirtualDevice::SvpSalVirtualDevice(DeviceFormat eFormat, cairo_surface_t* pRefSurface) + : m_eFormat(eFormat) + , m_pRefSurface(pRefSurface) + , m_pSurface(nullptr) +{ + cairo_surface_reference(m_pRefSurface); +} + SvpSalVirtualDevice::~SvpSalVirtualDevice() { cairo_surface_destroy(m_pSurface); + cairo_surface_destroy(m_pRefSurface); } SalGraphics* SvpSalVirtualDevice::AcquireGraphics() @@ -67,9 +76,6 @@ bool SvpSalVirtualDevice::SetSizeUsingBuffer( long nNewDX, long nNewDY, { m_aFrameSize = basegfx::B2IVector(nNewDX, nNewDY); - nNewDX *= m_fScale; - nNewDY *= m_fScale; - if (m_pSurface) { cairo_surface_destroy(m_pSurface); @@ -77,23 +83,29 @@ 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(m_pRefSurface, CAIRO_CONTENT_ALPHA, nNewDX, nNewDY); } - else + else if (pBuffer) { - m_pSurface = pBuffer ? - cairo_image_surface_create_for_data(pBuffer, CAIRO_FORMAT_ARGB32, - nNewDX, nNewDY, - cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, nNewDX)) - : - cairo_image_surface_create(CAIRO_FORMAT_ARGB32, - nNewDX, nNewDY); - } +#if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) + double fXScale, fYScale; + cairo_surface_get_device_scale(m_pRefSurface, &fXScale, &fYScale); + nNewDX *= fXScale; + nNewDY *= fYScale; +#endif + + m_pSurface = cairo_image_surface_create_for_data(pBuffer, CAIRO_FORMAT_ARGB32, + nNewDX, nNewDY, cairo_format_stride_for_width(CAIRO_FORMAT_ARGB32, nNewDX)); #if CAIRO_VERSION >= CAIRO_VERSION_ENCODE(1, 14, 0) - cairo_surface_set_device_scale(m_pSurface, m_fScale, m_fScale); + cairo_surface_set_device_scale(m_pSurface, fXScale, fYScale); #endif + } + else + { + m_pSurface = cairo_surface_create_similar(m_pRefSurface, CAIRO_CONTENT_COLOR_ALPHA, nNewDX, nNewDY); + } // update device in existing graphics for (auto const& graphic : m_aGraphics) diff --git a/vcl/inc/headless/svpgdi.hxx b/vcl/inc/headless/svpgdi.hxx index b14be042ed67..f8cee35ae9d6 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..51d6af9cb499 100644 --- a/vcl/inc/headless/svpvd.hxx +++ b/vcl/inc/headless/svpvd.hxx @@ -30,18 +30,13 @@ 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, cairo_surface_t* pRefSurface); virtual ~SvpSalVirtualDevice() override; // SalVirtualDevice diff --git a/vcl/qt5/Qt5Instance.cxx b/vcl/qt5/Qt5Instance.cxx index c61a29a01935..0d128c2bc97c 100644 --- a/vcl/qt5/Qt5Instance.cxx +++ b/vcl/qt5/Qt5Instance.cxx @@ -84,13 +84,15 @@ 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->getSurface()); pVD->SetSize(nDX, nDY); return pVD; } diff --git a/vcl/unx/gtk/gtkinst.cxx b/vcl/unx/gtk/gtkinst.cxx index 62b02a36a33f..ee03a340a12f 100644 --- a/vcl/unx/gtk/gtkinst.cxx +++ b/vcl/unx/gtk/gtkinst.cxx @@ -336,7 +336,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->getSurface()); pNew->SetSize( nDX, nDY ); return pNew; #else |