summaryrefslogtreecommitdiff
path: root/vcl
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2018-04-11 11:06:37 +0100
committerAndras Timar <andras.timar@collabora.com>2018-04-23 16:44:56 +0200
commit33f943e14e27319848c925b9d06bf0cba7b5e1b5 (patch)
treeb345d5bf68e2ea9e28fd470b9290d07d301a625a /vcl
parentf2116ba0af70077f3039d73ca970febd96233c15 (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.cxx20
-rw-r--r--vcl/headless/svpinst.cxx6
-rw-r--r--vcl/headless/svpvd.cxx40
-rw-r--r--vcl/inc/headless/svpgdi.hxx1
-rw-r--r--vcl/inc/headless/svpvd.hxx9
-rw-r--r--vcl/qt5/Qt5Instance.cxx8
-rw-r--r--vcl/unx/gtk/gtkinst.cxx2
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