diff options
author | Bartosz Kosiorek <gang65@poczta.onet.pl> | 2017-11-05 00:02:49 +0100 |
---|---|---|
committer | Bartosz Kosiorek <gang65@poczta.onet.pl> | 2017-11-16 21:55:54 +0100 |
commit | d0c4cee7e5ad00363d264aec0011a4b07983b19d (patch) | |
tree | fa15f8e5dd76f92681455572d4a7f99bedc0c409 /drawinglayer/source/tools/emfphelperdata.cxx | |
parent | silence coverity#1421084 Uncaught exception (diff) | |
download | core-d0c4cee7e5ad00363d264aec0011a4b07983b19d.tar.gz core-d0c4cee7e5ad00363d264aec0011a4b07983b19d.zip |
tdf#113704 Implement proper reading of the EmfPlusRegionNode
Regions are specified as a binary tree of region nodes, and each node must
either be a terminal node or specify one or two child nodes.
Nodes contains two child nodes:
RegionNodeDataTypeAnd = 0x00000001,
RegionNodeDataTypeOr = 0x00000002,
RegionNodeDataTypeXor = 0x00000003,
RegionNodeDataTypeExclude = 0x00000004,
RegionNodeDataTypeComplement = 0x00000005,
Terminal nodes:
RegionNodeDataTypeRect = 0x10000000,
RegionNodeDataTypePath = 0x10000001,
RegionNodeDataTypeEmpty = 0x10000002,
RegionNodeDataTypeInfinite = 0x10000003
RegionNode must contain at least one element.
Change-Id: I668e5892701b979f09bcf5bbce44a43226676192
Reviewed-on: https://gerrit.libreoffice.org/44324
Reviewed-by: Bartosz Kosiorek <gang65@poczta.onet.pl>
Tested-by: Bartosz Kosiorek <gang65@poczta.onet.pl>
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: |