[Libreoffice-commits] core.git: Branch 'feature/emfplusprimitiveparser' - drawinglayer/inc drawinglayer/source

Armin Le Grand Armin.Le.Grand at cib.de
Wed Jun 21 12:44:36 UTC 2017


 drawinglayer/inc/emfplushelper.hxx           |    9 
 drawinglayer/source/tools/emfpbrush.cxx      |    4 
 drawinglayer/source/tools/emfphelperdata.cxx |  439 ++++++++++++++-------------
 drawinglayer/source/tools/emfphelperdata.hxx |  294 ++++++++----------
 drawinglayer/source/tools/emfplushelper.cxx  |   12 
 drawinglayer/source/tools/emfppen.cxx        |    6 
 drawinglayer/source/tools/emfppen.hxx        |    2 
 drawinglayer/source/tools/wmfemfhelper.cxx   |    8 
 8 files changed, 396 insertions(+), 378 deletions(-)

New commits:
commit 24f85273cbcbc272e9419366cbd942ba154a3918
Author: Armin Le Grand <Armin.Le.Grand at cib.de>
Date:   Wed Jun 21 14:46:35 2017 +0200

    emfplus: some cleanup/streamlining
    
    Change-Id: Ia931ca356fb079b9cb2395ba2311b91d2481e2d4

diff --git a/drawinglayer/inc/emfplushelper.hxx b/drawinglayer/inc/emfplushelper.hxx
index 1a685a631abd..839a94d82e95 100644
--- a/drawinglayer/inc/emfplushelper.hxx
+++ b/drawinglayer/inc/emfplushelper.hxx
@@ -33,16 +33,17 @@ namespace emfplushelper
     class EmfPlusHelper
     {
     private:
-        EmfPlusHelperData*      mpD;
+        const std::unique_ptr<EmfPlusHelperData>  mpD;
 
     public:
-        EmfPlusHelper(SvMemoryStream& rMemoryStream);
+        EmfPlusHelper(
+            SvMemoryStream& rMemoryStream,
+            wmfemfhelper::TargetHolders& rTargetHolders,
+            wmfemfhelper::PropertyHolders& rPropertyHolders);
         ~EmfPlusHelper();
 
         void processEmfPlusData(
             SvMemoryStream& rMemoryStream,
-            wmfemfhelper::TargetHolders& rTargetHolders,
-            wmfemfhelper::PropertyHolders& rPropertyHolders,
             const drawinglayer::geometry::ViewInformation2D& rViewInformation);
     };
 }
diff --git a/drawinglayer/source/tools/emfpbrush.cxx b/drawinglayer/source/tools/emfpbrush.cxx
index d552bdfd5cd4..c093a5682572 100644
--- a/drawinglayer/source/tools/emfpbrush.cxx
+++ b/drawinglayer/source/tools/emfpbrush.cxx
@@ -200,7 +200,7 @@ namespace emfplushelper
 
             if (additionalFlags & 0x02) {
                 SAL_INFO("cppcanvas.emf", "EMF+\tuse transformation");
-                readXForm(s, brush_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) <<
@@ -273,7 +273,7 @@ namespace emfplushelper
 
             if (additionalFlags & 0x02) {
                 SAL_INFO("cppcanvas.emf", "EMF+\tuse transformation");
-                readXForm(s, brush_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) <<
diff --git a/drawinglayer/source/tools/emfphelperdata.cxx b/drawinglayer/source/tools/emfphelperdata.cxx
index cbce6d32efb0..fcab2bbd7a44 100644
--- a/drawinglayer/source/tools/emfphelperdata.cxx
+++ b/drawinglayer/source/tools/emfphelperdata.cxx
@@ -80,78 +80,43 @@ namespace emfplushelper
     {
     }
 
-    bool readXForm(SvStream& rIn, basegfx::B2DHomMatrix& rTarget)
-    {
-        rTarget.identity();
-
-        if (sizeof(float) != 4)
-        {
-            OSL_FAIL("EnhWMFReader::sizeof( float ) != 4");
-            return false;
-        }
-        else
-        {
-            float eM11(0.0);
-            float eM12(0.0);
-            float eM21(0.0);
-            float eM22(0.0);
-            float eDx(0.0);
-            float eDy(0.0);
-#ifdef OSL_BIGENDIAN
-            eM11 = GetSwapFloat(rIn);
-            eM12 = GetSwapFloat(rIn);
-            eM21 = GetSwapFloat(rIn);
-            eM22 = GetSwapFloat(rIn);
-            eDx = GetSwapFloat(rIn);
-            eDy = GetSwapFloat(rIn);
-#else
-            rIn.ReadFloat(eM11).ReadFloat(eM12).ReadFloat(eM21).ReadFloat(eM22).ReadFloat(eDx).ReadFloat(eDy);
-#endif
-            rTarget = basegfx::B2DHomMatrix(
-                eM11, eM21, eDx,
-                eM12, eM22, eDy);
-        }
-
-        return true;
-    }
-
-    OutDevState::OutDevState() :
-        clip(),
-        clipRect(),
-        xClipPoly(),
-
-        lineColor(),
-        fillColor(),
-        textColor(),
-        textFillColor(),
-        textLineColor(),
-
-        xFont(),
-        transform(),
-        mapModeTransform(),
-        fontRotation(0.0),
-
-        textEmphasisMarkStyle(FontEmphasisMark::NONE),
-        pushFlags(PushFlags::ALL),
-        textDirection(css::rendering::TextDirection::WEAK_LEFT_TO_RIGHT),
-        textAlignment(0), // TODO(Q2): Synchronize with implrenderer
-                            // and possibly new rendering::TextAlignment
-        textReliefStyle(FontRelief::NONE),
-        textOverlineStyle(LINESTYLE_NONE),
-        textUnderlineStyle(LINESTYLE_NONE),
-        textStrikeoutStyle(STRIKEOUT_NONE),
-        textReferencePoint(ALIGN_BASELINE),
-
-        isTextOutlineModeSet(false),
-        isTextEffectShadowSet(false),
-        isTextWordUnderlineSet(false),
-
-        isLineColorSet(false),
-        isFillColorSet(false),
-        isTextFillColorSet(false),
-        isTextLineColorSet(false)
-    {
-    }
+//    OutDevState::OutDevState() :
+//        clip(),
+//        clipRect(),
+//        xClipPoly(),
+//
+//        lineColor(),
+//        fillColor(),
+//        textColor(),
+//        textFillColor(),
+//        textLineColor(),
+//
+//        xFont(),
+//        transform(),
+//        mapModeTransform(),
+//        fontRotation(0.0),
+//
+//        textEmphasisMarkStyle(FontEmphasisMark::NONE),
+//        pushFlags(PushFlags::ALL),
+//        textDirection(css::rendering::TextDirection::WEAK_LEFT_TO_RIGHT),
+//        textAlignment(0), // TODO(Q2): Synchronize with implrenderer
+//                            // and possibly new rendering::TextAlignment
+//        textReliefStyle(FontRelief::NONE),
+//        textOverlineStyle(LINESTYLE_NONE),
+//        textUnderlineStyle(LINESTYLE_NONE),
+//        textStrikeoutStyle(STRIKEOUT_NONE),
+//        textReferencePoint(ALIGN_BASELINE),
+//
+//        isTextOutlineModeSet(false),
+//        isTextEffectShadowSet(false),
+//        isTextWordUnderlineSet(false),
+//
+//        isLineColorSet(false),
+//        isFillColorSet(false),
+//        isTextFillColorSet(false),
+//        isTextLineColorSet(false)
+//    {
+//    }
 
     void EmfPlusHelperData::processObjectRecord(SvMemoryStream& rObjectStream, sal_uInt16 flags, sal_uInt32 dataSize, bool bUseWholeStream)
     {
@@ -159,28 +124,24 @@ namespace emfplushelper
         SAL_INFO("cppcanvas.emf", "EMF+ Object slot: " << (flags & 0xff) << " flags: " << (flags & 0xff00));
         index = flags & 0xff;
 
-        if (aObjects[index] != nullptr)
+        switch (flags & 0x7f00)
         {
-            delete aObjects[index];
-            aObjects[index] = nullptr;
-        }
-
-        switch (flags & 0x7f00) {
         case EmfPlusObjectTypeBrush:
         {
             EMFPBrush *brush;
-            aObjects[index] = brush = new EMFPBrush();
+            aObjects[index].reset(brush = new EMFPBrush());
             brush->Read(rObjectStream, *this);
             break;
         }
         case EmfPlusObjectTypePen:
         {
             EMFPPen *pen;
-            aObjects[index] = pen = new EMFPPen();
+            aObjects[index].reset(pen = new EMFPPen());
             pen->Read(rObjectStream, *this);
             break;
         }
         case EmfPlusObjectTypePath:
+        {
             sal_uInt32 header, pathFlags;
             sal_Int32 points;
 
@@ -188,19 +149,21 @@ namespace emfplushelper
             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] = path = new EMFPPath(points);
+            aObjects[index].reset(path = new EMFPPath(points));
             path->Read(rObjectStream, pathFlags, *this);
             break;
-        case EmfPlusObjectTypeRegion: {
+        }
+        case EmfPlusObjectTypeRegion:
+        {
             EMFPRegion *region;
-            aObjects[index] = region = new EMFPRegion();
+            aObjects[index].reset(region = new EMFPRegion());
             region->Read(rObjectStream);
             break;
         }
         case EmfPlusObjectTypeImage:
         {
             EMFPImage *image;
-            aObjects[index] = image = new EMFPImage;
+            aObjects[index].reset(image = new EMFPImage);
             image->type = 0;
             image->width = 0;
             image->height = 0;
@@ -212,7 +175,7 @@ namespace emfplushelper
         case EmfPlusObjectTypeFont:
         {
             EMFPFont *font;
-            aObjects[index] = font = new EMFPFont;
+            aObjects[index].reset(font = new EMFPFont);
             font->emSize = 0;
             font->sizeUnit = 0;
             font->fontFlags = 0;
@@ -222,7 +185,7 @@ namespace emfplushelper
         case EmfPlusObjectTypeStringFormat:
         {
             EMFPStringFormat *stringFormat;
-            aObjects[index] = stringFormat = new EMFPStringFormat();
+            aObjects[index].reset(stringFormat = new EMFPStringFormat());
             stringFormat->Read(rObjectStream);
             break;
         }
@@ -286,6 +249,41 @@ namespace emfplushelper
         }
     }
 
+    bool EmfPlusHelperData::readXForm(SvStream& rIn, basegfx::B2DHomMatrix& rTarget)
+    {
+        rTarget.identity();
+
+        if (sizeof(float) != 4)
+        {
+            OSL_FAIL("EnhWMFReader::sizeof( float ) != 4");
+            return false;
+        }
+        else
+        {
+            float eM11(0.0);
+            float eM12(0.0);
+            float eM21(0.0);
+            float eM22(0.0);
+            float eDx(0.0);
+            float eDy(0.0);
+#ifdef OSL_BIGENDIAN
+            eM11 = GetSwapFloat(rIn);
+            eM12 = GetSwapFloat(rIn);
+            eM21 = GetSwapFloat(rIn);
+            eM22 = GetSwapFloat(rIn);
+            eDx = GetSwapFloat(rIn);
+            eDy = GetSwapFloat(rIn);
+#else
+            rIn.ReadFloat(eM11).ReadFloat(eM12).ReadFloat(eM21).ReadFloat(eM22).ReadFloat(eDx).ReadFloat(eDy);
+#endif
+            rTarget = basegfx::B2DHomMatrix(
+                eM11, eM21, eDx,
+                eM12, eM22, eDy);
+        }
+
+        return true;
+    }
+
     void EmfPlusHelperData::MapToDevice(double& x, double& y)
     {
         // TODO: other units
@@ -326,8 +324,11 @@ namespace emfplushelper
         return ::basegfx::B2DSize(w, h);
     }
 
-    EmfPlusHelperData::EmfPlusHelperData(SvMemoryStream& rMS)
-        : aBaseTransform(),
+    EmfPlusHelperData::EmfPlusHelperData(
+        SvMemoryStream& rMS,
+        wmfemfhelper::TargetHolders& rTargetHolders,
+        wmfemfhelper::PropertyHolders& rPropertyHolders)
+    :   aBaseTransform(),
         aWorldTransform(),
         aObjects(),
         fPageScale(0.0),
@@ -346,13 +347,11 @@ namespace emfplushelper
         mbMultipart(false),
         mMFlags(0),
         mMStream(),
-        mGSStack(),
-        mGSContainerStack(),
-        mpTargetHolders(nullptr),
-        mpPropertyHolders(nullptr)
+//        mGSStack(),
+//        mGSContainerStack(),
+        mrTargetHolders(rTargetHolders),
+        mrPropertyHolders(rPropertyHolders)
     {
-        memset(aObjects, 0, sizeof(aObjects));
-
         rMS.ReadInt32(mnFrameLeft).ReadInt32(mnFrameTop).ReadInt32(mnFrameRight).ReadInt32(mnFrameBottom);
         SAL_INFO("cppcanvas.emf", "EMF+ picture frame: " << mnFrameLeft << "," << mnFrameTop << " - " << mnFrameRight << "," << mnFrameBottom);
         rMS.ReadInt32(mnPixX).ReadInt32(mnPixY).ReadInt32(mnMmX).ReadInt32(mnMmY);
@@ -360,6 +359,10 @@ namespace emfplushelper
         readXForm(rMS, aBaseTransform);
     }
 
+    EmfPlusHelperData::~EmfPlusHelperData()
+    {
+    }
+
     void EmfPlusHelperData::processEmfPlusData(
         SvMemoryStream& rMS,
         const drawinglayer::geometry::ViewInformation2D& rViewInformation)
@@ -426,26 +429,33 @@ namespace emfplushelper
 
             if (type != EmfPlusRecordTypeObject || !(flags & 0x8000))
             {
-                switch (type) {
+                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:
@@ -468,36 +478,42 @@ namespace emfplushelper
                     {
                         SAL_INFO("cppcanvas.emf", "EMF+ DrawArc");
                     }
-                    rMS.ReadFloat(startAngle).ReadFloat(sweepAngle);
 
+                    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)
-                        startAngle += static_cast<float>(M_PI * 2);
-                    endAngle = fmodf(endAngle, static_cast<float>(M_PI * 2));
-                    if (endAngle < 0)
-                        endAngle += static_cast<float>(M_PI * 2);
+
+                    if (startAngle < 0.0)
+                    {
+                        startAngle += static_cast<float>(M_PI * 2.0);
+                    }
+
+                    endAngle = fmodf(endAngle, static_cast<float>(M_PI * 2.0));
+
+                    if (endAngle < 0.0)
+                    {
+                        endAngle += static_cast<float>(M_PI * 2.0);
+                    }
 
                     if (sweepAngle < 0)
+                    {
                         std::swap(endAngle, startAngle);
+                    }
 
                     SAL_INFO("cppcanvas.emf", "EMF+\t adjusted angles: start " <<
                         (360.0*startAngle / M_PI) << ", end: " << (360.0*endAngle / M_PI) <<
                         " startAngle: " << startAngle << " sweepAngle: " << sweepAngle);
 
-                    ::basegfx::B2DPolygon polygon = basegfx::tools::createPolygonFromEllipseSegment(mappedCenter, mappedSize.getX(), mappedSize.getY(), startAngle, endAngle);
+                    ::basegfx::B2DPolygon polygon = basegfx::tools::createPolygonFromEllipseSegment(
+                        mappedCenter, mappedSize.getX(), mappedSize.getY(), startAngle, endAngle);
+
                     if (type != EmfPlusRecordTypeDrawArc)
                     {
                         polygon.append(mappedCenter);
@@ -517,9 +533,7 @@ namespace emfplushelper
                 {
                     sal_uInt32 index = flags & 0xff;
                     sal_uInt32 brushIndexOrColor;
-
                     rMS.ReadUInt32(brushIndexOrColor);
-
                     SAL_INFO("cppcanvas.emf", "EMF+ FillPath slot: " << index);
 
 //                    EMFPPlusFillPolygon(static_cast<EMFPPath*>(aObjects[index])->GetPolygon(*this), rFactoryParms, rState, rCanvas, flags & 0x8000, brushIndexOrColor);
@@ -534,19 +548,19 @@ namespace emfplushelper
                     sal_uInt32 brushIndexOrColor = 1234567;
 
                     if (type == EmfPlusRecordTypeFillEllipse)
+                    {
                         rMS.ReadUInt32(brushIndexOrColor);
+                    }
 
                     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())));
+                    ::basegfx::B2DPolyPolygon polyPolygon(
+                        ::basegfx::B2DPolygon(
+                            ::basegfx::tools::createPolygonFromEllipse(mappedCenter, mappedSize.getX(), mappedSize.getY())));
 
 //                    if (type == EmfPlusRecordTypeFillEllipse)
 //                        EMFPPlusFillPolygon(polyPolygon,
@@ -565,7 +579,7 @@ namespace emfplushelper
                     bool isColor = (flags & 0x8000);
                     ::basegfx::B2DPolygon polygon;
 
-                    if (type == EmfPlusRecordTypeFillRects)
+                    if (EmfPlusRecordTypeFillRects == type)
                     {
                         SAL_INFO("cppcanvas.emf", "EMF+ FillRects");
                         rMS.ReadUInt32(brushIndexOrColor);
@@ -578,7 +592,8 @@ namespace emfplushelper
 
                     rMS.ReadInt32(rectangles);
 
-                    for (int i = 0; i < rectangles; i++) {
+                    for (int i = 0; i < rectangles; i++)
+                    {
                         float x, y, width, height;
                         ReadRectangle(rMS, x, y, width, height, bool(flags & 0x4000));
 
@@ -608,7 +623,6 @@ namespace emfplushelper
 
                     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);
 
@@ -622,11 +636,8 @@ namespace emfplushelper
                 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);
 
@@ -639,13 +650,10 @@ namespace emfplushelper
                 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]);
+                    EMFPPath* path = static_cast<EMFPPath*>(aObjects[flags & 0xff].get());
                     SAL_WARN_IF(!path, "cppcanvas.emf", "EmfPlusRecordTypeDrawPath missing path");
 
 //                    EMFPPlusDrawPolygon(path->GetPolygon(*this), rFactoryParms, rState, rCanvas, penIndex);
@@ -659,9 +667,7 @@ namespace emfplushelper
                     ::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)
@@ -703,30 +709,30 @@ namespace emfplushelper
                 {
                     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]) { // we handle only GraphicsUnit.Pixel now
-                        EMFPImage& image = *static_cast<EMFPImage *>(aObjects[flags & 0xff]);
+                    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) {
+                        if (type == EmfPlusRecordTypeDrawImagePoints)
+                        {
                             rMS.ReadInt32(aCount);
 
-                            if (aCount == 3) { // TODO: now that we now that this value is count we should support it better
+                            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;
 
                                 ReadPoint(rMS, x1, y1, flags);
@@ -742,26 +748,24 @@ namespace emfplushelper
                                 bValid = true;
                             }
                         }
-                        else if (type == EmfPlusRecordTypeDrawImage) {
+                        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) {
+                        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 (aSize.Width() > 0 && aSize.Height() > 0)
+                            {
 //                                ActionSharedPtr pBmpAction(
 //                                    internal::BitmapActionFactory::createBitmapAction(
 //                                        aBmp,
@@ -777,15 +781,18 @@ namespace emfplushelper
 //                                    rFactoryParms.mrCurrActionIndex += pBmpAction->getActionCount() - 1;
 //                                }
                             }
-                            else {
+                            else
+                            {
                                 SAL_INFO("cppcanvas.emf", "EMF+ warning: empty bitmap");
                             }
                         }
-                        else {
+                        else
+                        {
                             SAL_WARN("cppcanvas.emf", "EMF+ DrawImage(Points) TODO (fixme)");
                         }
                     }
-                    else {
+                    else
+                    {
                         SAL_WARN("cppcanvas.emf", "EMF+ DrawImage(Points) TODO (fixme) - possibly unsupported source units for crop rectangle");
                     }
                     break;
@@ -793,31 +800,28 @@ namespace emfplushelper
                 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) {
+                    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]);
+                        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);
@@ -855,59 +859,70 @@ namespace emfplushelper
 //                            rFactoryParms.mrCurrActionIndex += pTextAction->getActionCount() - 1;
 //                        }
                     }
-                    else {
+                    else
+                    {
                         SAL_WARN("cppcanvas.emf", "EMF+ DrawString TODO - drawing with brush not yet supported");
                     }
+                    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)
+                    {
                         SAL_WARN("cppcanvas.emf", "EMF+\t TODO Only UnitTypePixel is supported. ");
+                    }
                     else
                     {
                         mnMmX *= fPageScale;
                         mnMmY *= fPageScale;
                     }
+                    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);
@@ -917,9 +932,7 @@ namespace emfplushelper
                 case EmfPlusRecordTypeRestore:
                 {
                     sal_uInt32 stackIndex;
-
                     rMS.ReadUInt32(stackIndex);
-
                     SAL_INFO("cppcanvas.emf", "EMF+ Restore stack index: " << stackIndex);
 
 //                    GraphicStatePop(mGSStack, stackIndex, rState);
@@ -929,26 +942,23 @@ namespace emfplushelper
                 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;
                 }
-                break;
                 case EmfPlusRecordTypeEndContainer:
                 {
                     sal_uInt32 stackIndex;
-
                     rMS.ReadUInt32(stackIndex);
-
                     SAL_INFO("cppcanvas.emf", "EMF+ End Container stack index: " << stackIndex);
 
 //                    GraphicStatePop(mGSContainerStack, stackIndex, rState);
+                    break;
                 }
-                break;
-                case EmfPlusRecordTypeSetWorldTransform: {
+                case EmfPlusRecordTypeSetWorldTransform:
+                {
                     SAL_INFO("cppcanvas.emf", "EMF+ SetWorldTransform");
                     basegfx::B2DHomMatrix transform;
                     readXForm(rMS, transform);
@@ -960,10 +970,13 @@ namespace emfplushelper
                     break;
                 }
                 case EmfPlusRecordTypeResetWorldTransform:
+                {
                     SAL_INFO("cppcanvas.emf", "EMF+ ResetWorldTransform");
                     aWorldTransform.identity();
                     break;
-                case EmfPlusRecordTypeMultiplyWorldTransform: {
+                }
+                case EmfPlusRecordTypeMultiplyWorldTransform:
+                {
                     SAL_INFO("cppcanvas.emf", "EMF+ MultiplyWorldTransform");
                     basegfx::B2DHomMatrix transform;
                     readXForm(rMS, transform);
@@ -997,7 +1010,6 @@ namespace emfplushelper
 
                     basegfx::B2DHomMatrix transform;
                     float eDx, eDy;
-
                     rMS.ReadFloat(eDx).ReadFloat(eDy);
                     transform.set(0, 2, eDx);
                     transform.set(1, 2, eDy);
@@ -1029,13 +1041,11 @@ namespace emfplushelper
                 {
                     basegfx::B2DHomMatrix transform;
                     float eM11, eM22;
-
                     rMS.ReadFloat(eM11).ReadFloat(eM22);
                     transform.set(0, 0, eM11);
                     transform.set(1, 1, eM22);
 
                     SAL_INFO("cppcanvas.emf", "EMF+ ScaleWorldTransform Sx: " << transform.get(0,0) << " Sy: " << transform.get(1,1));
-
                     SAL_INFO("cppcanvas.emf",
                         "EMF+\t m11: " << aWorldTransform.get(0,0) << ", m12: " << aWorldTransform.get(0,1) <<
                         "EMF+\t m21: " << aWorldTransform.get(1,0) << ", m22: " << aWorldTransform.get(1,1) <<
@@ -1071,93 +1081,100 @@ namespace emfplushelper
 #endif
 
                     float dx, dy, dw, dh;
-
                     ReadRectangle(rMS, dx, dy, dw, dh);
-
                     SAL_INFO("cppcanvas.emf", "EMF+ RectData: " << dx << "," << dy << " " << dw << "x" << dh);
-
                     ::basegfx::B2DPoint mappedPoint(Map(dx, dy));
                     ::basegfx::B2DSize mappedSize(MapSize(dw, dh));
 
-                    ::basegfx::B2DPolyPolygon polyPolygon(::basegfx::B2DPolygon(::basegfx::tools::createPolygonFromRect(::basegfx::B2DRectangle(mappedPoint.getX(), mappedPoint.getY(),
-                        mappedPoint.getX() + mappedSize.getX(),
-                        mappedPoint.getY() + mappedSize.getY()))));
+                    ::basegfx::B2DPolyPolygon polyPolygon(
+                        ::basegfx::B2DPolygon(
+                            ::basegfx::tools::createPolygonFromRect(::basegfx::B2DRectangle(
+                                mappedPoint.getX(),
+                                mappedPoint.getY(),
+                                mappedPoint.getX() + mappedSize.getX(),
+                                mappedPoint.getY() + mappedSize.getY()))));
 //                    polyPolygon.transform(rState.mapModeTransform);
 //
 //                    updateClipping(polyPolygon, rFactoryParms, combineMode == 1);
-
                     break;
                 }
                 case EmfPlusRecordTypeSetClipPath:
                 {
                     int combineMode = (flags >> 8) & 0xf;
-
                     SAL_INFO("cppcanvas.emf", "EMF+ SetClipPath combine mode: " << combineMode);
                     SAL_INFO("cppcanvas.emf", "EMF+\tpath in slot: " << (flags & 0xff));
 
-                    EMFPPath& path = *static_cast<EMFPPath*>(aObjects[flags & 0xff]);
+                    EMFPPath& path = *static_cast<EMFPPath*>(aObjects[flags & 0xff].get());
                     ::basegfx::B2DPolyPolygon& clipPoly(path.GetPolygon(*this));
-
 //                    clipPoly.transform(rState.mapModeTransform);
+
                     switch (combineMode)
                     {
-                    case EmfPlusCombineModeReplace:
-                    case EmfPlusCombineModeIntersect:
-                    case EmfPlusCombineModeUnion: // Is this, EmfPlusCombineModeXOR and EmfPlusCombineModeComplement correct?
-                    case EmfPlusCombineModeXOR:
-                    case EmfPlusCombineModeComplement:
-//                        updateClipping(clipPoly, rFactoryParms, combineMode == 1);
-                        break;
-                    case EmfPlusCombineModeExclude:
-                        // Not doing anything is better then including exactly what we wanted to exclude.
-                        break;
+                        case EmfPlusCombineModeReplace:
+                        case EmfPlusCombineModeIntersect:
+                        case EmfPlusCombineModeUnion: // Is this, EmfPlusCombineModeXOR and EmfPlusCombineModeComplement correct?
+                        case EmfPlusCombineModeXOR:
+                        case EmfPlusCombineModeComplement:
+                        {
+                            // updateClipping(clipPoly, rFactoryParms, combineMode == 1);
+                            break;
+                        }
+                        case EmfPlusCombineModeExclude:
+                        {
+                            // Not doing anything is better then including exactly what we wanted to exclude.
+                            break;
+                        }
                     }
 
                     break;
                 }
-                case EmfPlusRecordTypeSetClipRegion: {
+                case EmfPlusRecordTypeSetClipRegion:
+                {
                     int combineMode = (flags >> 8) & 0xf;
-
                     SAL_INFO("cppcanvas.emf", "EMF+ SetClipRegion");
                     SAL_INFO("cppcanvas.emf", "EMF+\tregion in slot: " << (flags & 0xff) << " combine mode: " << combineMode);
-                    EMFPRegion *region = static_cast<EMFPRegion*>(aObjects[flags & 0xff]);
+                    EMFPRegion *region = static_cast<EMFPRegion*>(aObjects[flags & 0xff].get());
 
                     // reset clip
-                    if (region && region->parts == 0 && region->initialState == EmfPlusRegionInitialStateInfinite) {
+                    if (region && region->parts == 0 && region->initialState == EmfPlusRegionInitialStateInfinite)
+                    {
 //                        updateClipping(::basegfx::B2DPolyPolygon(), rFactoryParms, combineMode == 1);
                     }
-                    else {
+                    else
+                    {
                         SAL_INFO("cppcanvas.emf", "EMF+\tTODO");
                     }
                     break;
                 }
-                case EmfPlusRecordTypeDrawDriverString: {
+                case EmfPlusRecordTypeDrawDriverString:
+                {
                     SAL_INFO("cppcanvas.emf", "EMF+ DrawDriverString, flags: 0x" << std::hex << flags << std::dec);
                     sal_uInt32 brushIndexOrColor;
                     sal_uInt32 optionFlags;
                     sal_uInt32 hasMatrix;
                     sal_uInt32 glyphsCount;
-
                     rMS.ReadUInt32(brushIndexOrColor).ReadUInt32(optionFlags).ReadUInt32(hasMatrix).ReadUInt32(glyphsCount);
-
                     SAL_INFO("cppcanvas.emf", "EMF+\t: " << ((flags & 0x8000) ? "color" : "brush index") << " 0x" << std::hex << brushIndexOrColor << std::dec);
                     SAL_INFO("cppcanvas.emf", "EMF+\toption flags: 0x" << std::hex << optionFlags << std::dec);
                     SAL_INFO("cppcanvas.emf", "EMF+\thas matrix: " << hasMatrix);
                     SAL_INFO("cppcanvas.emf", "EMF+\tglyphs: " << glyphsCount);
 
-                    if ((optionFlags & 1) && glyphsCount > 0) {
+                    if ((optionFlags & 1) && glyphsCount > 0)
+                    {
                         std::unique_ptr<float[]> charsPosX(new float[glyphsCount]);
                         std::unique_ptr<float[]> charsPosY(new float[glyphsCount]);
-
                         OUString text = read_uInt16s_ToOUString(rMS, glyphsCount);
 
-                        for (sal_uInt32 i = 0; i<glyphsCount; i++) {
+                        for (sal_uInt32 i = 0; i<glyphsCount; i++)
+                        {
                             rMS.ReadFloat(charsPosX[i]).ReadFloat(charsPosY[i]);
                             SAL_INFO("cppcanvas.emf", "EMF+\tglyphPosition[" << i << "]: " << charsPosX[i] << "," << charsPosY[i]);
                         }
 
                         basegfx::B2DHomMatrix transform;
-                        if (hasMatrix) {
+
+                        if (hasMatrix)
+                        {
                             readXForm(rMS, transform);
                             SAL_INFO("cppcanvas.emf", "EMF+\tmatrix: " << transform.get(0,0) << ", " << transform.get(1,0) <<
                                 ", " << transform.get(0,1) << ", " << transform.get(1,1) <<
@@ -1202,15 +1219,17 @@ namespace emfplushelper
 //                            rFactoryParms.mrCurrActionIndex += pTextAction->getActionCount() - 1;
 //                        }
                     }
-                    else {
+                    else
+                    {
                         SAL_WARN("cppcanvas.emf", "EMF+\tTODO: fonts (non-unicode glyphs chars)");
                     }
-
                     break;
                 }
                 default:
+                {
                     SAL_WARN("cppcanvas.emf", "EMF+ TODO unhandled record type: 0x" << std::hex << type << std::dec);
                 }
+                }
             }
 
             rMS.Seek(next);
diff --git a/drawinglayer/source/tools/emfphelperdata.hxx b/drawinglayer/source/tools/emfphelperdata.hxx
index 6b9084cbdd9d..f4920fb9d3e5 100644
--- a/drawinglayer/source/tools/emfphelperdata.hxx
+++ b/drawinglayer/source/tools/emfphelperdata.hxx
@@ -21,83 +21,82 @@
 #define INCLUDED_DRAWINGLAYER_SOURCE_TOOLS_EMFPHELPERDATA_HXX
 
 #include <emfplushelper.hxx>
-#include <com/sun/star/rendering/XCanvasFont.hpp>
-#include <com/sun/star/rendering/TextDirection.hpp>
-//#include <emfpbrush.hxx>
+//#include <com/sun/star/rendering/XCanvasFont.hpp>
+//#include <com/sun/star/rendering/TextDirection.hpp>
 
 namespace emfplushelper
 {
-        // EMF+ commands
-#define EmfPlusRecordTypeHeader 0x4001
-#define EmfPlusRecordTypeEndOfFile 0x4002
-        //TODO EmfPlusRecordTypeComment 0x4003
-#define EmfPlusRecordTypeGetDC 0x4004
-        //TODO EmfPlusRecordTypeMultiFormatStart 0x4005
-        //TODO EmfPlusRecordTypeMultiFormatSection 0x4006
-        //TODO EmfPlusRecordTypeMultiFormatEnd 0x4007
-#define EmfPlusRecordTypeObject 0x4008
-        //TODO EmfPlusRecordTypeClear 0x4009
-#define EmfPlusRecordTypeFillRects 0x400A
-#define EmfPlusRecordTypeDrawRects 0x400B
-#define EmfPlusRecordTypeFillPolygon 0x400C
-#define EmfPlusRecordTypeDrawLines 0x400D
-#define EmfPlusRecordTypeFillEllipse 0x400E
-#define EmfPlusRecordTypeDrawEllipse 0x400F
-#define EmfPlusRecordTypeFillPie 0x4010
-#define EmfPlusRecordTypeDrawPie 0x4011
-#define EmfPlusRecordTypeDrawArc 0x4012
-        //TODO EmfPlusRecordTypeFillRegion 0x4013
-#define EmfPlusRecordTypeFillPath 0x4014
-#define EmfPlusRecordTypeDrawPath 0x4015
-        //TODO EmfPlusRecordTypeFillClosedCurve 0x4016
-        //TODO EmfPlusRecordTypeDrawClosedCurve 0x4017
-        //TODO EmfPlusRecordTypeDrawCurve 0x4018
-#define EmfPlusRecordTypeDrawBeziers 0x4019
-#define EmfPlusRecordTypeDrawImage 0x401A
-#define EmfPlusRecordTypeDrawImagePoints 0x401B
-#define EmfPlusRecordTypeDrawString 0x401C
-#define EmfPlusRecordTypeSetRenderingOrigin 0x401D
-#define EmfPlusRecordTypeSetAntiAliasMode 0x401E
-#define EmfPlusRecordTypeSetTextRenderingHint 0x401F
-#define EmfPlusRecordTypeSetInterpolationMode 0x4021
-#define EmfPlusRecordTypeSetPixelOffsetMode 0x4022
-        //TODO EmfPlusRecordTypeSetCompositingMode 0x4023
-#define EmfPlusRecordTypeSetCompositingQuality 0x4024
-#define EmfPlusRecordTypeSave 0x4025
-#define EmfPlusRecordTypeRestore 0x4026
-        //TODO EmfPlusRecordTypeBeginContainer 0x4027
-#define EmfPlusRecordTypeBeginContainerNoParams 0x4028
-#define EmfPlusRecordTypeEndContainer 0x4029
-#define EmfPlusRecordTypeSetWorldTransform 0x402A
-#define EmfPlusRecordTypeResetWorldTransform 0x402B
-#define EmfPlusRecordTypeMultiplyWorldTransform 0x402C
-#define EmfPlusRecordTypeTranslateWorldTransform 0x402D
-#define EmfPlusRecordTypeScaleWorldTransform 0x402E
-        //TODO EmfPlusRecordTypeRotateWorldTransform 0x402F
-#define EmfPlusRecordTypeSetPageTransform 0x4030
-        //TODO EmfPlusRecordTypeResetClip 0x4031
-#define EmfPlusRecordTypeSetClipRect 0x4032
-#define EmfPlusRecordTypeSetClipPath 0x4033
-#define EmfPlusRecordTypeSetClipRegion 0x4034
-        //TODO EmfPlusRecordTypeOffsetClip 0x4035
-#define EmfPlusRecordTypeDrawDriverString 0x4036
-        //TODO EmfPlusRecordTypeStrokeFillPath 0x4037
-        //TODO EmfPlusRecordTypeSerializableObject 0x4038
-        //TODO EmfPlusRecordTypeSetTSGraphics 0x4039
-        //TODO EmfPlusRecordTypeSetTSClip 0x403A
-
-        // EMF+object types
-#define EmfPlusObjectTypeBrush 0x100
-#define EmfPlusObjectTypePen 0x200
-#define EmfPlusObjectTypePath 0x300
-#define EmfPlusObjectTypeRegion 0x400
-#define EmfPlusObjectTypeImage 0x500
-#define EmfPlusObjectTypeFont 0x600
-#define EmfPlusObjectTypeStringFormat 0x700
-#define EmfPlusObjectTypeImageAttributes 0x800
-#define EmfPlusObjectTypeCustomLineCap 0x900
-
-#define EmfPlusRegionInitialStateInfinite 0x10000003
+    // EMF+ commands
+    #define EmfPlusRecordTypeHeader 0x4001
+    #define EmfPlusRecordTypeEndOfFile 0x4002
+    //TODO EmfPlusRecordTypeComment 0x4003
+    #define EmfPlusRecordTypeGetDC 0x4004
+    //TODO EmfPlusRecordTypeMultiFormatStart 0x4005
+    //TODO EmfPlusRecordTypeMultiFormatSection 0x4006
+    //TODO EmfPlusRecordTypeMultiFormatEnd 0x4007
+    #define EmfPlusRecordTypeObject 0x4008
+    //TODO EmfPlusRecordTypeClear 0x4009
+    #define EmfPlusRecordTypeFillRects 0x400A
+    #define EmfPlusRecordTypeDrawRects 0x400B
+    #define EmfPlusRecordTypeFillPolygon 0x400C
+    #define EmfPlusRecordTypeDrawLines 0x400D
+    #define EmfPlusRecordTypeFillEllipse 0x400E
+    #define EmfPlusRecordTypeDrawEllipse 0x400F
+    #define EmfPlusRecordTypeFillPie 0x4010
+    #define EmfPlusRecordTypeDrawPie 0x4011
+    #define EmfPlusRecordTypeDrawArc 0x4012
+    //TODO EmfPlusRecordTypeFillRegion 0x4013
+    #define EmfPlusRecordTypeFillPath 0x4014
+    #define EmfPlusRecordTypeDrawPath 0x4015
+    //TODO EmfPlusRecordTypeFillClosedCurve 0x4016
+    //TODO EmfPlusRecordTypeDrawClosedCurve 0x4017
+    //TODO EmfPlusRecordTypeDrawCurve 0x4018
+    #define EmfPlusRecordTypeDrawBeziers 0x4019
+    #define EmfPlusRecordTypeDrawImage 0x401A
+    #define EmfPlusRecordTypeDrawImagePoints 0x401B
+    #define EmfPlusRecordTypeDrawString 0x401C
+    #define EmfPlusRecordTypeSetRenderingOrigin 0x401D
+    #define EmfPlusRecordTypeSetAntiAliasMode 0x401E
+    #define EmfPlusRecordTypeSetTextRenderingHint 0x401F
+    #define EmfPlusRecordTypeSetInterpolationMode 0x4021
+    #define EmfPlusRecordTypeSetPixelOffsetMode 0x4022
+    //TODO EmfPlusRecordTypeSetCompositingMode 0x4023
+    #define EmfPlusRecordTypeSetCompositingQuality 0x4024
+    #define EmfPlusRecordTypeSave 0x4025
+    #define EmfPlusRecordTypeRestore 0x4026
+    //TODO EmfPlusRecordTypeBeginContainer 0x4027
+    #define EmfPlusRecordTypeBeginContainerNoParams 0x4028
+    #define EmfPlusRecordTypeEndContainer 0x4029
+    #define EmfPlusRecordTypeSetWorldTransform 0x402A
+    #define EmfPlusRecordTypeResetWorldTransform 0x402B
+    #define EmfPlusRecordTypeMultiplyWorldTransform 0x402C
+    #define EmfPlusRecordTypeTranslateWorldTransform 0x402D
+    #define EmfPlusRecordTypeScaleWorldTransform 0x402E
+    //TODO EmfPlusRecordTypeRotateWorldTransform 0x402F
+    #define EmfPlusRecordTypeSetPageTransform 0x4030
+    //TODO EmfPlusRecordTypeResetClip 0x4031
+    #define EmfPlusRecordTypeSetClipRect 0x4032
+    #define EmfPlusRecordTypeSetClipPath 0x4033
+    #define EmfPlusRecordTypeSetClipRegion 0x4034
+    //TODO EmfPlusRecordTypeOffsetClip 0x4035
+    #define EmfPlusRecordTypeDrawDriverString 0x4036
+    //TODO EmfPlusRecordTypeStrokeFillPath 0x4037
+    //TODO EmfPlusRecordTypeSerializableObject 0x4038
+    //TODO EmfPlusRecordTypeSetTSGraphics 0x4039
+    //TODO EmfPlusRecordTypeSetTSClip 0x403A
+
+    // EMF+object types
+    #define EmfPlusObjectTypeBrush 0x100
+    #define EmfPlusObjectTypePen 0x200
+    #define EmfPlusObjectTypePath 0x300
+    #define EmfPlusObjectTypeRegion 0x400
+    #define EmfPlusObjectTypeImage 0x500
+    #define EmfPlusObjectTypeFont 0x600
+    #define EmfPlusObjectTypeStringFormat 0x700
+    #define EmfPlusObjectTypeImageAttributes 0x800
+    #define EmfPlusObjectTypeCustomLineCap 0x900
+
+    #define EmfPlusRegionInitialStateInfinite 0x10000003
 
     enum UnitType
     {
@@ -126,71 +125,65 @@ namespace emfplushelper
         virtual ~EMFPObject();
     };
 
-    bool readXForm(SvStream& rIn, basegfx::B2DHomMatrix& rTarget);
-    void readRectangle(SvStream& s, float& x, float& y, float &width, float& height, bool bCompressed);
-
-    struct OutDevState
-    {
-        OutDevState();
-
-        ::basegfx::B2DPolyPolygon                                                clip;
-        ::tools::Rectangle                                                              clipRect;
-        css::uno::Reference< css::rendering::XPolyPolygon2D >                    xClipPoly;
-
-        css::uno::Sequence< double >                                             lineColor;
-        css::uno::Sequence< double >                                             fillColor;
-        css::uno::Sequence< double >                                             textColor;
-        css::uno::Sequence< double >                                             textFillColor;
-        css::uno::Sequence< double >                                             textLineColor;
-
-        /** Current font.
-
-        @attention Beware, this member can be NULL, and
-        nevertheless text output is generated.
-        */
-        css::uno::Reference< css::rendering::XCanvasFont >                       xFont;
-        ::basegfx::B2DHomMatrix                                                  transform;
-        ::basegfx::B2DHomMatrix                                                  mapModeTransform;
-        double                                                                   fontRotation;
-
-        FontEmphasisMark                                                         textEmphasisMarkStyle;
-        PushFlags                                                                pushFlags;
-        sal_Int8                                                                 textDirection;
-        sal_Int8                                                                 textAlignment;
-        FontRelief                                                               textReliefStyle;
-        sal_Int8                                                                 textOverlineStyle;
-        sal_Int8                                                                 textUnderlineStyle;
-        sal_Int8                                                                 textStrikeoutStyle;
-        TextAlign                                                                textReferencePoint;
-
-        bool                                                                     isTextOutlineModeSet;
-        bool                                                                     isTextEffectShadowSet;
-        bool                                                                     isTextWordUnderlineSet;
-
-        bool                                                                     isLineColorSet;
-        bool                                                                     isFillColorSet;
-        bool                                                                     isTextFillColorSet;
-        bool                                                                     isTextLineColorSet;
-    };
-
-    typedef struct
-    {
-        basegfx::B2DHomMatrix   aWorldTransform;
-        OutDevState             aDevState;
-    } EmfPlusGraphicState;
-
-    typedef std::map<int, EmfPlusGraphicState> GraphicStateMap;
+//    struct OutDevState
+//    {
+//        OutDevState();
+//
+//        ::basegfx::B2DPolyPolygon                                                clip;
+//        ::tools::Rectangle                                                              clipRect;
+//        css::uno::Reference< css::rendering::XPolyPolygon2D >                    xClipPoly;
+//
+//        css::uno::Sequence< double >                                             lineColor;
+//        css::uno::Sequence< double >                                             fillColor;
+//        css::uno::Sequence< double >                                             textColor;
+//        css::uno::Sequence< double >                                             textFillColor;
+//        css::uno::Sequence< double >                                             textLineColor;
+//
+//        /** Current font.
+//
+//        @attention Beware, this member can be NULL, and
+//        nevertheless text output is generated.
+//        */
+//        css::uno::Reference< css::rendering::XCanvasFont >                       xFont;
+//        ::basegfx::B2DHomMatrix                                                  transform;
+//        ::basegfx::B2DHomMatrix                                                  mapModeTransform;
+//        double                                                                   fontRotation;
+//
+//        FontEmphasisMark                                                         textEmphasisMarkStyle;
+//        PushFlags                                                                pushFlags;
+//        sal_Int8                                                                 textDirection;
+//        sal_Int8                                                                 textAlignment;
+//        FontRelief                                                               textReliefStyle;
+//        sal_Int8                                                                 textOverlineStyle;
+//        sal_Int8                                                                 textUnderlineStyle;
+//        sal_Int8                                                                 textStrikeoutStyle;
+//        TextAlign                                                                textReferencePoint;
+//
+//        bool                                                                     isTextOutlineModeSet;
+//        bool                                                                     isTextEffectShadowSet;
+//        bool                                                                     isTextWordUnderlineSet;
+//
+//        bool                                                                     isLineColorSet;
+//        bool                                                                     isFillColorSet;
+//        bool                                                                     isTextFillColorSet;
+//        bool                                                                     isTextLineColorSet;
+//    };
+
+//    typedef struct
+//    {
+//        basegfx::B2DHomMatrix   aWorldTransform;
+//        OutDevState             aDevState;
+//    } EmfPlusGraphicState;
+//
+//    typedef std::map<int, EmfPlusGraphicState> GraphicStateMap;
 
     struct EmfPlusHelperData
     {
     private:
-        // allow setTargetHolders/setPropertyHolders call from there
-        friend class EmfPlusHelper;
-
         /* EMF+ */
         basegfx::B2DHomMatrix   aBaseTransform;
         basegfx::B2DHomMatrix   aWorldTransform;
-        EMFPObject*             aObjects[256];
+        std::unique_ptr<EMFPObject> aObjects[256];
         float                   fPageScale;
         sal_Int32               nOriginX;
         sal_Int32               nOriginY;
@@ -213,37 +206,42 @@ namespace emfplushelper
         SvMemoryStream          mMStream;
 
         /* emf+ graphic state stack */
-        GraphicStateMap         mGSStack;
-        GraphicStateMap         mGSContainerStack;
+//        GraphicStateMap         mGSStack;
+//        GraphicStateMap         mGSContainerStack;
 
         /// data holders
-        wmfemfhelper::TargetHolders*    mpTargetHolders;
-        wmfemfhelper::PropertyHolders*  mpPropertyHolders;
+        wmfemfhelper::TargetHolders&    mrTargetHolders;
+        wmfemfhelper::PropertyHolders&  mrPropertyHolders;
 
+        // readers
         void processObjectRecord(SvMemoryStream& rObjectStream, sal_uInt16 flags, sal_uInt32 dataSize, bool bUseWholeStream = false);
         void ReadPoint(SvStream& s, float& x, float& y, sal_uInt32 flags);
-        void ReadRectangle(SvStream& s, float& x, float& y, float &width, float& height, bool bCompressed = false);
 
+        // internal mapper
         void MapToDevice(double& x, double& y);
-    public:
-        ::basegfx::B2DPoint Map(double ix, double iy);
-        ::basegfx::B2DSize MapSize(double iwidth, double iheight);
-    private:
-
-        // to set data holders from EmfPlusHelper
-        void setTargetHolders(wmfemfhelper::TargetHolders& rTargetHolders) { mpTargetHolders = &rTargetHolders; }
-        void setPropertyHolders(wmfemfhelper::PropertyHolders& rPropertyHolders) { mpPropertyHolders = &rPropertyHolders; }
 
     public:
-        EmfPlusHelperData(SvMemoryStream& rMS);
+        EmfPlusHelperData(
+            SvMemoryStream& rMS,
+            wmfemfhelper::TargetHolders& rTargetHolders,
+            wmfemfhelper::PropertyHolders& rPropertyHolders);
+        ~EmfPlusHelperData();
 
         void processEmfPlusData(
             SvMemoryStream& rMS,
             const drawinglayer::geometry::ViewInformation2D& rViewInformation);
 
+        // mappers
+        ::basegfx::B2DPoint Map(double ix, double iy);
+        ::basegfx::B2DSize MapSize(double iwidth, double iheight);
+
+        // readers
+        void ReadRectangle(SvStream& s, float& x, float& y, float &width, float& height, bool bCompressed = false);
+        bool readXForm(SvStream& rIn, basegfx::B2DHomMatrix& rTarget);
+
         /// data holders access
-        wmfemfhelper::TargetHolders& getTargetHolders() const { return *mpTargetHolders; }
-        wmfemfhelper::PropertyHolders& getPropertyHolders() const { return *mpPropertyHolders; }
+//        wmfemfhelper::TargetHolders& getTargetHolders() const { return mrTargetHolders; }
+//        wmfemfhelper::PropertyHolders& getPropertyHolders() const { return mrPropertyHolders; }
     };
 }
 
diff --git a/drawinglayer/source/tools/emfplushelper.cxx b/drawinglayer/source/tools/emfplushelper.cxx
index c6c472cf7b30..a587bf09e27d 100644
--- a/drawinglayer/source/tools/emfplushelper.cxx
+++ b/drawinglayer/source/tools/emfplushelper.cxx
@@ -22,24 +22,22 @@
 
 namespace emfplushelper
 {
-    EmfPlusHelper::EmfPlusHelper(SvMemoryStream& rMS)
-        : mpD(new EmfPlusHelperData(rMS))
+    EmfPlusHelper::EmfPlusHelper(
+        SvMemoryStream& rMS,
+        wmfemfhelper::TargetHolders& rTargetHolders,
+        wmfemfhelper::PropertyHolders& rPropertyHolders)
+    :   mpD(new EmfPlusHelperData(rMS, rTargetHolders, rPropertyHolders))
     {
     }
 
     EmfPlusHelper::~EmfPlusHelper()
     {
-        delete mpD;
     }
 
     void EmfPlusHelper::processEmfPlusData(
         SvMemoryStream& rMS,
-        wmfemfhelper::TargetHolders& rTargetHolders,
-        wmfemfhelper::PropertyHolders& rPropertyHolders,
         const drawinglayer::geometry::ViewInformation2D& rViewInformation)
     {
-        mpD->setTargetHolders(rTargetHolders);
-        mpD->setPropertyHolders(rPropertyHolders);
         mpD->processEmfPlusData(rMS, rViewInformation);
     }
 }
diff --git a/drawinglayer/source/tools/emfppen.cxx b/drawinglayer/source/tools/emfppen.cxx
index ef037b0d3157..d60f10e360f4 100644
--- a/drawinglayer/source/tools/emfppen.cxx
+++ b/drawinglayer/source/tools/emfppen.cxx
@@ -97,11 +97,11 @@ namespace emfplushelper
         delete customEndCap;
     }
 
-    void EMFPPen::SetStrokeWidth(rendering::StrokeAttributes& rStrokeAttributes, EmfPlusHelperData& rR, const OutDevState& rState)
+    void EMFPPen::SetStrokeWidth(rendering::StrokeAttributes& rStrokeAttributes, EmfPlusHelperData& rR, const ::basegfx::B2DHomMatrix& mapModeTransform)
     {
         // If a zero width is specified, a minimum value is used, which is determined by the units.
         //TODO Add support for other units than Pixel
-        rStrokeAttributes.StrokeWidth = fabs((rState.mapModeTransform * rR.MapSize(penWidth == 0.0 ? 0.05 : penWidth, 0)).getLength());
+        rStrokeAttributes.StrokeWidth = fabs((mapModeTransform * rR.MapSize(penWidth == 0.0 ? 0.05 : penWidth, 0)).getLength());
 
         // tdf#31814 Based on observation of different EMF+ files (eg. exported by ChemDraw),
         // there is minimal value of line width
@@ -183,7 +183,7 @@ namespace emfplushelper
             " pen data flags: 0x" << penDataFlags << " unit: " << penUnit << " width: " << std::dec << penWidth);
 
         if (penDataFlags & PenDataTransform)
-            readXForm(s, pen_transformation);
+            rR.readXForm(s, pen_transformation);
 
         if (penDataFlags & PenDataStartCap)
         {
diff --git a/drawinglayer/source/tools/emfppen.hxx b/drawinglayer/source/tools/emfppen.hxx
index 4e2dc6d38156..c4a260f6e4a3 100644
--- a/drawinglayer/source/tools/emfppen.hxx
+++ b/drawinglayer/source/tools/emfppen.hxx
@@ -60,7 +60,7 @@ namespace emfplushelper
 
         virtual ~EMFPPen() override;
 
-        void SetStrokeWidth(com::sun::star::rendering::StrokeAttributes& rStrokeAttributes, EmfPlusHelperData& rR, const OutDevState& rState);
+        void SetStrokeWidth(com::sun::star::rendering::StrokeAttributes& rStrokeAttributes, EmfPlusHelperData& rR, const ::basegfx::B2DHomMatrix& mapModeTransform);
 
         void SetStrokeAttributes(com::sun::star::rendering::StrokeAttributes& rStrokeAttributes);
 
diff --git a/drawinglayer/source/tools/wmfemfhelper.cxx b/drawinglayer/source/tools/wmfemfhelper.cxx
index f2231a1879fe..b272f4a51eb3 100644
--- a/drawinglayer/source/tools/wmfemfhelper.cxx
+++ b/drawinglayer/source/tools/wmfemfhelper.cxx
@@ -3028,7 +3028,11 @@ namespace wmfemfhelper
                             SAL_INFO("cppcanvas.emf", "EMF+ passed to canvas mtf renderer - header info, size: " << pA->GetDataSize());
                             SvMemoryStream aMemoryStream(const_cast<sal_uInt8 *>(pA->GetData()), pA->GetDataSize(), StreamMode::READ);
 
-                            aEMFPlus.reset(new emfplushelper::EmfPlusHelper(aMemoryStream));
+                            aEMFPlus.reset(
+                                new emfplushelper::EmfPlusHelper(
+                                    aMemoryStream,
+                                    rTargetHolders,
+                                    rPropertyHolders));
                         }
                     }
                     else if (pA->GetComment().equalsIgnoreAsciiCase("EMF_PLUS"))
@@ -3061,8 +3065,6 @@ namespace wmfemfhelper
 
                                 aEMFPlus->processEmfPlusData(
                                     aMemoryStream,
-                                    rTargetHolders,
-                                    rPropertyHolders,
                                     rViewInformation);
                             }
 


More information about the Libreoffice-commits mailing list