[Libreoffice-commits] core.git: 10 commits - cppcanvas/source include/test test/source vcl/qa vcl/source

Tomaž Vajngerl tomaz.vajngerl at collabora.com
Sun Jul 20 12:02:59 PDT 2014


 cppcanvas/source/mtfrenderer/emfplus.cxx      |  184 ++++++++++++++++++++++++
 cppcanvas/source/mtfrenderer/implrenderer.cxx |   13 +
 include/test/xmlwriter.hxx                    |    1 
 test/source/mtfxmldump.cxx                    |  192 +++++++++++++++++++++-----
 test/source/xmlwriter.cxx                     |   10 +
 vcl/qa/cppunit/wmf/data/image1.emf            |binary
 vcl/qa/cppunit/wmf/wmfimporttest.cxx          |   33 ++++
 vcl/source/filter/wmf/winmtf.cxx              |   17 +-
 vcl/source/filter/wmf/winmtf.hxx              |    2 
 9 files changed, 409 insertions(+), 43 deletions(-)

New commits:
commit 6ca69fc429c45890f23e622b3591b81074d3d9ba
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sat Jul 19 22:12:04 2014 +0200

    bnc#881024 test font size at world transform
    
    Change-Id: If9b09b69ccd890e45d963422ccedb711585f6434

diff --git a/vcl/qa/cppunit/wmf/data/image1.emf b/vcl/qa/cppunit/wmf/data/image1.emf
new file mode 100644
index 0000000..2dcc32a
Binary files /dev/null and b/vcl/qa/cppunit/wmf/data/image1.emf differ
diff --git a/vcl/qa/cppunit/wmf/wmfimporttest.cxx b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
index cc24c769..6e2e374 100644
--- a/vcl/qa/cppunit/wmf/wmfimporttest.cxx
+++ b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
@@ -43,11 +43,14 @@ public:
     void testNonPlaceableWmf();
     void testSine();
     void testEmfProblem();
+    void testWorldTransformFontSize();
 
     CPPUNIT_TEST_SUITE(WmfTest);
     CPPUNIT_TEST(testNonPlaceableWmf);
     CPPUNIT_TEST(testSine);
     CPPUNIT_TEST(testEmfProblem);
+    CPPUNIT_TEST(testWorldTransformFontSize);
+
     CPPUNIT_TEST_SUITE_END();
 };
 
@@ -123,6 +126,36 @@ void WmfTest::testEmfProblem()
     assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "right", "1876");
 }
 
+void WmfTest::testWorldTransformFontSize()
+{
+    SvFileStream aFileStream(getFullUrl("image1.emf"), STREAM_READ);
+    GDIMetaFile aGDIMetaFile;
+    ReadWindowMetafile(aFileStream, aGDIMetaFile);
+
+    MetafileXmlDump dumper;
+    dumper.filterAllActionTypes();
+    dumper.filterActionType(META_FONT_ACTION, false);
+    xmlDocPtr pDoc = dumper.dumpAndParse(aGDIMetaFile);
+
+    CPPUNIT_ASSERT (pDoc);
+
+    assertXPath(pDoc, "/metafile/font", 8);
+
+    assertXPath(pDoc, "/metafile/font[1]", "color", "#595959");
+    assertXPath(pDoc, "/metafile/font[1]", "width", "0");
+    assertXPath(pDoc, "/metafile/font[1]", "height", "389");
+    assertXPath(pDoc, "/metafile/font[1]", "orientation", "0");
+    assertXPath(pDoc, "/metafile/font[1]", "weight", "bold");
+
+    // World transform should not affect font size. Rotating text for 90 degrees
+    // should not exchange font width and height.
+    assertXPath(pDoc, "/metafile/font[3]", "color", "#000000");
+    assertXPath(pDoc, "/metafile/font[3]", "width", "0");
+    assertXPath(pDoc, "/metafile/font[3]", "height", "530");
+    assertXPath(pDoc, "/metafile/font[3]", "orientation", "900");
+    assertXPath(pDoc, "/metafile/font[3]", "weight", "normal");
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(WmfTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit a34e2e08b6976613253a6caa737dbc191b56e372
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sat Jul 19 21:57:19 2014 +0200

    emf+: recognise some more object types
    
    Change-Id: I33fec62e4bc38eeaf014eeb1210db2904af033f6

diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx
index e47cfb5..85e4873 100644
--- a/cppcanvas/source/mtfrenderer/emfplus.cxx
+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx
@@ -92,6 +92,9 @@ namespace
 #define EmfPlusObjectTypeRegion 0x400
 #define EmfPlusObjectTypeImage 0x500
 #define EmfPlusObjectTypeFont 0x600
+#define EmfPlusObjectTypeStringFormat 0x700
+#define EmfPlusObjectTypeImageAttributes 0x800
+#define EmfPlusObjectTypeCustomLineCap 0x900
 
 #define EmfPlusRegionInitialStateInfinite 0x10000003
 
@@ -1729,6 +1732,21 @@ namespace cppcanvas
 
                     break;
                 }
+            case EmfPlusObjectTypeStringFormat:
+                {
+                    SAL_INFO("cppcanvas.emf", "EMF+\t Object type 'string format' not yet implemented");
+                    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;
commit f97c5397f0784ab6e4dd3b8f59bcffd21f13d1af
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sat Jul 19 21:52:09 2014 +0200

    emf+: emulate hatch with color blend
    
    Change-Id: I2ac8f790c79c269d4c1fa650e703c3645c567ca4

diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx
index c3844bb..e47cfb5 100644
--- a/cppcanvas/source/mtfrenderer/emfplus.cxx
+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx
@@ -126,6 +126,63 @@ enum EmfPlusCombineMode
     EmfPlusCombineModeComplement = 0x00000005
 };
 
+enum EmfPlusHatchStyle
+{
+    HatchStyleHorizontal = 0x00000000,
+    HatchStyleVertical = 0x00000001,
+    HatchStyleForwardDiagonal = 0x00000002,
+    HatchStyleBackwardDiagonal = 0x00000003,
+    HatchStyleLargeGrid = 0x00000004,
+    HatchStyleDiagonalCross = 0x00000005,
+    HatchStyle05Percent = 0x00000006,
+    HatchStyle10Percent = 0x00000007,
+    HatchStyle20Percent = 0x00000008,
+    HatchStyle25Percent = 0x00000009,
+    HatchStyle30Percent = 0x0000000A,
+    HatchStyle40Percent = 0x0000000B,
+    HatchStyle50Percent = 0x0000000C,
+    HatchStyle60Percent = 0x0000000D,
+    HatchStyle70Percent = 0x0000000E,
+    HatchStyle75Percent = 0x0000000F,
+    HatchStyle80Percent = 0x00000010,
+    HatchStyle90Percent = 0x00000011,
+    HatchStyleLightDownwardDiagonal = 0x00000012,
+    HatchStyleLightUpwardDiagonal = 0x00000013,
+    HatchStyleDarkDownwardDiagonal = 0x00000014,
+    HatchStyleDarkUpwardDiagonal = 0x00000015,
+    HatchStyleWideDownwardDiagonal = 0x00000016,
+    HatchStyleWideUpwardDiagonal = 0x00000017,
+    HatchStyleLightVertical = 0x00000018,
+    HatchStyleLightHorizontal = 0x00000019,
+    HatchStyleNarrowVertical = 0x0000001A,
+    HatchStyleNarrowHorizontal = 0x0000001B,
+    HatchStyleDarkVertical = 0x0000001C,
+    HatchStyleDarkHorizontal = 0x0000001D,
+    HatchStyleDashedDownwardDiagonal = 0x0000001E,
+    HatchStyleDashedUpwardDiagonal = 0x0000001F,
+    HatchStyleDashedHorizontal = 0x00000020,
+    HatchStyleDashedVertical = 0x00000021,
+    HatchStyleSmallConfetti = 0x00000022,
+    HatchStyleLargeConfetti = 0x00000023,
+    HatchStyleZigZag = 0x00000024,
+    HatchStyleWave = 0x00000025,
+    HatchStyleDiagonalBrick = 0x00000026,
+    HatchStyleHorizontalBrick = 0x00000027,
+    HatchStyleWeave = 0x00000028,
+    HatchStylePlaid = 0x00000029,
+    HatchStyleDivot = 0x0000002A,
+    HatchStyleDottedGrid = 0x0000002B,
+    HatchStyleDottedDiamond = 0x0000002C,
+    HatchStyleShingle = 0x0000002D,
+    HatchStyleTrellis = 0x0000002E,
+    HatchStyleSphere = 0x0000002F,
+    HatchStyleSmallGrid = 0x00000030,
+    HatchStyleSmallCheckerBoard = 0x00000031,
+    HatchStyleLargeCheckerBoard = 0x00000032,
+    HatchStyleOutlinedDiamond = 0x00000033,
+    HatchStyleSolidDiamond = 0x00000034
+};
+
 const char* emfTypeToName(sal_uInt16 type)
 {
     switch(type)
@@ -403,6 +460,7 @@ namespace cppcanvas
             sal_Int32 surroundColorsNumber;
             ::Color* surroundColors;
             EMFPPath *path;
+            EmfPlusHatchStyle hatchStyle;
 
         public:
             EMFPBrush ()
@@ -423,6 +481,7 @@ namespace cppcanvas
                 , surroundColorsNumber(0)
                 , surroundColors(NULL)
                 , path(NULL)
+                , hatchStyle(HatchStyleHorizontal)
             {
             }
 
@@ -470,7 +529,21 @@ namespace cppcanvas
                         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 1:
+                    {
+                        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;
                     }
                 // path gradient
@@ -1222,8 +1295,49 @@ namespace cppcanvas
                 rState.isFillColorSet = false;
                 rState.isLineColorSet = false;
 
-                if (brush->type == 3 || brush->type == 4) {
+                if (brush->type == 1)
+                {
+                    // EMF+ like hatching is currently not supported. These are just color blends which serve as an approximation for some of them
+                    // for the others the hatch "background" color (secondColor in brush) is used.
 
+                    bool isHatchBlend = true;
+                    double blendFactor = 0.0;
+
+                    switch (brush->hatchStyle)
+                    {
+                        case HatchStyle05Percent: blendFactor = 0.05; break;
+                        case HatchStyle10Percent: blendFactor = 0.10; break;
+                        case HatchStyle20Percent: blendFactor = 0.20; break;
+                        case HatchStyle25Percent: blendFactor = 0.25; break;
+                        case HatchStyle30Percent: blendFactor = 0.30; break;
+                        case HatchStyle40Percent: blendFactor = 0.40; break;
+                        case HatchStyle50Percent: blendFactor = 0.50; break;
+                        case HatchStyle60Percent: blendFactor = 0.60; break;
+                        case HatchStyle70Percent: blendFactor = 0.70; break;
+                        case HatchStyle75Percent: blendFactor = 0.75; break;
+                        case HatchStyle80Percent: blendFactor = 0.80; break;
+                        case HatchStyle90Percent: blendFactor = 0.90; break;
+                        default:
+                            isHatchBlend = false;
+                            break;
+                    }
+                    rState.isFillColorSet = true;
+                    rState.isLineColorSet = false;
+                    ::Color fillColor;
+                    if (isHatchBlend)
+                    {
+                        fillColor = brush->solidColor;
+                        fillColor.Merge(brush->secondColor, static_cast<sal_uInt8>(255 * blendFactor));
+                    }
+                    else
+                    {
+                        fillColor = brush->secondColor;
+                    }
+                    rState.fillColor = ::vcl::unotools::colorToDoubleSequence(fillColor, rCanvas->getUNOCanvas()->getDevice()->getDeviceColorSpace());
+                    pPolyAction = ActionSharedPtr ( internal::PolyPolyActionFactory::createPolyPolyAction( localPolygon, rParms.mrCanvas, rState ) );
+                }
+                else if (brush->type == 3 || brush->type == 4)
+                {
                     if (brush->type == 3 && !(brush->additionalFlags & 0x1))
                         return;  // we are unable to parse these brushes yet
 
commit cd3bffed33db9e847b4db99cc1220aa6f25f65ec
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sat Jul 19 21:50:27 2014 +0200

    xmlwriter: set indent and always write utf8 xml document
    
    Change-Id: I1477833e696edbac2dc375329e7b26a7105d1593

diff --git a/test/source/xmlwriter.cxx b/test/source/xmlwriter.cxx
index b98344b..c3ac40e 100644
--- a/test/source/xmlwriter.cxx
+++ b/test/source/xmlwriter.cxx
@@ -29,7 +29,8 @@ XmlWriter::~XmlWriter()
 
 void XmlWriter::startDocument()
 {
-    xmlTextWriterStartDocument(mpWriter, NULL, NULL, NULL);
+    xmlTextWriterSetIndent(mpWriter, 1);
+    xmlTextWriterStartDocument(mpWriter, NULL, "UTF-8", NULL);
 }
 
 void XmlWriter::endDocument()
commit 501f6b050b8309f54e2842a26f6a3d95a859ffb7
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sat Jul 19 21:48:46 2014 +0200

    Support color related MTF actions in mtfxmldump
    
    Change-Id: I5deac7f096866a8f149acfd0d11bbc0963238e88

diff --git a/test/source/mtfxmldump.cxx b/test/source/mtfxmldump.cxx
index 8907856..9223797 100644
--- a/test/source/mtfxmldump.cxx
+++ b/test/source/mtfxmldump.cxx
@@ -20,6 +20,8 @@
 namespace
 {
 
+const size_t constMaxActionType = 513;
+
 int lclWriteCallback(void* pContext, const char* sBuffer, int nLen)
 {
     SvStream* pStream = static_cast<SvStream*>(pContext);
@@ -138,6 +140,30 @@ OUString convertLineStyleToString(LineStyle eAlign)
     return OUString();
 }
 
+OUString convertFontWeigthToString(FontWeight eFontWeight)
+{
+    enum FontWeight { WEIGHT_DONTKNOW, WEIGHT_THIN, WEIGHT_ULTRALIGHT,
+                  WEIGHT_LIGHT, WEIGHT_SEMILIGHT, WEIGHT_NORMAL,
+                  WEIGHT_MEDIUM, WEIGHT_SEMIBOLD, WEIGHT_BOLD,
+                  WEIGHT_ULTRABOLD, WEIGHT_BLACK, FontWeight_FORCE_EQUAL_SIZE=SAL_MAX_ENUM };
+    switch (eFontWeight)
+    {
+        case WEIGHT_DONTKNOW:   return OUString("unknown");
+        case WEIGHT_THIN:       return OUString("thin");
+        case WEIGHT_ULTRALIGHT: return OUString("ultralight");
+        case WEIGHT_LIGHT:      return OUString("light");
+        case WEIGHT_SEMILIGHT:  return OUString("semilight");
+        case WEIGHT_NORMAL:     return OUString("normal");
+        case WEIGHT_MEDIUM:     return OUString("medium");
+        case WEIGHT_SEMIBOLD:   return OUString("semibold");
+        case WEIGHT_BOLD:       return OUString("bold");
+        case WEIGHT_ULTRABOLD:  return OUString("ultrabold");
+        case WEIGHT_BLACK:      return OUString("black");
+        case FontWeight_FORCE_EQUAL_SIZE:    return OUString("equalsize");
+    }
+    return OUString();
+}
+
 OString convertLineStyleToString(const sal_uInt16 nActionType)
 {
     switch (nActionType)
@@ -203,7 +229,7 @@ OString convertLineStyleToString(const sal_uInt16 nActionType)
 } // anonymous namespace
 
 MetafileXmlDump::MetafileXmlDump() :
-    maFilter(512, false)
+    maFilter(constMaxActionType, false)
 {}
 
 MetafileXmlDump::~MetafileXmlDump()
@@ -216,12 +242,12 @@ void MetafileXmlDump::filterActionType(const sal_uInt16 nActionType, bool bShoul
 
 void MetafileXmlDump::filterAllActionTypes()
 {
-    maFilter.assign(512, true);
+    maFilter.assign(constMaxActionType, true);
 }
 
 void MetafileXmlDump::filterNoneActionTypes()
 {
-    maFilter.assign(512, false);
+    maFilter.assign(constMaxActionType, false);
 }
 
 xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString& rTempStreamName)
@@ -234,8 +260,7 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
         pStream.reset(new SvFileStream(rTempStreamName, STREAM_STD_READWRITE | STREAM_TRUNC));
 
     xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO(lclWriteCallback, lclCloseCallback, pStream.get(), NULL);
-    xmlTextWriterPtr xmlWriter = xmlNewTextWriter( xmlOutBuffer );
-    xmlTextWriterSetIndent( xmlWriter, 1 );
+    xmlTextWriterPtr xmlWriter = xmlNewTextWriter(xmlOutBuffer);
 
     XmlWriter aWriter(xmlWriter);
     aWriter.startDocument();
@@ -300,6 +325,16 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             }
             break;
 
+            case META_TEXTLINECOLOR_ACTION:
+            {
+                MetaTextLineColorAction* pMetaTextLineColorAction = static_cast<MetaTextLineColorAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
+
+                aWriter.attribute("color", convertColorToString(pMetaTextLineColorAction->GetColor()));
+                aWriter.endElement();
+            }
+            break;
+
             case META_TEXTFILLCOLOR_ACTION:
             {
                 MetaTextFillColorAction* pMetaTextFillColorAction = static_cast<MetaTextFillColorAction*>(pAction);
@@ -327,6 +362,8 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
                 aWriter.attribute("stylename", aFont.GetStyleName());
                 aWriter.attribute("width", aFont.GetSize().Width());
                 aWriter.attribute("height", aFont.GetSize().Height());
+                aWriter.attribute("orientation", aFont.GetOrientation());
+                aWriter.attribute("weight", convertFontWeigthToString(aFont.GetWeight()));
 
                 aWriter.endElement();
             }
@@ -386,10 +423,20 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
 
             case META_LINECOLOR_ACTION:
             {
-                MetaTextLineColorAction* pMetaTextLineColorAction = static_cast<MetaTextLineColorAction*>(pAction);
+                MetaLineColorAction* pMetaLineColorAction = static_cast<MetaLineColorAction*>(pAction);
                 aWriter.startElement(sCurrentElementTag);
 
-                aWriter.attribute("color", convertColorToString(pMetaTextLineColorAction->GetColor()));
+                aWriter.attribute("color", convertColorToString(pMetaLineColorAction->GetColor()));
+                aWriter.endElement();
+            }
+            break;
+
+            case META_FILLCOLOR_ACTION:
+            {
+                MetaFillColorAction* pMetaFillColorAction = static_cast<MetaFillColorAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
+
+                aWriter.attribute("color", convertColorToString(pMetaFillColorAction->GetColor()));
                 aWriter.endElement();
             }
             break;
commit 816f4be79c3847fac8d31bf0b63180e1468c7109
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Fri Jul 18 13:36:59 2014 +0200

    bnc#881024 Handle 0 font height just like outdev & drawinglayer
    
    Change-Id: I80055e4101873e0ddd408ac1f0ee9c75cc3bf6b3

diff --git a/cppcanvas/source/mtfrenderer/implrenderer.cxx b/cppcanvas/source/mtfrenderer/implrenderer.cxx
index 7d2a6bc..4f261b0 100644
--- a/cppcanvas/source/mtfrenderer/implrenderer.cxx
+++ b/cppcanvas/source/mtfrenderer/implrenderer.cxx
@@ -809,7 +809,18 @@ namespace cppcanvas
 
             // TODO(Q3): This code smells of programming by
             // coincidence (the next two if statements)
-            const ::Size rFontSizeLog( rFont.GetSize() );
+
+            ::Size rFontSizeLog( rFont.GetSize() );
+
+            if (rFontSizeLog.Height() == 0)
+            {
+                // guess 16 pixel (as in VCL)
+                rFontSizeLog = ::Size(0, 16);
+
+                // convert to target MapUnit if not pixels
+                rFontSizeLog = OutputDevice::LogicToLogic(rFontSizeLog, MAP_PIXEL, rParms.mrVDev.GetMapMode());
+            }
+
             const sal_Int32 nFontWidthLog = rFontSizeLog.Width();
             if( nFontWidthLog != 0 )
             {
commit 8f705df1221c3f92d8cde68bdf726a7c3ce8fe1b
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Fri Jul 18 13:36:13 2014 +0200

    bnc#881024 Don't world transform font size in WMF/EMF import
    
    Change-Id: Ia865b84ee2b159ff7251ab5a769a2b635dd2a1ea

diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx
index f69222d..1d81309 100644
--- a/vcl/source/filter/wmf/winmtf.cxx
+++ b/vcl/source/filter/wmf/winmtf.cxx
@@ -389,13 +389,22 @@ Point WinMtfOutput::ImplMap( const Point& rPt )
         return Point();
 };
 
-Size WinMtfOutput::ImplMap( const Size& rSz )
+Size WinMtfOutput::ImplMap(const Size& rSz, bool bDoWorldTransform)
 {
     if ( mnWinExtX && mnWinExtY )
     {
         // #i121382# apply the whole WorldTransform, else a rotation will be misinterpreted
-        double fWidth = rSz.Width() * maXForm.eM11 + rSz.Height() * maXForm.eM21;
-        double fHeight = rSz.Width() * maXForm.eM12 + rSz.Height() * maXForm.eM22;
+        double fWidth, fHeight;
+        if (bDoWorldTransform)
+        {
+            fWidth = rSz.Width() * maXForm.eM11 + rSz.Height() * maXForm.eM21;
+            fHeight = rSz.Width() * maXForm.eM12 + rSz.Height() * maXForm.eM22;
+        }
+        else
+        {
+            fWidth = rSz.Width();
+            fHeight = rSz.Height();
+        }
 
         if ( mnGfxMode == GM_COMPATIBLE )
         {
@@ -457,7 +466,7 @@ void WinMtfOutput::ImplMap( Font& rFont )
 {
     // !!! HACK: we now always set the width to zero because the OS width is interpreted differently;
     // must later be made portable in SV (KA 1996-02-08)
-    Size  aFontSize = ImplMap (rFont.GetSize());
+    Size  aFontSize = ImplMap (rFont.GetSize(), false);
 
     if( aFontSize.Height() < 0 )
         aFontSize.Height() *= -1;
diff --git a/vcl/source/filter/wmf/winmtf.hxx b/vcl/source/filter/wmf/winmtf.hxx
index 4254a21..3332888 100644
--- a/vcl/source/filter/wmf/winmtf.hxx
+++ b/vcl/source/filter/wmf/winmtf.hxx
@@ -635,7 +635,7 @@ class WinMtfOutput
 
     Point               ImplMap( const Point& rPt );
     Point               ImplScale( const Point& rPt );
-    Size                ImplMap( const Size& rSz );
+    Size                ImplMap( const Size& rSize, bool bDoWorldTransform = true);
     Rectangle           ImplMap( const Rectangle& rRectangle );
     void                ImplMap( Font& rFont );
     Polygon&            ImplMap( Polygon& rPolygon );
commit 88d1d90fb785093bee448353d2978e86bb953b2f
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Fri Jul 18 10:19:16 2014 +0200

    Also add xmlwriter's "content" method to the header file
    
    Change-Id: Ic3e13e89480e3b18f84c3a8fd1a88627bd465d6a

diff --git a/include/test/xmlwriter.hxx b/include/test/xmlwriter.hxx
index 894c928..b640639 100644
--- a/include/test/xmlwriter.hxx
+++ b/include/test/xmlwriter.hxx
@@ -37,6 +37,7 @@ public:
     void attribute(const OString& sTagName, const OUString& aValue);
     void attribute(const OString& sTagName, sal_Int32 aNumber);
 
+    void content(const OString& aValue);
     void content(const OUString& aValue);
 };
 
commit cef094efd7641dc3b6c1984fd701cd133d44067f
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Fri Jul 18 10:15:10 2014 +0200

    emf+: Log type name instead of the type number
    
    Change-Id: I5c4f7c5713a559815bd46328907673d114fee011

diff --git a/cppcanvas/source/mtfrenderer/emfplus.cxx b/cppcanvas/source/mtfrenderer/emfplus.cxx
index 91e84d6..c3844bb 100644
--- a/cppcanvas/source/mtfrenderer/emfplus.cxx
+++ b/cppcanvas/source/mtfrenderer/emfplus.cxx
@@ -49,6 +49,9 @@
 #include <textaction.hxx>
 #include <stdio.h>
 
+namespace
+{
+
 #define EmfPlusRecordTypeHeader 16385
 #define EmfPlusRecordTypeEndOfFile 16386
 #define EmfPlusRecordTypeGetDC 16388
@@ -123,6 +126,49 @@ enum EmfPlusCombineMode
     EmfPlusCombineModeComplement = 0x00000005
 };
 
+const char* emfTypeToName(sal_uInt16 type)
+{
+    switch(type)
+    {
+        case EmfPlusRecordTypeHeader: return "EmfPlusRecordTypeHeader";
+        case EmfPlusRecordTypeEndOfFile: return "EmfPlusRecordTypeEndOfFile";
+        case EmfPlusRecordTypeGetDC: return "EmfPlusRecordTypeGetDC";
+        case EmfPlusRecordTypeObject: return "EmfPlusRecordTypeObject";
+        case EmfPlusRecordTypeFillRects: return "EmfPlusRecordTypeFillRects";
+        case EmfPlusRecordTypeFillPolygon: return "EmfPlusRecordTypeFillPolygon";
+        case EmfPlusRecordTypeDrawLines: return "EmfPlusRecordTypeDrawLines";
+        case EmfPlusRecordTypeFillEllipse: return "EmfPlusRecordTypeFillEllipse";
+        case EmfPlusRecordTypeDrawEllipse: return "EmfPlusRecordTypeDrawEllipse";
+        case EmfPlusRecordTypeFillPie: return "EmfPlusRecordTypeFillPie";
+        case EmfPlusRecordTypeFillPath: return "EmfPlusRecordTypeFillPath";
+        case EmfPlusRecordTypeDrawPath: return "EmfPlusRecordTypeDrawPath";
+        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 EmfPlusRecordTypeSetPageTransform: return "EmfPlusRecordTypeSetPageTransform";
+        case EmfPlusRecordTypeSetClipRect: return "EmfPlusRecordTypeSetClipRect";
+        case EmfPlusRecordTypeSetClipPath: return "EmfPlusRecordTypeSetClipPath";
+        case EmfPlusRecordTypeSetClipRegion: return "EmfPlusRecordTypeSetClipRegion";
+        case EmfPlusRecordTypeDrawDriverString: return "EmfPlusRecordTypeDrawDriverString";
+    }
+    return "";
+}
+
+} // anonymous namespace
+
 using namespace ::com::sun::star;
 using namespace ::basegfx;
 
@@ -1648,7 +1694,7 @@ namespace cppcanvas
                     SAL_INFO("cppcanvas.emf", "Size field is less than 12 bytes");
                 }
 
-                SAL_INFO("cppcanvas.emf", "EMF+ record size: " << size << " type: " << type << " flags: " << flags << " data size: " << dataSize);
+                SAL_INFO("cppcanvas.emf", "EMF+ record size: " << size << " type: " << emfTypeToName(type) << " flags: " << flags << " data size: " << dataSize);
 
                 if (type == EmfPlusRecordTypeObject && ((mbMultipart && (flags & 0x7fff) == (mMFlags & 0x7fff)) || (flags & 0x8000))) {
                     if (!mbMultipart) {
commit 317f154de7cf26a88e82008c895dbb0a840d5646
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Fri Jul 18 10:09:14 2014 +0200

    Extend metafile to xml dump testing tool with more MFT actions
    
    Change-Id: I819de476c6a615b8cf27a6a26d41a6e9ac25ef85

diff --git a/test/source/mtfxmldump.cxx b/test/source/mtfxmldump.cxx
index 500fa86..8907856 100644
--- a/test/source/mtfxmldump.cxx
+++ b/test/source/mtfxmldump.cxx
@@ -15,6 +15,8 @@
 #include <rtl/string.hxx>
 #include <rtl/strbuf.hxx>
 
+#include <boost/scoped_ptr.hpp>
+
 namespace
 {
 
@@ -28,7 +30,7 @@ int lclWriteCallback(void* pContext, const char* sBuffer, int nLen)
 int lclCloseCallback(void* pContext)
 {
     SvStream* pStream = static_cast<SvStream*>(pContext);
-    pStream->WriteChar(0);
+    pStream->WriteChar('\0');
     return 0;
 }
 
@@ -136,6 +138,68 @@ OUString convertLineStyleToString(LineStyle eAlign)
     return OUString();
 }
 
+OString convertLineStyleToString(const sal_uInt16 nActionType)
+{
+    switch (nActionType)
+    {
+        case META_NULL_ACTION:                  return "null";
+        case META_PIXEL_ACTION:                 return "pixel";
+        case META_POINT_ACTION:                 return "point";
+        case META_LINE_ACTION:                  return "line";
+        case META_RECT_ACTION:                  return "rect";
+        case META_ROUNDRECT_ACTION:             return "roundrect";
+        case META_ELLIPSE_ACTION:               return "ellipse";
+        case META_ARC_ACTION:                   return "arc";
+        case META_PIE_ACTION:                   return "pie";
+        case META_CHORD_ACTION:                 return "chord";
+        case META_POLYLINE_ACTION:              return "polyline";
+        case META_POLYGON_ACTION:               return "polygon";
+        case META_POLYPOLYGON_ACTION:           return "polypolygon";
+        case META_TEXT_ACTION:                  return "text";
+        case META_TEXTARRAY_ACTION:             return "textarray";
+        case META_STRETCHTEXT_ACTION:           return "strechtext";
+        case META_TEXTRECT_ACTION:              return "textrect";
+        case META_TEXTLINE_ACTION:              return "textline";
+        case META_BMP_ACTION:                   return "bmp";
+        case META_BMPSCALE_ACTION:              return "bmpscale";
+        case META_BMPSCALEPART_ACTION:          return "bmpscalepart";
+        case META_BMPEX_ACTION:                 return "bmpex";
+        case META_BMPEXSCALE_ACTION:            return "bmpexscale";
+        case META_BMPEXSCALEPART_ACTION:        return "bmpexscalepart";
+        case META_MASK_ACTION:                  return "mask";
+        case META_MASKSCALE_ACTION:             return "maskscale";
+        case META_MASKSCALEPART_ACTION:         return "maskscalepart";
+        case META_GRADIENT_ACTION:              return "gradient";
+        case META_GRADIENTEX_ACTION:            return "gradientex";
+        case META_HATCH_ACTION:                 return "hatch";
+        case META_WALLPAPER_ACTION:             return "wallpaper";
+        case META_CLIPREGION_ACTION:            return "clipregion";
+        case META_ISECTRECTCLIPREGION_ACTION:   return "sectrectclipregion";
+        case META_ISECTREGIONCLIPREGION_ACTION: return "sectregionclipregion";
+        case META_MOVECLIPREGION_ACTION:        return "moveclipregion";
+        case META_LINECOLOR_ACTION:             return "linecolor";
+        case META_FILLCOLOR_ACTION:             return "fillcolor";
+        case META_TEXTCOLOR_ACTION:             return "textcolor";
+        case META_TEXTFILLCOLOR_ACTION:         return "textfillcolor";
+        case META_TEXTLINECOLOR_ACTION:         return "textlinecolor";
+        case META_OVERLINECOLOR_ACTION:         return "overlinecolor";
+        case META_TEXTALIGN_ACTION:             return "textalign";
+        case META_MAPMODE_ACTION:               return "mapmode";
+        case META_FONT_ACTION:                  return "font";
+        case META_PUSH_ACTION:                  return "push";
+        case META_POP_ACTION:                   return "pop";
+        case META_RASTEROP_ACTION:              return "rasterop";
+        case META_TRANSPARENT_ACTION:           return "transparent";
+        case META_FLOATTRANSPARENT_ACTION:      return "floattransparent";
+        case META_EPS_ACTION:                   return "eps";
+        case META_REFPOINT_ACTION:              return "refpoint";
+        case META_COMMENT_ACTION:               return "comment";
+        case META_LAYOUTMODE_ACTION:            return "layoutmode";
+        case META_TEXTLANGUAGE_ACTION:          return "textlanguage";
+    }
+    return "";
+}
+
 } // anonymous namespace
 
 MetafileXmlDump::MetafileXmlDump() :
@@ -162,14 +226,14 @@ void MetafileXmlDump::filterNoneActionTypes()
 
 xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString& rTempStreamName)
 {
-    SvStream *pStream = NULL;
+    boost::scoped_ptr<SvStream> pStream;
 
     if (rTempStreamName.isEmpty())
-        pStream = new SvMemoryStream();
+        pStream.reset(new SvMemoryStream());
     else
-        pStream = new SvFileStream(rTempStreamName, STREAM_STD_READWRITE | STREAM_TRUNC);
+        pStream.reset(new SvFileStream(rTempStreamName, STREAM_STD_READWRITE | STREAM_TRUNC));
 
-    xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO(lclWriteCallback, lclCloseCallback, pStream, NULL);
+    xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO(lclWriteCallback, lclCloseCallback, pStream.get(), NULL);
     xmlTextWriterPtr xmlWriter = xmlNewTextWriter( xmlOutBuffer );
     xmlTextWriterSetIndent( xmlWriter, 1 );
 
@@ -183,13 +247,15 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
         if (maFilter[nActionType])
             continue;
 
+        OString sCurrentElementTag = convertLineStyleToString(nActionType);
+
         switch (nActionType)
         {
             case META_LINE_ACTION:
             {
                 MetaLineAction* pMetaLineAction = static_cast<MetaLineAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
 
-                aWriter.startElement("line");
                 aWriter.attribute("startx", pMetaLineAction->GetStartPoint().X());
                 aWriter.attribute("starty", pMetaLineAction->GetStartPoint().Y());
                 aWriter.attribute("endx", pMetaLineAction->GetEndPoint().X());
@@ -209,8 +275,8 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_PUSH_ACTION:
             {
                 MetaPushAction* pMetaPushAction = static_cast<MetaPushAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
 
-                aWriter.startElement("push");
                 aWriter.attribute("flags", collectPushFlags(pMetaPushAction->GetFlags()));
             }
             break;
@@ -224,8 +290,8 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_RASTEROP_ACTION:
             {
                 MetaRasterOpAction* pMetaRasterOpAction = static_cast<MetaRasterOpAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
 
-                aWriter.startElement("rop");
                 if (pMetaRasterOpAction->GetRasterOp() != ROP_OVERPAINT)
                 {
                     aWriter.attribute("operation", convertRopToString(pMetaRasterOpAction->GetRasterOp()));
@@ -237,8 +303,7 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_TEXTFILLCOLOR_ACTION:
             {
                 MetaTextFillColorAction* pMetaTextFillColorAction = static_cast<MetaTextFillColorAction*>(pAction);
-
-                aWriter.startElement("textfillcolor");
+                aWriter.startElement(sCurrentElementTag);
 
                 aWriter.attribute("color", convertColorToString(pMetaTextFillColorAction->GetColor()));
 
@@ -252,7 +317,7 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_FONT_ACTION:
             {
                 MetaFontAction* pMetaFontAction = static_cast<MetaFontAction*>(pAction);
-                aWriter.startElement("font");
+                aWriter.startElement(sCurrentElementTag);
 
                 Font aFont = pMetaFontAction->GetFont();
 
@@ -270,7 +335,7 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_TEXTALIGN_ACTION:
             {
                 MetaTextAlignAction* pMetaTextAlignAction = static_cast<MetaTextAlignAction*>(pAction);
-                aWriter.startElement("textalign");
+                aWriter.startElement(sCurrentElementTag);
                 OUString sAlign = convertTextAlignToString(pMetaTextAlignAction->GetTextAlign());
                 if (!sAlign.isEmpty())
                     aWriter.attribute("align", sAlign);
@@ -281,8 +346,8 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_TEXTCOLOR_ACTION:
             {
                 MetaTextColorAction* pMetaTextColorAction = static_cast<MetaTextColorAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
 
-                aWriter.startElement("textcolor");
                 aWriter.attribute("color", convertColorToString(pMetaTextColorAction->GetColor()));
                 aWriter.endElement();
             }
@@ -291,8 +356,8 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_TEXTARRAY_ACTION:
             {
                 MetaTextArrayAction* pMetaTextArrayAction = static_cast<MetaTextArrayAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
 
-                aWriter.startElement("textarray");
                 sal_Int32 aIndex = pMetaTextArrayAction->GetIndex();
                 sal_Int32 aLength = pMetaTextArrayAction->GetLen();
 
@@ -322,25 +387,17 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_LINECOLOR_ACTION:
             {
                 MetaTextLineColorAction* pMetaTextLineColorAction = static_cast<MetaTextLineColorAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
 
-                aWriter.startElement("linecolor");
                 aWriter.attribute("color", convertColorToString(pMetaTextLineColorAction->GetColor()));
                 aWriter.endElement();
             }
             break;
 
-            case META_MAPMODE_ACTION:
-            {
-                aWriter.startElement("mapmode");
-                aWriter.endElement();
-            }
-            break;
-
             case META_CLIPREGION_ACTION:
             {
                 const MetaClipRegionAction* pA = static_cast< const MetaClipRegionAction* >(pAction);
-
-                aWriter.startElement("clipregion");
+                aWriter.startElement(sCurrentElementTag);
 
                 // FIXME for now we dump only the bounding box; this is
                 // enough for the tests we have, but may need extending to
@@ -358,8 +415,8 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_ISECTRECTCLIPREGION_ACTION:
             {
                 MetaISectRectClipRegionAction* pMetaISectRectClipRegionAction = static_cast<MetaISectRectClipRegionAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
 
-                aWriter.startElement("sectrectclipregion");
                 Rectangle aRectangle = pMetaISectRectClipRegionAction->GetRect();
                 aWriter.attribute("top",    aRectangle.Top());
                 aWriter.attribute("left",   aRectangle.Left());
@@ -373,7 +430,7 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_POLYLINE_ACTION:
             {
                 MetaPolyLineAction* pMetaPolyLineAction = static_cast<MetaPolyLineAction*>(pAction);
-                aWriter.startElement("polyline");
+                aWriter.startElement(sCurrentElementTag);
 
                 Polygon aPolygon = pMetaPolyLineAction->GetPolygon();
                 for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++)
@@ -398,7 +455,7 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             case META_POLYGON_ACTION:
             {
                 MetaPolygonAction* pMetaPolygonAction = static_cast<MetaPolygonAction*>(pAction);
-                aWriter.startElement("polygon");
+                aWriter.startElement(sCurrentElementTag);
 
                 Polygon aPolygon = pMetaPolygonAction->GetPolygon();
                 for (sal_uInt16 i = 0; i < aPolygon.GetSize(); i++)
@@ -413,7 +470,33 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
             }
             break;
 
+            case META_COMMENT_ACTION:
+            {
+                MetaCommentAction* pMetaCommentAction = static_cast<MetaCommentAction*>(pAction);
+                aWriter.startElement(sCurrentElementTag);
+
+                if (pMetaCommentAction->GetDataSize() > 0)
+                {
+                    aWriter.attribute("datasize", pMetaCommentAction->GetDataSize());
+                }
+                if (!pMetaCommentAction->GetComment().isEmpty())
+                {
+                    aWriter.startElement("comment");
+                    aWriter.content(pMetaCommentAction->GetComment());
+                    aWriter.endElement();
+                }
+
+                aWriter.endElement();
+            }
+            break;
+
+            default:
+            {
+                aWriter.element(sCurrentElementTag);
+            }
+            break;
         }
+
     }
 
     aWriter.endElement();
@@ -421,9 +504,7 @@ xmlDocPtr MetafileXmlDump::dumpAndParse(GDIMetaFile& rMetaFile, const OUString&
 
     pStream->Seek(STREAM_SEEK_TO_BEGIN);
 
-    xmlDocPtr pDoc = XmlTestTools::parseXmlStream(pStream);
-
-    delete pStream;
+    xmlDocPtr pDoc = XmlTestTools::parseXmlStream(pStream.get());
 
     return pDoc;
 }
diff --git a/test/source/xmlwriter.cxx b/test/source/xmlwriter.cxx
index b1166be..b98344b 100644
--- a/test/source/xmlwriter.cxx
+++ b/test/source/xmlwriter.cxx
@@ -73,7 +73,12 @@ void XmlWriter::attribute(const OString& name, const sal_Int32 aNumber)
 
 void XmlWriter::content(const OUString& aValue)
 {
-    xmlChar* xmlValue = xmlCharStrdup(OUStringToOString(aValue, RTL_TEXTENCODING_UTF8).getStr());
+    content(OUStringToOString(aValue, RTL_TEXTENCODING_UTF8));
+}
+
+void XmlWriter::content(const OString& aValue)
+{
+    xmlChar* xmlValue = xmlCharStrdup(aValue.getStr());
     xmlTextWriterWriteString(mpWriter, xmlValue);
     xmlFree(xmlValue);
 }


More information about the Libreoffice-commits mailing list