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);
}
}