diff options
author | Jacobo Aragunde Pérez <jaragunde@igalia.com> | 2014-05-09 12:01:46 +0200 |
---|---|---|
committer | Jacobo Aragunde Pérez <jaragunde@igalia.com> | 2014-05-09 14:11:38 +0200 |
commit | f6422b3dfcb00e451ef103127aace1856dc752a9 (patch) | |
tree | 135bd8dd5be8354897e125b73ba4f626d3794504 /oox | |
parent | 6566c218afec3cd8c4d36094777bc30b1970e9e4 (diff) |
ooxml: Preserve shape 3d effects: top and bottom bevel
Shapes 3D effects can specify top and bottom bevels like in the
following example:
<a:sp3d z="488950" extrusionH="63500" contourW="50800">
<a:bevelT w="139700" h="88900" prst="cross"/>
<a:bevelB h="88900" prst="relaxedInset"/>
</a:sp3d>
This patch preserves the a:bevel* tags and their attributes using the
shape grab bag and modifies an existing unit test to add this check.
Change-Id: I4762111e4d2f75ba2fd3721a126aa324a28a853c
Diffstat (limited to 'oox')
-rw-r--r-- | oox/source/drawingml/scene3dcontext.cxx | 26 | ||||
-rw-r--r-- | oox/source/drawingml/shape3dproperties.cxx | 61 | ||||
-rw-r--r-- | oox/source/export/drawingml.cxx | 52 |
3 files changed, 138 insertions, 1 deletions
diff --git a/oox/source/drawingml/scene3dcontext.cxx b/oox/source/drawingml/scene3dcontext.cxx index bbae7abedd10..124a74183f48 100644 --- a/oox/source/drawingml/scene3dcontext.cxx +++ b/oox/source/drawingml/scene3dcontext.cxx @@ -80,6 +80,32 @@ Shape3DPropertiesContext::Shape3DPropertiesContext( ContextHandler2Helper& rPare mr3DProperties.mnShapeZ = rAttribs.getInteger( XML_z, 0 ); } +ContextHandlerRef Shape3DPropertiesContext::onCreateContext( sal_Int32 aElementToken, const AttributeList& rAttribs ) +{ + switch( aElementToken ) + { + case A_TOKEN( bevelT ): + case A_TOKEN( bevelB ): + { + BevelProperties aProps; + if( rAttribs.hasAttribute( XML_w ) ) + aProps.mnWidth = rAttribs.getInteger( XML_w, 0 ); + if( rAttribs.hasAttribute( XML_h ) ) + aProps.mnHeight = rAttribs.getInteger( XML_h, 0 ); + if( rAttribs.hasAttribute( XML_prst ) ) + aProps.mnPreset = rAttribs.getToken( XML_prst, XML_none ); + + if( aElementToken == A_TOKEN( bevelT ) ) + mr3DProperties.maTopBevelProperties.set( aProps ); + else + mr3DProperties.maBottomBevelProperties.set( aProps ); + + break; + } + } + return 0; +} + Scene3DRotationPropertiesContext::Scene3DRotationPropertiesContext( ContextHandler2Helper& rParent, RotationProperties& rRotationProperties ) throw() : ContextHandler2( rParent ) , mrRotationProperties( rRotationProperties ) diff --git a/oox/source/drawingml/shape3dproperties.cxx b/oox/source/drawingml/shape3dproperties.cxx index 7da8a0b4d9f1..28d907922b31 100644 --- a/oox/source/drawingml/shape3dproperties.cxx +++ b/oox/source/drawingml/shape3dproperties.cxx @@ -171,6 +171,27 @@ OUString Shape3DProperties::getLightRigDirName( sal_Int32 nElement ) return OUString(); } +OUString Shape3DProperties::getBevelPresetTypeString( sal_Int32 nType ) +{ + switch (nType) + { + case XML_relaxedInset: return OUString("relaxedInset"); + case XML_circle: return OUString("circle"); + case XML_slope: return OUString("slope"); + case XML_cross: return OUString("cross"); + case XML_angle: return OUString("angle"); + case XML_softRound: return OUString("softRound"); + case XML_convex: return OUString("convex"); + case XML_coolSlant: return OUString("coolSlant"); + case XML_divot: return OUString("divot"); + case XML_riblet: return OUString("riblet"); + case XML_hardEdge: return OUString("hardEdge"); + case XML_artDeco: return OUString("artDeco"); + } + SAL_WARN( "oox.drawingml", "Shape3DProperties::getBevelPresetTypeString - unexpected token" ); + return OUString(); +} + css::uno::Sequence< css::beans::PropertyValue > Shape3DProperties::getCameraAttributes() { css::uno::Sequence<css::beans::PropertyValue> aSeq(6); @@ -253,10 +274,36 @@ css::uno::Sequence< css::beans::PropertyValue > Shape3DProperties::getLightRigAt return aSeq; } -css::uno::Sequence< css::beans::PropertyValue > Shape3DProperties::getShape3DAttributes() +css::uno::Sequence< css::beans::PropertyValue > Shape3DProperties::getBevelAttributes( BevelProperties rProps ) { css::uno::Sequence<css::beans::PropertyValue> aSeq(3); sal_Int32 nSize = 0; + if( rProps.mnPreset.has() ) + { + aSeq[nSize].Name = "prst"; + aSeq[nSize].Value = css::uno::Any( getBevelPresetTypeString( rProps.mnPreset.use() ) ); + nSize++; + } + if( rProps.mnWidth.has() ) + { + aSeq[nSize].Name = "w"; + aSeq[nSize].Value = css::uno::Any( rProps.mnWidth.use() ); + nSize++; + } + if( rProps.mnHeight.has() ) + { + aSeq[nSize].Name = "h"; + aSeq[nSize].Value = css::uno::Any( rProps.mnHeight.use() ); + nSize++; + } + aSeq.realloc( nSize ); + return aSeq; +} + +css::uno::Sequence< css::beans::PropertyValue > Shape3DProperties::getShape3DAttributes() +{ + css::uno::Sequence<css::beans::PropertyValue> aSeq(5); + sal_Int32 nSize = 0; if( mnExtrusionH.has() ) { aSeq[nSize].Name = "extrusionH"; @@ -275,6 +322,18 @@ css::uno::Sequence< css::beans::PropertyValue > Shape3DProperties::getShape3DAtt aSeq[nSize].Value = css::uno::Any( mnShapeZ.use() ); nSize++; } + if( maTopBevelProperties.has() ) + { + aSeq[nSize].Name = "bevelT"; + aSeq[nSize].Value = css::uno::Any( getBevelAttributes( maTopBevelProperties.use() ) ); + nSize++; + } + if( maBottomBevelProperties.has() ) + { + aSeq[nSize].Name = "bevelB"; + aSeq[nSize].Value = css::uno::Any( getBevelAttributes( maBottomBevelProperties.use() ) ); + nSize++; + } aSeq.realloc( nSize ); return aSeq; } diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx index 0b437db8acb9..90000a1b78ea 100644 --- a/oox/source/export/drawingml.cxx +++ b/oox/source/export/drawingml.cxx @@ -2408,6 +2408,9 @@ void DrawingML::WriteShape3DEffects( Reference< XPropertySet > xPropSet ) if( aShape3DProps.getLength() == 0 ) return; + bool bBevelTPresent = false, bBevelBPresent = false; + sax_fastparser::FastAttributeList *aBevelTAttrList = mpFS->createAttrList(); + sax_fastparser::FastAttributeList *aBevelBAttrList = mpFS->createAttrList(); sax_fastparser::FastAttributeList *aShape3DAttrList = mpFS->createAttrList(); for( sal_Int32 i=0; i < aShape3DProps.getLength(); ++i ) { @@ -2423,10 +2426,59 @@ void DrawingML::WriteShape3DEffects( Reference< XPropertySet > xPropSet ) nToken = XML_z; aShape3DAttrList->add( nToken, OString::number( nVal ).getStr() ); } + if( aShape3DProps[i].Name == "bevelT" || aShape3DProps[i].Name == "bevelB" ) + { + Sequence< PropertyValue > aBevelProps; + aShape3DProps[i].Value >>= aBevelProps; + if ( aBevelProps.getLength() == 0 ) + continue; + + sax_fastparser::FastAttributeList *aBevelAttrList = NULL; + if( aShape3DProps[i].Name == "bevelT" ) + { + bBevelTPresent = true; + aBevelAttrList = aBevelTAttrList; + } + else + { + bBevelBPresent = true; + aBevelAttrList = aBevelBAttrList; + } + for( sal_Int32 j=0; j < aBevelProps.getLength(); ++j ) + { + if( aBevelProps[j].Name == "w" || aBevelProps[j].Name == "h" ) + { + sal_Int32 nVal = 0, nToken = XML_none; + aBevelProps[j].Value >>= nVal; + if( aBevelProps[j].Name == "w" ) + nToken = XML_w; + else if( aBevelProps[j].Name == "h" ) + nToken = XML_h; + aBevelAttrList->add( nToken, OString::number( nVal ).getStr() ); + } + else if( aBevelProps[j].Name == "prst" ) + { + OUString sVal; + aBevelProps[j].Value >>= sVal; + aBevelAttrList->add( XML_prst, OUStringToOString( sVal, RTL_TEXTENCODING_UTF8 ).getStr() ); + } + } + + } } sax_fastparser::XFastAttributeListRef xAttrList( aShape3DAttrList ); mpFS->startElementNS( XML_a, XML_sp3d, xAttrList ); + if( bBevelTPresent ) + { + sax_fastparser::XFastAttributeListRef xBevelAttrList( aBevelTAttrList ); + mpFS->singleElementNS( XML_a, XML_bevelT, xBevelAttrList ); + } + if( bBevelBPresent ) + { + sax_fastparser::XFastAttributeListRef xBevelAttrList( aBevelBAttrList ); + mpFS->singleElementNS( XML_a, XML_bevelB, xBevelAttrList ); + } mpFS->endElementNS( XML_a, XML_sp3d ); } |