summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--oox/inc/oox/helper/helper.hxx1
-rw-r--r--oox/inc/oox/vml/vmlformatting.hxx12
-rw-r--r--oox/inc/oox/vml/vmlshape.hxx1
-rw-r--r--oox/source/token/properties.txt1
-rw-r--r--oox/source/vml/vmlformatting.cxx28
-rw-r--r--oox/source/vml/vmlshape.cxx2
-rw-r--r--oox/source/vml/vmlshapecontext.cxx8
7 files changed, 53 insertions, 0 deletions
diff --git a/oox/inc/oox/helper/helper.hxx b/oox/inc/oox/helper/helper.hxx
index bfe2796581c3..e82cea772d2b 100644
--- a/oox/inc/oox/helper/helper.hxx
+++ b/oox/inc/oox/helper/helper.hxx
@@ -82,6 +82,7 @@ const sal_uInt8 WINDOWS_CHARSET_OEM = 255;
const sal_Int32 API_RGB_TRANSPARENT = -1; ///< Transparent color for API calls.
const sal_Int32 API_RGB_BLACK = 0x000000; ///< Black color for API calls.
+const sal_Int32 API_RGB_GRAY = 0x808080; ///< Gray color for API calls.
const sal_Int32 API_RGB_WHITE = 0xFFFFFF; ///< White color for API calls.
const sal_Int16 API_LINE_SOLID = 0;
diff --git a/oox/inc/oox/vml/vmlformatting.hxx b/oox/inc/oox/vml/vmlformatting.hxx
index 277b35837af0..0d8db1678769 100644
--- a/oox/inc/oox/vml/vmlformatting.hxx
+++ b/oox/inc/oox/vml/vmlformatting.hxx
@@ -225,6 +225,18 @@ struct FillModel
// ============================================================================
+/** The shadow model structure contains all shape shadow properties. */
+struct ShadowModel
+{
+ OptValue<bool> moHasShadow; ///< Specifies whether to show a shadow.
+ OptValue<OUString> moColor; ///< Specifies the color of the shadow.
+ OptValue<OUString> moOffset; ///< Specifies the shadow's offset from the shape's location.
+ OptValue<double> moOpacity; ///< Specifies the opacity of the shadow.
+
+ /** Writes the properties to the passed property map. */
+ void pushToPropMap(oox::drawingml::ShapePropertyMap& rPropMap, const GraphicHelper& rGraphicHelper) const;
+};
+
} // namespace vml
} // namespace oox
diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx
index 2f4ab6f57f2c..1ef305864d17 100644
--- a/oox/inc/oox/vml/vmlshape.hxx
+++ b/oox/inc/oox/vml/vmlshape.hxx
@@ -87,6 +87,7 @@ struct OOX_DLLPUBLIC ShapeTypeModel
StrokeModel maStrokeModel; ///< Border line formatting.
FillModel maFillModel; ///< Shape fill formatting.
+ ShadowModel maShadowModel; ///< Shape shadow formatting.
OptValue< ::rtl::OUString > moGraphicPath; ///< Path to a graphic for this shape.
OptValue< ::rtl::OUString > moGraphicTitle; ///< Title of the graphic.
diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt
index a252bb2efcd3..243058010841 100644
--- a/oox/source/token/properties.txt
+++ b/oox/source/token/properties.txt
@@ -414,6 +414,7 @@ SelectedItems
SelectedPage
Shadow
ShadowColor
+ShadowFormat
ShadowTransparence
ShadowXDistance
ShadowYDistance
diff --git a/oox/source/vml/vmlformatting.cxx b/oox/source/vml/vmlformatting.cxx
index 528cc06db6b6..3113d57b4dd5 100644
--- a/oox/source/vml/vmlformatting.cxx
+++ b/oox/source/vml/vmlformatting.cxx
@@ -18,6 +18,7 @@
*/
#include "oox/vml/vmlformatting.hxx"
+#include <com/sun/star/table/ShadowFormat.hpp>
#include <rtl/strbuf.hxx>
#include "oox/drawingml/color.hxx"
#include "oox/drawingml/drawingmltypes.hxx"
@@ -32,6 +33,7 @@ namespace vml {
// ============================================================================
+using namespace ::com::sun::star;
using namespace ::com::sun::star::geometry;
using ::oox::drawingml::Color;
@@ -712,6 +714,32 @@ void FillModel::pushToPropMap( ShapePropertyMap& rPropMap, const GraphicHelper&
// ============================================================================
+void ShadowModel::pushToPropMap(ShapePropertyMap& rPropMap, const GraphicHelper& rGraphicHelper) const
+{
+ if (moHasShadow.has() && !moHasShadow.get())
+ return;
+
+ drawingml::Color aColor = ConversionHelper::decodeColor(rGraphicHelper, moColor, moOpacity, API_RGB_GRAY);
+ // nOffset* is in mm100, default value is 35 twips, see DffPropertyReader::ApplyAttributes() in msfilter.
+ sal_Int32 nOffsetX = 62, nOffsetY = 62;
+ if (moOffset.has())
+ {
+ OUString aOffsetX, aOffsetY;
+ ConversionHelper::separatePair(aOffsetX, aOffsetY, moOffset.get(), ',');
+ if (!aOffsetX.isEmpty())
+ nOffsetX = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, aOffsetX, 0, false, false );
+ if (!aOffsetY.isEmpty())
+ nOffsetY = ConversionHelper::decodeMeasureToHmm(rGraphicHelper, aOffsetY, 0, false, false );
+ }
+
+ table::ShadowFormat aFormat;
+ aFormat.Color = aColor.getColor(rGraphicHelper);
+ aFormat.Location = table::ShadowLocation_BOTTOM_RIGHT;
+ // The width of the shadow is the average of the x and y values, see SwWW8ImplReader::MatchSdrItemsIntoFlySet().
+ aFormat.ShadowWidth = ((nOffsetX + nOffsetY) / 2);
+ rPropMap.setProperty(PROP_ShadowFormat, uno::makeAny(aFormat));
+}
+
} // namespace vml
} // namespace oox
diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx
index e36d98e2b0d9..8341f1979952 100644
--- a/oox/source/vml/vmlshape.cxx
+++ b/oox/source/vml/vmlshape.cxx
@@ -365,6 +365,8 @@ void ShapeBase::convertShapeProperties( const Reference< XShape >& rxShape ) con
uno::Reference<lang::XServiceInfo> xSInfo(rxShape, uno::UNO_QUERY_THROW);
if (xSInfo->supportsService("com.sun.star.text.TextFrame"))
{
+ // Any other service supporting the ShadowFormat property?
+ maTypeModel.maShadowModel.pushToPropMap(aPropMap, rGraphicHelper);
// TextFrames have BackColor, not FillColor
if (aPropMap.hasProperty(PROP_FillColor))
{
diff --git a/oox/source/vml/vmlshapecontext.cxx b/oox/source/vml/vmlshapecontext.cxx
index cb3daa6dbd03..fc5ad9f44cb6 100644
--- a/oox/source/vml/vmlshapecontext.cxx
+++ b/oox/source/vml/vmlshapecontext.cxx
@@ -333,6 +333,14 @@ ContextHandlerRef ShapeTypeContext::onCreateContext( sal_Int32 nElement, const A
mrTypeModel.moWrapAnchorX = rAttribs.getString(XML_anchorx);
mrTypeModel.moWrapAnchorY = rAttribs.getString(XML_anchory);
break;
+ case VML_TOKEN( shadow ):
+ {
+ mrTypeModel.maShadowModel.moHasShadow.assignIfUsed(lclDecodeBool(rAttribs, XML_on));
+ mrTypeModel.maShadowModel.moColor.assignIfUsed(rAttribs.getString(XML_color));
+ mrTypeModel.maShadowModel.moOffset.assignIfUsed(rAttribs.getString(XML_offset));
+ mrTypeModel.maShadowModel.moOpacity = lclDecodePercent(rAttribs, XML_opacity, 1.0);
+ }
+ break;
}
return 0;
}