[Libreoffice-commits] .: oox/inc oox/source sw/source writerfilter/source

Miklos Vajna vmiklos at kemper.freedesktop.org
Thu Mar 22 03:03:54 PDT 2012


 oox/inc/oox/drawingml/drawingmltypes.hxx          |    2 +-
 oox/inc/oox/vml/vmlshape.hxx                      |    1 +
 oox/source/token/properties.txt                   |    1 +
 oox/source/vml/vmlshape.cxx                       |   14 +++++++++++++-
 oox/source/vml/vmlshapecontext.cxx                |    1 +
 sw/source/core/layout/anchoreddrawobject.cxx      |    7 +++++--
 writerfilter/source/dmapper/DomainMapper_Impl.cxx |    7 +++++++
 7 files changed, 29 insertions(+), 4 deletions(-)

New commits:
commit 51cfbf0cfaec395a99a00f2c20fcba96de9a4427
Author: Miklos Vajna <vmiklos at suse.cz>
Date:   Thu Mar 22 10:34:24 2012 +0100

    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

diff --git a/oox/inc/oox/drawingml/drawingmltypes.hxx b/oox/inc/oox/drawingml/drawingmltypes.hxx
index 600b1bc..71174b3 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 1998a02..37e9c09 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 176ae08..560f879 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 c2fbd65..bdecb8b 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 e0e38ce..91703fc 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;
         }
     }
 }
diff --git a/sw/source/core/layout/anchoreddrawobject.cxx b/sw/source/core/layout/anchoreddrawobject.cxx
index 90db5a3..735878f 100644
--- a/sw/source/core/layout/anchoreddrawobject.cxx
+++ b/sw/source/core/layout/anchoreddrawobject.cxx
@@ -798,12 +798,15 @@ void SwAnchoredDrawObject::_SetPositioningAttr()
         // --> #i71182#
         // only change position - do not lose other attributes
         SwFmtHoriOrient aHori( GetFrmFmt().GetHoriOrient() );
-        aHori.SetPos( nHoriPos );
+        // If the object is already positioned, leave it alone.
+        if (!aHori.GetPos())
+            aHori.SetPos( nHoriPos );
         GetFrmFmt().SetFmtAttr( aHori );
 
         SwFmtVertOrient aVert( GetFrmFmt().GetVertOrient() );
 
-        aVert.SetPos( nVertPos );
+        if (!aVert.GetPos())
+            aVert.SetPos( nVertPos );
         GetFrmFmt().SetFmtAttr( aVert );
 
         // --> #i36010# - set layout direction of the position
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 2f0dd2b..8d81873 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -1513,6 +1513,13 @@ void DomainMapper_Impl::PushShapeContext( const uno::Reference< drawing::XShape
         uno::Reference< lang::XServiceInfo > xSInfo( xShape, uno::UNO_QUERY_THROW );
         bool bIsGraphic = xSInfo->supportsService( rtl::OUString( RTL_CONSTASCII_USTRINGPARAM( "com.sun.star.drawing.GraphicObjectShape" ) ) );
 
+        // If there are position properties, the shape should not be inserted "as character".
+        sal_Int32 nHoriPosition = 0, nVertPosition = 0;
+        xProps->getPropertyValue(rPropNameSupplier.GetName(PROP_HORI_ORIENT_POSITION)) >>= nHoriPosition;
+        xProps->getPropertyValue(rPropNameSupplier.GetName(PROP_VERT_ORIENT_POSITION)) >>= nVertPosition;
+        if (nHoriPosition != 0 || nVertPosition != 0)
+            bIsGraphic = false;
+
         xProps->setPropertyValue(
                 rPropNameSupplier.GetName( PROP_OPAQUE ),
                 uno::makeAny( true ) );


More information about the Libreoffice-commits mailing list