summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCaolán McNamara <caolanm@redhat.com>2017-03-01 10:35:31 +0000
committerCaolán McNamara <caolanm@redhat.com>2017-03-01 12:09:04 +0000
commitd9262e19c942f2719bfa7de3a5059e4f6e0039c6 (patch)
tree8380b7cd97241e4fe9b5f1feae0e45132d267b07
parent03899e1284db150d2da78b725aba7180147123c4 (diff)
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>
-rw-r--r--basegfx/source/range/b2dpolyrange.cxx12
-rw-r--r--basegfx/source/tools/b2dclipstate.cxx13
-rw-r--r--include/basegfx/range/b2dpolyrange.hxx3
-rw-r--r--include/basegfx/tools/b2dclipstate.hxx3
-rw-r--r--vcl/qa/cppunit/graphicfilter/data/emf/fail/slow-moveclip-1.emfbin0 -> 8700 bytes
-rw-r--r--vcl/source/filter/wmf/winmtf.cxx9
6 files changed, 33 insertions, 7 deletions
diff --git a/basegfx/source/range/b2dpolyrange.cxx b/basegfx/source/range/b2dpolyrange.cxx
index 25117cb5dbd1..3b86f4fd8c0c 100644
--- a/basegfx/source/range/b2dpolyrange.cxx
+++ b/basegfx/source/range/b2dpolyrange.cxx
@@ -87,6 +87,13 @@ namespace basegfx
return tools::solveCrossovers(maRanges,maOrient);
}
+ void transform(const basegfx::B2DHomMatrix& rTranslate)
+ {
+ maBounds.transform(rTranslate);
+ for (auto &a : maRanges)
+ a.transform(rTranslate);
+ }
+
private:
B2DRange maBounds;
std::vector<B2DRange> maRanges;
@@ -148,6 +155,11 @@ namespace basegfx
return mpImpl->overlaps(rRange);
}
+ void B2DPolyRange::transform(const basegfx::B2DHomMatrix& rTranslate)
+ {
+ mpImpl->transform(rTranslate);
+ }
+
B2DPolyPolygon B2DPolyRange::solveCrossovers() const
{
return mpImpl->solveCrossovers();
diff --git a/basegfx/source/tools/b2dclipstate.cxx b/basegfx/source/tools/b2dclipstate.cxx
index db0932494626..5ce779c94a03 100644
--- a/basegfx/source/tools/b2dclipstate.cxx
+++ b/basegfx/source/tools/b2dclipstate.cxx
@@ -173,6 +173,13 @@ namespace tools
addPolyPolygon(rPolyPoly,XOR);
}
+ void transform(const basegfx::B2DHomMatrix& rTranslate)
+ {
+ maPendingRanges.transform(rTranslate);
+ maPendingPolygons.transform(rTranslate);
+ maClipPoly.transform(rTranslate);
+ }
+
B2DPolyPolygon const & getClipPoly() const
{
commitPendingRanges();
@@ -481,6 +488,12 @@ namespace tools
return mpImpl->getClipPoly();
}
+ void B2DClipState::transform(const basegfx::B2DHomMatrix& rTranslate)
+ {
+ return mpImpl->transform(rTranslate);
+ }
+
+
} // end of namespace tools
} // end of namespace basegfx
diff --git a/include/basegfx/range/b2dpolyrange.hxx b/include/basegfx/range/b2dpolyrange.hxx
index f3494c177b6d..bfd36303a16c 100644
--- a/include/basegfx/range/b2dpolyrange.hxx
+++ b/include/basegfx/range/b2dpolyrange.hxx
@@ -30,6 +30,7 @@ namespace basegfx
class B2DTuple;
class B2DRange;
class B2DPolyPolygon;
+ class B2DHomMatrix;
class ImplB2DPolyRange;
/** Multiple ranges in one object.
@@ -84,6 +85,8 @@ namespace basegfx
*/
B2DPolyPolygon solveCrossovers() const;
+ void transform(const B2DHomMatrix& rTranslate);
+
private:
o3tl::cow_wrapper< ImplB2DPolyRange > mpImpl;
};
diff --git a/include/basegfx/tools/b2dclipstate.hxx b/include/basegfx/tools/b2dclipstate.hxx
index dab598edd2a4..865bdd74c765 100644
--- a/include/basegfx/tools/b2dclipstate.hxx
+++ b/include/basegfx/tools/b2dclipstate.hxx
@@ -31,6 +31,7 @@ namespace basegfx
class B2DPolyRange;
class B2DPolygon;
class B2DPolyPolygon;
+ class B2DHomMatrix;
namespace tools
{
@@ -85,6 +86,8 @@ namespace basegfx
void xorRange(const B2DRange& );
void xorPolyPolygon(const B2DPolyPolygon& );
+ void transform(const B2DHomMatrix& );
+
B2DPolyPolygon getClipPoly() const;
};
}
diff --git a/vcl/qa/cppunit/graphicfilter/data/emf/fail/slow-moveclip-1.emf b/vcl/qa/cppunit/graphicfilter/data/emf/fail/slow-moveclip-1.emf
new file mode 100644
index 000000000000..ef4c6a0097fd
--- /dev/null
+++ b/vcl/qa/cppunit/graphicfilter/data/emf/fail/slow-moveclip-1.emf
Binary files differ
diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx
index d51db44b11ae..028495d10638 100644
--- a/vcl/source/filter/wmf/winmtf.cxx
+++ b/vcl/source/filter/wmf/winmtf.cxx
@@ -78,14 +78,9 @@ void WinMtfClipPath::setClipPath( const tools::PolyPolygon& rPolyPolygon, sal_In
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;
aTranslate.translate(rSize.Width(), rSize.Height());
-
- aCurrClip.transform(aTranslate);
- maClip = basegfx::tools::B2DClipState( aCurrClip );
+ maClip.transform(aTranslate);
}
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
//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)
{
mpGDIMetaFile->AddAction(