[Libreoffice-commits] core.git: Branch 'feature/emfplusprimitiveparser' - drawinglayer/inc drawinglayer/source
Armin Le Grand
Armin.Le.Grand at cib.de
Wed Jun 21 17:33:55 UTC 2017
drawinglayer/inc/wmfemfhelper.hxx | 5
drawinglayer/source/tools/emfpbrush.cxx | 450 +++---
drawinglayer/source/tools/emfpcustomlinecap.cxx | 7
drawinglayer/source/tools/emfpfont.cxx | 5
drawinglayer/source/tools/emfphelperdata.cxx | 1649 ++++++++++++------------
drawinglayer/source/tools/emfphelperdata.hxx | 4
drawinglayer/source/tools/emfpimage.cxx | 21
drawinglayer/source/tools/emfppath.cxx | 79 -
drawinglayer/source/tools/emfppen.cxx | 77 -
drawinglayer/source/tools/emfpregion.cxx | 13
drawinglayer/source/tools/emfpstringformat.cxx | 2
11 files changed, 1251 insertions(+), 1061 deletions(-)
New commits:
commit 270def2ea8819982dae0642dbbb1dd80955c5a53
Author: Armin Le Grand <Armin.Le.Grand at cib.de>
Date: Wed Jun 21 19:31:32 2017 +0200
emfplus: more corrections and rough geometry
Corrected/streamlined more, added 1st rough geometry
creation to have a proof of concept. Checked the
helper classes based on EMFPObject and their derivates.
First versions of EMFPPlusDrawPolygon and
EMFPPlusFillPolygon, but the complex info in the data
objects needs more complex primitive creation. Not sure
if primitive creators like createHairlineAndFillPrimitive
will be usable, these are based on PropertyHolder info.
Also added usage of HandleNewClipRegion, that should be
usable
Change-Id: I96119be290140bee252ee21a3e1187fad60e9c7d
diff --git a/drawinglayer/inc/wmfemfhelper.hxx b/drawinglayer/inc/wmfemfhelper.hxx
index 699b065795df..a11b6578e572 100644
--- a/drawinglayer/inc/wmfemfhelper.hxx
+++ b/drawinglayer/inc/wmfemfhelper.hxx
@@ -208,6 +208,11 @@ namespace wmfemfhelper
drawinglayer::primitive2d::Primitive2DContainer interpretMetafile(
const GDIMetaFile& rMetaFile,
const drawinglayer::geometry::ViewInformation2D& rViewInformation);
+
+ void HandleNewClipRegion(
+ const basegfx::B2DPolyPolygon& rClipPolyPolygon,
+ TargetHolders& rTargetHolders,
+ PropertyHolders& rPropertyHolders);
}
#endif
diff --git a/drawinglayer/source/tools/emfpbrush.cxx b/drawinglayer/source/tools/emfpbrush.cxx
index c093a5682572..d55a16ad30d7 100644
--- a/drawinglayer/source/tools/emfpbrush.cxx
+++ b/drawinglayer/source/tools/emfpbrush.cxx
@@ -64,23 +64,32 @@ namespace emfplushelper
EMFPBrush::~EMFPBrush()
{
- if (blendPositions != nullptr) {
+ if (blendPositions != nullptr)
+ {
delete[] blendPositions;
blendPositions = nullptr;
}
- if (colorblendPositions != nullptr) {
+
+ if (colorblendPositions != nullptr)
+ {
delete[] colorblendPositions;
colorblendPositions = nullptr;
}
- if (colorblendColors != nullptr) {
+
+ if (colorblendColors != nullptr)
+ {
delete[] colorblendColors;
colorblendColors = nullptr;
}
- if (surroundColors != nullptr) {
+
+ if (surroundColors != nullptr)
+ {
delete[] surroundColors;
surroundColors = nullptr;
}
- if (path) {
+
+ if (path)
+ {
delete path;
path = nullptr;
}
@@ -95,232 +104,267 @@ namespace emfplushelper
SAL_INFO("cppcanvas.emf", "EMF+\tbrush");
SAL_INFO("cppcanvas.emf", "EMF+\theader: 0x" << std::hex << header << " type: " << type << std::dec);
- switch (type) {
- case BrushTypeSolidColor:
+ switch (type)
{
- sal_uInt32 color;
+ case BrushTypeSolidColor:
+ {
+ sal_uInt32 color;
+ s.ReadUInt32(color);
- s.ReadUInt32(color);
- solidColor = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
- SAL_INFO("cppcanvas.emf", "EMF+\tsolid color: 0x" << std::hex << color << std::dec);
- break;
- }
- case BrushTypeHatchFill:
- {
- sal_uInt32 style;
- sal_uInt32 foregroundColor;
- sal_uInt32 backgroundColor;
- s.ReadUInt32(style);
- s.ReadUInt32(foregroundColor);
- s.ReadUInt32(backgroundColor);
-
- hatchStyle = static_cast<EmfPlusHatchStyle>(style);
- solidColor = ::Color(0xff - (foregroundColor >> 24), (foregroundColor >> 16) & 0xff, (foregroundColor >> 8) & 0xff, foregroundColor & 0xff);
- secondColor = ::Color(0xff - (backgroundColor >> 24), (backgroundColor >> 16) & 0xff, (backgroundColor >> 8) & 0xff, backgroundColor & 0xff);
- SAL_INFO("cppcanvas.emf", "EMF+\thatch style " << style << " foregroundcolor: 0x" << solidColor.AsRGBHexString() << " background 0x" << secondColor.AsRGBHexString());
- break;
- }
- case BrushTypeTextureFill:
- {
- SAL_WARN("cppcanvas.emf", "EMF+\tTODO: implement BrushTypeTextureFill brush");
- break;
- }
- case BrushTypePathGradient:
- {
- s.ReadUInt32(additionalFlags).ReadInt32(wrapMode);
+ solidColor = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
+ SAL_INFO("cppcanvas.emf", "EMF+\tsolid color: 0x" << std::hex << color << std::dec);
+ break;
+ }
+ case BrushTypeHatchFill:
+ {
+ sal_uInt32 style;
+ sal_uInt32 foregroundColor;
+ sal_uInt32 backgroundColor;
+ s.ReadUInt32(style);
+ s.ReadUInt32(foregroundColor);
+ s.ReadUInt32(backgroundColor);
+
+ hatchStyle = static_cast<EmfPlusHatchStyle>(style);
+ solidColor = ::Color(0xff - (foregroundColor >> 24), (foregroundColor >> 16) & 0xff, (foregroundColor >> 8) & 0xff, foregroundColor & 0xff);
+ secondColor = ::Color(0xff - (backgroundColor >> 24), (backgroundColor >> 16) & 0xff, (backgroundColor >> 8) & 0xff, backgroundColor & 0xff);
+ SAL_INFO("cppcanvas.emf", "EMF+\thatch style " << style << " foregroundcolor: 0x" << solidColor.AsRGBHexString() << " background 0x" << secondColor.AsRGBHexString());
+ break;
+ }
+ case BrushTypeTextureFill:
+ {
+ SAL_WARN("cppcanvas.emf", "EMF+\tTODO: implement BrushTypeTextureFill brush");
+ break;
+ }
+ case BrushTypePathGradient:
+ {
+ s.ReadUInt32(additionalFlags).ReadInt32(wrapMode);
+ SAL_INFO("cppcanvas.emf", "EMF+\tpath gradient, additional flags: 0x" << std::hex << additionalFlags << std::dec);
+ sal_uInt32 color;
+ s.ReadUInt32(color);
+ solidColor = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
+ SAL_INFO("cppcanvas.emf", "EMF+\tcenter color: 0x" << std::hex << color << std::dec);
+ s.ReadFloat(areaX).ReadFloat(areaY);
+ SAL_INFO("cppcanvas.emf", "EMF+\tcenter point: " << areaX << "," << areaY);
+ s.ReadInt32(surroundColorsNumber);
+ SAL_INFO("cppcanvas.emf", "EMF+\t number of surround colors: " << surroundColorsNumber);
+
+ if (surroundColorsNumber<0 || sal_uInt32(surroundColorsNumber)>SAL_MAX_INT32 / sizeof(::Color))
+ {
+ surroundColorsNumber = SAL_MAX_INT32 / sizeof(::Color);
+ }
- SAL_INFO("cppcanvas.emf", "EMF+\tpath gradient, additional flags: 0x" << std::hex << additionalFlags << std::dec);
+ surroundColors = new ::Color[surroundColorsNumber];
- sal_uInt32 color;
+ for (int i = 0; i < surroundColorsNumber; i++)
+ {
+ s.ReadUInt32(color);
+ surroundColors[i] = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
+ if (i == 0)
+ secondColor = surroundColors[0];
+ SAL_INFO("cppcanvas.emf", "EMF+\tsurround color[" << i << "]: 0x" << std::hex << color << std::dec);
+ }
- s.ReadUInt32(color);
- solidColor = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
- SAL_INFO("cppcanvas.emf", "EMF+\tcenter color: 0x" << std::hex << color << std::dec);
+ if (additionalFlags & 0x01)
+ {
+ sal_Int32 pathLength;
- s.ReadFloat(areaX).ReadFloat(areaY);
- SAL_INFO("cppcanvas.emf", "EMF+\tcenter point: " << areaX << "," << areaY);
+ s.ReadInt32(pathLength);
+ SAL_INFO("cppcanvas.emf", "EMF+\tpath length: " << pathLength);
- s.ReadInt32(surroundColorsNumber);
- SAL_INFO("cppcanvas.emf", "EMF+\t number of surround colors: " << surroundColorsNumber);
+ sal_uInt64 const pos = s.Tell();
- if (surroundColorsNumber<0 || sal_uInt32(surroundColorsNumber)>SAL_MAX_INT32 / sizeof(::Color))
- surroundColorsNumber = SAL_MAX_INT32 / sizeof(::Color);
+ sal_uInt32 pathHeader;
+ sal_Int32 pathPoints, pathFlags;
+ s.ReadUInt32(pathHeader).ReadInt32(pathPoints).ReadInt32(pathFlags);
- surroundColors = new ::Color[surroundColorsNumber];
- for (int i = 0; i < surroundColorsNumber; i++) {
- s.ReadUInt32(color);
- surroundColors[i] = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
- if (i == 0)
- secondColor = surroundColors[0];
- SAL_INFO("cppcanvas.emf", "EMF+\tsurround color[" << i << "]: 0x" << std::hex << color << std::dec);
- }
+ SAL_INFO("cppcanvas.emf", "EMF+\tpath (brush path gradient)");
+ SAL_INFO("cppcanvas.emf", "EMF+\theader: 0x" << std::hex << pathHeader << " points: " << std::dec << pathPoints << " additional flags: 0x" << std::hex << pathFlags << std::dec);
- if (additionalFlags & 0x01) {
- sal_Int32 pathLength;
+ path = new EMFPPath(pathPoints);
+ path->Read(s, pathFlags, rR);
- s.ReadInt32(pathLength);
- SAL_INFO("cppcanvas.emf", "EMF+\tpath length: " << pathLength);
+ s.Seek(pos + pathLength);
- sal_uInt64 const pos = s.Tell();
+ const ::basegfx::B2DRectangle aBounds(::basegfx::tools::getRange(path->GetPolygon(rR, false)));
+ areaWidth = aBounds.getWidth();
+ areaHeight = aBounds.getHeight();
+ SAL_INFO("cppcanvas.emf", "EMF+\t polygon bounding box: " << aBounds.getMinX() << "," << aBounds.getMinY() << " " << aBounds.getWidth() << "x" << aBounds.getHeight());
+ }
+ else
+ {
+ sal_Int32 boundaryPointCount;
+ s.ReadInt32(boundaryPointCount);
+
+ sal_uInt64 const pos = s.Tell();
+ SAL_INFO("cppcanvas.emf", "EMF+\t use boundary, points: " << boundaryPointCount);
+ path = new EMFPPath(boundaryPointCount);
+ path->Read(s, 0x0, rR);
+
+ s.Seek(pos + 8 * boundaryPointCount);
+
+ const ::basegfx::B2DRectangle aBounds(::basegfx::tools::getRange(path->GetPolygon(rR, false)));
+ areaWidth = aBounds.getWidth();
+ areaHeight = aBounds.getHeight();
+ SAL_INFO("cppcanvas.emf", "EMF+\t polygon bounding box: " << aBounds.getMinX() << "," << aBounds.getMinY() << " " << aBounds.getWidth() << "x" << aBounds.getHeight());
+ }
- sal_uInt32 pathHeader;
- sal_Int32 pathPoints, pathFlags;
- s.ReadUInt32(pathHeader).ReadInt32(pathPoints).ReadInt32(pathFlags);
+ if (additionalFlags & 0x02)
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+\tuse transformation");
+ rR.readXForm(s, brush_transformation);
+ hasTransformation = true;
+ SAL_INFO("cppcanvas.emf",
+ "EMF+\tm11: " << brush_transformation.get(0,0) << " m12: " << brush_transformation.get(1,0) <<
+ "\nEMF+\tm21: " << brush_transformation.get(0,1) << " m22: " << brush_transformation.get(1,1) <<
+ "\nEMF+\tdx: " << brush_transformation.get(0,2) << " dy: " << brush_transformation.get(1,2));
- SAL_INFO("cppcanvas.emf", "EMF+\tpath (brush path gradient)");
- SAL_INFO("cppcanvas.emf", "EMF+\theader: 0x" << std::hex << pathHeader << " points: " << std::dec << pathPoints << " additional flags: 0x" << std::hex << pathFlags << std::dec);
+ }
- path = new EMFPPath(pathPoints);
- path->Read(s, pathFlags, rR);
+ if (additionalFlags & 0x08)
+ {
+ s.ReadInt32(blendPoints);
+ SAL_INFO("cppcanvas.emf", "EMF+\tuse blend, points: " << blendPoints);
+ if (blendPoints<0 || sal_uInt32(blendPoints)>SAL_MAX_INT32 / (2 * sizeof(float)))
+ blendPoints = SAL_MAX_INT32 / (2 * sizeof(float));
+ blendPositions = new float[2 * blendPoints];
+ blendFactors = blendPositions + blendPoints;
+
+ for (int i = 0; i < blendPoints; i++)
+ {
+ s.ReadFloat(blendPositions[i]);
+ SAL_INFO("cppcanvas.emf", "EMF+\tposition[" << i << "]: " << blendPositions[i]);
+ }
+
+ for (int i = 0; i < blendPoints; i++)
+ {
+ s.ReadFloat(blendFactors[i]);
+ SAL_INFO("cppcanvas.emf", "EMF+\tfactor[" << i << "]: " << blendFactors[i]);
+ }
+ }
- s.Seek(pos + pathLength);
+ if (additionalFlags & 0x04)
+ {
+ s.ReadInt32(colorblendPoints);
+ SAL_INFO("cppcanvas.emf", "EMF+\tuse color blend, points: " << colorblendPoints);
+
+ if (colorblendPoints<0 || sal_uInt32(colorblendPoints)>SAL_MAX_INT32 / sizeof(float))
+ {
+ colorblendPoints = SAL_MAX_INT32 / sizeof(float);
+ }
+
+ if (sal_uInt32(colorblendPoints) > SAL_MAX_INT32 / sizeof(::Color))
+ {
+ colorblendPoints = SAL_MAX_INT32 / sizeof(::Color);
+ }
+
+ colorblendPositions = new float[colorblendPoints];
+ colorblendColors = new ::Color[colorblendPoints];
+
+ for (int i = 0; i < colorblendPoints; i++)
+ {
+ s.ReadFloat(colorblendPositions[i]);
+ SAL_INFO("cppcanvas.emf", "EMF+\tposition[" << i << "]: " << colorblendPositions[i]);
+ }
+
+ for (int i = 0; i < colorblendPoints; i++)
+ {
+ s.ReadUInt32(color);
+ colorblendColors[i] = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
+ SAL_INFO("cppcanvas.emf", "EMF+\tcolor[" << i << "]: 0x" << std::hex << color << std::dec);
+ }
+ }
- const ::basegfx::B2DRectangle aBounds(::basegfx::tools::getRange(path->GetPolygon(rR, false)));
- areaWidth = aBounds.getWidth();
- areaHeight = aBounds.getHeight();
- SAL_INFO("cppcanvas.emf", "EMF+\t polygon bounding box: " << aBounds.getMinX() << "," << aBounds.getMinY() << " " << aBounds.getWidth() << "x" << aBounds.getHeight());
+ break;
}
- else
+ case BrushTypeLinearGradient:
{
- sal_Int32 boundaryPointCount;
- s.ReadInt32(boundaryPointCount);
-
- sal_uInt64 const pos = s.Tell();
- SAL_INFO("cppcanvas.emf", "EMF+\t use boundary, points: " << boundaryPointCount);
- path = new EMFPPath(boundaryPointCount);
- path->Read(s, 0x0, rR);
-
- s.Seek(pos + 8 * boundaryPointCount);
-
- const ::basegfx::B2DRectangle aBounds(::basegfx::tools::getRange(path->GetPolygon(rR, false)));
- areaWidth = aBounds.getWidth();
- areaHeight = aBounds.getHeight();
- SAL_INFO("cppcanvas.emf", "EMF+\t polygon bounding box: " << aBounds.getMinX() << "," << aBounds.getMinY() << " " << aBounds.getWidth() << "x" << aBounds.getHeight());
- }
+ s.ReadUInt32(additionalFlags).ReadInt32(wrapMode);
+ SAL_INFO("cppcanvas.emf", "EMF+\tlinear gradient, additional flags: 0x" << std::hex << additionalFlags << std::dec);
+ s.ReadFloat(areaX).ReadFloat(areaY).ReadFloat(areaWidth).ReadFloat(areaHeight);
+ SAL_INFO("cppcanvas.emf", "EMF+\tarea: " << areaX << "," << areaY << " - " << areaWidth << "x" << areaHeight);
+ sal_uInt32 color;
+ s.ReadUInt32(color);
+ solidColor = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
+ SAL_INFO("cppcanvas.emf", "EMF+\tfirst color: 0x" << std::hex << color << std::dec);
+ s.ReadUInt32(color);
+ secondColor = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
+ SAL_INFO("cppcanvas.emf", "EMF+\tsecond color: 0x" << std::hex << color << std::dec);
- if (additionalFlags & 0x02) {
- SAL_INFO("cppcanvas.emf", "EMF+\tuse transformation");
- rR.readXForm(s, brush_transformation);
- hasTransformation = true;
- SAL_INFO("cppcanvas.emf",
- "EMF+\tm11: " << brush_transformation.get(0,0) << " m12: " << brush_transformation.get(1,0) <<
- "\nEMF+\tm21: " << brush_transformation.get(0,1) << " m22: " << brush_transformation.get(1,1) <<
- "\nEMF+\tdx: " << brush_transformation.get(0,2) << " dy: " << brush_transformation.get(1,2));
+ // repeated colors, unknown meaning, see http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/ObjectBrush.html
+ s.ReadUInt32(color);
+ s.ReadUInt32(color);
- }
- if (additionalFlags & 0x08) {
- s.ReadInt32(blendPoints);
- SAL_INFO("cppcanvas.emf", "EMF+\tuse blend, points: " << blendPoints);
- if (blendPoints<0 || sal_uInt32(blendPoints)>SAL_MAX_INT32 / (2 * sizeof(float)))
- blendPoints = SAL_MAX_INT32 / (2 * sizeof(float));
- blendPositions = new float[2 * blendPoints];
- blendFactors = blendPositions + blendPoints;
- for (int i = 0; i < blendPoints; i++) {
- s.ReadFloat(blendPositions[i]);
- SAL_INFO("cppcanvas.emf", "EMF+\tposition[" << i << "]: " << blendPositions[i]);
+ if (additionalFlags & 0x02)
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+\tuse transformation");
+ rR.readXForm(s, brush_transformation);
+ hasTransformation = true;
+ SAL_INFO("cppcanvas.emf",
+ "EMF+\tm11: " << brush_transformation.get(0,0) << " m12: " << brush_transformation.get(1,0) <<
+ "\nEMF+\tm21: " << brush_transformation.get(0,1) << " m22: " << brush_transformation.get(1,1) <<
+ "\nEMF+\tdx: " << brush_transformation.get(0,2) << " dy: " << brush_transformation.get(1,2));
}
- for (int i = 0; i < blendPoints; i++) {
- s.ReadFloat(blendFactors[i]);
- SAL_INFO("cppcanvas.emf", "EMF+\tfactor[" << i << "]: " << blendFactors[i]);
- }
- }
- if (additionalFlags & 0x04) {
- s.ReadInt32(colorblendPoints);
- SAL_INFO("cppcanvas.emf", "EMF+\tuse color blend, points: " << colorblendPoints);
- if (colorblendPoints<0 || sal_uInt32(colorblendPoints)>SAL_MAX_INT32 / sizeof(float))
- colorblendPoints = SAL_MAX_INT32 / sizeof(float);
- if (sal_uInt32(colorblendPoints)>SAL_MAX_INT32 / sizeof(::Color))
- colorblendPoints = SAL_MAX_INT32 / sizeof(::Color);
- colorblendPositions = new float[colorblendPoints];
- colorblendColors = new ::Color[colorblendPoints];
- for (int i = 0; i < colorblendPoints; i++) {
- s.ReadFloat(colorblendPositions[i]);
- SAL_INFO("cppcanvas.emf", "EMF+\tposition[" << i << "]: " << colorblendPositions[i]);
- }
- for (int i = 0; i < colorblendPoints; i++) {
- s.ReadUInt32(color);
- colorblendColors[i] = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
- SAL_INFO("cppcanvas.emf", "EMF+\tcolor[" << i << "]: 0x" << std::hex << color << std::dec);
+ if (additionalFlags & 0x08)
+ {
+ s.ReadInt32(blendPoints);
+ SAL_INFO("cppcanvas.emf", "EMF+\tuse blend, points: " << blendPoints);
+ if (blendPoints<0 || sal_uInt32(blendPoints)>SAL_MAX_INT32 / (2 * sizeof(float)))
+ blendPoints = SAL_MAX_INT32 / (2 * sizeof(float));
+ blendPositions = new float[2 * blendPoints];
+ blendFactors = blendPositions + blendPoints;
+
+ for (int i = 0; i < blendPoints; i++)
+ {
+ s.ReadFloat(blendPositions[i]);
+ SAL_INFO("cppcanvas.emf", "EMF+\tposition[" << i << "]: " << blendPositions[i]);
+ }
+
+ for (int i = 0; i < blendPoints; i++)
+ {
+ s.ReadFloat(blendFactors[i]);
+ SAL_INFO("cppcanvas.emf", "EMF+\tfactor[" << i << "]: " << blendFactors[i]);
+ }
}
- }
-
- break;
- }
- case BrushTypeLinearGradient:
- {
- s.ReadUInt32(additionalFlags).ReadInt32(wrapMode);
- SAL_INFO("cppcanvas.emf", "EMF+\tlinear gradient, additional flags: 0x" << std::hex << additionalFlags << std::dec);
-
- s.ReadFloat(areaX).ReadFloat(areaY).ReadFloat(areaWidth).ReadFloat(areaHeight);
-
- SAL_INFO("cppcanvas.emf", "EMF+\tarea: " << areaX << "," << areaY << " - " << areaWidth << "x" << areaHeight);
-
- sal_uInt32 color;
-
- s.ReadUInt32(color);
- solidColor = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
- SAL_INFO("cppcanvas.emf", "EMF+\tfirst color: 0x" << std::hex << color << std::dec);
-
- s.ReadUInt32(color);
- secondColor = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
- SAL_INFO("cppcanvas.emf", "EMF+\tsecond color: 0x" << std::hex << color << std::dec);
-
- // repeated colors, unknown meaning, see http://www.aces.uiuc.edu/~jhtodd/Metafile/MetafileRecords/ObjectBrush.html
- s.ReadUInt32(color);
- s.ReadUInt32(color);
-
- if (additionalFlags & 0x02) {
- SAL_INFO("cppcanvas.emf", "EMF+\tuse transformation");
- rR.readXForm(s, brush_transformation);
- hasTransformation = true;
- SAL_INFO("cppcanvas.emf",
- "EMF+\tm11: " << brush_transformation.get(0,0) << " m12: " << brush_transformation.get(1,0) <<
- "\nEMF+\tm21: " << brush_transformation.get(0,1) << " m22: " << brush_transformation.get(1,1) <<
- "\nEMF+\tdx: " << brush_transformation.get(0,2) << " dy: " << brush_transformation.get(1,2));
- }
- if (additionalFlags & 0x08) {
- s.ReadInt32(blendPoints);
- SAL_INFO("cppcanvas.emf", "EMF+\tuse blend, points: " << blendPoints);
- if (blendPoints<0 || sal_uInt32(blendPoints)>SAL_MAX_INT32 / (2 * sizeof(float)))
- blendPoints = SAL_MAX_INT32 / (2 * sizeof(float));
- blendPositions = new float[2 * blendPoints];
- blendFactors = blendPositions + blendPoints;
- for (int i = 0; i < blendPoints; i++) {
- s.ReadFloat(blendPositions[i]);
- SAL_INFO("cppcanvas.emf", "EMF+\tposition[" << i << "]: " << blendPositions[i]);
- }
- for (int i = 0; i < blendPoints; i++) {
- s.ReadFloat(blendFactors[i]);
- SAL_INFO("cppcanvas.emf", "EMF+\tfactor[" << i << "]: " << blendFactors[i]);
+ if (additionalFlags & 0x04)
+ {
+ s.ReadInt32(colorblendPoints);
+ SAL_INFO("cppcanvas.emf", "EMF+\tuse color blend, points: " << colorblendPoints);
+
+ if (colorblendPoints<0 || sal_uInt32(colorblendPoints)>SAL_MAX_INT32 / sizeof(float))
+ {
+ colorblendPoints = SAL_MAX_INT32 / sizeof(float);
+ }
+
+ if (sal_uInt32(colorblendPoints) > SAL_MAX_INT32 / sizeof(::Color))
+ {
+ colorblendPoints = sal_uInt32(SAL_MAX_INT32) / sizeof(::Color);
+ }
+
+ colorblendPositions = new float[colorblendPoints];
+ colorblendColors = new ::Color[colorblendPoints];
+
+ for (int i = 0; i < colorblendPoints; i++)
+ {
+ s.ReadFloat(colorblendPositions[i]);
+ SAL_INFO("cppcanvas.emf", "EMF+\tposition[" << i << "]: " << colorblendPositions[i]);
+ }
+
+ for (int i = 0; i < colorblendPoints; i++)
+ {
+ s.ReadUInt32(color);
+ colorblendColors[i] = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
+ SAL_INFO("cppcanvas.emf", "EMF+\tcolor[" << i << "]: 0x" << std::hex << color << std::dec);
+ }
}
- }
- if (additionalFlags & 0x04) {
- s.ReadInt32(colorblendPoints);
- SAL_INFO("cppcanvas.emf", "EMF+\tuse color blend, points: " << colorblendPoints);
- if (colorblendPoints<0 || sal_uInt32(colorblendPoints)>SAL_MAX_INT32 / sizeof(float))
- colorblendPoints = SAL_MAX_INT32 / sizeof(float);
- if (sal_uInt32(colorblendPoints)>SAL_MAX_INT32 / sizeof(::Color))
- colorblendPoints = sal_uInt32(SAL_MAX_INT32) / sizeof(::Color);
- colorblendPositions = new float[colorblendPoints];
- colorblendColors = new ::Color[colorblendPoints];
- for (int i = 0; i < colorblendPoints; i++) {
- s.ReadFloat(colorblendPositions[i]);
- SAL_INFO("cppcanvas.emf", "EMF+\tposition[" << i << "]: " << colorblendPositions[i]);
- }
- for (int i = 0; i < colorblendPoints; i++) {
- s.ReadUInt32(color);
- colorblendColors[i] = ::Color(0xff - (color >> 24), (color >> 16) & 0xff, (color >> 8) & 0xff, color & 0xff);
- SAL_INFO("cppcanvas.emf", "EMF+\tcolor[" << i << "]: 0x" << std::hex << color << std::dec);
- }
+ break;
+ }
+ default:
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+\tunhandled brush type: " << std::hex << type << std::dec);
}
-
- break;
- }
- default:
- SAL_INFO("cppcanvas.emf", "EMF+\tunhandled brush type: " << std::hex << type << std::dec);
}
}
}
diff --git a/drawinglayer/source/tools/emfpcustomlinecap.cxx b/drawinglayer/source/tools/emfpcustomlinecap.cxx
index 9024a11a564e..d2d211d62d3e 100644
--- a/drawinglayer/source/tools/emfpcustomlinecap.cxx
+++ b/drawinglayer/source/tools/emfpcustomlinecap.cxx
@@ -46,7 +46,6 @@ namespace emfplushelper
{
const sal_uInt32 EmfPlusCustomLineCapDataTypeDefault = 0x00000000;
const sal_uInt32 EmfPlusCustomLineCapDataTypeAdjustableArrow = 0x00000001;
-
const sal_uInt32 EmfPlusCustomLineCapDataFillPath = 0x00000001;
const sal_uInt32 EmfPlusCustomLineCapDataLinePath = 0x00000002;
@@ -75,17 +74,14 @@ namespace emfplushelper
sal_Int32 pathLength;
s.ReadInt32(pathLength);
SAL_INFO("cppcanvas.emf", "EMF+\t\tpath length: " << pathLength);
-
sal_uInt32 pathHeader;
sal_Int32 pathPoints, pathFlags;
s.ReadUInt32(pathHeader).ReadInt32(pathPoints).ReadInt32(pathFlags);
-
SAL_INFO("cppcanvas.emf", "EMF+\t\tpath (custom cap line path)");
SAL_INFO("cppcanvas.emf", "EMF+\t\theader: 0x" << std::hex << pathHeader << " points: " << std::dec << pathPoints << " additional flags: 0x" << std::hex << pathFlags << std::dec);
EMFPPath path(pathPoints);
path.Read(s, pathFlags, rR);
-
polygon = path.GetPolygon(rR, false);
mbIsFilled = bFill;
@@ -93,16 +89,13 @@ namespace emfplushelper
// expects
B2DHomMatrix aMatrix;
aMatrix.scale(1.0, -1.0);
-
polygon.transform(aMatrix);
};
void EMFPCustomLineCap::Read(SvStream& s, EmfPlusHelperData& rR)
{
sal_uInt32 header;
-
s.ReadUInt32(header).ReadUInt32(type);
-
SAL_INFO("cppcanvas.emf", "EMF+\t\tcustom cap");
SAL_INFO("cppcanvas.emf", "EMF+\t\theader: 0x" << std::hex << header << " type: " << type << std::dec);
diff --git a/drawinglayer/source/tools/emfpfont.cxx b/drawinglayer/source/tools/emfpfont.cxx
index b191a8f4c7e5..754e59e94319 100644
--- a/drawinglayer/source/tools/emfpfont.cxx
+++ b/drawinglayer/source/tools/emfpfont.cxx
@@ -44,11 +44,8 @@ namespace emfplushelper
sal_uInt32 header;
sal_uInt32 reserved;
sal_uInt32 length;
-
s.ReadUInt32(header).ReadFloat(emSize).ReadUInt32(sizeUnit).ReadInt32(fontFlags).ReadUInt32(reserved).ReadUInt32(length);
-
SAL_WARN_IF((header >> 12) != 0xdbc01, "cppcanvas.emf", "Invalid header - not 0xdbc01");
-
SAL_INFO("cppcanvas.emf", "EMF+\tfont\nEMF+\theader: 0x" << std::hex << (header >> 12) << " version: 0x" << (header & 0x1fff) << " size: " << std::dec << emSize << " unit: 0x" << std::hex << sizeUnit << std::dec);
SAL_INFO("cppcanvas.emf", "EMF+\tflags: 0x" << std::hex << fontFlags << " reserved: 0x" << reserved << " length: 0x" << std::hex << length << std::dec);
@@ -58,7 +55,9 @@ namespace emfplushelper
sal_Unicode *chars = pStr->buffer;
for (sal_uInt32 i = 0; i < length; ++i)
+ {
s.ReadUtf16(chars[i]);
+ }
family = OUString(pStr, SAL_NO_ACQUIRE);
SAL_INFO("cppcanvas.emf", "EMF+\tfamily: " << family);
diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx
index fcab2bbd7a44..80d9a7f3fafa 100644
--- a/drawinglayer/source/tools/emfphelperdata.cxx
+++ b/drawinglayer/source/tools/emfphelperdata.cxx
@@ -26,6 +26,8 @@
#include <emfpfont.hxx>
#include <emfpstringformat.hxx>
#include <basegfx/curve/b2dcubicbezier.hxx>
+#include <wmfemfhelper.hxx>
+#include <drawinglayer/primitive2d/polypolygonprimitive2d.hxx>
namespace emfplushelper
{
@@ -33,45 +35,45 @@ namespace emfplushelper
{
switch (type)
{
- case EmfPlusRecordTypeHeader: return "EmfPlusRecordTypeHeader";
- case EmfPlusRecordTypeEndOfFile: return "EmfPlusRecordTypeEndOfFile";
- case EmfPlusRecordTypeGetDC: return "EmfPlusRecordTypeGetDC";
- case EmfPlusRecordTypeObject: return "EmfPlusRecordTypeObject";
- case EmfPlusRecordTypeFillRects: return "EmfPlusRecordTypeFillRects";
- case EmfPlusRecordTypeDrawRects: return "EmfPlusRecordTypeDrawRects";
- case EmfPlusRecordTypeFillPolygon: return "EmfPlusRecordTypeFillPolygon";
- case EmfPlusRecordTypeDrawLines: return "EmfPlusRecordTypeDrawLines";
- case EmfPlusRecordTypeFillEllipse: return "EmfPlusRecordTypeFillEllipse";
- case EmfPlusRecordTypeDrawEllipse: return "EmfPlusRecordTypeDrawEllipse";
- case EmfPlusRecordTypeFillPie: return "EmfPlusRecordTypeFillPie";
- case EmfPlusRecordTypeDrawPie: return "EmfPlusRecordTypeDrawPie";
- case EmfPlusRecordTypeDrawArc: return "EmfPlusRecordTypeDrawArc";
- case EmfPlusRecordTypeFillPath: return "EmfPlusRecordTypeFillPath";
- case EmfPlusRecordTypeDrawPath: return "EmfPlusRecordTypeDrawPath";
- case EmfPlusRecordTypeDrawBeziers: return "EmfPlusRecordTypeDrawBeziers";
- case EmfPlusRecordTypeDrawImage: return "EmfPlusRecordTypeDrawImage";
- case EmfPlusRecordTypeDrawImagePoints: return "EmfPlusRecordTypeDrawImagePoints";
- case EmfPlusRecordTypeDrawString: return "EmfPlusRecordTypeDrawString";
- case EmfPlusRecordTypeSetRenderingOrigin: return "EmfPlusRecordTypeSetRenderingOrigin";
- case EmfPlusRecordTypeSetAntiAliasMode: return "EmfPlusRecordTypeSetAntiAliasMode";
- case EmfPlusRecordTypeSetTextRenderingHint: return "EmfPlusRecordTypeSetTextRenderingHint";
- case EmfPlusRecordTypeSetInterpolationMode: return "EmfPlusRecordTypeSetInterpolationMode";
- case EmfPlusRecordTypeSetPixelOffsetMode: return "EmfPlusRecordTypeSetPixelOffsetMode";
- case EmfPlusRecordTypeSetCompositingQuality: return "EmfPlusRecordTypeSetCompositingQuality";
- case EmfPlusRecordTypeSave: return "EmfPlusRecordTypeSave";
- case EmfPlusRecordTypeRestore: return "EmfPlusRecordTypeRestore";
- case EmfPlusRecordTypeBeginContainerNoParams: return "EmfPlusRecordTypeBeginContainerNoParams";
- case EmfPlusRecordTypeEndContainer: return "EmfPlusRecordTypeEndContainer";
- case EmfPlusRecordTypeSetWorldTransform: return "EmfPlusRecordTypeSetWorldTransform";
- case EmfPlusRecordTypeResetWorldTransform: return "EmfPlusRecordTypeResetWorldTransform";
- case EmfPlusRecordTypeMultiplyWorldTransform: return "EmfPlusRecordTypeMultiplyWorldTransform";
- case EmfPlusRecordTypeTranslateWorldTransform: return "EmfPlusRecordTypeTranslateWorldTransform";
- case EmfPlusRecordTypeScaleWorldTransform: return "EmfPlusRecordTypeScaleWorldTransform";
- case EmfPlusRecordTypeSetPageTransform: return "EmfPlusRecordTypeSetPageTransform";
- case EmfPlusRecordTypeSetClipRect: return "EmfPlusRecordTypeSetClipRect";
- case EmfPlusRecordTypeSetClipPath: return "EmfPlusRecordTypeSetClipPath";
- case EmfPlusRecordTypeSetClipRegion: return "EmfPlusRecordTypeSetClipRegion";
- case EmfPlusRecordTypeDrawDriverString: return "EmfPlusRecordTypeDrawDriverString";
+ case EmfPlusRecordTypeHeader: return "EmfPlusRecordTypeHeader";
+ case EmfPlusRecordTypeEndOfFile: return "EmfPlusRecordTypeEndOfFile";
+ case EmfPlusRecordTypeGetDC: return "EmfPlusRecordTypeGetDC";
+ case EmfPlusRecordTypeObject: return "EmfPlusRecordTypeObject";
+ case EmfPlusRecordTypeFillRects: return "EmfPlusRecordTypeFillRects";
+ case EmfPlusRecordTypeDrawRects: return "EmfPlusRecordTypeDrawRects";
+ case EmfPlusRecordTypeFillPolygon: return "EmfPlusRecordTypeFillPolygon";
+ case EmfPlusRecordTypeDrawLines: return "EmfPlusRecordTypeDrawLines";
+ case EmfPlusRecordTypeFillEllipse: return "EmfPlusRecordTypeFillEllipse";
+ case EmfPlusRecordTypeDrawEllipse: return "EmfPlusRecordTypeDrawEllipse";
+ case EmfPlusRecordTypeFillPie: return "EmfPlusRecordTypeFillPie";
+ case EmfPlusRecordTypeDrawPie: return "EmfPlusRecordTypeDrawPie";
+ case EmfPlusRecordTypeDrawArc: return "EmfPlusRecordTypeDrawArc";
+ case EmfPlusRecordTypeFillPath: return "EmfPlusRecordTypeFillPath";
+ case EmfPlusRecordTypeDrawPath: return "EmfPlusRecordTypeDrawPath";
+ case EmfPlusRecordTypeDrawBeziers: return "EmfPlusRecordTypeDrawBeziers";
+ case EmfPlusRecordTypeDrawImage: return "EmfPlusRecordTypeDrawImage";
+ case EmfPlusRecordTypeDrawImagePoints: return "EmfPlusRecordTypeDrawImagePoints";
+ case EmfPlusRecordTypeDrawString: return "EmfPlusRecordTypeDrawString";
+ case EmfPlusRecordTypeSetRenderingOrigin: return "EmfPlusRecordTypeSetRenderingOrigin";
+ case EmfPlusRecordTypeSetAntiAliasMode: return "EmfPlusRecordTypeSetAntiAliasMode";
+ case EmfPlusRecordTypeSetTextRenderingHint: return "EmfPlusRecordTypeSetTextRenderingHint";
+ case EmfPlusRecordTypeSetInterpolationMode: return "EmfPlusRecordTypeSetInterpolationMode";
+ case EmfPlusRecordTypeSetPixelOffsetMode: return "EmfPlusRecordTypeSetPixelOffsetMode";
+ case EmfPlusRecordTypeSetCompositingQuality: return "EmfPlusRecordTypeSetCompositingQuality";
+ case EmfPlusRecordTypeSave: return "EmfPlusRecordTypeSave";
+ case EmfPlusRecordTypeRestore: return "EmfPlusRecordTypeRestore";
+ case EmfPlusRecordTypeBeginContainerNoParams: return "EmfPlusRecordTypeBeginContainerNoParams";
+ case EmfPlusRecordTypeEndContainer: return "EmfPlusRecordTypeEndContainer";
+ case EmfPlusRecordTypeSetWorldTransform: return "EmfPlusRecordTypeSetWorldTransform";
+ case EmfPlusRecordTypeResetWorldTransform: return "EmfPlusRecordTypeResetWorldTransform";
+ case EmfPlusRecordTypeMultiplyWorldTransform: return "EmfPlusRecordTypeMultiplyWorldTransform";
+ case EmfPlusRecordTypeTranslateWorldTransform: return "EmfPlusRecordTypeTranslateWorldTransform";
+ case EmfPlusRecordTypeScaleWorldTransform: return "EmfPlusRecordTypeScaleWorldTransform";
+ case EmfPlusRecordTypeSetPageTransform: return "EmfPlusRecordTypeSetPageTransform";
+ case EmfPlusRecordTypeSetClipRect: return "EmfPlusRecordTypeSetClipRect";
+ case EmfPlusRecordTypeSetClipPath: return "EmfPlusRecordTypeSetClipPath";
+ case EmfPlusRecordTypeSetClipRegion: return "EmfPlusRecordTypeSetClipRegion";
+ case EmfPlusRecordTypeDrawDriverString: return "EmfPlusRecordTypeDrawDriverString";
}
return "";
}
@@ -126,82 +128,83 @@ namespace emfplushelper
switch (flags & 0x7f00)
{
- case EmfPlusObjectTypeBrush:
- {
- EMFPBrush *brush;
- aObjects[index].reset(brush = new EMFPBrush());
- brush->Read(rObjectStream, *this);
- break;
- }
- case EmfPlusObjectTypePen:
- {
- EMFPPen *pen;
- aObjects[index].reset(pen = new EMFPPen());
- pen->Read(rObjectStream, *this);
- break;
- }
- case EmfPlusObjectTypePath:
- {
- sal_uInt32 header, pathFlags;
- sal_Int32 points;
-
- rObjectStream.ReadUInt32(header).ReadInt32(points).ReadUInt32(pathFlags);
- SAL_INFO("cppcanvas.emf", "EMF+\tpath");
- SAL_INFO("cppcanvas.emf", "EMF+\theader: 0x" << std::hex << header << " points: " << std::dec << points << " additional flags: 0x" << std::hex << pathFlags << std::dec);
- EMFPPath *path;
- aObjects[index].reset(path = new EMFPPath(points));
- path->Read(rObjectStream, pathFlags, *this);
- break;
- }
- case EmfPlusObjectTypeRegion:
- {
- EMFPRegion *region;
- aObjects[index].reset(region = new EMFPRegion());
- region->Read(rObjectStream);
- break;
- }
- case EmfPlusObjectTypeImage:
- {
- EMFPImage *image;
- aObjects[index].reset(image = new EMFPImage);
- image->type = 0;
- image->width = 0;
- image->height = 0;
- image->stride = 0;
- image->pixelFormat = 0;
- image->Read(rObjectStream, dataSize, bUseWholeStream);
- break;
- }
- case EmfPlusObjectTypeFont:
- {
- EMFPFont *font;
- aObjects[index].reset(font = new EMFPFont);
- font->emSize = 0;
- font->sizeUnit = 0;
- font->fontFlags = 0;
- font->Read(rObjectStream);
- break;
- }
- case EmfPlusObjectTypeStringFormat:
- {
- EMFPStringFormat *stringFormat;
- aObjects[index].reset(stringFormat = new EMFPStringFormat());
- stringFormat->Read(rObjectStream);
- break;
- }
- case EmfPlusObjectTypeImageAttributes:
- {
- SAL_INFO("cppcanvas.emf", "EMF+\t Object type 'image attributes' not yet implemented");
- break;
- }
- case EmfPlusObjectTypeCustomLineCap:
- {
- SAL_INFO("cppcanvas.emf", "EMF+\t Object type 'custom line cap' not yet implemented");
- break;
- }
- default:
- SAL_INFO("cppcanvas.emf", "EMF+\tObject unhandled flags: 0x" << std::hex << (flags & 0xff00) << std::dec);
- break;
+ case EmfPlusObjectTypeBrush:
+ {
+ EMFPBrush *brush;
+ aObjects[index].reset(brush = new EMFPBrush());
+ brush->Read(rObjectStream, *this);
+ break;
+ }
+ case EmfPlusObjectTypePen:
+ {
+ EMFPPen *pen;
+ aObjects[index].reset(pen = new EMFPPen());
+ pen->Read(rObjectStream, *this);
+ break;
+ }
+ case EmfPlusObjectTypePath:
+ {
+ sal_uInt32 header, pathFlags;
+ sal_Int32 points;
+
+ rObjectStream.ReadUInt32(header).ReadInt32(points).ReadUInt32(pathFlags);
+ SAL_INFO("cppcanvas.emf", "EMF+\tpath");
+ SAL_INFO("cppcanvas.emf", "EMF+\theader: 0x" << std::hex << header << " points: " << std::dec << points << " additional flags: 0x" << std::hex << pathFlags << std::dec);
+ EMFPPath *path;
+ aObjects[index].reset(path = new EMFPPath(points));
+ path->Read(rObjectStream, pathFlags, *this);
+ break;
+ }
+ case EmfPlusObjectTypeRegion:
+ {
+ EMFPRegion *region;
+ aObjects[index].reset(region = new EMFPRegion());
+ region->Read(rObjectStream);
+ break;
+ }
+ case EmfPlusObjectTypeImage:
+ {
+ EMFPImage *image;
+ aObjects[index].reset(image = new EMFPImage);
+ image->type = 0;
+ image->width = 0;
+ image->height = 0;
+ image->stride = 0;
+ image->pixelFormat = 0;
+ image->Read(rObjectStream, dataSize, bUseWholeStream);
+ break;
+ }
+ case EmfPlusObjectTypeFont:
+ {
+ EMFPFont *font;
+ aObjects[index].reset(font = new EMFPFont);
+ font->emSize = 0;
+ font->sizeUnit = 0;
+ font->fontFlags = 0;
+ font->Read(rObjectStream);
+ break;
+ }
+ case EmfPlusObjectTypeStringFormat:
+ {
+ EMFPStringFormat *stringFormat;
+ aObjects[index].reset(stringFormat = new EMFPStringFormat());
+ stringFormat->Read(rObjectStream);
+ break;
+ }
+ case EmfPlusObjectTypeImageAttributes:
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+\t Object type 'image attributes' not yet implemented");
+ break;
+ }
+ case EmfPlusObjectTypeCustomLineCap:
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+\t Object type 'custom line cap' not yet implemented");
+ break;
+ }
+ default:
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+\tObject unhandled flags: 0x" << std::hex << (flags & 0xff00) << std::dec);
+ }
}
}
@@ -324,6 +327,34 @@ namespace emfplushelper
return ::basegfx::B2DSize(w, h);
}
+ void EmfPlusHelperData::EMFPPlusDrawPolygon(const ::basegfx::B2DPolyPolygon& polygon, sal_uInt32 penIndex)
+ {
+ const EMFPPen* pen = static_cast<EMFPPen*>(aObjects[penIndex & 0xff].get());
+ SAL_WARN_IF(!pen, "cppcanvas.emf", "emf+ missing pen");
+
+ if (pen && polygon.count())
+ {
+ mrTargetHolders.Current().append(
+ new drawinglayer::primitive2d::PolyPolygonHairlinePrimitive2D(
+ polygon,
+ pen->GetColor().getBColor()));
+ }
+ }
+
+ void EmfPlusHelperData::EMFPPlusFillPolygon(const ::basegfx::B2DPolyPolygon& polygon, bool isColor, sal_uInt32 brushIndexOrColor)
+ {
+ if (polygon.count())
+ {
+ if (isColor)
+ {
+ mrTargetHolders.Current().append(
+ new drawinglayer::primitive2d::PolyPolygonColorPrimitive2D(
+ polygon,
+ ::Color(0xff - (brushIndexOrColor >> 24), (brushIndexOrColor >> 16) & 0xff, (brushIndexOrColor >> 8) & 0xff, brushIndexOrColor & 0xff).getBColor()));
+ }
+ }
+ }
+
EmfPlusHelperData::EmfPlusHelperData(
SvMemoryStream& rMS,
wmfemfhelper::TargetHolders& rTargetHolders,
@@ -431,804 +462,834 @@ namespace emfplushelper
{
switch (type)
{
- case EmfPlusRecordTypeHeader:
- {
- sal_uInt32 header, version;
-
- rMS.ReadUInt32(header).ReadUInt32(version).ReadInt32(nHDPI).ReadInt32(nVDPI);
- SAL_INFO("cppcanvas.emf", "EMF+ Header");
- SAL_INFO("cppcanvas.emf", "EMF+\theader: 0x" << std::hex << header << " version: " << std::dec << version << " horizontal DPI: " << nHDPI << " vertical DPI: " << nVDPI << " dual: " << (flags & 1));
- break;
- }
- case EmfPlusRecordTypeEndOfFile:
- {
- SAL_INFO("cppcanvas.emf", "EMF+ EndOfFile");
- break;
- }
- case EmfPlusRecordTypeGetDC:
- {
- SAL_INFO("cppcanvas.emf", "EMF+ GetDC");
- SAL_INFO("cppcanvas.emf", "EMF+\talready used in svtools wmf/emf filter parser");
- break;
- }
- case EmfPlusRecordTypeObject:
- {
- processObjectRecord(rMS, flags, dataSize);
- break;
- }
- case EmfPlusRecordTypeFillPie:
- case EmfPlusRecordTypeDrawPie:
- case EmfPlusRecordTypeDrawArc:
- {
- float startAngle, sweepAngle;
-
- // Silent MSVC warning C4701: potentially uninitialized local variable 'brushIndexOrColor' used
- sal_uInt32 brushIndexOrColor = 999;
-
- if (type == EmfPlusRecordTypeFillPie)
+ case EmfPlusRecordTypeHeader:
{
- rMS.ReadUInt32(brushIndexOrColor);
- SAL_INFO("cppcanvas.emf", "EMF+ FillPie colorOrIndex: " << brushIndexOrColor);
+ sal_uInt32 header, version;
+
+ rMS.ReadUInt32(header).ReadUInt32(version).ReadInt32(nHDPI).ReadInt32(nVDPI);
+ SAL_INFO("cppcanvas.emf", "EMF+ Header");
+ SAL_INFO("cppcanvas.emf", "EMF+\theader: 0x" << std::hex << header << " version: " << std::dec << version << " horizontal DPI: " << nHDPI << " vertical DPI: " << nVDPI << " dual: " << (flags & 1));
+ break;
}
- else if (type == EmfPlusRecordTypeDrawPie)
+ case EmfPlusRecordTypeEndOfFile:
{
- SAL_INFO("cppcanvas.emf", "EMF+ DrawPie");
+ SAL_INFO("cppcanvas.emf", "EMF+ EndOfFile");
+ break;
}
- else
+ case EmfPlusRecordTypeGetDC:
{
- SAL_INFO("cppcanvas.emf", "EMF+ DrawArc");
+ SAL_INFO("cppcanvas.emf", "EMF+ GetDC");
+ SAL_INFO("cppcanvas.emf", "EMF+\talready used in svtools wmf/emf filter parser");
+ break;
}
-
- rMS.ReadFloat(startAngle).ReadFloat(sweepAngle);
- float dx, dy, dw, dh;
- ReadRectangle(rMS, dx, dy, dw, dh, bool(flags & 0x4000));
- SAL_INFO("cppcanvas.emf", "EMF+\t RectData: " << dx << "," << dy << " " << dw << "x" << dh);
- startAngle = 2 * M_PI*startAngle / 360;
- sweepAngle = 2 * M_PI*sweepAngle / 360;
- ::basegfx::B2DPoint mappedCenter(Map(dx + dw / 2, dy + dh / 2));
- ::basegfx::B2DSize mappedSize(MapSize(dw / 2, dh / 2));
- float endAngle = startAngle + sweepAngle;
- startAngle = fmodf(startAngle, static_cast<float>(M_PI * 2));
-
- if (startAngle < 0.0)
+ case EmfPlusRecordTypeObject:
{
- startAngle += static_cast<float>(M_PI * 2.0);
+ processObjectRecord(rMS, flags, dataSize);
+ break;
}
-
- endAngle = fmodf(endAngle, static_cast<float>(M_PI * 2.0));
-
- if (endAngle < 0.0)
+ case EmfPlusRecordTypeFillPie:
+ case EmfPlusRecordTypeDrawPie:
+ case EmfPlusRecordTypeDrawArc:
{
- endAngle += static_cast<float>(M_PI * 2.0);
- }
+ float startAngle, sweepAngle;
- if (sweepAngle < 0)
- {
- std::swap(endAngle, startAngle);
- }
+ // Silent MSVC warning C4701: potentially uninitialized local variable 'brushIndexOrColor' used
+ sal_uInt32 brushIndexOrColor = 999;
- SAL_INFO("cppcanvas.emf", "EMF+\t adjusted angles: start " <<
- (360.0*startAngle / M_PI) << ", end: " << (360.0*endAngle / M_PI) <<
- " startAngle: " << startAngle << " sweepAngle: " << sweepAngle);
+ if (type == EmfPlusRecordTypeFillPie)
+ {
+ rMS.ReadUInt32(brushIndexOrColor);
+ SAL_INFO("cppcanvas.emf", "EMF+ FillPie colorOrIndex: " << brushIndexOrColor);
+ }
+ else if (type == EmfPlusRecordTypeDrawPie)
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+ DrawPie");
+ }
+ else
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+ DrawArc");
+ }
- ::basegfx::B2DPolygon polygon = basegfx::tools::createPolygonFromEllipseSegment(
- mappedCenter, mappedSize.getX(), mappedSize.getY(), startAngle, endAngle);
+ rMS.ReadFloat(startAngle).ReadFloat(sweepAngle);
+ float dx, dy, dw, dh;
+ ReadRectangle(rMS, dx, dy, dw, dh, bool(flags & 0x4000));
+ SAL_INFO("cppcanvas.emf", "EMF+\t RectData: " << dx << "," << dy << " " << dw << "x" << dh);
+ startAngle = 2 * M_PI*startAngle / 360;
+ sweepAngle = 2 * M_PI*sweepAngle / 360;
+ ::basegfx::B2DPoint mappedCenter(Map(dx + dw / 2, dy + dh / 2));
+ ::basegfx::B2DSize mappedSize(MapSize(dw / 2, dh / 2));
+ float endAngle = startAngle + sweepAngle;
+ startAngle = fmodf(startAngle, static_cast<float>(M_PI * 2));
+
+ if (startAngle < 0.0)
+ {
+ startAngle += static_cast<float>(M_PI * 2.0);
+ }
- if (type != EmfPlusRecordTypeDrawArc)
- {
- polygon.append(mappedCenter);
- polygon.setClosed(true);
- }
+ endAngle = fmodf(endAngle, static_cast<float>(M_PI * 2.0));
- ::basegfx::B2DPolyPolygon polyPolygon(polygon);
-// if (type == EmfPlusRecordTypeFillPie)
-// EMFPPlusFillPolygon(polyPolygon,
-// rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor);
-// else
-// EMFPPlusDrawPolygon(polyPolygon,
-// rFactoryParms, rState, rCanvas, flags & 0xff);
- }
- break;
- case EmfPlusRecordTypeFillPath:
- {
- sal_uInt32 index = flags & 0xff;
- sal_uInt32 brushIndexOrColor;
- rMS.ReadUInt32(brushIndexOrColor);
- SAL_INFO("cppcanvas.emf", "EMF+ FillPath slot: " << index);
+ if (endAngle < 0.0)
+ {
+ endAngle += static_cast<float>(M_PI * 2.0);
+ }
-// EMFPPlusFillPolygon(static_cast<EMFPPath*>(aObjects[index])->GetPolygon(*this), rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor);
- }
- break;
- case EmfPlusRecordTypeDrawEllipse:
- case EmfPlusRecordTypeFillEllipse:
- {
- // Intentionally very bogus initial value to avoid MSVC complaining about potentially uninitialized local
- // variable. As long as the code stays as intended, this variable will be assigned a (real) value in the case
- // when it is later used.
- sal_uInt32 brushIndexOrColor = 1234567;
+ if (sweepAngle < 0)
+ {
+ std::swap(endAngle, startAngle);
+ }
- if (type == EmfPlusRecordTypeFillEllipse)
- {
- rMS.ReadUInt32(brushIndexOrColor);
- }
+ SAL_INFO("cppcanvas.emf", "EMF+\t adjusted angles: start " <<
+ (360.0*startAngle / M_PI) << ", end: " << (360.0*endAngle / M_PI) <<
+ " startAngle: " << startAngle << " sweepAngle: " << sweepAngle);
- SAL_INFO("cppcanvas.emf", "EMF+ " << (type == EmfPlusRecordTypeFillEllipse ? "Fill" : "Draw") << "Ellipse slot: " << (flags & 0xff));
- float dx, dy, dw, dh;
- ReadRectangle(rMS, dx, dy, dw, dh, bool(flags & 0x4000));
- SAL_INFO("cppcanvas.emf", "EMF+ RectData: " << dx << "," << dy << " " << dw << "x" << dh);
- ::basegfx::B2DPoint mappedCenter(Map(dx + dw / 2, dy + dh / 2));
- ::basegfx::B2DSize mappedSize(MapSize(dw / 2, dh / 2));
- ::basegfx::B2DPolyPolygon polyPolygon(
- ::basegfx::B2DPolygon(
- ::basegfx::tools::createPolygonFromEllipse(mappedCenter, mappedSize.getX(), mappedSize.getY())));
-
-// if (type == EmfPlusRecordTypeFillEllipse)
-// EMFPPlusFillPolygon(polyPolygon,
-// rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor);
-// else
-// EMFPPlusDrawPolygon(polyPolygon,
-// rFactoryParms, rState, rCanvas, flags & 0xff);
- }
- break;
- case EmfPlusRecordTypeFillRects:
- case EmfPlusRecordTypeDrawRects:
- {
- // Silent MSVC warning C4701: potentially uninitialized local variable 'brushIndexOrColor' used
- sal_uInt32 brushIndexOrColor = 999;
- sal_Int32 rectangles;
- bool isColor = (flags & 0x8000);
- ::basegfx::B2DPolygon polygon;
+ ::basegfx::B2DPolygon polygon = basegfx::tools::createPolygonFromEllipseSegment(
+ mappedCenter, mappedSize.getX(), mappedSize.getY(), startAngle, endAngle);
+
+ if (type != EmfPlusRecordTypeDrawArc)
+ {
+ polygon.append(mappedCenter);
+ polygon.setClosed(true);
+ }
- if (EmfPlusRecordTypeFillRects == type)
+ ::basegfx::B2DPolyPolygon polyPolygon(polygon);
+ if (type == EmfPlusRecordTypeFillPie)
+ {
+ EMFPPlusFillPolygon(polyPolygon, flags & 0x8000, brushIndexOrColor);
+ // EMFPPlusFillPolygon(polyPolygon,
+ // rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor);
+ }
+ else
+ {
+ EMFPPlusDrawPolygon(polyPolygon, flags & 0xff);
+ // EMFPPlusDrawPolygon(polyPolygon,
+ // rFactoryParms, rState, rCanvas, flags & 0xff);
+ }
+ }
+ break;
+ case EmfPlusRecordTypeFillPath:
{
- SAL_INFO("cppcanvas.emf", "EMF+ FillRects");
+ sal_uInt32 index = flags & 0xff;
+ sal_uInt32 brushIndexOrColor;
rMS.ReadUInt32(brushIndexOrColor);
- SAL_INFO("cppcanvas.emf", "EMF+\t" << (isColor ? "color" : "brush index") << ": 0x" << std::hex << brushIndexOrColor << std::dec);
+ SAL_INFO("cppcanvas.emf", "EMF+ FillPath slot: " << index);
+
+ EMFPPlusFillPolygon(static_cast<EMFPPath*>(aObjects[index].get())->GetPolygon(*this), flags & 0x8000, brushIndexOrColor);
+ // EMFPPlusFillPolygon(static_cast<EMFPPath*>(aObjects[index])->GetPolygon(*this), rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor);
}
- else
+ break;
+ case EmfPlusRecordTypeDrawEllipse:
+ case EmfPlusRecordTypeFillEllipse:
{
- SAL_INFO("cppcanvas.emf", "EMF+ DrawRects");
- }
+ // Intentionally very bogus initial value to avoid MSVC complaining about potentially uninitialized local
+ // variable. As long as the code stays as intended, this variable will be assigned a (real) value in the case
+ // when it is later used.
+ sal_uInt32 brushIndexOrColor = 1234567;
- rMS.ReadInt32(rectangles);
+ if (type == EmfPlusRecordTypeFillEllipse)
+ {
+ rMS.ReadUInt32(brushIndexOrColor);
+ }
- for (int i = 0; i < rectangles; i++)
+ SAL_INFO("cppcanvas.emf", "EMF+ " << (type == EmfPlusRecordTypeFillEllipse ? "Fill" : "Draw") << "Ellipse slot: " << (flags & 0xff));
+ float dx, dy, dw, dh;
+ ReadRectangle(rMS, dx, dy, dw, dh, bool(flags & 0x4000));
+ SAL_INFO("cppcanvas.emf", "EMF+ RectData: " << dx << "," << dy << " " << dw << "x" << dh);
+ ::basegfx::B2DPoint mappedCenter(Map(dx + dw / 2, dy + dh / 2));
+ ::basegfx::B2DSize mappedSize(MapSize(dw / 2, dh / 2));
+ ::basegfx::B2DPolyPolygon polyPolygon(
+ ::basegfx::B2DPolygon(
+ ::basegfx::tools::createPolygonFromEllipse(mappedCenter, mappedSize.getX(), mappedSize.getY())));
+
+ if (type == EmfPlusRecordTypeFillEllipse)
+ {
+ EMFPPlusFillPolygon(polyPolygon, flags & 0x8000, brushIndexOrColor);
+ // EMFPPlusFillPolygon(polyPolygon,
+ // rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor);
+ }
+ else
+ {
+ EMFPPlusDrawPolygon(polyPolygon, flags & 0xff);
+ // EMFPPlusDrawPolygon(polyPolygon,
+ // rFactoryParms, rState, rCanvas, flags & 0xff);
+ }
+ }
+ break;
+ case EmfPlusRecordTypeFillRects:
+ case EmfPlusRecordTypeDrawRects:
{
- float x, y, width, height;
- ReadRectangle(rMS, x, y, width, height, bool(flags & 0x4000));
+ // Silent MSVC warning C4701: potentially uninitialized local variable 'brushIndexOrColor' used
+ sal_uInt32 brushIndexOrColor = 999;
+ sal_Int32 rectangles;
+ bool isColor = (flags & 0x8000);
+ ::basegfx::B2DPolygon polygon;
- polygon.append(Map(x, y));
- polygon.append(Map(x + width, y));
- polygon.append(Map(x + width, y + height));
- polygon.append(Map(x, y + height));
- polygon.append(Map(x, y));
-
- SAL_INFO("cppcanvas.emf", "EMF+\trectangle: " << x << ", " << width << "x" << height);
+ if (EmfPlusRecordTypeFillRects == type)
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+ FillRects");
+ rMS.ReadUInt32(brushIndexOrColor);
+ SAL_INFO("cppcanvas.emf", "EMF+\t" << (isColor ? "color" : "brush index") << ": 0x" << std::hex << brushIndexOrColor << std::dec);
+ }
+ else
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+ DrawRects");
+ }
- ::basegfx::B2DPolyPolygon polyPolygon(polygon);
-// if (type == EmfPlusRecordTypeFillRects)
-// EMFPPlusFillPolygon(polyPolygon,
-// rFactoryParms, rState, rCanvas, isColor, brushIndexOrColor);
-// else
-// EMFPPlusDrawPolygon(polyPolygon,
-// rFactoryParms, rState, rCanvas, flags & 0xff);
- }
- break;
- }
- case EmfPlusRecordTypeFillPolygon:
- {
- sal_uInt8 index = flags & 0xff;
- sal_uInt32 brushIndexOrColor;
- sal_Int32 points;
+ rMS.ReadInt32(rectangles);
- rMS.ReadUInt32(brushIndexOrColor);
- rMS.ReadInt32(points);
- SAL_INFO("cppcanvas.emf", "EMF+ FillPolygon in slot: " << +index << " points: " << points);
- SAL_INFO("cppcanvas.emf", "EMF+\t: " << ((flags & 0x8000) ? "color" : "brush index") << " 0x" << std::hex << brushIndexOrColor << std::dec);
+ for (int i = 0; i < rectangles; i++)
+ {
+ float x, y, width, height;
+ ReadRectangle(rMS, x, y, width, height, bool(flags & 0x4000));
- EMFPPath path(points, true);
- path.Read(rMS, flags, *this);
+ polygon.append(Map(x, y));
+ polygon.append(Map(x + width, y));
+ polygon.append(Map(x + width, y + height));
+ polygon.append(Map(x, y + height));
+ polygon.append(Map(x, y));
-// EMFPPlusFillPolygon(path.GetPolygon(*this), rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor);
+ SAL_INFO("cppcanvas.emf", "EMF+\trectangle: " << x << ", " << width << "x" << height);
- break;
- }
- case EmfPlusRecordTypeDrawLines:
- {
- sal_uInt32 points;
- rMS.ReadUInt32(points);
- SAL_INFO("cppcanvas.emf", "EMF+ DrawLines in slot: " << (flags & 0xff) << " points: " << points);
- EMFPPath path(points, true);
- path.Read(rMS, flags, *this);
+ ::basegfx::B2DPolyPolygon polyPolygon(polygon);
+ if (type == EmfPlusRecordTypeFillRects)
+ {
+ EMFPPlusFillPolygon(polyPolygon, isColor, brushIndexOrColor);
+ // EMFPPlusFillPolygon(polyPolygon,
+ // rFactoryParms, rState, rCanvas, isColor, brushIndexOrColor);
+ }
+ else
+ {
+ EMFPPlusDrawPolygon(polyPolygon, flags & 0xff);
+ // EMFPPlusDrawPolygon(polyPolygon,
+ // rFactoryParms, rState, rCanvas, flags & 0xff);
+ }
+ }
+ break;
+ }
+ case EmfPlusRecordTypeFillPolygon:
+ {
+ sal_uInt8 index = flags & 0xff;
+ sal_uInt32 brushIndexOrColor;
+ sal_Int32 points;
- // 0x2000 bit indicates whether to draw an extra line between the last point
- // and the first point, to close the shape.
-// EMFPPlusDrawPolygon(path.GetPolygon(*this, true, (flags & 0x2000)), rFactoryParms, rState, rCanvas, flags);
+ rMS.ReadUInt32(brushIndexOrColor);
+ rMS.ReadInt32(points);
+ SAL_INFO("cppcanvas.emf", "EMF+ FillPolygon in slot: " << +index << " points: " << points);
+ SAL_INFO("cppcanvas.emf", "EMF+\t: " << ((flags & 0x8000) ? "color" : "brush index") << " 0x" << std::hex << brushIndexOrColor << std::dec);
- break;
- }
- case EmfPlusRecordTypeDrawPath:
- {
- sal_uInt32 penIndex;
- rMS.ReadUInt32(penIndex);
- SAL_INFO("cppcanvas.emf", "EMF+ DrawPath");
- SAL_INFO("cppcanvas.emf", "EMF+\tpen: " << penIndex);
- EMFPPath* path = static_cast<EMFPPath*>(aObjects[flags & 0xff].get());
- SAL_WARN_IF(!path, "cppcanvas.emf", "EmfPlusRecordTypeDrawPath missing path");
+ EMFPPath path(points, true);
+ path.Read(rMS, flags, *this);
-// EMFPPlusDrawPolygon(path->GetPolygon(*this), rFactoryParms, rState, rCanvas, penIndex);
+ EMFPPlusFillPolygon(path.GetPolygon(*this), flags & 0x8000, brushIndexOrColor);
+ // EMFPPlusFillPolygon(path.GetPolygon(*this), rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor);
- break;
- }
- case EmfPlusRecordTypeDrawBeziers:
- {
- sal_uInt32 aCount;
- float x1, y1, x2, y2, x3, y3, x4, y4;
- ::basegfx::B2DPoint aStartPoint, aControlPointA, aControlPointB, aEndPoint;
- ::basegfx::B2DPolygon aPolygon;
- rMS.ReadUInt32(aCount);
- SAL_INFO("cppcanvas.emf", "EMF+ DrawBeziers slot: " << (flags & 0xff) << "Number of points: " << aCount);
- SAL_WARN_IF((aCount - 1) % 3 != 0, "cppcanvas.emf", "EMF+\t Bezier Draw not support number of points other than 4, 7, 10, 13, 16...");
-
- if (aCount < 4)
- {
- SAL_WARN("cppcanvas.emf", "EMF+\t Bezier Draw does not support less than 4 points. Number of points: " << aCount);
break;
}
+ case EmfPlusRecordTypeDrawLines:
+ {
+ sal_uInt32 points;
+ rMS.ReadUInt32(points);
+ SAL_INFO("cppcanvas.emf", "EMF+ DrawLines in slot: " << (flags & 0xff) << " points: " << points);
+ EMFPPath path(points, true);
+ path.Read(rMS, flags, *this);
- ReadPoint(rMS, x1, y1, flags);
- // We need to add first starting point
- aStartPoint = Map(x1, y1);
- aPolygon.append(aStartPoint);
+ // 0x2000 bit indicates whether to draw an extra line between the last point
+ // and the first point, to close the shape.
+ EMFPPlusDrawPolygon(path.GetPolygon(*this, true, (flags & 0x2000)), flags);
+ // EMFPPlusDrawPolygon(path.GetPolygon(*this, true, (flags & 0x2000)), rFactoryParms, rState, rCanvas, flags);
- for (sal_uInt32 i = 4; i <= aCount; i += 3)
+ break;
+ }
+ case EmfPlusRecordTypeDrawPath:
{
- ReadPoint(rMS, x2, y2, flags);
- ReadPoint(rMS, x3, y3, flags);
- ReadPoint(rMS, x4, y4, flags);
+ sal_uInt32 penIndex;
+ rMS.ReadUInt32(penIndex);
+ SAL_INFO("cppcanvas.emf", "EMF+ DrawPath");
+ SAL_INFO("cppcanvas.emf", "EMF+\tpen: " << penIndex);
+ EMFPPath* path = static_cast<EMFPPath*>(aObjects[flags & 0xff].get());
+ SAL_WARN_IF(!path, "cppcanvas.emf", "EmfPlusRecordTypeDrawPath missing path");
- SAL_INFO("cppcanvas.emf", "EMF+\t Bezier points: " << x1 << "," << y1 << " " << x2 << "," << y2 << " " << x3 << "," << y3 << " " << x4 << "," << y4);
+ EMFPPlusDrawPolygon(path->GetPolygon(*this), penIndex);
+ // EMFPPlusDrawPolygon(path->GetPolygon(*this), rFactoryParms, rState, rCanvas, penIndex);
- aStartPoint = Map(x1, y1);
- aControlPointA = Map(x2, y2);
- aControlPointB = Map(x3, y3);
- aEndPoint = Map(x4, y4);
-
- ::basegfx::B2DCubicBezier cubicBezier(aStartPoint, aControlPointA, aControlPointB, aEndPoint);
- cubicBezier.adaptiveSubdivideByDistance(aPolygon, 10.0);
-// EMFPPlusDrawPolygon(::basegfx::B2DPolyPolygon(aPolygon), rFactoryParms,
-// rState, rCanvas, flags & 0xff);
- // The ending coordinate of one Bezier curve is the starting coordinate of the next.
- x1 = x4;
- y1 = y4;
+ break;
}
- break;
- }
- case EmfPlusRecordTypeDrawImage:
- case EmfPlusRecordTypeDrawImagePoints:
- {
- sal_uInt32 attrIndex;
- sal_Int32 sourceUnit;
- rMS.ReadUInt32(attrIndex).ReadInt32(sourceUnit);
- SAL_INFO("cppcanvas.emf", "EMF+ " << (type == EmfPlusRecordTypeDrawImagePoints ? "DrawImagePoints" : "DrawImage") << "attributes index: " << attrIndex << "source unit: " << sourceUnit);
- SAL_INFO("cppcanvas.emf", "EMF+\tTODO: use image attributes");
-
- if (sourceUnit == 2 && aObjects[flags & 0xff].get())
+ case EmfPlusRecordTypeDrawBeziers:
{
- // we handle only GraphicsUnit.Pixel now
- EMFPImage& image = *static_cast<EMFPImage *>(aObjects[flags & 0xff].get());
- float sx, sy, sw, sh;
- sal_Int32 aCount;
- ReadRectangle(rMS, sx, sy, sw, sh);
- ::tools::Rectangle aSource(Point(sx, sy), Size(sw, sh));
- SAL_INFO("cppcanvas.emf", "EMF+ " << (type == EmfPlusRecordTypeDrawImagePoints ? "DrawImagePoints" : "DrawImage") << " source rectangle: " << sx << "," << sy << " " << sw << "x" << sh);
- ::basegfx::B2DPoint aDstPoint;
- ::basegfx::B2DSize aDstSize;
- bool bValid = false;
-
- if (type == EmfPlusRecordTypeDrawImagePoints)
+ sal_uInt32 aCount;
+ float x1, y1, x2, y2, x3, y3, x4, y4;
+ ::basegfx::B2DPoint aStartPoint, aControlPointA, aControlPointB, aEndPoint;
+ ::basegfx::B2DPolygon aPolygon;
+ rMS.ReadUInt32(aCount);
+ SAL_INFO("cppcanvas.emf", "EMF+ DrawBeziers slot: " << (flags & 0xff) << "Number of points: " << aCount);
+ SAL_WARN_IF((aCount - 1) % 3 != 0, "cppcanvas.emf", "EMF+\t Bezier Draw not support number of points other than 4, 7, 10, 13, 16...");
+
+ if (aCount < 4)
+ {
+ SAL_WARN("cppcanvas.emf", "EMF+\t Bezier Draw does not support less than 4 points. Number of points: " << aCount);
+ break;
+ }
+
+ ReadPoint(rMS, x1, y1, flags);
+ // We need to add first starting point
+ aStartPoint = Map(x1, y1);
+ aPolygon.append(aStartPoint);
+
+ for (sal_uInt32 i = 4; i <= aCount; i += 3)
{
- rMS.ReadInt32(aCount);
+ ReadPoint(rMS, x2, y2, flags);
+ ReadPoint(rMS, x3, y3, flags);
+ ReadPoint(rMS, x4, y4, flags);
+
+ SAL_INFO("cppcanvas.emf", "EMF+\t Bezier points: " << x1 << "," << y1 << " " << x2 << "," << y2 << " " << x3 << "," << y3 << " " << x4 << "," << y4);
+
+ aStartPoint = Map(x1, y1);
+ aControlPointA = Map(x2, y2);
+ aControlPointB = Map(x3, y3);
+ aEndPoint = Map(x4, y4);
+
+ ::basegfx::B2DCubicBezier cubicBezier(aStartPoint, aControlPointA, aControlPointB, aEndPoint);
+ cubicBezier.adaptiveSubdivideByDistance(aPolygon, 10.0);
+
+ EMFPPlusDrawPolygon(::basegfx::B2DPolyPolygon(aPolygon), flags & 0xff);
+ // EMFPPlusDrawPolygon(::basegfx::B2DPolyPolygon(aPolygon), rFactoryParms,
+ // rState, rCanvas, flags & 0xff);
+ // The ending coordinate of one Bezier curve is the starting coordinate of the next.
+ x1 = x4;
+ y1 = y4;
+ }
+ break;
+ }
+ case EmfPlusRecordTypeDrawImage:
+ case EmfPlusRecordTypeDrawImagePoints:
+ {
+ sal_uInt32 attrIndex;
+ sal_Int32 sourceUnit;
+ rMS.ReadUInt32(attrIndex).ReadInt32(sourceUnit);
+ SAL_INFO("cppcanvas.emf", "EMF+ " << (type == EmfPlusRecordTypeDrawImagePoints ? "DrawImagePoints" : "DrawImage") << "attributes index: " << attrIndex << "source unit: " << sourceUnit);
+ SAL_INFO("cppcanvas.emf", "EMF+\tTODO: use image attributes");
- if (aCount == 3)
+ if (sourceUnit == 2 && aObjects[flags & 0xff].get())
+ {
+ // we handle only GraphicsUnit.Pixel now
+ EMFPImage& image = *static_cast<EMFPImage *>(aObjects[flags & 0xff].get());
+ float sx, sy, sw, sh;
+ sal_Int32 aCount;
+ ReadRectangle(rMS, sx, sy, sw, sh);
+ ::tools::Rectangle aSource(Point(sx, sy), Size(sw, sh));
+ SAL_INFO("cppcanvas.emf", "EMF+ " << (type == EmfPlusRecordTypeDrawImagePoints ? "DrawImagePoints" : "DrawImage") << " source rectangle: " << sx << "," << sy << " " << sw << "x" << sh);
+ ::basegfx::B2DPoint aDstPoint;
+ ::basegfx::B2DSize aDstSize;
+ bool bValid = false;
+
+ if (type == EmfPlusRecordTypeDrawImagePoints)
{
- // TODO: now that we now that this value is count we should support it better
- float x1, y1, x2, y2, x3, y3;
+ rMS.ReadInt32(aCount);
- ReadPoint(rMS, x1, y1, flags);
- ReadPoint(rMS, x2, y2, flags);
- ReadPoint(rMS, x3, y3, flags);
+ if (aCount == 3)
+ {
+ // TODO: now that we now that this value is count we should support it better
+ float x1, y1, x2, y2, x3, y3;
- SAL_INFO("cppcanvas.emf", "EMF+ destination points: " << x1 << "," << y1 << " " << x2 << "," << y2 << " " << x3 << "," << y3);
- SAL_INFO("cppcanvas.emf", "EMF+ destination rectangle: " << x1 << "," << y1 << " " << x2 - x1 << "x" << y3 - y1);
+ ReadPoint(rMS, x1, y1, flags);
+ ReadPoint(rMS, x2, y2, flags);
+ ReadPoint(rMS, x3, y3, flags);
- aDstPoint = Map(x1, y1);
- aDstSize = MapSize(x2 - x1, y3 - y1);
+ SAL_INFO("cppcanvas.emf", "EMF+ destination points: " << x1 << "," << y1 << " " << x2 << "," << y2 << " " << x3 << "," << y3);
+ SAL_INFO("cppcanvas.emf", "EMF+ destination rectangle: " << x1 << "," << y1 << " " << x2 - x1 << "x" << y3 - y1);
+ aDstPoint = Map(x1, y1);
+ aDstSize = MapSize(x2 - x1, y3 - y1);
+
+ bValid = true;
+ }
+ }
+ else if (type == EmfPlusRecordTypeDrawImage)
+ {
+ float dx, dy, dw, dh;
+ ReadRectangle(rMS, dx, dy, dw, dh, bool(flags & 0x4000));
+ SAL_INFO("cppcanvas.emf", "EMF+ destination rectangle: " << dx << "," << dy << " " << dw << "x" << dh);
+ aDstPoint = Map(dx, dy);
+ aDstSize = MapSize(dw, dh);
bValid = true;
}
- }
- else if (type == EmfPlusRecordTypeDrawImage)
- {
- float dx, dy, dw, dh;
- ReadRectangle(rMS, dx, dy, dw, dh, bool(flags & 0x4000));
- SAL_INFO("cppcanvas.emf", "EMF+ destination rectangle: " << dx << "," << dy << " " << dw << "x" << dh);
- aDstPoint = Map(dx, dy);
- aDstSize = MapSize(dw, dh);
- bValid = true;
- }
- if (bValid)
- {
- BitmapEx aBmp(image.graphic.GetBitmapEx());
- aBmp.Crop(aSource);
- Size aSize(aBmp.GetSizePixel());
- SAL_INFO("cppcanvas.emf", "EMF+ bitmap size: " << aSize.Width() << "x" << aSize.Height());
- if (aSize.Width() > 0 && aSize.Height() > 0)
+ if (bValid)
{
-// ActionSharedPtr pBmpAction(
-// internal::BitmapActionFactory::createBitmapAction(
-// aBmp,
-// rState.mapModeTransform * aDstPoint,
-// rState.mapModeTransform * aDstSize,
-// rCanvas,
-// rState));
-//
-// if (pBmpAction) {
-// maActions.push_back(MtfAction(pBmpAction,
-// rFactoryParms.mrCurrActionIndex));
-//
-// rFactoryParms.mrCurrActionIndex += pBmpAction->getActionCount() - 1;
-// }
+ BitmapEx aBmp(image.graphic.GetBitmapEx());
+ aBmp.Crop(aSource);
+ Size aSize(aBmp.GetSizePixel());
+ SAL_INFO("cppcanvas.emf", "EMF+ bitmap size: " << aSize.Width() << "x" << aSize.Height());
+ if (aSize.Width() > 0 && aSize.Height() > 0)
+ {
+ // ActionSharedPtr pBmpAction(
+ // internal::BitmapActionFactory::createBitmapAction(
+ // aBmp,
+ // rState.mapModeTransform * aDstPoint,
+ // rState.mapModeTransform * aDstSize,
+ // rCanvas,
+ // rState));
+ //
+ // if (pBmpAction) {
+ // maActions.push_back(MtfAction(pBmpAction,
+ // rFactoryParms.mrCurrActionIndex));
+ //
+ // rFactoryParms.mrCurrActionIndex += pBmpAction->getActionCount() - 1;
+ // }
+ }
+ else
+ {
+ SAL_INFO("cppcanvas.emf", "EMF+ warning: empty bitmap");
+ }
}
else
{
- SAL_INFO("cppcanvas.emf", "EMF+ warning: empty bitmap");
+ SAL_WARN("cppcanvas.emf", "EMF+ DrawImage(Points) TODO (fixme)");
}
}
else
{
- SAL_WARN("cppcanvas.emf", "EMF+ DrawImage(Points) TODO (fixme)");
+ SAL_WARN("cppcanvas.emf", "EMF+ DrawImage(Points) TODO (fixme) - possibly unsupported source units for crop rectangle");
}
+ break;
}
- else
+ case EmfPlusRecordTypeDrawString:
{
- SAL_WARN("cppcanvas.emf", "EMF+ DrawImage(Points) TODO (fixme) - possibly unsupported source units for crop rectangle");
+ SAL_INFO("cppcanvas.emf", "EMF+ DrawString");
+ sal_uInt32 brushId;
+ sal_uInt32 formatId;
+ sal_uInt32 stringLength;
+ rMS.ReadUInt32(brushId).ReadUInt32(formatId).ReadUInt32(stringLength);
+ SAL_INFO("cppcanvas.emf", "EMF+ DrawString brushId: " << brushId << " formatId: " << formatId << " length: " << stringLength);
+
+ if (flags & 0x8000)
+ {
+ float lx, ly, lw, lh;
+ rMS.ReadFloat(lx).ReadFloat(ly).ReadFloat(lw).ReadFloat(lh);
+ SAL_INFO("cppcanvas.emf", "EMF+ DrawString layoutRect: " << lx << "," << ly << " - " << lw << "x" << lh);
+ OUString text = read_uInt16s_ToOUString(rMS, stringLength);
+ EMFPStringFormat *stringFormat = static_cast< EMFPStringFormat* >(aObjects[formatId & 0xff].get());
+ // css::rendering::FontRequest aFontRequest;
+ //
+ // if (stringFormat)
+ // {
+ // LanguageTag aLanguageTag(static_cast< LanguageType >(stringFormat->language));
+ // aFontRequest.Locale = aLanguageTag.getLocale(false);
+ // SAL_INFO("cppcanvas.emf", "EMF+\t\t Font locale, Country:" << aLanguageTag.getCountry() << " Language:" << aLanguageTag.getLanguage());
+ // }
+ //
+ // SAL_INFO("cppcanvas.emf", "EMF+\t\t TODO Use all string formatting attributes during drawing");
+ //
+ // double cellSize = setFont(aFontRequest, flags & 0xff, rFactoryParms, rState);
+ // rState.textColor = COLOR(brushId);
+ //
+ // ::basegfx::B2DPoint point(Map(lx + 0.15*cellSize, ly + cellSize));
+ //
+ // ActionSharedPtr pTextAction(
+ // TextActionFactory::createTextAction(
+ // // position is just rough guess for now
+ // // we should calculate it exactly from layoutRect or font
+ // vcl::unotools::pointFromB2DPoint(point),
+ // ::Size(),
+ // ::Color(),
+ // ::Size(),
+ // ::Color(),
+ // text,
+ // 0,
+ // stringLength,
+ // nullptr,
+ // rFactoryParms.mrVDev,
+ // rFactoryParms.mrCanvas,
+ // rState,
+ // rFactoryParms.mrParms,
+ // false));
+ // if (pTextAction)
+ // {
+ // SAL_INFO("cppcanvas.emf", "EMF+\t\tadd text action");
+ //
+ // maActions.push_back(
+ // MtfAction(
+ // pTextAction,
+ // rFactoryParms.mrCurrActionIndex));
+ //
+ // rFactoryParms.mrCurrActionIndex += pTextAction->getActionCount() - 1;
+ // }
+ }
+ else
+ {
+ SAL_WARN("cppcanvas.emf", "EMF+ DrawString TODO - drawing with brush not yet supported");
+ }
+ break;
}
- break;
- }
- case EmfPlusRecordTypeDrawString:
- {
- SAL_INFO("cppcanvas.emf", "EMF+ DrawString");
- sal_uInt32 brushId;
- sal_uInt32 formatId;
- sal_uInt32 stringLength;
- rMS.ReadUInt32(brushId).ReadUInt32(formatId).ReadUInt32(stringLength);
- SAL_INFO("cppcanvas.emf", "EMF+ DrawString brushId: " << brushId << " formatId: " << formatId << " length: " << stringLength);
-
- if (flags & 0x8000)
+ case EmfPlusRecordTypeSetPageTransform:
{
- float lx, ly, lw, lh;
- rMS.ReadFloat(lx).ReadFloat(ly).ReadFloat(lw).ReadFloat(lh);
- SAL_INFO("cppcanvas.emf", "EMF+ DrawString layoutRect: " << lx << "," << ly << " - " << lw << "x" << lh);
- OUString text = read_uInt16s_ToOUString(rMS, stringLength);
- EMFPStringFormat *stringFormat = static_cast< EMFPStringFormat* >(aObjects[formatId & 0xff].get());
- css::rendering::FontRequest aFontRequest;
-
- if (stringFormat)
+ rMS.ReadFloat(fPageScale);
+ SAL_INFO("cppcanvas.emf", "EMF+ SetPageTransform");
+ SAL_INFO("cppcanvas.emf", "EMF+\tscale: " << fPageScale << " unit: " << flags);
+
+ if (flags != UnitTypePixel)
{
- LanguageTag aLanguageTag(static_cast< LanguageType >(stringFormat->language));
- aFontRequest.Locale = aLanguageTag.getLocale(false);
- SAL_INFO("cppcanvas.emf", "EMF+\t\t Font locale, Country:" << aLanguageTag.getCountry() << " Language:" << aLanguageTag.getLanguage());
+ SAL_WARN("cppcanvas.emf", "EMF+\t TODO Only UnitTypePixel is supported. ");
}
-
- SAL_INFO("cppcanvas.emf", "EMF+\t\t TODO Use all string formatting attributes during drawing");
-
-// double cellSize = setFont(aFontRequest, flags & 0xff, rFactoryParms, rState);
-// rState.textColor = COLOR(brushId);
-//
-// ::basegfx::B2DPoint point(Map(lx + 0.15*cellSize, ly + cellSize));
-//
-// ActionSharedPtr pTextAction(
-// TextActionFactory::createTextAction(
-// // position is just rough guess for now
-// // we should calculate it exactly from layoutRect or font
-// vcl::unotools::pointFromB2DPoint(point),
-// ::Size(),
-// ::Color(),
-// ::Size(),
-// ::Color(),
-// text,
-// 0,
-// stringLength,
-// nullptr,
-// rFactoryParms.mrVDev,
-// rFactoryParms.mrCanvas,
-// rState,
-// rFactoryParms.mrParms,
-// false));
-// if (pTextAction)
-// {
-// SAL_INFO("cppcanvas.emf", "EMF+\t\tadd text action");
-//
-// maActions.push_back(
-// MtfAction(
-// pTextAction,
-// rFactoryParms.mrCurrActionIndex));
-//
-// rFactoryParms.mrCurrActionIndex += pTextAction->getActionCount() - 1;
-// }
+ else
+ {
+ mnMmX *= fPageScale;
+ mnMmY *= fPageScale;
+ }
+ break;
}
- else
+ case EmfPlusRecordTypeSetRenderingOrigin:
{
- SAL_WARN("cppcanvas.emf", "EMF+ DrawString TODO - drawing with brush not yet supported");
+ rMS.ReadInt32(nOriginX).ReadInt32(nOriginY);
+ SAL_INFO("cppcanvas.emf", "EMF+ SetRenderingOrigin");
+ SAL_INFO("cppcanvas.emf", "EMF+\torigin [x,y]: " << nOriginX << "," << nOriginY);
+ break;
}
- break;
- }
- case EmfPlusRecordTypeSetPageTransform:
- {
- rMS.ReadFloat(fPageScale);
- SAL_INFO("cppcanvas.emf", "EMF+ SetPageTransform");
- SAL_INFO("cppcanvas.emf", "EMF+\tscale: " << fPageScale << " unit: " << flags);
-
- if (flags != UnitTypePixel)
+ case EmfPlusRecordTypeSetTextRenderingHint:
{
- SAL_WARN("cppcanvas.emf", "EMF+\t TODO Only UnitTypePixel is supported. ");
+ SAL_INFO("cppcanvas.emf", "EMF+ SetTextRenderingHint");
+ SAL_INFO("cppcanvas.emf", "EMF+\tTODO");
+ break;
}
- else
+ case EmfPlusRecordTypeSetAntiAliasMode:
{
- mnMmX *= fPageScale;
- mnMmY *= fPageScale;
+ SAL_INFO("cppcanvas.emf", "EMF+ SetAntiAliasMode");
+ SAL_INFO("cppcanvas.emf", "EMF+\tTODO");
+ break;
}
- break;
- }
- case EmfPlusRecordTypeSetRenderingOrigin:
- {
- rMS.ReadInt32(nOriginX).ReadInt32(nOriginY);
- SAL_INFO("cppcanvas.emf", "EMF+ SetRenderingOrigin");
- SAL_INFO("cppcanvas.emf", "EMF+\torigin [x,y]: " << nOriginX << "," << nOriginY);
- break;
- }
- case EmfPlusRecordTypeSetTextRenderingHint:
- {
- SAL_INFO("cppcanvas.emf", "EMF+ SetTextRenderingHint");
- SAL_INFO("cppcanvas.emf", "EMF+\tTODO");
- break;
- }
- case EmfPlusRecordTypeSetAntiAliasMode:
- {
- SAL_INFO("cppcanvas.emf", "EMF+ SetAntiAliasMode");
- SAL_INFO("cppcanvas.emf", "EMF+\tTODO");
- break;
- }
- case EmfPlusRecordTypeSetInterpolationMode:
- {
- SAL_INFO("cppcanvas.emf", "EMF+ InterpolationMode");
- SAL_INFO("cppcanvas.emf", "EMF+\tTODO");
- break;
- }
- case EmfPlusRecordTypeSetPixelOffsetMode:
- {
- SAL_INFO("cppcanvas.emf", "EMF+ SetPixelOffsetMode");
- SAL_INFO("cppcanvas.emf", "EMF+\tTODO");
- break;
- }
- case EmfPlusRecordTypeSetCompositingQuality:
- {
- SAL_INFO("cppcanvas.emf", "EMF+ SetCompositingQuality");
- SAL_INFO("cppcanvas.emf", "EMF+\tTODO");
- break;
- }
- case EmfPlusRecordTypeSave:
- {
- sal_uInt32 stackIndex;
- rMS.ReadUInt32(stackIndex);
- SAL_INFO("cppcanvas.emf", "EMF+ Save stack index: " << stackIndex);
-
-// GraphicStatePush(mGSStack, stackIndex, rState);
-
- break;
- }
- case EmfPlusRecordTypeRestore:
- {
- sal_uInt32 stackIndex;
- rMS.ReadUInt32(stackIndex);
- SAL_INFO("cppcanvas.emf", "EMF+ Restore stack index: " << stackIndex);
-
-// GraphicStatePop(mGSStack, stackIndex, rState);
-
- break;
- }
- case EmfPlusRecordTypeBeginContainerNoParams:
- {
- sal_uInt32 stackIndex;
- rMS.ReadUInt32(stackIndex);
- SAL_INFO("cppcanvas.emf", "EMF+ Begin Container No Params stack index: " << stackIndex);
-
-// GraphicStatePush(mGSContainerStack, stackIndex, rState);
- break;
- }
- case EmfPlusRecordTypeEndContainer:
- {
- sal_uInt32 stackIndex;
- rMS.ReadUInt32(stackIndex);
- SAL_INFO("cppcanvas.emf", "EMF+ End Container stack index: " << stackIndex);
-
-// GraphicStatePop(mGSContainerStack, stackIndex, rState);
- break;
- }
- case EmfPlusRecordTypeSetWorldTransform:
- {
- SAL_INFO("cppcanvas.emf", "EMF+ SetWorldTransform");
- basegfx::B2DHomMatrix transform;
- readXForm(rMS, transform);
- aWorldTransform = transform;
- SAL_INFO("cppcanvas.emf",
- "EMF+\tm11: " << aWorldTransform.get(0,0) << "\tm12: " << aWorldTransform.get(1,0) <<
- "\tm21: " << aWorldTransform.get(0,1) << "\tm22: " << aWorldTransform.get(1,1) <<
... etc. - the rest is truncated
More information about the Libreoffice-commits
mailing list