diff options
author | Szymon Kłos <szymon.klos@collabora.com> | 2017-06-19 15:32:16 +0200 |
---|---|---|
committer | Andras Timar <andras.timar@collabora.com> | 2017-06-28 22:38:49 +0200 |
commit | d72e0cadceb0b43928a9b4f18d75c9d5d30afdda (patch) | |
tree | 13a4359e82a473185c5130cda7aa4efbe822955d | |
parent | 91c838a4c9d0d7a8438e2e76a3636dc67a6221bb (diff) |
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 <ci@libreoffice.org>
Reviewed-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r-- | filter/source/msfilter/escherex.cxx | 4 | ||||
-rw-r--r-- | filter/source/msfilter/msdffimp.cxx | 34 | ||||
-rw-r--r-- | include/svx/msdffdef.hxx | 7 | ||||
-rw-r--r-- | sw/qa/extras/ww8export/data/tdf91687.doc | bin | 0 -> 23552 bytes | |||
-rw-r--r-- | sw/qa/extras/ww8export/ww8export2.cxx | 10 | ||||
-rw-r--r-- | sw/source/filter/ww8/wrtw8esh.cxx | 7 |
6 files changed, 56 insertions, 6 deletions
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 Binary files differnew file mode 100644 index 000000000000..d1c1e0a0c381 --- /dev/null +++ b/sw/qa/extras/ww8export/data/tdf91687.doc 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())); } } |