Author: alg
Date: Wed May  8 09:43:02 2013
New Revision: 1480203

URL: http://svn.apache.org/r1480203
Log:
i12246 Corrected three basic problems in the metafile breaker

Modified:
    openoffice/trunk/main/svx/source/svdraw/svdfmtf.cxx

Modified: openoffice/trunk/main/svx/source/svdraw/svdfmtf.cxx
URL: 
http://svn.apache.org/viewvc/openoffice/trunk/main/svx/source/svdraw/svdfmtf.cxx?rev=1480203&r1=1480202&r2=1480203&view=diff
==============================================================================
--- openoffice/trunk/main/svx/source/svdraw/svdfmtf.cxx (original)
+++ openoffice/trunk/main/svx/source/svdraw/svdfmtf.cxx Wed May  8 09:43:02 2013
@@ -129,8 +129,18 @@ ImpSdrGDIMetaFileImport::~ImpSdrGDIMetaF
 
 void ImpSdrGDIMetaFileImport::DoLoopActions(GDIMetaFile& rMtf, 
SvdProgressInfo* pProgrInfo, sal_uInt32* pActionsToReport)
 {
-       for( MetaAction* pAct = rMtf.FirstAction(); pAct; pAct = 
rMtf.NextAction() )
-       {
+    const sal_uLong nCount(rMtf.GetActionCount());
+
+    for(sal_uLong a(0); a < nCount; a++)
+    {
+        MetaAction* pAct = rMtf.GetAction(a);
+
+        if(!pAct)
+        {
+            OSL_ENSURE(false, "OOps, no action at valid position (!)");
+            pAct = rMtf.GetAction(0);
+        }
+
                switch (pAct->GetType())
                {
                        case META_PIXEL_ACTION          : 
DoAction((MetaPixelAction          &)*pAct); break;
@@ -515,10 +525,17 @@ void ImpSdrGDIMetaFileImport::InsertObj(
                     aTrans.scale(fScaleX, fScaleY);
                     aPixel.transform(aTrans);
 
+                    const Size aOrigSizePixel(aBitmapEx.GetSizePixel());
+                    const Point aClipTopLeft(
+                        basegfx::fround(floor(std::max(0.0, 
aPixel.getMinX()))), 
+                        basegfx::fround(floor(std::max(0.0, 
aPixel.getMinY()))));
+                    const Size aClipSize(
+                        
basegfx::fround(ceil(std::min((double)aOrigSizePixel.Width(), 
aPixel.getWidth()))),
+                        
basegfx::fround(ceil(std::min((double)aOrigSizePixel.Height(), 
aPixel.getHeight()))));
                     const BitmapEx aClippedBitmap(
                         aBitmapEx, 
-                        Point(floor(std::max(0.0, aPixel.getMinX())), 
floor(std::max(0.0, aPixel.getMinY()))), 
-                        Size(ceil(aPixel.getWidth()), 
ceil(aPixel.getHeight())));
+                        aClipTopLeft,
+                        aClipSize);
 
                     pObj->SetMergedItem(XFillStyleItem(XFILL_BITMAP));
                     pObj->SetMergedItem(XFillBitmapItem(String(), 
Graphic(aClippedBitmap)));
@@ -1010,7 +1027,11 @@ void ImpSdrGDIMetaFileImport::DoAction(M
        Rectangle aRect(rAct.GetPoint(),rAct.GetBitmap().GetSizePixel());
        aRect.Right()++; aRect.Bottom()++;
     SdrGrafObj* pGraf=new SdrGrafObj(Graphic(rAct.GetBitmap()),aRect);
-       InsertObj(pGraf);
+
+    // This action is not creating line and fill, set directly, do not use 
SetAttributes(..)
+    pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+    pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
+    InsertObj(pGraf);
 }
 
 void ImpSdrGDIMetaFileImport::DoAction(MetaBmpScaleAction& rAct)
@@ -1018,7 +1039,11 @@ void ImpSdrGDIMetaFileImport::DoAction(M
        Rectangle aRect(rAct.GetPoint(),rAct.GetSize());
        aRect.Right()++; aRect.Bottom()++;
     SdrGrafObj* pGraf=new SdrGrafObj(Graphic(rAct.GetBitmap()),aRect);
-       InsertObj(pGraf);
+
+    // This action is not creating line and fill, set directly, do not use 
SetAttributes(..)
+    pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+    pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
+    InsertObj(pGraf);
 }
 
 void ImpSdrGDIMetaFileImport::DoAction(MetaBmpExAction& rAct)
@@ -1026,7 +1051,11 @@ void ImpSdrGDIMetaFileImport::DoAction(M
        Rectangle aRect(rAct.GetPoint(),rAct.GetBitmapEx().GetSizePixel());
        aRect.Right()++; aRect.Bottom()++;
     SdrGrafObj* pGraf=new SdrGrafObj( rAct.GetBitmapEx(), aRect );
-       InsertObj(pGraf);
+
+    // This action is not creating line and fill, set directly, do not use 
SetAttributes(..)
+    pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+    pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
+    InsertObj(pGraf);
 }
 
 void ImpSdrGDIMetaFileImport::DoAction(MetaBmpExScaleAction& rAct)
@@ -1034,6 +1063,10 @@ void ImpSdrGDIMetaFileImport::DoAction(M
        Rectangle aRect(rAct.GetPoint(),rAct.GetSize());
        aRect.Right()++; aRect.Bottom()++;
     SdrGrafObj* pGraf=new SdrGrafObj( rAct.GetBitmapEx(), aRect );
+
+    // This action is not creating line and fill, set directly, do not use 
SetAttributes(..)
+    pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+    pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
        InsertObj(pGraf);
 }
 
@@ -1158,23 +1191,19 @@ void ImpSdrGDIMetaFileImport::DoAction( 
                                        
aXGradient.SetEndIntens(rGrad.GetEndIntensity());
                                        aXGradient.SetSteps(rGrad.GetSteps());
 
-                       if(maVD.IsLineColor())
-                    {
-                        // switch line off; when there was one there will be a
-                        // META_POLYLINE_ACTION following creating another 
object
-                           const Color aLineColor(maVD.GetLineColor());
-                           maVD.SetLineColor();
-                        SetAttributes(pPath);
-                           maVD.SetLineColor(aLineColor);
-                    }
-                    else
-                    {
-                        SetAttributes(pPath);
-                    }
+                    // no need to use SetAttributes(..) here since line and 
fill style
+                    // need to be set individually
+                    // SetAttributes(pPath);
+
+                    // switch line off; when there was one there will be a
+                    // META_POLYLINE_ACTION following creating another object
+                    aGradAttr.Put(XLineStyleItem(XLINE_NONE));
+
+                    // add detected gradient fillstyle
+                    aGradAttr.Put(XFillStyleItem(XFILL_GRADIENT));
+                    aGradAttr.Put(XFillGradientItem(&mpModel->GetItemPool(), 
aXGradient));
 
-                                       
aGradAttr.Put(XFillStyleItem(XFILL_GRADIENT));
-                                       
aGradAttr.Put(XFillGradientItem(&mpModel->GetItemPool(), aXGradient));
-                                       pPath->SetMergedItemSet(aGradAttr);
+                    pPath->SetMergedItemSet(aGradAttr);
 
                                        InsertObj(pPath);
                                }
@@ -1215,9 +1244,11 @@ void ImpSdrGDIMetaFileImport::DoAction(M
     aRect.Right()++; 
     aRect.Bottom()++;
     aBitmap.Crop(Rectangle(rAct.GetSrcPoint(), rAct.GetSrcSize()));
-
     SdrGrafObj* pGraf = new SdrGrafObj(aBitmap, aRect);
 
+    // This action is not creating line and fill, set directly, do not use 
SetAttributes(..)
+    pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+    pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
     InsertObj(pGraf);
 }
 
@@ -1229,9 +1260,11 @@ void ImpSdrGDIMetaFileImport::DoAction(M
     aRect.Right()++; 
     aRect.Bottom()++;
     aBitmapEx.Crop(Rectangle(rAct.GetSrcPoint(), rAct.GetSrcSize()));
-
     SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect);
 
+    // This action is not creating line and fill, set directly, do not use 
SetAttributes(..)
+    pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+    pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
     InsertObj(pGraf);
 }
 
@@ -1240,11 +1273,12 @@ void ImpSdrGDIMetaFileImport::DoAction(M
        Rectangle aRect(rAct.GetPoint(), rAct.GetBitmap().GetSizePixel());
     BitmapEx aBitmapEx(rAct.GetBitmap(), rAct.GetColor());
 
-    aRect.Right()++; 
-    aRect.Bottom()++;
-    
+    aRect.Right()++; aRect.Bottom()++;
     SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect);
 
+    // This action is not creating line and fill, set directly, do not use 
SetAttributes(..)
+    pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+    pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
     InsertObj(pGraf);
 }
 
@@ -1253,11 +1287,12 @@ void ImpSdrGDIMetaFileImport::DoAction(M
        Rectangle aRect(rAct.GetPoint(), rAct.GetSize());
     BitmapEx aBitmapEx(rAct.GetBitmap(), rAct.GetColor());
 
-    aRect.Right()++; 
-    aRect.Bottom()++;
-    
+    aRect.Right()++; aRect.Bottom()++;
     SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect);
 
+    // This action is not creating line and fill, set directly, do not use 
SetAttributes(..)
+    pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+    pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
     InsertObj(pGraf);
 }
 
@@ -1266,12 +1301,13 @@ void ImpSdrGDIMetaFileImport::DoAction(M
        Rectangle aRect(rAct.GetDestPoint(), rAct.GetDestSize());
     BitmapEx aBitmapEx(rAct.GetBitmap(), rAct.GetColor());
        
-    aRect.Right()++; 
-    aRect.Bottom()++;
+    aRect.Right()++; aRect.Bottom()++;
     aBitmapEx.Crop(Rectangle(rAct.GetSrcPoint(), rAct.GetSrcSize()));
-
     SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect);
 
+    // This action is not creating line and fill, set directly, do not use 
SetAttributes(..)
+    pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+    pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
     InsertObj(pGraf);
 }
 
@@ -1417,6 +1453,9 @@ void ImpSdrGDIMetaFileImport::DoAction(M
     {
            const Rectangle aRect(rAct.GetPoint(),rAct.GetSize());
 
+        Rectangle aHairline;
+        const Rectangle 
aBoundRect(rMtf.GetBoundRect(*Application::GetDefaultDevice(), &aHairline));
+
         // convert metafile sub-content to BitmapEx
         BitmapEx aBitmapEx(
             convertMetafileToBitmapEx(
@@ -1585,6 +1624,11 @@ void ImpSdrGDIMetaFileImport::DoAction(M
             // create and add object
             SdrGrafObj* pGraf = new SdrGrafObj(aBitmapEx, aRect);
 
+            // for MetaFloatTransparentAction, do not use SetAttributes(...)
+            // since these metafile content is not used to draw line/fill
+            // dependent of these setting at the device content
+            pGraf->SetMergedItem(XLineStyleItem(XLINE_NONE));
+            pGraf->SetMergedItem(XFillStyleItem(XFILL_NONE));
             InsertObj(pGraf);
         }
     }


Reply via email to