[Libreoffice-commits] core.git: 4 commits - writerfilter/inc writerfilter/Library_writerfilter.mk writerfilter/source

Miklos Vajna vmiklos at collabora.co.uk
Sun Dec 21 10:14:16 PST 2014


 writerfilter/Library_writerfilter.mk                  |    2 
 writerfilter/inc/resourcemodel/TagLogger.hxx          |   83 ------
 writerfilter/inc/resourcemodel/WW8ResourceModel.hxx   |   18 +
 writerfilter/source/dmapper/DomainMapper.cxx          |   31 ++
 writerfilter/source/dmapper/DomainMapper.hxx          |    3 
 writerfilter/source/dmapper/DomainMapper_Impl.cxx     |   11 
 writerfilter/source/dmapper/DomainMapper_Impl.hxx     |   10 
 writerfilter/source/dmapper/GraphicHelpers.cxx        |  116 +++-----
 writerfilter/source/dmapper/GraphicHelpers.hxx        |   11 
 writerfilter/source/dmapper/GraphicImport.cxx         |   14 -
 writerfilter/source/dmapper/GraphicImport.hxx         |    2 
 writerfilter/source/dmapper/LoggedResources.cxx       |   30 ++
 writerfilter/source/dmapper/LoggedResources.hxx       |    7 
 writerfilter/source/dmapper/PropertyMap.hxx           |    2 
 writerfilter/source/dmapper/PropertyMapHelper.cxx     |    2 
 writerfilter/source/dmapper/TableManager.hxx          |    2 
 writerfilter/source/dmapper/TagLogger.cxx             |  243 ++++++++++++++++++
 writerfilter/source/dmapper/TagLogger.hxx             |   83 ++++++
 writerfilter/source/dmapper/dmapperLoggers.hxx        |    2 
 writerfilter/source/ooxml/OOXMLFastContextHandler.cxx |   28 --
 writerfilter/source/resourcemodel/TagLogger.cxx       |  243 ------------------
 writerfilter/source/rtftok/rtfdocumentimpl.cxx        |   41 +--
 22 files changed, 519 insertions(+), 465 deletions(-)

New commits:
commit be34823092ce05002be61a50d0dbf156bb5095ba
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Sun Dec 21 15:08:02 2014 +0100

    writerfilter: hardcoded cFieldStart/Sep/End
    
    Change-Id: If7278418e1c7f8b8f812ce0b01720f8666e9ae5a

diff --git a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
index f00592d..b6ba40e 100644
--- a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
+++ b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
@@ -170,6 +170,10 @@ protected:
     ~BinaryObj() {}
 };
 
+const sal_uInt8 cFieldStart = 0x13;
+const sal_uInt8 cFieldSep = 0x14;
+const sal_uInt8 cFieldEnd = 0x15;
+
 /**
    Handler for a stream.
  */
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index af00497..b85538c 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2856,15 +2856,15 @@ void DomainMapper::lcl_text(const sal_uInt8 * data_, size_t len)
                     m_pImpl->finishParagraph(m_pImpl->GetTopContextOfType(CONTEXT_PARAGRAPH));
                     return;
                 }
-                case 0x13:
+                case cFieldStart:
                     m_pImpl->PushFieldContext();
                     return;
-                case 0x14:
+                case cFieldSep:
                     // delimiter not necessarily available
                     // appears only if field contains further content
                     m_pImpl->CloseFieldCommand();
                     return;
-                case 0x15: /* end of field */
+                case cFieldEnd:
                     m_pImpl->PopFieldContext();
                     return;
                 default:
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index df119b5..678b19e 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -2551,9 +2551,6 @@ uno::Reference< beans::XPropertySet > DomainMapper_Impl::FindOrCreateFieldMaster
     return xMaster;
 }
 
-/*-------------------------------------------------------------------------
-//field context starts with a 0x13
-  -----------------------------------------------------------------------*/
 void DomainMapper_Impl::PushFieldContext()
 {
     m_bParaHadField = true;
@@ -3389,9 +3386,6 @@ void DomainMapper_Impl::handleIndex
     }
 }
 
-/*-------------------------------------------------------------------------
-//the field command has to be closed (0x14 appeared)
-  -----------------------------------------------------------------------*/
 void DomainMapper_Impl::CloseFieldCommand()
 {
     if(m_bDiscardHeaderFooter)
@@ -4278,9 +4272,6 @@ void DomainMapper_Impl::SetFieldFFData(FFDataHandler::Pointer_t pFFDataHandler)
 #endif
 }
 
-/*-------------------------------------------------------------------------
-//the end of field is reached (0x15 appeared) - the command might still be open
-  -----------------------------------------------------------------------*/
 void DomainMapper_Impl::PopFieldContext()
 {
     if(m_bDiscardHeaderFooter)
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 3a9658f..3cabbf5 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -614,7 +614,7 @@ public:
     void PushAnnotation();
     void PopAnnotation();
 
-    //field context starts with a 0x13
+    /// A field context starts with a cFieldStart.
     void PushFieldContext();
     //the current field context waits for the completion of the command
     bool IsOpenFieldCommand() const;
@@ -662,7 +662,7 @@ public:
         (FieldContextPtr pContext,
         PropertyNameSupplier& rPropNameSupplier,
         const OUString & sTOCServiceName);
-    //the field command has to be closed (0x14 appeared)
+    /// The field command has to be closed (cFieldSep appeared).
     void CloseFieldCommand();
     //the _current_ fields require a string type result while TOCs accept richt results
     bool IsFieldResultAsString();
@@ -671,7 +671,7 @@ public:
     void SetFieldResult(OUString const& rResult);
     // set FFData of top field context
     void SetFieldFFData( FFDataHandler::Pointer_t pFFDataHandler );
-    //the end of field is reached (0x15 appeared) - the command might still be open
+    /// The end of field is reached (cFieldEnd appeared) - the command might still be open.
     void PopFieldContext();
 
     void SetBookmarkName( const OUString& rBookmarkName );
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 69f953f..9fcd1d9 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -43,9 +43,6 @@ static const sal_Unicode uNoBreakHyphen = 0x2011;
 static const sal_Unicode uSoftHyphen = 0xAD;
 
 static const sal_uInt8 cFtnEdnCont = 0x4;
-static const sal_uInt8 cFieldStart = 0x13;
-static const sal_uInt8 cFieldSep = 0x14;
-static const sal_uInt8 cFieldEnd = 0x15;
 static const sal_uInt8 cFieldLock = 0x8;
 
 namespace writerfilter {
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index cd2ec81..1c605dd 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -1551,7 +1551,7 @@ int RTFDocumentImpl::dispatchDestination(RTFKeyword nKeyword)
             if (aBuf.toString().indexOf(OString("FORM")) != -1)
                 m_bFormField = true;
 
-            singleChar(0x13);
+            singleChar(cFieldStart);
             m_aStates.top().nDestinationState = DESTINATION_FIELDINSTRUCTION;
         }
         break;
@@ -2391,10 +2391,10 @@ int RTFDocumentImpl::dispatchSymbol(RTFKeyword nKeyword)
     case RTF_CHPGN:
     {
         OUString aStr("PAGE");
-        singleChar(0x13);
+        singleChar(cFieldStart);
         text(aStr);
-        singleChar(0x14, true);
-        singleChar(0x15);
+        singleChar(cFieldSep, true);
+        singleChar(cFieldEnd);
     }
     break;
     case RTF_CHFTNSEP:
@@ -5098,11 +5098,11 @@ int RTFDocumentImpl::popState()
         }
         m_aFormfieldAttributes.clear();
         m_aFormfieldSprms.clear();
-        singleChar(0x14);
+        singleChar(cFieldSep);
     }
     break;
     case DESTINATION_FIELDRESULT:
-        singleChar(0x15);
+        singleChar(cFieldEnd);
         break;
     case DESTINATION_LEVELTEXT:
     {
@@ -5212,11 +5212,11 @@ int RTFDocumentImpl::popState()
         OUString const field(
             (DESTINATION_INDEXENTRY == aState.nDestinationState) ? OUStringLiteral("XE") : OUStringLiteral("TC"));
         str = field + " \"" + str.replaceAll("\"", "\\\"") + "\"";
-        singleChar(0x13);
+        singleChar(cFieldStart);
         Mapper().utext(reinterpret_cast<sal_uInt8 const*>(str.getStr()), str.getLength());
-        singleChar(0x14);
+        singleChar(cFieldSep);
         // no result
-        singleChar(0x15);
+        singleChar(cFieldEnd);
     }
     break;
     case DESTINATION_FORMFIELDNAME:
@@ -5987,7 +5987,7 @@ int RTFDocumentImpl::popState()
         break;
     case DESTINATION_FIELD:
         if (aState.nFieldStatus == FIELD_INSTRUCTION)
-            singleChar(0x15);
+            singleChar(cFieldEnd);
         break;
     case DESTINATION_SHAPEPROPERTYVALUEPICT:
         if (!m_aStates.empty())
commit 94b068298de792d5662c21c467e822c32e173434
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Sun Dec 21 14:51:10 2014 +0100

    TagLogger is used only in dmapper
    
    Change-Id: Ic88909ded4a28b1c019a03eefdaf3716cfbe9079

diff --git a/writerfilter/Library_writerfilter.mk b/writerfilter/Library_writerfilter.mk
index 3516777..e84bf5b 100644
--- a/writerfilter/Library_writerfilter.mk
+++ b/writerfilter/Library_writerfilter.mk
@@ -106,6 +106,7 @@ $(eval $(call gb_Library_add_exception_objects,writerfilter,\
     writerfilter/source/dmapper/TableManager \
     writerfilter/source/dmapper/TablePositionHandler \
     writerfilter/source/dmapper/TablePropertiesHandler \
+	writerfilter/source/dmapper/TagLogger \
     writerfilter/source/dmapper/TextEffectsHandler \
     writerfilter/source/dmapper/TblStylePrHandler \
     writerfilter/source/dmapper/ThemeTable \
@@ -126,7 +127,6 @@ $(eval $(call gb_Library_add_exception_objects,writerfilter,\
     writerfilter/source/ooxml/OOXMLStreamImpl \
     writerfilter/source/ooxml/qnametostrcore \
     writerfilter/source/resourcemodel/ResourceModelHelper \
-    writerfilter/source/resourcemodel/TagLogger \
 ))
 
 $(eval $(call gb_Library_add_generated_exception_objects,writerfilter,\
diff --git a/writerfilter/source/dmapper/LoggedResources.hxx b/writerfilter/source/dmapper/LoggedResources.hxx
index 6162408..78d2920 100644
--- a/writerfilter/source/dmapper/LoggedResources.hxx
+++ b/writerfilter/source/dmapper/LoggedResources.hxx
@@ -21,7 +21,7 @@
 #define INCLUDED_WRITERFILTER_SOURCE_DMAPPER_LOGGEDRESOURCES_HXX
 
 #include <resourcemodel/WW8ResourceModel.hxx>
-#include <resourcemodel/TagLogger.hxx>
+#include "TagLogger.hxx"
 
 
 namespace writerfilter
diff --git a/writerfilter/source/dmapper/PropertyMap.hxx b/writerfilter/source/dmapper/PropertyMap.hxx
index 36d7705..71a92d9 100644
--- a/writerfilter/source/dmapper/PropertyMap.hxx
+++ b/writerfilter/source/dmapper/PropertyMap.hxx
@@ -30,7 +30,7 @@
 #include <map>
 #include <vector>
 
-#include <resourcemodel/TagLogger.hxx>
+#include "TagLogger.hxx"
 
 namespace com{namespace sun{namespace star{
     namespace beans{
diff --git a/writerfilter/source/dmapper/PropertyMapHelper.cxx b/writerfilter/source/dmapper/PropertyMapHelper.cxx
index 278b0cf..ad503a6 100644
--- a/writerfilter/source/dmapper/PropertyMapHelper.cxx
+++ b/writerfilter/source/dmapper/PropertyMapHelper.cxx
@@ -18,7 +18,7 @@
  */
 
 #include <com/sun/star/text/TableColumnSeparator.hpp>
-#include <resourcemodel/TagLogger.hxx>
+#include "TagLogger.hxx"
 #include "PropertyMapHelper.hxx"
 
 namespace writerfilter
diff --git a/writerfilter/source/dmapper/TableManager.hxx b/writerfilter/source/dmapper/TableManager.hxx
index a01a3a3..018b7d9 100644
--- a/writerfilter/source/dmapper/TableManager.hxx
+++ b/writerfilter/source/dmapper/TableManager.hxx
@@ -26,7 +26,7 @@
 
 #include <boost/shared_ptr.hpp>
 #include <stack>
-#include <resourcemodel/TagLogger.hxx>
+#include "TagLogger.hxx"
 
 #include <rtl/strbuf.hxx>
 #include <PropertyMap.hxx>
diff --git a/writerfilter/source/resourcemodel/TagLogger.cxx b/writerfilter/source/dmapper/TagLogger.cxx
similarity index 99%
rename from writerfilter/source/resourcemodel/TagLogger.cxx
rename to writerfilter/source/dmapper/TagLogger.cxx
index d6c17b5..5865e32 100644
--- a/writerfilter/source/resourcemodel/TagLogger.cxx
+++ b/writerfilter/source/dmapper/TagLogger.cxx
@@ -19,7 +19,7 @@
 
 #include <libxml/xmlstring.h>
 #include <string.h>
-#include <resourcemodel/TagLogger.hxx>
+#include "TagLogger.hxx"
 #include <ooxml/QNameToString.hxx>
 #include <boost/unordered_map.hpp>
 
diff --git a/writerfilter/inc/resourcemodel/TagLogger.hxx b/writerfilter/source/dmapper/TagLogger.hxx
similarity index 93%
rename from writerfilter/inc/resourcemodel/TagLogger.hxx
rename to writerfilter/source/dmapper/TagLogger.hxx
index b5e5d67..e704310 100644
--- a/writerfilter/inc/resourcemodel/TagLogger.hxx
+++ b/writerfilter/source/dmapper/TagLogger.hxx
@@ -17,8 +17,8 @@
  *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
  */
 
-#ifndef INCLUDED_WRITERFILTER_INC_RESOURCEMODEL_TAGLOGGER_HXX
-#define INCLUDED_WRITERFILTER_INC_RESOURCEMODEL_TAGLOGGER_HXX
+#ifndef INCLUDED_WRITERFILTER_SOURCE_DMAPPER_TAGLOGGER_HXX
+#define INCLUDED_WRITERFILTER_SOURCE_DMAPPER_TAGLOGGER_HXX
 
 #include <rtl/ustring.hxx>
 #include <com/sun/star/beans/XPropertySet.hpp>
@@ -78,6 +78,6 @@ namespace writerfilter
     };
 }
 
-#endif // INCLUDED_WRITERFILTER_INC_RESOURCEMODEL_TAGLOGGER_HXX
+#endif // INCLUDED_WRITERFILTER_SOURCE_DMAPPER_TAGLOGGER_HXX
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/dmapper/dmapperLoggers.hxx b/writerfilter/source/dmapper/dmapperLoggers.hxx
index 4ef17c3..5e774c9 100644
--- a/writerfilter/source/dmapper/dmapperLoggers.hxx
+++ b/writerfilter/source/dmapper/dmapperLoggers.hxx
@@ -20,7 +20,7 @@
 #ifndef INCLUDED_WRITERFILTER_SOURCE_DMAPPER_DMAPPERLOGGERS_HXX
 #define INCLUDED_WRITERFILTER_SOURCE_DMAPPER_DMAPPERLOGGERS_HXX
 
-#include <resourcemodel/TagLogger.hxx>
+#include "TagLogger.hxx"
 
 namespace writerfilter {
     namespace dmapper {
commit a3a049840f101cd47e0ec04afef1964c61641a85
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Sun Dec 21 14:22:13 2014 +0100

    writerfilter: refactor to get rid of remaining scary PositionHandler statics
    
    Change-Id: I954504ad6b730866504a470b8d966fdfe1d58550

diff --git a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
index 7bdfeea..f00592d 100644
--- a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
+++ b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
@@ -248,6 +248,12 @@ public:
     virtual void positionOffset(const OUString& rText, bool bVertical) = 0;
     /// Returns the last set offsets of a shape in HMM.
     virtual css::awt::Point getPositionOffset() = 0;
+    /**
+     * Horizontal and vertical alignment for a shape.
+     *
+     * Call *before* an ooxml:CT_PosH/V_align sprm is sent.
+     */
+    virtual void align(const OUString& rText, bool bVertical) = 0;
     virtual void positivePercentage(const OUString& rText) = 0;
 
     /**
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index eb10e40..af00497 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -2924,6 +2924,14 @@ awt::Point DomainMapper::getPositionOffset()
     return aRet;
 }
 
+void DomainMapper::lcl_align(const OUString& rText, bool bVertical)
+{
+    if (bVertical)
+        m_pImpl->m_aAligns.second = rText;
+    else
+        m_pImpl->m_aAligns.first = rText;
+}
+
 void DomainMapper::lcl_positivePercentage(const OUString& rText)
 {
     m_pImpl->m_aPositivePercentages.push(rText);
diff --git a/writerfilter/source/dmapper/DomainMapper.hxx b/writerfilter/source/dmapper/DomainMapper.hxx
index 013fe2d..5fc092d 100644
--- a/writerfilter/source/dmapper/DomainMapper.hxx
+++ b/writerfilter/source/dmapper/DomainMapper.hxx
@@ -147,6 +147,7 @@ private:
     virtual void lcl_utext(const sal_uInt8 * data, size_t len) SAL_OVERRIDE;
     virtual void lcl_positionOffset(const OUString& rText, bool bVertical) SAL_OVERRIDE;
     virtual css::awt::Point getPositionOffset() SAL_OVERRIDE;
+    virtual void lcl_align(const OUString& rText, bool bVertical) SAL_OVERRIDE;
     virtual void lcl_positivePercentage(const OUString& rText) SAL_OVERRIDE;
     virtual void lcl_props(writerfilter::Reference<Properties>::Pointer_t ref) SAL_OVERRIDE;
     virtual void lcl_table(Id name,
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index 4e0835f..df119b5 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -4557,7 +4557,7 @@ void DomainMapper_Impl::AddAnnotationPosition(
 GraphicImportPtr DomainMapper_Impl::GetGraphicImport(GraphicImportType eGraphicImportType)
 {
     if(!m_pGraphicImport)
-        m_pGraphicImport.reset( new GraphicImport( m_xComponentContext, m_xTextFactory, m_rDMapper, eGraphicImportType, m_aPositionOffsets, m_aPositivePercentages ) );
+        m_pGraphicImport.reset( new GraphicImport( m_xComponentContext, m_xTextFactory, m_rDMapper, eGraphicImportType, m_aPositionOffsets, m_aAligns, m_aPositivePercentages ) );
     return m_pGraphicImport;
 }
 /*-------------------------------------------------------------------------
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index c2ccf2b..3a9658f 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -828,6 +828,8 @@ public:
 
     /// ST_PositionOffset values we received
     std::pair<OUString, OUString> m_aPositionOffsets;
+    /// ST_AlignH/V values we received
+    std::pair<OUString, OUString> m_aAligns;
     /// ST_PositivePercentage values we received
     std::queue<OUString> m_aPositivePercentages;
     bool isInIndexContext() { return m_bStartIndex;}
diff --git a/writerfilter/source/dmapper/GraphicHelpers.cxx b/writerfilter/source/dmapper/GraphicHelpers.cxx
index 53143dd..de940e5 100644
--- a/writerfilter/source/dmapper/GraphicHelpers.cxx
+++ b/writerfilter/source/dmapper/GraphicHelpers.cxx
@@ -39,24 +39,14 @@ namespace dmapper {
 
 using namespace com::sun::star;
 
-int PositionHandler::savedAlignV = text::VertOrientation::NONE;
-int PositionHandler::savedAlignH = text::HoriOrientation::NONE;
-
-PositionHandler::PositionHandler( bool vertical, std::pair<OUString, OUString>& rPositionOffsets ) :
+PositionHandler::PositionHandler( std::pair<OUString, OUString>& rPositionOffsets, std::pair<OUString, OUString>& rAligns ) :
 LoggedProperties(dmapper_logger, "PositionHandler"),
-m_rPositionOffsets(rPositionOffsets)
+m_nOrient(text::VertOrientation::NONE),
+m_nPosition(0),
+m_rPositionOffsets(rPositionOffsets),
+m_rAligns(rAligns)
 {
     m_nRelation = text::RelOrientation::FRAME;
-    if( vertical )
-    {
-        m_nOrient = savedAlignV;
-        savedAlignV = text::VertOrientation::NONE;
-    }
-    else
-    {
-        m_nOrient = savedAlignH;
-        savedAlignH = text::HoriOrientation::NONE;
-    }
 }
 
 PositionHandler::~PositionHandler( )
@@ -140,6 +130,36 @@ void PositionHandler::lcl_sprm(Sprm& rSprm)
         case NS_ooxml::LN_CT_PosV_posOffset:
             m_nPosition = oox::drawingml::convertEmuToHmm(m_rPositionOffsets.second.toInt32());
             break;
+        case NS_ooxml::LN_CT_PosH_align:
+        {
+            OUString& rAlign = m_rAligns.first;
+            if (rAlign == "left")
+                m_nOrient = text::HoriOrientation::LEFT;
+            else if (rAlign == "right")
+                m_nOrient = text::HoriOrientation::RIGHT;
+            else if (rAlign == "center")
+                m_nOrient = text::HoriOrientation::CENTER;
+            else if (rAlign == "inside")
+                m_nOrient = text::HoriOrientation::INSIDE;
+            else if (rAlign == "outside")
+                m_nOrient = text::HoriOrientation::OUTSIDE;
+            break;
+        }
+        case NS_ooxml::LN_CT_PosV_align:
+        {
+            OUString& rAlign = m_rAligns.second;
+            if (rAlign == "top")
+                m_nOrient = text::VertOrientation::TOP;
+            else if (rAlign == "bottom")
+                m_nOrient = text::VertOrientation::BOTTOM;
+            else if (rAlign == "center")
+                m_nOrient = text::VertOrientation::CENTER;
+            else if (rAlign == "inside")
+                m_nOrient = text::VertOrientation::NONE;
+            else if (rAlign == "outside")
+                m_nOrient = text::VertOrientation::NONE;
+            break;
+        }
     }
 }
 
@@ -156,36 +176,6 @@ sal_Int16 PositionHandler::orientation() const
     return m_nOrient;
 }
 
-
-
-void PositionHandler::setAlignH(const OUString & sText)
-{
-    if( sText == "left")
-        savedAlignH = text::HoriOrientation::LEFT;
-    else if( sText == "right" )
-        savedAlignH = text::HoriOrientation::RIGHT;
-    else if( sText == "center" )
-        savedAlignH = text::HoriOrientation::CENTER;
-    else if( sText == "inside" )
-        savedAlignH = text::HoriOrientation::INSIDE;
-    else if( sText == "outside" )
-        savedAlignH = text::HoriOrientation::OUTSIDE;
-}
-
-void PositionHandler::setAlignV(const OUString & sText)
-{
-    if( sText == "top" )
-        savedAlignV = text::VertOrientation::TOP;
-    else if( sText == "bottom" )
-        savedAlignV = text::VertOrientation::BOTTOM;
-    else if( sText == "center" )
-        savedAlignV = text::VertOrientation::CENTER;
-    else if( sText == "inside" )
-        savedAlignV = text::VertOrientation::NONE;
-    else if( sText == "outside" )
-        savedAlignV = text::VertOrientation::NONE;
-}
-
 WrapHandler::WrapHandler( ) :
 LoggedProperties(dmapper_logger, "WrapHandler"),
     m_nType( 0 ),
diff --git a/writerfilter/source/dmapper/GraphicHelpers.hxx b/writerfilter/source/dmapper/GraphicHelpers.hxx
index 68eca32..f2f791c 100644
--- a/writerfilter/source/dmapper/GraphicHelpers.hxx
+++ b/writerfilter/source/dmapper/GraphicHelpers.hxx
@@ -34,10 +34,8 @@ namespace dmapper
 class PositionHandler: public LoggedProperties
 {
 public:
-    PositionHandler( bool vertical, std::pair<OUString, OUString>& rPositionOffsets );
+    PositionHandler( std::pair<OUString, OUString>& rPositionOffsets, std::pair<OUString, OUString>& rAligns );
     virtual ~PositionHandler( );
-    static void setAlignH(const OUString & sText);
-    static void setAlignV(const OUString & sText);
     sal_Int16 orientation() const;
     sal_Int16 relation() const { return m_nRelation;}
     sal_Int32 position() const { return m_nPosition;}
@@ -47,8 +45,8 @@ public:
     sal_Int16 m_nOrient;
     sal_Int16 m_nRelation;
     sal_Int32 m_nPosition;
-    static int savedAlignV, savedAlignH;
     std::pair<OUString, OUString>& m_rPositionOffsets;
+    std::pair<OUString, OUString>& m_rAligns;
 };
 typedef boost::shared_ptr<PositionHandler> PositionHandlerPtr;
 
diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx
index fae9b3d..9f91f30 100644
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ b/writerfilter/source/dmapper/GraphicImport.cxx
@@ -262,6 +262,7 @@ public:
     OUString sAlternativeText;
     OUString title;
     std::pair<OUString, OUString>& m_rPositionOffsets;
+    std::pair<OUString, OUString>& m_rAligns;
     std::queue<OUString>& m_rPositivePercentages;
     OUString sAnchorId;
     comphelper::SequenceAsHashMap m_aInteropGrabBag;
@@ -270,7 +271,7 @@ public:
     boost::optional<sal_Int32> m_oEffectExtentRight;
     boost::optional<sal_Int32> m_oEffectExtentBottom;
 
-    GraphicImport_Impl(GraphicImportType eImportType, DomainMapper&   rDMapper, std::pair<OUString, OUString>& rPositionOffsets, std::queue<OUString>& rPositivePercentages) :
+    GraphicImport_Impl(GraphicImportType eImportType, DomainMapper& rDMapper, std::pair<OUString, OUString>& rPositionOffsets, std::pair<OUString, OUString>& rAligns, std::queue<OUString>& rPositivePercentages) :
         nXSize(0)
         ,bXSizeValid(false)
         ,nYSize(0)
@@ -322,6 +323,7 @@ public:
         ,bPositionProtected(false)
         ,nShapeOptionType(0)
         ,m_rPositionOffsets(rPositionOffsets)
+        ,m_rAligns(rAligns)
         ,m_rPositivePercentages(rPositivePercentages)
     {}
 
@@ -447,11 +449,12 @@ GraphicImport::GraphicImport(uno::Reference<uno::XComponentContext> const& xComp
                              DomainMapper& rDMapper,
                              GraphicImportType eImportType,
                              std::pair<OUString, OUString>& rPositionOffsets,
+                             std::pair<OUString, OUString>& rAligns,
                              std::queue<OUString>& rPositivePercentages)
 : LoggedProperties(dmapper_logger, "GraphicImport")
 , LoggedTable(dmapper_logger, "GraphicImport")
 , LoggedStream(dmapper_logger, "GraphicImport")
-, m_pImpl(new GraphicImport_Impl(eImportType, rDMapper, rPositionOffsets, rPositivePercentages))
+, m_pImpl(new GraphicImport_Impl(eImportType, rDMapper, rPositionOffsets, rAligns, rPositivePercentages))
 , m_xComponentContext(xComponentContext)
 , m_xTextFactory(xTextFactory)
 {
@@ -1048,7 +1051,7 @@ void GraphicImport::lcl_sprm(Sprm& rSprm)
         case NS_ooxml::LN_CT_Anchor_positionH: // 90976;
         {
             // Use a special handler for the positionning
-            PositionHandlerPtr pHandler( new PositionHandler( false, m_pImpl->m_rPositionOffsets ));
+            PositionHandlerPtr pHandler( new PositionHandler( m_pImpl->m_rPositionOffsets, m_pImpl->m_rAligns ));
             writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
             if( pProperties.get( ) )
             {
@@ -1074,7 +1077,7 @@ void GraphicImport::lcl_sprm(Sprm& rSprm)
         case NS_ooxml::LN_CT_Anchor_positionV: // 90977;
         {
             // Use a special handler for the positionning
-            PositionHandlerPtr pHandler( new PositionHandler( true, m_pImpl->m_rPositionOffsets ));
+            PositionHandlerPtr pHandler( new PositionHandler( m_pImpl->m_rPositionOffsets, m_pImpl->m_rAligns));
             writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
             if( pProperties.get( ) )
             {
diff --git a/writerfilter/source/dmapper/GraphicImport.hxx b/writerfilter/source/dmapper/GraphicImport.hxx
index 89fc5c1..0d5c07c 100644
--- a/writerfilter/source/dmapper/GraphicImport.hxx
+++ b/writerfilter/source/dmapper/GraphicImport.hxx
@@ -84,6 +84,7 @@ public:
                             DomainMapper& rDomainMapper,
                             GraphicImportType eGraphicImportType,
                             std::pair<OUString, OUString>& rPositionOffsets,
+                            std::pair<OUString, OUString>& rAligns,
                             std::queue<OUString>& rPositivePercentages);
     virtual ~GraphicImport();
 
diff --git a/writerfilter/source/dmapper/LoggedResources.cxx b/writerfilter/source/dmapper/LoggedResources.cxx
index 3fafd30..9f430a4 100644
--- a/writerfilter/source/dmapper/LoggedResources.cxx
+++ b/writerfilter/source/dmapper/LoggedResources.cxx
@@ -219,6 +219,21 @@ void LoggedStream::positionOffset(const OUString& rText, bool bVertical)
 #endif
 }
 
+void LoggedStream::align(const OUString& rText, bool bVertical)
+{
+#ifdef DEBUG_WRITERFILTER
+    mHelper.startElement("align");
+    mHelper.attribute("vertical", static_cast<int>(bVertical));
+    mHelper.chars(rText);
+#endif
+
+    lcl_align(rText, bVertical);
+
+#ifdef DEBUG_WRITERFILTER
+    mHelper.endElement("align");
+#endif
+}
+
 void LoggedStream::positivePercentage(const OUString& rText)
 {
 #ifdef DEBUG_WRITERFILTER
diff --git a/writerfilter/source/dmapper/LoggedResources.hxx b/writerfilter/source/dmapper/LoggedResources.hxx
index 2524485..6162408 100644
--- a/writerfilter/source/dmapper/LoggedResources.hxx
+++ b/writerfilter/source/dmapper/LoggedResources.hxx
@@ -64,6 +64,7 @@ public:
     void text(const sal_uInt8 * data, size_t len) SAL_OVERRIDE;
     void utext(const sal_uInt8 * data, size_t len) SAL_OVERRIDE;
     void positionOffset(const OUString& rText, bool bVertical) SAL_OVERRIDE;
+    void align(const OUString& rText, bool bVertical) SAL_OVERRIDE;
     void positivePercentage(const OUString& rText) SAL_OVERRIDE;
     void props(writerfilter::Reference<Properties>::Pointer_t ref) SAL_OVERRIDE;
     void table(Id name, writerfilter::Reference<Table>::Pointer_t ref) SAL_OVERRIDE;
@@ -83,6 +84,7 @@ protected:
     virtual void lcl_utext(const sal_uInt8 * data, size_t len) = 0;
     virtual void lcl_positionOffset(const OUString& /*rText*/, bool /*bVertical*/) { }
     virtual css::awt::Point getPositionOffset() { return css::awt::Point(); }
+    virtual void lcl_align(const OUString& /*rText*/, bool /*bVertical*/) { }
     virtual void lcl_positivePercentage(const OUString& /*rText*/) { }
     virtual void lcl_props(writerfilter::Reference<Properties>::Pointer_t ref) = 0;
     virtual void lcl_table(Id name, writerfilter::Reference<Table>::Pointer_t ref) = 0;
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index 3c7094f..69f953f 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -26,7 +26,6 @@
 #include <ooxml/QNameToString.hxx>
 #include <ooxml/resourceids.hxx>
 #include <oox/token/namespaces.hxx>
-#include <dmapper/GraphicHelpers.hxx>
 #include <comphelper/embeddedobjectcontainer.hxx>
 #include <tools/globname.hxx>
 #include <comphelper/classids.hxx>
@@ -666,16 +665,16 @@ void OOXMLFastContextHandler::ignore()
 {
 }
 
-void OOXMLFastContextHandler::alignH(const OUString & sText)
+void OOXMLFastContextHandler::alignH(const OUString& rText)
 {
     if (isForwardEvents())
-        ::writerfilter::dmapper::PositionHandler::setAlignH( sText );
+        mpStream->align(rText, /*bVertical=*/false);
 }
 
-void OOXMLFastContextHandler::alignV(const OUString & sText)
+void OOXMLFastContextHandler::alignV(const OUString& rText)
 {
     if (isForwardEvents())
-        ::writerfilter::dmapper::PositionHandler::setAlignV( sText );
+        mpStream->align(rText, /*bVertical=*/true);
 }
 
 void OOXMLFastContextHandler::positivePercentage(const OUString& rText)
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 36ceed1..cd2ec81 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -34,7 +34,6 @@
 #include <ooxml/resourceids.hxx>
 #include <oox/token/namespaces.hxx>
 #include <oox/drawingml/drawingmltypes.hxx>
-#include <dmapper/GraphicHelpers.hxx>
 #include <rtfsdrimport.hxx>
 #include <rtflookahead.hxx>
 #include <rtfcharsets.hxx>
commit 44ea0b3a2550a79148fb86f3e7175fffe77674b4
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Sun Dec 21 11:12:40 2014 +0100

    writerfilter: refactor to get rid of savedPositionOffset{V,H} statics
    
    Which are extremely scary, allowing a shape position from one doc to
    appear in an other if two writerfilter import is in progress at the same
    time.
    
    This partially reverts 8fa1a0874765ea7db57e496f1d92731b9ab09280 (read
    wp:positionOffset, wp:alignV and wp:alignH properly (bnc#513579),
    2011-05-04).
    
    Change-Id: I0fcddf88fa56f5f9288e47bcd100c38ee9cf2f13

diff --git a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
index b4254b6..7bdfeea 100644
--- a/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
+++ b/writerfilter/inc/resourcemodel/WW8ResourceModel.hxx
@@ -240,6 +240,14 @@ public:
      */
     virtual void utext(const sal_uInt8 * data, size_t len) = 0;
 
+    /**
+     * Offset in EMUs for a shape.
+     *
+     * Call *before* an ooxml::CT_PosH/V_posOffset sprm is sent.
+     */
+    virtual void positionOffset(const OUString& rText, bool bVertical) = 0;
+    /// Returns the last set offsets of a shape in HMM.
+    virtual css::awt::Point getPositionOffset() = 0;
     virtual void positivePercentage(const OUString& rText) = 0;
 
     /**
diff --git a/writerfilter/source/dmapper/DomainMapper.cxx b/writerfilter/source/dmapper/DomainMapper.cxx
index e6cf4fe..eb10e40 100644
--- a/writerfilter/source/dmapper/DomainMapper.cxx
+++ b/writerfilter/source/dmapper/DomainMapper.cxx
@@ -28,6 +28,7 @@
 #include <i18nlangtag/languagetag.hxx>
 #include <i18nutil/paper.hxx>
 #include <oox/token/tokens.hxx>
+#include <oox/drawingml/drawingmltypes.hxx>
 #include <com/sun/star/document/XDocumentPropertiesSupplier.hpp>
 #include <com/sun/star/document/XOOXMLDocumentPropertiesImporter.hpp>
 #include <com/sun/star/table/ShadowFormat.hpp>
@@ -2907,6 +2908,22 @@ void DomainMapper::lcl_text(const sal_uInt8 * data_, size_t len)
     }
 }
 
+void DomainMapper::lcl_positionOffset(const OUString& rText, bool bVertical)
+{
+    if (bVertical)
+        m_pImpl->m_aPositionOffsets.second = rText;
+    else
+        m_pImpl->m_aPositionOffsets.first = rText;
+}
+
+awt::Point DomainMapper::getPositionOffset()
+{
+    awt::Point aRet;
+    aRet.X = oox::drawingml::convertEmuToHmm(m_pImpl->m_aPositionOffsets.first.toInt32());
+    aRet.Y = oox::drawingml::convertEmuToHmm(m_pImpl->m_aPositionOffsets.second.toInt32());
+    return aRet;
+}
+
 void DomainMapper::lcl_positivePercentage(const OUString& rText)
 {
     m_pImpl->m_aPositivePercentages.push(rText);
diff --git a/writerfilter/source/dmapper/DomainMapper.hxx b/writerfilter/source/dmapper/DomainMapper.hxx
index 67c16f3..013fe2d 100644
--- a/writerfilter/source/dmapper/DomainMapper.hxx
+++ b/writerfilter/source/dmapper/DomainMapper.hxx
@@ -145,6 +145,8 @@ private:
 
     virtual void lcl_text(const sal_uInt8 * data, size_t len) SAL_OVERRIDE;
     virtual void lcl_utext(const sal_uInt8 * data, size_t len) SAL_OVERRIDE;
+    virtual void lcl_positionOffset(const OUString& rText, bool bVertical) SAL_OVERRIDE;
+    virtual css::awt::Point getPositionOffset() SAL_OVERRIDE;
     virtual void lcl_positivePercentage(const OUString& rText) SAL_OVERRIDE;
     virtual void lcl_props(writerfilter::Reference<Properties>::Pointer_t ref) SAL_OVERRIDE;
     virtual void lcl_table(Id name,
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.cxx b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
index a3694bd..4e0835f 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.cxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.cxx
@@ -4557,7 +4557,7 @@ void DomainMapper_Impl::AddAnnotationPosition(
 GraphicImportPtr DomainMapper_Impl::GetGraphicImport(GraphicImportType eGraphicImportType)
 {
     if(!m_pGraphicImport)
-        m_pGraphicImport.reset( new GraphicImport( m_xComponentContext, m_xTextFactory, m_rDMapper, eGraphicImportType, m_aPositivePercentages ) );
+        m_pGraphicImport.reset( new GraphicImport( m_xComponentContext, m_xTextFactory, m_rDMapper, eGraphicImportType, m_aPositionOffsets, m_aPositivePercentages ) );
     return m_pGraphicImport;
 }
 /*-------------------------------------------------------------------------
diff --git a/writerfilter/source/dmapper/DomainMapper_Impl.hxx b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
index 30fef54..c2ccf2b 100644
--- a/writerfilter/source/dmapper/DomainMapper_Impl.hxx
+++ b/writerfilter/source/dmapper/DomainMapper_Impl.hxx
@@ -826,6 +826,8 @@ public:
     /// A sub-grabbag of m_aInteropGrabBag, like 'spacing'.
     std::vector<css::beans::PropertyValue> m_aSubInteropGrabBag;
 
+    /// ST_PositionOffset values we received
+    std::pair<OUString, OUString> m_aPositionOffsets;
     /// ST_PositivePercentage values we received
     std::queue<OUString> m_aPositivePercentages;
     bool isInIndexContext() { return m_bStartIndex;}
diff --git a/writerfilter/source/dmapper/GraphicHelpers.cxx b/writerfilter/source/dmapper/GraphicHelpers.cxx
index 0dfc80e..53143dd 100644
--- a/writerfilter/source/dmapper/GraphicHelpers.cxx
+++ b/writerfilter/source/dmapper/GraphicHelpers.cxx
@@ -39,27 +39,22 @@ namespace dmapper {
 
 using namespace com::sun::star;
 
-int PositionHandler::savedPositionOffsetV = 0;
-int PositionHandler::savedPositionOffsetH = 0;
 int PositionHandler::savedAlignV = text::VertOrientation::NONE;
 int PositionHandler::savedAlignH = text::HoriOrientation::NONE;
 
-PositionHandler::PositionHandler( bool vertical ) :
-LoggedProperties(dmapper_logger, "PositionHandler")
+PositionHandler::PositionHandler( bool vertical, std::pair<OUString, OUString>& rPositionOffsets ) :
+LoggedProperties(dmapper_logger, "PositionHandler"),
+m_rPositionOffsets(rPositionOffsets)
 {
     m_nRelation = text::RelOrientation::FRAME;
     if( vertical )
     {
-        m_nPosition = savedPositionOffsetV;
         m_nOrient = savedAlignV;
-        savedPositionOffsetV = 0;
         savedAlignV = text::VertOrientation::NONE;
     }
     else
     {
-        m_nPosition = savedPositionOffsetH;
         m_nOrient = savedAlignH;
-        savedPositionOffsetH = 0;
         savedAlignH = text::HoriOrientation::NONE;
     }
 }
@@ -133,8 +128,19 @@ void PositionHandler::lcl_attribute( Id aName, Value& rVal )
     }
 }
 
-void PositionHandler::lcl_sprm( Sprm& )
+void PositionHandler::lcl_sprm(Sprm& rSprm)
 {
+    sal_uInt32 nSprmId = rSprm.getId();
+
+    switch (nSprmId)
+    {
+        case NS_ooxml::LN_CT_PosH_posOffset:
+            m_nPosition = oox::drawingml::convertEmuToHmm(m_rPositionOffsets.first.toInt32());
+            break;
+        case NS_ooxml::LN_CT_PosV_posOffset:
+            m_nPosition = oox::drawingml::convertEmuToHmm(m_rPositionOffsets.second.toInt32());
+            break;
+    }
 }
 
 sal_Int16 PositionHandler::orientation() const
@@ -152,22 +158,6 @@ sal_Int16 PositionHandler::orientation() const
 
 
 
-void PositionHandler::setPositionOffset(const OUString & sText, bool vertical)
-{
-    if( vertical )
-        savedPositionOffsetV = oox::drawingml::convertEmuToHmm(sText.toInt32());
-    else
-        savedPositionOffsetH = oox::drawingml::convertEmuToHmm(sText.toInt32());
-}
-
-int PositionHandler::getPositionOffset(bool vertical)
-{
-    if (vertical)
-        return savedPositionOffsetV;
-    else
-        return savedPositionOffsetH;
-}
-
 void PositionHandler::setAlignH(const OUString & sText)
 {
     if( sText == "left")
diff --git a/writerfilter/source/dmapper/GraphicHelpers.hxx b/writerfilter/source/dmapper/GraphicHelpers.hxx
index 545dd95..68eca32 100644
--- a/writerfilter/source/dmapper/GraphicHelpers.hxx
+++ b/writerfilter/source/dmapper/GraphicHelpers.hxx
@@ -25,6 +25,7 @@
 #include <boost/shared_ptr.hpp>
 
 #include <map>
+#include <utility>
 
 namespace writerfilter {
 namespace dmapper
@@ -33,10 +34,8 @@ namespace dmapper
 class PositionHandler: public LoggedProperties
 {
 public:
-    PositionHandler( bool vertical );
+    PositionHandler( bool vertical, std::pair<OUString, OUString>& rPositionOffsets );
     virtual ~PositionHandler( );
-    static void setPositionOffset(const OUString & sText, bool vertical);
-    static int getPositionOffset(bool vertical);
     static void setAlignH(const OUString & sText);
     static void setAlignV(const OUString & sText);
     sal_Int16 orientation() const;
@@ -48,8 +47,8 @@ public:
     sal_Int16 m_nOrient;
     sal_Int16 m_nRelation;
     sal_Int32 m_nPosition;
-    static int savedPositionOffsetV, savedPositionOffsetH;
     static int savedAlignV, savedAlignH;
+    std::pair<OUString, OUString>& m_rPositionOffsets;
 };
 typedef boost::shared_ptr<PositionHandler> PositionHandlerPtr;
 
diff --git a/writerfilter/source/dmapper/GraphicImport.cxx b/writerfilter/source/dmapper/GraphicImport.cxx
index de999af..fae9b3d 100644
--- a/writerfilter/source/dmapper/GraphicImport.cxx
+++ b/writerfilter/source/dmapper/GraphicImport.cxx
@@ -261,6 +261,7 @@ public:
     OUString sName;
     OUString sAlternativeText;
     OUString title;
+    std::pair<OUString, OUString>& m_rPositionOffsets;
     std::queue<OUString>& m_rPositivePercentages;
     OUString sAnchorId;
     comphelper::SequenceAsHashMap m_aInteropGrabBag;
@@ -269,7 +270,7 @@ public:
     boost::optional<sal_Int32> m_oEffectExtentRight;
     boost::optional<sal_Int32> m_oEffectExtentBottom;
 
-    GraphicImport_Impl(GraphicImportType eImportType, DomainMapper&   rDMapper, std::queue<OUString>& rPositivePercentages) :
+    GraphicImport_Impl(GraphicImportType eImportType, DomainMapper&   rDMapper, std::pair<OUString, OUString>& rPositionOffsets, std::queue<OUString>& rPositivePercentages) :
         nXSize(0)
         ,bXSizeValid(false)
         ,nYSize(0)
@@ -320,6 +321,7 @@ public:
         ,bSizeProtected(false)
         ,bPositionProtected(false)
         ,nShapeOptionType(0)
+        ,m_rPositionOffsets(rPositionOffsets)
         ,m_rPositivePercentages(rPositivePercentages)
     {}
 
@@ -444,11 +446,12 @@ GraphicImport::GraphicImport(uno::Reference<uno::XComponentContext> const& xComp
                              uno::Reference<lang::XMultiServiceFactory> const& xTextFactory,
                              DomainMapper& rDMapper,
                              GraphicImportType eImportType,
+                             std::pair<OUString, OUString>& rPositionOffsets,
                              std::queue<OUString>& rPositivePercentages)
 : LoggedProperties(dmapper_logger, "GraphicImport")
 , LoggedTable(dmapper_logger, "GraphicImport")
 , LoggedStream(dmapper_logger, "GraphicImport")
-, m_pImpl(new GraphicImport_Impl(eImportType, rDMapper, rPositivePercentages))
+, m_pImpl(new GraphicImport_Impl(eImportType, rDMapper, rPositionOffsets, rPositivePercentages))
 , m_xComponentContext(xComponentContext)
 , m_xTextFactory(xTextFactory)
 {
@@ -1045,7 +1048,7 @@ void GraphicImport::lcl_sprm(Sprm& rSprm)
         case NS_ooxml::LN_CT_Anchor_positionH: // 90976;
         {
             // Use a special handler for the positionning
-            PositionHandlerPtr pHandler( new PositionHandler( false ));
+            PositionHandlerPtr pHandler( new PositionHandler( false, m_pImpl->m_rPositionOffsets ));
             writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
             if( pProperties.get( ) )
             {
@@ -1071,7 +1074,7 @@ void GraphicImport::lcl_sprm(Sprm& rSprm)
         case NS_ooxml::LN_CT_Anchor_positionV: // 90977;
         {
             // Use a special handler for the positionning
-            PositionHandlerPtr pHandler( new PositionHandler( true ));
+            PositionHandlerPtr pHandler( new PositionHandler( true, m_pImpl->m_rPositionOffsets ));
             writerfilter::Reference<Properties>::Pointer_t pProperties = rSprm.getProps();
             if( pProperties.get( ) )
             {
diff --git a/writerfilter/source/dmapper/GraphicImport.hxx b/writerfilter/source/dmapper/GraphicImport.hxx
index 3552d26..89fc5c1 100644
--- a/writerfilter/source/dmapper/GraphicImport.hxx
+++ b/writerfilter/source/dmapper/GraphicImport.hxx
@@ -83,6 +83,7 @@ public:
                             css::uno::Reference<css::lang::XMultiServiceFactory> const& xTextFactory,
                             DomainMapper& rDomainMapper,
                             GraphicImportType eGraphicImportType,
+                            std::pair<OUString, OUString>& rPositionOffsets,
                             std::queue<OUString>& rPositivePercentages);
     virtual ~GraphicImport();
 
diff --git a/writerfilter/source/dmapper/LoggedResources.cxx b/writerfilter/source/dmapper/LoggedResources.cxx
index 4d8051e..3fafd30 100644
--- a/writerfilter/source/dmapper/LoggedResources.cxx
+++ b/writerfilter/source/dmapper/LoggedResources.cxx
@@ -204,6 +204,21 @@ void LoggedStream::utext(const sal_uInt8 * data, size_t len)
 #endif
 }
 
+void LoggedStream::positionOffset(const OUString& rText, bool bVertical)
+{
+#ifdef DEBUG_WRITERFILTER
+    mHelper.startElement("positionOffset");
+    mHelper.attribute("vertical", static_cast<int>(bVertical));
+    mHelper.chars(rText);
+#endif
+
+    lcl_positionOffset(rText, bVertical);
+
+#ifdef DEBUG_WRITERFILTER
+    mHelper.endElement("positionOffset");
+#endif
+}
+
 void LoggedStream::positivePercentage(const OUString& rText)
 {
 #ifdef DEBUG_WRITERFILTER
diff --git a/writerfilter/source/dmapper/LoggedResources.hxx b/writerfilter/source/dmapper/LoggedResources.hxx
index 5147511..2524485 100644
--- a/writerfilter/source/dmapper/LoggedResources.hxx
+++ b/writerfilter/source/dmapper/LoggedResources.hxx
@@ -63,6 +63,7 @@ public:
     void endShape() SAL_OVERRIDE;
     void text(const sal_uInt8 * data, size_t len) SAL_OVERRIDE;
     void utext(const sal_uInt8 * data, size_t len) SAL_OVERRIDE;
+    void positionOffset(const OUString& rText, bool bVertical) SAL_OVERRIDE;
     void positivePercentage(const OUString& rText) SAL_OVERRIDE;
     void props(writerfilter::Reference<Properties>::Pointer_t ref) SAL_OVERRIDE;
     void table(Id name, writerfilter::Reference<Table>::Pointer_t ref) SAL_OVERRIDE;
@@ -80,6 +81,8 @@ protected:
     virtual void lcl_endShape() = 0;
     virtual void lcl_text(const sal_uInt8 * data, size_t len) = 0;
     virtual void lcl_utext(const sal_uInt8 * data, size_t len) = 0;
+    virtual void lcl_positionOffset(const OUString& /*rText*/, bool /*bVertical*/) { }
+    virtual css::awt::Point getPositionOffset() { return css::awt::Point(); }
     virtual void lcl_positivePercentage(const OUString& /*rText*/) { }
     virtual void lcl_props(writerfilter::Reference<Properties>::Pointer_t ref) = 0;
     virtual void lcl_table(Id name, writerfilter::Reference<Table>::Pointer_t ref) = 0;
diff --git a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
index a461ed7..3c7094f 100644
--- a/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
+++ b/writerfilter/source/ooxml/OOXMLFastContextHandler.cxx
@@ -656,20 +656,10 @@ void OOXMLFastContextHandler::text(const OUString & sText)
                         sText.getLength());
 }
 
-/*
- HACK. An ugly hack. The problem with wp:positionOffset, wp:alignV and wp:alignH
- is that they do not work in the usual OOXML way of <tag val="value"/> but instead
- it's <tag>value</tag>, which is otherwise used only things like <t>. And I really
- haven't managed to find out how to make this XML parsing monstrosity to handle this
- on its own, so the code is modelled after <t> handling and does it manually in a hackish
- way - it reads the value as text and converts itself, moreover the reading of the value
- is done sooner than lcl_sprms() actually results in processing the tags it is enclosed
- in, so the values are stored in PositionHandler for later use.
-*/
-void OOXMLFastContextHandler::positionOffset(const OUString & sText)
+void OOXMLFastContextHandler::positionOffset(const OUString& rText)
 {
     if (isForwardEvents())
-        ::writerfilter::dmapper::PositionHandler::setPositionOffset( sText, inPositionV );
+        mpStream->positionOffset(rText, inPositionV);
 }
 
 void OOXMLFastContextHandler::ignore()
@@ -1632,7 +1622,7 @@ void OOXMLFastContextHandlerShape::sendShape( Token_t Element )
 {
     if ( mrShapeContext.is() && !m_bShapeSent )
     {
-        awt::Point aPosition(writerfilter::dmapper::PositionHandler::getPositionOffset(false), writerfilter::dmapper::PositionHandler::getPositionOffset(true));
+        awt::Point aPosition = mpStream->getPositionOffset();
         mrShapeContext->setPosition(aPosition);
         uno::Reference<drawing::XShape> xShape(mrShapeContext->getShape());
         if (xShape.is())
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 433bbf9..36ceed1 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -950,19 +950,27 @@ int RTFDocumentImpl::resolvePict(bool const bInline, uno::Reference<drawing::XSh
             aAnchorSprms.set(NS_ooxml::LN_EG_WrapType_wrapSquare, pAnchorWrapValue);
 
         // See OOXMLFastContextHandler::positionOffset(), we can't just put offset values in an RTFValue.
+        RTFSprms aPoshAttributes;
         RTFSprms aPoshSprms;
         if (m_aStates.top().aShape.nHoriOrientRelationToken > 0)
-            aPoshSprms.set(NS_ooxml::LN_CT_PosH_relativeFrom, RTFValue::Pointer_t(new RTFValue(m_aStates.top().aShape.nHoriOrientRelationToken)));
+            aPoshAttributes.set(NS_ooxml::LN_CT_PosH_relativeFrom, RTFValue::Pointer_t(new RTFValue(m_aStates.top().aShape.nHoriOrientRelationToken)));
         if (m_aStates.top().aShape.nLeft != 0)
-            writerfilter::dmapper::PositionHandler::setPositionOffset(OUString::number(oox::drawingml::convertHmmToEmu(m_aStates.top().aShape.nLeft)), false);
-        aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionH, RTFValue::Pointer_t(new RTFValue(aPoshSprms)));
+        {
+            Mapper().positionOffset(OUString::number(oox::drawingml::convertHmmToEmu(m_aStates.top().aShape.nLeft)), /*bVertical=*/false);
+            aPoshSprms.set(NS_ooxml::LN_CT_PosH_posOffset, RTFValue::Pointer_t(new RTFValue()));
+        }
+        aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionH, RTFValue::Pointer_t(new RTFValue(aPoshAttributes, aPoshSprms)));
 
+        RTFSprms aPosvAttributes;
         RTFSprms aPosvSprms;
         if (m_aStates.top().aShape.nVertOrientRelationToken > 0)
-            aPosvSprms.set(NS_ooxml::LN_CT_PosV_relativeFrom, RTFValue::Pointer_t(new RTFValue(m_aStates.top().aShape.nVertOrientRelationToken)));
+            aPosvAttributes.set(NS_ooxml::LN_CT_PosV_relativeFrom, RTFValue::Pointer_t(new RTFValue(m_aStates.top().aShape.nVertOrientRelationToken)));
         if (m_aStates.top().aShape.nTop != 0)
-            writerfilter::dmapper::PositionHandler::setPositionOffset(OUString::number(oox::drawingml::convertHmmToEmu(m_aStates.top().aShape.nTop)), true);
-        aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionV, RTFValue::Pointer_t(new RTFValue(aPosvSprms)));
+        {
+            Mapper().positionOffset(OUString::number(oox::drawingml::convertHmmToEmu(m_aStates.top().aShape.nTop)), /*bVertical=*/true);
+            aPosvSprms.set(NS_ooxml::LN_CT_PosV_posOffset, RTFValue::Pointer_t(new RTFValue()));
+        }
+        aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_positionV, RTFValue::Pointer_t(new RTFValue(aPosvAttributes, aPosvSprms)));
 
         aAnchorSprms.set(NS_ooxml::LN_CT_Anchor_docPr, pDocprValue);
         aAnchorSprms.set(NS_ooxml::LN_graphic_graphic, pGraphicValue);


More information about the Libreoffice-commits mailing list