diff options
author | Michael Stahl <mstahl@redhat.com> | 2016-01-15 15:26:43 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@collabora.co.uk> | 2016-01-21 08:13:49 +0000 |
commit | 68d351fff469d0ab75f817a4e217194735258da8 (patch) | |
tree | f09be82d59b855a7904536ac0fbd38189639fa0a | |
parent | acc3d942e1db108ebca3e9e0c086ab361acc3695 (diff) |
oox: export Math objects to PPTX files
These hit the assert in lcl_StoreOwnAsOOXML now so better implement some
export.
(cherry picked from commit cb890ae43bacd2be24bc74fad2e2e5cce8910995)
ugh, forgot to git add the test document
(cherry picked from commit fc4fba0c77c849cf19d9c0e1b9270b745db60b89)
Change-Id: I10c005a547e8a85f2a82198a49f9a03fc46a61d7
Reviewed-on: https://gerrit.libreoffice.org/21495
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Miklos Vajna <vmiklos@collabora.co.uk>
-rw-r--r-- | include/oox/export/shapes.hxx | 1 | ||||
-rw-r--r-- | oox/source/export/shapes.cxx | 67 | ||||
-rw-r--r-- | sd/qa/unit/data/odp/math.odp | bin | 0 -> 12269 bytes | |||
-rw-r--r-- | sd/qa/unit/export-tests.cxx | 28 |
4 files changed, 93 insertions, 3 deletions
diff --git a/include/oox/export/shapes.hxx b/include/oox/export/shapes.hxx index 29f597f4a3e6..ab67def8d5e1 100644 --- a/include/oox/export/shapes.hxx +++ b/include/oox/export/shapes.hxx @@ -180,6 +180,7 @@ public: WriteTextShape( css::uno::Reference< css::drawing::XShape > xShape ); ShapeExport& WriteTableShape( css::uno::Reference< css::drawing::XShape > xShape ); + void WriteMathShape(css::uno::Reference<css::drawing::XShape> const& xShape); ShapeExport& WriteOLE2Shape( css::uno::Reference< css::drawing::XShape > xShape ); virtual ShapeExport& diff --git a/oox/source/export/shapes.cxx b/oox/source/export/shapes.cxx index 7558feb4d5e3..c3b8b8e9353e 100644 --- a/oox/source/export/shapes.cxx +++ b/oox/source/export/shapes.cxx @@ -93,6 +93,7 @@ #include <editeng/svxenum.hxx> #include <svx/unoapi.hxx> #include <oox/export/chartexport.hxx> +#include <oox/mathml/export.hxx> using namespace ::css; using namespace ::css::beans; @@ -1579,13 +1580,64 @@ ShapeExport& ShapeExport::WriteTextShape( Reference< XShape > xShape ) return *this; } +void ShapeExport::WriteMathShape(Reference<XShape> const& xShape) +{ + Reference<XPropertySet> const xPropSet(xShape, UNO_QUERY); + assert(xPropSet.is()); + Reference<XModel> xMathModel; + xPropSet->getPropertyValue("Model") >>= xMathModel; + assert(xMathModel.is()); + assert(GetDocumentType() != DOCUMENT_DOCX); // should be written in DocxAttributeOutput + SAL_WARN_IF(GetDocumentType() == DOCUMENT_XLSX, "oox", "Math export to XLSX isn't tested, should it happen here?"); + + // ECMA standard does not actually allow oMath outside of + // WordProcessingML so write a MCE like PPT 2010 does + mpFS->startElementNS(XML_mc, XML_AlternateContent, FSEND); + mpFS->startElementNS(XML_mc, XML_Choice, + FSNS(XML_xmlns, XML_a14), "http://schemas.microsoft.com/office/drawing/2010/main", + XML_Requires, "a14", + FSEND); + mpFS->startElementNS(mnXmlNamespace, XML_sp, FSEND); + mpFS->startElementNS(mnXmlNamespace, XML_nvSpPr, FSEND); + mpFS->singleElementNS(mnXmlNamespace, XML_cNvPr, + XML_id, OString::number(GetNewShapeID(xShape)).getStr(), + XML_name, OString("Formula " + OString::number(mnShapeIdMax++)).getStr(), + FSEND); + mpFS->singleElementNS(mnXmlNamespace, XML_cNvSpPr, XML_txBox, "1", FSEND); + mpFS->singleElementNS(mnXmlNamespace, XML_nvPr, FSEND); + mpFS->endElementNS(mnXmlNamespace, XML_nvSpPr); + mpFS->startElementNS(mnXmlNamespace, XML_spPr, FSEND); + WriteShapeTransformation(xShape, XML_a); + WritePresetShape("rect"); + mpFS->endElementNS(mnXmlNamespace, XML_spPr); + mpFS->startElementNS(mnXmlNamespace, XML_txBody, FSEND); + mpFS->startElementNS(XML_a, XML_bodyPr, FSEND); + mpFS->endElementNS(XML_a, XML_bodyPr); + mpFS->startElementNS(XML_a, XML_p, FSEND); + mpFS->startElementNS(XML_a14, XML_m, FSEND); + + oox::FormulaExportBase *const pMagic(dynamic_cast<oox::FormulaExportBase*>(xMathModel.get())); + assert(pMagic); + pMagic->writeFormulaOoxml(GetFS(), GetFB()->getVersion(), GetDocumentType()); + + mpFS->endElementNS(XML_a14, XML_m); + mpFS->endElementNS(XML_a, XML_p); + mpFS->endElementNS(mnXmlNamespace, XML_txBody); + mpFS->endElementNS(mnXmlNamespace, XML_sp); + mpFS->endElementNS(XML_mc, XML_Choice); + mpFS->startElementNS(XML_mc, XML_Fallback, FSEND); + // TODO: export bitmap shape as fallback + mpFS->endElementNS(XML_mc, XML_Fallback); + mpFS->endElementNS(XML_mc, XML_AlternateContent); +} + ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) { Reference< XPropertySet > xPropSet( xShape, UNO_QUERY ); if (!xPropSet.is()) return *this; - bool bIsChart(false); + enum { CHART, MATH, OTHER } eType(OTHER); OUString clsid; xPropSet->getPropertyValue("CLSID") >>= clsid; if (!clsid.isEmpty()) @@ -1593,10 +1645,13 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) SvGlobalName aClassID; bool const isValid = aClassID.MakeId(clsid); assert(isValid); (void)isValid; - bIsChart = SotExchange::IsChart(aClassID); + if (SotExchange::IsChart(aClassID)) + eType = CHART; + else if (SotExchange::IsMath(aClassID)) + eType = MATH; } - if (bIsChart) + if (CHART == eType) { Reference< XChartDocument > xChartDoc; xPropSet->getPropertyValue("Model") >>= xChartDoc; @@ -1609,6 +1664,12 @@ ShapeExport& ShapeExport::WriteOLE2Shape( Reference< XShape > xShape ) return *this; } + if (MATH == eType) + { + WriteMathShape(xShape); + return *this; + } + uno::Reference<embed::XEmbeddedObject> const xObj( xPropSet->getPropertyValue("EmbeddedObject"), uno::UNO_QUERY); diff --git a/sd/qa/unit/data/odp/math.odp b/sd/qa/unit/data/odp/math.odp Binary files differnew file mode 100644 index 000000000000..c7605c5716c5 --- /dev/null +++ b/sd/qa/unit/data/odp/math.odp diff --git a/sd/qa/unit/export-tests.cxx b/sd/qa/unit/export-tests.cxx index da9d53f33e0a..33e1ba5a98b7 100644 --- a/sd/qa/unit/export-tests.cxx +++ b/sd/qa/unit/export-tests.cxx @@ -141,6 +141,7 @@ public: void testFdo90607(); void testTdf91378(); void testBnc822341(); + void testMathObject(); void testTdf80224(); void testTdf92527(); @@ -180,6 +181,7 @@ public: CPPUNIT_TEST(testTdf91378); CPPUNIT_TEST(testBnc822341); + CPPUNIT_TEST(testMathObject); CPPUNIT_TEST(testTdf80224); CPPUNIT_TEST(testExportTransitionsPPTX); @@ -208,10 +210,12 @@ public: { "v", "urn:schemas-microsoft-com:vml" }, { "a", "http://schemas.openxmlformats.org/drawingml/2006/main" }, { "c", "http://schemas.openxmlformats.org/drawingml/2006/chart" }, + { "m", "http://schemas.openxmlformats.org/officeDocument/2006/math" }, { "pic", "http://schemas.openxmlformats.org/drawingml/2006/picture" }, { "wp", "http://schemas.openxmlformats.org/drawingml/2006/wordprocessingDrawing" }, { "p", "http://schemas.openxmlformats.org/presentationml/2006/main" }, { "w", "http://schemas.openxmlformats.org/wordprocessingml/2006/main" }, + { "a14", "http://schemas.microsoft.com/office/drawing/2010/main" }, { "wps", "http://schemas.microsoft.com/office/word/2010/wordprocessingShape" }, { "wpg", "http://schemas.microsoft.com/office/word/2010/wordprocessingGroup" }, }; @@ -1151,6 +1155,30 @@ void SdExportTest::testBnc822341() xDocShRef->DoClose(); } +void SdExportTest::testMathObject() +{ + // Check import / export of math object + ::sd::DrawDocShellRef xDocShRef = loadURL(getURLFromSrc("sd/qa/unit/data/odp/math.odp"), ODP); + utl::TempFile tempFile1; + xDocShRef = saveAndReload(xDocShRef, PPTX, &tempFile1); + + // Export an LO specific ole object (imported from an ODP document) + { + xmlDocPtr pXmlDocContent = parseExport(tempFile1, "ppt/slides/slide1.xml"); + assertXPath(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice", + "Requires", + "a14"); + assertXPathContent(pXmlDocContent, + "/p:sld/p:cSld/p:spTree/mc:AlternateContent/mc:Choice/p:sp/p:txBody/a:p/a14:m/m:oMath/m:r[1]/m:t", + "a"); + + // TODO can't import yet + } + + xDocShRef->DoClose(); +} + void SdExportTest::testBulletMarginAndIndentation() { ::sd::DrawDocShellRef xDocShRef = loadURL( getURLFromSrc("/sd/qa/unit/data/pptx/bulletMarginAndIndent.pptx"), PPTX ); |