diff options
-rw-r--r-- | oox/source/export/drawingml.cxx | 15 | ||||
-rw-r--r-- | sw/qa/extras/ooxmlexport/data/FDO74774.docx | bin | 0 -> 118904 bytes | |||
-rw-r--r-- | sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 15 |
3 files changed, 28 insertions, 2 deletions
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index bdec63d80e1a..d03a0d87c007 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -1812,6 +1812,7 @@ void DrawingML::WritePolyPolygon( const PolyPolygon& rPolyPolygon ) mpFS->endElementNS( XML_a, XML_moveTo ); } + sal_Int32 nCounter = 0 ; for( sal_uInt16 j = 1; j < rPoly.GetSize(); j ++ ) { enum PolyFlags flags = rPoly.GetFlags(j); @@ -1821,7 +1822,10 @@ void DrawingML::WritePolyPolygon( const PolyPolygon& rPolyPolygon ) bBezier = sal_True; } else if( flags == POLY_NORMAL && !bBezier ) + { mpFS->startElementNS( XML_a, XML_lnTo, FSEND ); + ++nCounter ; + } mpFS->singleElementNS( XML_a, XML_pt, XML_x, I64S( rPoly[j].X() - aRect.Left() ), @@ -1835,12 +1839,19 @@ void DrawingML::WritePolyPolygon( const PolyPolygon& rPolyPolygon ) } else if( flags == POLY_NORMAL && !bBezier ) mpFS->endElementNS( XML_a, XML_lnTo ); - else if( bBezier && ( j % 3 ) == 0 ) + + /* ( j % 3 == 0 ) will fail to address the iterations + that have been dedicated to XML_lnTo in case if the + flag is POLY_NORMAL. + Similarly the sequence would go wrong if we do not + make the flag bBezier as false after ending the element. + */ + else if( bBezier && ( ( j - nCounter ) % 3 ) == 0 ) { // //a:cubicBezTo can only contain 3 //a:pt elements, so we // need to break things up... mpFS->endElementNS( XML_a, XML_cubicBezTo ); - mpFS->startElementNS( XML_a, XML_cubicBezTo, FSEND ); + bBezier = sal_False; } } diff --git a/sw/qa/extras/ooxmlexport/data/FDO74774.docx b/sw/qa/extras/ooxmlexport/data/FDO74774.docx Binary files differnew file mode 100644 index 000000000000..11242475fa57 --- /dev/null +++ b/sw/qa/extras/ooxmlexport/data/FDO74774.docx diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 722c45592a59..46d7adfe7ead 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -3200,6 +3200,21 @@ DECLARE_OOXMLEXPORT_TEST(testExtentValue, "fdo74605.docx") #endif +DECLARE_OOXMLEXPORT_TEST( testChildNodesOfCubicBezierTo, "FDO74774.docx") +{ + /* Number of children required by cubicBexTo is 3 of type "pt". + While exporting, sometimes the child nodes are less than 3. + The test case ensures that there are 3 child nodes of type "pt" + for cubicBexTo + */ + xmlDocPtr pXmlDoc = parseExport("word/document.xml"); + if (!pXmlDoc) + return; + + assertXPath( pXmlDoc, + "/w:document/w:body/w:p[2]/w:r[1]/mc:AlternateContent[1]/mc:Choice/w:drawing[1]/wp:inline[1]/a:graphic[1]/a:graphicData[1]/wpg:wgp[1]/wps:wsp[3]/wps:spPr[1]/a:custGeom[1]/a:pathLst[1]/a:path[1]/a:cubicBezTo[2]/a:pt[3]"); +} + CPPUNIT_PLUGIN_IMPLEMENT(); |