filter/source/msfilter/escherex.cxx      |    4 +++
 filter/source/msfilter/msdffimp.cxx      |   34 ++++++++++++++++++++++++++-----
 include/svx/msdffdef.hxx                 |    7 ++++++
 sw/qa/extras/ww8export/data/tdf91687.doc |binary
 sw/qa/extras/ww8export/ww8export2.cxx    |   10 +++++++++
 sw/source/filter/ww8/wrtw8esh.cxx        |    7 +++++-
 6 files changed, 56 insertions(+), 6 deletions(-)

New commits:
commit d72e0cadceb0b43928a9b4f18d75c9d5d30afdda
Author: Szymon Kłos <szymon.k...@collabora.com>
Date:   Mon Jun 19 15:32:16 2017 +0200

    Watermark: tdf#91687 correct size in the .doc
    
    Export:
    * Watermarks saved using Writer were very small in the MSO.
      Export fUsegtextFStretch property in the Geometry Text
      Boolean Properties.
    * tdf#91687: SnapRect contains size of Watermark after rotation.
      We have to export size without rotation.
    
    Import:
    * When import set height depending on used font and width.
      Text will keep the ratio. Remember the padding for export.
    
    * added unit test
    * introduced enum to avoid magic numbers for stretch and best fit
      properties.
    
    Change-Id: I3427afe78488d499f13c543ca401c096161aaf34
    Reviewed-on: https://gerrit.libreoffice.org/38979
    Tested-by: Jenkins <c...@libreoffice.org>
    Reviewed-by: Andras Timar <andras.ti...@collabora.com>

diff --git a/filter/source/msfilter/escherex.cxx 
b/filter/source/msfilter/escherex.cxx
index bf0450fe513b..674da67383c7 100644
--- a/filter/source/msfilter/escherex.cxx
+++ b/filter/source/msfilter/escherex.cxx
@@ -3482,6 +3482,10 @@ void 
EscherPropertyContainer::CreateCustomShapeProperties( const MSO_SPT eShapeT
                             if ( pOutlinerParaObject && 
pOutlinerParaObject->IsVertical() )
                                 nTextPathFlags |= 0x2000;
                         }
+
+                        // Use gtextFStretch for Watermark like MSO does
+                        nTextPathFlags |= use_gtextFStretch | gtextFStretch;
+
                         if ( nTextPathFlags != nTextPathFlagsOrg )
                             AddOpt( DFF_Prop_gtextFStrikethrough, 
nTextPathFlags );
                     }
diff --git a/filter/source/msfilter/msdffimp.cxx 
b/filter/source/msfilter/msdffimp.cxx
index 06b9fc1dde61..148a8977959c 100644
--- a/filter/source/msfilter/msdffimp.cxx
+++ b/filter/source/msfilter/msdffimp.cxx
@@ -4334,7 +4334,8 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                     pRet = new SdrObjCustomShape();
                     pRet->SetModel( pSdrModel );
 
-                    bool bIsFontwork = ( GetPropertyValue( 
DFF_Prop_gtextFStrikethrough, 0 ) & 0x4000 ) != 0;
+                    sal_uInt32 ngtextFStrikethrough = GetPropertyValue( 
DFF_Prop_gtextFStrikethrough, 0 );
+                    bool bIsFontwork = ( ngtextFStrikethrough & 0x4000 ) != 0;
 
                     // in case of a FontWork, the text is set by the escher 
import
                     if ( bIsFontwork )
@@ -4359,16 +4360,16 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
 
                         // SJ: applying fontattributes for Fontwork :
                         if ( IsHardAttribute( DFF_Prop_gtextFItalic ) )
-                            aSet.Put( SvxPostureItem( ( GetPropertyValue( 
DFF_Prop_gtextFStrikethrough, 0 ) & 0x0010 ) != 0 ? ITALIC_NORMAL : 
ITALIC_NONE, EE_CHAR_ITALIC ) );
+                            aSet.Put( SvxPostureItem( ( ngtextFStrikethrough & 
0x0010 ) != 0 ? ITALIC_NORMAL : ITALIC_NONE, EE_CHAR_ITALIC ) );
 
                         if ( IsHardAttribute( DFF_Prop_gtextFBold ) )
-                            aSet.Put( SvxWeightItem( ( GetPropertyValue( 
DFF_Prop_gtextFStrikethrough, 0 ) & 0x0020 ) != 0 ? WEIGHT_BOLD : 
WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
+                            aSet.Put( SvxWeightItem( ( ngtextFStrikethrough & 
0x0020 ) != 0 ? WEIGHT_BOLD : WEIGHT_NORMAL, EE_CHAR_WEIGHT ) );
 
                         // SJ TODO: Vertical Writing is not correct, instead
                         // this should be replaced through "CharacterRotation"
                         // by 90 degrees, therefore a new Item has to be
                         // supported by svx core, api and xml file format
-                        
static_cast<SdrObjCustomShape*>(pRet)->SetVerticalWriting( ( GetPropertyValue( 
DFF_Prop_gtextFStrikethrough, 0 ) & 0x2000 ) != 0 );
+                        
static_cast<SdrObjCustomShape*>(pRet)->SetVerticalWriting( ( 
ngtextFStrikethrough & 0x2000 ) != 0 );
 
                         if ( SeekToContent( DFF_Prop_gtextUNICODE, rSt ) )
                         {
@@ -4403,12 +4404,35 @@ SdrObject* SvxMSDffManager::ImportShape( const 
DffRecordHeader& rHd, SvStream& r
                             if ( nTextWidth != 100 )
                                 aSet.Put( SvxCharScaleWidthItem( 
(sal_uInt16)nTextWidth, EE_CHAR_FONTWIDTH ) );
                         }
-                        if ( GetPropertyValue( DFF_Prop_gtextFStrikethrough, 0 
) & 0x1000 ) // SJ: Font Kerning On ?
+                        if ( ngtextFStrikethrough & 0x1000 ) // SJ: Font 
Kerning On ?
                             aSet.Put( SvxKerningItem( 1, EE_CHAR_KERNING ) );
 
                         // #i119496# the resize autoshape to fit text attr of 
word art in MS PPT is always false
                         aSet.Put(makeSdrTextAutoGrowHeightItem(false));
                         aSet.Put(makeSdrTextAutoGrowWidthItem(false));
+
+                        double fRatio = 0;
+                        OutputDevice* pOut = Application::GetDefaultDevice();
+                        vcl::Font aFont( pOut->GetFont() );
+                        aFont.SetFamilyName( aFontName );
+                        auto nTextWidth = pOut->GetTextWidth( aObjectText );
+
+                        if ( nTextWidth )
+                        {
+                            fRatio = aFont.GetFontSize().Height();
+                            fRatio /= nTextWidth;
+                            sal_Int32 nNewHeight = fRatio * 
aObjData.aBoundRect.getWidth();
+                            sal_Int32 nPaddingY = 
aObjData.aBoundRect.getHeight() - nNewHeight;
+
+                            if ( nPaddingY > 0 )
+                            {
+                                // Remember that value because original size 
have to be exported
+                                aSet.Put( SdrMetricItem( 
SDRATTR_TEXT_UPPERDIST, nPaddingY ) );
+                                aObjData.aBoundRect.setHeight( nNewHeight );
+                            }
+                            else
+                                aSet.Put( SdrMetricItem( 
SDRATTR_TEXT_UPPERDIST, 0 ) );
+                        }
                     }
                     pRet->SetMergedItemSet( aSet );
 
diff --git a/include/svx/msdffdef.hxx b/include/svx/msdffdef.hxx
index 73b9d2c2b095..afabc5ca7c31 100644
--- a/include/svx/msdffdef.hxx
+++ b/include/svx/msdffdef.hxx
@@ -846,6 +846,13 @@ enum MSO_SYSCOLORINDEX {
     mso_colorBParamShift = 16           // To extract the parameter value
 };
 
+enum MSO_TextGeometryProperties {
+    use_gtextFBestFit   = 0x00000100,
+    use_gtextFStretch   = 0x00000400,
+    gtextFBestFit       = 0x01000000,
+    gtextFStretch       = 0x04000000
+};
+
 //ALT_TXT_MSINTEROP
 #define MSPROP_DESCRIPTION_MAX_LEN  4096
 
diff --git a/sw/qa/extras/ww8export/data/tdf91687.doc 
b/sw/qa/extras/ww8export/data/tdf91687.doc
new file mode 100644
index 000000000000..d1c1e0a0c381
Binary files /dev/null and b/sw/qa/extras/ww8export/data/tdf91687.doc differ
diff --git a/sw/qa/extras/ww8export/ww8export2.cxx 
b/sw/qa/extras/ww8export/ww8export2.cxx
index 0412f1f69207..d429d53b0404 100644
--- a/sw/qa/extras/ww8export/ww8export2.cxx
+++ b/sw/qa/extras/ww8export/ww8export2.cxx
@@ -133,6 +133,16 @@ DECLARE_WW8EXPORT_TEST(testTdf108072, "tdf108072.doc")
     CPPUNIT_ASSERT_EQUAL(true, getProperty<bool>(xTableRows->getByIndex(0), 
"IsSplitAllowed"));
 }
 
+DECLARE_WW8EXPORT_TEST(testTdf91687, "tdf91687.doc")
+{
+    // Exported Watermarks were resized
+    uno::Reference<drawing::XShape> xWatermark = getShape(1);
+    uno::Reference<beans::XPropertySet> xWatermarkProperties(xWatermark, 
uno::UNO_QUERY);
+
+    CPPUNIT_ASSERT_EQUAL((sal_Int32)5172, xWatermark->getSize().Height);
+    CPPUNIT_ASSERT_EQUAL((sal_Int32)18105, xWatermark->getSize().Width);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/sw/source/filter/ww8/wrtw8esh.cxx 
b/sw/source/filter/ww8/wrtw8esh.cxx
index 0503f2a97030..2c48a72d04b0 100644
--- a/sw/source/filter/ww8/wrtw8esh.cxx
+++ b/sw/source/filter/ww8/wrtw8esh.cxx
@@ -756,7 +756,12 @@ void PlcDrawObj::WritePlc( WW8Export& rWrt ) const
                 OSL_ENSURE(pObj, "Where is the SDR-Object?");
                 if (pObj)
                 {
-                    aRect = pObj->GetSnapRect();
+                    aRect = pObj->GetLogicRect();
+
+                    // We have to export original size with padding
+                    const SfxItemSet& rSet = pObj->GetMergedItemSet();
+                    const SdrMetricItem* pItem = static_cast<const 
SdrMetricItem*>(rSet.GetItem(SDRATTR_TEXT_UPPERDIST));
+                    aRect.SetSize(Size(aRect.GetWidth(), aRect.GetHeight() + 
pItem->GetValue()));
                 }
             }
 
_______________________________________________
Libreoffice-commits mailing list
libreoffice-comm...@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits

Reply via email to