summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJacobo Aragunde Pérez <jaragunde@igalia.com>2014-05-06 12:45:54 +0200
committerJacobo Aragunde Pérez <jaragunde@igalia.com>2014-05-06 16:32:28 +0200
commit36e22e83a1ca3106d6ef3fbb6ba066a447a65601 (patch)
tree6c51dd7865be3f57dabe33412c87294c561a51af
parent1b7773cb071c7bbf60ea023551f35375b6120d4a (diff)
oox: preserve camera rotation on shape 3D effects.
Camera options in shape 3D effects can have rotation settings like in the following example: <a:camera prst="perspectiveRelaxedModerately" zoom="150000"> <a:rot lat="19490639" lon="0" rev="12900001"/> </a:camera> This patch preserves the a:rot tag and its attributes using the shape grab bag. We created the class Scene3DRotationPropertiesContext to be piled on top of a Scene3DPropertiesContext and process the contents of the child item. It also adds a unit test for this case. Change-Id: Id6bf58ad05fe5b49061619b6750ed0658badc9af
-rw-r--r--include/oox/drawingml/scene3dcontext.hxx11
-rw-r--r--include/oox/drawingml/shape3dproperties.hxx8
-rw-r--r--oox/source/drawingml/scene3dcontext.cxx24
-rw-r--r--oox/source/drawingml/shape3dproperties.cxx20
-rw-r--r--oox/source/export/drawingml.cxx22
-rw-r--r--sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx12
6 files changed, 94 insertions, 3 deletions
diff --git a/include/oox/drawingml/scene3dcontext.hxx b/include/oox/drawingml/scene3dcontext.hxx
index bbee4e677b9f..82af76eba44b 100644
--- a/include/oox/drawingml/scene3dcontext.hxx
+++ b/include/oox/drawingml/scene3dcontext.hxx
@@ -27,6 +27,17 @@ namespace oox { namespace drawingml {
struct Shape3DProperties;
+class Scene3DRotationPropertiesContext : public ::oox::core::ContextHandler2
+{
+public:
+ Scene3DRotationPropertiesContext( ::oox::core::ContextHandler2Helper& rParent, RotationProperties& rRotationProperties ) throw();
+
+ ::oox::core::ContextHandlerRef onCreateContext( ::sal_Int32 Element, const ::oox::AttributeList& rAttribs ) SAL_OVERRIDE;
+
+private:
+ RotationProperties& mrRotationProperties;
+};
+
class Scene3DPropertiesContext : public ::oox::core::ContextHandler2
{
public:
diff --git a/include/oox/drawingml/shape3dproperties.hxx b/include/oox/drawingml/shape3dproperties.hxx
index 9d89753867ab..efce9e0d0566 100644
--- a/include/oox/drawingml/shape3dproperties.hxx
+++ b/include/oox/drawingml/shape3dproperties.hxx
@@ -36,6 +36,13 @@ namespace drawingml {
+struct RotationProperties
+{
+ OptValue< sal_Int32 > mnLatitude;
+ OptValue< sal_Int32 > mnLongitude;
+ OptValue< sal_Int32 > mnRevolution;
+};
+
struct Shape3DProperties
{
OptValue< sal_Int32 > mnPreset;
@@ -43,6 +50,7 @@ struct Shape3DProperties
OptValue< float > mfZoom;
OptValue< sal_Int32 > mnLightRigDirection;
OptValue< sal_Int32 > mnLightRigType;
+ RotationProperties maCameraRotation;
/** Overwrites all members that are explicitly set in rSourceProps. */
void assignUsed( const Shape3DProperties& rSourceProps );
diff --git a/oox/source/drawingml/scene3dcontext.cxx b/oox/source/drawingml/scene3dcontext.cxx
index c9855e116f7e..21c564cd5a62 100644
--- a/oox/source/drawingml/scene3dcontext.cxx
+++ b/oox/source/drawingml/scene3dcontext.cxx
@@ -52,8 +52,9 @@ ContextHandlerRef Scene3DPropertiesContext::onCreateContext( sal_Int32 aElementT
mr3DProperties.mfZoom = rAttribs.getInteger( XML_zoom, 100000 ) / 100000.0;
if( rAttribs.hasAttribute( XML_prst ) )
mr3DProperties.mnPreset = rAttribs.getToken( XML_prst, XML_none );
- // TODO: nested element XML_rot
- break;
+
+ return new Scene3DRotationPropertiesContext( *this, mr3DProperties.maCameraRotation );
+
case A_TOKEN( lightRig ):
mr3DProperties.mnLightRigDirection = rAttribs.getToken( XML_dir, XML_none );
mr3DProperties.mnLightRigType = rAttribs.getToken( XML_rig, XML_none );
@@ -66,6 +67,25 @@ ContextHandlerRef Scene3DPropertiesContext::onCreateContext( sal_Int32 aElementT
return 0;
}
+Scene3DRotationPropertiesContext::Scene3DRotationPropertiesContext( ContextHandler2Helper& rParent, RotationProperties& rRotationProperties ) throw()
+: ContextHandler2( rParent )
+, mrRotationProperties( rRotationProperties )
+{
+}
+
+ContextHandlerRef Scene3DRotationPropertiesContext::onCreateContext( sal_Int32 aElementToken, const AttributeList& rAttribs )
+{
+ switch( aElementToken )
+ {
+ case A_TOKEN( rot ):
+ mrRotationProperties.mnLatitude = rAttribs.getInteger( XML_lat, 0 );
+ mrRotationProperties.mnLongitude = rAttribs.getInteger( XML_lon, 0 );
+ mrRotationProperties.mnRevolution = rAttribs.getInteger( XML_rev, 0 );
+ break;
+ }
+ return 0;
+}
+
} }
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/drawingml/shape3dproperties.cxx b/oox/source/drawingml/shape3dproperties.cxx
index 86498aa3507e..853ed4643285 100644
--- a/oox/source/drawingml/shape3dproperties.cxx
+++ b/oox/source/drawingml/shape3dproperties.cxx
@@ -120,7 +120,7 @@ OUString Shape3DProperties::getCameraPrstName( sal_Int32 nElement )
css::uno::Sequence< css::beans::PropertyValue > Shape3DProperties::getCameraAttributes()
{
- css::uno::Sequence<css::beans::PropertyValue> aSeq(3);
+ css::uno::Sequence<css::beans::PropertyValue> aSeq(6);
sal_Int32 nSize = 0;
if( mfFieldOfVision.has() )
{
@@ -140,6 +140,24 @@ css::uno::Sequence< css::beans::PropertyValue > Shape3DProperties::getCameraAttr
aSeq[nSize].Value = css::uno::Any( getCameraPrstName( mnPreset.use() ) );
nSize++;
}
+ if( maCameraRotation.mnLatitude.has() )
+ {
+ aSeq[nSize].Name = "rotLat";
+ aSeq[nSize].Value = css::uno::Any( maCameraRotation.mnLatitude.use() );
+ nSize++;
+ }
+ if( maCameraRotation.mnLongitude.has() )
+ {
+ aSeq[nSize].Name = "rotLon";
+ aSeq[nSize].Value = css::uno::Any( maCameraRotation.mnLongitude.use() );
+ nSize++;
+ }
+ if( maCameraRotation.mnRevolution.has() )
+ {
+ aSeq[nSize].Name = "rotRev";
+ aSeq[nSize].Value = css::uno::Any( maCameraRotation.mnRevolution.use() );
+ nSize++;
+ }
aSeq.realloc( nSize );
return aSeq;
}
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 6f61016bc387..5d08216cb1e3 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -2288,7 +2288,9 @@ void DrawingML::WriteShape3DEffects( Reference< XPropertySet > xPropSet )
if( aEffectProps.getLength() == 0 )
return;
+ bool bCameraRotationPresent = false;
sax_fastparser::FastAttributeList *aCameraAttrList = mpFS->createAttrList();
+ sax_fastparser::FastAttributeList *aCameraRotationAttrList = mpFS->createAttrList();
for( sal_Int32 i=0; i < aEffectProps.getLength(); ++i )
{
if( aEffectProps[i].Name == "prst" )
@@ -2309,12 +2311,32 @@ void DrawingML::WriteShape3DEffects( Reference< XPropertySet > xPropSet )
aEffectProps[i].Value >>= fVal;
aCameraAttrList->add( XML_zoom, OString::number( fVal * 100000 ).getStr() );
}
+ else if( aEffectProps[i].Name == "rotLat" ||
+ aEffectProps[i].Name == "rotLon" ||
+ aEffectProps[i].Name == "rotRev" )
+ {
+ sal_Int32 nVal = 0, nToken = XML_none;
+ aEffectProps[i].Value >>= nVal;
+ if( aEffectProps[i].Name == "rotLat" )
+ nToken = XML_lat;
+ else if( aEffectProps[i].Name == "rotLon" )
+ nToken = XML_lon;
+ else if( aEffectProps[i].Name == "rotRev" )
+ nToken = XML_rev;
+ aCameraRotationAttrList->add( nToken, OString::number( nVal ).getStr() );
+ bCameraRotationPresent = true;
+ }
}
mpFS->startElementNS( XML_a, XML_scene3d, FSEND );
sax_fastparser::XFastAttributeListRef xAttrList( aCameraAttrList );
mpFS->startElementNS( XML_a, XML_camera, xAttrList );
+ if( bCameraRotationPresent )
+ {
+ sax_fastparser::XFastAttributeListRef xRotAttrList( aCameraRotationAttrList );
+ mpFS->singleElementNS( XML_a, XML_rot, xRotAttrList );
+ }
mpFS->endElementNS( XML_a, XML_camera );
// a:lightRig with Word default values - Word won't open the document if this is not present
diff --git a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
index 5bb9a2170639..e88d320996e6 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlsdrexport.cxx
@@ -1158,11 +1158,23 @@ DECLARE_OOXMLEXPORT_TEST(testShape3DEffectPreservation, "shape-3d-effect-preserv
assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/"
"wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:scene3d/a:camera",
"zoom", "150000");
+ assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/"
+ "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:scene3d/a:camera/a:rot",
+ "lat", "19490639");
+ assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/"
+ "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:scene3d/a:camera/a:rot",
+ "lon", "0");
+ assertXPath(pXmlDoc, "/w:document/w:body/w:p[1]/w:r/mc:AlternateContent/mc:Choice/w:drawing/"
+ "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:scene3d/a:camera/a:rot",
+ "rev", "12900001");
// second shape
assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/"
"wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:scene3d/a:camera",
"prst", "isometricLeftDown");
+ assertXPath(pXmlDoc, "/w:document/w:body/w:p[2]/w:r/mc:AlternateContent/mc:Choice/w:drawing/"
+ "wp:anchor/a:graphic/a:graphicData/wps:wsp/wps:spPr/a:scene3d/a:camera/a:rot",
+ 0);
}
DECLARE_OOXMLEXPORT_TEST(fdo77719, "fdo77719.docx")