summaryrefslogtreecommitdiffstats
path: root/drawinglayer/source/tools/emfphelperdata.cxx
diff options
context:
space:
mode:
authorBartosz Kosiorek <gang65@poczta.onet.pl>2017-11-05 00:02:49 +0100
committerBartosz Kosiorek <gang65@poczta.onet.pl>2017-11-16 21:55:54 +0100
commitd0c4cee7e5ad00363d264aec0011a4b07983b19d (patch)
treefa15f8e5dd76f92681455572d4a7f99bedc0c409 /drawinglayer/source/tools/emfphelperdata.cxx
parentsilence coverity#1421084 Uncaught exception (diff)
downloadcore-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.cxx68
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: