vcl/source/filter/wmf/enhwmf.cxx | 60 +++++++++++++++++++++++++++++++-------- vcl/source/filter/wmf/winmtf.cxx | 16 ---------- vcl/source/filter/wmf/winwmf.cxx | 60 +++++++++++++++++++++++++++++++-------- 3 files changed, 98 insertions(+), 38 deletions(-)
New commits: commit 10117d6121f3785bff11111443489ba87935a684 Author: Andras Timar <andras.ti...@collabora.com> Date: Sun Jan 19 15:12:15 2014 +0100 EMF/WMF: fix rendering of pen styles (dash, dot, dashdot, dashdotdot) Change-Id: I226bac370601b75f2589f7a7c5e8830746b31e2e diff --git a/vcl/source/filter/wmf/enhwmf.cxx b/vcl/source/filter/wmf/enhwmf.cxx index 813e1e6..5757fb8 100644 --- a/vcl/source/filter/wmf/enhwmf.cxx +++ b/vcl/source/filter/wmf/enhwmf.cxx @@ -728,19 +728,37 @@ sal_Bool EnhWMFReader::ReadEnhWMF() aLineInfo.SetWidth( aSize.Width() ); sal_Bool bTransparent = sal_False; - sal_uInt16 nDashCount = 0; - sal_uInt16 nDotCount = 0; switch( nStyle & 0xFF ) { case PS_DASHDOTDOT : - nDotCount++; + aLineInfo.SetStyle( LINE_DASH ); + aLineInfo.SetDashCount( 1 ); + aLineInfo.SetDotCount( 2 ); + aLineInfo.SetDashLen( 150 ); + aLineInfo.SetDotLen( 30 ); + aLineInfo.SetDistance( 50 ); + break; case PS_DASHDOT : - nDashCount++; + aLineInfo.SetStyle( LINE_DASH ); + aLineInfo.SetDashCount( 1 ); + aLineInfo.SetDotCount( 1 ); + aLineInfo.SetDashLen( 150 ); + aLineInfo.SetDotLen( 30 ); + aLineInfo.SetDistance( 90 ); + break; case PS_DOT : - nDotCount++; + aLineInfo.SetStyle( LINE_DASH ); + aLineInfo.SetDashCount( 0 ); + aLineInfo.SetDotCount( 1 ); + aLineInfo.SetDotLen( 30 ); + aLineInfo.SetDistance( 50 ); break; case PS_DASH : - nDashCount++; + aLineInfo.SetStyle( LINE_DASH ); + aLineInfo.SetDashCount( 1 ); + aLineInfo.SetDotCount( 0 ); + aLineInfo.SetDashLen( 225 ); + aLineInfo.SetDistance( 100 ); break; case PS_NULL : bTransparent = sal_True; @@ -777,12 +795,6 @@ sal_Bool EnhWMFReader::ReadEnhWMF() default : aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_NONE ); } - if ( nDashCount | nDotCount ) - { - aLineInfo.SetStyle( LINE_DASH ); - aLineInfo.SetDashCount( nDashCount ); - aLineInfo.SetDotCount( nDotCount ); - } pOut->CreateObject( nIndex, GDI_PEN, new WinMtfLineStyle( ReadColor(), aLineInfo, bTransparent ) ); } } diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx index 9c14fd8..e5085f6 100644 --- a/vcl/source/filter/wmf/winmtf.cxx +++ b/vcl/source/filter/wmf/winmtf.cxx @@ -747,14 +747,6 @@ void WinMtfOutput::CreateObject( GDIObjectType eType, void* pStyle ) { Size aSize( ((WinMtfLineStyle*)pStyle)->aLineInfo.GetWidth(), 0 ); ((WinMtfLineStyle*)pStyle)->aLineInfo.SetWidth( ImplMap( aSize ).Width() ); - if ( ((WinMtfLineStyle*)pStyle)->aLineInfo.GetStyle() == LINE_DASH ) - { - aSize.Width() += 1; - long nDotLen = ImplMap( aSize ).Width(); - ((WinMtfLineStyle*)pStyle)->aLineInfo.SetDistance( nDotLen ); - ((WinMtfLineStyle*)pStyle)->aLineInfo.SetDotLen( nDotLen ); - ((WinMtfLineStyle*)pStyle)->aLineInfo.SetDashLen( nDotLen * 4 ); - } } } sal_uInt32 nIndex; @@ -783,14 +775,6 @@ void WinMtfOutput::CreateObject( sal_Int32 nIndex, GDIObjectType eType, void* pS { Size aSize( ((WinMtfLineStyle*)pStyle)->aLineInfo.GetWidth(), 0 ); ((WinMtfLineStyle*)pStyle)->aLineInfo.SetWidth( ImplMap( aSize ).Width() ); - if ( ((WinMtfLineStyle*)pStyle)->aLineInfo.GetStyle() == LINE_DASH ) - { - aSize.Width() += 1; - long nDotLen = ImplMap( aSize ).Width(); - ((WinMtfLineStyle*)pStyle)->aLineInfo.SetDistance( nDotLen ); - ((WinMtfLineStyle*)pStyle)->aLineInfo.SetDotLen( nDotLen ); - ((WinMtfLineStyle*)pStyle)->aLineInfo.SetDashLen( nDotLen * 4 ); - } } } if ( (sal_uInt32)nIndex >= vGDIObj.size() ) diff --git a/vcl/source/filter/wmf/winwmf.cxx b/vcl/source/filter/wmf/winwmf.cxx index bef489f..7c5456c 100644 --- a/vcl/source/filter/wmf/winwmf.cxx +++ b/vcl/source/filter/wmf/winwmf.cxx @@ -748,19 +748,37 @@ void WMFReader::ReadRecordParams( sal_uInt16 nFunc ) aLineInfo.SetWidth( nWidth ); sal_Bool bTransparent = sal_False; - sal_uInt16 nDashCount = 0; - sal_uInt16 nDotCount = 0; switch( nStyle & 0xFF ) { case PS_DASHDOTDOT : - nDotCount++; + aLineInfo.SetStyle( LINE_DASH ); + aLineInfo.SetDashCount( 1 ); + aLineInfo.SetDotCount( 2 ); + aLineInfo.SetDashLen( 150 ); + aLineInfo.SetDotLen( 30 ); + aLineInfo.SetDistance( 50 ); + break; case PS_DASHDOT : - nDashCount++; + aLineInfo.SetStyle( LINE_DASH ); + aLineInfo.SetDashCount( 1 ); + aLineInfo.SetDotCount( 1 ); + aLineInfo.SetDashLen( 150 ); + aLineInfo.SetDotLen( 30 ); + aLineInfo.SetDistance( 90 ); + break; case PS_DOT : - nDotCount++; + aLineInfo.SetStyle( LINE_DASH ); + aLineInfo.SetDashCount( 0 ); + aLineInfo.SetDotCount( 1 ); + aLineInfo.SetDotLen( 30 ); + aLineInfo.SetDistance( 50 ); break; case PS_DASH : - nDashCount++; + aLineInfo.SetStyle( LINE_DASH ); + aLineInfo.SetDashCount( 1 ); + aLineInfo.SetDotCount( 0 ); + aLineInfo.SetDashLen( 225 ); + aLineInfo.SetDistance( 100 ); break; case PS_NULL : bTransparent = sal_True; @@ -797,12 +815,6 @@ void WMFReader::ReadRecordParams( sal_uInt16 nFunc ) default : aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_NONE ); } - if ( nDashCount | nDotCount ) - { - aLineInfo.SetStyle( LINE_DASH ); - aLineInfo.SetDashCount( nDashCount ); - aLineInfo.SetDotCount( nDotCount ); - } pOut->CreateObject( GDI_PEN, new WinMtfLineStyle( ReadColor(), aLineInfo, bTransparent ) ); } break; commit e0feba8b05d4bf6a93ca1b250af2e08afbd5e680 Author: Andras Timar <andras.ti...@collabora.com> Date: Mon Jan 6 19:23:01 2014 +0100 EMF/WMF: parse line cap and line join Change-Id: I081ae9c24e48912631dcfe4aba8a06ff2680aaf5 diff --git a/vcl/source/filter/wmf/enhwmf.cxx b/vcl/source/filter/wmf/enhwmf.cxx index de8b780..813e1e6 100644 --- a/vcl/source/filter/wmf/enhwmf.cxx +++ b/vcl/source/filter/wmf/enhwmf.cxx @@ -730,7 +730,7 @@ sal_Bool EnhWMFReader::ReadEnhWMF() sal_Bool bTransparent = sal_False; sal_uInt16 nDashCount = 0; sal_uInt16 nDotCount = 0; - switch( nStyle ) + switch( nStyle & 0xFF ) { case PS_DASHDOTDOT : nDotCount++; @@ -751,6 +751,32 @@ sal_Bool EnhWMFReader::ReadEnhWMF() case PS_SOLID : aLineInfo.SetStyle( LINE_SOLID ); } + switch( nStyle & 0xF00 ) + { + case PS_ENDCAP_ROUND : + aLineInfo.SetLineCap( com::sun::star::drawing::LineCap_ROUND ); + break; + case PS_ENDCAP_SQUARE : + aLineInfo.SetLineCap( com::sun::star::drawing::LineCap_SQUARE ); + break; + case PS_ENDCAP_FLAT : + default : + aLineInfo.SetLineCap( com::sun::star::drawing::LineCap_BUTT ); + } + switch( nStyle & 0xF000 ) + { + case PS_JOIN_ROUND : + aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_ROUND ); + break; + case PS_JOIN_MITER : + aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_MITER ); + break; + case PS_JOIN_BEVEL : + aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_BEVEL ); + break; + default : + aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_NONE ); + } if ( nDashCount | nDotCount ) { aLineInfo.SetStyle( LINE_DASH ); diff --git a/vcl/source/filter/wmf/winwmf.cxx b/vcl/source/filter/wmf/winwmf.cxx index 6c5093d..bef489f 100644 --- a/vcl/source/filter/wmf/winwmf.cxx +++ b/vcl/source/filter/wmf/winwmf.cxx @@ -750,7 +750,7 @@ void WMFReader::ReadRecordParams( sal_uInt16 nFunc ) sal_Bool bTransparent = sal_False; sal_uInt16 nDashCount = 0; sal_uInt16 nDotCount = 0; - switch( nStyle ) + switch( nStyle & 0xFF ) { case PS_DASHDOTDOT : nDotCount++; @@ -771,6 +771,32 @@ void WMFReader::ReadRecordParams( sal_uInt16 nFunc ) case PS_SOLID : aLineInfo.SetStyle( LINE_SOLID ); } + switch( nStyle & 0xF00 ) + { + case PS_ENDCAP_ROUND : + aLineInfo.SetLineCap( com::sun::star::drawing::LineCap_ROUND ); + break; + case PS_ENDCAP_SQUARE : + aLineInfo.SetLineCap( com::sun::star::drawing::LineCap_SQUARE ); + break; + case PS_ENDCAP_FLAT : + default : + aLineInfo.SetLineCap( com::sun::star::drawing::LineCap_BUTT ); + } + switch( nStyle & 0xF000 ) + { + case PS_JOIN_ROUND : + aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_ROUND ); + break; + case PS_JOIN_MITER : + aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_MITER ); + break; + case PS_JOIN_BEVEL : + aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_BEVEL ); + break; + default : + aLineInfo.SetLineJoin ( basegfx::B2DLINEJOIN_NONE ); + } if ( nDashCount | nDotCount ) { aLineInfo.SetStyle( LINE_DASH ); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits