ofz: timeout loading emf with move clip record

Change-Id: Id5d60f0037873598e1447b063e66e9c29840587c
Reviewed-on: https://gerrit.libreoffice.org/34740
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Caolán McNamara <caolanm@redhat.com>
Tested-by: Caolán McNamara <caolanm@redhat.com>
This commit is contained in:
Caolán McNamara
2017-03-01 10:35:31 +00:00
parent 03899e1284
commit d9262e19c9
6 changed files with 33 additions and 7 deletions

View File

@@ -87,6 +87,13 @@ namespace basegfx
return tools::solveCrossovers(maRanges,maOrient); return tools::solveCrossovers(maRanges,maOrient);
} }
void transform(const basegfx::B2DHomMatrix& rTranslate)
{
maBounds.transform(rTranslate);
for (auto &a : maRanges)
a.transform(rTranslate);
}
private: private:
B2DRange maBounds; B2DRange maBounds;
std::vector<B2DRange> maRanges; std::vector<B2DRange> maRanges;
@@ -148,6 +155,11 @@ namespace basegfx
return mpImpl->overlaps(rRange); return mpImpl->overlaps(rRange);
} }
void B2DPolyRange::transform(const basegfx::B2DHomMatrix& rTranslate)
{
mpImpl->transform(rTranslate);
}
B2DPolyPolygon B2DPolyRange::solveCrossovers() const B2DPolyPolygon B2DPolyRange::solveCrossovers() const
{ {
return mpImpl->solveCrossovers(); return mpImpl->solveCrossovers();

View File

@@ -173,6 +173,13 @@ namespace tools
addPolyPolygon(rPolyPoly,XOR); addPolyPolygon(rPolyPoly,XOR);
} }
void transform(const basegfx::B2DHomMatrix& rTranslate)
{
maPendingRanges.transform(rTranslate);
maPendingPolygons.transform(rTranslate);
maClipPoly.transform(rTranslate);
}
B2DPolyPolygon const & getClipPoly() const B2DPolyPolygon const & getClipPoly() const
{ {
commitPendingRanges(); commitPendingRanges();
@@ -481,6 +488,12 @@ namespace tools
return mpImpl->getClipPoly(); return mpImpl->getClipPoly();
} }
void B2DClipState::transform(const basegfx::B2DHomMatrix& rTranslate)
{
return mpImpl->transform(rTranslate);
}
} // end of namespace tools } // end of namespace tools
} // end of namespace basegfx } // end of namespace basegfx

View File

@@ -30,6 +30,7 @@ namespace basegfx
class B2DTuple; class B2DTuple;
class B2DRange; class B2DRange;
class B2DPolyPolygon; class B2DPolyPolygon;
class B2DHomMatrix;
class ImplB2DPolyRange; class ImplB2DPolyRange;
/** Multiple ranges in one object. /** Multiple ranges in one object.
@@ -84,6 +85,8 @@ namespace basegfx
*/ */
B2DPolyPolygon solveCrossovers() const; B2DPolyPolygon solveCrossovers() const;
void transform(const B2DHomMatrix& rTranslate);
private: private:
o3tl::cow_wrapper< ImplB2DPolyRange > mpImpl; o3tl::cow_wrapper< ImplB2DPolyRange > mpImpl;
}; };

View File

@@ -31,6 +31,7 @@ namespace basegfx
class B2DPolyRange; class B2DPolyRange;
class B2DPolygon; class B2DPolygon;
class B2DPolyPolygon; class B2DPolyPolygon;
class B2DHomMatrix;
namespace tools namespace tools
{ {
@@ -85,6 +86,8 @@ namespace basegfx
void xorRange(const B2DRange& ); void xorRange(const B2DRange& );
void xorPolyPolygon(const B2DPolyPolygon& ); void xorPolyPolygon(const B2DPolyPolygon& );
void transform(const B2DHomMatrix& );
B2DPolyPolygon getClipPoly() const; B2DPolyPolygon getClipPoly() const;
}; };
} }

View File

@@ -78,14 +78,9 @@ void WinMtfClipPath::setClipPath( const tools::PolyPolygon& rPolyPolygon, sal_In
void WinMtfClipPath::moveClipRegion( const Size& rSize ) void WinMtfClipPath::moveClipRegion( const Size& rSize )
{ {
// what a weird concept. emulate, don't want this in B2DClipState
// API
basegfx::B2DPolyPolygon aCurrClip=maClip.getClipPoly();
basegfx::B2DHomMatrix aTranslate; basegfx::B2DHomMatrix aTranslate;
aTranslate.translate(rSize.Width(), rSize.Height()); aTranslate.translate(rSize.Width(), rSize.Height());
maClip.transform(aTranslate);
aCurrClip.transform(aTranslate);
maClip = basegfx::tools::B2DClipState( aCurrClip );
} }
void WinMtfClipPath::setDefaultClipPath() void WinMtfClipPath::setDefaultClipPath()
@@ -902,7 +897,7 @@ void WinMtfOutput::UpdateClipRegion()
{ {
//this makes cases like tdf#45820 work in reasonable time, and I feel in theory should //this makes cases like tdf#45820 work in reasonable time, and I feel in theory should
//be just fine. In practice I see the output is different so needs work before its the //be just fine. In practice I see the output is different so needs work before its the
//default, but for file fuzzing it should good enough //default, but for file fuzzing it should be good enough
if (mbComplexClip) if (mbComplexClip)
{ {
mpGDIMetaFile->AddAction( mpGDIMetaFile->AddAction(