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 2d15308..6ee6544 100644
--- a/vcl/source/filter/wmf/enhwmf.cxx
+++ b/vcl/source/filter/wmf/enhwmf.cxx
@@ -730,19 +730,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;
@@ -779,12 +797,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 1b204c5..78530a7 100644
--- a/vcl/source/filter/wmf/winmtf.cxx
+++ b/vcl/source/filter/wmf/winmtf.cxx
@@ -713,14 +713,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;
@@ -749,14 +741,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 3a10fb2..378dc3c 100644
--- a/vcl/source/filter/wmf/winwmf.cxx
+++ b/vcl/source/filter/wmf/winwmf.cxx
@@ -749,19 +749,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;
@@ -798,12 +816,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;