summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorArmin Le Grand <alg@apache.org>2013-09-02 12:13:37 +0000
committerAndras Timar <andras.timar@collabora.com>2013-11-18 21:21:15 +0100
commit6e3fb2a5c7ad75fe10e0e1b1a8de0863f3b1ac23 (patch)
treec8c7b2683bea60b674fcb9e8a21df872ef142dbf
parent82bce2c10fe5718a3a51125ce0c284c13315d00d (diff)
Resolves: #i122820# Corrected graphics creation...
allow bigger limits if directly requested (cherry picked from commit 50f1445bda91cb44a1a1e8636ab0bcb6a8c4f381) Signed-off-by: Andras Timar <andras.timar@collabora.com> Conflicts: svx/source/unodraw/UnoGraphicExporter.cxx Change-Id: I33576ef9f95b9f8a9fa0ab6f6d83c93ecec8da9f
-rw-r--r--svx/source/unodraw/UnoGraphicExporter.cxx91
1 files changed, 69 insertions, 22 deletions
diff --git a/svx/source/unodraw/UnoGraphicExporter.cxx b/svx/source/unodraw/UnoGraphicExporter.cxx
index fb9e790bd308..5480f2457fe3 100644
--- a/svx/source/unodraw/UnoGraphicExporter.cxx
+++ b/svx/source/unodraw/UnoGraphicExporter.cxx
@@ -210,6 +210,7 @@ namespace svx
{
// use new primitive conversion tooling
basegfx::B2DRange aRange(basegfx::B2DPoint(0.0, 0.0));
+ sal_uInt32 nMaximumQuadraticPixels(500000);
if(pSize)
{
@@ -218,6 +219,10 @@ namespace svx
const Size aSize100th(Application::GetDefaultDevice()->PixelToLogic(*pSize, MapMode(MAP_100TH_MM)));
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
{
@@ -227,13 +232,42 @@ namespace svx
aRange.expand(basegfx::B2DPoint(aSize100th.Width(), aSize100th.Height()));
}
- aBmpEx = convertMetafileToBitmapEx(rMtf, aRange);
+ aBmpEx = convertMetafileToBitmapEx(rMtf, aRange, nMaximumQuadraticPixels);
}
else
{
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(
- pSize ? *pSize : Size(0, 0),
+ aTargetSize,
true, // allow unlimited size
aDrawinglayerOpt.IsAntiAliasing(),
aDrawinglayerOpt.IsSnapHorVerLinesToDiscrete());
@@ -414,26 +448,39 @@ VirtualDevice* GraphicExporter::CreatePageVDev( SdrPage* pPage, sal_uIntPtr nWid
}
pVDev->SetMapMode( aMM );
-#ifdef DBG_UTIL
- bool bAbort = !
-#endif
- pVDev->SetOutputSize(aPageSize);
- DBG_ASSERT(!bAbort, "virt. Device nicht korrekt erzeugt");
-
- SdrView* pView = new SdrView(mpDoc, pVDev);
- pView->SetPageVisible( sal_False );
- pView->SetBordVisible( sal_False );
- pView->SetGridVisible( sal_False );
- pView->SetHlplVisible( sal_False );
- pView->SetGlueVisible( sal_False );
- pView->ShowSdrPage(pPage);
- Region aRegion (Rectangle( aPoint, aPageSize ) );
-
- ImplExportCheckVisisbilityRedirector aRedirector( mpCurrentPage );
-
- pView->CompleteRedraw(pVDev, aRegion, &aRedirector);
-
- delete pView;
+ bool bSuccess(false);
+
+ // #i122820# If available, use pixel size directly
+ if(nWidthPixel && nHeightPixel)
+ {
+ bSuccess = pVDev->SetOutputSizePixel(Size(nWidthPixel, nHeightPixel));
+ }
+ else
+ {
+ bSuccess = pVDev->SetOutputSize(aPageSize);
+ }
+
+ if(bSuccess)
+ {
+ SdrView* pView = new SdrView(mpDoc, pVDev);
+ pView->SetPageVisible( sal_False );
+ pView->SetBordVisible( sal_False );
+ pView->SetGridVisible( sal_False );
+ pView->SetHlplVisible( sal_False );
+ pView->SetGlueVisible( sal_False );
+ pView->ShowSdrPage(pPage);
+ Region aRegion (Rectangle( aPoint, aPageSize ) );
+
+ ImplExportCheckVisisbilityRedirector aRedirector( mpCurrentPage );
+
+ pView->CompleteRedraw(pVDev, aRegion, &aRedirector);
+ delete pView;
+ }
+ else
+ {
+ OSL_ENSURE(false, "Could not get a VirtualDevice of requested size (!)");
+ }
+
return pVDev;
}