Kaydet (Commit) 2d3b7a07 authored tarafından Vasily Melenchuk's avatar Vasily Melenchuk Kaydeden (comit) Thorsten Behrens

tdf#100491 fix DOCX import shape line with arrow marker

Line shape with arrow end markers was rendering rather thick
arrow, not connected to main line. Moreover, arrow width should
depend on actual line width.

Change-Id: I8d9a6e7f5d89a1645dcc5939ecc592e86e6fe34f
Reviewed-on: https://gerrit.libreoffice.org/40286Reviewed-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
Tested-by: 's avatarThorsten Behrens <Thorsten.Behrens@CIB.de>
üst 0efd7028
...@@ -205,14 +205,19 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap, ...@@ -205,14 +205,19 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap,
if( !aBuffer.isEmpty() ) if( !aBuffer.isEmpty() )
{ {
bool bIsArrow = nArrowType == XML_arrow;
sal_Int32 nLength = lclGetArrowSize( rArrowProps.moArrowLength.get( XML_med ) ); sal_Int32 nLength = lclGetArrowSize( rArrowProps.moArrowLength.get( XML_med ) );
sal_Int32 nWidth = lclGetArrowSize( rArrowProps.moArrowWidth.get( XML_med ) ); sal_Int32 nWidth = lclGetArrowSize( rArrowProps.moArrowWidth.get( XML_med ) );
sal_Int32 nNameIndex = nWidth * 3 + nLength + 1; sal_Int32 nNameIndex = nWidth * 3 + nLength + 1;
aBuffer.append( ' ' ).append( nNameIndex ); aBuffer.append( ' ' ).append( nNameIndex );
if (bIsArrow)
{
// Arrow marker form depends also on line width
aBuffer.append(' ').append(nLineWidth);
}
OUString aMarkerName = aBuffer.makeStringAndClear(); OUString aMarkerName = aBuffer.makeStringAndClear();
bool bIsArrow = nArrowType == XML_arrow;
double fArrowLength = 1.0; double fArrowLength = 1.0;
switch( nLength ) switch( nLength )
{ {
...@@ -229,7 +234,7 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap, ...@@ -229,7 +234,7 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap,
} }
// set arrow width relative to line width // set arrow width relative to line width
sal_Int32 nBaseLineWidth = ::std::max< sal_Int32 >( nLineWidth, 70 ); sal_Int32 nBaseLineWidth = ::std::max< sal_Int32 >( nLineWidth, 70 );
nMarkerWidth = static_cast< sal_Int32 >( fArrowWidth * nBaseLineWidth ); nMarkerWidth = static_cast<sal_Int32>( fArrowWidth * nBaseLineWidth );
/* Test if the marker already exists in the marker table, do not /* Test if the marker already exists in the marker table, do not
create it again in this case. If markers are inserted explicitly create it again in this case. If markers are inserted explicitly
...@@ -238,7 +243,11 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap, ...@@ -238,7 +243,11 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap,
if( !rPropMap.hasNamedLineMarkerInTable( aMarkerName ) ) if( !rPropMap.hasNamedLineMarkerInTable( aMarkerName ) )
{ {
// pass X and Y as percentage to OOX_ARROW_POINT // pass X and Y as percentage to OOX_ARROW_POINT
#define OOX_ARROW_POINT( x, y ) awt::Point( static_cast< sal_Int32 >( fArrowWidth * x ), static_cast< sal_Int32 >( fArrowLength * y ) ) #define OOX_ARROW_POINT( x, y ) awt::Point( static_cast< sal_Int32 >( fArrowWidth * ( x ) ), static_cast< sal_Int32 >( fArrowLength * ( y ) ) )
// tdf#100491 Arrow line marker, unlike other markers, depends on line width.
// So calculate width of half line (more convinient during drawing) taking into account
// further conversions/scaling done in OOX_ARROW_POINT macro and scaling to nMarkerWidth.
const double fArrowLineHalfWidth = ::std::max< double >( 100.0 * 0.5 * nLineWidth / nMarkerWidth, 1 );
::std::vector< awt::Point > aPoints; ::std::vector< awt::Point > aPoints;
OSL_ASSERT((rArrowProps.moArrowType.get() & sal_Int32(0xFFFF0000))==0); OSL_ASSERT((rArrowProps.moArrowType.get() & sal_Int32(0xFFFF0000))==0);
...@@ -251,13 +260,16 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap, ...@@ -251,13 +260,16 @@ void lclPushMarkerProperties( ShapePropertyMap& rPropMap,
aPoints.push_back( OOX_ARROW_POINT( 50, 0 ) ); aPoints.push_back( OOX_ARROW_POINT( 50, 0 ) );
break; break;
case XML_arrow: case XML_arrow:
aPoints.push_back( OOX_ARROW_POINT( 50, 0 ) ); aPoints.push_back( OOX_ARROW_POINT( 50, 0 ) );
aPoints.push_back( OOX_ARROW_POINT( 100, 91 ) ); aPoints.push_back( OOX_ARROW_POINT( 100, 100 - fArrowLineHalfWidth * 1.5) );
aPoints.push_back( OOX_ARROW_POINT( 85, 100 ) ); aPoints.push_back( OOX_ARROW_POINT( 100 - fArrowLineHalfWidth * 1.5, 100 ) );
aPoints.push_back( OOX_ARROW_POINT( 50, 36 ) ); aPoints.push_back( OOX_ARROW_POINT( 50.0 + fArrowLineHalfWidth, 5.5 * fArrowLineHalfWidth) );
aPoints.push_back( OOX_ARROW_POINT( 15, 100 ) ); aPoints.push_back( OOX_ARROW_POINT( 50.0 + fArrowLineHalfWidth, 100 ) );
aPoints.push_back( OOX_ARROW_POINT( 0, 91 ) ); aPoints.push_back( OOX_ARROW_POINT( 50.0 - fArrowLineHalfWidth, 100 ) );
aPoints.push_back( OOX_ARROW_POINT( 50, 0 ) ); aPoints.push_back( OOX_ARROW_POINT( 50.0 - fArrowLineHalfWidth, 5.5 * fArrowLineHalfWidth) );
aPoints.push_back( OOX_ARROW_POINT( fArrowLineHalfWidth * 1.5, 100 ) );
aPoints.push_back( OOX_ARROW_POINT( 0, 100 - fArrowLineHalfWidth * 1.5) );
aPoints.push_back( OOX_ARROW_POINT( 50, 0 ) );
break; break;
case XML_stealth: case XML_stealth:
aPoints.push_back( OOX_ARROW_POINT( 50, 0 ) ); aPoints.push_back( OOX_ARROW_POINT( 50, 0 ) );
......
...@@ -10,11 +10,14 @@ ...@@ -10,11 +10,14 @@
<LineEnd> <LineEnd>
<pointSequence> <pointSequence>
<point positionX="225" positionY="0" polygonFlags="NORMAL"/> <point positionX="225" positionY="0" polygonFlags="NORMAL"/>
<point positionX="450" positionY="409" polygonFlags="NORMAL"/> <point positionX="450" positionY="422" polygonFlags="NORMAL"/>
<point positionX="382" positionY="450" polygonFlags="NORMAL"/> <point positionX="422" positionY="450" polygonFlags="NORMAL"/>
<point positionX="225" positionY="162" polygonFlags="NORMAL"/> <point positionX="243" positionY="102" polygonFlags="NORMAL"/>
<point positionX="67" positionY="450" polygonFlags="NORMAL"/> <point positionX="243" positionY="450" polygonFlags="NORMAL"/>
<point positionX="0" positionY="409" polygonFlags="NORMAL"/> <point positionX="206" positionY="450" polygonFlags="NORMAL"/>
<point positionX="206" positionY="102" polygonFlags="NORMAL"/>
<point positionX="27" positionY="450" polygonFlags="NORMAL"/>
<point positionX="0" positionY="422" polygonFlags="NORMAL"/>
<point positionX="225" positionY="0" polygonFlags="NORMAL"/> <point positionX="225" positionY="0" polygonFlags="NORMAL"/>
</pointSequence> </pointSequence>
</LineEnd> </LineEnd>
...@@ -70,11 +73,14 @@ ...@@ -70,11 +73,14 @@
<LineEnd> <LineEnd>
<pointSequence> <pointSequence>
<point positionX="225" positionY="0" polygonFlags="NORMAL"/> <point positionX="225" positionY="0" polygonFlags="NORMAL"/>
<point positionX="450" positionY="409" polygonFlags="NORMAL"/> <point positionX="450" positionY="422" polygonFlags="NORMAL"/>
<point positionX="382" positionY="450" polygonFlags="NORMAL"/> <point positionX="422" positionY="450" polygonFlags="NORMAL"/>
<point positionX="225" positionY="162" polygonFlags="NORMAL"/> <point positionX="243" positionY="102" polygonFlags="NORMAL"/>
<point positionX="67" positionY="450" polygonFlags="NORMAL"/> <point positionX="243" positionY="450" polygonFlags="NORMAL"/>
<point positionX="0" positionY="409" polygonFlags="NORMAL"/> <point positionX="206" positionY="450" polygonFlags="NORMAL"/>
<point positionX="206" positionY="102" polygonFlags="NORMAL"/>
<point positionX="27" positionY="450" polygonFlags="NORMAL"/>
<point positionX="0" positionY="422" polygonFlags="NORMAL"/>
<point positionX="225" positionY="0" polygonFlags="NORMAL"/> <point positionX="225" positionY="0" polygonFlags="NORMAL"/>
</pointSequence> </pointSequence>
</LineEnd> </LineEnd>
...@@ -130,11 +136,14 @@ ...@@ -130,11 +136,14 @@
<LineEnd> <LineEnd>
<pointSequence> <pointSequence>
<point positionX="225" positionY="0" polygonFlags="NORMAL"/> <point positionX="225" positionY="0" polygonFlags="NORMAL"/>
<point positionX="450" positionY="409" polygonFlags="NORMAL"/> <point positionX="450" positionY="422" polygonFlags="NORMAL"/>
<point positionX="382" positionY="450" polygonFlags="NORMAL"/> <point positionX="422" positionY="450" polygonFlags="NORMAL"/>
<point positionX="225" positionY="162" polygonFlags="NORMAL"/> <point positionX="243" positionY="102" polygonFlags="NORMAL"/>
<point positionX="67" positionY="450" polygonFlags="NORMAL"/> <point positionX="243" positionY="450" polygonFlags="NORMAL"/>
<point positionX="0" positionY="409" polygonFlags="NORMAL"/> <point positionX="206" positionY="450" polygonFlags="NORMAL"/>
<point positionX="206" positionY="102" polygonFlags="NORMAL"/>
<point positionX="27" positionY="450" polygonFlags="NORMAL"/>
<point positionX="0" positionY="422" polygonFlags="NORMAL"/>
<point positionX="225" positionY="0" polygonFlags="NORMAL"/> <point positionX="225" positionY="0" polygonFlags="NORMAL"/>
</pointSequence> </pointSequence>
</LineEnd> </LineEnd>
...@@ -190,11 +199,14 @@ ...@@ -190,11 +199,14 @@
<LineEnd> <LineEnd>
<pointSequence> <pointSequence>
<point positionX="225" positionY="0" polygonFlags="NORMAL"/> <point positionX="225" positionY="0" polygonFlags="NORMAL"/>
<point positionX="450" positionY="409" polygonFlags="NORMAL"/> <point positionX="450" positionY="422" polygonFlags="NORMAL"/>
<point positionX="382" positionY="450" polygonFlags="NORMAL"/> <point positionX="422" positionY="450" polygonFlags="NORMAL"/>
<point positionX="225" positionY="162" polygonFlags="NORMAL"/> <point positionX="243" positionY="102" polygonFlags="NORMAL"/>
<point positionX="67" positionY="450" polygonFlags="NORMAL"/> <point positionX="243" positionY="450" polygonFlags="NORMAL"/>
<point positionX="0" positionY="409" polygonFlags="NORMAL"/> <point positionX="206" positionY="450" polygonFlags="NORMAL"/>
<point positionX="206" positionY="102" polygonFlags="NORMAL"/>
<point positionX="27" positionY="450" polygonFlags="NORMAL"/>
<point positionX="0" positionY="422" polygonFlags="NORMAL"/>
<point positionX="225" positionY="0" polygonFlags="NORMAL"/> <point positionX="225" positionY="0" polygonFlags="NORMAL"/>
</pointSequence> </pointSequence>
</LineEnd> </LineEnd>
......
This diff is collapsed.
...@@ -283,6 +283,7 @@ void SdImportTest::testDocumentLayout() ...@@ -283,6 +283,7 @@ void SdImportTest::testDocumentLayout()
{ "tdf90403.pptx", "xml/tdf90403_", PPTX, -1 }, { "tdf90403.pptx", "xml/tdf90403_", PPTX, -1 },
{ "tdf90338.odp", "xml/tdf90338_", ODP, PPTX }, { "tdf90338.odp", "xml/tdf90338_", ODP, PPTX },
{ "tdf92001.odp", "xml/tdf92001_", ODP, PPTX }, { "tdf92001.odp", "xml/tdf92001_", ODP, PPTX },
{ "tdf100491.pptx", "xml/tdf100491_", PPTX, -1 },
// { "pptx/n828390.pptx", "pptx/xml/n828390_", PPTX, PPTX }, // Example // { "pptx/n828390.pptx", "pptx/xml/n828390_", PPTX, PPTX }, // Example
}; };
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment