Author: alg
Date: Tue Sep  3 09:42:43 2013
New Revision: 1519619

URL: http://svn.apache.org/r1519619
Log:
i122820 Corrected graphics creation, allow bigger limits if directly requested

Modified:
    openoffice/branches/AOO401/main/svx/source/unodraw/UnoGraphicExporter.cxx

Modified: 
openoffice/branches/AOO401/main/svx/source/unodraw/UnoGraphicExporter.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/branches/AOO401/main/svx/source/unodraw/UnoGraphicExporter.cxx?rev=1519619&r1=1519618&r2=1519619&view=diff
==============================================================================
--- openoffice/branches/AOO401/main/svx/source/unodraw/UnoGraphicExporter.cxx 
(original)
+++ openoffice/branches/AOO401/main/svx/source/unodraw/UnoGraphicExporter.cxx 
Tue Sep  3 09:42:43 2013
@@ -225,6 +225,7 @@ namespace svx
                {
             // use new primitive conversion tooling
             basegfx::B2DRange aRange(basegfx::B2DPoint(0.0, 0.0));
+            sal_uInt32 nMaximumQuadraticPixels(500000);
 
             if(pSize)
             {
@@ -233,6 +234,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
             {
@@ -242,13 +247,42 @@ namespace svx
                 aRange.expand(basegfx::B2DPoint(aSize100th.Width(), 
aSize100th.Height()));
             }
 
-            aBmpEx = convertMetafileToBitmapEx(rMtf, aRange);
-               }
-               else
+            aBmpEx = convertMetafileToBitmapEx(rMtf, aRange, 
nMaximumQuadraticPixels);
+        }
+        else
         {
             const SvtOptionsDrawinglayer aDrawinglayerOpt;
+            Size aTargetSize(0, 0);
+
+            if(pSize)
+            {
+                // #122820# 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());
@@ -429,26 +463,39 @@ VirtualDevice* GraphicExporter::CreatePa
        }
 
        pVDev->SetMapMode( aMM );
-#ifdef DBG_UTIL
-       sal_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 ) );
+    bool bSuccess(false);
+
+    // #122820# 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 );
+        ImplExportCheckVisisbilityRedirector aRedirector( mpCurrentPage );
 
-       pView->CompleteRedraw(pVDev, aRegion, &aRedirector);
+        pView->CompleteRedraw(pVDev, aRegion, &aRedirector);
+        delete pView;
+    }
+    else
+    {
+        OSL_ENSURE(false, "Could not get a VirtualDevice of requested size 
(!)");
+    }
 
-       delete pView;
        return pVDev;
 }
 


Reply via email to