Related: fdo#87242 init VirtualDevice with size of surface

otherwise vcl's clipping doesn't work quite right when the render text
with vcl apis fallback is used.

Manually forced in my case, but it should happen in practice with vertical
text, so if there is a bug about vertical text not appearing in slideshows then
this is part of the fix for that.

Windows and Mac remain unchanged as initialized with 1, 1. If the same problem
affects those platforms then they'll need to be adjusted to remember their
height/widths from the ctor and those values plugged in here instead

Change-Id: I2f82f0db0cf446d7db21f0a7ee4f8c15c7ebdb42
This commit is contained in:
Caolán McNamara
2014-12-11 16:20:49 +00:00
parent 5a410df4ff
commit f95b0743da
6 changed files with 15 additions and 7 deletions

View File

@@ -269,7 +269,7 @@ namespace cairo
aSystemGraphicsData.nSize = sizeof(SystemGraphicsData);
aSystemGraphicsData.rCGContext = getCGContext();
return boost::shared_ptr<VirtualDevice>(
new VirtualDevice( &aSystemGraphicsData, getDepth() ));
new VirtualDevice( &aSystemGraphicsData, Size(1, 1), getDepth() ));
}
/**

View File

@@ -197,7 +197,7 @@ namespace cairo
aSystemGraphicsData.hDC = cairo_win32_surface_get_dc( mpSurface.get() );
return boost::shared_ptr<VirtualDevice>(
new VirtualDevice( &aSystemGraphicsData, sal::static_int_cast<USHORT>(getDepth()) ));
new VirtualDevice( &aSystemGraphicsData, Size(1, 1), sal::static_int_cast<USHORT>(getDepth()) ));
}

View File

@@ -278,8 +278,13 @@ namespace cairo
aSystemGraphicsData.hDrawable = getDrawable();
aSystemGraphicsData.pXRenderFormat = getRenderFormat();
int width = cairo_xlib_surface_get_width(mpSurface.get());
int height = cairo_xlib_surface_get_height(mpSurface.get());
return boost::shared_ptr<VirtualDevice>(
new VirtualDevice( &aSystemGraphicsData, std::max( getDepth(), 0 ) ));
new VirtualDevice(&aSystemGraphicsData,
Size(width, height),
std::max(getDepth(), 0)));
}
/**

View File

@@ -578,7 +578,7 @@ void doc_paintTile (LibreOfficeKitDocument* pThis,
SvpSalInstance* pSalInstance = static_cast< SvpSalInstance* >(pSVData->mpDefInst);
pSalInstance->setBitCountFormatMapping( 32, ::basebmp::FORMAT_THIRTYTWO_BIT_TC_MASK_RGBA );
VirtualDevice aDevice(0, (sal_uInt16)32);
VirtualDevice aDevice(0, Size(1, 1), (sal_uInt16)32);
boost::shared_array< sal_uInt8 > aBuffer( pBuffer, NoDelete< sal_uInt8 >() );
aDevice.SetOutputSizePixelScaleOffsetAndBuffer(
Size(nCanvasWidth, nCanvasHeight), Fraction(1.0), Point(),

View File

@@ -116,7 +116,8 @@ public:
Any rendering will happen directly on the context and not on any intermediate bitmap.
Note: This might not be supported on all platforms !
*/
explicit VirtualDevice( const SystemGraphicsData *pData, sal_uInt16 nBitCount );
explicit VirtualDevice(const SystemGraphicsData *pData, const Size &rSize,
sal_uInt16 nBitCount);
virtual ~VirtualDevice();

View File

@@ -241,13 +241,15 @@ VirtualDevice::VirtualDevice( const OutputDevice& rCompDev, sal_uInt16 nBitCount
mnAlphaDepth = sal::static_int_cast<sal_Int8>(nAlphaBitCount);
}
VirtualDevice::VirtualDevice( const SystemGraphicsData *pData, sal_uInt16 nBitCount )
VirtualDevice::VirtualDevice(const SystemGraphicsData *pData, const Size &rSize,
sal_uInt16 nBitCount)
: mpVirDev( NULL ),
meRefDevMode( REFDEV_NONE )
{
SAL_INFO( "vcl.gdi", "VirtualDevice::VirtualDevice( " << nBitCount << " )" );
ImplInitVirDev( Application::GetDefaultDevice(), 1, 1, nBitCount, pData );
ImplInitVirDev(Application::GetDefaultDevice(), rSize.Width(), rSize.Height(),
nBitCount, pData);
}
VirtualDevice::~VirtualDevice()