summaryrefslogtreecommitdiffstats
path: root/include/oox/export
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--include/oox/export/chartexport.hxx237
-rw-r--r--include/oox/export/drawingml.hxx313
-rw-r--r--include/oox/export/shapes.hxx210
-rw-r--r--include/oox/export/utils.hxx75
-rw-r--r--include/oox/export/vmlexport.hxx209
5 files changed, 1044 insertions, 0 deletions
diff --git a/include/oox/export/chartexport.hxx b/include/oox/export/chartexport.hxx
new file mode 100644
index 000000000..194e15628
--- /dev/null
+++ b/include/oox/export/chartexport.hxx
@@ -0,0 +1,237 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_OOX_EXPORT_CHARTEXPORT_HXX
+#define INCLUDED_OOX_EXPORT_CHARTEXPORT_HXX
+
+#include <set>
+#include <vector>
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <oox/dllapi.h>
+#include <oox/export/drawingml.hxx>
+#include <oox/export/utils.hxx>
+#include <oox/token/tokens.hxx>
+#include <rtl/ustring.hxx>
+#include <sal/types.h>
+#include <sax/fshelper.hxx>
+
+namespace com::sun::star {
+ namespace beans {
+ class XPropertySet;
+ }
+ namespace chart {
+ class XDiagram;
+ class XChartDocument;
+ }
+ namespace chart2 {
+ struct RelativePosition;
+ struct RelativeSize;
+ class XDiagram;
+ class XChartDocument;
+ class XDataSeries;
+ class XChartType;
+ namespace data
+ {
+ class XDataSequence;
+ class XLabeledDataSequence;
+ }
+ }
+ namespace drawing {
+ class XShape;
+ }
+ namespace frame {
+ class XModel;
+ }
+}
+
+namespace oox {
+namespace core {
+ class XmlFilterBase;
+}}
+
+namespace oox::drawingml {
+
+enum AxesType
+{
+ AXIS_PRIMARY_X = 1,
+ AXIS_PRIMARY_Y = 2,
+ AXIS_PRIMARY_Z = 3,
+ AXIS_SECONDARY_X = 4,
+ AXIS_SECONDARY_Y = 5
+};
+
+struct AxisIdPair{
+ AxesType nAxisType;
+ sal_Int32 nAxisId;
+ sal_Int32 nCrossAx;
+
+ AxisIdPair(AxesType nType, sal_Int32 nId, sal_Int32 nAx)
+ : nAxisType(nType)
+ , nAxisId(nId)
+ , nCrossAx(nAx)
+ {}
+};
+
+class OOX_DLLPUBLIC ChartExport final : public DrawingML {
+
+public:
+ // first: data sequence for label, second: data sequence for values.
+ typedef ::std::vector< AxisIdPair > AxisVector;
+
+private:
+ sal_Int32 mnXmlNamespace;
+ sal_Int32 mnSeriesCount;
+ css::uno::Reference< css::frame::XModel > mxChartModel;
+ css::uno::Reference< css::chart::XDiagram > mxDiagram;
+ css::uno::Reference< css::chart2::XDiagram > mxNewDiagram;
+ std::shared_ptr<URLTransformer> mpURLTransformer;
+
+ // members filled by InitRangeSegmentationProperties (retrieved from DataProvider)
+ bool mbHasCategoryLabels; //if the categories are only automatically generated this will be false
+
+ //css::uno::Reference< css::drawing::XShapes > mxAdditionalShapes;
+ css::uno::Reference< css::chart2::data::XDataSequence > mxCategoriesValues;
+
+ AxisVector maAxes;
+ bool mbHasZAxis;
+ bool mbIs3DChart;
+ bool mbStacked;
+ bool mbPercent;
+
+ std::set<sal_Int32> maExportedAxis;
+
+private:
+ sal_Int32 getChartType();
+
+ css::uno::Sequence< css::uno::Sequence< rtl::OUString > > getSplitCategoriesList(const OUString& rRange);
+
+ OUString parseFormula( const OUString& rRange );
+ void InitPlotArea();
+
+ void ExportContent_();
+ void exportChartSpace( const css::uno::Reference<
+ css::chart::XChartDocument >& rChartDoc,
+ bool bIncludeTable );
+ void exportChart( const css::uno::Reference<
+ css::chart::XChartDocument >& rChartDoc );
+ void exportExternalData( const css::uno::Reference<
+ css::chart::XChartDocument >& rChartDoc );
+ void exportLegend( const css::uno::Reference<
+ css::chart::XChartDocument >& rChartDoc );
+ void exportTitle( const css::uno::Reference< css::drawing::XShape >& xShape,
+ const OUString* pSubText = nullptr );
+ void exportPlotArea( const css::uno::Reference<
+ css::chart::XChartDocument >& rChartDoc );
+ void exportFill( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
+ void exportGradientFill( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
+ void exportBitmapFill( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
+ void exportHatch(const css::uno::Reference<css::beans::XPropertySet>& xPropSet);
+ void exportDataTable( );
+
+ void exportAreaChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportBarChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportBubbleChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportDoughnutChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportLineChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportPieChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportRadarChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportScatterChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportScatterChartSeries( const css::uno::Reference< css::chart2::XChartType >& xChartType,
+ css::uno::Sequence<css::uno::Reference<css::chart2::XDataSeries>>* pSeries);
+ void exportStockChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportSurfaceChart( const css::uno::Reference< css::chart2::XChartType >& xChartType );
+ void exportHiLowLines();
+ void exportUpDownBars(const css::uno::Reference< css::chart2::XChartType >& xChartType );
+
+ void exportAllSeries(const css::uno::Reference<css::chart2::XChartType>& xChartType, bool& rPrimaryAxes);
+ void exportSeries(const css::uno::Reference< css::chart2::XChartType >& xChartType,
+ css::uno::Sequence<css::uno::Reference<css::chart2::XDataSeries> >& rSeriesSeq, bool& rPrimaryAxes);
+
+ void exportVaryColors(const css::uno::Reference<css::chart2::XChartType>& xChartType);
+ void exportCandleStickSeries(
+ const css::uno::Sequence<
+ css::uno::Reference<
+ css::chart2::XDataSeries > > & aSeriesSeq,
+ bool& rPrimaryAxes );
+ void exportSeriesText(
+ const css::uno::Reference< css::chart2::data::XDataSequence >& xValueSeq );
+ void exportSeriesCategory(
+ const css::uno::Reference< css::chart2::data::XDataSequence >& xValueSeq, sal_Int32 nValueType = XML_cat );
+ void exportSeriesValues(
+ const css::uno::Reference< css::chart2::data::XDataSequence >& xValueSeq, sal_Int32 nValueType = XML_val );
+ void exportShapeProps( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
+ void exportTextProps(const css::uno::Reference< css::beans::XPropertySet >& xPropSet);
+ void exportDataPoints(
+ const css::uno::Reference< css::beans::XPropertySet >& xSeriesProperties,
+ sal_Int32 nSeriesLength, sal_Int32 eChartType );
+ void exportDataLabels( const css::uno::Reference<css::chart2::XDataSeries>& xSeries, sal_Int32 nSeriesLength, sal_Int32 eChartType );
+ void exportGrouping( bool isBar = false );
+ void exportTrendlines( const css::uno::Reference< css::chart2::XDataSeries >& xSeries );
+ void exportMarker( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
+ void exportSmooth();
+ void exportFirstSliceAng();
+
+ void exportErrorBar(const css::uno::Reference< css::beans::XPropertySet >& xErrorBarProps,
+ bool bYError);
+
+ void exportManualLayout(const css::chart2::RelativePosition& rPos, const css::chart2::RelativeSize& rSize, const bool bIsExcludingDiagramPositioning);
+
+ void exportAxes( );
+ void exportAxis(const AxisIdPair& rAxisIdPair);
+ void _exportAxis(
+ const css::uno::Reference< css::beans::XPropertySet >& xAxisProp,
+ const css::uno::Reference< css::drawing::XShape >& xAxisTitle,
+ const css::uno::Reference< css::beans::XPropertySet >& xMajorGrid,
+ const css::uno::Reference< css::beans::XPropertySet >& xMinorGrid,
+ sal_Int32 nAxisType,
+ const char* sAxisPos,
+ const AxisIdPair& rAxisIdPair );
+ void exportAxesId(bool bPrimaryAxes, bool bCheckCombinedAxes = false);
+ void exportView3D();
+ bool isDeep3dChart();
+
+ void exportMissingValueTreatment(const css::uno::Reference<css::beans::XPropertySet>& xPropSet);
+
+ OUString getNumberFormatCode(sal_Int32 nKey) const;
+
+public:
+
+ ChartExport( sal_Int32 nXmlNamespace, ::sax_fastparser::FSHelperPtr pFS, css::uno::Reference< css::frame::XModel > const & xModel,
+ ::oox::core::XmlFilterBase* pFB, DocumentType eDocumentType );
+ virtual ~ChartExport() {}
+
+ void SetURLTranslator(const std::shared_ptr<URLTransformer>& pTransformer);
+
+ const css::uno::Reference< css::frame::XModel >& getModel() const { return mxChartModel; }
+
+ void WriteChartObj( const css::uno::Reference< css::drawing::XShape >& xShape, sal_Int32 nID, sal_Int32 nChartCount );
+
+ void ExportContent();
+ void InitRangeSegmentationProperties(
+ const css::uno::Reference<
+ css::chart2::XChartDocument > & xChartDoc );
+};
+
+}
+
+#endif // INCLUDED_OOX_EXPORT_CHARTEXPORT_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
new file mode 100644
index 000000000..439d817d0
--- /dev/null
+++ b/include/oox/export/drawingml.hxx
@@ -0,0 +1,313 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_OOX_EXPORT_DRAWINGML_HXX
+#define INCLUDED_OOX_EXPORT_DRAWINGML_HXX
+
+#include <map>
+#include <vector>
+
+#include <com/sun/star/beans/PropertyState.hpp>
+#include <com/sun/star/uno/Any.hxx>
+#include <com/sun/star/uno/Reference.hxx>
+#include <com/sun/star/uno/Sequence.hxx>
+#include <com/sun/star/style/ParagraphAdjust.hpp>
+#include <com/sun/star/drawing/Hatch.hpp>
+#include <com/sun/star/i18n/ScriptType.hpp>
+#include <oox/dllapi.h>
+#include <oox/drawingml/drawingmltypes.hxx>
+#include <oox/token/tokens.hxx>
+#include <oox/export/utils.hxx>
+#include <rtl/string.hxx>
+#include <rtl/ustring.hxx>
+#include <sal/types.h>
+#include <sax/fshelper.hxx>
+#include <svx/msdffdef.hxx>
+#include <vcl/checksum.hxx>
+#include <tools/gen.hxx>
+#include <vcl/mapmod.hxx>
+
+class Graphic;
+class SdrObjCustomShape;
+
+namespace com::sun::star {
+namespace awt {
+ struct FontDescriptor;
+ struct Gradient;
+}
+namespace beans {
+ struct PropertyValue;
+ class XPropertySet;
+ class XPropertyState;
+}
+namespace drawing {
+ class XShape;
+ struct EnhancedCustomShapeParameterPair;
+ struct EnhancedCustomShapeParameter;
+}
+namespace graphic {
+ class XGraphic;
+}
+namespace style {
+ struct LineSpacing;
+}
+namespace text {
+ class XTextContent;
+ class XTextRange;
+}
+namespace io {
+ class XOutputStream;
+}
+namespace uno {
+ class XInterface;
+}
+namespace frame {
+ class XModel;
+}
+}
+
+struct EscherConnectorListEntry;
+class OutlinerParaObject;
+namespace tools { class Rectangle; }
+
+namespace tools {
+ class PolyPolygon;
+}
+
+namespace oox {
+namespace core {
+ class XmlFilterBase;
+}
+
+namespace drawingml {
+
+class OOX_DLLPUBLIC URLTransformer
+{
+public:
+ virtual ~URLTransformer();
+
+ virtual OUString getTransformedString(const OUString& rURL) const;
+
+ virtual bool isExternalURL(const OUString& rURL) const;
+};
+
+// Our rotation is counter-clockwise and is in 100ths of a degree.
+// drawingML rotation is clockwise and is in 60000ths of a degree.
+template <typename T> T ExportRotateClockwisify(T input)
+{
+ return ((21600000 - input * 600) % 21600000);
+}
+
+/// Interface to be implemented by the parent exporter that knows how to handle shape text.
+class OOX_DLLPUBLIC DMLTextExport
+{
+public:
+ virtual void WriteOutliner(const OutlinerParaObject& rParaObj) = 0;
+ /// Write the contents of the textbox that is associated to this shape.
+ virtual void WriteTextBox(css::uno::Reference<css::drawing::XShape> xShape) = 0;
+ /// Look up the RelId of a graphic based on its checksum.
+ virtual OUString FindRelId(BitmapChecksum nChecksum) = 0;
+ /// Store the RelId of a graphic based on its checksum.
+ virtual void CacheRelId(BitmapChecksum nChecksum, const OUString& rRelId) = 0;
+protected:
+ DMLTextExport() {}
+ virtual ~DMLTextExport() {}
+};
+
+class OOX_DLLPUBLIC DrawingML
+{
+
+private:
+ static int mnImageCounter;
+ static int mnWdpImageCounter;
+ static std::map<OUString, OUString> maWdpCache;
+
+ /// To specify where write eg. the images to (like 'ppt', or 'word' - according to the OPC).
+ DocumentType meDocumentType;
+ /// Parent exporter, used for text callback.
+ DMLTextExport* mpTextExport;
+
+protected:
+ css::uno::Any mAny;
+ ::sax_fastparser::FSHelperPtr mpFS;
+ ::oox::core::XmlFilterBase* mpFB;
+ /// If set, this is the parent of the currently handled shape.
+ css::uno::Reference<css::drawing::XShape> m_xParent;
+ bool mbIsBackgroundDark;
+
+ bool GetProperty( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, const OUString& aName );
+ bool GetPropertyAndState( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet,
+ const css::uno::Reference< css::beans::XPropertyState >& rXPropState,
+ const OUString& aName, css::beans::PropertyState& eState );
+ OUString GetFieldValue( const css::uno::Reference< css::text::XTextRange >& rRun, bool& bIsURLField );
+
+ /// Output the media (including copying a video from vnd.sun.star.Package: to the output if necessary).
+ void WriteMediaNonVisualProperties(const css::uno::Reference<css::drawing::XShape>& xShape);
+
+ void WriteStyleProperties( sal_Int32 nTokenId, const css::uno::Sequence< css::beans::PropertyValue >& aProperties );
+
+ const char* GetComponentDir() const;
+ const char* GetRelationCompPrefix() const;
+
+ static bool EqualGradients( css::awt::Gradient aGradient1, css::awt::Gradient aGradient2 );
+
+ void WriteGlowEffect(const css::uno::Reference<css::beans::XPropertySet>& rXPropSet);
+ void WriteSoftEdgeEffect(const css::uno::Reference<css::beans::XPropertySet>& rXPropSet);
+
+public:
+ DrawingML( ::sax_fastparser::FSHelperPtr pFS, ::oox::core::XmlFilterBase* pFB, DocumentType eDocumentType = DOCUMENT_PPTX, DMLTextExport* pTextExport = nullptr )
+ : meDocumentType( eDocumentType ), mpTextExport(pTextExport), mpFS( pFS ), mpFB( pFB ), mbIsBackgroundDark( false ) {}
+ void SetFS( ::sax_fastparser::FSHelperPtr pFS ) { mpFS = pFS; }
+ const ::sax_fastparser::FSHelperPtr& GetFS() const { return mpFS; }
+ ::oox::core::XmlFilterBase* GetFB() { return mpFB; }
+ DocumentType GetDocumentType() const { return meDocumentType; }
+ /// The application-specific text exporter callback, if there is one.
+ DMLTextExport* GetTextExport() { return mpTextExport; }
+
+ void SetBackgroundDark(bool bIsDark) { mbIsBackgroundDark = bIsDark; }
+ /// If bRelPathToMedia is true add "../" to image folder path while adding the image relationship
+ OUString WriteImage( const Graphic &rGraphic , bool bRelPathToMedia = false);
+
+ void WriteColor( ::Color nColor, sal_Int32 nAlpha = MAX_PERCENT );
+ void WriteColor( const OUString& sColorSchemeName, const css::uno::Sequence< css::beans::PropertyValue >& aTransformations, sal_Int32 nAlpha = MAX_PERCENT );
+ void WriteColorTransformations( const css::uno::Sequence< css::beans::PropertyValue >& aTransformations, sal_Int32 nAlpha = MAX_PERCENT );
+ void WriteGradientStop(sal_uInt16 nStop, ::Color nColor, sal_Int32 nAlpha = MAX_PERCENT);
+ void WriteLineArrow( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, bool bLineStart );
+ void WriteConnectorConnections( EscherConnectorListEntry& rConnectorEntry, sal_Int32 nStartID, sal_Int32 nEndID );
+
+ void WriteSolidFill( ::Color nColor, sal_Int32 nAlpha = MAX_PERCENT );
+ void WriteSolidFill( const OUString& sSchemeName, const css::uno::Sequence< css::beans::PropertyValue >& aTransformations, sal_Int32 nAlpha = MAX_PERCENT );
+ void WriteSolidFill( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+ void WriteGradientFill( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+
+ void WriteGradientFill( css::awt::Gradient rGradient, css::awt::Gradient rTransparenceGradient,
+ const css::uno::Reference<css::beans::XPropertySet>& rXPropSet = css::uno::Reference<css::beans::XPropertySet>());
+
+ void WriteGrabBagGradientFill( const css::uno::Sequence< css::beans::PropertyValue >& aGradientStops, css::awt::Gradient rGradient);
+
+ void WriteBlipOrNormalFill( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet,
+ const OUString& rURLPropName );
+ void WriteBlipFill( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet,
+ const OUString& sURLPropName );
+ void WriteBlipFill( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet,
+ const OUString& sURLPropName, sal_Int32 nXmlNamespace );
+
+ void WriteXGraphicBlipFill(css::uno::Reference<css::beans::XPropertySet> const & rXPropSet,
+ css::uno::Reference<css::graphic::XGraphic> const & rxGraphic,
+ sal_Int32 nXmlNamespace, bool bWriteMode, bool bRelPathToMedia = false);
+
+ void WritePattFill( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+ void WritePattFill(const css::uno::Reference<css::beans::XPropertySet>& rXPropSet,
+ const css::drawing::Hatch& rHatch);
+
+ void WriteGraphicCropProperties(css::uno::Reference<css::beans::XPropertySet> const & rxPropertySet,
+ Size const & rOriginalSize, MapMode const & rMapMode);
+
+ void WriteSrcRectXGraphic(css::uno::Reference<css::beans::XPropertySet> const & rxPropertySet,
+ css::uno::Reference<css::graphic::XGraphic> const & rxGraphic);
+
+ void WriteOutline( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet,
+ css::uno::Reference< css::frame::XModel> const & xModel = nullptr );
+
+ void WriteXGraphicStretch(css::uno::Reference<css::beans::XPropertySet> const & rXPropSet,
+ css::uno::Reference<css::graphic::XGraphic> const & rxGraphic);
+
+ void WriteLinespacing( const css::style::LineSpacing& rLineSpacing );
+
+ OUString WriteXGraphicBlip(css::uno::Reference<css::beans::XPropertySet> const & rXPropSet,
+ css::uno::Reference<css::graphic::XGraphic> const & rxGraphic,
+ bool bRelPathToMedia);
+
+ void WriteImageBrightnessContrastTransparence(css::uno::Reference<css::beans::XPropertySet> const & rXPropSet);
+
+ void WriteXGraphicBlipMode(css::uno::Reference<css::beans::XPropertySet> const & rXPropSet,
+ css::uno::Reference<css::graphic::XGraphic> const & rxGraphic);
+
+ void WriteShapeTransformation(const css::uno::Reference< css::drawing::XShape >& rXShape,
+ sal_Int32 nXmlNamespace, bool bFlipH = false, bool bFlipV = false, bool bSuppressRotation = false, bool bSuppressFlipping = false, bool bFlippedBeforeRotation = false);
+ void WriteTransformation(const tools::Rectangle& rRectangle,
+ sal_Int32 nXmlNamespace, bool bFlipH = false, bool bFlipV = false, sal_Int32 nRotation = 0, bool bIsGroupShape = false);
+
+ void WriteText( const css::uno::Reference< css::uno::XInterface >& rXIface, const OUString& presetWarp, bool bBodyPr, bool bText = true, sal_Int32 nXmlNamespace = 0);
+ void WriteParagraph( const css::uno::Reference< css::text::XTextContent >& rParagraph,
+ bool& rbOverridingCharHeight, sal_Int32& rnCharHeight );
+ void WriteParagraphProperties(const css::uno::Reference< css::text::XTextContent >& rParagraph, float fFirstCharHeight);
+ void WriteParagraphNumbering(const css::uno::Reference< css::beans::XPropertySet >& rXPropSet, float fFirstCharHeight,
+ sal_Int16 nLevel );
+ void WriteParagraphTabStops(const css::uno::Reference<css::beans::XPropertySet>& rXPropSet);
+ void WriteRun( const css::uno::Reference< css::text::XTextRange >& rRun,
+ bool& rbOverridingCharHeight, sal_Int32& rnCharHeight );
+ void WriteRunProperties( const css::uno::Reference< css::beans::XPropertySet >& rRun, bool bIsField, sal_Int32 nElement, bool bCheckDirect,
+ bool& rbOverridingCharHeight, sal_Int32& rnCharHeight, sal_Int16 nScriptType = css::i18n::ScriptType::LATIN);
+
+ void WritePresetShape( const char* pShape , std::vector< std::pair<sal_Int32,sal_Int32>> & rAvList );
+ void WritePresetShape( const char* pShape );
+ void WritePresetShape( const char* pShape, MSO_SPT eShapeType, bool bPredefinedHandlesUsed, const css::beans::PropertyValue& rProp );
+ bool WriteCustomGeometry(
+ const css::uno::Reference<css::drawing::XShape>& rXShape,
+ const SdrObjCustomShape& rSdrObjCustomShape);
+ void WriteCustomGeometryPoint(
+ const css::drawing::EnhancedCustomShapeParameterPair& rParamPair,
+ const SdrObjCustomShape& rSdrObjCustomShape);
+ static sal_Int32 GetCustomGeometryPointValue(
+ const css::drawing::EnhancedCustomShapeParameter& rParam,
+ const SdrObjCustomShape& rSdrObjCustomShape);
+ void WritePolyPolygon( const tools::PolyPolygon& rPolyPolygon, const bool bClosed );
+ void WriteFill( const css::uno::Reference< css::beans::XPropertySet >& xPropSet );
+ void WriteShapeStyle( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+ void WriteShapeEffects( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+ void WriteShapeEffect( const OUString& sName, const css::uno::Sequence< css::beans::PropertyValue >& aEffectProps );
+ void WriteShape3DEffects( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+ void WriteArtisticEffect( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet );
+ OString WriteWdpPicture( const OUString& rFileId, const css::uno::Sequence< sal_Int8 >& rPictureData );
+ void WriteDiagram(const css::uno::Reference<css::drawing::XShape>& rXShape, int nDiagramId);
+ void writeDiagramRels(const css::uno::Sequence<css::uno::Sequence<css::uno::Any>>& xRelSeq,
+ const css::uno::Reference<css::io::XOutputStream>& xOutStream,
+ const OUString& sGrabBagProperyName, int nDiagramId);
+ static bool IsGroupShape( const css::uno::Reference< css::drawing::XShape >& rXShape );
+ static bool IsDiagram(const css::uno::Reference<css::drawing::XShape>& rXShape);
+ sal_Int32 getBulletMarginIndentation (const css::uno::Reference< css::beans::XPropertySet >& rXPropSet,sal_Int16 nLevel, const OUString& propName);
+
+ static void ResetCounters();
+
+ // A Helper to decide the script type for given text in order to call WriteRunProperties.
+ static sal_Int16 GetScriptType(const OUString& rStr);
+
+ static sal_Unicode SubstituteBullet( sal_Unicode cBulletId, css::awt::FontDescriptor& rFontDesc );
+
+ static ::Color ColorWithIntensity( sal_uInt32 nColor, sal_uInt32 nIntensity );
+
+ static const char* GetAlignment( css::style::ParagraphAdjust nAlignment );
+
+ sax_fastparser::FSHelperPtr CreateOutputStream (
+ const OUString& sFullStream,
+ const OUString& sRelativeStream,
+ const css::uno::Reference< css::io::XOutputStream >& xParentRelation,
+ const char* sContentType,
+ const char* sRelationshipType,
+ OUString* pRelationshipId );
+
+};
+
+}
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/oox/export/shapes.hxx b/include/oox/export/shapes.hxx
new file mode 100644
index 000000000..2dbbb658c
--- /dev/null
+++ b/include/oox/export/shapes.hxx
@@ -0,0 +1,210 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_OOX_EXPORT_SHAPES_HXX
+#define INCLUDED_OOX_EXPORT_SHAPES_HXX
+
+#include <cstddef>
+#include <memory>
+#include <unordered_map>
+
+#include <com/sun/star/awt/Size.hpp>
+#include <com/sun/star/table/BorderLine2.hpp>
+#include <com/sun/star/uno/Reference.hxx>
+#include <oox/dllapi.h>
+#include <oox/export/drawingml.hxx>
+#include <oox/export/utils.hxx>
+#include <rtl/ustring.hxx>
+#include <sal/types.h>
+#include <sax/fshelper.hxx>
+#include <tools/fract.hxx>
+#include <vcl/mapmod.hxx>
+
+namespace com::sun::star {
+namespace beans {
+ class XPropertySet;
+}
+namespace drawing {
+ class XShape;
+}
+
+namespace embed {
+ class XEmbeddedObject;
+}
+namespace io {
+ class XInputStream;
+}
+namespace uno {
+ class XComponentContext;
+ class XInterface;
+}
+}
+
+namespace oox {
+namespace core {
+ class XmlFilterBase;
+}}
+
+class Graphic;
+
+namespace oox {
+
+OOX_DLLPUBLIC css::uno::Reference<css::io::XInputStream> GetOLEObjectStream(
+ css::uno::Reference<css::uno::XComponentContext> const& xContext,
+ css::uno::Reference<css::embed::XEmbeddedObject> const& xObj,
+ OUString const& i_rProgID,
+ OUString & o_rMediaType,
+ OUString & o_rRelationType,
+ OUString & o_rSuffix,
+ const char *& o_rpProgID);
+
+}
+
+namespace oox::drawingml {
+
+class OOX_DLLPUBLIC ShapeExport : public DrawingML {
+
+private:
+ int m_nEmbeddedObjects;
+
+public:
+ typedef std::unordered_map< css::uno::Reference< css::drawing::XShape>, sal_Int32> ShapeHashMap;
+
+protected:
+ sal_Int32 mnShapeIdMax, mnPictureIdMax;
+
+ void WriteGraphicObjectShapePart( const css::uno::Reference< css::drawing::XShape >& xShape, const Graphic *pGraphic=nullptr );
+
+private:
+ sal_Int32 mnXmlNamespace;
+ MapMode maMapModeSrc, maMapModeDest;
+ std::shared_ptr<URLTransformer> mpURLTransformer;
+
+ css::awt::Size MapSize( const css::awt::Size& ) const;
+
+ ShapeHashMap maShapeMap;
+ ShapeHashMap* mpShapeMap;
+ OUString m_presetWarp;
+
+public:
+
+ ShapeExport( sal_Int32 nXmlNamespace, ::sax_fastparser::FSHelperPtr pFS,
+ ShapeHashMap* pShapeMap, ::oox::core::XmlFilterBase* pFB,
+ DocumentType eDocumentType = DOCUMENT_PPTX,
+ DMLTextExport* pTextExport = nullptr );
+ virtual ~ShapeExport() {}
+
+ void SetURLTranslator(const std::shared_ptr<URLTransformer>& pTransformer);
+
+ static bool NonEmptyText( const css::uno::Reference< css::uno::XInterface >& xIface );
+
+ ShapeExport&
+ WritePolyPolygonShape( const css::uno::Reference< css::drawing::XShape >& xShape, bool bClosed );
+ ShapeExport&
+ WriteClosedPolyPolygonShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteConnectorShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteCustomShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteEllipseShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteGraphicObjectShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteGroupShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteLineShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteNonVisualDrawingProperties( const css::uno::Reference< css::drawing::XShape >& xShape, const char* sName );
+ virtual ShapeExport&
+ WriteNonVisualProperties( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteOpenPolyPolygonShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteRectangleShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+
+ /**
+ * Write the DrawingML for a particular shape.
+ *
+ * <p>This is the member function you want. It performs the type lookup and
+ * invokes the appropriate corresponding Write*() method for the specific
+ * type.</p>
+ *
+ * <p>To write an XShape, XShape::getShapeType() is called to determine
+ * the shape type, and the corresponding method in this table is
+ * invoked:</p>
+ *
+ * <table>
+ * <tr><th>Shape Type</th><th>Method</th></tr>
+ * <tr><td><tt>com.sun.star.drawing.ClosedBezierShape</tt></td> <td>ShapeExport::WriteClosedPolyPolygonShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.CustomShape</tt></td> <td>ShapeExport::WriteCustomShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.EllipseShape</tt></td> <td>ShapeExport::WriteEllipseShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.GraphicObjectShape</tt></td> <td>ShapeExport::WriteGraphicObjectShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.LineShape</tt></td> <td>ShapeExport::WriteLineShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.OpenBezierShape</tt></td> <td>ShapeExport::WriteOpenPolyPolygonShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.PolyPolygonShape</tt></td> <td>ShapeExport::WriteClosedPolyPolygonShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.PolyLineShape</tt></td> <td>ShapeExport::WriteOpenPolyPolygonShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.RectangleShape</tt></td> <td>ShapeExport::WriteRectangleShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.TableShape</tt></td> <td>ShapeExport::WriteTableShape</td></tr>
+ * <tr><td><tt>com.sun.star.drawing.TextShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.DateTimeShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.FooterShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.HeaderShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.NotesShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.OutlinerShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.SlideNumberShape</tt></td><td>ShapeExport::WriteTextShape</td></tr>
+ * <tr><td><tt>com.sun.star.presentation.TitleTextShape</tt></td> <td>ShapeExport::WriteTextShape</td></tr>
+ * </table>
+ *
+ * <p>If the shape type is not recognized, then
+ * <tt>ShapeExport::WriteUnknownShape</tt> is called.</p>
+ *
+ * @param xShape The shape to export as DrawingML.
+ * @return <tt>*this</tt>
+ */
+ ShapeExport& WriteShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport& WriteTextBox( const css::uno::Reference< css::uno::XInterface >& xIface, sal_Int32 nXmlNamespace );
+ virtual ShapeExport&
+ WriteTextShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ ShapeExport&
+ WriteTableShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ void WriteMathShape(css::uno::Reference<css::drawing::XShape> const& xShape);
+ ShapeExport&
+ WriteOLE2Shape( const css::uno::Reference< css::drawing::XShape >& xShape );
+ virtual ShapeExport&
+ WriteUnknownShape( const css::uno::Reference< css::drawing::XShape >& xShape );
+
+ void WriteTable( const css::uno::Reference< css::drawing::XShape >& rXShape );
+
+ void WriteTableCellProperties(const css::uno::Reference< css::beans::XPropertySet >& rXPropSet);
+
+ void WriteBorderLine(const sal_Int32 XML_line, const css::table::BorderLine2& rBorderLine);
+ void WriteTableCellBorders(const css::uno::Reference< css::beans::XPropertySet >& rXPropSet);
+
+ sal_Int32 GetNewShapeID( const css::uno::Reference< css::drawing::XShape >& rShape );
+ sal_Int32 GetNewShapeID( const css::uno::Reference< css::drawing::XShape >& rShape, ::oox::core::XmlFilterBase* pFB );
+ sal_Int32 GetShapeID( const css::uno::Reference< css::drawing::XShape >& rShape );
+ static sal_Int32 GetShapeID( const css::uno::Reference< css::drawing::XShape >& rShape, ShapeHashMap* pShapeMap );
+};
+
+}
+
+#endif // INCLUDED_OOX_EXPORT_SHAPES_HXX
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/oox/export/utils.hxx b/include/oox/export/utils.hxx
new file mode 100644
index 000000000..510505aa3
--- /dev/null
+++ b/include/oox/export/utils.hxx
@@ -0,0 +1,75 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_OOX_EXPORT_UTILS_HXX
+#define INCLUDED_OOX_EXPORT_UTILS_HXX
+
+#include <rtl/string.hxx>
+#include <sal/types.h>
+
+inline OString I32SHEX(sal_Int32 x)
+{
+ OString aStr = OString::number(x, 16);
+ while (aStr.getLength() < 6)
+ aStr = "0" + aStr;
+ return aStr;
+}
+
+/**
+ * @return const char* literal "true" for true value, or literal "false"
+ * for false value.
+ */
+static constexpr const char* ToPsz(bool b)
+{
+ return b ? "true" : "false";
+}
+
+/**
+ * @return literal "1" for true value, or literal "0" for false value.
+ */
+static constexpr const char* ToPsz10(bool b)
+{
+ // xlsx seems to use "1" or "0" for boolean values. I wonder it ever uses
+ // the "true" "false" variant.
+ return b ? "1" : "0";
+}
+
+static constexpr sal_Int64 PPTtoEMU( sal_Int32 nPPT )
+{
+ return static_cast<sal_Int64>( static_cast<double>(nPPT) * 1587.5 );
+}
+
+static constexpr sal_Int64 TwipsToEMU( sal_Int32 nTwips )
+{
+ return sal_Int64( nTwips ) * 635;
+}
+
+template <typename T>
+OString write1000thOfAPercent(T number)
+{
+ return OString::number( lround(number * 1000.0) );
+}
+
+namespace oox::drawingml {
+ enum DocumentType { DOCUMENT_DOCX, DOCUMENT_PPTX, DOCUMENT_XLSX };
+}
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/oox/export/vmlexport.hxx b/include/oox/export/vmlexport.hxx
new file mode 100644
index 000000000..07a07c8c5
--- /dev/null
+++ b/include/oox/export/vmlexport.hxx
@@ -0,0 +1,209 @@
+/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
+/*
+ * This file is part of the LibreOffice project.
+ *
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ *
+ * This file incorporates work covered by the following license notice:
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed
+ * with this work for additional information regarding copyright
+ * ownership. The ASF licenses this file to you under the Apache
+ * License, Version 2.0 (the "License"); you may not use this file
+ * except in compliance with the License. You may obtain a copy of
+ * the License at http://www.apache.org/licenses/LICENSE-2.0 .
+ */
+
+#ifndef INCLUDED_OOX_EXPORT_VMLEXPORT_HXX
+#define INCLUDED_OOX_EXPORT_VMLEXPORT_HXX
+
+#include <com/sun/star/uno/Reference.hxx>
+#include <editeng/outlobj.hxx>
+#include <filter/msfilter/escherex.hxx>
+#include <oox/dllapi.h>
+#include <rtl/strbuf.hxx>
+#include <rtl/string.hxx>
+#include <rtl/ustring.hxx>
+#include <sal/types.h>
+#include <sax/fshelper.hxx>
+#include <vcl/checksum.hxx>
+
+namespace com::sun::star {
+ namespace drawing {
+ class XShape;
+ }
+}
+
+namespace oox {
+ namespace drawingml {
+ class DrawingML;
+ }
+}
+
+namespace sax_fastparser {
+ class FastAttributeList;
+}
+
+class Point;
+namespace tools { class Rectangle; }
+class SdrObject;
+
+namespace oox {
+
+namespace vml {
+
+/// Interface to be implemented by the parent exporter that knows how to handle shape text.
+class OOX_DLLPUBLIC VMLTextExport
+{
+public:
+ virtual void WriteOutliner(const OutlinerParaObject& rParaObj) = 0;
+ virtual oox::drawingml::DrawingML& GetDrawingML() = 0;
+ /// Write the contents of the textbox that is associated to this shape in VML format.
+ virtual void WriteVMLTextBox(css::uno::Reference<css::drawing::XShape> xShape) = 0;
+ /// Look up the RelId of a graphic based on its checksum.
+ virtual OUString FindRelId(BitmapChecksum nChecksum) = 0;
+ /// Store the RelId of a graphic based on its checksum.
+ virtual void CacheRelId(BitmapChecksum nChecksum, const OUString& rRelId) = 0;
+protected:
+ VMLTextExport() {}
+ virtual ~VMLTextExport() {}
+};
+
+class OOX_DLLPUBLIC VMLExport : public EscherEx
+{
+ /// Fast serializer to output the data
+ ::sax_fastparser::FSHelperPtr m_pSerializer;
+
+ /// Parent exporter, used for text callback.
+ VMLTextExport* m_pTextExport;
+
+ /// Anchoring - Writer specific properties
+ sal_Int16 m_eHOri, m_eVOri, m_eHRel, m_eVRel;
+ std::unique_ptr<sax_fastparser::FastAttributeList> m_pWrapAttrList;
+ bool m_bInline; // css::text::TextContentAnchorType_AS_CHARACTER
+
+ /// The object we're exporting.
+ const SdrObject* m_pSdrObject;
+
+ /// Fill the shape attributes as they come.
+ ::sax_fastparser::FastAttributeList *m_pShapeAttrList;
+
+ /// Remember the shape type.
+ sal_uInt32 m_nShapeType;
+
+ /// Remember the shape flags.
+ ShapeFlag m_nShapeFlags;
+
+ /// Remember style, the most important shape attribute ;-)
+ OStringBuffer m_ShapeStyle;
+
+ /// style for textbox
+ OStringBuffer m_TextboxStyle;
+
+ /// Remember the generated shape id.
+ OString m_sShapeId;
+
+ /// Remember which shape types we had already written.
+ std::vector<bool> m_aShapeTypeWritten;
+
+ /// It seems useless to write out an XML_ID attribute next to XML_id which defines the actual shape id
+ bool m_bSkipwzName;
+
+ /// Use '#' mark for type attribute (check Type Attribute of VML shape in OOXML documentation)
+ bool m_bUseHashMarkForType;
+
+ /** There is a shapeid generation mechanism in EscherEx, but it does not seem to work
+ * so override the existing behavior to get actually unique ids.
+ */
+ bool m_bOverrideShapeIdGeneration;
+
+ /// Prefix for overridden shape id generation (used if m_bOverrideShapeIdGeneration is true)
+ OString m_sShapeIDPrefix;
+
+ /// Counter for generating shape ids (used if m_bOverrideShapeIdGeneration is true)
+ sal_uInt64 m_nShapeIDCounter;
+
+public:
+ VMLExport( ::sax_fastparser::FSHelperPtr const & pSerializer, VMLTextExport* pTextExport = nullptr);
+ virtual ~VMLExport() override;
+
+ const ::sax_fastparser::FSHelperPtr&
+ GetFS() const { return m_pSerializer; }
+
+ void SetFS(const ::sax_fastparser::FSHelperPtr& pSerializer);
+
+ /// Export the sdr object as VML.
+ ///
+ /// Call this when you need to export the object as VML.
+ OString const & AddSdrObject( const SdrObject& rObj, sal_Int16 eHOri = -1,
+ sal_Int16 eVOri = -1, sal_Int16 eHRel = -1,
+ sal_Int16 eVRel = -1,
+ std::unique_ptr<sax_fastparser::FastAttributeList> m_pWrapAttrList = nullptr,
+ const bool bOOxmlExport = false );
+ OString const & AddInlineSdrObject( const SdrObject& rObj, const bool bOOxmlExport );
+ virtual void AddSdrObjectVMLObject( const SdrObject& rObj) override;
+ static bool IsWaterMarkShape(const OUString& rStr);
+
+ void SetSkipwzName(bool bSkipwzName) { m_bSkipwzName = bSkipwzName; }
+ void SetHashMarkForType(bool bUseHashMarkForType) { m_bUseHashMarkForType = bUseHashMarkForType; }
+ void OverrideShapeIDGen(bool bOverrideShapeIdGeneration,
+ const OString& sShapeIDPrefix = OString());
+
+protected:
+ /// Add an attribute to the generated <v:shape/> element.
+ ///
+ /// This should be called from within StartShape() to ensure that the
+ /// added attribute is preserved.
+ void AddShapeAttribute( sal_Int32 nAttribute, const OString& sValue );
+
+ using EscherEx::StartShape;
+ using EscherEx::EndShape;
+
+ /// Override shape ID generation when m_bOverrideShapeIdGeneration is set to true
+ virtual sal_uInt32 GenerateShapeId() override;
+
+ /// Start the shape for which we just collected the information.
+ ///
+ /// Returns the element's tag number, -1 means we wrote nothing.
+ virtual sal_Int32 StartShape();
+
+ /// End the shape.
+ ///
+ /// The parameter is just what we got from StartShape().
+ virtual void EndShape( sal_Int32 nShapeElement );
+ virtual void Commit( EscherPropertyContainer& rProps, const tools::Rectangle& rRect ) override;
+
+private:
+
+ virtual void OpenContainer( sal_uInt16 nEscherContainer, int nRecInstance = 0 ) override;
+ virtual void CloseContainer() override;
+
+ virtual sal_uInt32 EnterGroup( const OUString& rShapeName, const tools::Rectangle* pBoundRect ) override;
+ virtual void LeaveGroup() override;
+
+ virtual void AddShape( sal_uInt32 nShapeType, ShapeFlag nShapeFlags, sal_uInt32 nShapeId = 0 ) override;
+
+private:
+ /// Create an OString representing the id from a numerical id.
+ OString ShapeIdString( sal_uInt32 nId );
+
+ /// Add flip X and\or flip Y
+ void AddFlipXY( );
+
+ /// Add starting and ending point of a line to the m_pShapeAttrList.
+ void AddLineDimensions( const tools::Rectangle& rRectangle );
+
+ /// Add position and size to the OStringBuffer.
+ void AddRectangleDimensions( OStringBuffer& rBuffer, const tools::Rectangle& rRectangle, bool rbAbsolutePos = true );
+};
+
+} // namespace vml
+
+} // namespace oox
+
+#endif
+
+/* vim:set shiftwidth=4 softtabstop=4 expandtab: */