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

Eilidh McAdam eilidh.mcadam at itomig.de
Mon Feb 9 10:44:24 PST 2015


 vcl/qa/cppunit/wmf/wmfimporttest.cxx |   10 +---------
 vcl/source/filter/wmf/enhwmf.cxx     |   18 ++++++++++++++----
 vcl/source/filter/wmf/winmtf.cxx     |   12 ++++++++++++
 vcl/source/filter/wmf/winmtf.hxx     |    2 ++
 4 files changed, 29 insertions(+), 13 deletions(-)

New commits:
commit 0ca943155c04ee6272bba7ce957b8d87ae9442de
Author: Eilidh McAdam <eilidh.mcadam at itomig.de>
Date:   Fri Dec 12 00:45:11 2014 +0000

    EMF clip regions should be ignored sometimes.
    
    Specifically, the record EMR_EXTSELECTCLIPRGN specifies the default
    clip region if the RegionMode field is set to RGN_COPY.
    See EMF specification section 2.3.2.2 available from
    http://msdn.microsoft.com/en-us/library/cc230624.aspx
    
    A unit test had to be changed for this - instead of checking for
    a specific clip region, it now checks that no clip region is
    specified. This is under the assumption that the default clip
    region for our device context is "show everything" - i.e. no clip.
    
    Note also that RGN_COPY seems to be a common mode value for this
    record type.
    
    Change-Id: I7bd4fe305dda184d121465005fe09d3c113e3063

diff --git a/vcl/qa/cppunit/wmf/wmfimporttest.cxx b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
index f0d192c..6b1cec4 100644
--- a/vcl/qa/cppunit/wmf/wmfimporttest.cxx
+++ b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
@@ -96,15 +96,7 @@ void WmfTest::testSine()
 
     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");
+    assertXPath(pDoc, "/metafile/sectrectclipregion", 0);
 }
 
 void WmfTest::testEmfProblem()
diff --git a/vcl/source/filter/wmf/enhwmf.cxx b/vcl/source/filter/wmf/enhwmf.cxx
index 606a9f3..c314ef6 100644
--- a/vcl/source/filter/wmf/enhwmf.cxx
+++ b/vcl/source/filter/wmf/enhwmf.cxx
@@ -1149,10 +1149,20 @@ bool EnhWMFReader::ReadEnhWMF()
                     pWMF->ReadInt32(cbRgnData);
                     pWMF->ReadInt32(nClippingMode);
 
-                    tools::PolyPolygon aPolyPoly;
-                    if (cbRgnData)
-                        ImplReadRegion(aPolyPoly, *pWMF, nRecSize);
-                    pOut->SetClipPath(aPolyPoly, nClippingMode, false);
+                    // This record's region data should be ignored if mode
+                    // is RGN_COPY - see EMF spec section 2.3.2.2
+                    if (nClippingMode == RGN_COPY)
+                    {
+                        pOut->SetDefaultClipPath();
+                    }
+                    else
+                    {
+                        tools::PolyPolygon aPolyPoly;
+                        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 e15f2e0..8d40354 100644
--- a/vcl/source/filter/wmf/winmtf.cxx
+++ b/vcl/source/filter/wmf/winmtf.cxx
@@ -83,6 +83,12 @@ void WinMtfClipPath::moveClipRegion( const Size& rSize )
     maClip = basegfx::tools::B2DClipState( aCurrClip );
 }
 
+void WinMtfClipPath::setDefaultClipPath()
+{
+    // Empty clip region - everything visible
+    maClip = basegfx::tools::B2DClipState();
+}
+
 basegfx::B2DPolyPolygon WinMtfClipPath::getClipPath() const
 {
     return maClip.getClipPoly();
@@ -797,6 +803,12 @@ void WinMtfOutput::SetClipPath( const tools::PolyPolygon& rPolyPolygon, sal_Int3
     aClipPath.setClipPath(aPolyPolygon, nClippingMode);
 }
 
+void WinMtfOutput::SetDefaultClipPath()
+{
+    mbClipNeedsUpdate = true;
+    aClipPath.setDefaultClipPath();
+}
+
 WinMtfOutput::WinMtfOutput( GDIMetaFile& rGDIMetaFile ) :
     mnLatestTextAlign   ( 0 ),
     mnTextAlign         ( TA_LEFT | TA_TOP | TA_NOUPDATECP ),
diff --git a/vcl/source/filter/wmf/winmtf.hxx b/vcl/source/filter/wmf/winmtf.hxx
index 7d96353..7f7e781 100644
--- a/vcl/source/filter/wmf/winmtf.hxx
+++ b/vcl/source/filter/wmf/winmtf.hxx
@@ -249,6 +249,7 @@ public :
     void        intersectClipRect( const Rectangle& rRect );
     void        excludeClipRect( const Rectangle& rRect );
     void        moveClipRegion( const Size& rSize );
+    void        setDefaultClipPath();
 
     bool        isEmpty() const { return maClip.isCleared(); }
 
@@ -711,6 +712,7 @@ public:
                             sal_Int32 nClippingMode,
                             bool bIsMapped
                         );
+    void                SetDefaultClipPath();
     void                UpdateClipRegion();
     void                AddFromGDIMetaFile( GDIMetaFile& rGDIMetaFile );
 


More information about the Libreoffice-commits mailing list