Author: alg
Date: Thu Jan 12 14:57:24 2012
New Revision: 1230574
URL: http://svn.apache.org/viewvc?rev=1230574&view=rev
Log:
#116758# Secured VDev buffer device to Vcl deinit
Modified:
incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
Modified:
incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
URL:
http://svn.apache.org/viewvc/incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx?rev=1230574&r1=1230573&r2=1230574&view=diff
==============================================================================
---
incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
(original)
+++
incubator/ooo/trunk/main/drawinglayer/source/processor2d/vclhelperbufferdevice.cxx
Thu Jan 12 14:57:24 2012
@@ -31,6 +31,7 @@
#include <tools/stream.hxx>
#include <vcl/timer.hxx>
#include <comphelper/broadcasthelper.hxx>
+#include <vcl/lazydelete.hxx>
//////////////////////////////////////////////////////////////////////////////
// buffered VDev usage
@@ -191,7 +192,14 @@ namespace
namespace drawinglayer
{
// static global VDev buffer for the VclProcessor2D's
(VclMetafileProcessor2D and VclPixelProcessor2D)
- static VDevBuffer aVDevBuffer;
+ VDevBuffer& getVDevBuffer()
+ {
+ // secure global instance with Vcl's safe desroyer of external (seen by
+ // library base) stuff, the remembered VDevs need to be deleted before
+ // Vcl's deinit
+ static vcl::DeleteOnDeinit< VDevBuffer > aVDevBuffer(new VDevBuffer());
+ return *aVDevBuffer.get();
+ }
impBufferDevice::impBufferDevice(
OutputDevice& rOutDev,
@@ -213,7 +221,7 @@ namespace drawinglayer
if(isVisible())
{
- mpContent = aVDevBuffer.alloc(mrOutDev, maDestPixel.GetSize(),
false, false);
+ mpContent = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(),
false, false);
// #i93485# assert when copying from window to VDev is used
OSL_ENSURE(mrOutDev.GetOutDevType() != OUTDEV_WINDOW,
@@ -243,17 +251,17 @@ namespace drawinglayer
{
if(mpContent)
{
- aVDevBuffer.free(*mpContent);
+ getVDevBuffer().free(*mpContent);
}
if(mpMask)
{
- aVDevBuffer.free(*mpMask);
+ getVDevBuffer().free(*mpMask);
}
if(mpAlpha)
{
- aVDevBuffer.free(*mpAlpha);
+ getVDevBuffer().free(*mpAlpha);
}
}
@@ -328,7 +336,7 @@ namespace drawinglayer
OSL_ENSURE(mpContent, "impBufferDevice: No content, check isVisible()
before accessing (!)");
if(!mpMask)
{
- mpMask = aVDevBuffer.alloc(mrOutDev, maDestPixel.GetSize(), true,
true);
+ mpMask = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(),
true, true);
mpMask->SetMapMode(mpContent->GetMapMode());
// do NOT copy AA flag for mask!
@@ -342,7 +350,7 @@ namespace drawinglayer
OSL_ENSURE(mpContent, "impBufferDevice: No content, check isVisible()
before accessing (!)");
if(!mpAlpha)
{
- mpAlpha = aVDevBuffer.alloc(mrOutDev, maDestPixel.GetSize(), true,
false);
+ mpAlpha = getVDevBuffer().alloc(mrOutDev, maDestPixel.GetSize(),
true, false);
mpAlpha->SetMapMode(mpContent->GetMapMode());
// copy AA flag for new target; masking needs to be smooth