Kaydet (Commit) 25deea83 authored tarafından Armin Le Grand's avatar Armin Le Grand Kaydeden (comit) Caolán McNamara

Resolves: #i125211# corrected breaking metafiles with gradient actions

(cherry picked from commit 87637364)

Conflicts:
	svx/source/svdraw/svdfmtf.cxx

Change-Id: I853f3499121c8708a7de9d04ff2856037061c6ed
üst 08abec41
......@@ -172,7 +172,10 @@ void ImpSdrGDIMetaFileImport::DoLoopActions(GDIMetaFile& rMtf, SvdProgressInfo*
case META_PUSH_ACTION : DoAction((MetaPushAction &)*pAct); break;
case META_POP_ACTION : DoAction((MetaPopAction &)*pAct); break;
case META_HATCH_ACTION : DoAction((MetaHatchAction &)*pAct); break;
case META_COMMENT_ACTION : DoAction((MetaCommentAction &)*pAct, &rMtf); break;
// #i125211# MetaCommentAction may change index, thus hand it over
case META_COMMENT_ACTION : DoAction((MetaCommentAction&)*pAct, rMtf, a);
break;
// missing actions added
case META_TEXTRECT_ACTION : DoAction((MetaTextRectAction&)*pAct); break;
......@@ -1144,7 +1147,8 @@ void ImpSdrGDIMetaFileImport::DoAction( MetaHatchAction& rAct )
{
const Hatch& rHatch = rAct.GetHatch();
SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, aSource);
SfxItemSet aHatchAttr(mpModel->GetItemPool(), XATTR_FILLSTYLE, XATTR_FILLSTYLE, XATTR_FILLHATCH, XATTR_FILLHATCH, 0, 0);
// #i125211# Use the ranges from the SdrObject to create a new empty SfxItemSet
SfxItemSet aHatchAttr(mpModel->GetItemPool(), pPath->GetMergedItemSet().GetRanges());
XHatchStyle eStyle;
switch(rHatch.GetStyle())
......@@ -1215,13 +1219,14 @@ void ImpSdrGDIMetaFileImport::MapScaling()
void ImpSdrGDIMetaFileImport::DoAction( MetaCommentAction& rAct, GDIMetaFile* pMtf )
void ImpSdrGDIMetaFileImport::DoAction( MetaCommentAction& rAct, GDIMetaFile& rMtf, sal_uLong& a) // GDIMetaFile* pMtf )
{
bool aSkipComment = false;
if (rAct.GetComment().equalsIgnoreAsciiCase("XGRAD_SEQ_BEGIN"))
if (a < rMtf.GetActionSize() && rAct.GetComment().equalsIgnoreAsciiCase("XGRAD_SEQ_BEGIN"))
{
MetaGradientExAction* pAct = (MetaGradientExAction*) pMtf->NextAction();
// #i125211# Check if next action is a MetaGradientExAction
MetaGradientExAction* pAct = dynamic_cast< MetaGradientExAction* >(rMtf.GetAction(a + 1));
if( pAct && pAct->GetType() == META_GRADIENTEX_ACTION )
{
......@@ -1234,7 +1239,8 @@ void ImpSdrGDIMetaFileImport::DoAction( MetaCommentAction& rAct, GDIMetaFile* pM
{
const Gradient& rGrad = pAct->GetGradient();
SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, aSource);
SfxItemSet aGradAttr(mpModel->GetItemPool(), XATTR_FILLSTYLE, XATTR_FILLSTYLE, XATTR_FILLGRADIENT, XATTR_FILLGRADIENT, 0, 0);
// #i125211# Use the ranges from the SdrObject to create a new empty SfxItemSet
SfxItemSet aGradAttr(mpModel->GetItemPool(), pPath->GetMergedItemSet().GetRanges());
XGradient aXGradient;
aXGradient.SetGradientStyle((XGradientStyle)rGrad.GetStyle());
......@@ -1272,13 +1278,14 @@ void ImpSdrGDIMetaFileImport::DoAction( MetaCommentAction& rAct, GDIMetaFile* pM
if(aSkipComment)
{
MetaAction* pSkipAct = pMtf->NextAction();
// #i125211# forward until closing MetaCommentAction
MetaAction* pSkipAct = rMtf.GetAction(++a);
while( pSkipAct
&& ((pSkipAct->GetType() != META_COMMENT_ACTION )
|| !(((MetaCommentAction*)pSkipAct)->GetComment().equalsIgnoreAsciiCase("XGRAD_SEQ_END"))))
{
pSkipAct = pMtf->NextAction();
pSkipAct = rMtf.GetAction(++a);
}
}
}
......@@ -1407,7 +1414,8 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaGradientAction& rAct)
floor(aRange.getMinY()),
ceil(aRange.getMaxX()),
ceil(aRange.getMaxY())));
SfxItemSet aGradientAttr(mpModel->GetItemPool(), XATTR_FILLSTYLE, XATTR_FILLSTYLE, XATTR_FILLGRADIENT, XATTR_FILLGRADIENT, 0, 0);
// #i125211# Use the ranges from the SdrObject to create a new empty SfxItemSet
SfxItemSet aGradientAttr(mpModel->GetItemPool(), pRect->GetMergedItemSet().GetRanges());
const XGradientStyle aXGradientStyle(getXGradientStyleFromGradientStyle(rGradient.GetStyle()));
const XFillGradientItem aXFillGradientItem(
XGradient(
......@@ -1423,7 +1431,7 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaGradientAction& rAct)
rGradient.GetSteps()));
SetAttributes(pRect);
aGradientAttr.Put(XFillStyleItem(XFILL_HATCH));
aGradientAttr.Put(XFillStyleItem(XFILL_GRADIENT)); // #i125211#
aGradientAttr.Put(aXFillGradientItem);
pRect->SetMergedItemSet(aGradientAttr);
......@@ -1476,7 +1484,8 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaGradientExAction& rAct)
{
const Gradient& rGradient = rAct.GetGradient();
SdrPathObj* pPath = new SdrPathObj(OBJ_POLY, aSource);
SfxItemSet aGradientAttr(mpModel->GetItemPool(), XATTR_FILLSTYLE, XATTR_FILLSTYLE, XATTR_FILLGRADIENT, XATTR_FILLGRADIENT, 0, 0);
// #i125211# Use the ranges from the SdrObject to create a new empty SfxItemSet
SfxItemSet aGradientAttr(mpModel->GetItemPool(), pPath->GetMergedItemSet().GetRanges());
const XGradientStyle aXGradientStyle(getXGradientStyleFromGradientStyle(rGradient.GetStyle()));
const XFillGradientItem aXFillGradientItem(
XGradient(
......@@ -1492,7 +1501,7 @@ void ImpSdrGDIMetaFileImport::DoAction(MetaGradientExAction& rAct)
rGradient.GetSteps()));
SetAttributes(pPath);
aGradientAttr.Put(XFillStyleItem(XFILL_HATCH));
aGradientAttr.Put(XFillStyleItem(XFILL_GRADIENT)); // #i125211#
aGradientAttr.Put(aXFillGradientItem);
pPath->SetMergedItemSet(aGradientAttr);
......
......@@ -119,7 +119,10 @@ protected:
void DoAction(MetaMoveClipRegionAction & rAct) { rAct.Execute(&maVD); checkClip(); }
void DoAction(MetaISectRectClipRegionAction& rAct) { rAct.Execute(&maVD); checkClip(); }
void DoAction(MetaISectRegionClipRegionAction& rAct) { rAct.Execute(&maVD); checkClip(); }
void DoAction(MetaCommentAction& rAct, GDIMetaFile* pMtf);
// #i125211# The MetaCommentAction needs to advance (if used), thus
// give current metafile and index which may be changed
void DoAction(MetaCommentAction& rAct, GDIMetaFile& rMtf, sal_uLong& a);
// missing actions added
void DoAction(MetaTextRectAction& rAct);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment