EMF/WMF: fix rendering of pen styles (dash, dot, dashdot, dashdotdot)
Change-Id: I226bac370601b75f2589f7a7c5e8830746b31e2e
This commit is contained in:
@@ -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 ) );
|
||||
}
|
||||
}
|
||||
|
@@ -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() )
|
||||
|
@@ -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;
|
||||
|
Reference in New Issue
Block a user