summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSarper Akdemir <sarper.akdemir@collabora.com>2022-02-14 07:33:56 +0300
committerAndras Timar <andras.timar@collabora.com>2022-04-01 13:40:25 +0200
commit8df1157bedabb072e4be0639fac3a1cf9efd5b17 (patch)
tree0e419e423b485c262c8a4946b7ff508a2fc0766e
parenttdf#147861 writerfilter: use GetFieldResult, not current DocProperty (diff)
downloadcore-8df1157bedabb072e4be0639fac3a1cf9efd5b17.tar.gz
core-8df1157bedabb072e4be0639fac3a1cf9efd5b17.zip
tdf#132557: PPTX import: Workaround for slide footer shape presets
It appears that placeholder shapes with service names: - com.sun.star.presentation.TitleTextShape - com.sun.star.presentation.DateTimeShape - com.sun.star.presentation.FooterShape - com.sun.star.presentation.SlideNumberShape ... Are unable to have custom shapes in Impress. (i.e. can't be ellipse, triangle etc.). These presets get specified in OOXML with <a:prstGeom prst="ellipse"/> inside spPr (shape properties). Therefore with similar results to the PPT import, a workaround is applied where slide footers which have non default shapes are imported with com.sun.star.drawing.CustomShapes service. The layout/master footers are left as is since if they were to be imported as CustomShapes they would appear on each slide even if the slide had those footers enabled or not. Change-Id: Ic8a8ab3f6dfb7367ecd2c619ce888bf77abef460 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/129890 Tested-by: Jenkins CollaboraOffice <jenkinscollaboraoffice@gmail.com> Reviewed-by: Andras Timar <andras.timar@collabora.com>
-rw-r--r--oox/inc/drawingml/customshapeproperties.hxx6
-rwxr-xr-xoox/qa/unit/data/testTdf132557_footerCustomShapes.pptxbin0 -> 20137 bytes
-rw-r--r--oox/qa/unit/drawingml.cxx29
-rw-r--r--oox/source/drawingml/customshapeproperties.cxx7
-rw-r--r--oox/source/drawingml/shape.cxx5
-rw-r--r--oox/source/ppt/pptshape.cxx15
6 files changed, 59 insertions, 3 deletions
diff --git a/oox/inc/drawingml/customshapeproperties.hxx b/oox/inc/drawingml/customshapeproperties.hxx
index a8f4c19b051b..153858fdaf45 100644
--- a/oox/inc/drawingml/customshapeproperties.hxx
+++ b/oox/inc/drawingml/customshapeproperties.hxx
@@ -124,6 +124,12 @@ public:
sal_Int32 getArcNum() { return mnArcNum++; }
+ /**
+ Returns whether or not the current CustomShapeProperties
+ represent a default shape preset that is rectangular.
+ */
+ bool representsDefaultShape() const;
+
private:
sal_Int32 mnShapePresetType;
diff --git a/oox/qa/unit/data/testTdf132557_footerCustomShapes.pptx b/oox/qa/unit/data/testTdf132557_footerCustomShapes.pptx
new file mode 100755
index 000000000000..4dbf3717d1fd
--- /dev/null
+++ b/oox/qa/unit/data/testTdf132557_footerCustomShapes.pptx
Binary files differ
diff --git a/oox/qa/unit/drawingml.cxx b/oox/qa/unit/drawingml.cxx
index 3362acb3c8c6..6d53c3ab7bd9 100644
--- a/oox/qa/unit/drawingml.cxx
+++ b/oox/qa/unit/drawingml.cxx
@@ -400,6 +400,35 @@ CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testChartThemeOverride)
CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0x4472C4), nActual);
}
+CPPUNIT_TEST_FIXTURE(OoxDrawingmlTest, testTdf132557_footerCustomShapes)
+{
+ // slide with date, footer, slide number with custom shapes
+ OUString aURL
+ = m_directories.getURLFromSrc(DATA_DIRECTORY) + "testTdf132557_footerCustomShapes.pptx";
+ // When importing the document:
+ load(aURL);
+
+ uno::Reference<drawing::XDrawPagesSupplier> xDrawPagesSupplier(getComponent(), uno::UNO_QUERY);
+ uno::Reference<drawing::XDrawPage> xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+ uno::UNO_QUERY);
+
+ // Test if we were able to import the footer shapes with CustomShape service.
+ uno::Reference<drawing::XShape> xShapeDateTime(xDrawPage->getByIndex(0), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.CustomShape"),
+ xShapeDateTime->getShapeType());
+ // Without the accompanying fix in place, this test would have failed with:
+ // An uncaught exception of type com.sun.star.lang.IndexOutOfBoundsException
+ // i.e. the shape wasn't on the slide there since it was imported as a property, not a shape.
+
+ uno::Reference<drawing::XShape> xShapeFooter(xDrawPage->getByIndex(1), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.CustomShape"),
+ xShapeFooter->getShapeType());
+
+ uno::Reference<drawing::XShape> xShapeSlideNum(xDrawPage->getByIndex(2), uno::UNO_QUERY);
+ CPPUNIT_ASSERT_EQUAL(OUString("com.sun.star.drawing.CustomShape"),
+ xShapeSlideNum->getShapeType());
+}
+
CPPUNIT_PLUGIN_IMPLEMENT();
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/drawingml/customshapeproperties.cxx b/oox/source/drawingml/customshapeproperties.cxx
index 1b4d6b4a59f6..29cfc0d1cd88 100644
--- a/oox/source/drawingml/customshapeproperties.cxx
+++ b/oox/source/drawingml/customshapeproperties.cxx
@@ -86,6 +86,13 @@ sal_Int32 CustomShapeProperties::GetCustomShapeGuideValue( const std::vector< Cu
return nIndex;
}
+bool CustomShapeProperties::representsDefaultShape() const
+{
+ return !((getShapePresetType() >= 0 || maPath2DList.size() > 0) &&
+ getShapePresetType() != XML_Rect &&
+ getShapePresetType() != XML_rect);
+}
+
CustomShapeProperties::PresetDataMap CustomShapeProperties::maPresetDataMap;
static OUString GetConnectorShapeType( sal_Int32 nType )
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index 16fdd04b3d76..1d45b481f407 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -746,9 +746,8 @@ Reference< XShape > const & Shape::createAndInsert(
// Use custom shape instead of GraphicObjectShape if the image is cropped to
// shape. Except rectangle, which does not require further cropping
bool bIsCroppedGraphic = (aServiceName == "com.sun.star.drawing.GraphicObjectShape" &&
- (mpCustomShapePropertiesPtr->getShapePresetType() >= 0 || mpCustomShapePropertiesPtr->getPath2DList().size() > 0) &&
- mpCustomShapePropertiesPtr->getShapePresetType() != XML_Rect &&
- mpCustomShapePropertiesPtr->getShapePresetType() != XML_rect);
+ !mpCustomShapePropertiesPtr->representsDefaultShape());
+
// ToDo: Why is ConnectorShape here treated as custom shape, but below with start and end point?
bool bIsCustomShape = ( aServiceName == "com.sun.star.drawing.CustomShape" ||
aServiceName == "com.sun.star.drawing.ConnectorShape" ||
diff --git a/oox/source/ppt/pptshape.cxx b/oox/source/ppt/pptshape.cxx
index 7e294f197fe1..ca888e4c17c1 100644
--- a/oox/source/ppt/pptshape.cxx
+++ b/oox/source/ppt/pptshape.cxx
@@ -19,6 +19,7 @@
#include <oox/ppt/pptshape.hxx>
#include <oox/core/xmlfilterbase.hxx>
+#include <drawingml/customshapeproperties.hxx>
#include <drawingml/textbody.hxx>
#include <drawingml/textparagraph.hxx>
#include <drawingml/textfield.hxx>
@@ -140,6 +141,10 @@ bool PPTShape::IsPlaceHolderCandidate(const SlidePersist& rSlidePersist) const
return false;
if (rParagraphs.front()->getRuns().size() != 1)
return false;
+ // If the placeholder has a shape other than rectangle,
+ // we have to place it in the slide as a CustomShape.
+ if (!mpCustomShapePropertiesPtr->representsDefaultShape())
+ return false;
return ShapeHasNoVisualPropertiesOnImport(*this);
}
@@ -317,6 +322,16 @@ void PPTShape::addShape(
}
}
+ // Since it is not possible to represent custom shaped placeholders in Impress
+ // Need to use service name css.drawing.CustomShape if they have a non default shape.
+ // This workaround has the drawback of them not really being processed as placeholders
+ // so it is only done for slide footers...
+ if ((mnSubType == XML_sldNum || mnSubType == XML_dt || mnSubType == XML_ftr)
+ && meShapeLocation == Slide && !mpCustomShapePropertiesPtr->representsDefaultShape())
+ {
+ sServiceName = "com.sun.star.drawing.CustomShape";
+ }
+
SAL_INFO("oox.ppt","shape service: " << sServiceName);
if (mnSubType && getSubTypeIndex().has() && meShapeLocation == Layout)