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

Armin Le Grand alg at apache.org
Sat Jun 8 12:38:19 PDT 2013


 vcl/source/filter/wmf/enhwmf.cxx |   11 +++++++++++
 vcl/source/filter/wmf/winmtf.cxx |   10 +++++++---
 vcl/source/filter/wmf/winmtf.hxx |    1 +
 3 files changed, 19 insertions(+), 3 deletions(-)

New commits:
commit 1281c1f52b77c4c4fb08e129542c2c4912b38555
Author: Armin Le Grand <alg at apache.org>
Date:   Mon Dec 10 16:08:58 2012 +0000

    Resolves: #i121382# Corrected size handling including font size handling...
    
    for EMF/WMF imports
    
    (cherry picked from commit 0ce59463f93b1c1fe78d18476249259bfc7e440e)
    
    Conflicts:
    	svtools/source/filter/wmf/enhwmf.cxx
    	svtools/source/filter/wmf/winmtf.cxx
    	svtools/source/filter/wmf/winmtf.hxx
    
    Change-Id: Ib1ea92a1d52ea83ee7ad48a8bda2496cda9dcc53

diff --git a/vcl/source/filter/wmf/enhwmf.cxx b/vcl/source/filter/wmf/enhwmf.cxx
index d024ee3..c97cfdc 100644
--- a/vcl/source/filter/wmf/enhwmf.cxx
+++ b/vcl/source/filter/wmf/enhwmf.cxx
@@ -20,6 +20,7 @@
 
 #include "winmtf.hxx"
 #include <osl/endian.h>
+#include <basegfx/matrix/b2dhommatrix.hxx>
 #include <boost/bind.hpp>
 
 using namespace std;
@@ -1170,6 +1171,16 @@ sal_Bool EnhWMFReader::ReadEnhWMF()
                             lfFaceName[ i ] = nChar;
                         }
                         aLogFont.alfFaceName = OUString( lfFaceName );
+
+                        // #i121382# Need to apply WorldTransform to FontHeight/Width; this should be completely
+                        // changed to basegfx::B2DHomMatrix instead of 'struct XForm', but not now due to time
+                        // constraints and dangers
+                        const XForm& rXF = pOut->GetWorldTransform();
+                        const basegfx::B2DHomMatrix aWT(rXF.eM11, rXF.eM21, rXF.eDx, rXF.eM12, rXF.eM22, rXF.eDy);
+                        const basegfx::B2DVector aTransVec(aWT * basegfx::B2DVector(aLogFont.lfWidth, aLogFont.lfHeight));
+                        aLogFont.lfWidth = aTransVec.getX();
+                        aLogFont.lfHeight = aTransVec.getY();
+
                         pOut->CreateObject( nIndex, GDI_FONT, new WinMtfFontStyle( aLogFont ) );
                     }
                 }
diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx
index 43aaf5e..42d605c 100644
--- a/vcl/source/filter/wmf/winmtf.cxx
+++ b/vcl/source/filter/wmf/winmtf.cxx
@@ -464,8 +464,9 @@ Size WinMtfOutput::ImplMap( const Size& rSz )
 {
     if ( mnWinExtX && mnWinExtY )
     {
-        double fWidth = rSz.Width() * maXForm.eM11;
-        double fHeight = rSz.Height() * maXForm.eM22;
+        // #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;
 
         if ( mnGfxMode == GM_COMPATIBLE )
         {
@@ -1458,7 +1459,10 @@ void WinMtfOutput::DrawText( Point& rPosition, String& rText, sal_Int32* pDXArry
         for( i = 0, nSum = 0; i < nLen; i++ )
         {
             if ( i ) {
-                pDXArry[ i - 1 ] = ImplMap( Size( nSum, 0 ) ).Width();
+                // #i121382# Map DXArray using WorldTransform
+                const Size aSize(ImplMap(Size( nSum, 0)));
+                const basegfx::B2DVector aVector(aSize.Width(), aSize.Height());
+                pDXArry[ i - 1 ] = basegfx::fround(aVector.getLength());
             }
             nSum += pDXArry[ i ];
         }
diff --git a/vcl/source/filter/wmf/winmtf.hxx b/vcl/source/filter/wmf/winmtf.hxx
index bec5d8a..15c36a7 100644
--- a/vcl/source/filter/wmf/winmtf.hxx
+++ b/vcl/source/filter/wmf/winmtf.hxx
@@ -681,6 +681,7 @@ public:
     void                SetMapMode( sal_uInt32 mnMapMode );
     void                SetUnitsPerInch( sal_uInt16 nUnitsPerInch );
     void                SetWorldTransform( const XForm& rXForm );
+    const XForm&        GetWorldTransform() const { return maXForm; }
     void                ModifyWorldTransform( const XForm& rXForm, sal_uInt32 nMode );
 
     void                Push();


More information about the Libreoffice-commits mailing list