summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMiklos Vajna <vmiklos@collabora.co.uk>2018-07-25 17:02:21 +0200
committerMiklos Vajna <vmiklos@collabora.co.uk>2018-07-26 09:03:37 +0200
commit919ccaba419531d689231b76a43ab29c6a9ec65a (patch)
tree404ef0245afc5997b57776d2e2a89bdd8e6e71f0
parent07ad18ed6d90773a1e8120057929fa3a1dff2665 (diff)
tdf#118860 svx opengl: avoid SalBitmap creation without solar mutex
The bugdoc has 2 slides. When switching to the second slide, the graphic is loaded in the background, but OpenGLSalBitmap::Create() can't work correctly if the caller doesn't own the solar mutex. This already asserts in OpenGLContext::prepareForYield() in a less obvious way. Focus on the correctness, so just hold the solar mutex during the whole ImportGrpahic() call. If it turns out that the purpose of running this on a thread is to avoid synchronous network traffic, then the data could be first copied to a memory stream, and only then take the lock + import the graphic. Change-Id: I88203c12b4e7a5f2b689928c01e2ba953c5b13c5 Reviewed-on: https://gerrit.libreoffice.org/57970 Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk> Reviewed-by: Noel Grandin <noel.grandin@collabora.co.uk> Tested-by: Jenkins
-rw-r--r--svx/source/svdraw/svdograf.cxx3
-rw-r--r--vcl/opengl/salbmp.cxx6
2 files changed, 9 insertions, 0 deletions
diff --git a/svx/source/svdraw/svdograf.cxx b/svx/source/svdraw/svdograf.cxx
index 4a73f2bd8bb3..025206cbccde 100644
--- a/svx/source/svdraw/svdograf.cxx
+++ b/svx/source/svdraw/svdograf.cxx
@@ -94,6 +94,9 @@ const Graphic ImpLoadLinkedGraphic( const OUString& aFileName, const OUString& a
aFilterData[ 0 ].Name = "CreateNativeLink";
aFilterData[ 0 ].Value <<= true;
+ // Need to own the solar mutex while creating a SalBitmap.
+ SolarMutexGuard aGuard;
+
// #i123042# for e.g SVG the path is needed, so hand it over here. I have no real idea
// what consequences this may have; maybe this is not handed over by purpose here. Not
// handing it over means that any GraphicFormat that internally needs a path as base
diff --git a/vcl/opengl/salbmp.cxx b/vcl/opengl/salbmp.cxx
index caade8ceacce..33fc720ef497 100644
--- a/vcl/opengl/salbmp.cxx
+++ b/vcl/opengl/salbmp.cxx
@@ -117,6 +117,7 @@ OpenGLSalBitmap::~OpenGLSalBitmap()
bool OpenGLSalBitmap::Create( const OpenGLTexture& rTex, long nX, long nY, long nWidth, long nHeight )
{
+ DBG_TESTSOLARMUTEX();
static const BitmapPalette aEmptyPalette;
OpenGLVCLContextZone aContextZone;
@@ -160,6 +161,7 @@ bool OpenGLSalBitmap::Create( const OpenGLTexture& rTex, long nX, long nY, long
bool OpenGLSalBitmap::Create( const Size& rSize, sal_uInt16 nBits, const BitmapPalette& rBitmapPalette )
{
+ DBG_TESTSOLARMUTEX();
OpenGLVCLContextZone aContextZone;
Destroy();
@@ -185,16 +187,19 @@ bool OpenGLSalBitmap::Create( const Size& rSize, sal_uInt16 nBits, const BitmapP
bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp )
{
+ DBG_TESTSOLARMUTEX();
return Create( rSalBmp, rSalBmp.GetBitCount() );
}
bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, SalGraphics* pGraphics )
{
+ DBG_TESTSOLARMUTEX();
return Create( rSalBmp, pGraphics ? pGraphics->GetBitCount() : rSalBmp.GetBitCount() );
}
bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, sal_uInt16 nNewBitCount )
{
+ DBG_TESTSOLARMUTEX();
OpenGLZone aZone;
// check that carefully only in the debug mode
@@ -233,6 +238,7 @@ bool OpenGLSalBitmap::Create( const SalBitmap& rSalBmp, sal_uInt16 nNewBitCount
bool OpenGLSalBitmap::Create( const css::uno::Reference< css::rendering::XBitmapCanvas >& /*xBitmapCanvas*/, Size& /*rSize*/, bool /*bMask*/ )
{
+ DBG_TESTSOLARMUTEX();
// TODO Is this method needed?
return false;
}