[Libreoffice-commits] core.git: 6 commits - test/source vcl/qa vcl/source

Tomaž Vajngerl tomaz.vajngerl at collabora.com
Sun May 18 14:59:38 PDT 2014


 test/source/mtfxmldump.cxx                |   15 -
 vcl/qa/cppunit/wmf/data/computer_mail.emf |binary
 vcl/qa/cppunit/wmf/data/sine_wave.emf     |binary
 vcl/qa/cppunit/wmf/wmfimporttest.cxx      |   82 +++++++++-
 vcl/source/filter/wmf/enhwmf.cxx          |  230 ++++++++++++++++------------
 vcl/source/filter/wmf/winmtf.cxx          |   31 +--
 vcl/source/filter/wmf/winmtf.hxx          |  238 +++++++++++++++---------------
 7 files changed, 350 insertions(+), 246 deletions(-)

New commits:
commit 9a4a48d213457f93c797493011ac362eb528de6a
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sun May 18 23:57:09 2014 +0200

    vcl emf test: test clip region is correct for problematic files
    
    Change-Id: I60caf9ebcff417e0f87bae9c6b5d308b5e2f0b37

diff --git a/vcl/qa/cppunit/wmf/data/computer_mail.emf b/vcl/qa/cppunit/wmf/data/computer_mail.emf
new file mode 100644
index 0000000..0dbf23f
Binary files /dev/null and b/vcl/qa/cppunit/wmf/data/computer_mail.emf differ
diff --git a/vcl/qa/cppunit/wmf/data/sine_wave.emf b/vcl/qa/cppunit/wmf/data/sine_wave.emf
new file mode 100644
index 0000000..e5a4fa6
Binary files /dev/null and b/vcl/qa/cppunit/wmf/data/sine_wave.emf differ
diff --git a/vcl/qa/cppunit/wmf/wmfimporttest.cxx b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
index 12d1942..7460447 100644
--- a/vcl/qa/cppunit/wmf/wmfimporttest.cxx
+++ b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
@@ -27,37 +27,46 @@ using namespace css;
 
 class WmfTest : public test::BootstrapFixture, public XmlTestTools
 {
+    OUString maDataUrl;
+
+    OUString getFullUrl(OUString sFileName)
+    {
+        return getURLFromSrc(maDataUrl) + sFileName;
+    }
+
 public:
     WmfTest() :
-        BootstrapFixture(true, false)
+        BootstrapFixture(true, false),
+        maDataUrl("/vcl/qa/cppunit/wmf/data/")
     {}
 
     void testNonPlaceableWmf();
+    void testSine();
+    void testEmfProblem();
 
     CPPUNIT_TEST_SUITE(WmfTest);
     CPPUNIT_TEST(testNonPlaceableWmf);
+    CPPUNIT_TEST(testSine);
+    CPPUNIT_TEST(testEmfProblem);
     CPPUNIT_TEST_SUITE_END();
 };
 
 void WmfTest::testNonPlaceableWmf()
 {
-    OUString aUrl = getURLFromSrc("/vcl/qa/cppunit/wmf/data/");
-
-    SvFileStream aFileStream(aUrl + "visio_import_source.wmf", STREAM_READ);
+    SvFileStream aFileStream(getFullUrl("visio_import_source.wmf"), STREAM_READ);
     GDIMetaFile aGDIMetaFile;
     ReadWindowMetafile(aFileStream, aGDIMetaFile);
 
-    boost::scoped_ptr<SvMemoryStream> aStream(new SvMemoryStream);
+    SvMemoryStream aStream;
 
-    MetafileXmlDump dumper(*aStream);
+    MetafileXmlDump dumper(aStream);
     dumper.filterAllActionTypes();
     dumper.filterActionType(META_POLYLINE_ACTION, false);
     dumper.dump(aGDIMetaFile);
 
-    aStream->WriteChar(0);
-    aStream->Seek(STREAM_SEEK_TO_BEGIN);
+    aStream.Seek(STREAM_SEEK_TO_BEGIN);
 
-    xmlDocPtr pDoc = parseXmlStream(aStream.get());
+    xmlDocPtr pDoc = parseXmlStream(&aStream);
 
     CPPUNIT_ASSERT (pDoc);
 
@@ -77,6 +86,61 @@ void WmfTest::testNonPlaceableWmf()
     assertXPath(pDoc, "/metafile/polyline[1]/point[5]", "y", "1003");
 }
 
+void WmfTest::testSine()
+{
+    SvFileStream aFileStream(getFullUrl("sine_wave.emf"), STREAM_READ);
+    GDIMetaFile aGDIMetaFile;
+    ReadWindowMetafile(aFileStream, aGDIMetaFile);
+
+    SvMemoryStream aStream;
+
+    MetafileXmlDump dumper(aStream);
+    dumper.filterAllActionTypes();
+    dumper.filterActionType(META_ISECTRECTCLIPREGION_ACTION, false);
+    dumper.dump(aGDIMetaFile);
+
+    aStream.Seek(STREAM_SEEK_TO_BEGIN);
+
+    xmlDocPtr pDoc = parseXmlStream(&aStream);
+
+    CPPUNIT_ASSERT (pDoc);
+
+    assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "top", "0");
+    assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "left", "0");
+    assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "bottom", "1155947");
+    assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "right", "1155378");
+
+    assertXPath(pDoc, "/metafile/sectrectclipregion[2]", "top", "1411");
+    assertXPath(pDoc, "/metafile/sectrectclipregion[2]", "left", "2962");
+    assertXPath(pDoc, "/metafile/sectrectclipregion[2]", "bottom", "16651");
+    assertXPath(pDoc, "/metafile/sectrectclipregion[2]", "right", "20698");
+}
+
+void WmfTest::testEmfProblem()
+{
+    SvFileStream aFileStream(getFullUrl("computer_mail.emf"), STREAM_READ);
+    GDIMetaFile aGDIMetaFile;
+    ReadWindowMetafile(aFileStream, aGDIMetaFile);
+
+    SvMemoryStream aStream;
+
+    MetafileXmlDump dumper(aStream);
+    dumper.filterAllActionTypes();
+    dumper.filterActionType(META_ISECTRECTCLIPREGION_ACTION, false);
+    dumper.dump(aGDIMetaFile);
+
+    aStream.Seek(STREAM_SEEK_TO_BEGIN);
+
+    xmlDocPtr pDoc = parseXmlStream(&aStream);
+
+    CPPUNIT_ASSERT (pDoc);
+
+    assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "top", "427");
+    assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "left", "740");
+    assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "bottom", "2823");
+    assertXPath(pDoc, "/metafile/sectrectclipregion[1]", "right", "1876");
+}
+
 CPPUNIT_TEST_SUITE_REGISTRATION(WmfTest);
 
 CPPUNIT_PLUGIN_IMPLEMENT();
commit fc83bf8bbf813fff1cb7c0b7925976bc43a49f94
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sun May 18 23:30:39 2014 +0200

    fdo#72590 scale or map only when EMR_EXTSELECTCLIPRGN action
    
    Change-Id: Ie42c855e696922b38760876d4090d572deaa689a

diff --git a/vcl/source/filter/wmf/enhwmf.cxx b/vcl/source/filter/wmf/enhwmf.cxx
index a8858d3..4047093 100644
--- a/vcl/source/filter/wmf/enhwmf.cxx
+++ b/vcl/source/filter/wmf/enhwmf.cxx
@@ -1000,21 +1000,21 @@ bool EnhWMFReader::ReadEnhWMF()
                 case EMR_SELECTCLIPPATH :
                 {
                     sal_Int32 nClippingMode;
-                    pWMF->ReadInt32( nClippingMode );
-                    pOut->SetClipPath( pOut->GetPathObj(), nClippingMode, true );
+                    pWMF->ReadInt32(nClippingMode);
+                    pOut->SetClipPath(pOut->GetPathObj(), nClippingMode, true);
                 }
                 break;
 
                 case EMR_EXTSELECTCLIPRGN :
                 {
-                    sal_Int32 iMode, cbRgnData;
-                    pWMF->ReadInt32( cbRgnData )
-                         .ReadInt32( iMode );
+                    sal_Int32 nClippingMode, cbRgnData;
+                    pWMF->ReadInt32(cbRgnData);
+                    pWMF->ReadInt32(nClippingMode);
 
                     PolyPolygon aPolyPoly;
-                    if ( cbRgnData )
-                        ImplReadRegion( aPolyPoly, *pWMF, nRecSize );
-                    pOut->SetClipPath( aPolyPoly, iMode, true );
+                    if (cbRgnData)
+                        ImplReadRegion(aPolyPoly, *pWMF, nRecSize);
+                    pOut->SetClipPath(aPolyPoly, nClippingMode, false);
                 }
                 break;
 
diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx
index 0a7f8c4..48ba6b1 100644
--- a/vcl/source/filter/wmf/winmtf.cxx
+++ b/vcl/source/filter/wmf/winmtf.cxx
@@ -294,16 +294,13 @@ Color WinMtf::ReadColor()
     return Color( (sal_uInt8)nColor, (sal_uInt8)( nColor >> 8 ), (sal_uInt8)( nColor >> 16 ) );
 };
 
-Point WinMtfOutput::ImplScale( const Point& rPt) // Hack to set varying defaults for incompletely defined files.
+Point WinMtfOutput::ImplScale(const Point& rPoint) // Hack to set varying defaults for incompletely defined files.
 {
-    if (mbIsMapDevSet)
-        return rPt; //fdo#73764
-
-    if (mbIsMapWinSet)
-        return Point(rPt.X() * UNDOCUMENTED_WIN_RCL_RELATION - mrclFrame.Left(),
-                     rPt.Y() * UNDOCUMENTED_WIN_RCL_RELATION - mrclFrame.Top());
-
-    return ImplMap(rPt);
+    if (!mbIsMapDevSet)
+        return Point(rPoint.X() * UNDOCUMENTED_WIN_RCL_RELATION - mrclFrame.Left(),
+                     rPoint.Y() * UNDOCUMENTED_WIN_RCL_RELATION - mrclFrame.Top());
+    else
+        return rPoint;
 }
 
 Point WinMtfOutput::ImplMap( const Point& rPt )
@@ -782,16 +779,16 @@ void WinMtfOutput::MoveClipRegion( const Size& rSize )
 void WinMtfOutput::SetClipPath( const PolyPolygon& rPolyPolygon, sal_Int32 nClippingMode, bool bIsMapped )
 {
     mbClipNeedsUpdate = true;
-    if (bIsMapped)
-    {
-        PolyPolygon aPP( rPolyPolygon );
-        aClipPath.setClipPath( ImplScale( aPP ), nClippingMode );
-    }
-    else
+    PolyPolygon aPolyPolygon(rPolyPolygon);
+
+    if (!bIsMapped)
     {
-        PolyPolygon aPP( rPolyPolygon );
-        aClipPath.setClipPath( ImplMap( aPP ), nClippingMode );
+        if (!mbIsMapDevSet && (mnMapMode == MM_ISOTROPIC || mnMapMode == MM_ANISOTROPIC))
+            aPolyPolygon = ImplScale(aPolyPolygon);
+        else
+            aPolyPolygon = ImplMap(aPolyPolygon);
     }
+    aClipPath.setClipPath(aPolyPolygon, nClippingMode);
 }
 
 WinMtfOutput::WinMtfOutput( GDIMetaFile& rGDIMetaFile ) :
commit 10cd55677c31de0766ae96c2e2a90ee4ef4f0b1c
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sun May 18 12:32:10 2014 +0200

    vcl wmf: EnhWMFReader more cleanup
    
    Change-Id: Ia6bff28bc70214da965c26cd72ea332573576cc1

diff --git a/vcl/source/filter/wmf/enhwmf.cxx b/vcl/source/filter/wmf/enhwmf.cxx
index 2428a59..a8858d3 100644
--- a/vcl/source/filter/wmf/enhwmf.cxx
+++ b/vcl/source/filter/wmf/enhwmf.cxx
@@ -158,36 +158,40 @@ namespace
 
 #ifdef OSL_BIGENDIAN
 // little endian <-> big endian switch
-static float GetSwapFloat( SvStream& rSt )
+static float GetSwapFloat(SvStream& rStream)
 {
-    float   fTmp;
+    float fTmp;
     sal_Int8* pPtr = (sal_Int8*)&fTmp;
-    rSt.ReadSChar( pPtr[3] );
-    rSt.ReadSChar( pPtr[2] );
-    rSt.ReadSChar( pPtr[1] );
-    rSt.ReadSChar( pPtr[0] );
+    rStream.ReadSChar(pPtr[3]);
+    rStream.ReadSChar(pPtr[2]);
+    rStream.ReadSChar(pPtr[1]);
+    rStream.ReadSChar(pPtr[0]);
     return fTmp;
 }
 #endif
 
-struct BLENDFUNCTION{
+struct BLENDFUNCTION
+{
     unsigned char aBlendOperation;
     unsigned char aBlendFlags;
     unsigned char aSrcConstantAlpha;
     unsigned char aAlphaFormat;
 
-    friend SvStream& operator>>( SvStream& rIn, BLENDFUNCTION& rBlendFun );
+    friend SvStream& operator>>(SvStream& rInStream, BLENDFUNCTION& rBlendFun);
 };
 
-SvStream& operator>>( SvStream& rIn, BLENDFUNCTION& rBlendFun )
+SvStream& operator>>(SvStream& rInStream, BLENDFUNCTION& rBlendFun)
 {
-    rIn.ReadUChar( rBlendFun.aBlendOperation ).ReadUChar( rBlendFun.aBlendFlags ).ReadUChar( rBlendFun.aSrcConstantAlpha ).ReadUChar( rBlendFun.aAlphaFormat );
-    return rIn;
+    rInStream.ReadUChar(rBlendFun.aBlendOperation);
+    rInStream.ReadUChar(rBlendFun.aBlendFlags);
+    rInStream.ReadUChar(rBlendFun.aSrcConstantAlpha);
+    rInStream.ReadUChar(rBlendFun.aAlphaFormat);
+    return rInStream;
 }
 
-SvStream& operator>>( SvStream& rIn, XForm& rXForm )
+SvStream& operator>>(SvStream& rInStream, XForm& rXForm)
 {
-    if ( sizeof( float ) != 4 )
+    if (sizeof(float) != 4)
     {
         OSL_FAIL( "EnhWMFReader::sizeof( float ) != 4" );
         rXForm = XForm();
@@ -195,51 +199,59 @@ SvStream& operator>>( SvStream& rIn, XForm& rXForm )
     else
     {
 #ifdef OSL_BIGENDIAN
-    rXForm.eM11 = GetSwapFloat( rIn );
-    rXForm.eM12 = GetSwapFloat( rIn );
-    rXForm.eM21 = GetSwapFloat( rIn );
-    rXForm.eM22 = GetSwapFloat( rIn );
-    rXForm.eDx = GetSwapFloat( rIn );
-    rXForm.eDy = GetSwapFloat( rIn );
+    rXForm.eM11 = GetSwapFloat(rInStream);
+    rXForm.eM12 = GetSwapFloat(rInStream);
+    rXForm.eM21 = GetSwapFloat(rInStream);
+    rXForm.eM22 = GetSwapFloat(rInStream);
+    rXForm.eDx = GetSwapFloat(rInStream);
+    rXForm.eDy = GetSwapFloat(rInStream);
 #else
-    rIn.ReadFloat( rXForm.eM11 ).ReadFloat( rXForm.eM12 ).ReadFloat( rXForm.eM21 ).ReadFloat( rXForm.eM22 )
-           .ReadFloat( rXForm.eDx ).ReadFloat( rXForm.eDy );
+    rInStream.ReadFloat(rXForm.eM11);
+    rInStream.ReadFloat(rXForm.eM12);
+    rInStream.ReadFloat(rXForm.eM21);
+    rInStream.ReadFloat(rXForm.eM22);
+    rInStream.ReadFloat(rXForm.eDx);
+    rInStream.ReadFloat(rXForm.eDy);
 #endif
     }
-    return rIn;
+    return rInStream;
 }
 
-static bool ImplReadRegion( PolyPolygon& rPolyPoly, SvStream& rSt, sal_uInt32 nLen )
+static bool ImplReadRegion( PolyPolygon& rPolyPoly, SvStream& rStream, sal_uInt32 nLen )
 {
-    bool bOk = false;
-    if ( nLen )
+    if (nLen == 0)
+        return false;
+
+    sal_uInt32 nHdSize, nType, nCount, nRgnSize, i;
+    rStream.ReadUInt32(nHdSize);
+    rStream.ReadUInt32(nType);
+    rStream.ReadUInt32(nCount);
+    rStream.ReadUInt32(nRgnSize);
+
+    if (   nCount > 0
+        && nType == RDH_RECTANGLES
+        && nLen >= ((nCount << 4) + (nHdSize - 16)))
     {
-        sal_uInt32 nHdSize, nType, nCount, nRgnSize, i;
-        rSt.ReadUInt32( nHdSize )
-           .ReadUInt32( nType )
-           .ReadUInt32( nCount )
-           .ReadUInt32( nRgnSize );
-
-        if ( nCount && ( nType == RDH_RECTANGLES ) &&
-                ( nLen >= ( ( nCount << 4 ) + ( nHdSize - 16 ) ) ) )
-        {
-            sal_Int32 nx1, ny1, nx2, ny2;
+        sal_Int32 nx1, ny1, nx2, ny2;
 
-            for ( i = 0; i < nCount; i++ )
-            {
-                rSt.ReadInt32( nx1 ).ReadInt32( ny1 ).ReadInt32( nx2 ).ReadInt32( ny2 );
-
-                Rectangle aRect( Point( nx1, ny1 ), Point( nx2, ny2 ) );
-                Polygon aPolygon( aRect );
-                PolyPolygon aPolyPolyOr1( aPolygon );
-                PolyPolygon aPolyPolyOr2( rPolyPoly );
-                rPolyPoly.GetUnion( aPolyPolyOr1, aPolyPolyOr2 );
-                rPolyPoly = aPolyPolyOr2;
-            }
-            bOk = true;
+        for (i = 0; i < nCount; i++)
+        {
+            rStream.ReadInt32(nx1);
+            rStream.ReadInt32(ny1);
+            rStream.ReadInt32(nx2);
+            rStream.ReadInt32(ny2);
+
+            Rectangle aRectangle(Point(nx1, ny1), Point(nx2, ny2));
+
+            Polygon aPolygon(aRectangle);
+            PolyPolygon aPolyPolyOr1(aPolygon);
+            PolyPolygon aPolyPolyOr2(rPolyPoly);
+            rPolyPoly.GetUnion(aPolyPolyOr1, aPolyPolyOr2);
+            rPolyPoly = aPolyPolyOr2;
         }
+        return true;
     }
-    return bOk;
+    return false;
 }
 
 } // anonymous namespace
commit e6c5c854d6304d6a4e1ab0021a403ba95d16c785
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sun May 18 10:35:44 2014 +0200

    vcl wmf: EnhWMFReader constructor, ReadHeader, cleanup
    
    Change-Id: I43b95f3ee7af42b5b1c9110cafbbae325dddb946

diff --git a/vcl/source/filter/wmf/enhwmf.cxx b/vcl/source/filter/wmf/enhwmf.cxx
index 7aa84e2..2428a59 100644
--- a/vcl/source/filter/wmf/enhwmf.cxx
+++ b/vcl/source/filter/wmf/enhwmf.cxx
@@ -153,6 +153,9 @@ using namespace std;
 #define EMR_SETLINKEDUFIS              119
 #define EMR_SETTEXTJUSTIFICATION       120
 
+namespace
+{
+
 #ifdef OSL_BIGENDIAN
 // little endian <-> big endian switch
 static float GetSwapFloat( SvStream& rSt )
@@ -239,6 +242,18 @@ static bool ImplReadRegion( PolyPolygon& rPolyPoly, SvStream& rSt, sal_uInt32 nL
     return bOk;
 }
 
+} // anonymous namespace
+
+EnhWMFReader::EnhWMFReader(SvStream& rStream,GDIMetaFile& rGDIMetaFile,FilterConfigItem* pConfigItem)
+    : WinMtf(new WinMtfOutput(rGDIMetaFile), rStream , pConfigItem)
+    , bRecordPath(false)
+    , nRecordCount(0)
+    , bEMFPlus(false)
+{}
+
+EnhWMFReader::~EnhWMFReader()
+{}
+
 void EnhWMFReader::ReadEMFPlusComment(sal_uInt32 length, bool& bHaveDC)
 {
     if (!bEMFPlus) {
@@ -1489,12 +1504,13 @@ bool EnhWMFReader::ReadHeader()
 {
     sal_uInt32      nType, nSignature, nVersion;
     sal_uInt32      nHeaderSize, nPalEntries;
-    sal_Int32       nLeft, nTop, nRight, nBottom;
 
     // Spare me the METAFILEHEADER here
     // Reading the METAHEADER - EMR_HEADER ([MS-EMF] section 2.3.4.2 EMR_HEADER Record Types)
     pWMF->ReadUInt32( nType ).ReadUInt32( nHeaderSize );
-    if ( nType != 1 ) { // per [MS-EMF] 2.3.4.2 EMF Header Record Types, type MUST be 0x00000001
+    if (nType != 0x00000001)
+    {
+        // per [MS-EMF] 2.3.4.2 EMF Header Record Types, type MUST be 0x00000001
         SAL_WARN("vcl.emf", "EMF header type is not set to 0x00000001 - possibly corrupted file?");
         return false;
     }
@@ -1502,54 +1518,48 @@ bool EnhWMFReader::ReadHeader()
     // Start reading the EMR_HEADER Header object
 
     // bound size (RectL object, see [MS-WMF] section 2.2.2.19)
-    Rectangle rclBounds;    // rectangle in logical units
-    pWMF->ReadInt32( nLeft ).ReadInt32( nTop ).ReadInt32( nRight ).ReadInt32( nBottom );
-    rclBounds.Left() = nLeft;
-    rclBounds.Top() = nTop;
-    rclBounds.Right() = nRight;
-    rclBounds.Bottom() = nBottom;
+    Rectangle rclBounds = ReadRectangle(); // rectangle in logical units
 
     // picture frame size (RectL object)
-    Rectangle rclFrame;     // rectangle in device units 1/100th mm
-    pWMF->ReadInt32( nLeft ).ReadInt32( nTop ).ReadInt32( nRight ).ReadInt32( nBottom );
-    rclFrame.Left() = nLeft;
-    rclFrame.Top() = nTop;
-    rclFrame.Right() = nRight;
-    rclFrame.Bottom() = nBottom;
+    Rectangle rclFrame = ReadRectangle(); // rectangle in device units 1/100th mm
 
     pWMF->ReadUInt32( nSignature );
 
     // nSignature MUST be the ASCII characters "FME", see [WS-EMF] 2.2.9 Header Object
     // and 2.1.14 FormatSignature Enumeration
-    if ( nSignature != 0x464d4520 ) {
+    if (nSignature != 0x464d4520)
+    {
         SAL_WARN("vcl.emf", "EMF\t\tSignature is not 0x464d4520 (\"FME\") - possibly corrupted file?");
         return false;
     }
 
-    pWMF->ReadUInt32( nVersion );  // according to [WS-EMF] 2.2.9, this SHOULD be 0x0001000, however
-                        // Microsoft note that not even Windows checks this...
-    if ( nVersion != 0x00010000 ) {
+    pWMF->ReadUInt32(nVersion);  // according to [WS-EMF] 2.2.9, this SHOULD be 0x0001000, however
+                                   // Microsoft note that not even Windows checks this...
+    if (nVersion != 0x00010000)
+    {
         SAL_WARN("vcl.emf", "EMF\t\tThis really should be 0x00010000, though not absolutely essential...");
     }
 
-    pWMF->ReadUInt32( nEndPos );                                   // size of metafile
+    pWMF->ReadUInt32(nEndPos); // size of metafile
     nEndPos += nStartPos;
 
-    sal_uInt32 nStrmPos = pWMF->Tell();                 // checking if nEndPos is valid
-    pWMF->Seek( STREAM_SEEK_TO_END );
+    sal_uInt32 nStrmPos = pWMF->Tell(); // checking if nEndPos is valid
+    pWMF->Seek(STREAM_SEEK_TO_END);
     sal_uInt32 nActualFileSize = pWMF->Tell();
 
-    if ( nActualFileSize < nEndPos ) {
+    if ( nActualFileSize < nEndPos )
+    {
         SAL_WARN("vcl.emf", "EMF\t\tEMF Header object records number of bytes as " << nEndPos
                             << ", however the file size is actually " << nActualFileSize
                             << " bytes. Possible file corruption?");
         nEndPos = nActualFileSize;
     }
-    pWMF->Seek( nStrmPos );
+    pWMF->Seek(nStrmPos);
 
-    pWMF->ReadInt32( nRecordCount );
+    pWMF->ReadInt32(nRecordCount);
 
-    if ( !nRecordCount ) {
+    if (nRecordCount == 0)
+    {
         SAL_WARN("vcl.emf", "EMF\t\tEMF Header object shows record counter as 0! This shouldn't "
                             "be possible... indicator of possible file corruption?");
         return false;
@@ -1558,16 +1568,17 @@ bool EnhWMFReader::ReadHeader()
     // the number of "handles", or graphics objects used in the metafile
 
     sal_uInt16 nHandlesCount;
-    pWMF->ReadUInt16( nHandlesCount );
+    pWMF->ReadUInt16(nHandlesCount);
 
     // the next 2 bytes are reserved, but according to [MS-EMF] section 2.2.9
     // it MUST be 0x000 and MUST be ignored... the thing is, having such a specific
     // value is actually pretty useful in checking if there is possible corruption
 
     sal_uInt16 nReserved;
-    pWMF->ReadUInt16( nReserved );
+    pWMF->ReadUInt16(nReserved);
 
-    if ( nReserved != 0x0000 ) {
+    if ( nReserved != 0x0000 )
+    {
         SAL_WARN("vcl.emf", "EMF\t\tEMF Header object's reserved field is NOT 0x0000... possible "
                             "corruption?");
     }
@@ -1577,30 +1588,39 @@ bool EnhWMFReader::ReadHeader()
     // metafile description... zero means no description string.
     // For now, we ignore it.
 
-    pWMF->SeekRel( 0x8 );
+    pWMF->SeekRel(0x8);
 
     sal_Int32 nPixX, nPixY, nMillX, nMillY;
-    pWMF->ReadUInt32( nPalEntries ).ReadInt32( nPixX ).ReadInt32( nPixY ).ReadInt32( nMillX ).ReadInt32( nMillY );
-
-    pOut->SetrclFrame( rclFrame );
-    pOut->SetrclBounds( rclBounds );
-    pOut->SetRefPix( Size( nPixX, nPixY ) );
-    pOut->SetRefMill( Size( nMillX, nMillY ) );
-
-    pWMF->Seek( nStartPos + nHeaderSize );
+    pWMF->ReadUInt32(nPalEntries);
+    pWMF->ReadInt32(nPixX);
+    pWMF->ReadInt32(nPixY);
+    pWMF->ReadInt32(nMillX);
+    pWMF->ReadInt32(nMillY);
+
+    pOut->SetrclFrame(rclFrame);
+    pOut->SetrclBounds(rclBounds);
+    pOut->SetRefPix(Size( nPixX, nPixY ) );
+    pOut->SetRefMill(Size( nMillX, nMillY ) );
+
+    pWMF->Seek(nStartPos + nHeaderSize);
     return true;
 }
 
-Rectangle  EnhWMFReader::ReadRectangle( sal_Int32 x1, sal_Int32 y1, sal_Int32 x2, sal_Int32 y2 )
+Rectangle EnhWMFReader::ReadRectangle()
+{
+    sal_Int32 nLeft, nTop, nRight, nBottom;
+    pWMF->ReadInt32(nLeft);
+    pWMF->ReadInt32(nTop);
+    pWMF->ReadInt32(nRight);
+    pWMF->ReadInt32(nBottom);
+    return Rectangle(nLeft, nTop, nRight, nBottom);
+}
+
+Rectangle EnhWMFReader::ReadRectangle( sal_Int32 x1, sal_Int32 y1, sal_Int32 x2, sal_Int32 y2 )
 {
     Point aTL ( Point( x1, y1 ) );
     Point aBR( Point( --x2, --y2 ) );
     return Rectangle( aTL, aBR );
 }
 
-EnhWMFReader::~EnhWMFReader()
-{
-
-};
-
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/source/filter/wmf/winmtf.hxx b/vcl/source/filter/wmf/winmtf.hxx
index a84bbfd..893ed04 100644
--- a/vcl/source/filter/wmf/winmtf.hxx
+++ b/vcl/source/filter/wmf/winmtf.hxx
@@ -800,16 +800,7 @@ class EnhWMFReader : public WinMtf
     Rectangle       ReadRectangle( sal_Int32, sal_Int32, sal_Int32, sal_Int32 );
 
 public:
-    EnhWMFReader(
-        SvStream& rStreamWMF,
-        GDIMetaFile& rGDIMetaFile,
-        FilterConfigItem* pConfigItem = NULL)
-        : WinMtf(new WinMtfOutput(rGDIMetaFile), rStreamWMF , pConfigItem)
-        , bRecordPath(false)
-        , nRecordCount(0)
-        , bEMFPlus(false)
-    {
-    }
+    EnhWMFReader(SvStream& rStreamWMF, GDIMetaFile& rGDIMetaFile, FilterConfigItem* pConfigItem = NULL);
     ~EnhWMFReader();
 
     bool ReadEnhWMF();
@@ -819,6 +810,8 @@ private:
     template <class T> void ReadAndDrawPolyLine();
     template <class T> Polygon ReadPolygon(sal_uInt32 nStartIndex, sal_uInt32 nPoints);
     template <class T, class Drawer> void ReadAndDrawPolygon(Drawer drawer, const bool skipFirst);
+
+    Rectangle ReadRectangle();
 };
 
 class WMFReader : public WinMtf
commit 8ff29fac5262324bfb081171d009d496993001cd
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Sun May 18 10:25:35 2014 +0200

    vcl wmf: cleanup winmtf.hxx
    
    Change-Id: I8d8114378e639438f548b7ee77f8b0ef6275051f

diff --git a/vcl/source/filter/wmf/winmtf.hxx b/vcl/source/filter/wmf/winmtf.hxx
index ede4141..a84bbfd 100644
--- a/vcl/source/filter/wmf/winmtf.hxx
+++ b/vcl/source/filter/wmf/winmtf.hxx
@@ -306,10 +306,18 @@ class WinMtfPathObj : public PolyPolygon
 {
     bool    bClosed;
 
-public :
+public:
+
+    WinMtfPathObj() :
+        bClosed(true)
+    {}
+
+    void        Init()
+    {
+        Clear();
+        bClosed = true;
+    }
 
-                WinMtfPathObj() { bClosed = true; }
-    void        Init() { Clear(); bClosed = true; };
     void        ClosePath();
     void        AddPoint( const Point& rPoint );
     void        AddPolygon( const Polygon& rPoly );
@@ -324,9 +332,9 @@ struct WinMtfFontStyle
     WinMtfFontStyle( LOGFONTW& rLogFont );
 };
 
-// -----------------------------------------------------------------------------
 
-typedef enum {
+typedef enum
+{
     FillStyleSolid,
     FillStylePattern
 } WinMtfFillStyleType;
@@ -342,53 +350,51 @@ struct WinMtfFillStyle
         : aFillColor(Color(COL_BLACK))
         , bTransparent(false)
         , aType(FillStyleSolid)
-    {
-    }
+    {}
 
     WinMtfFillStyle(const Color& rColor, bool bTrans = false)
         : aFillColor(rColor)
         , bTransparent(bTrans)
         , aType(FillStyleSolid)
-    {
-    }
+    {}
 
     WinMtfFillStyle(Bitmap& rBmp)
         : bTransparent(false)
         , aType(FillStylePattern)
         , aBmp(rBmp)
+    {}
+
+    bool operator==( const WinMtfFillStyle& rStyle )
     {
+        return aFillColor == rStyle.aFillColor
+            && bTransparent == rStyle.bTransparent
+            && aType == rStyle.aType;
     }
 
-    bool operator==( const WinMtfFillStyle& rStyle )
-        {
-            return (  ( aFillColor == rStyle.aFillColor )
-                   && ( bTransparent == rStyle.bTransparent )
-                   && ( aType == rStyle.aType )
-                   );
-        }
-    bool operator==( WinMtfFillStyle* pStyle )
-        {
-            return (  ( aFillColor == pStyle->aFillColor )
-                   && ( bTransparent == pStyle->bTransparent )
-                   && ( aType == pStyle->aType )
-                   );
-        }
-    WinMtfFillStyle& operator=( const WinMtfFillStyle& rStyle )
-        {
-            aFillColor = rStyle.aFillColor;
-            bTransparent = rStyle.bTransparent;
-            aBmp = rStyle.aBmp;
-            aType = rStyle.aType;
-            return *this;
-        }
-    WinMtfFillStyle& operator=( WinMtfFillStyle* pStyle )
-        {
-            aFillColor = pStyle->aFillColor;
-            bTransparent = pStyle->bTransparent;
-            aBmp = pStyle->aBmp;
-            aType = pStyle->aType;
-            return *this;
-        }
+    bool operator==(WinMtfFillStyle* pStyle)
+    {
+        return aFillColor == pStyle->aFillColor
+            && bTransparent == pStyle->bTransparent
+            && aType == pStyle->aType;
+    }
+
+    WinMtfFillStyle& operator=(const WinMtfFillStyle& rStyle)
+    {
+        aFillColor = rStyle.aFillColor;
+        bTransparent = rStyle.bTransparent;
+        aBmp = rStyle.aBmp;
+        aType = rStyle.aType;
+        return *this;
+    }
+
+    WinMtfFillStyle& operator=(WinMtfFillStyle* pStyle)
+    {
+        aFillColor = pStyle->aFillColor;
+        bTransparent = pStyle->bTransparent;
+        aBmp = pStyle->aBmp;
+        aType = pStyle->aType;
+        return *this;
+    }
 };
 
 struct WinMtfLineStyle
@@ -397,33 +403,36 @@ struct WinMtfLineStyle
     LineInfo    aLineInfo;
     bool        bTransparent;
 
-    WinMtfLineStyle() :
-        aLineColor  ( COL_BLACK ),
-        bTransparent( false ) {}
+    WinMtfLineStyle()
+        : aLineColor  (COL_BLACK)
+        , bTransparent(false)
+    {}
 
-    WinMtfLineStyle( const Color& rColor, bool bTrans = false ) :
-        aLineColor  ( rColor ),
-        bTransparent( bTrans ) {}
+    WinMtfLineStyle(const Color& rColor, bool bTrans = false)
+        : aLineColor  (rColor)
+        , bTransparent(bTrans)
+    {}
 
-    WinMtfLineStyle( const Color& rColor, const LineInfo& rStyle, bool bTrans = false ) :
-        aLineColor  ( rColor ),
-        aLineInfo   ( rStyle ),
-        bTransparent( bTrans ) {}
+    WinMtfLineStyle( const Color& rColor, const LineInfo& rStyle, bool bTrans = false)
+        : aLineColor  (rColor)
+        , aLineInfo   (rStyle)
+        , bTransparent(bTrans)
+    {}
 
     bool operator==( const WinMtfLineStyle& rStyle )
-        {
-            return (  ( aLineColor == rStyle.aLineColor )
-                   && ( bTransparent == rStyle.bTransparent )
-                   && ( aLineInfo == rStyle.aLineInfo )
-                   );
-        }
-    bool operator==( WinMtfLineStyle* pStyle )
-        {
-            return (  ( aLineColor == pStyle->aLineColor )
-                   && ( bTransparent == pStyle->bTransparent )
-                   && ( aLineInfo == pStyle->aLineInfo )
-                   );
-        }
+    {
+        return aLineColor == rStyle.aLineColor
+            && bTransparent == rStyle.bTransparent
+            && aLineInfo == rStyle.aLineInfo;
+    }
+
+    bool operator==(WinMtfLineStyle* pStyle)
+    {
+        return aLineColor == pStyle->aLineColor
+            && bTransparent == pStyle->bTransparent
+            && aLineInfo == pStyle->aLineInfo;
+    }
+
     WinMtfLineStyle& operator=( const WinMtfLineStyle& rStyle )
     {
         aLineColor = rStyle.aLineColor;
@@ -449,11 +458,15 @@ struct XForm
     float   eM22;
     float   eDx;
     float   eDy;
+
     XForm()
-    {
-        eM11 =  eM22 = 1.0f;
-        eDx = eDy = eM12 = eM21 = 0.0f;
-    }
+        : eM11(1.0f)
+        , eM12(0.0f)
+        , eM21(0.0f)
+        , eM22(1.0f)
+        , eDx(0.0f)
+        , eDy(0.0f)
+    {}
 };
 
 struct SaveStruct
@@ -480,7 +493,7 @@ struct SaveStruct
     bool            bFillStyleSelected;
 };
 
-typedef ::boost::shared_ptr< SaveStruct > SaveStructPtr;
+typedef boost::shared_ptr<SaveStruct> SaveStructPtr;
 
 struct BSaveStruct
 {
@@ -489,22 +502,19 @@ struct BSaveStruct
     sal_uInt32      nWinRop;
     WinMtfFillStyle aStyle;
 
-        BSaveStruct(
-            const Bitmap& rBmp,
-            const Rectangle& rOutRect,
-            sal_uInt32 nRop,
-            WinMtfFillStyle& rStyle
-        )
-            : aBmp( rBmp )
-            , aOutRect( rOutRect )
-            , nWinRop( nRop )
-            , aStyle ( rStyle )
-        {}
+    BSaveStruct(const Bitmap& rBmp, const Rectangle& rOutRect,
+                sal_uInt32 nRop, WinMtfFillStyle& rStyle)
+        : aBmp(rBmp)
+        , aOutRect(rOutRect)
+        , nWinRop(nRop)
+        , aStyle (rStyle)
+    {}
 };
 
 typedef ::std::vector< BSaveStruct* > BSaveStructList_impl;
 
-enum GDIObjectType {
+enum GDIObjectType
+{
     GDI_DUMMY = 0,
     GDI_PEN = 1,
     GDI_BRUSH = 2,
@@ -519,36 +529,45 @@ struct GDIObj
     void*           pStyle;
     GDIObjectType   eType;
 
-    GDIObj() :
-        pStyle  ( NULL ),
-        eType   ( GDI_DUMMY )
+    GDIObj()
+        : pStyle (NULL)
+        , eType  (GDI_DUMMY)
+    {}
+
+    GDIObj(GDIObjectType eT, void* pS)
     {
+        pStyle = pS;
+        eType = eT;
+    }
+
+    void Set(GDIObjectType eT, void* pS)
+    {
+        pStyle = pS;
+        eType = eT;
     }
 
-    GDIObj( GDIObjectType eT, void* pS ) { pStyle = pS; eType = eT; }
-    void Set( GDIObjectType eT, void* pS ) { pStyle = pS; eType = eT; }
     void Delete()
     {
-        if ( pStyle )
+        if (pStyle == NULL)
+            return;
+
+        switch (eType)
         {
-            switch ( eType )
-            {
-                case GDI_PEN :
-                    delete (WinMtfLineStyle*)pStyle;
+            case GDI_PEN :
+                delete (WinMtfLineStyle*)pStyle;
+            break;
+            case GDI_BRUSH :
+                delete (WinMtfFillStyle*)pStyle;
+            break;
+            case GDI_FONT :
+                delete (WinMtfFontStyle*)pStyle;
+            break;
+
+            default:
+                OSL_FAIL( "unsupported style deleted" );
                 break;
-                case GDI_BRUSH :
-                    delete (WinMtfFillStyle*)pStyle;
-                break;
-                case GDI_FONT :
-                    delete (WinMtfFontStyle*)pStyle;
-                break;
-
-                default:
-                    OSL_FAIL( "unsupported style deleted" );
-                    break;
-            }
-            pStyle = NULL;
         }
+        pStyle = NULL;
     }
 
     ~GDIObj()
@@ -793,8 +812,8 @@ public:
     }
     ~EnhWMFReader();
 
-    bool        ReadEnhWMF();
-    void            ReadEMFPlusComment(sal_uInt32 length, bool& bHaveDC);
+    bool ReadEnhWMF();
+    void ReadEMFPlusComment(sal_uInt32 length, bool& bHaveDC);
 private:
     template <class T> void ReadAndDrawPolyPolygon();
     template <class T> void ReadAndDrawPolyLine();
commit 46297bb42129ec778fdf0ad0a1014f5c0c16d170
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.com>
Date:   Fri May 16 17:39:26 2014 +0200

    test: write to stream directly in MetafileXmlDump
    
    Change-Id: If62a29af473f602f89e6e0e4a06772a320a23b9a

diff --git a/test/source/mtfxmldump.cxx b/test/source/mtfxmldump.cxx
index 31f9aba..95bdba4 100644
--- a/test/source/mtfxmldump.cxx
+++ b/test/source/mtfxmldump.cxx
@@ -17,15 +17,17 @@
 namespace
 {
 
-int writeCallback(void* pContext, const char* sBuffer, int nLen)
+int lclWriteCallback(void* pContext, const char* sBuffer, int nLen)
 {
-    OStringBuffer* pBuffer = static_cast<OStringBuffer*>(pContext);
-    pBuffer->append(sBuffer);
+    SvStream* pStream = static_cast<SvStream*>(pContext);
+    pStream->Write(sBuffer, nLen);
     return nLen;
 }
 
-int closeCallback(void* )
+int lclCloseCallback(void* pContext)
 {
+    SvStream* pStream = static_cast<SvStream*>(pContext);
+    pStream->WriteChar(0);
     return 0;
 }
 
@@ -162,8 +164,7 @@ void MetafileXmlDump::dump(GDIMetaFile& rMetaFile)
 {
     std::vector<bool> usedIds(512, false);
 
-    OStringBuffer aString;
-    xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO( writeCallback, closeCallback, &aString, NULL );
+    xmlOutputBufferPtr xmlOutBuffer = xmlOutputBufferCreateIO(lclWriteCallback, lclCloseCallback, &mrStream, NULL);
     xmlTextWriterPtr xmlWriter = xmlNewTextWriter( xmlOutBuffer );
     xmlTextWriterSetIndent( xmlWriter, 1 );
 
@@ -395,8 +396,6 @@ void MetafileXmlDump::dump(GDIMetaFile& rMetaFile)
 
     aWriter.endElement();
     aWriter.endDocument();
-
-    mrStream.WriteOString(aString.makeStringAndClear());
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */


More information about the Libreoffice-commits mailing list