diff options
-rw-r--r-- | drawinglayer/source/tools/emfphelperdata.cxx | 88 | ||||
-rw-r--r-- | drawinglayer/source/tools/emfphelperdata.hxx | 1 |
2 files changed, 63 insertions, 26 deletions
diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx index 9984878c8466..a68297493cb0 100644 --- a/drawinglayer/source/tools/emfphelperdata.cxx +++ b/drawinglayer/source/tools/emfphelperdata.cxx @@ -35,6 +35,7 @@ #include <drawinglayer/primitive2d/metafileprimitive2d.hxx> #include <drawinglayer/attribute/fontattribute.hxx> #include <basegfx/matrix/b2dhommatrixtools.hxx> +#include <basegfx/polygon/b2dpolygonclipper.hxx> #include <basegfx/polygon/b2dpolygontools.hxx> #include <o3tl/make_unique.hxx> #include <vcl/svapp.hxx> @@ -696,6 +697,63 @@ namespace emfplushelper { } + void EmfPlusHelperData::combineClip(int combineMode, ::basegfx::B2DPolyPolygon& polygon) + { + switch (combineMode) + { + case EmfPlusCombineModeReplace: + case EmfPlusCombineModeUnion: + case EmfPlusCombineModeComplement: + { + HandleNewClipRegion(polygon, mrTargetHolders, mrPropertyHolders); + break; + } + case EmfPlusCombineModeXOR: + { + basegfx::B2DPolyPolygon aOriginalPolyPolygon( + mrPropertyHolders.Current().getClipPolyPolygon()); + + if (!aOriginalPolyPolygon.count()) + { + HandleNewClipRegion(polygon, mrTargetHolders, mrPropertyHolders); + } + else + { + aOriginalPolyPolygon.append(polygon); + // use existing tooling from wmfemfhelper + HandleNewClipRegion(aOriginalPolyPolygon, mrTargetHolders, mrPropertyHolders); + } + + break; + } + case EmfPlusCombineModeIntersect: + { + const basegfx::B2DPolyPolygon aOriginalPolyPolygon( + mrPropertyHolders.Current().getClipPolyPolygon()); + + basegfx::B2DPolyPolygon aClippedPolyPolygon; + if (aOriginalPolyPolygon.count()) + { + + aClippedPolyPolygon = basegfx::utils::clipPolyPolygonOnPolyPolygon( + aOriginalPolyPolygon, + polygon, + true, + false); + } + + // use existing tooling from wmfemfhelper + HandleNewClipRegion(aClippedPolyPolygon, mrTargetHolders, mrPropertyHolders); + break; + } + case EmfPlusCombineModeExclude: + { + // Not doing anything is better then including exactly what we wanted to exclude. + break; + } + } + } + void EmfPlusHelperData::processEmfPlusData( SvMemoryStream& rMS, const drawinglayer::geometry::ViewInformation2D& /*rViewInformation*/) @@ -1451,7 +1509,7 @@ namespace emfplushelper SAL_INFO("drawinglayer", "EMF+ SetClipRect combine mode: " << combineMode); #if OSL_DEBUG_LEVEL > 1 if (combineMode > 1) { - SAL_INFO("drawinglayer", "EMF+ TODO combine mode > 1"); + SAL_WARN("drawinglayer", "EMF+ \tSetClipRect TODO combine mode > 1"); } #endif @@ -1470,10 +1528,7 @@ namespace emfplushelper mappedPoint.getX() + mappedSize.getX(), mappedPoint.getY() + mappedSize.getY())))); - // use existing tooling from wmfemfhelper - HandleNewClipRegion(polyPolygon, mrTargetHolders, mrPropertyHolders); - // polyPolygon.transform(rState.mapModeTransform); - // updateClipping(polyPolygon, rFactoryParms, combineMode == 1); + combineClip(combineMode, polyPolygon); break; } case EmfPlusRecordTypeSetClipPath: @@ -1486,26 +1541,7 @@ namespace emfplushelper ::basegfx::B2DPolyPolygon& clipPoly(path.GetPolygon(*this)); // clipPoly.transform(rState.mapModeTransform); - switch (combineMode) - { - case EmfPlusCombineModeReplace: - case EmfPlusCombineModeIntersect: - case EmfPlusCombineModeUnion: // Is this, EmfPlusCombineModeXOR and EmfPlusCombineModeComplement correct? - case EmfPlusCombineModeXOR: - case EmfPlusCombineModeComplement: - { - // use existing tooling from wmfemfhelper - HandleNewClipRegion(clipPoly, mrTargetHolders, mrPropertyHolders); - // updateClipping(clipPoly, rFactoryParms, combineMode == 1); - break; - } - case EmfPlusCombineModeExclude: - { - // Not doing anything is better then including exactly what we wanted to exclude. - break; - } - } - + combineClip(combineMode, clipPoly); break; } case EmfPlusRecordTypeSetClipRegion: @@ -1524,7 +1560,7 @@ namespace emfplushelper } else { - SAL_INFO("drawinglayer", "EMF+\tTODO"); + SAL_WARN("drawinglayer", "EMF+\tTODO"); } break; } diff --git a/drawinglayer/source/tools/emfphelperdata.hxx b/drawinglayer/source/tools/emfphelperdata.hxx index bfb79c8e7853..253b1de711fc 100644 --- a/drawinglayer/source/tools/emfphelperdata.hxx +++ b/drawinglayer/source/tools/emfphelperdata.hxx @@ -242,6 +242,7 @@ namespace emfplushelper // helper functions ::basegfx::BColor EMFPGetBrushColorOrARGBColor(sal_uInt16 flags, sal_uInt32 brushIndexOrColor) const; + void combineClip(int combineMode, ::basegfx::B2DPolyPolygon& polygon); public: EmfPlusHelperData( |