[Libreoffice-commits] core.git: Branch 'distro/collabora/cp-5.3' - 18 commits - configure.ac editeng/source forms/source hwpfilter/source include/oox oox/source sal/textenc sc/source sd/qa solenv/gbuild svl/source svx/source sw/qa sw/source vcl/CppunitTest_vcl_wmf_test.mk vcl/inc vcl/Library_vcl.mk vcl/source vcl/unx vcl/win writerfilter/source

Katarina Behrens Katarina.Behrens at cib.de
Fri Mar 10 15:23:43 UTC 2017


 configure.ac                                                   |   32 -
 dev/null                                                       |binary
 editeng/source/editeng/editdoc.hxx                             |   12 
 forms/source/component/ListBox.cxx                             |    4 
 hwpfilter/source/hbox.cxx                                      |    5 
 hwpfilter/source/hbox.h                                        |   91 +--
 hwpfilter/source/hwpread.cxx                                   |   10 
 include/oox/export/drawingml.hxx                               |    9 
 oox/source/export/chartexport.cxx                              |   11 
 oox/source/export/drawingml.cxx                                |   75 +-
 sal/textenc/tcvtkr6.tab                                        |    2 
 sc/source/core/data/column3.cxx                                |   69 ++
 sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx |    2 
 sc/source/ui/view/preview.cxx                                  |    6 
 sd/qa/unit/export-tests-ooxml1.cxx                             |    6 
 solenv/gbuild/platform/filter-showIncludes.awk                 |    1 
 svl/source/numbers/zforscan.cxx                                |    2 
 svl/source/numbers/zforscan.hxx                                |    1 
 svx/source/svdraw/svdopath.cxx                                 |    2 
 sw/qa/extras/rtfimport/data/tdf104287.rtf                      |   38 +
 sw/qa/extras/rtfimport/rtfimport.cxx                           |    8 
 sw/qa/extras/ww8export/data/tdf99120.doc                       |binary
 sw/qa/extras/ww8export/ww8export2.cxx                          |    9 
 sw/qa/extras/ww8import/ww8import.cxx                           |    9 
 sw/source/core/doc/doccomp.cxx                                 |   22 
 sw/source/filter/ww8/docxattributeoutput.cxx                   |    7 
 sw/source/filter/ww8/wrtw8sty.cxx                              |    1 
 vcl/CppunitTest_vcl_wmf_test.mk                                |    1 
 vcl/Library_vcl.mk                                             |    1 
 vcl/inc/CommonSalLayout.hxx                                    |    1 
 vcl/source/gdi/CommonSalLayout.cxx                             |    9 
 vcl/unx/gtk/a11y/atkaction.cxx                                 |   11 
 vcl/unx/gtk/a11y/atkcomponent.cxx                              |   11 
 vcl/unx/gtk/a11y/atkeditabletext.cxx                           |   11 
 vcl/unx/gtk/a11y/atkhypertext.cxx                              |   11 
 vcl/unx/gtk/a11y/atkimage.cxx                                  |   11 
 vcl/unx/gtk/a11y/atklistener.cxx                               |   20 
 vcl/unx/gtk/a11y/atklistener.hxx                               |    2 
 vcl/unx/gtk/a11y/atkselection.cxx                              |   11 
 vcl/unx/gtk/a11y/atktable.cxx                                  |   11 
 vcl/unx/gtk/a11y/atktext.cxx                                   |   44 +
 vcl/unx/gtk/a11y/atktextattributes.cxx                         |   11 
 vcl/unx/gtk/a11y/atkutil.cxx                                   |   25 
 vcl/unx/gtk/a11y/atkvalue.cxx                                  |   11 
 vcl/unx/gtk/a11y/atkwrapper.cxx                                |  266 ++++------
 vcl/unx/gtk/a11y/atkwrapper.hxx                                |   34 +
 vcl/win/gdi/gdiimpl.cxx                                        |    6 
 vcl/win/gdi/salnativewidgets-luna.cxx                          |    4 
 vcl/win/gdi/winlayout.cxx                                      |   31 -
 writerfilter/source/rtftok/rtfdocumentimpl.cxx                 |   13 
 writerfilter/source/rtftok/rtfdocumentimpl.hxx                 |    4 
 writerfilter/source/rtftok/rtfvalue.cxx                        |   52 +
 writerfilter/source/rtftok/rtfvalue.hxx                        |    6 
 53 files changed, 633 insertions(+), 419 deletions(-)

New commits:
commit 440008aac0bbd7d466b837ba9046fcf277d35056
Author: Katarina Behrens <Katarina.Behrens at cib.de>
Date:   Wed Mar 1 17:45:16 2017 +0100

    tdf#95612: Print preview: page numbering starts with 1 (not 0)
    
    unless otherwise specified. It was okay for 1st page & broken
    everywhere else. Possibly resolves tdf#95206 as well ...
    
    Change-Id: Ie69f770a28dd69f90d4f04ad4fa9e701fa2d56e2
    Reviewed-on: https://gerrit.libreoffice.org/34759
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
    (cherry picked from commit c07ac0d92ad830762906586164bab466a0f05531)
    Reviewed-on: https://gerrit.libreoffice.org/34946
    (cherry picked from commit acd58ceaa1d792d0a16c270c56ff727321fb2aac)

diff --git a/sc/source/ui/view/preview.cxx b/sc/source/ui/view/preview.cxx
index 7099142..bf8115a 100644
--- a/sc/source/ui/view/preview.cxx
+++ b/sc/source/ui/view/preview.cxx
@@ -249,18 +249,18 @@ void ScPreview::CalcPages()
     while (nStart > static_cast<SCTAB>(nPages.size()))
         nPages.push_back(0);
     while (nStart > static_cast<SCTAB>(nFirstAttr.size()))
-        nFirstAttr.push_back(0);
+        nFirstAttr.push_back(1);
 
     for (SCTAB i=nStart; i<nTabCount; i++)
     {
         if ( i == static_cast<SCTAB>(nPages.size()))
             nPages.push_back(0);
         if ( i == static_cast<SCTAB>(nFirstAttr.size()))
-            nFirstAttr.push_back(0);
+            nFirstAttr.push_back(1);
         if (!aOptions.GetAllSheets() && maSelectedTabs.count(i) == 0)
         {
             nPages[i] = 0;
-            nFirstAttr[i] = 0;
+            nFirstAttr[i] = 1;
             continue;
         }
 
commit ee3cb327402098433cb7407f0664cc6ccd4c1eaa
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Fri Mar 10 10:35:43 2017 +0000

    ofz#798 oom
    
    (cherry picked from commit 75f118da50b217956ee7a735e921524d0c2935ff)
    
    Change-Id: I6fa8dd999af7e00d6236a1ead5f8bb519f2d128d
    Reviewed-on: https://gerrit.libreoffice.org/35038
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    (cherry picked from commit dcda65506e0a5c8526cfd7bbd0e3d4721507871f)

diff --git a/hwpfilter/source/hbox.cxx b/hwpfilter/source/hbox.cxx
index da9e206..04d5497 100644
--- a/hwpfilter/source/hbox.cxx
+++ b/hwpfilter/source/hbox.cxx
@@ -77,18 +77,13 @@ hchar_string HBox::GetString()
 // skip block
 SkipData::SkipData(hchar hch)
     : HBox(hch)
-    , data_block_len(0)
-    , dummy(0)
-    , data_block(nullptr)
 {
 }
 
 SkipData::~SkipData()
 {
-    delete[]data_block;
 }
 
-
 // FieldCode [5]
 FieldCode::FieldCode()
     : HBox(CH_FIELD)
diff --git a/hwpfilter/source/hbox.h b/hwpfilter/source/hbox.h
index 3832c76..a9aa2b4 100644
--- a/hwpfilter/source/hbox.h
+++ b/hwpfilter/source/hbox.h
@@ -1,21 +1,21 @@
 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
 /*
- * This file is part of the LibreOffice project.
- *
- * This Source Code Form is subject to the terms of the Mozilla Public
- * License, v. 2.0. If a copy of the MPL was not distributed with this
- * file, You can obtain one at http://mozilla.org/MPL/2.0/.
- *
- * This file incorporates work covered by the following license notice:
- *
- *   Licensed to the Apache Software Foundation (ASF) under one or more
- *   contributor license agreements. See the NOTICE file distributed
- *   with this work for additional information regarding copyright
- *   ownership. The ASF licenses this file to you under the Apache
- *   License, Version 2.0 (the "License"); you may not use this file
- *   except in compliance with the License. You may obtain a copy of
- *   the License at http://www.apache.org/licenses/LICENSE-2.0 .
- */
+* This file is part of the LibreOffice project.
+*
+* This Source Code Form is subject to the terms of the Mozilla Public
+* License, v. 2.0. If a copy of the MPL was not distributed with this
+* file, You can obtain one at http://mozilla.org/MPL/2.0/.
+*
+* This file incorporates work covered by the following license notice:
+*
+*   Licensed to the Apache Software Foundation (ASF) under one or more
+*   contributor license agreements. See the NOTICE file distributed
+*   with this work for additional information regarding copyright
+*   ownership. The ASF licenses this file to you under the Apache
+*   License, Version 2.0 (the "License"); you may not use this file
+*   except in compliance with the License. You may obtain a copy of
+*   the License at http://www.apache.org/licenses/LICENSE-2.0 .
+*/
 
 #ifndef INCLUDED_HWPFILTER_SOURCE_HBOX_H
 #define INCLUDED_HWPFILTER_SOURCE_HBOX_H
@@ -32,53 +32,50 @@
 #include "hpara.h"
 
 /**
- * The HBox class is the base class for all date classes in hwp document.
- * For example, there are special character, table, image, etc.
- * It has one character. The ascii code value of special characters are smaller than 32. General character is greater than 32.
- *
- * @short Base class for characters
- */
+* The HBox class is the base class for all date classes in hwp document.
+* For example, there are special character, table, image, etc.
+* It has one character. The ascii code value of special characters are smaller than 32. General character is greater than 32.
+*
+* @short Base class for characters
+*/
 struct HBox
 {
-    public:
-        hchar hh;
+public:
+    hchar hh;
 
 /**
- * Construct a HBox object with parameter hch.
- * @param hch 16bit character being able to have Korean character.
- */
-        explicit HBox( hchar hch );
-        virtual ~HBox();
+* Construct a HBox object with parameter hch.
+* @param hch 16bit character being able to have Korean character.
+*/
+    explicit HBox( hchar hch );
+    virtual ~HBox();
 /**
- * @returns The Size of HBox object
- */
-        int           WSize();
+* @returns The Size of HBox object
+*/
+    int           WSize();
 /**
- * Read properties from HIODevice object like stream, file, memory.
- *
- * @param hwpf HWPFile Object having all information for a hwp file.
- * @returns True if reading from stream is successful.
- */
-        virtual bool Read(HWPFile &hwpf);
+* Read properties from HIODevice object like stream, file, memory.
+*
+* @param hwpf HWPFile Object having all information for a hwp file.
+* @returns True if reading from stream is successful.
+*/
+    virtual bool Read(HWPFile &hwpf);
 
-        virtual hchar_string GetString();
-    private:
-        static int boxCount;
+    virtual hchar_string GetString();
+private:
+    static int boxCount;
 };
 
 /**
- * @short Class for saving data to be skipped.
- */
+* @short Class for skipping data.
+*/
 struct SkipData: public HBox
 {
-    uint data_block_len;
-    hchar dummy;
-    char  *data_block;
-
     explicit SkipData(hchar);
     virtual ~SkipData() override;
     virtual bool Read(HWPFile &hwpf) override;
 };
+
 struct DateCode;
 struct FieldCode : public HBox
 {
diff --git a/hwpfilter/source/hwpread.cxx b/hwpfilter/source/hwpread.cxx
index 377c13e..abeaca6 100644
--- a/hwpfilter/source/hwpread.cxx
+++ b/hwpfilter/source/hwpread.cxx
@@ -45,19 +45,19 @@ bool HBox::Read(HWPFile & )
 
 bool SkipData::Read(HWPFile & hwpf)
 {
+    uint data_block_len;
     hwpf.Read4b(&data_block_len, 1);
+
+    hchar dummy;
     hwpf.Read2b(&dummy, 1);
 
     if (!(IS_SP_SKIP_BLOCK(hh) && (hh == dummy))){
         return hwpf.SetState(HWP_InvalidFileFormat);
-     }
-
-    data_block = new char[data_block_len];
+    }
 
-    return hwpf.Read1b(data_block, data_block_len);
+    return hwpf.SkipBlock(data_block_len);
 }
 
-
 // Field code(5)
 bool FieldCode::Read(HWPFile & hwpf)
 {
commit ca899a3e399b934cf91741e3c9076f5b344a8f05
Author: Lionel Elie Mamane <lionel at mamane.lu>
Date:   Thu Mar 9 19:44:38 2017 +0100

    tdf#106462 old value and new value were swapped
    
    in
    
    commit 66ccfcd2908445b8194c364c89778056374b02af
    Author: Jochen Nitschke <j.nitschke+logerrit at ok.de>
    Date:   Fri Oct 21 09:36:10 2016 +0200
    
        remove use of tryPropertyValue Any specialisation
    
        Change-Id: I3180cf5b9e63a3da9257b03ba02967a2d5402ec3
        Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
    
    Change-Id: I90dd3f6dba799eec9210dbb7560be105cb50e6d1
    Reviewed-on: https://gerrit.libreoffice.org/35021
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
    (cherry picked from commit 23b8a097090ad544c596e644cf477feb360c9469)

diff --git a/forms/source/component/ListBox.cxx b/forms/source/component/ListBox.cxx
index 00e1e7a..d5599d5 100644
--- a/forms/source/component/ListBox.cxx
+++ b/forms/source/component/ListBox.cxx
@@ -421,8 +421,8 @@ namespace frm
             Any _rCurrentValue = getCurrentSingleValue();
             if (_rCurrentValue != _rValue)
             {
-                _rOldValue = _rValue;
-                _rConvertedValue = _rCurrentValue;
+                _rOldValue = _rCurrentValue;
+                _rConvertedValue = _rValue;
                 bModified = true;
             }
             break;
commit cf1b4679b0143e97d2e05cae9c5a01f0f4234ed8
Author: Jan-Marek Glogowski <glogow at fbihome.de>
Date:   Wed Mar 8 12:00:03 2017 +0100

    Fix build with latest Cygwin updates
    
    Stop bash complaining about \0 bytes in input
    (cherry picked from commit 8800292351dcf1f538c47ac6acf834ac2633ce6b)
    
    Strip newlines from UCRT detecion using tr
    (cherry picked from commit 37baabe6436037de604bfbc2702bfb0bc156c41b)
    
    Remove stray CR from input
    (cherry picked from commit 77779166569da389de44075b3d03413b353046a4)
    
    Just get rid of CR when parsing .bat output
    (cherry picked from commit 019ea173701eae4b8c5ffd45bb0063fc0a688ce0)
    
    Change-Id: Ieef2f8eb98181f5a4ea6a5527bc36de9b88716b5
    Reviewed-on: https://gerrit.libreoffice.org/35010
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Tor Lillqvist <tml at collabora.com>
    (cherry picked from commit 86bb733f6a9af9af253afe896e315b463e592dc7)

diff --git a/configure.ac b/configure.ac
index 4192506..23d9adc 100644
--- a/configure.ac
+++ b/configure.ac
@@ -3151,28 +3151,32 @@ dnl ===================================================================
 dnl Windows specific tests and stuff
 dnl ===================================================================
 
-# Get a value from the 32-bit side of the Registry
-reg_get_value_32()
+reg_get_value()
 {
     # Return value: $regvalue
     unset regvalue
-    _regvalue=`cat "/proc/registry32/$1" 2> /dev/null`
 
-    if test $? -eq 0; then
-        regvalue=$_regvalue
+    local _regentry="/proc/registry${1}/${2}"
+    if test -f "$_regentry"; then
+        # Stop bash complaining about \0 bytes in input, as it can't handle them.
+        # Registry keys read via /proc/registry* are always \0 terminated!
+        local _regvalue=$(tr -d '\0' < "$_regentry")
+        if test $? -eq 0; then
+            regvalue=$_regvalue
+        fi
     fi
 }
 
+# Get a value from the 32-bit side of the Registry
+reg_get_value_32()
+{
+    reg_get_value "32" "$1"
+}
+
 # Get a value from the 64-bit side of the Registry
 reg_get_value_64()
 {
-    # Return value: $regvalue
-    unset regvalue
-    _regvalue=`cat "/proc/registry64/$1" 2> /dev/null`
-
-    if test $? -eq 0; then
-        regvalue=$_regvalue
-    fi
+    reg_get_value "64" "$1"
 }
 
 if test "$_os" = "WINNT"; then
@@ -3304,7 +3308,7 @@ win_get_env_from_vsvars32bat()
     echo -e "@echo %$1%\r\n" >> $WRAPPERBATCHFILEPATH
     echo -e "@endlocal\r\n" >> $WRAPPERBATCHFILEPATH
     chmod +x $WRAPPERBATCHFILEPATH
-    _win_get_env_from_vsvars32bat="`$WRAPPERBATCHFILEPATH | $SED -e s/^M^J//`"
+    _win_get_env_from_vsvars32bat=$($WRAPPERBATCHFILEPATH | tr -d "\r")
     rm -f $WRAPPERBATCHFILEPATH
     echo $_win_get_env_from_vsvars32bat
 }
@@ -6796,7 +6800,7 @@ if test "$ENABLE_JAVA" != ""; then
 
         if test -z "$with_jdk_home"; then
             for ver in 1.8 1.7 1.6; do
-                reg_get_value_$bitness "HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Development Kit/$ver/JavaHome"
+                reg_get_value "$bitness" "HKEY_LOCAL_MACHINE/SOFTWARE/JavaSoft/Java Development Kit/$ver/JavaHome"
                 if test -n "$regvalue"; then
                     _jdk_home=$regvalue
                     break
diff --git a/solenv/gbuild/platform/filter-showIncludes.awk b/solenv/gbuild/platform/filter-showIncludes.awk
index 21a4585..6ec13e2 100755
--- a/solenv/gbuild/platform/filter-showIncludes.awk
+++ b/solenv/gbuild/platform/filter-showIncludes.awk
@@ -40,6 +40,7 @@ BEGIN {
 }
 
 {
+    sub(/\r$/, "")
     sub(/^ */, "")
     if (index($0, showincludes_prefix) == 1) {
         $0 = substr($0, length(showincludes_prefix) + 1)
commit 245792c8514d396e982dc80317208d59a8035077
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Thu Mar 9 09:40:58 2017 +0000

    ofz#770 JOHAB_73 table starts at 0xA not 0x2
    
    the start value is out by one row
    
    Change-Id: I77ed154358516ccd47a090cf7ed45bb609bc81a3
    Reviewed-on: https://gerrit.libreoffice.org/34993
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Stephan Bergmann <sbergman at redhat.com>
    (cherry picked from commit 87c783c4a463969984e660f0b5bc57f4910f7856)

diff --git a/sal/textenc/tcvtkr6.tab b/sal/textenc/tcvtkr6.tab
index 384c120..de68d62 100644
--- a/sal/textenc/tcvtkr6.tab
+++ b/sal/textenc/tcvtkr6.tab
@@ -1039,7 +1039,7 @@ static ImplUniToDBCSHighTab const aJOHABDBCSHighTab[256] =
     { 0x01, 0xFD, aImplUniToDBCSTab_JOHAB_70 },                 /* 0x70 */
     { 0x04, 0xFF, aImplUniToDBCSTab_JOHAB_71 },                 /* 0x71 */
     { 0x00, 0xFD, aImplUniToDBCSTab_JOHAB_72 },                 /* 0x72 */
-    { 0x02, 0xFE, aImplUniToDBCSTab_JOHAB_73 },                 /* 0x73 */
+    { 0x0A, 0xFE, aImplUniToDBCSTab_JOHAB_73 },                 /* 0x73 */
     { 0x01, 0xF7, aImplUniToDBCSTab_JOHAB_74 },                 /* 0x74 */
     { 0x01, 0xFC, aImplUniToDBCSTab_JOHAB_75 },                 /* 0x75 */
     { 0x00, 0xFE, aImplUniToDBCSTab_JOHAB_76 },                 /* 0x76 */
commit 0459e6e5d18d42c753d1f85f46ee5be6535be160
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Mar 8 12:22:54 2017 +0000

    CIA: unnecessary dll
    
    Reviewed-on: https://gerrit.libreoffice.org/34972
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    (cherry picked from commit 587cf92e5cff091f863227fffa347df875fb86f7)
    
    Change-Id: Icbc3eaff000d90885cf85d8195868e1248493896
    Reviewed-on: https://gerrit.libreoffice.org/34974
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Michael Stahl <mstahl at redhat.com>
    (cherry picked from commit ef58999df39ed665e34a87574b370a338c1ef9a4)

diff --git a/vcl/CppunitTest_vcl_wmf_test.mk b/vcl/CppunitTest_vcl_wmf_test.mk
index 369c792..44d6851 100644
--- a/vcl/CppunitTest_vcl_wmf_test.mk
+++ b/vcl/CppunitTest_vcl_wmf_test.mk
@@ -172,7 +172,6 @@ $(eval $(call gb_CppunitTest_use_system_win32_libs,vcl_wmf_test,\
     glu32 \
     imm32 \
     mpr \
-    msimg32 \
     opengl32 \
     ole32 \
     shell32 \
diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk
index f552b55..a52938b 100644
--- a/vcl/Library_vcl.mk
+++ b/vcl/Library_vcl.mk
@@ -732,7 +732,6 @@ $(eval $(call gb_Library_use_system_win32_libs,vcl,\
     glu32 \
 	imm32 \
 	mpr \
-	msimg32 \
     opengl32 \
 	ole32 \
 	shell32 \
diff --git a/vcl/win/gdi/gdiimpl.cxx b/vcl/win/gdi/gdiimpl.cxx
index 82c03ff..237aef5 100644
--- a/vcl/win/gdi/gdiimpl.cxx
+++ b/vcl/win/gdi/gdiimpl.cxx
@@ -816,9 +816,9 @@ bool WinSalGraphicsImpl::drawAlphaRect( long nX, long nY, long nWidth,
 
     // hMemDC contains a 1x1 bitmap of the right color - stretch-blit
     // that to dest hdc
-    bool bRet = AlphaBlend( mrParent.getHDC(), nX, nY, nWidth, nHeight,
-                            hMemDC, 0,0,1,1,
-                            aFunc ) == TRUE;
+    bool bRet = GdiAlphaBlend(mrParent.getHDC(), nX, nY, nWidth, nHeight,
+                              hMemDC, 0,0,1,1,
+                              aFunc ) == TRUE;
 
     ImplReleaseCachedDC( CACHED_HDC_1 );
 
diff --git a/vcl/win/gdi/salnativewidgets-luna.cxx b/vcl/win/gdi/salnativewidgets-luna.cxx
index 23fa61a..3491ebf 100644
--- a/vcl/win/gdi/salnativewidgets-luna.cxx
+++ b/vcl/win/gdi/salnativewidgets-luna.cxx
@@ -461,7 +461,7 @@ static void impl_drawAeroToolbar( HDC hDC, RECT rc, bool bHorizontal )
                 { rc.left, rc.top,          0xff00, 0xff00, 0xff00, 0xff00 },
                 { rc.right, gradient_break, 0xfa00, 0xfa00, 0xfa00, 0xff00 },
             };
-            GradientFill( hDC, vert, 2, g_rect, 1, GRADIENT_FILL_RECT_V );
+            GdiGradientFill( hDC, vert, 2, g_rect, 1, GRADIENT_FILL_RECT_V );
         }
 
         // gradient at the bottom
@@ -469,7 +469,7 @@ static void impl_drawAeroToolbar( HDC hDC, RECT rc, bool bHorizontal )
             { rc.left, gradient_break,   0xfa00, 0xfa00, 0xfa00, 0xff00 },
             { rc.right, gradient_bottom, 0xf000, 0xf000, 0xf000, 0xff00 }
         };
-        GradientFill( hDC, vert, 2, g_rect, 1, GRADIENT_FILL_RECT_V );
+        GdiGradientFill( hDC, vert, 2, g_rect, 1, GRADIENT_FILL_RECT_V );
 
         // and a darker horizontal line under that
         HPEN hpen = CreatePen( PS_SOLID, 1, RGB( 0xb0, 0xb0, 0xb0 ) );
commit 525c37e7c46bf20838c21736514b220c27e1d4cd
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Tue Mar 7 14:44:16 2017 +0000

    ofz: leak in loading ppts
    
    regression from
    
    commit 5e10e6937a8d5117555a4dcc9520aca173d75c95
    Date:   Sat Jan 18 10:15:10 2014 +0100
    
        EDITENG : Remove usage of DBG_CTOR and DBG_DTOR.
    
    Change-Id: Id109f5bb23b1e4a93195548f880973ebc778515f
    (cherry picked from commit 0cbc0181d52433790bb607176ff01dcffc89ce99)
    Reviewed-on: https://gerrit.libreoffice.org/34952
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    (cherry picked from commit 098a25fc9b03fd4c65470d947b1e62ba922d2b23)

diff --git a/editeng/source/editeng/editdoc.hxx b/editeng/source/editeng/editdoc.hxx
index fbc99a7..63d5961 100644
--- a/editeng/source/editeng/editdoc.hxx
+++ b/editeng/source/editeng/editdoc.hxx
@@ -379,7 +379,7 @@ struct ExtraPortionInfo
 class TextPortion
 {
 private:
-    ExtraPortionInfo*   pExtraInfos;
+    std::unique_ptr<ExtraPortionInfo> xExtraInfos;
     sal_Int32           nLen;
     Size                aOutSz;
     PortionKind         nKind;
@@ -389,8 +389,7 @@ private:
 
 public:
                 TextPortion( sal_Int32 nL )
-                : pExtraInfos( nullptr )
-                , nLen( nL )
+                : nLen( nL )
                 , aOutSz( -1, -1 )
                 , nKind( PortionKind::TEXT )
                 , nRightToLeftLevel( 0 )
@@ -399,8 +398,7 @@ public:
                 }
 
                 TextPortion( const TextPortion& r )
-                : pExtraInfos( nullptr )
-                , nLen( r.nLen )
+                : nLen( r.nLen )
                 , aOutSz( r.aOutSz )
                 , nKind( r.nKind )
                 , nRightToLeftLevel( r.nRightToLeftLevel )
@@ -427,8 +425,8 @@ public:
 
     bool           HasValidSize() const        { return aOutSz.Width() != (-1); }
 
-    ExtraPortionInfo*   GetExtraInfos() const { return pExtraInfos; }
-    void                SetExtraInfos( ExtraPortionInfo* p ) { delete pExtraInfos; pExtraInfos = p; }
+    ExtraPortionInfo*   GetExtraInfos() const { return xExtraInfos.get(); }
+    void                SetExtraInfos( ExtraPortionInfo* p ) { xExtraInfos.reset(p); }
 };
 
 
commit 3bb21a252928360bcae8931a37841af5362d41b7
Author: Regina Henschel <rb.henschel at t-online.de>
Date:   Sat Feb 4 00:19:46 2017 +0100

    tdf#105656 only delete path if less than 2 points
    
    This prevents the crash. It might be related to
    gerrit #/c/33654
    
    Change-Id: I92907c7874964af722b69ed8afd9249e110b3401
    Reviewed-on: https://gerrit.libreoffice.org/33907
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: jan iversen <jani at documentfoundation.org>
    (cherry picked from commit 9e8f2afc2e2bbdbe136e74a24fb6c6eb94cde3c6)
    Reviewed-on: https://gerrit.libreoffice.org/34688
    Reviewed-by: Thorsten Behrens <Thorsten.Behrens at CIB.de>
    (cherry picked from commit 89f08aecf58c97cc75eaae1d7b5e8531b04eaccd)

diff --git a/svx/source/svdraw/svdopath.cxx b/svx/source/svdraw/svdopath.cxx
index 1ba7ff8..21feaf9 100644
--- a/svx/source/svdraw/svdopath.cxx
+++ b/svx/source/svdraw/svdopath.cxx
@@ -879,7 +879,7 @@ bool ImpPathForDragAndCreate::endPathDrag(SdrDragStat& rDrag)
                 basegfx::B2DPolygon aCandidate(aTempPolyPolygon.getB2DPolygon(nPoly));
                 aCandidate.remove(nPnt);
 
-                if((IsClosed(meObjectKind) && aCandidate.count() < 3L) || aCandidate.count() < 2L)
+                if(aCandidate.count() < 2L)
                 {
                     aTempPolyPolygon.remove(nPoly);
                 }
commit 13cb8f2b18652e23694609ce5929b1613e2c81ec
Author: Miklos Vajna <vmiklos at collabora.co.uk>
Date:   Tue Mar 7 09:34:38 2017 +0100

    tdf#104287 RTF import: handle bitmap shapes inside tables
    
    Regression from commit 015fd55c94b7b650ed8e572cafaf3b0f903b01b9
    (tdf#96275 RTF import: fix anchor of shapes inside tables, 2016-05-10),
    the problem was that since shapes inside tables are now buffered, some
    previously hidden problems in the buffering became visible.
    
    For one, there was no code to make sure that a bitmap shape is not
    appended at the end of the buffer again when it gets re-played. For
    another, only the bitmap shape itself was buffered, not its size.
    
    (cherry picked from commit 8240be9170cc473506531dad2fda82469ae84443)
    
    Conflicts:
    	sw/qa/extras/rtfimport/rtfimport.cxx
    	writerfilter/source/rtftok/rtfvalue.cxx
    	writerfilter/source/rtftok/rtfvalue.hxx
    
    Change-Id: I04d65eb794ff6b160ef77af85479ba25ea5f8aa7
    Reviewed-on: https://gerrit.libreoffice.org/34953
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    (cherry picked from commit 9a899023db876630b74493da588b4a5490f90894)

diff --git a/sw/qa/extras/rtfimport/data/tdf104287.rtf b/sw/qa/extras/rtfimport/data/tdf104287.rtf
new file mode 100644
index 0000000..2ec87e6
--- /dev/null
+++ b/sw/qa/extras/rtfimport/data/tdf104287.rtf
@@ -0,0 +1,38 @@
+{\rtf1\ansi\deff3\adeflang1025
+\deftab709
+\viewscale100
+\formshade\paperh16838\paperw11906\margl1134\margr1134\margt1134\margb1134\sectd\sbknone\sectunlocked1\pgndec\pgwsxn11906\pghsxn16838\marglsxn1134\margrsxn1134\margtsxn1134\margbsxn1134\ftnbj\ftnstart1\ftnrstcont\ftnnar\aenddoc\aftnrstcont\aftnstart1\aftnnrlc
+{\*\ftnsep\chftnsep}
+\trowd\trql\ltrrow\trpaddft3\trpaddt0\trpaddfl3\trpaddl0\trpaddfb3\trpaddb0\trpaddfr3\trpaddr0\clbrdrt\brdrhair\brdrw1\brdrcf1\clpadfl3\clpadl55\clbrdrl\brdrhair\brdrw1\brdrcf1\clpadft3\clpadt55\clbrdrb\brdrhair\brdrw1\brdrcf1\clpadfb3\clpadb55\clbrdrr\brdrhair\brdrw1\brdrcf1\clpadfr3\clpadr55\cellx9638\shpwr2\shpwrk3\shpbypara\shpbyignore\shptop0\shpbxcolumn\shpbxignore\shpleft0\pgndec\pard\plain \s20\noline\intbl\rtlch \ltrch\loch
+{\*\flymaincnt5\flyanchor0\flycntnt}
+{\shp
+{\*\shpinst\shpwr2\shpwrk3\shpbypara\shpbyignore\shptop0\shpbottom6332\shpbxcolumn\shpbxignore\shpleft0\shpright9528
+{\sp
+{\sn shapeType}
+{\sv 75}
+}
+{\sp
+{\sn wzDescription}
+{\sv }
+}
+{\sp
+{\sn wzName}
+{\sv }
+}
+{\sp
+{\sn pib}
+{\sv 
+{\pict\picscalex63\picscaley63\piccropl0\piccropr0\piccropt0\piccropb0\picw1002\pich666\picwgoal15030\pichgoal9990\pngblip
+{\*\blipuid ebd28c5d3cbcfd4779e8e481da18cc69}
+89504e470d0a1a0a0000000d4948445200000010000000100802000000909168360000015049444154789c9592c14a02511486bf99714ccb322d7521140541cb
+6a11448b164150fb8a363d41f4083d40cba0655044d0a637a837682fd1a6a2488b10b23475bcb77b671c491dc1cee23077e67cf7fcff39139252f29f08b59e3e
+1dae8b4c45998ff501a82e070f5cbd3366733acb5c6fa609fc0872651236df0deeca7d002a6cc33d1b941a146ab49ca937e37610e0c590c5c92b67f926a07243
+b293613f8b1108a8a84aadb01575c9799edd0c895010a0ae71048e77b99b6a92e53861a387a48a6033c5d208c297a43ca8a3697601d217b010632dd9a9f34be0
+9968021698bea4c76ab72f5dd0d6216c3211e1bec2a0c5e59bce9303baa770c7bd38aca7d729692bcd4d512b53bb3b7cc2f45dd604ab098e67b499366025ce5e
+96a317fd2162e2d76bbbb725bdcd80b12a603aca4581e7aade97e14ec2916ca719ed96e4c54692f5241f755de7019641eacfaff10b469261dc6a800dd30000000049454e44ae426082}
+}
+}
+}
+}
+\cell\row\pard\pard\plain \s0\widctlpar\hyphpar0\cf0\kerning1\dbch\af8\langfe2052\dbch\af6\afs24\alang1081\loch\f3\hich\af3\fs24\lang1043\rtlch \ltrch\loch
+\par }
diff --git a/sw/qa/extras/rtfimport/rtfimport.cxx b/sw/qa/extras/rtfimport/rtfimport.cxx
index 54e4758..1b9a2cc 100644
--- a/sw/qa/extras/rtfimport/rtfimport.cxx
+++ b/sw/qa/extras/rtfimport/rtfimport.cxx
@@ -2738,6 +2738,14 @@ DECLARE_RTFIMPORT_TEST(testTdf104744, "tdf104744.rtf")
     CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(1270), getProperty<sal_Int32>(getParagraph(1), "ParaLeftMargin"));
 }
 
+DECLARE_RTFIMPORT_TEST(testTdf104287, "tdf104287.rtf")
+{
+    uno::Reference<text::XTextContent> xShape(getShape(1), uno::UNO_QUERY);
+    CPPUNIT_ASSERT(xShape.is());
+    // This failed, the bitmap had no valid anchor.
+    CPPUNIT_ASSERT(xShape->getAnchor().is());
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.cxx b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
index 19bc159..07ecb5f 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.cxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.cxx
@@ -1530,7 +1530,14 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer,
         else if (std::get<0>(aTuple) == BUFFER_STARTSHAPE)
             m_pSdrImport->resolve(std::get<1>(aTuple)->getShape(), false, RTFSdrImport::SHAPE);
         else if (std::get<0>(aTuple) == BUFFER_RESOLVESHAPE)
+        {
+            // Make sure there is no current buffer while replaying the shape,
+            // otherwise it gets re-buffered.
+            RTFBuffer_t* pCurrentBuffer = m_aStates.top().pCurrentBuffer;
+            m_aStates.top().pCurrentBuffer = nullptr;
             m_pSdrImport->resolve(std::get<1>(aTuple)->getShape(), true, RTFSdrImport::SHAPE);
+            m_aStates.top().pCurrentBuffer = pCurrentBuffer;
+        }
         else if (std::get<0>(aTuple) == BUFFER_ENDSHAPE)
             m_pSdrImport->close();
         else if (std::get<0>(aTuple) == BUFFER_RESOLVESUBSTREAM)
@@ -1541,6 +1548,8 @@ void RTFDocumentImpl::replayBuffer(RTFBuffer_t& rBuffer,
             OUString aCustomMark = rAttributes.find(2)->getString();
             resolveSubstream(nPos, nId, aCustomMark);
         }
+        else if (std::get<0>(aTuple) == BUFFER_PICTURE)
+            m_aStates.top().aPicture = std::get<1>(aTuple)->getPicture();
         else
             assert(false);
     }
@@ -2085,6 +2094,10 @@ RTFError RTFDocumentImpl::popState()
             else
             {
                 // Shape inside table: buffer the import to have correct anchor position.
+                // Also buffer the RTFPicture of the state stack as it contains
+                // the shape size.
+                auto pPictureValue = std::make_shared<RTFValue>(m_aStates.top().aPicture);
+                m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_PICTURE, pPictureValue, nullptr));
                 auto pValue = std::make_shared<RTFValue>(m_aStates.top().aShape);
                 m_aStates.top().pCurrentBuffer->push_back(Buf_t(BUFFER_RESOLVESHAPE, pValue, nullptr));
             }
diff --git a/writerfilter/source/rtftok/rtfdocumentimpl.hxx b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
index 09905dc..bb79a6e 100644
--- a/writerfilter/source/rtftok/rtfdocumentimpl.hxx
+++ b/writerfilter/source/rtftok/rtfdocumentimpl.hxx
@@ -59,7 +59,9 @@ enum RTFBufferTypes
     /// Imports a shape.
     BUFFER_RESOLVESHAPE,
     BUFFER_ENDSHAPE,
-    BUFFER_RESOLVESUBSTREAM
+    BUFFER_RESOLVESUBSTREAM,
+    /// Restores RTFParserState::aPicture.
+    BUFFER_PICTURE
 };
 
 /// Form field types
diff --git a/writerfilter/source/rtftok/rtfvalue.cxx b/writerfilter/source/rtftok/rtfvalue.cxx
index dbfe14c..4814e88 100644
--- a/writerfilter/source/rtftok/rtfvalue.cxx
+++ b/writerfilter/source/rtftok/rtfvalue.cxx
@@ -24,7 +24,8 @@ RTFValue::RTFValue(int nValue, const OUString& sValue,
                    uno::Reference<io::XInputStream> const& xStream,
                    uno::Reference<embed::XEmbeddedObject> const& xObject,
                    bool bForceString,
-                   const RTFShape& aShape)
+                   const RTFShape& aShape,
+                   const RTFPicture& rPicture)
     : m_nValue(nValue),
       m_sValue(sValue),
       m_pAttributes(std::make_shared<RTFSprms>(rAttributes)),
@@ -33,7 +34,8 @@ RTFValue::RTFValue(int nValue, const OUString& sValue,
       m_xStream(xStream),
       m_xObject(xObject),
       m_bForceString(bForceString),
-      m_pShape(std::make_shared<RTFShape>(aShape))
+      m_pShape(std::make_shared<RTFShape>(aShape)),
+      m_pPicture(std::make_shared<RTFPicture>(rPicture))
 {
 }
 
@@ -46,7 +48,8 @@ RTFValue::RTFValue()
       m_xStream(),
       m_xObject(),
       m_bForceString(false),
-      m_pShape(std::make_shared<RTFShape>())
+      m_pShape(std::make_shared<RTFShape>()),
+      m_pPicture(std::make_shared<RTFPicture>())
 {
 }
 
@@ -58,7 +61,8 @@ RTFValue::RTFValue(int nValue)
       m_xShape(),
       m_xStream(),
       m_xObject(),
-      m_bForceString(false)
+      m_bForceString(false),
+      m_pPicture(std::make_shared<RTFPicture>())
 {
     m_pShape.reset(new RTFShape());
 }
@@ -72,7 +76,8 @@ RTFValue::RTFValue(const OUString& sValue, bool bForce)
       m_xStream(),
       m_xObject(),
       m_bForceString(bForce),
-      m_pShape(std::make_shared<RTFShape>())
+      m_pShape(std::make_shared<RTFShape>()),
+      m_pPicture(std::make_shared<RTFPicture>())
 {
 }
 
@@ -85,7 +90,8 @@ RTFValue::RTFValue(RTFSprms rAttributes)
       m_xStream(),
       m_xObject(),
       m_bForceString(false),
-      m_pShape(std::make_shared<RTFShape>())
+      m_pShape(std::make_shared<RTFShape>()),
+      m_pPicture(std::make_shared<RTFPicture>())
 {
 }
 
@@ -98,7 +104,8 @@ RTFValue::RTFValue(RTFSprms rAttributes, RTFSprms rSprms)
       m_xStream(),
       m_xObject(),
       m_bForceString(false),
-      m_pShape(std::make_shared<RTFShape>())
+      m_pShape(std::make_shared<RTFShape>()),
+      m_pPicture(std::make_shared<RTFPicture>())
 {
 }
 
@@ -111,7 +118,8 @@ RTFValue::RTFValue(uno::Reference<drawing::XShape> const& xShape)
       m_xStream(),
       m_xObject(),
       m_bForceString(false),
-      m_pShape(std::make_shared<RTFShape>())
+      m_pShape(std::make_shared<RTFShape>()),
+      m_pPicture(std::make_shared<RTFPicture>())
 {
 }
 
@@ -124,7 +132,8 @@ RTFValue::RTFValue(uno::Reference<io::XInputStream> const& xStream)
       m_xStream(xStream),
       m_xObject(),
       m_bForceString(false),
-      m_pShape(std::make_shared<RTFShape>())
+      m_pShape(std::make_shared<RTFShape>()),
+      m_pPicture(std::make_shared<RTFPicture>())
 {
 }
 
@@ -137,7 +146,8 @@ RTFValue::RTFValue(uno::Reference<embed::XEmbeddedObject> const& xObject)
       m_xStream(),
       m_xObject(xObject),
       m_bForceString(false),
-      m_pShape(std::make_shared<RTFShape>())
+      m_pShape(std::make_shared<RTFShape>()),
+      m_pPicture(std::make_shared<RTFPicture>())
 {
 }
 
@@ -150,7 +160,18 @@ RTFValue::RTFValue(const RTFShape& aShape)
       m_xStream(),
       m_xObject(),
       m_bForceString(false),
-      m_pShape(std::make_shared<RTFShape>(aShape))
+      m_pShape(std::make_shared<RTFShape>(aShape)),
+      m_pPicture(std::make_shared<RTFPicture>())
+{
+}
+
+RTFValue::RTFValue(const RTFPicture& rPicture)
+    : m_nValue(),
+      m_pAttributes(std::make_shared<RTFSprms>()),
+      m_pSprms(std::make_shared<RTFSprms>()),
+      m_bForceString(false),
+      m_pShape(std::make_shared<RTFShape>()),
+      m_pPicture(std::make_shared<RTFPicture>(rPicture))
 {
 }
 
@@ -195,6 +216,11 @@ RTFShape& RTFValue::getShape() const
     return *m_pShape;
 }
 
+RTFPicture& RTFValue::getPicture() const
+{
+    return *m_pPicture;
+}
+
 writerfilter::Reference<Properties>::Pointer_t RTFValue::getProperties()
 {
     return std::make_shared<RTFReferenceProperties>(*m_pAttributes, *m_pSprms);
@@ -217,12 +243,12 @@ std::string RTFValue::toString() const
 
 RTFValue* RTFValue::Clone()
 {
-    return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_xObject, m_bForceString, *m_pShape);
+    return new RTFValue(m_nValue, m_sValue, *m_pAttributes, *m_pSprms, m_xShape, m_xStream, m_xObject, m_bForceString, *m_pShape, *m_pPicture);
 }
 
 RTFValue* RTFValue::CloneWithSprms(RTFSprms const& rAttributes, RTFSprms const& rSprms)
 {
-    return new RTFValue(m_nValue, m_sValue, rAttributes, rSprms, m_xShape, m_xStream, m_xObject, m_bForceString, *m_pShape);
+    return new RTFValue(m_nValue, m_sValue, rAttributes, rSprms, m_xShape, m_xStream, m_xObject, m_bForceString, *m_pShape, *m_pPicture);
 }
 
 bool RTFValue::equals(RTFValue& rOther)
diff --git a/writerfilter/source/rtftok/rtfvalue.hxx b/writerfilter/source/rtftok/rtfvalue.hxx
index eeb9730..6892581 100644
--- a/writerfilter/source/rtftok/rtfvalue.hxx
+++ b/writerfilter/source/rtftok/rtfvalue.hxx
@@ -20,6 +20,7 @@ namespace rtftok
 {
 class RTFSprms;
 class RTFShape;
+class RTFPicture;
 /// Value of an RTF keyword
 class RTFValue
     : public Value
@@ -30,7 +31,7 @@ public:
              css::uno::Reference<css::drawing::XShape> const& xShape,
              css::uno::Reference<css::io::XInputStream> const& xStream,
              css::uno::Reference<css::embed::XEmbeddedObject> const& xObject,
-             bool bForceString, const RTFShape& aShape);
+             bool bForceString, const RTFShape& aShape, const RTFPicture& rPicture);
     RTFValue();
     RTFValue(int nValue);
     RTFValue(const OUString& sValue, bool bForce = false);
@@ -40,6 +41,7 @@ public:
     RTFValue(css::uno::Reference<css::io::XInputStream> const& xStream);
     RTFValue(css::uno::Reference<css::embed::XEmbeddedObject> const& xObject);
     RTFValue(const RTFShape& aShape);
+    RTFValue(const RTFPicture& rPicture);
     virtual ~RTFValue() override;
     void setString(const OUString& sValue);
     virtual int getInt() const override;
@@ -55,6 +57,7 @@ public:
     RTFSprms& getAttributes();
     RTFSprms& getSprms();
     RTFShape& getShape() const;
+    RTFPicture& getPicture() const;
     bool equals(RTFValue& rOther);
 private:
     RTFValue& operator=(RTFValue const& rOther) = delete;
@@ -67,6 +70,7 @@ private:
     css::uno::Reference<css::embed::XEmbeddedObject> m_xObject;
     bool m_bForceString;
     std::shared_ptr<RTFShape> m_pShape;
+    std::shared_ptr<RTFPicture> m_pPicture;
 };
 } // namespace rtftok
 } // namespace writerfilter
commit b6da47459bfb909001d5cf7a97e8a15f653ce796
Author: Michael Stahl <mstahl at redhat.com>
Date:   Tue Mar 7 23:12:44 2017 +0100

    tdf#106218 sw: compare document: tweak special handling of EndOfContent
    
    In case the last paragraph in the document is inserted or deleted, the
    redline must not be positioned on the EndOfContent node (i#101009).
    
    But then rejecting the redline will have an additional paragraph as
    compared to the original document.  Try to avoid that by tweaking the
    start position of the redline to the end of the previous paragraph.
    
    (regression from f4609c4c294a62023b6cd6baeb6a73d44992dec3)
    
    Change-Id: Iae75042a3124d0f3bca955fb856c94a6f478b986
    (cherry picked from commit 9b3fa51e7ba4e2bfe9806295c3cbc8db347480d8)
    Reviewed-on: https://gerrit.libreoffice.org/34960
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Caolán McNamara <caolanm at redhat.com>
    Tested-by: Caolán McNamara <caolanm at redhat.com>
    (cherry picked from commit a990b46ccc788db45ff4d8f0d47b799782ecb2af)

diff --git a/sw/source/core/doc/doccomp.cxx b/sw/source/core/doc/doccomp.cxx
index 5357682..c2da0bc 100644
--- a/sw/source/core/doc/doccomp.cxx
+++ b/sw/source/core/doc/doccomp.cxx
@@ -1683,6 +1683,17 @@ void CompareData::SetRedlinesToDoc( bool bUseDocInfo )
                 SwContentNode *const pContentNode( pTmp->GetContentNode() );
                 pTmp->GetPoint()->nContent.Assign( pContentNode,
                         (pContentNode) ? pContentNode->Len() : 0 );
+                // tdf#106218 try to avoid losing a paragraph break here:
+                if (pTmp->GetMark()->nContent == 0)
+                {
+                    SwNodeIndex const prev(pTmp->GetMark()->nNode, -1);
+                    if (prev.GetNode().IsTextNode())
+                    {
+                        *pTmp->GetMark() = SwPosition(
+                            *prev.GetNode().GetTextNode(),
+                            prev.GetNode().GetTextNode()->Len());
+                    }
+                }
             }
 
             rDoc.getIDocumentRedlineAccess().DeleteRedline( *pTmp, false, USHRT_MAX );
@@ -1715,6 +1726,17 @@ void CompareData::SetRedlinesToDoc( bool bUseDocInfo )
                 SwContentNode *const pContentNode( pTmp->GetContentNode() );
                 pTmp->GetPoint()->nContent.Assign( pContentNode,
                         (pContentNode) ? pContentNode->Len() : 0 );
+                // tdf#106218 try to avoid losing a paragraph break here:
+                if (pTmp->GetMark()->nContent == 0)
+                {
+                    SwNodeIndex const prev(pTmp->GetMark()->nNode, -1);
+                    if (prev.GetNode().IsTextNode())
+                    {
+                        *pTmp->GetMark() = SwPosition(
+                            *prev.GetNode().GetTextNode(),
+                            prev.GetNode().GetTextNode()->Len());
+                    }
+                }
             }
         } while( pInsRing != ( pTmp = pTmp->GetNext()) );
         SwRedlineData aRedlnData( nsRedlineType_t::REDLINE_INSERT, nAuthor, aTimeStamp,
commit e05286af282812b14250c7e026825edfb2c76491
Author: Kohei Yoshida <kohei.yoshida at collabora.com>
Date:   Tue Feb 28 17:52:10 2017 -0500

    Revert my fix for tdf#71409, to hopefully fix tdf#104381.
    
    This reverts commit 87e040fd0f04307534920d0765af6d5878794a98.
    This reverts commit a0ef7474521413c8967559a635e6fdc0d88f1df6.
    
    Conflicts:
    	vcl/unx/gtk/a11y/atkutil.cxx
    
    Change-Id: Ib3a799e27b2495ebd1e7723f1cb5babf0dfbc702
    Reviewed-on: https://gerrit.libreoffice.org/34730
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Kohei Yoshida <libreoffice at kohei.us>
    (cherry picked from commit 10077a06d8f6d08f276f99024528ee31a57390a9)
    Reviewed-on: https://gerrit.libreoffice.org/34732
    Reviewed-by: Michael Meeks <michael.meeks at collabora.com>
    Tested-by: Michael Meeks <michael.meeks at collabora.com>
    (cherry picked from commit 6f36ee01ab3d7934880bfd8b5d337288dcbf62c7)

diff --git a/vcl/unx/gtk/a11y/atkaction.cxx b/vcl/unx/gtk/a11y/atkaction.cxx
index ef3c2ba..c9e3ec7 100644
--- a/vcl/unx/gtk/a11y/atkaction.cxx
+++ b/vcl/unx/gtk/a11y/atkaction.cxx
@@ -48,11 +48,14 @@ static css::uno::Reference<css::accessibility::XAccessibleAction>
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( action );
 
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleAction> xAction(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xAction;
+        if( !pWrap->mpAction.is() )
+        {
+            pWrap->mpAction.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpAction;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleAction>();
diff --git a/vcl/unx/gtk/a11y/atkcomponent.cxx b/vcl/unx/gtk/a11y/atkcomponent.cxx
index 60600b2..cbc4b8e 100644
--- a/vcl/unx/gtk/a11y/atkcomponent.cxx
+++ b/vcl/unx/gtk/a11y/atkcomponent.cxx
@@ -27,11 +27,14 @@ static css::uno::Reference<css::accessibility::XAccessibleComponent>
     getComponent( AtkComponent *pComponent ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pComponent );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleComponent> xComp(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xComp;
+        if( !pWrap->mpComponent.is() )
+        {
+            pWrap->mpComponent.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpComponent;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleComponent>();
diff --git a/vcl/unx/gtk/a11y/atkeditabletext.cxx b/vcl/unx/gtk/a11y/atkeditabletext.cxx
index ee984bd..f601f13 100644
--- a/vcl/unx/gtk/a11y/atkeditabletext.cxx
+++ b/vcl/unx/gtk/a11y/atkeditabletext.cxx
@@ -31,11 +31,14 @@ static css::uno::Reference<css::accessibility::XAccessibleEditableText>
     getEditableText( AtkEditableText *pEditableText ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pEditableText );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleEditableText> xET(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xET;
+        if( !pWrap->mpEditableText.is() )
+        {
+            pWrap->mpEditableText.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpEditableText;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleEditableText>();
diff --git a/vcl/unx/gtk/a11y/atkhypertext.cxx b/vcl/unx/gtk/a11y/atkhypertext.cxx
index 4c28bab..ff95255 100644
--- a/vcl/unx/gtk/a11y/atkhypertext.cxx
+++ b/vcl/unx/gtk/a11y/atkhypertext.cxx
@@ -193,11 +193,14 @@ static css::uno::Reference<css::accessibility::XAccessibleHypertext>
     getHypertext( AtkHypertext *pHypertext ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pHypertext );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleHypertext> xAH(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xAH;
+        if( !pWrap->mpHypertext.is() )
+        {
+            pWrap->mpHypertext.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpHypertext;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleHypertext>();
diff --git a/vcl/unx/gtk/a11y/atkimage.cxx b/vcl/unx/gtk/a11y/atkimage.cxx
index 873cddd..c1652a4 100644
--- a/vcl/unx/gtk/a11y/atkimage.cxx
+++ b/vcl/unx/gtk/a11y/atkimage.cxx
@@ -39,11 +39,14 @@ static css::uno::Reference<css::accessibility::XAccessibleImage>
     getImage( AtkImage *pImage ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pImage );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleImage> xAI(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xAI;
+        if( !pWrap->mpImage.is() )
+        {
+            pWrap->mpImage.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpImage;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleImage>();
diff --git a/vcl/unx/gtk/a11y/atklistener.cxx b/vcl/unx/gtk/a11y/atklistener.cxx
index 39930b2..5cc6083 100644
--- a/vcl/unx/gtk/a11y/atklistener.cxx
+++ b/vcl/unx/gtk/a11y/atklistener.cxx
@@ -121,9 +121,6 @@ void AtkListener::updateChildList(
     css::uno::Reference<css::accessibility::XAccessibleContext> const &
         pContext)
 {
-    if (!pContext.is())
-        return;
-
      m_aChildList.clear();
 
      uno::Reference< accessibility::XAccessibleStateSet > xStateSet = pContext->getAccessibleStateSet();
@@ -258,19 +255,6 @@ void AtkListener::handleInvalidateChildren(
     }
 }
 
-void AtkListener::stopListening()
-{
-    uno::Reference<accessibility::XAccessibleEventBroadcaster> xBroadcaster(
-        mpWrapper->mpContext.get(), uno::UNO_QUERY);
-
-    if (xBroadcaster.is())
-    {
-        uno::Reference<accessibility::XAccessibleEventListener> xListener(this);
-        if (xListener.is())
-            xBroadcaster->removeAccessibleEventListener(xListener);
-    }
-}
-
 /*****************************************************************************/
 
 static uno::Reference< accessibility::XAccessibleContext >
@@ -362,10 +346,6 @@ void AtkListener::notifyEvent( const accessibility::AccessibleEventObject& aEven
             gboolean bState = eNewState != ATK_STATE_INVALID;
             AtkStateType eRealState = bState ? eNewState : eOldState;
 
-            if (eOldState == ATK_STATE_FOCUSED)
-                // Stop listening to object going out-of-focus.
-                stopListening();
-
             atk_object_notify_state_change( atk_obj, eRealState, bState );
             break;
         }
diff --git a/vcl/unx/gtk/a11y/atklistener.hxx b/vcl/unx/gtk/a11y/atklistener.hxx
index fccf031..39dbe5d 100644
--- a/vcl/unx/gtk/a11y/atklistener.hxx
+++ b/vcl/unx/gtk/a11y/atklistener.hxx
@@ -66,8 +66,6 @@ private:
     // Process INVALIDATE_ALL_CHILDREN notification
     void handleInvalidateChildren(
         const css::uno::Reference< css::accessibility::XAccessibleContext >& rxParent);
-
-    void stopListening();
 };
 
 #endif // INCLUDED_VCL_UNX_GTK_A11Y_ATKLISTENER_HXX
diff --git a/vcl/unx/gtk/a11y/atkselection.cxx b/vcl/unx/gtk/a11y/atkselection.cxx
index 62dd428..eb3b2fc 100644
--- a/vcl/unx/gtk/a11y/atkselection.cxx
+++ b/vcl/unx/gtk/a11y/atkselection.cxx
@@ -27,11 +27,14 @@ static css::uno::Reference<css::accessibility::XAccessibleSelection>
     getSelection( AtkSelection *pSelection ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pSelection );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleSelection> xAS(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xAS;
+        if( !pWrap->mpSelection.is() )
+        {
+            pWrap->mpSelection.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpSelection;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleSelection>();
diff --git a/vcl/unx/gtk/a11y/atktable.cxx b/vcl/unx/gtk/a11y/atktable.cxx
index 75dd5a1..a3423f6 100644
--- a/vcl/unx/gtk/a11y/atktable.cxx
+++ b/vcl/unx/gtk/a11y/atktable.cxx
@@ -52,11 +52,14 @@ static css::uno::Reference<css::accessibility::XAccessibleTable>
     getTable( AtkTable *pTable ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pTable );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleTable> xAT(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xAT;
+        if( !pWrap->mpTable.is() )
+        {
+            pWrap->mpTable.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpTable;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleTable>();
diff --git a/vcl/unx/gtk/a11y/atktext.cxx b/vcl/unx/gtk/a11y/atktext.cxx
index fbfd0fb..425b335 100644
--- a/vcl/unx/gtk/a11y/atktext.cxx
+++ b/vcl/unx/gtk/a11y/atktext.cxx
@@ -137,11 +137,14 @@ static css::uno::Reference<css::accessibility::XAccessibleText>
     getText( AtkText *pText ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleText> xAT(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xAT;
+        if( !pWrap->mpText.is() )
+        {
+            pWrap->mpText.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpText;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleText>();
@@ -153,11 +156,14 @@ static css::uno::Reference<css::accessibility::XAccessibleTextMarkup>
     getTextMarkup( AtkText *pText ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleTextMarkup> xATM(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xATM;
+        if( !pWrap->mpTextMarkup.is() )
+        {
+            pWrap->mpTextMarkup.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpTextMarkup;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleTextMarkup>();
@@ -169,11 +175,14 @@ static css::uno::Reference<css::accessibility::XAccessibleTextAttributes>
     getTextAttributes( AtkText *pText ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleTextAttributes> xATA(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xATA;
+        if( !pWrap->mpTextAttributes.is() )
+        {
+            pWrap->mpTextAttributes.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpTextAttributes;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleTextAttributes>();
@@ -185,11 +194,14 @@ static css::uno::Reference<css::accessibility::XAccessibleMultiLineText>
     getMultiLineText( AtkText *pText ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleMultiLineText> xAML(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xAML;
+        if( !pWrap->mpMultiLineText.is() )
+        {
+            pWrap->mpMultiLineText.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpMultiLineText;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleMultiLineText>();
diff --git a/vcl/unx/gtk/a11y/atktextattributes.cxx b/vcl/unx/gtk/a11y/atktextattributes.cxx
index 51c9618..a9e26ca 100644
--- a/vcl/unx/gtk/a11y/atktextattributes.cxx
+++ b/vcl/unx/gtk/a11y/atktextattributes.cxx
@@ -211,11 +211,14 @@ static css::uno::Reference<css::accessibility::XAccessibleComponent>
     getComponent( AtkText *pText ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pText );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleComponent> xAC(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xAC;
+        if( !pWrap->mpComponent.is() )
+        {
+            pWrap->mpComponent.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpComponent;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleComponent>();
diff --git a/vcl/unx/gtk/a11y/atkutil.cxx b/vcl/unx/gtk/a11y/atkutil.cxx
index bf80973..7084177 100644
--- a/vcl/unx/gtk/a11y/atkutil.cxx
+++ b/vcl/unx/gtk/a11y/atkutil.cxx
@@ -86,24 +86,17 @@ atk_wrapper_focus_idle_handler (gpointer data)
             // also emit state-changed:focused event under the same condition.
             {
                 AtkObjectWrapper* wrapper_obj = ATK_OBJECT_WRAPPER (atk_obj);
-
-                if (wrapper_obj)
+                if( wrapper_obj && !wrapper_obj->mpText.is() )
                 {
-                    uno::Reference<accessibility::XAccessibleText> xText(
-                        wrapper_obj->mpContext.get(), uno::UNO_QUERY);
-
-                    if (xText.is())
+                    wrapper_obj->mpText.set(wrapper_obj->mpContext, css::uno::UNO_QUERY);
+                    if ( wrapper_obj->mpText.is() )
                     {
-                        try {
-                            gint caretPos = xText->getCaretPosition();
-
-                            if ( caretPos != -1 )
-                            {
-                                atk_object_notify_state_change( atk_obj, ATK_STATE_FOCUSED, TRUE );
-                                g_signal_emit_by_name( atk_obj, "text_caret_moved", caretPos );
-                            }
-                        } catch (const uno::Exception& e) {
-                            SAL_INFO("vcl.a11y", "exception: " << e.Message);
+                        gint caretPos = wrapper_obj->mpText->getCaretPosition();
+
+                        if ( caretPos != -1 )
+                        {
+                            atk_object_notify_state_change( atk_obj, ATK_STATE_FOCUSED, TRUE );
+                            g_signal_emit_by_name( atk_obj, "text_caret_moved", caretPos );
                         }
                     }
                 }
diff --git a/vcl/unx/gtk/a11y/atkvalue.cxx b/vcl/unx/gtk/a11y/atkvalue.cxx
index def434b..7babb6b 100644
--- a/vcl/unx/gtk/a11y/atkvalue.cxx
+++ b/vcl/unx/gtk/a11y/atkvalue.cxx
@@ -29,11 +29,14 @@ static css::uno::Reference<css::accessibility::XAccessibleValue>
     getValue( AtkValue *pValue ) throw (uno::RuntimeException)
 {
     AtkObjectWrapper *pWrap = ATK_OBJECT_WRAPPER( pValue );
-    if (pWrap)
+    if( pWrap )
     {
-        uno::Reference<accessibility::XAccessibleValue> xAV(
-            pWrap->mpContext.get(), uno::UNO_QUERY);
-        return xAV;
+        if( !pWrap->mpValue.is() )
+        {
+            pWrap->mpValue.set(pWrap->mpContext, css::uno::UNO_QUERY);
+        }
+
+        return pWrap->mpValue;
     }
 
     return css::uno::Reference<css::accessibility::XAccessibleValue>();
diff --git a/vcl/unx/gtk/a11y/atkwrapper.cxx b/vcl/unx/gtk/a11y/atkwrapper.cxx
index e9f3156..52f9218 100644
--- a/vcl/unx/gtk/a11y/atkwrapper.cxx
+++ b/vcl/unx/gtk/a11y/atkwrapper.cxx
@@ -335,31 +335,25 @@ wrapper_get_name( AtkObject *atk_obj )
 {
     AtkObjectWrapper *obj = ATK_OBJECT_WRAPPER (atk_obj);
 
-    if (obj)
+    if( obj->mpContext.is() )
     {
-        uno::Reference<accessibility::XAccessibleContext> xContext(
-            obj->mpContext.get(), uno::UNO_QUERY);
-
-        if (xContext.is())
-        {
-            try {
-                OString aName =
-                    OUStringToOString(
-                        xContext->getAccessibleName(),
-                        RTL_TEXTENCODING_UTF8);
-
-                int nCmp = atk_obj->name ? rtl_str_compare( atk_obj->name, aName.getStr() ) : -1;
-                if( nCmp != 0 )
-                {
-                    if( atk_obj->name )
-                        g_free(atk_obj->name);
-                    atk_obj->name = g_strdup(aName.getStr());
-                }
-            }
-            catch(const uno::Exception&) {
-                g_warning( "Exception in getAccessibleName()" );
+        try {
+            OString aName =
+                OUStringToOString(
+                    obj->mpContext->getAccessibleName(),
+                    RTL_TEXTENCODING_UTF8);
+
+            int nCmp = atk_obj->name ? rtl_str_compare( atk_obj->name, aName.getStr() ) : -1;
+            if( nCmp != 0 )
+            {
+                if( atk_obj->name )
+                    g_free(atk_obj->name);
+                atk_obj->name = g_strdup(aName.getStr());
             }
         }
+        catch(const uno::Exception&) {
+            g_warning( "Exception in getAccessibleName()" );
+        }
     }
 
     return ATK_OBJECT_CLASS (parent_class)->get_name(atk_obj);
@@ -372,23 +366,19 @@ wrapper_get_description( AtkObject *atk_obj )
 {
     AtkObjectWrapper *obj = ATK_OBJECT_WRAPPER (atk_obj);
 
-    if (obj)
+    if( obj->mpContext.is() )
     {
-        uno::Reference<accessibility::XAccessibleContext> xContext(obj->mpContext.get(), uno::UNO_QUERY);
-        if (xContext.is())
-        {
-            try {
-                OString aDescription =
-                    OUStringToOString(
-                        xContext->getAccessibleDescription(),
-                        RTL_TEXTENCODING_UTF8);
-
-                g_free(atk_obj->description);
-                atk_obj->description = g_strdup(aDescription.getStr());
-            }
-            catch(const uno::Exception&) {
-                g_warning( "Exception in getAccessibleDescription()" );
-            }
+        try {
+            OString aDescription =
+                OUStringToOString(
+                    obj->mpContext->getAccessibleDescription(),
+                    RTL_TEXTENCODING_UTF8);
+
+            g_free(atk_obj->description);
+            atk_obj->description = g_strdup(aDescription.getStr());
+        }
+        catch(const uno::Exception&) {
+            g_warning( "Exception in getAccessibleDescription()" );
         }
     }
 
@@ -407,7 +397,7 @@ wrapper_get_attributes( AtkObject *atk_obj )
     try
     {
         uno::Reference< accessibility::XAccessibleExtendedAttributes >
-            xExtendedAttrs(obj->mpContext.get(), uno::UNO_QUERY);
+            xExtendedAttrs( obj->mpContext, uno::UNO_QUERY );
         if( xExtendedAttrs.is() )
             pSet = attribute_set_new_from_extended_attributes( xExtendedAttrs );
     }
@@ -427,20 +417,14 @@ wrapper_get_n_children( AtkObject *atk_obj )
     AtkObjectWrapper *obj = ATK_OBJECT_WRAPPER (atk_obj);
     gint n = 0;
 
-    if (!obj)
-        return n;
-
-    uno::Reference<accessibility::XAccessibleContext> xContext(obj->mpContext.get(), uno::UNO_QUERY);
-    if (!xContext.is())
-        return n;
-
-    try
-    {
-        n = xContext->getAccessibleChildCount();
-    }
-    catch(const uno::Exception&)
+    if( obj->mpContext.is() )
     {
-        OSL_FAIL("Exception in getAccessibleChildCount()" );
+        try {
+            n = obj->mpContext->getAccessibleChildCount();
+        }
+        catch(const uno::Exception&) {
+            OSL_FAIL("Exception in getAccessibleChildCount()" );
+        }
     }
 
     return n;
@@ -462,22 +446,17 @@ wrapper_ref_child( AtkObject *atk_obj,
         return obj->child_about_to_be_removed;
     }
 
-    if (!obj)
-        return child;
-
-    uno::Reference<accessibility::XAccessibleContext> xContext(obj->mpContext.get(), uno::UNO_QUERY);
-    if (!xContext.is())
-        return child;
-
-    try
+    if( obj->mpContext.is() )
     {
-        uno::Reference< accessibility::XAccessible > xAccessible =
-            xContext->getAccessibleChild( i );
+        try {
+            uno::Reference< accessibility::XAccessible > xAccessible =
+                obj->mpContext->getAccessibleChild( i );
 
-        child = atk_object_wrapper_ref( xAccessible );
-    }
-    catch(const uno::Exception&) {
-        OSL_FAIL("Exception in getAccessibleChild");
+            child = atk_object_wrapper_ref( xAccessible );
+        }
+        catch(const uno::Exception&) {
+            OSL_FAIL("Exception in getAccessibleChild");
+        }
     }
 
     return child;
@@ -491,17 +470,13 @@ wrapper_get_index_in_parent( AtkObject *atk_obj )
     AtkObjectWrapper *obj = ATK_OBJECT_WRAPPER (atk_obj);
     gint i = -1;
 
-    if (obj)
+    if( obj->mpContext.is() )
     {
-        uno::Reference<accessibility::XAccessibleContext> xContext(obj->mpContext.get(), uno::UNO_QUERY);
-        if (xContext.is())
-        {
-            try {
-                i = xContext->getAccessibleIndexInParent();
-            }
-            catch(const uno::Exception&) {
-                g_warning( "Exception in getAccessibleIndexInParent()" );
-            }
+        try {
+            i = obj->mpContext->getAccessibleIndexInParent();
+        }
+        catch(const uno::Exception&) {
+            g_warning( "Exception in getAccessibleIndexInParent()" );
         }
     }
     return i;
@@ -515,44 +490,40 @@ wrapper_ref_relation_set( AtkObject *atk_obj )
     AtkObjectWrapper *obj = ATK_OBJECT_WRAPPER (atk_obj);
     AtkRelationSet *pSet = atk_relation_set_new();
 
-    if (obj)
+    if( obj->mpContext.is() )
     {
-        uno::Reference<accessibility::XAccessibleContext> xContext(obj->mpContext.get(), uno::UNO_QUERY);
-        if (xContext.is())
-        {
-            try {
-                uno::Reference< accessibility::XAccessibleRelationSet > xRelationSet(
-                        xContext->getAccessibleRelationSet()
-                );
+        try {
+            uno::Reference< accessibility::XAccessibleRelationSet > xRelationSet(
+                    obj->mpContext->getAccessibleRelationSet()
+            );
+
+            sal_Int32 nRelations = xRelationSet.is() ? xRelationSet->getRelationCount() : 0;
+            for( sal_Int32 n = 0; n < nRelations; n++ )
+            {
+                accessibility::AccessibleRelation aRelation = xRelationSet->getRelation( n );
+                sal_uInt32 nTargetCount = aRelation.TargetSet.getLength();
+
+                std::vector<AtkObject*> aTargets;
 
-                sal_Int32 nRelations = xRelationSet.is() ? xRelationSet->getRelationCount() : 0;
-                for( sal_Int32 n = 0; n < nRelations; n++ )
+                for (sal_uInt32 i = 0; i < nTargetCount; ++i)
                 {
-                    accessibility::AccessibleRelation aRelation = xRelationSet->getRelation( n );
-                    sal_uInt32 nTargetCount = aRelation.TargetSet.getLength();
-
-                    std::vector<AtkObject*> aTargets;
-
-                    for (sal_uInt32 i = 0; i < nTargetCount; ++i)
-                    {
-                        uno::Reference< accessibility::XAccessible > xAccessible(
-                                aRelation.TargetSet[i], uno::UNO_QUERY );
-                        aTargets.push_back(atk_object_wrapper_ref(xAccessible));
-                    }
-
-                    AtkRelation *pRel =
-                        atk_relation_new(
-                            aTargets.data(), nTargetCount,
-                            mapRelationType( aRelation.RelationType )
-                        );
-                    atk_relation_set_add( pSet, pRel );
-                    g_object_unref( G_OBJECT( pRel ) );
+                    uno::Reference< accessibility::XAccessible > xAccessible(
+                            aRelation.TargetSet[i], uno::UNO_QUERY );
+                    aTargets.push_back(atk_object_wrapper_ref(xAccessible));
                 }
+
+                AtkRelation *pRel =
+                    atk_relation_new(
+                        aTargets.data(), nTargetCount,
+                        mapRelationType( aRelation.RelationType )
+                    );
+                atk_relation_set_add( pSet, pRel );
+                g_object_unref( G_OBJECT( pRel ) );
             }
-            catch(const uno::Exception &) {
-                g_object_unref( G_OBJECT( pSet ) );
-                pSet = nullptr;
-            }
+        }
+        catch(const uno::Exception &) {
+            g_object_unref( G_OBJECT( pSet ) );
+            pSet = nullptr;
         }
     }
 
@@ -565,43 +536,37 @@ wrapper_ref_state_set( AtkObject *atk_obj )
     AtkObjectWrapper *obj = ATK_OBJECT_WRAPPER (atk_obj);
     AtkStateSet *pSet = atk_state_set_new();
 
-    if (obj)
+    if( obj->mpContext.is() )
     {
-        uno::Reference<accessibility::XAccessibleContext> xContext(obj->mpContext.get(), uno::UNO_QUERY);
-        if (xContext.is())
-        {
-            try
+        try {
+            uno::Reference< accessibility::XAccessibleStateSet > xStateSet(
+                obj->mpContext->getAccessibleStateSet());
+
+            if( xStateSet.is() )
             {
-                uno::Reference< accessibility::XAccessibleStateSet > xStateSet(
-                    xContext->getAccessibleStateSet());
+                uno::Sequence< sal_Int16 > aStates = xStateSet->getStates();
 
-                if( xStateSet.is() )
+                for( sal_Int32 n = 0; n < aStates.getLength(); n++ )
                 {
-                    uno::Sequence< sal_Int16 > aStates = xStateSet->getStates();
-
-                    for( sal_Int32 n = 0; n < aStates.getLength(); n++ )
-                    {
-                        // ATK_STATE_LAST_DEFINED is used to check if the state
-                        // is unmapped, do not report it to Atk
-                        if ( mapAtkState( aStates[n] ) != ATK_STATE_LAST_DEFINED )
-                            atk_state_set_add_state( pSet, mapAtkState( aStates[n] ) );
-                    }
-
-                    // We need to emulate FOCUS state for menus, menu-items etc.
-                    if( atk_obj == atk_get_focus_object() )
-                        atk_state_set_add_state( pSet, ATK_STATE_FOCUSED );
+                    // ATK_STATE_LAST_DEFINED is used to check if the state
+                    // is unmapped, do not report it to Atk
+                    if ( mapAtkState( aStates[n] ) != ATK_STATE_LAST_DEFINED )
+                        atk_state_set_add_state( pSet, mapAtkState( aStates[n] ) );
+                }
+
+                // We need to emulate FOCUS state for menus, menu-items etc.
+                if( atk_obj == atk_get_focus_object() )
+                    atk_state_set_add_state( pSet, ATK_STATE_FOCUSED );
 /* FIXME - should we do this ?
-                    else
-                        atk_state_set_remove_state( pSet, ATK_STATE_FOCUSED );
+                else
+                    atk_state_set_remove_state( pSet, ATK_STATE_FOCUSED );
 */
-                }
             }
+        }
 
-            catch(const uno::Exception &)
-            {
-                g_warning( "Exception in wrapper_ref_state_set" );
-                atk_state_set_add_state( pSet, ATK_STATE_DEFUNCT );
-            }
+        catch(const uno::Exception &) {
+            g_warning( "Exception in wrapper_ref_state_set" );
+            atk_state_set_add_state( pSet, ATK_STATE_DEFUNCT );
         }
     }
     else
@@ -651,9 +616,18 @@ atk_object_wrapper_class_init (AtkObjectWrapperClass *klass)
 }
 
 static void
-atk_object_wrapper_init (AtkObjectWrapper* wrapper, AtkObjectWrapperClass*)
+atk_object_wrapper_init (AtkObjectWrapper      *wrapper,
+                         AtkObjectWrapperClass*)
 {
-    wrapper->mpContext = nullptr;
+   wrapper->mpAction = nullptr;
+   wrapper->mpComponent = nullptr;
+   wrapper->mpEditableText = nullptr;
+   wrapper->mpHypertext = nullptr;
+   wrapper->mpImage = nullptr;
+   wrapper->mpSelection = nullptr;
+   wrapper->mpTable = nullptr;
+   wrapper->mpText = nullptr;
+   wrapper->mpValue = nullptr;
 }
 
 } // extern "C"
@@ -931,6 +905,18 @@ void atk_object_wrapper_set_role(AtkObjectWrapper* wrapper, sal_Int16 role)
 void atk_object_wrapper_dispose(AtkObjectWrapper* wrapper)
 {
     wrapper->mpContext.clear();
+    wrapper->mpAction.clear();
+    wrapper->mpComponent.clear();
+    wrapper->mpEditableText.clear();
+    wrapper->mpHypertext.clear();
+    wrapper->mpImage.clear();
+    wrapper->mpSelection.clear();
+    wrapper->mpMultiLineText.clear();
+    wrapper->mpTable.clear();
+    wrapper->mpText.clear();
+    wrapper->mpTextMarkup.clear();
+    wrapper->mpTextAttributes.clear();
+    wrapper->mpValue.clear();
 }
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/vcl/unx/gtk/a11y/atkwrapper.hxx b/vcl/unx/gtk/a11y/atkwrapper.hxx
index 87ff3b4..e8ab83b 100644
--- a/vcl/unx/gtk/a11y/atkwrapper.hxx
+++ b/vcl/unx/gtk/a11y/atkwrapper.hxx
@@ -22,19 +22,49 @@
 
 #include <atk/atk.h>
 #include <com/sun/star/accessibility/XAccessible.hpp>
-#include <cppuhelper/weakref.hxx>
 
 extern "C" {
 
+namespace com { namespace sun { namespace star { namespace accessibility {
+    class XAccessibleAction;
+    class XAccessibleComponent;
+    class XAccessibleEditableText;
+    class XAccessibleHypertext;
+    class XAccessibleImage;
+    class XAccessibleMultiLineText;
+    class XAccessibleSelection;
+    class XAccessibleTable;
+    class XAccessibleText;
+    class XAccessibleTextMarkup;
+    class XAccessibleTextAttributes;
+    class XAccessibleValue;
+} } } }
+
 struct AtkObjectWrapper
 {
     AtkObject aParent;
 
     css::uno::Reference<css::accessibility::XAccessible> mpAccessible;
-    css::uno::WeakReference<css::accessibility::XAccessibleContext> mpContext;
+    css::uno::Reference<css::accessibility::XAccessibleContext> mpContext;
+    css::uno::Reference<css::accessibility::XAccessibleAction> mpAction;
+    css::uno::Reference<css::accessibility::XAccessibleComponent> mpComponent;
+    css::uno::Reference<css::accessibility::XAccessibleEditableText>
+        mpEditableText;
+    css::uno::Reference<css::accessibility::XAccessibleHypertext> mpHypertext;
+    css::uno::Reference<css::accessibility::XAccessibleImage> mpImage;
+    css::uno::Reference<css::accessibility::XAccessibleMultiLineText>
+        mpMultiLineText;
+    css::uno::Reference<css::accessibility::XAccessibleSelection> mpSelection;
+    css::uno::Reference<css::accessibility::XAccessibleTable> mpTable;
+    css::uno::Reference<css::accessibility::XAccessibleText> mpText;
+    css::uno::Reference<css::accessibility::XAccessibleTextMarkup> mpTextMarkup;
+    css::uno::Reference<css::accessibility::XAccessibleTextAttributes>
+        mpTextAttributes;
+    css::uno::Reference<css::accessibility::XAccessibleValue> mpValue;
 
     AtkObject *child_about_to_be_removed;
     gint       index_of_child_about_to_be_removed;
+//    OString * m_pKeyBindings
 };
 
 struct AtkObjectWrapperClass
commit 8e803a1aca09513324c50c65de7f0377a40c8b6f
Author: Jean-Sebastien Bevilacqua <realitix at gmail.com>
Date:   Thu Feb 9 09:30:56 2017 +0100

    tdf#101904 Fix Date deleting in SCalc
    
    Introduction
    ------------
    
    In SCalc, when you want to clear contents, a dialog box asks you the
    data type you want to delete. For example, if you select `Date & time`,
    only cells of type `Datetime` should be deleted in the selected area.
    
    Currently, this feature is not working for datetime type. To delete
    datetime cells, you must select `Numbers` type. Datetime type is seen
    as number.
    
    Context of this fix
    -------------------
    
    First, `DeleteAreaHandler::operator` function is called for each area
    to delete. In this context, area has a special meaning. An area is a
    group of consecutive cells (on column) of the same datatype (numeric,
    formula...).
    
    To locate area in the column, we use the `node.position` attribute which
    contains the row index of the cell (remember area can be only on one column)
    and `nDataSize` which contains the number of rows.
    
    How this fix works
    ------------------
    
    In `deleteNumeric` function, we loop through area rows to detect if cell
    contains a numeric value or a datetime value. To optimize performance,
    we don't delete cells one by one but we get a range of the same datatype.
    As long as datatype stays the same, we add current cell to a "sub-area"
    but as soon as datatype switches (datetime -> number or number -> datetime),
    we delete this sub-area. Finally, at the end of `deleteNumeric` function,
    we delete the last "sub-area".
    
    Note
    ----
    
    `deleteNumberOrDateTime` function deletes rows only if the corresponding
    flag in the dialog box is setted: `mbNumeric` for `Numbers` and
    `mbDateTime` for `Date & time`.
    
    Change-Id: I24c0b3c0a6195211af71aa18d867df82109fa941
    Reviewed-on: https://gerrit.libreoffice.org/34068
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Eike Rathke <erack at redhat.com>
    Tested-by: Eike Rathke <erack at redhat.com>
    (cherry picked from commit 4575d7cf657ae291c427c2318eb4600cec2f12b7)
    Reviewed-on: https://gerrit.libreoffice.org/34956
    (cherry picked from commit 3e4db9f12046255dbcd968b28c670cb83cf83418)

diff --git a/sc/source/core/data/column3.cxx b/sc/source/core/data/column3.cxx
index 3af350d..73da282 100644
--- a/sc/source/core/data/column3.cxx
+++ b/sc/source/core/data/column3.cxx
@@ -541,21 +541,33 @@ class DeleteAreaHandler
     bool mbNumeric:1;
     bool mbString:1;
     bool mbFormula:1;
+    bool mbDateTime:1;
+    ScColumn& mrCol;
 
 public:
-    DeleteAreaHandler(ScDocument& rDoc, InsertDeleteFlags nDelFlag) :
+    DeleteAreaHandler(ScDocument& rDoc, InsertDeleteFlags nDelFlag, ScColumn& rCol) :
         mrDoc(rDoc),
         mbNumeric(nDelFlag & InsertDeleteFlags::VALUE),
         mbString(nDelFlag & InsertDeleteFlags::STRING),
-        mbFormula(nDelFlag & InsertDeleteFlags::FORMULA) {}
+        mbFormula(nDelFlag & InsertDeleteFlags::FORMULA),
+        mbDateTime(nDelFlag & InsertDeleteFlags::DATETIME),
+        mrCol(rCol) {}
 
     void operator() (const sc::CellStoreType::value_type& node, size_t nOffset, size_t nDataSize)
     {
         switch (node.type)
         {
             case sc::element_type_numeric:
-                if (!mbNumeric)
+                // Numeric type target datetime and number, thus we have a dedicated function
+                if (!mbNumeric && !mbDateTime)
                     return;
+
+                // If numeric and datetime selected, delete full range
+                if (mbNumeric && mbDateTime)
+                    break;
+
+                deleteNumeric(node, nOffset, nDataSize);
+                return;
             break;
             case sc::element_type_string:
             case sc::element_type_edittext:
@@ -587,6 +599,55 @@ public:
         maDeleteRanges.set(nRow1, nRow2, true);
     }
 
+    void deleteNumeric(const sc::CellStoreType::value_type& node, size_t nOffset, size_t nDataSize)
+    {
+        size_t nStart = node.position + nOffset;
+        size_t nElements = 1;
+        bool bLastTypeDateTime = isDateTime(nStart); // true = datetime, false = numeric
+        size_t nCount = nStart + nDataSize;
+
+        for (size_t i = nStart + 1; i < nCount; i++)
+        {
+            bool bIsDateTime = isDateTime(i);
+
+            // same type as previous
+            if (bIsDateTime == bLastTypeDateTime)
+            {
+                nElements++;
+            }
+            // type switching
+            else
+            {
+                deleteNumberOrDateTime(nStart, nStart + nElements - 1, bLastTypeDateTime);
+                nStart += nElements;
+                nElements = 1;
+            }
+
+            bLastTypeDateTime = bIsDateTime;
+        }
+
+        // delete last cells
+        deleteNumberOrDateTime(nStart, nStart + nElements - 1, bLastTypeDateTime);
+    }
+
+    void deleteNumberOrDateTime(SCROW nRow1, SCROW nRow2, bool dateTime)
+    {
+        if (!dateTime && !mbNumeric) // numeric flag must be selected
+            return;
+        if (dateTime && !mbDateTime) // datetime flag must be selected
+            return;
+        maDeleteRanges.set(nRow1, nRow2, true);
+    }
+
+    bool isDateTime(size_t position)
+    {
+        short nType = mrDoc.GetFormatTable()->GetType(static_cast<const SfxUInt32Item&>(
+                          mrCol.GetAttr(position, ATTR_VALUE_FORMAT)).GetValue());
+
+        return (nType == css::util::NumberFormat::DATE) || (nType == css::util::NumberFormat::TIME) ||
+               (nType == css::util::NumberFormat::DATETIME);
+    }
+
     void endFormulas()
     {
         mrDoc.EndListeningFormulaCells(maFormulaCells);
@@ -639,7 +700,7 @@ void ScColumn::DeleteCells(
     sc::SingleColumnSpanSet& rDeleted )
 {
     // Determine which cells to delete based on the deletion flags.
-    DeleteAreaHandler aFunc(*pDocument, nDelFlag);
+    DeleteAreaHandler aFunc(*pDocument, nDelFlag, *this);
     sc::CellStoreType::iterator itPos = maCells.position(rBlockPos.miCellPos, nRow1).first;
     sc::ProcessBlock(itPos, maCells, aFunc, nRow1, nRow2);
     aFunc.endFormulas(); // Have the formula cells stop listening.
commit e0fbf3d67f96636161fae742b02e625ebda6d16d
Author: Tor Lillqvist <tml at collabora.com>
Date:   Wed Feb 15 19:21:06 2017 +0200

    tdf#106304: Fix newline and empty paragraph font size issues in .pptx export
    
    Output <a:br> instead of 
 for hard newlines. This fixes the
    problem that the line before the hard newline in the .pptx export is
    not centred.
    
    The fix for the sd_export_ooxml1 test is a bit hacky, but then so is
    the code in question.
    
    Don't unnecessarily use bogus default char size for a:endParaRPr.
    Instead use the size last used for an a:rPr below the same WriteText()
    call. I am not exactly sure about how this hangs together, but this
    has the desired effect on the exported .pptx.
    
    (cherry picked from commit 1154cda87d518156d1e52dfb81d5e23b32ab23d5)
    (cherry picked from commit 6f93eeb0ba8c4af5c96d1db36f184ffbc71c67ba)
    
    Change-Id: Ie23e0c33e6efb303b183d3b2efce6866d0dda4e8
    Reviewed-on: https://gerrit.libreoffice.org/34887
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    (cherry picked from commit 31e6b78a196fbf73d61349ad3530cf49ee145186)

diff --git a/include/oox/export/drawingml.hxx b/include/oox/export/drawingml.hxx
index e9dc0a3..97d8dff 100644
--- a/include/oox/export/drawingml.hxx
+++ b/include/oox/export/drawingml.hxx
@@ -194,12 +194,15 @@ public:
                   sal_Int32 nXmlNamespace, bool bFlipH = false, bool bFlipV = false, sal_Int32 nRotation = 0 );
 
     void WriteText( const css::uno::Reference< css::uno::XInterface >& rXIface, const OUString& presetWarp, bool bBodyPr = true, bool bText = true, sal_Int32 nXmlNamespace = 0);
-    void WriteParagraph( const css::uno::Reference< css::text::XTextContent >& rParagraph );
+    void WriteParagraph( const css::uno::Reference< css::text::XTextContent >& rParagraph,
+                         bool& rbOverridingCharHeight, sal_Int32& rnCharHeight );
     void WriteParagraphProperties( const css::uno::Reference< css::text::XTextContent >& rParagraph );
     void WriteParagraphNumbering( const css::uno::Reference< css::beans::XPropertySet >& rXPropSet,
                                   sal_Int16 nLevel );
-    void WriteRun( const css::uno::Reference< css::text::XTextRange >& rRun );
-    void WriteRunProperties( const css::uno::Reference< css::beans::XPropertySet >& rRun, bool bIsField, sal_Int32 nElement = XML_rPr ,bool bCheckDirect = true);
+    void WriteRun( const css::uno::Reference< css::text::XTextRange >& rRun,
+                   bool& rbOverridingCharHeight, sal_Int32& rnCharHeight );
+    void WriteRunProperties( const css::uno::Reference< css::beans::XPropertySet >& rRun, bool bIsField, sal_Int32 nElement, bool bCheckDirect,
+                             bool& rbOverridingCharHeight, sal_Int32& rnCharHeight );
 
     void WritePresetShape( const char* pShape , std::vector< std::pair<sal_Int32,sal_Int32>> & rAvList );
     void WritePresetShape( const char* pShape );
diff --git a/oox/source/export/chartexport.cxx b/oox/source/export/chartexport.cxx
index ccfc244..41faeca 100644
--- a/oox/source/export/chartexport.cxx
+++ b/oox/source/export/chartexport.cxx
@@ -1102,13 +1102,16 @@ void ChartExport::exportTitle( const Reference< XShape >& xShape )
     pFS->startElement( FSNS( XML_a, XML_pPr ),
             FSEND );
 
-    WriteRunProperties(xPropSet, false, XML_defRPr);
+    bool bDummy = false;
+    sal_Int32 nDummy;
+    WriteRunProperties(xPropSet, false, XML_defRPr, true, bDummy, nDummy );
 
     pFS->endElement( FSNS( XML_a, XML_pPr ) );
 
     pFS->startElement( FSNS( XML_a, XML_r ),
             FSEND );
-    WriteRunProperties( xPropSet, false );
+    bDummy = false;
+    WriteRunProperties( xPropSet, false, XML_rPr, true, bDummy, nDummy );
     pFS->startElement( FSNS( XML_a, XML_t ),
             FSEND );
     pFS->writeEscaped( sText );
@@ -2390,7 +2393,9 @@ void ChartExport::exportTextProps(const Reference<XPropertySet>& xPropSet)
     pFS->startElement(FSNS(XML_a, XML_p), FSEND);
     pFS->startElement(FSNS(XML_a, XML_pPr), FSEND);
 
-    WriteRunProperties(xPropSet, false, XML_defRPr);
+    bool bDummy = false;
+    sal_Int32 nDummy;
+    WriteRunProperties(xPropSet, false, XML_defRPr, true, bDummy, nDummy);
 
     pFS->endElement(FSNS(XML_a, XML_pPr));
     pFS->endElement(FSNS(XML_a, XML_p));
diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index bd4c0c1..d9bc62d 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -1205,7 +1205,8 @@ void DrawingML::WriteShapeTransformation( const Reference< XShape >& rXShape, sa
     WriteTransformation( Rectangle( Point( aPos.X, aPos.Y ), Size( aSize.Width, aSize.Height ) ), nXmlNamespace, bFlipH, bFlipV, OOX_DRAWINGML_EXPORT_ROTATE_CLOCKWISIFY(nRotation) );
 }
 
-void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool bIsField, sal_Int32 nElement /*= XML_rPr*/, bool bCheckDirect/* = true */)
+void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool bIsField, sal_Int32 nElement, bool bCheckDirect,
+                                    bool& rbOverridingCharHeight, sal_Int32& rnCharHeight )
 {
     Reference< XPropertySet > rXPropSet( rRun, UNO_QUERY );
     Reference< XPropertyState > rXPropState( rRun, UNO_QUERY );
@@ -1222,8 +1223,19 @@ void DrawingML::WriteRunProperties( const Reference< XPropertySet >& rRun, bool
     sal_Int32 nCharEscapement = 0;
     sal_Int32 nCharKerning = 0;
 
-    if( GETA( CharHeight ) )
+    if ( nElement == XML_endParaRPr && rbOverridingCharHeight )
+    {
+        nSize = rnCharHeight;
+    }
+    else if( GETA( CharHeight ) )
+    {
         nSize = (sal_Int32) (100*(*o3tl::doAccess<float>(mAny)));
+        if ( nElement == XML_rPr )
+        {
+            rbOverridingCharHeight = true;
+            rnCharHeight = nSize;
+        }
+    }
 
      if( GETA( CharKerning ) )
         nCharKerning = (sal_Int32)(*o3tl::doAccess<sal_Int16>(mAny));
@@ -1580,7 +1592,8 @@ OString DrawingML::GetUUID()
     return OString(str, SAL_N_ELEMENTS(str));
 }
 
-void DrawingML::WriteRun( const Reference< XTextRange >& rRun )
+void DrawingML::WriteRun( const Reference< XTextRange >& rRun,
+                          bool& rbOverridingCharHeight, sal_Int32& rnCharHeight)
 {
     Reference< XPropertySet > rXPropSet( rRun, UNO_QUERY );
     sal_Int16 nLevel = -1;
@@ -1619,29 +1632,37 @@ void DrawingML::WriteRun( const Reference< XTextRange >& rRun )
         }
     }
 
-    if( ( bWriteField ) )
+    if (sText == "\n")
     {
-        OString sUUID(GetUUID());
-        mpFS->startElementNS( XML_a, XML_fld,
-                              XML_id, sUUID.getStr(),
-                              XML_type, OUStringToOString( sFieldValue, RTL_TEXTENCODING_UTF8 ).getStr(),
-                              FSEND );
+        mpFS->singleElementNS( XML_a, XML_br,
+                               FSEND );
     }
     else
     {
-        mpFS->startElementNS( XML_a, XML_r, FSEND );
-    }
+        if( ( bWriteField ) )
+        {
+            OString sUUID(GetUUID());
+            mpFS->startElementNS( XML_a, XML_fld,
+                                  XML_id, sUUID.getStr(),
+                                  XML_type, OUStringToOString( sFieldValue, RTL_TEXTENCODING_UTF8 ).getStr(),
+                                  FSEND );
+        }
+        else
+        {
+            mpFS->startElementNS( XML_a, XML_r, FSEND );
+        }
 
-    Reference< XPropertySet > xPropSet( rRun, uno::UNO_QUERY );
-    WriteRunProperties( xPropSet, bIsURLField );
-    mpFS->startElementNS( XML_a, XML_t, FSEND );
-    mpFS->writeEscaped( sText );
-    mpFS->endElementNS( XML_a, XML_t );
+        Reference< XPropertySet > xPropSet( rRun, uno::UNO_QUERY );
+        WriteRunProperties( xPropSet, bIsURLField, XML_rPr, true, rbOverridingCharHeight, rnCharHeight );
+        mpFS->startElementNS( XML_a, XML_t, FSEND );
+        mpFS->writeEscaped( sText );
+        mpFS->endElementNS( XML_a, XML_t );
 
-    if( bWriteField )
-        mpFS->endElementNS( XML_a, XML_fld );
-    else
-        mpFS->endElementNS( XML_a, XML_r );
+        if( bWriteField )
+            mpFS->endElementNS( XML_a, XML_fld );
+        else
+            mpFS->endElementNS( XML_a, XML_r );
+    }
 }
 
 OUString GetAutoNumType(sal_Int16 nNumberingType, bool bSDot, bool bPBehind, bool bPBoth)
@@ -2014,7 +2035,8 @@ void DrawingML::WriteParagraphProperties( const Reference< XTextContent >& rPara
     }
 }
 
-void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph )
+void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph,
+                                bool& rbOverridingCharHeight, sal_Int32& rnCharHeight )
 {
     Reference< XEnumerationAccess > access( rParagraph, UNO_QUERY );
     if( !access.is() )
@@ -2026,7 +2048,6 @@ void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph )
 
     mpFS->startElementNS( XML_a, XML_p, FSEND );
 
-
     bool bPropertiesWritten = false;
     while( enumeration->hasMoreElements() )
     {
@@ -2040,11 +2061,11 @@ void DrawingML::WriteParagraph( const Reference< XTextContent >& rParagraph )
                 WriteParagraphProperties( rParagraph );
                 bPropertiesWritten = true;
             }
-            WriteRun( run );
+            WriteRun( run, rbOverridingCharHeight, rnCharHeight );
         }
     }
     Reference< XPropertySet > rXPropSet( rParagraph, UNO_QUERY );
-    WriteRunProperties( rXPropSet , false, XML_endParaRPr, false );
+    WriteRunProperties( rXPropSet, false, XML_endParaRPr, false, rbOverridingCharHeight, rnCharHeight );
 
     mpFS->endElementNS( XML_a, XML_p );
 }
@@ -2215,15 +2236,17 @@ void DrawingML::WriteText( const Reference< XInterface >& rXIface, const OUStrin
         return;
     }
 
+    bool bOverridingCharHeight = false;
+    sal_Int32 nCharHeight;
+
     while( enumeration->hasMoreElements() )
     {
         Reference< XTextContent > paragraph;
         Any any ( enumeration->nextElement() );
 
         if( any >>= paragraph)
-            WriteParagraph( paragraph );
+            WriteParagraph( paragraph, bOverridingCharHeight, nCharHeight );
     }
-
 }
 
 void DrawingML::WritePresetShape( const char* pShape , std::vector< std::pair<sal_Int32,sal_Int32>> & rAvList )
diff --git a/sd/qa/unit/export-tests-ooxml1.cxx b/sd/qa/unit/export-tests-ooxml1.cxx
index 8f2ef49..2fc233b 100644
--- a/sd/qa/unit/export-tests-ooxml1.cxx
+++ b/sd/qa/unit/export-tests-ooxml1.cxx
@@ -254,11 +254,11 @@ void SdOOXMLExportTest1::testN828390_4()
         SdrTextObj *pTxtObj = dynamic_cast<SdrTextObj *>( pObj );
         CPPUNIT_ASSERT( pTxtObj );
         const EditTextObject& aEdit = pTxtObj->GetOutlinerParaObject()->GetTextObject();
-        aEdit.GetCharAttribs(1, rLst);
+        aEdit.GetCharAttribs(0, rLst);
         for( std::vector<EECharAttrib>::reverse_iterator it = rLst.rbegin(); it!=rLst.rend(); ++it)
         {
             const SvxFontHeightItem * pFontHeight = dynamic_cast<const SvxFontHeightItem *>((*it).pAttr);
-            if( pFontHeight )
+            if( pFontHeight && (*it).nStart == 18 )
                 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font height is wrong", static_cast<sal_uInt32>(1129), pFontHeight->GetHeight() );
             const SvxFontItem *pFont = dynamic_cast<const SvxFontItem *>((*it).pAttr);
             if( pFont )
@@ -267,7 +267,7 @@ void SdOOXMLExportTest1::testN828390_4()
                 bPassed = true;
             }
             const SvxWeightItem *pWeight = dynamic_cast<const SvxWeightItem *>((*it).pAttr);
-            if( pWeight )
+            if( pWeight && (*it).nStart == 18 )
                 CPPUNIT_ASSERT_EQUAL_MESSAGE( "Font Weight is wrong", WEIGHT_BOLD, pWeight->GetWeight() );
         }
     }
commit 385b0fc6d528434eaf1c21155097dae73d89866f
Author: Khaled Hosny <khaledhosny at eglug.org>
Date:   Fri Mar 3 05:15:14 2017 +0200

    tdf#103831, tdf#100986: Force using GDI when needed
    
    Our DirectWrite renderer is incomplete and can’t handle rotated text or text
    with horizontal scaling, so route these two through GDI for now.
    
    Reviewed-on: https://gerrit.libreoffice.org/34848
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Khaled Hosny <khaledhosny at eglug.org>
    (cherry picked from commit a51b7a1c3a7e7cf7b0c733e1dec40288278c1884)
    
    Change-Id: I87b85796a29e3acce782e01b4c629fec6f1a9e25
    Reviewed-on: https://gerrit.libreoffice.org/34862
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    (cherry picked from commit 4375eefb644d03ab4bafbc091436166a8494dc91)

diff --git a/vcl/inc/CommonSalLayout.hxx b/vcl/inc/CommonSalLayout.hxx
index e2f3a11..58cba16 100644
--- a/vcl/inc/CommonSalLayout.hxx
+++ b/vcl/inc/CommonSalLayout.hxx
@@ -68,6 +68,7 @@ public:
     const FontSelectPattern& getFontSelData() const { return mrFontSelData; };
     HFONT                   getHFONT() const { return mhFont; }
     WinFontInstance&        getWinFontInstance() const { return mrWinFontInstance; }
+    bool                    hasHScale() const;
 #elif defined(MACOSX) || defined(IOS)
     explicit                CommonSalLayout(const CoreTextStyle&);
     const CoreTextStyle&    getFontData() const { return mrCoreTextStyle; };
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index bd59a6b..21be0c9 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -209,7 +209,7 @@ CommonSalLayout::CommonSalLayout(HDC hDC, WinFontInstance& rWinFontInstance, con
     }
 
     // Calculate the mnAveWidthFactor, see the comment where it is used.
-    if (mrFontSelData.mnWidth && ! OpenGLHelper::isVCLOpenGLEnabled())
+    if (mrFontSelData.mnWidth)
     {
         double nUPEM = hb_face_get_upem(hb_font_get_face(mpHbFont));
 
@@ -233,6 +233,13 @@ CommonSalLayout::CommonSalLayout(HDC hDC, WinFontInstance& rWinFontInstance, con
     }
 }
 
+bool CommonSalLayout::hasHScale() const
+{
+    int nHeight(mrFontSelData.mnHeight);
+    int nWidth(mrFontSelData.mnWidth ? mrFontSelData.mnWidth * mnAveWidthFactor : nHeight);
+    return nWidth != nHeight;
+}
+
 #elif defined(MACOSX) || defined(IOS)
 CommonSalLayout::CommonSalLayout(const CoreTextStyle& rCoreTextStyle)
 :   mrFontSelData(rCoreTextStyle.maFontSelData)
diff --git a/vcl/win/gdi/winlayout.cxx b/vcl/win/gdi/winlayout.cxx
index 5cfa9b7..482cbd7 100644
--- a/vcl/win/gdi/winlayout.cxx
+++ b/vcl/win/gdi/winlayout.cxx
@@ -103,26 +103,6 @@ bool WinFontInstance::CacheGlyphToAtlas(bool bRealGlyphIndices, HDC hDC, HFONT h
         return false;
     }
 
-    // Bail for non-horizontal text.
-    {
-        wchar_t sFaceName[200];
-        int nFaceNameLen = GetTextFaceW(hNewDC, SAL_N_ELEMENTS(sFaceName), sFaceName);
-
-        if (!nFaceNameLen)
-            SAL_WARN("vcl.gdi", "GetTextFace failed: " << WindowsErrorString(GetLastError()));
-
-        LOGFONTW aLogFont;
-        GetObjectW(hFont, sizeof(LOGFONTW), &aLogFont);
-
-        SelectObject(hNewDC, hOrigFont);
-        DeleteDC(hNewDC);
-
-        if (sFaceName[0] == '@' || aLogFont.lfOrientation != 0 || aLogFont.lfEscapement != 0)
-        {
-            pTxt->ReleaseFont();
-            return false;
-        }
-    }
     std::vector<WORD> aGlyphIndices(1);
     // Fetch the ink boxes and calculate the size of the atlas.
     if (!bRealGlyphIndices)
@@ -3872,13 +3852,18 @@ void WinSalGraphics::DrawTextLayout(const CommonSalLayout& rLayout, HDC hDC, boo
 void WinSalGraphics::DrawSalLayout(const CommonSalLayout& rLayout)
 {
     HDC hDC = getHDC();
+
+    // Our DirectWrite renderer is incomplete, skip it for non-horizontal or
+    // stretched text.
+    bool bForceGDI = rLayout.GetOrientation() || rLayout.hasHScale();
+
     bool bUseOpenGL = OpenGLHelper::isVCLOpenGLEnabled() && !mbPrinter;
     if (!bUseOpenGL)
     {
         // no OpenGL, just classic rendering
-        DrawTextLayout(rLayout, hDC, false);
+        DrawTextLayout(rLayout, hDC, !bForceGDI);
     }
-    else if (CacheGlyphs(rLayout) &&
+    else if (!bForceGDI && CacheGlyphs(rLayout) &&
              DrawCachedGlyphs(rLayout))
     {
         // Nothing
@@ -3945,7 +3930,7 @@ void WinSalGraphics::DrawSalLayout(const CommonSalLayout& rLayout)
             SalColor salColor = MAKE_SALCOLOR(GetRValue(color), GetGValue(color), GetBValue(color));
 
             // the actual drawing
-            DrawTextLayout(rLayout, aDC.getCompatibleHDC(), true);
+            DrawTextLayout(rLayout, aDC.getCompatibleHDC(), !bForceGDI);
 
             std::unique_ptr<OpenGLTexture> xTexture(aDC.getTexture());
             if (xTexture)
commit 9aecbdfc372c95009d141f2ebd2e402d82758f79
Author: Michael Stahl <mstahl at redhat.com>
Date:   Thu Mar 2 23:11:29 2017 +0100

    tdf#101178 sw: DOCX export: fix crash
    
    These conditions in DocxAttributeOutput::EndRun() are apparently not
    mutually exclusive, so don't increment m_nFieldsInHyperlink twice.
    
    Whether the m_nFieldsInHyperlink makes any sense considering there are
    *2* hyperlinks then, i can't tell.
    
    Change-Id: I5030f3303bd83633fcb044573860bc8ecaacae32
    (cherry picked from commit 103efac8110be7e6f42fffcecc74abdcae4df7f9)
    Reviewed-on: https://gerrit.libreoffice.org/34837
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    (cherry picked from commit 69b89daa2c583d02da0eb04f9a388d86d87f6ed5)

diff --git a/sw/source/filter/ww8/docxattributeoutput.cxx b/sw/source/filter/ww8/docxattributeoutput.cxx
index 1673f74..36872e7 100644
--- a/sw/source/filter/ww8/docxattributeoutput.cxx
+++ b/sw/source/filter/ww8/docxattributeoutput.cxx
@@ -1141,12 +1141,9 @@ void DocxAttributeOutput::EndRun()
                 continue;
             }
 
-            if (m_startedHyperlink)
-                ++m_nFieldsInHyperlink;
-
-            if ( m_pHyperlinkAttrList.is() )
+            if (m_startedHyperlink || m_pHyperlinkAttrList.is())
             {
-                m_nFieldsInHyperlink++;
+                ++m_nFieldsInHyperlink;
             }
         }
         ++pIt;
commit e8a345ca75fb78b3d0d32425e1c689092c95d532
Author: Tomaž Vajngerl <tomaz.vajngerl at collabora.co.uk>
Date:   Thu Mar 2 09:30:21 2017 +0100

    tdf#104117 set template parameter sal_Int64 for random
    
    Change-Id: Ie8cef4375608df160b383ff74c32838f00e60aba
    Reviewed-on: https://gerrit.libreoffice.org/34777
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Kohei Yoshida <libreoffice at kohei.us>
    (cherry picked from commit 23672df737258391bd9533e61733c6cc70b9a5eb)
    Reviewed-on: https://gerrit.libreoffice.org/34817
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    (cherry picked from commit c713f227cc34b841c06beca2e9eaa96653eac372)

diff --git a/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx b/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx
index c59e9cc..56cd2e6 100644
--- a/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx
+++ b/sc/source/ui/StatisticsDialogs/RandomNumberGeneratorDialog.cxx
@@ -223,7 +223,7 @@ void ScRandomNumberGeneratorDialog::SelectGeneratorAndGenerateNumbers()
         }
         case DIST_UNIFORM_INTEGER:
         {
-            std::uniform_int_distribution<> distribution(parameterInteger1, parameterInteger2);
+            std::uniform_int_distribution<sal_Int64> distribution(parameterInteger1, parameterInteger2);
             auto rng = std::bind(distribution, seed);
             GenerateNumbers(rng, STR_DISTRIBUTION_UNIFORM_INTEGER, aDecimalPlaces);
             break;
commit 95d99d2f40cd187030c449e2bc0d739a26cc7339
Author: Justin Luth <justin_luth at sil.org>
Date:   Sat Mar 4 22:07:46 2017 +0300

    doc/docx: make unit test for tdf#99120 round-tripable
    
    When a page description is chained to a non-chained follow,
    it will only be used for a single page. Thus it might be able
    to be combined into the follow as a titlePage instead.
    However, if this page description has distinct even/odd pages,
    don't merge it as a titlepage.
    
    Reviewed-on: https://gerrit.libreoffice.org/34889
    Reviewed-by: Justin Luth <justin_luth at sil.org>
    Tested-by: Justin Luth <justin_luth at sil.org>
    Reviewed-by: Miklos Vajna <vmiklos at collabora.co.uk>
    
    Conflicts:
    
    	sw/qa/extras/ww8import/ww8import.cxx
    
    Change-Id: I62237a48c062e7c393a5224285a23597c479c1c9
    Reviewed-on: https://gerrit.libreoffice.org/34929
    Tested-by: Jenkins <ci at libreoffice.org>
    Reviewed-by: Justin Luth <justin_luth at sil.org>
    (cherry picked from commit b967275f34fbfb86f02937dc35a97defa0c3a996)

diff --git a/sw/qa/extras/ww8import/data/tdf99120.doc b/sw/qa/extras/ww8export/data/tdf99120.doc
similarity index 100%
rename from sw/qa/extras/ww8import/data/tdf99120.doc
rename to sw/qa/extras/ww8export/data/tdf99120.doc
diff --git a/sw/qa/extras/ww8export/ww8export2.cxx b/sw/qa/extras/ww8export/ww8export2.cxx
index 3259d23..d7512db 100644
--- a/sw/qa/extras/ww8export/ww8export2.cxx
+++ b/sw/qa/extras/ww8export/ww8export2.cxx
@@ -27,6 +27,15 @@ public:
     }
 
 };
+DECLARE_WW8EXPORT_TEST(testTdf99120, "tdf99120.doc")
+{
+    CPPUNIT_ASSERT_EQUAL(OUString("Section 1, odd."),  parseDump("/root/page[1]/header/txt/text()"));
+    CPPUNIT_ASSERT_EQUAL(OUString("Section 1, even."),  parseDump("/root/page[2]/header/txt/text()"));
+    // This failed: the header was empty on the 3rd page, as the first page header was shown.
+    CPPUNIT_ASSERT_EQUAL(OUString("Section 2, odd."),  parseDump("/root/page[3]/header/txt/text()"));
+    CPPUNIT_ASSERT_EQUAL(OUString("Section 2, even."),  parseDump("/root/page[4]/header/txt/text()"));
+}
+
 DECLARE_WW8EXPORT_TEST(testTdf41542_borderlessPadding, "tdf41542_borderlessPadding.odt")
 {
     // the page style's borderless padding should force this to 3 pages, not 1
diff --git a/sw/qa/extras/ww8import/ww8import.cxx b/sw/qa/extras/ww8import/ww8import.cxx
index c7f488f..bdbf847 100644
--- a/sw/qa/extras/ww8import/ww8import.cxx
+++ b/sw/qa/extras/ww8import/ww8import.cxx
@@ -56,15 +56,6 @@ DECLARE_WW8IMPORT_TEST(testFloatingTableSectionColumns, "floating-table-section-
     CPPUNIT_ASSERT( tableWidth.toInt32() > 10000 );
 }
 
-DECLARE_WW8IMPORT_TEST(testTdf99120, "tdf99120.doc")
-{
-    CPPUNIT_ASSERT_EQUAL(OUString("Section 1, odd."),  parseDump("/root/page[1]/header/txt/text()"));
-    CPPUNIT_ASSERT_EQUAL(OUString("Section 1, even."),  parseDump("/root/page[2]/header/txt/text()"));
-    // This failed: the header was empty on the 3rd page, as the first page header was shown.
-    CPPUNIT_ASSERT_EQUAL(OUString("Section 2, odd."),  parseDump("/root/page[3]/header/txt/text()"));
-    CPPUNIT_ASSERT_EQUAL(OUString("Section 2, even."),  parseDump("/root/page[4]/header/txt/text()"));
-}
-
 // tests should only be added to ww8IMPORT *if* they fail round-tripping in ww8EXPORT
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx b/sw/source/filter/ww8/wrtw8sty.cxx
index 0b139cf..12b0b22 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -1621,6 +1621,7 @@ void MSWordExportBase::SectionProperties( const WW8_SepInfo& rSepInfo, WW8_PdAtt
         // in checking heuristics here.
         if ( !titlePage && pPd->GetFollow() && pPd != pPd->GetFollow() &&
              pPd->GetFollow()->GetFollow() == pPd->GetFollow() &&
+             pPd->IsHeaderShared() && pPd->IsFooterShared() &&
              ( !rSepInfo.pPDNd || pPd->IsFollowNextPageOfNode( *rSepInfo.pPDNd ) ) )
         {
             const SwPageDesc *pFollow = pPd->GetFollow();
commit 003fa424053ed63b2d7d1a0c66fbbb4cad6268b0
Author: Laurent Balland-Poirier <laurent.balland-poirier at laposte.net>
Date:   Mon Mar 6 06:47:32 2017 +0100

    tdf#106190 Move meber variable to local
    
    Update b2738c6f67cb650ac32228f3cd20b9dfe4b41c9c
    
    Change-Id: I8417dcf948e72376c7e67bee78df56c3021b55de
    Reviewed-on: https://gerrit.libreoffice.org/34913
    Tested-by: Jenkins <ci at libreoffice.org>

... etc. - the rest is truncated


More information about the Libreoffice-commits mailing list