summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChris Sherlock <chris.sherlock79@gmail.com>2016-03-03 21:52:49 +1100
committerChris Sherlock <chris.sherlock79@gmail.com>2016-03-04 18:23:15 +0000
commit6381d26d73c614681601fda4a49c96e11a0e6f06 (patch)
tree2ef7c86fa0490ef6b3cddb6ebb49e2b29309aba3
parentc788f63726df3340e787bb92477d7ad31e7bc952 (diff)
tdf#79679 vcl: dashed lines show as solid lines when importing EMF files
Issue is a regression in commit 09c722873b2d378d2d155f5f1dd7d8f3fb2012e9. (EMF/WMF: fix rendering of pen styles (dash, dot, dashdot, dashdotdot). I've looked at how the latest version of Word on the Mac works, and it turns out that the spacings for the PenStyle enumerations in the LogPen objects for all the create pen EMF records are as follows: * PS_DOT - ■ □ ■ □ ■ □ ■ □ ■ □ ■ * PS_DASHDOT - ■ ■ ■ □ ■ □ ■ ■ ■ □ ■ * PS_DASHDOTDOT - ■ ■ ■ □ ■ □ ■ □ ■ ■ ■ (where ■ is the actual filled in area, and □ is the space between the filled in areas) In other words, each dash fills in the space of three dots, and there is the one dot worth of empty space between the dashes and dots. Each "dot" has a width and height equal to the width specified in the pen. So basically, we seem to be arbitrarily setting the dot, dash and distance lengths arbitrarily, which were reasonable guesses but tended to produce very odd lines at different zoom levels. Change-Id: Ie8b5fa396e4fb0f480cb3594c8129a59f472c1b8 Reviewed-on: https://gerrit.libreoffice.org/22886 Reviewed-by: Chris Sherlock <chris.sherlock79@gmail.com> Tested-by: Chris Sherlock <chris.sherlock79@gmail.com>
-rw-r--r--vcl/qa/cppunit/wmf/wmfimporttest.cxx24
-rw-r--r--vcl/source/filter/wmf/enhwmf.cxx26
-rw-r--r--vcl/source/filter/wmf/winmtf.cxx12
-rw-r--r--vcl/source/filter/wmf/winwmf.cxx11
4 files changed, 27 insertions, 46 deletions
diff --git a/vcl/qa/cppunit/wmf/wmfimporttest.cxx b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
index 32c4d9019c95..176ff5dda15e 100644
--- a/vcl/qa/cppunit/wmf/wmfimporttest.cxx
+++ b/vcl/qa/cppunit/wmf/wmfimporttest.cxx
@@ -146,38 +146,38 @@ void WmfTest::testEmfLineStyles()
assertXPath(pDoc, "/metafile/linecolor[5]", "color", "#0000ff");
assertXPath(pDoc, "/metafile/line[1]", "style", "dash");
- assertXPath(pDoc, "/metafile/line[1]", "dashlen", "225");
+ assertXPath(pDoc, "/metafile/line[1]", "dashlen", "528");
assertXPath(pDoc, "/metafile/line[1]", "dashcount", "1");
- assertXPath(pDoc, "/metafile/line[1]", "dotlen", "0");
+ assertXPath(pDoc, "/metafile/line[1]", "dotlen", "176");
assertXPath(pDoc, "/metafile/line[1]", "dotcount", "0");
- assertXPath(pDoc, "/metafile/line[1]", "distance", "100");
+ assertXPath(pDoc, "/metafile/line[1]", "distance", "176");
assertXPath(pDoc, "/metafile/line[1]", "join", "miter");
assertXPath(pDoc, "/metafile/line[1]", "cap", "butt");
assertXPath(pDoc, "/metafile/line[2]", "style", "dash");
- assertXPath(pDoc, "/metafile/line[2]", "dashlen", "0");
+ assertXPath(pDoc, "/metafile/line[2]", "dashlen", "528");
assertXPath(pDoc, "/metafile/line[2]", "dashcount", "0");
- assertXPath(pDoc, "/metafile/line[2]", "dotlen", "30");
+ assertXPath(pDoc, "/metafile/line[2]", "dotlen", "176");
assertXPath(pDoc, "/metafile/line[2]", "dotcount", "1");
- assertXPath(pDoc, "/metafile/line[2]", "distance", "50");
+ assertXPath(pDoc, "/metafile/line[2]", "distance", "176");
assertXPath(pDoc, "/metafile/line[2]", "join", "miter");
assertXPath(pDoc, "/metafile/line[2]", "cap", "butt");
assertXPath(pDoc, "/metafile/line[3]", "style", "dash");
- assertXPath(pDoc, "/metafile/line[3]", "dashlen", "150");
+ assertXPath(pDoc, "/metafile/line[3]", "dashlen", "528");
assertXPath(pDoc, "/metafile/line[3]", "dashcount", "1");
- assertXPath(pDoc, "/metafile/line[3]", "dotlen", "30");
+ assertXPath(pDoc, "/metafile/line[3]", "dotlen", "176");
assertXPath(pDoc, "/metafile/line[3]", "dotcount", "1");
- assertXPath(pDoc, "/metafile/line[3]", "distance", "90");
+ assertXPath(pDoc, "/metafile/line[3]", "distance", "176");
assertXPath(pDoc, "/metafile/line[3]", "join", "miter");
assertXPath(pDoc, "/metafile/line[3]", "cap", "butt");
assertXPath(pDoc, "/metafile/line[4]", "style", "dash");
- assertXPath(pDoc, "/metafile/line[4]", "dashlen", "150");
+ assertXPath(pDoc, "/metafile/line[4]", "dashlen", "528");
assertXPath(pDoc, "/metafile/line[4]", "dashcount", "1");
- assertXPath(pDoc, "/metafile/line[4]", "dotlen", "30");
+ assertXPath(pDoc, "/metafile/line[4]", "dotlen", "176");
assertXPath(pDoc, "/metafile/line[4]", "dotcount", "2");
- assertXPath(pDoc, "/metafile/line[4]", "distance", "50");
+ assertXPath(pDoc, "/metafile/line[4]", "distance", "176");
assertXPath(pDoc, "/metafile/line[4]", "join", "miter");
assertXPath(pDoc, "/metafile/line[4]", "cap", "butt");
};
diff --git a/vcl/source/filter/wmf/enhwmf.cxx b/vcl/source/filter/wmf/enhwmf.cxx
index 8c63027e869f..15845a0bd1b3 100644
--- a/vcl/source/filter/wmf/enhwmf.cxx
+++ b/vcl/source/filter/wmf/enhwmf.cxx
@@ -17,10 +17,12 @@
* the License at http://www.apache.org/licenses/LICENSE-2.0 .
*/
-#include "winmtf.hxx"
#include <osl/endian.h>
#include <basegfx/matrix/b2dhommatrix.hxx>
#include <vcl/dibtools.hxx>
+
+#include "winmtf.hxx"
+
#include <memory>
#ifdef DBG_UTIL
@@ -912,37 +914,27 @@ bool EnhWMFReader::ReadEnhWMF()
aLineInfo.SetWidth( aSize.Width() );
bool bTransparent = false;
- switch( nStyle & 0xFF )
+ switch( nStyle & PS_STYLE_MASK )
{
case PS_DASHDOTDOT :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 1 );
aLineInfo.SetDotCount( 2 );
- aLineInfo.SetDashLen( 150 );
- aLineInfo.SetDotLen( 30 );
- aLineInfo.SetDistance( 50 );
break;
case PS_DASHDOT :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 1 );
aLineInfo.SetDotCount( 1 );
- aLineInfo.SetDashLen( 150 );
- aLineInfo.SetDotLen( 30 );
- aLineInfo.SetDistance( 90 );
break;
case PS_DOT :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 0 );
aLineInfo.SetDotCount( 1 );
- aLineInfo.SetDotLen( 30 );
- aLineInfo.SetDistance( 50 );
break;
case PS_DASH :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 1 );
aLineInfo.SetDotCount( 0 );
- aLineInfo.SetDashLen( 225 );
- aLineInfo.SetDistance( 100 );
break;
case PS_NULL :
bTransparent = true;
@@ -1015,31 +1007,21 @@ bool EnhWMFReader::ReadEnhWMF()
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 1 );
aLineInfo.SetDotCount( 2 );
- aLineInfo.SetDashLen( 150 );
- aLineInfo.SetDotLen( 30 );
- aLineInfo.SetDistance( 50 );
break;
case PS_DASHDOT :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 1 );
aLineInfo.SetDotCount( 1 );
- aLineInfo.SetDashLen( 150 );
- aLineInfo.SetDotLen( 30 );
- aLineInfo.SetDistance( 90 );
break;
case PS_DOT :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 0 );
aLineInfo.SetDotCount( 1 );
- aLineInfo.SetDotLen( 30 );
- aLineInfo.SetDistance( 50 );
break;
case PS_DASH :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 1 );
aLineInfo.SetDotCount( 0 );
- aLineInfo.SetDashLen( 225 );
- aLineInfo.SetDistance( 100 );
break;
case PS_NULL :
bTransparent = true;
diff --git a/vcl/source/filter/wmf/winmtf.cxx b/vcl/source/filter/wmf/winmtf.cxx
index 55601721ca5a..c5176296e5df 100644
--- a/vcl/source/filter/wmf/winmtf.cxx
+++ b/vcl/source/filter/wmf/winmtf.cxx
@@ -729,8 +729,16 @@ void WinMtfOutput::CreateObject( sal_Int32 nIndex, GDIObjectType eType, void* pS
{
WinMtfLineStyle* pLineStyle = static_cast<WinMtfLineStyle*>(pStyle);
Size aSize(pLineStyle->aLineInfo.GetWidth(), 0);
- aSize = ImplMap(aSize);
- pLineStyle->aLineInfo.SetWidth(aSize.Width());
+ pLineStyle->aLineInfo.SetWidth( ImplMap(aSize).Width() );
+
+ if ( pLineStyle->aLineInfo.GetStyle() == LINE_DASH )
+ {
+ aSize.Width() += 1;
+ long nDotLen = ImplMap( aSize ).Width();
+ pLineStyle->aLineInfo.SetDistance( nDotLen );
+ pLineStyle->aLineInfo.SetDotLen( nDotLen );
+ pLineStyle->aLineInfo.SetDashLen( nDotLen * 3 );
+ }
}
}
if ( (sal_uInt32)nIndex >= vGDIObj.size() )
diff --git a/vcl/source/filter/wmf/winwmf.cxx b/vcl/source/filter/wmf/winwmf.cxx
index 3ebcadbed7eb..245455d8e4a9 100644
--- a/vcl/source/filter/wmf/winwmf.cxx
+++ b/vcl/source/filter/wmf/winwmf.cxx
@@ -811,37 +811,28 @@ void WMFReader::ReadRecordParams( sal_uInt16 nFunc )
aLineInfo.SetWidth(nWidth);
bool bTransparent = false;
+
switch( nStyle & 0xFF )
{
case PS_DASHDOTDOT :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 1 );
aLineInfo.SetDotCount( 2 );
- aLineInfo.SetDashLen( 150 );
- aLineInfo.SetDotLen( 30 );
- aLineInfo.SetDistance( 50 );
break;
case PS_DASHDOT :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 1 );
aLineInfo.SetDotCount( 1 );
- aLineInfo.SetDashLen( 150 );
- aLineInfo.SetDotLen( 30 );
- aLineInfo.SetDistance( 90 );
break;
case PS_DOT :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 0 );
aLineInfo.SetDotCount( 1 );
- aLineInfo.SetDotLen( 30 );
- aLineInfo.SetDistance( 50 );
break;
case PS_DASH :
aLineInfo.SetStyle( LINE_DASH );
aLineInfo.SetDashCount( 1 );
aLineInfo.SetDotCount( 0 );
- aLineInfo.SetDashLen( 225 );
- aLineInfo.SetDistance( 100 );
break;
case PS_NULL :
bTransparent = true;