Kaydet (Commit) 89d01a7d authored tarafından Armin Le Grand's avatar Armin Le Grand Kaydeden (comit) Caolán McNamara

Resolves: #i122820# Corrected graphics creation...

allow bigger limits if directly requested

(cherry picked from commit 50f1445b)

Conflicts:
	svx/source/unodraw/UnoGraphicExporter.cxx

Change-Id: I33576ef9f95b9f8a9fa0ab6f6d83c93ecec8da9f
üst d649afe8
...@@ -209,6 +209,7 @@ namespace svx ...@@ -209,6 +209,7 @@ namespace svx
{ {
// use new primitive conversion tooling // use new primitive conversion tooling
basegfx::B2DRange aRange(basegfx::B2DPoint(0.0, 0.0)); basegfx::B2DRange aRange(basegfx::B2DPoint(0.0, 0.0));
sal_uInt32 nMaximumQuadraticPixels(500000);
if(pSize) if(pSize)
{ {
...@@ -217,6 +218,10 @@ namespace svx ...@@ -217,6 +218,10 @@ namespace svx
const Size aSize100th(Application::GetDefaultDevice()->PixelToLogic(*pSize, MapMode(MAP_100TH_MM))); const Size aSize100th(Application::GetDefaultDevice()->PixelToLogic(*pSize, MapMode(MAP_100TH_MM)));
aRange.expand(basegfx::B2DPoint(aSize100th.Width(), aSize100th.Height())); aRange.expand(basegfx::B2DPoint(aSize100th.Width(), aSize100th.Height()));
// when explicitely pixels are requested from the GraphicExporter, use a *very* high limit
// of 16gb (4096x4096 pixels), else use the default for the converters
nMaximumQuadraticPixels = std::min(sal_uInt32(4096 * 4096), sal_uInt32(pSize->Width() * pSize->Height()));
} }
else else
{ {
...@@ -226,13 +231,42 @@ namespace svx ...@@ -226,13 +231,42 @@ namespace svx
aRange.expand(basegfx::B2DPoint(aSize100th.Width(), aSize100th.Height())); aRange.expand(basegfx::B2DPoint(aSize100th.Width(), aSize100th.Height()));
} }
aBmpEx = convertMetafileToBitmapEx(rMtf, aRange); aBmpEx = convertMetafileToBitmapEx(rMtf, aRange, nMaximumQuadraticPixels);
} }
else else
{ {
const SvtOptionsDrawinglayer aDrawinglayerOpt; const SvtOptionsDrawinglayer aDrawinglayerOpt;
Size aTargetSize(0, 0);
if(pSize)
{
// #i122820# If a concrete target size in pixels is given, use it
aTargetSize = *pSize;
// get hairline and full bound rect to evtl. reduce given target pixel size when
// it is known that it will be expanded to get the right and bottom hairlines right
Rectangle aHairlineRect;
const Rectangle aRect(rMtf.GetBoundRect(*Application::GetDefaultDevice(), &aHairlineRect));
if(!aRect.IsEmpty() && !aHairlineRect.IsEmpty())
{
if(aRect.Right() == aHairlineRect.Right() || aRect.Bottom() == aHairlineRect.Bottom())
{
if(aTargetSize.Width())
{
aTargetSize.Width() -= 1;
}
if(aTargetSize.Height())
{
aTargetSize.Height() -= 1;
}
}
}
}
const GraphicConversionParameters aParameters( const GraphicConversionParameters aParameters(
pSize ? *pSize : Size(0, 0), aTargetSize,
true, // allow unlimited size true, // allow unlimited size
aDrawinglayerOpt.IsAntiAliasing(), aDrawinglayerOpt.IsAntiAliasing(),
aDrawinglayerOpt.IsSnapHorVerLinesToDiscrete()); aDrawinglayerOpt.IsSnapHorVerLinesToDiscrete());
...@@ -413,12 +447,20 @@ VirtualDevice* GraphicExporter::CreatePageVDev( SdrPage* pPage, sal_uIntPtr nWid ...@@ -413,12 +447,20 @@ VirtualDevice* GraphicExporter::CreatePageVDev( SdrPage* pPage, sal_uIntPtr nWid
} }
pVDev->SetMapMode( aMM ); pVDev->SetMapMode( aMM );
#ifdef DBG_UTIL bool bSuccess(false);
bool bAbort = !
#endif // #i122820# If available, use pixel size directly
pVDev->SetOutputSize(aPageSize); if(nWidthPixel && nHeightPixel)
DBG_ASSERT(!bAbort, "virt. Device nicht korrekt erzeugt"); {
bSuccess = pVDev->SetOutputSizePixel(Size(nWidthPixel, nHeightPixel));
}
else
{
bSuccess = pVDev->SetOutputSize(aPageSize);
}
if(bSuccess)
{
SdrView* pView = new SdrView(mpDoc, pVDev); SdrView* pView = new SdrView(mpDoc, pVDev);
pView->SetPageVisible( sal_False ); pView->SetPageVisible( sal_False );
pView->SetBordVisible( sal_False ); pView->SetBordVisible( sal_False );
...@@ -431,8 +473,13 @@ VirtualDevice* GraphicExporter::CreatePageVDev( SdrPage* pPage, sal_uIntPtr nWid ...@@ -431,8 +473,13 @@ VirtualDevice* GraphicExporter::CreatePageVDev( SdrPage* pPage, sal_uIntPtr nWid
ImplExportCheckVisisbilityRedirector aRedirector( mpCurrentPage ); ImplExportCheckVisisbilityRedirector aRedirector( mpCurrentPage );
pView->CompleteRedraw(pVDev, aRegion, &aRedirector); pView->CompleteRedraw(pVDev, aRegion, &aRedirector);
delete pView; delete pView;
}
else
{
OSL_ENSURE(false, "Could not get a VirtualDevice of requested size (!)");
}
return pVDev; return pVDev;
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment