diff options
Diffstat (limited to 'drawinglayer/source/tools/emfphelperdata.cxx')
-rw-r--r-- | drawinglayer/source/tools/emfphelperdata.cxx | 68 |
1 files changed, 18 insertions, 50 deletions
diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx index 6d9a8a499f8c..9d2c7db10008 100644 --- a/drawinglayer/source/tools/emfphelperdata.cxx +++ b/drawinglayer/source/tools/emfphelperdata.cxx @@ -138,14 +138,14 @@ namespace emfplushelper SAL_INFO("drawinglayer", "EMF+\theader: 0x" << std::hex << header << " points: " << std::dec << points << " additional flags: 0x" << std::hex << pathFlags << std::dec); EMFPPath *path; maEMFPObjects[index].reset(path = new EMFPPath(points)); - path->Read(rObjectStream, pathFlags, *this); + path->Read(rObjectStream, pathFlags); break; } case EmfPlusObjectTypeRegion: { EMFPRegion *region; maEMFPObjects[index].reset(region = new EMFPRegion()); - region->Read(rObjectStream); + region->ReadRegion(rObjectStream, *this); break; } case EmfPlusObjectTypeImage: @@ -700,74 +700,52 @@ namespace emfplushelper { } - void EmfPlusHelperData::combineClip(int combineMode, ::basegfx::B2DPolyPolygon const & polygon) + ::basegfx::B2DPolyPolygon const EmfPlusHelperData::combineClip(::basegfx::B2DPolyPolygon const & leftPolygon, int combineMode, ::basegfx::B2DPolyPolygon const & rightPolygon) { + basegfx::B2DPolyPolygon aClippedPolyPolygon; switch (combineMode) { case EmfPlusCombineModeReplace: { - HandleNewClipRegion(polygon, mrTargetHolders, mrPropertyHolders); + aClippedPolyPolygon = rightPolygon; break; } case EmfPlusCombineModeIntersect: { - const basegfx::B2DPolyPolygon aOriginalPolyPolygon( - mrPropertyHolders.Current().getClipPolyPolygon()); - - basegfx::B2DPolyPolygon aClippedPolyPolygon; - if (aOriginalPolyPolygon.count()) + if (leftPolygon.count()) { aClippedPolyPolygon = basegfx::utils::clipPolyPolygonOnPolyPolygon( - aOriginalPolyPolygon, - polygon, + leftPolygon, + rightPolygon, true, false); } - - HandleNewClipRegion(aClippedPolyPolygon, mrTargetHolders, mrPropertyHolders); break; } case EmfPlusCombineModeUnion: { - basegfx::B2DPolyPolygon aOriginalPolyPolygon( - mrPropertyHolders.Current().getClipPolyPolygon()); - - aOriginalPolyPolygon = ::basegfx::utils::solvePolygonOperationOr(aOriginalPolyPolygon, polygon); - HandleNewClipRegion(aOriginalPolyPolygon, mrTargetHolders, mrPropertyHolders); - + aClippedPolyPolygon = ::basegfx::utils::solvePolygonOperationOr(leftPolygon, rightPolygon); break; } case EmfPlusCombineModeXOR: { - basegfx::B2DPolyPolygon aOriginalPolyPolygon( - mrPropertyHolders.Current().getClipPolyPolygon()); - - aOriginalPolyPolygon = ::basegfx::utils::solvePolygonOperationXor(aOriginalPolyPolygon, polygon); - HandleNewClipRegion(aOriginalPolyPolygon, mrTargetHolders, mrPropertyHolders); - + aClippedPolyPolygon = ::basegfx::utils::solvePolygonOperationXor(leftPolygon, rightPolygon); break; } case EmfPlusCombineModeExclude: { // Replaces the existing region with the part of itself that is not in the new region. - basegfx::B2DPolyPolygon aOriginalPolyPolygon( - mrPropertyHolders.Current().getClipPolyPolygon()); - - aOriginalPolyPolygon = ::basegfx::utils::solvePolygonOperationDiff(aOriginalPolyPolygon, polygon); - HandleNewClipRegion(aOriginalPolyPolygon, mrTargetHolders, mrPropertyHolders); + aClippedPolyPolygon = ::basegfx::utils::solvePolygonOperationDiff(leftPolygon, rightPolygon); break; } case EmfPlusCombineModeComplement: { // Replaces the existing region with the part of the new region that is not in the existing region. - basegfx::B2DPolyPolygon aOriginalPolyPolygon( - mrPropertyHolders.Current().getClipPolyPolygon()); - - aOriginalPolyPolygon = ::basegfx::utils::solvePolygonOperationDiff(polygon, aOriginalPolyPolygon); - HandleNewClipRegion(aOriginalPolyPolygon, mrTargetHolders, mrPropertyHolders); + aClippedPolyPolygon = ::basegfx::utils::solvePolygonOperationDiff(rightPolygon, leftPolygon); break; } } + return aClippedPolyPolygon; } void EmfPlusHelperData::processEmfPlusData( @@ -1048,7 +1026,7 @@ namespace emfplushelper SAL_INFO("drawinglayer", "EMF+\t: " << ((flags & 0x8000) ? "color" : "brush index") << " 0x" << std::hex << brushIndexOrColor << std::dec); EMFPPath path(points, true); - path.Read(rMS, flags, *this); + path.Read(rMS, flags); EMFPPlusFillPolygon(path.GetPolygon(*this), flags & 0x8000, brushIndexOrColor); @@ -1060,7 +1038,7 @@ namespace emfplushelper rMS.ReadUInt32(points); SAL_INFO("drawinglayer", "EMF+ DrawLines in slot: " << (flags & 0xff) << " points: " << points); EMFPPath path(points, true); - path.Read(rMS, flags, *this); + path.Read(rMS, flags); // 0x2000 bit indicates whether to draw an extra line between the last point // and the first point, to close the shape. @@ -1549,7 +1527,7 @@ namespace emfplushelper mappedPoint.getX() + mappedSize.getX(), mappedPoint.getY() + mappedSize.getY())))); - combineClip(combineMode, polyPolygon); + HandleNewClipRegion(combineClip(mrPropertyHolders.Current().getClipPolyPolygon(), combineMode, polyPolygon), mrTargetHolders, mrPropertyHolders); break; } case EmfPlusRecordTypeSetClipPath: @@ -1562,7 +1540,7 @@ namespace emfplushelper ::basegfx::B2DPolyPolygon& clipPoly(path.GetPolygon(*this)); // clipPoly.transform(rState.mapModeTransform); - combineClip(combineMode, clipPoly); + HandleNewClipRegion( combineClip(mrPropertyHolders.Current().getClipPolyPolygon(), combineMode, clipPoly), mrTargetHolders, mrPropertyHolders); break; } case EmfPlusRecordTypeSetClipRegion: @@ -1572,17 +1550,7 @@ namespace emfplushelper SAL_INFO("drawinglayer", "EMF+\tregion in slot: " << (flags & 0xff) << " combine mode: " << combineMode); EMFPRegion *region = static_cast<EMFPRegion*>(maEMFPObjects[flags & 0xff].get()); - // reset clip - if (region && region->parts == 0 && region->initialState == EmfPlusRegionInitialStateInfinite) - { - // use existing tooling from wmfemfhelper - HandleNewClipRegion(::basegfx::B2DPolyPolygon(), mrTargetHolders, mrPropertyHolders); - // updateClipping(::basegfx::B2DPolyPolygon(), rFactoryParms, combineMode == 1); - } - else - { - SAL_WARN("drawinglayer", "EMF+\tTODO"); - } + HandleNewClipRegion(combineClip(mrPropertyHolders.Current().getClipPolyPolygon(), combineMode, region->regionPolyPolygon), mrTargetHolders, mrPropertyHolders); break; } case EmfPlusRecordTypeOffsetClip: |