filter/source/msfilter/eschesdo.cxx | 16 ++++++++- filter/source/msfilter/eschesdo.hxx | 1 filter/source/msfilter/util.cxx | 1 include/filter/msfilter/escherex.hxx | 6 ++- include/oox/export/vmlexport.hxx | 2 - oox/source/export/vmlexport.cxx | 48 +++++++++++++++++++--------- sw/qa/extras/ooxmlexport/data/fdo69616.docx |binary sw/qa/extras/ooxmlexport/ooxmlexport.cxx | 9 +++++ 8 files changed, 64 insertions(+), 19 deletions(-)
New commits: commit f1ec5dcfca45e9623d3da05503353df63e8dba4f Author: Rohit Deshmukh <rohit.deshm...@synerzip.com> Date: Mon Jan 6 11:26:46 2014 +0530 fdo#69616: Fix for VML part missing for group. Cause: - In altenrate content, Fallback contains only group tag. Implementation: - Added export logic in Vml export. - Added unit test case for vml group. Change-Id: Ia1c9834950528dc892caea1cb675a7f42165d9ba Reviewed-on: https://gerrit.libreoffice.org/7276 Reviewed-by: Miklos Vajna <vmik...@collabora.co.uk> Tested-by: Miklos Vajna <vmik...@collabora.co.uk> diff --git a/filter/source/msfilter/eschesdo.cxx b/filter/source/msfilter/eschesdo.cxx index c5fb193..afddce7 100644 --- a/filter/source/msfilter/eschesdo.cxx +++ b/filter/source/msfilter/eschesdo.cxx @@ -233,7 +233,10 @@ sal_uInt32 ImplEESdrWriter::ImplWriteShape( ImplEESdrObject& rObj, ImplEESdrObject aObj( *this, *(Reference< XShape >*) xXIndexAccess->getByIndex( n ).getValue() ); if( aObj.IsValid() ) + { + aObj.SetOOXML(bOOxmlExport); ImplWriteShape( aObj, rSolverContainer, ePageType, bOOxmlExport ); + } } mpEscherEx->LeaveGroup(); } @@ -686,7 +689,9 @@ sal_uInt32 ImplEESdrWriter::ImplWriteShape( ImplEESdrObject& rObj, ImplFlipBoundingBox( rObj, aPropOpt ); aPropOpt.CreateShapeProperties( rObj.GetShapeRef() ); - mpEscherEx->Commit( aPropOpt, rObj.GetRect() ); + const SdrObject* sdrObj = rObj.GetSdrObject(); + mpEscherEx->AddSdrObjectVMLObject(*sdrObj ); + mpEscherEx->Commit( aPropOpt, rObj.GetRect()); if( mpEscherEx->GetGroupLevel() > 1 ) mpEscherEx->AddChildAnchor( rObj.GetRect() ); @@ -784,7 +789,9 @@ void ImplEESdrWriter::ImplWriteAdditionalText( ImplEESdrObject& rObj, } rObj.SetAngle( nAngle ); aPropOpt.CreateShapeProperties( rObj.GetShapeRef() ); - mpEscherEx->Commit( aPropOpt, rObj.GetRect() ); + const SdrObject* sdrObj = rObj.GetSdrObject(); + mpEscherEx->AddSdrObjectVMLObject(*sdrObj ); + mpEscherEx->Commit( aPropOpt, rObj.GetRect()); // write the childanchor mpEscherEx->AddChildAnchor( rObj.GetRect() ); @@ -1288,4 +1295,9 @@ bool ImplEESdrObject::GetOOXML() const return mbOOXML; } +void ImplEESdrObject::SetOOXML(bool bOOXML) +{ + mbOOXML = bOOXML; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ diff --git a/filter/source/msfilter/eschesdo.hxx b/filter/source/msfilter/eschesdo.hxx index 53f5705..dd78aba 100644 --- a/filter/source/msfilter/eschesdo.hxx +++ b/filter/source/msfilter/eschesdo.hxx @@ -87,6 +87,7 @@ public: sal_uInt32 ImplGetText(); sal_Bool ImplHasText() const; bool GetOOXML() const; + void SetOOXML(bool bOOXML); }; diff --git a/filter/source/msfilter/util.cxx b/filter/source/msfilter/util.cxx index 72e15dd..a2b121c 100644 --- a/filter/source/msfilter/util.cxx +++ b/filter/source/msfilter/util.cxx @@ -1085,6 +1085,7 @@ static const CustomShapeTypeTranslationTable pCustomShapeTypeTranslationTable[] { "ooxml-cloudCallout", "cloudCallout" }, { "ooxml-callout1", "callout1" }, { "ooxml-ribbon", "ribbon" }, + { "ooxml-rect", "rectangle" }, }; static struct { diff --git a/include/filter/msfilter/escherex.hxx b/include/filter/msfilter/escherex.hxx index d69e49d..70a017a 100644 --- a/include/filter/msfilter/escherex.hxx +++ b/include/filter/msfilter/escherex.hxx @@ -1675,7 +1675,7 @@ public: // a ESCHER_Sp is being written ( a ESCHER_DgContainer has to be opened for this purpose!) virtual void AddShape( sal_uInt32 nShpInstance, sal_uInt32 nFlagIds, sal_uInt32 nShapeID = 0 ); - virtual void Commit( EscherPropertyContainer& rProps, const Rectangle& rRect ); + virtual void Commit( EscherPropertyContainer& rProps, const Rectangle& rRect); sal_uInt32 GetColor( const sal_uInt32 nColor, sal_Bool bSwap = sal_True ); sal_uInt32 GetColor( const Color& rColor, sal_Bool bSwap = sal_True ); @@ -1687,6 +1687,10 @@ public: /// returns the ShapeID sal_uInt32 AddSdrObject( const SdrObject& rObj, bool ooxmlExport = false ); + virtual void AddSdrObjectVMLObject( const SdrObject& /*rObj*/) + { + // Required for Exporting VML shape + } /// If objects are written through AddSdrObject the /// SolverContainer has to be written, and maybe some diff --git a/include/oox/export/vmlexport.hxx b/include/oox/export/vmlexport.hxx index bc7bf29..2b414c0 100644 --- a/include/oox/export/vmlexport.hxx +++ b/include/oox/export/vmlexport.hxx @@ -89,6 +89,7 @@ public: sal_uInt32 AddSdrObject( const SdrObject& rObj, sal_Int16 eHOri = -1, sal_Int16 eVOri = -1, sal_Int16 eHRel = -1, sal_Int16 eVRel = -1, const Point* pNdTopLeft = 0, const sal_Bool bOOxmlExport = false ); + virtual void AddSdrObjectVMLObject( const SdrObject& rObj); protected: /// Add an attribute to the generated <v:shape/> element. @@ -109,7 +110,6 @@ protected: /// /// The parameter is just what we got from StartShape(). virtual void EndShape( sal_Int32 nShapeElement ); - virtual void Commit( EscherPropertyContainer& rProps, const Rectangle& rRect ); private: diff --git a/oox/source/export/vmlexport.cxx b/oox/source/export/vmlexport.cxx index 85003b7..0960029 100644 --- a/oox/source/export/vmlexport.cxx +++ b/oox/source/export/vmlexport.cxx @@ -175,7 +175,7 @@ void VMLExport::AddShape( sal_uInt32 nShapeType, sal_uInt32 nShapeFlags, sal_uIn { m_nShapeType = nShapeType; m_nShapeFlags = nShapeFlags; - + m_pShapeAttrList->add( XML_name, ShapeIdString( nShapeId ) ); m_pShapeAttrList->add( XML_id, ShapeIdString( nShapeId ) ); } @@ -322,6 +322,10 @@ inline sal_Int32 impl_GetPointComponent( const sal_uInt8* &pVal, sal_uInt16 nPoi return nRet; } +void VMLExport::AddSdrObjectVMLObject( const SdrObject& rObj) +{ + m_pSdrObject = &rObj; +} void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect ) { if ( m_nShapeType == ESCHER_ShpInst_Nil ) @@ -385,11 +389,11 @@ void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect nTop = it->nPropValue; rProps.GetOpt( ESCHER_Prop_geoLeft, nLeft ); } - - m_pShapeAttrList->add( XML_coordorigin, - OStringBuffer( 20 ).append( sal_Int32( nLeft ) ) - .append( "," ).append( sal_Int32( nTop ) ) - .makeStringAndClear() ); + if(nTop!=0 && nLeft!=0) + m_pShapeAttrList->add( XML_coordorigin, + OStringBuffer( 20 ).append( sal_Int32( nLeft ) ) + .append( "," ).append( sal_Int32( nTop ) ) + .makeStringAndClear() ); } bAlreadyWritten[ ESCHER_Prop_geoLeft ] = true; bAlreadyWritten[ ESCHER_Prop_geoTop ] = true; @@ -414,10 +418,11 @@ void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect rProps.GetOpt( ESCHER_Prop_geoRight, nRight ); } - m_pShapeAttrList->add( XML_coordsize, - OStringBuffer( 20 ).append( sal_Int32( nRight ) - sal_Int32( nLeft ) ) - .append( "," ).append( sal_Int32( nBottom ) - sal_Int32( nTop ) ) - .makeStringAndClear() ); + if(nTop!=0 && nLeft!=0 && nBottom!=0 && nRight!=0 ) + m_pShapeAttrList->add( XML_coordsize, + OStringBuffer( 20 ).append( sal_Int32( nRight ) - sal_Int32( nLeft ) ) + .append( "," ).append( sal_Int32( nBottom ) - sal_Int32( nTop ) ) + .makeStringAndClear() ); } bAlreadyWritten[ ESCHER_Prop_geoRight ] = true; bAlreadyWritten[ ESCHER_Prop_geoBottom ] = true; @@ -451,7 +456,8 @@ void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect { sal_Int32 nX = impl_GetPointComponent( pVerticesIt, nPointSize ); sal_Int32 nY = impl_GetPointComponent( pVerticesIt, nPointSize ); - aPath.append( "m" ).append( nX ).append( "," ).append( nY ); + if (nX >= 0 && nY >= 0 ) + aPath.append( "m" ).append( nX ).append( "," ).append( nY ); } break; case 0xb300: @@ -495,14 +501,15 @@ void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect { sal_Int32 nX = impl_GetPointComponent(pVerticesIt, nPointSize); sal_Int32 nY = impl_GetPointComponent(pVerticesIt, nPointSize); - aPath.append("l").append(nX).append(",").append(nY); + if (nX >= 0 && nY >= 0 ) + aPath.append("l").append(nX).append(",").append(nY); } break; } } - - if ( !aPath.isEmpty() ) - m_pShapeAttrList->add( XML_path, aPath.getStr() ); + OString pathString = aPath.makeStringAndClear(); + if ( !aPath.isEmpty() && pathString != "xe" ) + m_pShapeAttrList->add( XML_path, pathString ); } #if OSL_DEBUG_LEVEL > 0 else @@ -774,6 +781,17 @@ void VMLExport::Commit( EscherPropertyContainer& rProps, const Rectangle& rRect bAlreadyWritten[ESCHER_Prop_fNoLineDrawDash] = true; } break; + case ESCHER_Prop_wzName: + { + SvMemoryStream aStream; + aStream.Write(it->pBuf, it->nPropSize); + aStream.Seek(0); + OUString idStr = SvxMSDffManager::MSDFFReadZString(aStream, it->nPropSize, true); + aStream.Seek(0); + m_pShapeAttrList->add(XML_ID, OUStringToOString(idStr, RTL_TEXTENCODING_UTF8)); + bAlreadyWritten[ESCHER_Prop_wzName] = true; + } + break; default: #if OSL_DEBUG_LEVEL > 0 fprintf( stderr, "TODO VMLExport::Commit(), unimplemented id: %d, value: %" SAL_PRIuUINT32 ", data: [%" SAL_PRIuUINT32 ", %p]\n", diff --git a/sw/qa/extras/ooxmlexport/data/fdo69616.docx b/sw/qa/extras/ooxmlexport/data/fdo69616.docx new file mode 100644 index 0000000..7c7f52e Binary files /dev/null and b/sw/qa/extras/ooxmlexport/data/fdo69616.docx differ diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx index 9ce53cb..7c8fa7ea 100644 --- a/sw/qa/extras/ooxmlexport/ooxmlexport.cxx +++ b/sw/qa/extras/ooxmlexport/ooxmlexport.cxx @@ -2594,6 +2594,15 @@ DECLARE_OOXMLEXPORT_TEST(testFDO73546, "FDO73546.docx") assertXPath(pXmlDoc, "/w:hdr/w:p[1]/w:r[3]/mc:AlternateContent/mc:Choice/w:drawing/wp:anchor", "distL","0"); } +DECLARE_OOXMLEXPORT_TEST(testFdo69616, "fdo69616.docx") +{ + xmlDocPtr pXmlDoc = parseExport(); + if (!pXmlDoc) + return; + // VML + CPPUNIT_ASSERT(getXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r[1]/mc:AlternateContent/mc:Fallback/w:pict/v:group", "coordorigin").match("696,725")); +} + #endif CPPUNIT_PLUGIN_IMPLEMENT(); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits