diff options
author | Miklos Vajna <vmiklos@suse.cz> | 2012-03-22 10:34:24 +0100 |
---|---|---|
committer | Miklos Vajna <vmiklos@suse.cz> | 2012-03-22 11:03:26 +0100 |
commit | 51cfbf0cfaec395a99a00f2c20fcba96de9a4427 (patch) | |
tree | e4255430ae83bea9f123c10074be8bd72822294f /oox | |
parent | a75fd2d50e8c0ad82bcd0bbfeafd6a7f0153b7ba (diff) |
n#751054 fix VML import of absolutely positioned pictures
There were multiple issues here:
- convertEmuToHmm() not handling negative values
- position:absolute style property being ignored
- mso-position-vertical-relative is not converted to
text::RelOrientation
- SwAnchoredDrawObject::_SetPositioningAttr() re-positioning already
positioned objects
- DomainMapper_Impl::PushShapeContext() inserting positioned objects as
character
Diffstat (limited to 'oox')
-rw-r--r-- | oox/inc/oox/drawingml/drawingmltypes.hxx | 2 | ||||
-rw-r--r-- | oox/inc/oox/vml/vmlshape.hxx | 1 | ||||
-rw-r--r-- | oox/source/token/properties.txt | 1 | ||||
-rw-r--r-- | oox/source/vml/vmlshape.cxx | 14 | ||||
-rw-r--r-- | oox/source/vml/vmlshapecontext.cxx | 1 |
5 files changed, 17 insertions, 2 deletions
diff --git a/oox/inc/oox/drawingml/drawingmltypes.hxx b/oox/inc/oox/drawingml/drawingmltypes.hxx index 600b1bc6c906..71174b36b43a 100644 --- a/oox/inc/oox/drawingml/drawingmltypes.hxx +++ b/oox/inc/oox/drawingml/drawingmltypes.hxx @@ -156,7 +156,7 @@ inline sal_Int64 convertHmmToEmu( sal_Int32 nValue ) /** Converts the passed 64-bit integer value from EMUs to 1/100 mm. */ inline sal_Int32 convertEmuToHmm( sal_Int64 nValue ) { - return getLimitedValue< sal_Int32, sal_Int64 >( (nValue + EMU_PER_HMM / 2) / EMU_PER_HMM, 0, SAL_MAX_INT32 ); + return getLimitedValue< sal_Int32, sal_Int64 >( (nValue + EMU_PER_HMM / 2) / EMU_PER_HMM, SAL_MIN_INT32, SAL_MAX_INT32 ); } // ============================================================================ diff --git a/oox/inc/oox/vml/vmlshape.hxx b/oox/inc/oox/vml/vmlshape.hxx index 1998a0271c29..37e9c0934849 100644 --- a/oox/inc/oox/vml/vmlshape.hxx +++ b/oox/inc/oox/vml/vmlshape.hxx @@ -79,6 +79,7 @@ struct ShapeTypeModel ::rtl::OUString maHeight; /// Height of the shape bounding box (number with unit). ::rtl::OUString maMarginLeft; /// X position of the shape bounding box to shape anchor (number with unit). ::rtl::OUString maMarginTop; /// Y position of the shape bounding box to shape anchor (number with unit). + ::rtl::OUString maPositionVerticalRelative; /// The Y position is relative to this. StrokeModel maStrokeModel; /// Border line formatting. FillModel maFillModel; /// Shape fill formatting. diff --git a/oox/source/token/properties.txt b/oox/source/token/properties.txt index 176ae084813c..560f87920cbc 100644 --- a/oox/source/token/properties.txt +++ b/oox/source/token/properties.txt @@ -498,6 +498,7 @@ VerticalAlign VerticalSplitMode VerticalSplitPositionTwips VertOrientPosition +VertOrientRelation ViewBox Visible VisibleFlag diff --git a/oox/source/vml/vmlshape.cxx b/oox/source/vml/vmlshape.cxx index c2fbd65eb4f9..bdecb8b4ed69 100644 --- a/oox/source/vml/vmlshape.cxx +++ b/oox/source/vml/vmlshape.cxx @@ -42,6 +42,7 @@ #include <com/sun/star/text/XTextContent.hpp> #include <com/sun/star/text/XTextDocument.hpp> #include <com/sun/star/text/XTextFrame.hpp> +#include <com/sun/star/text/TextContentAnchorType.hpp> #include <rtl/math.hxx> #include <rtl/ustrbuf.hxx> #include "oox/drawingml/shapepropertymap.hxx" @@ -59,6 +60,7 @@ using ::com::sun::star::beans::XPropertySet; using ::com::sun::star::uno::Any; +using namespace ::com::sun::star; using namespace ::com::sun::star::text; namespace oox { @@ -524,11 +526,21 @@ Reference< XShape > ComplexShape::implConvertAndInsert( const Reference< XShapes if( xShape.is() ) { OUString aGraphicUrl = rFilter.getGraphicHelper().importEmbeddedGraphicObject( aGraphicPath ); + PropertySet aPropSet( xShape ); if( !aGraphicUrl.isEmpty() ) { - PropertySet aPropSet( xShape ); aPropSet.setProperty( PROP_GraphicURL, aGraphicUrl ); } + // If the shape has an absolute position, set the properties accordingly. + if (maTypeModel.maPosition.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("absolute"))) + { + aPropSet.setProperty(PROP_HoriOrientPosition, rShapeRect.X); + aPropSet.setProperty(PROP_VertOrientPosition, rShapeRect.Y); + } + if (maTypeModel.maPositionVerticalRelative.equalsAsciiL(RTL_CONSTASCII_STRINGPARAM("page"))) + { + aPropSet.setProperty(PROP_VertOrientRelation, text::RelOrientation::PAGE_FRAME); + } } return xShape; } diff --git a/oox/source/vml/vmlshapecontext.cxx b/oox/source/vml/vmlshapecontext.cxx index e0e38ce70264..91703fc527e9 100644 --- a/oox/source/vml/vmlshapecontext.cxx +++ b/oox/source/vml/vmlshapecontext.cxx @@ -346,6 +346,7 @@ void ShapeTypeContext::setStyle( const OUString& rStyle ) else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "height" ) ) ) mrTypeModel.maHeight = aValue; else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "margin-left" ) ) ) mrTypeModel.maMarginLeft = aValue; else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "margin-top" ) ) ) mrTypeModel.maMarginTop = aValue; + else if( aName.equalsAsciiL( RTL_CONSTASCII_STRINGPARAM( "mso-position-vertical-relative" ) ) ) mrTypeModel.maPositionVerticalRelative = aValue; } } } |