summaryrefslogtreecommitdiff
path: root/vcl/source/gdi/bitmap.cxx
diff options
context:
space:
mode:
authorMarco Cecchetti <marco.cecchetti@collabora.com>2017-05-29 21:07:10 +0200
committerMarco Cecchetti <mrcekets@gmail.com>2017-05-30 18:07:59 +0200
commit6a01c2d4cab8c3f1a4ba61e7c4e049771612127e (patch)
tree8c5ed3b60e1a1d759fa8629d851a14871ec1511a /vcl/source/gdi/bitmap.cxx
parentb0067837759006832d2ddb32d05c8d325f52c277 (diff)
tdf#107682 - Repeated images replace correct ones in exported PDF
The problem was due to the buffer acquire methods: in Bitmap::Checksum (old implementation) Bitmap::AcquireReadAccess is used to get the bitmap buffer: indeed this method relies on SalBitmap::AcquireBuffer (which is used in the new implementation) but in case the buffer acquisition fails, instead of giving up, it tries to update the imp bitmap instance embedded in the bitmap (see BitmapInfoAccess::ImplCreate). The solution is to perform this further attemp in Bitmap::Checksum when the value returned by ImpBitmap::GetChecksum is 0. Change-Id: Ib901ac941db57756e9a951bacbc573ca206316e0 Reviewed-on: https://gerrit.libreoffice.org/38165 Tested-by: Jenkins <ci@libreoffice.org> Reviewed-by: Marco Cecchetti <mrcekets@gmail.com>
Diffstat (limited to 'vcl/source/gdi/bitmap.cxx')
-rw-r--r--vcl/source/gdi/bitmap.cxx15
1 files changed, 15 insertions, 0 deletions
diff --git a/vcl/source/gdi/bitmap.cxx b/vcl/source/gdi/bitmap.cxx
index 8dc4bd07e0d3..71d5d73f15ab 100644
--- a/vcl/source/gdi/bitmap.cxx
+++ b/vcl/source/gdi/bitmap.cxx
@@ -275,6 +275,21 @@ BitmapChecksum Bitmap::GetChecksum() const
if( mxImpBmp )
{
nRet = mxImpBmp->ImplGetChecksum();
+
+ if (!nRet)
+ {
+ // nRet == 0 => probably, we were not able to acquire
+ // the buffer in SalBitmap::updateChecksum;
+ // so, we need to update the imp bitmap for this bitmap instance
+ // as we do in BitmapInfoAccess::ImplCreate
+ std::shared_ptr<ImpBitmap> xNewImpBmp(new ImpBitmap);
+ if (xNewImpBmp->ImplCreate(*mxImpBmp, GetBitCount()))
+ {
+ Bitmap* pThis = const_cast<Bitmap*>(this);
+ pThis->mxImpBmp = xNewImpBmp;
+ nRet = mxImpBmp->ImplGetChecksum();
+ }
+ }
}
return nRet;