[Libreoffice-commits] core.git: Branch 'libreoffice-4-1' - svx/source
Armin Le Grand
alg at apache.org
Mon Nov 18 12:12:53 PST 2013
svx/source/unodraw/UnoGraphicExporter.cxx | 91 ++++++++++++++++++++++--------
1 file changed, 69 insertions(+), 22 deletions(-)
New commits:
commit 6e3fb2a5c7ad75fe10e0e1b1a8de0863f3b1ac23
Author: Armin Le Grand <alg at apache.org>
Date: Mon Sep 2 12:13:37 2013 +0000
Resolves: #i122820# Corrected graphics creation...
allow bigger limits if directly requested
(cherry picked from commit 50f1445bda91cb44a1a1e8636ab0bcb6a8c4f381)
Signed-off-by: Andras Timar <andras.timar at collabora.com>
Conflicts:
svx/source/unodraw/UnoGraphicExporter.cxx
Change-Id: I33576ef9f95b9f8a9fa0ab6f6d83c93ecec8da9f
diff --git a/svx/source/unodraw/UnoGraphicExporter.cxx b/svx/source/unodraw/UnoGraphicExporter.cxx
index fb9e790..5480f24 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;
}
More information about the Libreoffice-commits
mailing list