core.git: Branch 'distro/collabora/co-26.04' - 325 commits - avmedia/source bin/distro-install-desktop-integration bin/pack-debug chart2/inc chart2/Library_chart2.mk chart2/qa chart2/source comphelper/source compilerplugins/clang configure.ac cui/inc cui/source cui/uiconfig desktop/inc desktop/Module_desktop.mk desktop/qa desktop/source distro-configs/Jenkins download.lst editeng/source emfio/source external/cairo external/fontconfig external/freetype external/lcms2 external/nss external/poppler extras/Package_gallbullets.mk extras/source filter/Configuration_filter.mk filter/source forms/source formula/source formula/uiconfig helpcontent2 include/LibreOfficeKit include/o3tl include/oox include/sfx2 include/svl include/svtools include/svx include/systools include/test include/tools include/vcl include/xmloff Makefile.fetch offapi/com offapi/type_reference officecfg/registry oox/inc oox/qa oox/source package/source readlicense_oo/license Repository.mk sax/source sc/common_uno api_tests.mk sc/inc sc/Library_scfilt.mk sc/Library_sc.mk sc/qa sc/sdi sc/source sc/uiconfig sc/UIConfig_scalc.mk sc/workben sdext/source sd/inc sd/Library_sd.mk sd/qa sd/sdi sd/source sd/uiconfig sd/UIConfig_simpress.mk sd/util sfx2/source solenv/bin solenv/clang-format solenv/sanitizers starmath/source static/CustomTarget_emscripten_fs_image.mk svgio/qa svl/qa svl/source svtools/source svx/inc svx/source svx/uiconfig sw/CppunitTest_sw_cjk.mk sw/CppunitTest_sw_core_text.mk sw/inc sw/Library_msword.mk sw/Module_sw.mk sw/qa sw/source sw/uiconfig sw/UIConfig_swriter.mk sysui/desktop test/source tools/qa tools/source translations ucb/source vcl/inc vcl/jsdialog vcl/Library_vcl.mk vcl/qa vcl/skia vcl/source vcl/unx vcl/vcl.common.component.headless xmloff/source

Sat, 17 Jan 2026 04:04:17 -0800

Rebased ref, commits from common ancestor:
commit 1530ebdcec6bd2699c84d46707ece070b633aa76
Author:     [email protected] <[email protected]>
AuthorDate: Sat Jan 10 18:14:30 2026 -0500
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    tdf#166335 oox export: don't export invalid gluepoint fmla
    
    We started exporting gluepoints with 25.2.2
    commit/86d36ee56521438069504fbacff8dc2aff3a1afc
        "tdf165262 PPTX export: fix shape export regression"
    and some of them were not in valid OOXML format.
    
    In this case, we were exporting an empty
     fmla=""
    which is seen as a corrupt document by MS Office.
    
    make CppunitTest_sd_export_tests-ooxml3 \
        CPPUNIT_TEST_NAME=testTdf135843
    
    make CppunitTest_sw_ooxmlexport13 CPPUNIT_TEST_NAME=testTdf123435
    
    Change-Id: I4297d24b8e884199b8da0253ab855417b828aa75
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197003
    Reviewed-by: Justin Luth <[email protected]>
    Tested-by: Jenkins
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197365
    Reviewed-by: Miklos Vajna <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/oox/source/export/drawingml.cxx b/oox/source/export/drawingml.cxx
index 6dfb8357c6aa..46d3036a19e1 100644
--- a/oox/source/export/drawingml.cxx
+++ b/oox/source/export/drawingml.cxx
@@ -4929,23 +4929,49 @@ bool IsValidOOXMLFormula(std::u16string_view sFormula)
     return false;
 }
 
-OUString GetFormula(const OUString& sEquation, const OUString& sReplace, const 
OUString& sNewStr)
+OUString GetFormula(const OUString& sEquation)
 {
+    assert(!sEquation.isEmpty() && "surely an equation would never be 
empty...");
+    // TODO: This needs to be completely re-written. It is extremely 
simplistic/minimal.
+    // What is needed here is the reverse of convertToOOEquation.
+
     // If the equation is numerical
     sal_Int64 nValue = sEquation.toInt64();
-    if (!sEquation.isEmpty() && OUString::number(nValue) == sEquation)
+    if (OUString::number(nValue) == sEquation)
         return "val " + sEquation;
 
     OUString sFormula = sEquation;
-    size_t nPos = sFormula.indexOf(sReplace);
-    if (nPos != std::string::npos)
+
+    /* replace LO native placeholders with OOXML placeholders
+     * #1: e.g. 'logwidth'
+     * #2: e.g. 'logwidth/2'
+     * #3: e.g. '1234*logwidth/5678'
+     */
+
+    if (sEquation == "logwidth") // #1
+        return "val w";
+    if (sEquation == "logheight")
+        return "val h";
+    if (sEquation.startsWith("logwidth/")) // #2
+        sFormula = u"*/ 1 w "_ustr + sEquation.subView(9);
+    else if (sEquation.startsWith("logheight/"))
+        sFormula = u"*/ 1 h "_ustr + sEquation.subView(10);
+    else
     {
-        OUString sModifiedEquation = sFormula.replaceAt(nPos, 
sReplace.getLength(), sNewStr);
-        sFormula = "*/ " + sModifiedEquation;
+        size_t nPos = sFormula.indexOf("*logwidth/"); //#3
+        if (nPos != std::string::npos)
+            sFormula = "*/ " + sFormula.replaceAt(nPos, 10, " w ");
+        else
+        {
+            nPos = sFormula.indexOf("*logheight/");
+            if (nPos != std::string::npos)
+                sFormula = "*/ " + sFormula.replaceAt(nPos, 11, " h ");
+        }
     }
 
     if (IsValidOOXMLFormula(sFormula))
         return sFormula;
+    else SAL_WARN("oox.shape","invalid OOXML formula["<<sFormula<<"]");
 
     return OUString();
 }
@@ -4953,44 +4979,60 @@ OUString GetFormula(const OUString& sEquation, const 
OUString& sReplace, const O
 void prepareGluePoints(std::vector<Guide>& rGuideList,
                        const css::uno::Sequence<OUString>& aEquations,
                        const 
uno::Sequence<drawing::EnhancedCustomShapeParameterPair>& rGluePoints,
-                       const bool bIsOOXML, const sal_Int32 nWidth, const 
sal_Int32 nHeight)
+                       const bool /*bIsOOXML*/, const sal_Int32 nWidth, const 
sal_Int32 nHeight)
 {
     if (rGluePoints.hasElements())
     {
-        sal_Int32 nIndex = 1;
+        sal_Int32 nIndex = 0;
         for (auto const& rGluePoint : rGluePoints)
         {
+            ++nIndex;
             sal_Int32 nIdx1 = -1;
             sal_Int32 nIdx2 = -1;
-            rGluePoint.First.Value >>= nIdx1;
-            rGluePoint.Second.Value >>= nIdx2;
-
-            if (nIdx1 != -1 && nIdx2 != -1)
+            bool bValidIdx1 = false;
+            bool bValidIdx2 = false;
+            if (rGluePoint.First.Value >>= nIdx1)
             {
-                Guide aGuideX;
-                aGuideX.sName = "GluePoint"_ostr + OString::number(nIndex) + 
"X";
-
-                if (bIsOOXML && nIdx1 >= 0 && nIdx1 < aEquations.getLength())
-                    aGuideX.sFormula = GetFormula(aEquations[nIdx1], 
"*logwidth/", " w ").toUtf8();
-                if (aGuideX.sFormula.isEmpty())
-                    aGuideX.sFormula
-                        = "*/ " + OString::number(nIdx1) + " w " + 
OString::number(nWidth);
-
-                rGuideList.push_back(aGuideX);
-
-                Guide aGuideY;
-                aGuideY.sName = "GluePoint"_ostr + OString::number(nIndex) + 
"Y";
+                bValidIdx1 = rGluePoint.First.Type == 
EnhancedCustomShapeParameterType::EQUATION;
+                // I would assume that any EQUATION must define a valid index 
value.
+                assert(!bValidIdx1 || (nIdx1 >= 0 && nIdx1 < 
aEquations.getLength()));
+            }
+            else
+                continue;
 
-                if (bIsOOXML && nIdx2 >= 0 && nIdx2 < aEquations.getLength())
-                    aGuideY.sFormula = GetFormula(aEquations[nIdx2], 
"*logheight/", " h ").toUtf8();
-                if (aGuideY.sFormula.isEmpty())
-                    aGuideY.sFormula
-                        = "*/ " + OString::number(nIdx2) + " h " + 
OString::number(nHeight);
+            if (rGluePoint.Second.Value >>= nIdx2)
+            {
+                bValidIdx2 = rGluePoint.Second.Type == 
EnhancedCustomShapeParameterType::EQUATION;
+                assert(!bValidIdx2 || (nIdx2 >= 0 && nIdx2 < 
aEquations.getLength()));
+            }
+            else
+                continue;
 
-                rGuideList.push_back(aGuideY);
+            Guide aGuideX;
+            Guide aGuideY;
+            if (bValidIdx1)
+            {
+                aGuideX.sFormula = GetFormula(aEquations[nIdx1]).toUtf8();
+                if (aGuideX.sFormula.isEmpty()) // !IsValidOOXMLFormula
+                    continue;
             }
+            else
+                aGuideX.sFormula = "*/ " + OString::number(nIdx1) + " w " + 
OString::number(nWidth);
+            if (bValidIdx2)
+            {
+                aGuideY.sFormula = GetFormula(aEquations[nIdx2]).toUtf8();
+                if (aGuideY.sFormula.isEmpty()) // !IsValidOOXMLFormula
+                    continue;
+            }
+            else
+                aGuideY.sFormula
+                    = "*/ " + OString::number(nIdx2) + " h " + 
OString::number(nHeight);
+
+            aGuideX.sName = "GluePoint"_ostr + OString::number(nIndex) + "X";
+            rGuideList.push_back(aGuideX);
 
-            nIndex++;
+            aGuideY.sName = "GluePoint"_ostr + OString::number(nIndex) + "Y";
+            rGuideList.push_back(aGuideY);
         }
     }
 }
@@ -5184,6 +5226,7 @@ bool DrawingML::WriteCustomGeometry(
         mpFS->startElementNS(XML_a, XML_gdLst);
         for (auto const& elem : aGuideList)
         {
+            assert(IsValidOOXMLFormula(OUString::fromUtf8(elem.sFormula)));
             mpFS->singleElementNS(XML_a, XML_gd, XML_name, elem.sName, 
XML_fmla, elem.sFormula);
         }
         mpFS->endElementNS(XML_a, XML_gdLst);
diff --git a/sd/qa/unit/export-tests-ooxml3.cxx 
b/sd/qa/unit/export-tests-ooxml3.cxx
index 078170d80ae9..aa53f64cb97a 100644
--- a/sd/qa/unit/export-tests-ooxml3.cxx
+++ b/sd/qa/unit/export-tests-ooxml3.cxx
@@ -1071,6 +1071,13 @@ CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testTdf135843)
     assertXPath(pXmlDoc, sPathStart + 
"/a:tr[3]/a:tc[1]/a:tcPr/a:lnR/a:solidFill");
     assertXPath(pXmlDoc, sPathStart + 
"/a:tr[3]/a:tc[1]/a:tcPr/a:lnT/a:solidFill");
     assertXPath(pXmlDoc, sPathStart + 
"/a:tr[3]/a:tc[1]/a:tcPr/a:lnB/a:solidFill");
+
+    // tdf#166335: fmla must not be an empty string
+    static constexpr OString 
sGlueStart("/p:sld/p:cSld/p:spTree/p:sp[3]/p:spPr/a:custGeom"_ostr);
+    assertXPath(pXmlDoc, sGlueStart + "/a:gdLst/a:gd[@name='GluePoint2X']", 
"fmla", u"val w");
+    assertXPath(pXmlDoc, sGlueStart + "/a:gdLst/a:gd[@name='GluePoint2Y']", 
"fmla", u"*/ 1 h 2");
+    assertXPath(pXmlDoc, sGlueStart + "/a:gdLst/a:gd[@name='GluePoint3X']", 
"fmla", u"*/ 1 w 2");
+    assertXPath(pXmlDoc, sGlueStart + "/a:gdLst/a:gd[@name='GluePoint3Y']", 
"fmla", u"val h");
 }
 
 CPPUNIT_TEST_FIXTURE(SdOOXMLExportTest3, testNegativeTimeAnimateValue)
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index 43c16d0c912d..75e6ae776e66 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -671,6 +671,12 @@ DECLARE_OOXMLEXPORT_TEST(testTdf123435, "tdf123435.docx")
     // - Expected: 2
     // - Actual  : 1
     CPPUNIT_ASSERT_EQUAL(2, getShapes());
+
+    // tdf#166335: fmla must not be an empty string
+    save(TestFilter::DOCX);
+    xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr);
+    // without the fix, this was 8. Having an a:gd fmla="" causes MSOffice to 
report a corrupt doc.
+    assertXPath(pXmlDoc, "//a:gdLst/a:gd[@fmla='']", 0);
 }
 
 CPPUNIT_TEST_FIXTURE(Test, testTdf116371)
commit a6740309f3647b46aec562f1592879e6554f883d
Author:     Mike Kaganski <[email protected]>
AuthorDate: Wed Jan 14 09:31:30 2026 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    Improve assertion for the problematic case
    
    ... after commit 2b089278f3732ea35b14cd4c577b6f496bfc0998
    (sw: fix crash in the ModelToViewHelper ctor, 2026-01-06).
    
    Change-Id: I4946363569fc847d8697df9b74be4c646fb6bd99
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197332
    Reviewed-by: Miklos Vajna <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/sw/source/core/txtnode/modeltoviewhelper.cxx 
b/sw/source/core/txtnode/modeltoviewhelper.cxx
index 2573d273e460..e88d09040a04 100644
--- a/sw/source/core/txtnode/modeltoviewhelper.cxx
+++ b/sw/source/core/txtnode/modeltoviewhelper.cxx
@@ -203,7 +203,7 @@ ModelToViewHelper::ModelToViewHelper(const SwTextNode 
&rNode,
                 }
                 case CH_TXT_ATR_FIELDEND:
                 {
-                    assert(startedFields.back().first == 
rIDMA.getFieldmarkAt(SwPosition(rNode, i)));
+                    assert(!startedFields.empty() && 
startedFields.back().first == rIDMA.getFieldmarkAt(SwPosition(rNode, i)));
                     if (!startedFields.empty())
                     {
                         startedFields.pop_back();
commit 8a4460d60b6dea1f2431856d20dfdcfe85b8ef39
Author:     Caolán McNamara <[email protected]>
AuthorDate: Thu Jan 15 16:14:28 2026 +0000
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    remove unneeded test file
    
    Change-Id: Idd319ebc74d7468b5d55600d4dce0e7f73629449
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197371
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/sd/qa/unit/tiledrendering/data/Type-in-draw.odg 
b/sd/qa/unit/tiledrendering/data/Type-in-draw.odg
deleted file mode 100644
index afac468f1926..000000000000
Binary files a/sd/qa/unit/tiledrendering/data/Type-in-draw.odg and /dev/null 
differ
commit 5b9485736053835b972afefd61b6d74e382c675c
Author:     Parth Raiyani <[email protected]>
AuthorDate: Thu Jan 15 18:53:15 2026 +0530
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    accessibility: add accessible names to various drawing areas in UI files
    
    Signed-off-by: Parth Raiyani <[email protected]>
    Change-Id: Ibef8171634fb406cea708bd8709906f002d2f235
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197353
    Tested-by: Caolán McNamara <[email protected]>
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/cui/uiconfig/ui/pageformatpage.ui 
b/cui/uiconfig/ui/pageformatpage.ui
index 586079e669e9..a680f0c3b25d 100644
--- a/cui/uiconfig/ui/pageformatpage.ui
+++ b/cui/uiconfig/ui/pageformatpage.ui
@@ -220,6 +220,11 @@
                     <property name="halign">center</property>
                     <property name="valign">center</property>
                     <property name="vexpand">True</property>
+                    <child internal-child="accessible">
+                      <object class="AtkObject" 
id="drawingareaPageDirection-atkobject">
+                        <property name="AtkObject::accessible-name" 
translatable="yes" 
context="pageformatpage|drawingareaPageDirection-atkobject">Page 
Direction</property>
+                      </object>
+                    </child>
                   </object>
                   <packing>
                     <property name="left-attach">0</property>
diff --git a/cui/uiconfig/ui/paratabspage.ui b/cui/uiconfig/ui/paratabspage.ui
index 56f3299e5814..a6fd96643672 100644
--- a/cui/uiconfig/ui/paratabspage.ui
+++ b/cui/uiconfig/ui/paratabspage.ui
@@ -173,6 +173,11 @@
               <object class="GtkDrawingArea" id="drawingareaWIN_TABLEFT">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <child internal-child="accessible">
+                  <object class="AtkObject" 
id="drawingareaWIN_TABLEFT-atkobject">
+                    <property name="AtkObject::accessible-name" 
translatable="yes" context="paratabspage|drawingareaWIN_TABLEFT-atkobject">Left 
tab preview</property>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="left_attach">1</property>
@@ -183,6 +188,11 @@
               <object class="GtkDrawingArea" id="drawingareaWIN_TABRIGHT">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <child internal-child="accessible">
+                  <object class="AtkObject" 
id="drawingareaWIN_TABRIGHT-atkobject">
+                    <property name="AtkObject::accessible-name" 
translatable="yes" 
context="paratabspage|drawingareaWIN_TABRIGHT-atkobject">Right tab 
preview</property>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="left_attach">1</property>
@@ -193,6 +203,11 @@
               <object class="GtkDrawingArea" id="drawingareaWIN_TABCENTER">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <child internal-child="accessible">
+                  <object class="AtkObject" 
id="drawingareaWIN_TABCENTER-atkobject">
+                    <property name="AtkObject::accessible-name" 
translatable="yes" 
context="paratabspage|drawingareaWIN_TABCENTER-atkobject">Center tab 
preview</property>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="left_attach">1</property>
@@ -203,6 +218,11 @@
               <object class="GtkDrawingArea" id="drawingareaWIN_TABDECIMAL">
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <child internal-child="accessible">
+                  <object class="AtkObject" 
id="drawingareaWIN_TABDECIMAL-atkobject">
+                    <property name="AtkObject::accessible-name" 
translatable="yes" 
context="paratabspage|drawingareaWIN_TABDECIMAL-atkobject">Decimal tab 
preview</property>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="left_attach">1</property>
diff --git a/svx/uiconfig/ui/headfootformatpage.ui 
b/svx/uiconfig/ui/headfootformatpage.ui
index ffb2774b3f8b..bdad1120afeb 100644
--- a/svx/uiconfig/ui/headfootformatpage.ui
+++ b/svx/uiconfig/ui/headfootformatpage.ui
@@ -372,6 +372,11 @@
             <property name="valign">center</property>
             <property name="hexpand">True</property>
             <property name="vexpand">True</property>
+            <child internal-child="accessible">
+              <object class="AtkObject" id="drawingareaPageHF-atkobject">
+                <property name="AtkObject::accessible-name" translatable="yes" 
context="headfootformatpage|drawingareaPageHF-atkobject">Header and Footer 
Preview</property>
+              </object>
+            </child>
           </object>
           <packing>
             <property name="expand">False</property>
diff --git a/sw/uiconfig/swriter/ui/dropcapspage.ui 
b/sw/uiconfig/swriter/ui/dropcapspage.ui
index cf6d04c20347..6d3a52069c08 100644
--- a/sw/uiconfig/swriter/ui/dropcapspage.ui
+++ b/sw/uiconfig/swriter/ui/dropcapspage.ui
@@ -331,6 +331,11 @@
                 <property name="can-focus">False</property>
                 <property name="halign">center</property>
                 <property name="valign">start</property>
+                <child internal-child="accessible">
+                  <object class="AtkObject" 
id="drawingareaWN_EXAMPLE-atkobject">
+                    <property name="AtkObject::accessible-name" 
translatable="yes" 
context="dropcapspage|drawingareaWN_EXAMPLE-atkobject">Example</property>
+                  </object>
+                </child>
               </object>
             </child>
           </object>
commit 71bfb246b2cac77716586ae596aaa3349354de7d
Author:     Caolán McNamara <[email protected]>
AuthorDate: Thu Jan 15 09:39:14 2026 +0000
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    kit: Don't exit shape edit mode due to a view-switch
    
    View1 - enters text edit mode in a shape on page A
    View2 - enters text edit mode in a shape on page B
    
    There is a view switch from B to A and back to B, in which case View2
    should remain in shape edit mode and not auto-exit.
    
    Change-Id: I55f492903c80a347cd7f8287d5a60d20628f69b0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197340
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg 
b/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg
index aa1a37b83147..d715f8180052 100644
Binary files a/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg and 
b/sd/qa/unit/tiledrendering/data/TextBoxAndRect.odg differ
diff --git a/sd/qa/unit/tiledrendering/data/Type-in-draw.odg 
b/sd/qa/unit/tiledrendering/data/Type-in-draw.odg
new file mode 100644
index 000000000000..afac468f1926
Binary files /dev/null and b/sd/qa/unit/tiledrendering/data/Type-in-draw.odg 
differ
diff --git a/sd/qa/unit/tiledrendering/tiledrendering.cxx 
b/sd/qa/unit/tiledrendering/tiledrendering.cxx
index c0a68aeea3de..64a791b01c02 100644
--- a/sd/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sd/qa/unit/tiledrendering/tiledrendering.cxx
@@ -2647,6 +2647,44 @@ CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, 
testShapeEditInMultipleViews)
         CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit());
         CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
     }
+
+    // Scenario 4
+    // View1 - enters text edit mode in a shape on page A
+    // View2 - enters text edit mode in a shape on page B
+    // there is a view switch from B to A and back to B.
+    // View2 should remain in shape edit mode and not exit
+    // shape edit mode on switching back to view2
+    {
+        CPPUNIT_ASSERT_EQUAL(false, pView1->IsTextEdit());
+        CPPUNIT_ASSERT_EQUAL(false, pView2->IsTextEdit());
+
+        // Switch to view 1
+        SfxLokHelper::setView(nView1);
+        pView1->SdrBeginTextEdit(pTextBoxObject);
+
+        SfxLokHelper::setView(nView2);
+        pXImpressDocument->setPart(2);
+        SdPage* pPage3 = pViewShell2->GetActualPage();
+
+        CPPUNIT_ASSERT_MESSAGE("Page Change didn't work", pPage1 != pPage3);
+
+        SdrObject* pPage3TextBoxObject = pPage3->GetObj(0);
+        CPPUNIT_ASSERT_EQUAL(u"Text Box 1"_ustr, 
pPage3TextBoxObject->GetName());
+
+        pView2->SdrBeginTextEdit(pPage3TextBoxObject);
+        CPPUNIT_ASSERT_EQUAL(true, pView2->IsTextEdit());
+
+        SfxLokHelper::setView(nView1);
+        pXImpressDocument->setPart(0);
+
+        CPPUNIT_ASSERT_EQUAL(true, pView2->IsTextEdit());
+
+        SfxLokHelper::setView(nView2);
+        pXImpressDocument->setPart(2);
+
+        // Fails before fix
+        CPPUNIT_ASSERT_EQUAL(true, pView2->IsTextEdit());
+    }
 }
 
 CPPUNIT_TEST_FIXTURE(SdTiledRenderingTest, testSidebarHide)
diff --git a/sd/source/ui/view/drviews1.cxx b/sd/source/ui/view/drviews1.cxx
index 7c5756bdb6ca..0f2102119901 100644
--- a/sd/source/ui/view/drviews1.cxx
+++ b/sd/source/ui/view/drviews1.cxx
@@ -946,7 +946,7 @@ bool DrawViewShell::SwitchPage(sal_uInt16 nSelectedPage, 
bool bAllowChangeFocus,
             }
         }
 
-        if (bAllowChangeFocus)
+        if (bAllowChangeFocus && !SfxLokHelper::isSettingView())
             mpDrawView->SdrEndTextEdit();
 
         mpActualPage = nullptr;
commit 8b432b5dd2db23af09db4e3504c36d7d3d796f22
Author:     Karthik Godha <[email protected]>
AuthorDate: Mon Jan 12 19:15:00 2026 +0530
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    XLSX - Skip unknown functions in definedName
    
    Skip export of ocNoName token during XLSX export, which is associated
    with unknown functions
    
    bug document: forum-de2-3313.xls
    
    Change-Id: I3db50028cd7a0f78d214d2af7e73b71e8e5f233a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197113
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Michael Stahl <[email protected]>

diff --git a/formula/source/core/api/FormulaCompiler.cxx 
b/formula/source/core/api/FormulaCompiler.cxx
index 9e9e90cd67c3..62900e0d3f46 100644
--- a/formula/source/core/api/FormulaCompiler.cxx
+++ b/formula/source/core/api/FormulaCompiler.cxx
@@ -2518,7 +2518,31 @@ void FormulaCompiler::CreateStringFromTokenArray( 
OUStringBuffer& rBuffer )
         rBuffer.append( '=');
     const FormulaToken* t = maArrIterator.First();
     while( t )
-        t = CreateStringFromToken( rBuffer, t, true );
+    {
+        // Skip writing unknown functions without a name in OOXML ex: #NAME!()
+        if (t->GetOpCode() == ocNoName && t->GetType() == svByte
+            && FormulaGrammar::isOOXML(meGrammar))
+        {
+            t = maArrIterator.Next();
+            sal_uInt16 nParenthesis = 0;
+            // traverse the array to match parentheses
+            if (t && t->GetOpCode() == ocOpen)
+            {
+                do
+                {
+                    if (t->GetOpCode() == ocOpen)
+                        nParenthesis++;
+                    else if (t->GetOpCode() == ocClose)
+                        nParenthesis--;
+
+                    t = maArrIterator.Next();
+
+                } while (nParenthesis > 0 && t);
+            }
+            continue;
+        }
+        t = CreateStringFromToken(rBuffer, t, true);
+    }
 
     if (pSaveArr != pArr)
     {
commit f2b1eec4e7394f293dc841b58ba4532f21ce7c16
Author:     Pranam Lashkari <[email protected]>
AuthorDate: Thu Jan 15 03:50:04 2026 +0530
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    LOK: send notification when autofilter is changed
    
    Change-Id: I4b1e45461099404cffc0fe9cbbc5d45c09736bad
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197302
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Caolán McNamara <[email protected]>

diff --git a/sc/source/ui/inc/gridwin.hxx b/sc/source/ui/inc/gridwin.hxx
index c9ae75c3b12c..65f5eafc7e40 100644
--- a/sc/source/ui/inc/gridwin.hxx
+++ b/sc/source/ui/inc/gridwin.hxx
@@ -242,6 +242,7 @@ class SAL_DLLPUBLIC_RTTI ScGridWindow : public 
vcl::DocWindow, public DropTarget
     bool            DoPageFieldSelection( SCCOL nCol, SCROW nRow );
     bool            DoAutoFilterButton( SCCOL nCol, SCROW nRow, const 
MouseEvent& rMEvt );
     void            SendAutofilterPopupPosition(SCCOL nCol, SCROW nRow);
+    void            SendAutofilterChange();
     void DoPushPivotButton( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt, 
bool bButton, bool bPopup, bool bMultiField );
     void DoPushPivotToggle( SCCOL nCol, SCROW nRow, const MouseEvent& rMEvt );
 
diff --git a/sc/source/ui/view/gridwin.cxx b/sc/source/ui/view/gridwin.cxx
index fae88e84df97..0bab633e1d48 100644
--- a/sc/source/ui/view/gridwin.cxx
+++ b/sc/source/ui/view/gridwin.cxx
@@ -955,6 +955,18 @@ void ScGridWindow::SendAutofilterPopupPosition(SCCOL nCol, 
SCROW nRow) {
     }
 }
 
+void ScGridWindow::SendAutofilterChange() {
+    ScTabViewShell* pViewShell = mrViewData.GetViewShell();
+    if (pViewShell)
+    {
+        tools::JsonWriter writer;
+        writer.put("commandName", "AutoFilterChange");
+        writer.put("state", true);
+        OString info = writer.finishAndGetAsOString();
+        pViewShell->libreOfficeKitViewCallback(LOK_CALLBACK_STATE_CHANGED, 
info);
+    }
+}
+
 void ScGridWindow::LaunchAutoFilterMenu(SCCOL nCol, SCROW nRow)
 {
     SCTAB nTab = mrViewData.CurrentTabForData();
@@ -1328,6 +1340,7 @@ void 
ScGridWindow::UpdateAutoFilterFromMenu(AutoFilterMode eMode)
         }
     }
 
+    SendAutofilterChange();
     mrViewData.GetView()->Query(aParam, nullptr, true);
     pDBData->SetQueryParam(aParam);
 }
commit 6476686bd87d8e656ebe4cfe8f688fc59f45dc82
Author:     Karthik Godha <[email protected]>
AuthorDate: Wed Jan 14 19:56:54 2026 +0530
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    XLS -> XLSX: Discard overlapping merge ranges
    
    bug document: forum-en-5338.xls
    
    Change-Id: I5da6b650ae1c73606c6688210ba65f28920eeed4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197273
    Reviewed-by: Michael Stahl <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/sc/source/filter/excel/xistyle.cxx 
b/sc/source/filter/excel/xistyle.cxx
index b421ceed9311..002471d6867d 100644
--- a/sc/source/filter/excel/xistyle.cxx
+++ b/sc/source/filter/excel/xistyle.cxx
@@ -1996,8 +1996,14 @@ void XclImpXFRangeBuffer::SetHyperlink( const XclRange& 
rXclRange, const OUStrin
 
 void XclImpXFRangeBuffer::SetMerge( SCCOL nScCol1, SCROW nScRow1, SCCOL 
nScCol2, SCROW nScRow2 )
 {
-    if( (nScCol1 < nScCol2) || (nScRow1 < nScRow2) )
-        maMergeList.push_back( ScRange( nScCol1, nScRow1, 0, nScCol2, nScRow2, 
0 ) );
+    if ((nScCol1 < nScCol2) || (nScRow1 < nScRow2))
+    {
+        ScRange aRange(nScCol1, nScRow1, 0, nScCol2, nScRow2, 0);
+        // If merge range intersects with existing merge ranges then discard 
it.
+        if (maMergeList.Intersects(aRange))
+            return;
+        maMergeList.push_back(aRange);
+    }
 }
 
 void XclImpXFRangeBuffer::Finalize()
commit af81020ef1ef90649ebc26b7fa11ba4b45b327cd
Author:     Noel Grandin <[email protected]>
AuthorDate: Tue Jan 13 10:22:47 2026 +0200
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    we dont need this officeotron workaround anymore
    
    ever since
        commit e4978f9079cda7abb7bb424503d780566c728adf
        Author: Karthik Godha <[email protected]>
        Date:   Mon Nov 24 19:16:51 2025 +0530
        Update OOXML schema to follow ECMA-376 5th edition
    
    which was part of officeotron 0.8.1
    
    Change-Id: I0b9f8ff0d513ced06cda9f4257454ee756b28322
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197175
    Reviewed-by: Michael Stahl <[email protected]>
    Tested-by: Jenkins
    (cherry picked from commit 4da8f78016adae7da01f3822b87a9422466f26a2)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197234
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/test/source/bootstrapfixture.cxx b/test/source/bootstrapfixture.cxx
index c0297d7d211e..a30b10057738 100644
--- a/test/source/bootstrapfixture.cxx
+++ b/test/source/bootstrapfixture.cxx
@@ -140,58 +140,6 @@ OString loadFile(const OUString& rURL)
 
 constexpr std::u16string_view grand_total = u"Grand total of errors in 
submitted package: ";
 
-OUString filterOut(const OUString& s, std::u16string_view excludedSubstr)
-{
-    OUString result = s;
-    for (;;)
-    {
-        sal_Int32 pos = result.indexOf(excludedSubstr);
-        if (pos < 0)
-            break;
-        sal_Int32 start = result.lastIndexOf('
', pos);
-        if (!result.match("ERROR", start + 1))
-            return s; // unexpected string format
-        sal_Int32 end = result.indexOf('
', pos);
-        result = result.replaceAt(start, end - start, u""_ustr);
-        pos = result.lastIndexOf(grand_total);
-        if (pos < 0)
-            return s; // unexpected string format
-        start = end = pos + grand_total.size();
-        while (end < result.getLength() && rtl::isAsciiDigit(result[end]))
-            ++end;
-        std::u16string_view aNumber = result.subView(start, end - start);
-        sal_Int32 nErrors = o3tl::toInt32(aNumber) - 1;
-        result = result.replaceAt(start, end - start, 
OUString::number(nErrors));
-    }
-    return result;
-}
-
-OUString filterValidationResults(const OUString& s)
-{
-    OUString result = s;
-    // In ECMA-376-1 Second Edition, 2008, there is the following restriction 
for oleObj:
-    //
-    // <xsd:choice minOccurs="1" maxOccurs="1">
-    //  <xsd:element name="embed" type="CT_OleObjectEmbed"/>
-    //  <xsd:element name="link" type="CT_OleObjectLink"/>
-    //  <xsd:element name="pic" type="CT_Picture"/>
-    // </xsd:choice>
-    //
-    // This makes simultaneous use of embed (or link) and pic impossible. This 
was obviously a
-    // mistake; and the following editions of standard fixed it: e.g., in 
ECMA-376-1:2016, that
-    // rule is
-    //
-    // <xsd:choice minOccurs="1" maxOccurs="1">
-    //  <xsd:element name="embed" type="CT_OleObjectEmbed"/>
-    //  <xsd:element name="link" type="CT_OleObjectLink"/>
-    // </xsd:choice>
-    // <xsd:element name="pic" type="CT_Picture" minOccurs="1" maxOccurs="1"/>
-    //
-    // But officeotron only knows the old version...
-    result = filterOut(result, u"Invalid content was found starting with 
element 'p:pic'. No child element is expected at this point.");
-
-    return result;
-}
 }
 #endif
 
@@ -296,7 +244,6 @@ void test::BootstrapFixture::validate(const OUString& 
rPath, std::u16string_view
 
     if( eFormat == test::OOXML && !aContentOUString.isEmpty() )
     {
-        aContentOUString = filterValidationResults(aContentOUString);
         // check for validation errors here
         sal_Int32 nIndex = aContentOUString.lastIndexOf(grand_total);
         if(nIndex == -1)
commit 95309267539f7bec0d000aa2e0c3c99a80c8849f
Author:     Noel Grandin <[email protected]>
AuthorDate: Tue Jan 13 10:19:57 2026 +0200
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:07 2026 +0100

    update to officeotron 0.8.8
    
    which means we no longer need the workaround
    
    Change-Id: Ibdc47750a7d5eacc9a1e2251e145379f0464b7f4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197174
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>
    (cherry picked from commit 49a1acfd91b9cb30807c42845560b93f87ecc547)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197233
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Michael Stahl <[email protected]>

diff --git a/download.lst b/download.lst
index 54587bb52103..3e83735a24de 100644
--- a/download.lst
+++ b/download.lst
@@ -607,8 +607,8 @@ ODFVALIDATOR_JAR := 
odfvalidator-0.9.0-RC2-SNAPSHOT-jar-with-dependencies-2726ab
 # three static lines
 # so that git cherry-pick
 # will not run into conflicts
-OFFICEOTRON_SHA256SUM := 
0c2a4227394ac78147387f1c1ff1063e87f2151ffc91f1eb97bb17c2650fa708
-OFFICEOTRON_JAR := officeotron-0.8.5.jar
+OFFICEOTRON_SHA256SUM := 
c72cdcb7fe7cfe917d1fb8766ddbc3f92b6124ecd5fb8c6dc0ddabb74a7e057c
+OFFICEOTRON_JAR := officeotron-0.8.8.jar
 # three static lines
 # so that git cherry-pick
 # will not run into conflicts
diff --git a/test/source/bootstrapfixture.cxx b/test/source/bootstrapfixture.cxx
index 34e48bbb16b0..c0297d7d211e 100644
--- a/test/source/bootstrapfixture.cxx
+++ b/test/source/bootstrapfixture.cxx
@@ -190,17 +190,6 @@ OUString filterValidationResults(const OUString& s)
     // But officeotron only knows the old version...
     result = filterOut(result, u"Invalid content was found starting with 
element 'p:pic'. No child element is expected at this point.");
 
-    {
-        /* While the spec says the core-properties relationship must be
-         *     officedocument/2006/relationships/metadata/core-properties
-         * MS Office actually just writes the ECMA-376-1ST EDITION version
-         * for both ECMA_Transitional and ISO_Transitional formats.
-         *
-         * officeotron doesn't care that clause 15.2.12.1 fails on all 
MSWord-produced output.
-         */
-        result = filterOut(result, u"Entry with MIME type 
\"application/vnd.openxmlformats-package.core-properties+xml\" has unrecognized 
relationship type 
\"http://schemas.openxmlformats.org/package/2006/relationships/metadata/core-properties\";
 (see ISO/IEC 29500-1:2008, Clause 15.2.12.1)");
-    }
-
     return result;
 }
 }
commit db4649316975456203a02d60f18ac15087640216
Author:     Mohit Marathe <[email protected]>
AuthorDate: Tue Jan 13 19:21:41 2026 +0530
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    sd: disable .uno:CopySlide when the selected page is canvas page
    
    Signed-off-by: Mohit Marathe <[email protected]>
    Change-Id: Id4f22e768cf43ae91b57b91d922061f7ce21d933
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197196
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Michael Stahl <[email protected]>

diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx
index 44009a6ee9f3..0619ed62124c 100644
--- a/sd/source/ui/view/drviews7.cxx
+++ b/sd/source/ui/view/drviews7.cxx
@@ -861,6 +861,7 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
             rSet.DisableItem(SID_PRESENTATION_LAYOUT);
             rSet.DisableItem(SID_HIDE_SLIDE);
             rSet.DisableItem(SID_SHOW_SLIDE);
+            rSet.DisableItem(SID_COPY_SLIDE);
         }
     }
     else
commit 54de6349fca1a90fdc0e38faf984b69bbe77013e
Author:     Caolán McNamara <[email protected]>
AuthorDate: Mon Jan 12 08:40:55 2026 +0000
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    cid#1680327 Uninitialized scalar field
    
    Change-Id: Ia823d38011e45dedcf16a06869b6d9b0460ebcd2
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197073
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Miklos Vajna <[email protected]>

diff --git a/vcl/source/fontsubset/sft.cxx b/vcl/source/fontsubset/sft.cxx
index ee33a18e8178..f1c7408e7c93 100644
--- a/vcl/source/fontsubset/sft.cxx
+++ b/vcl/source/fontsubset/sft.cxx
@@ -982,6 +982,7 @@ AbstractTrueTypeFont::~AbstractTrueTypeFont()
 TrueTypeFont::TrueTypeFont(const char* pFileName, const FontCharMapRef 
xCharMap)
     : AbstractTrueTypeFont(pFileName, xCharMap)
     , fsize(-1)
+    , mmhandle(0)
     , ptr(nullptr)
     , ntables(0)
 {
commit 8b694668752801ce98326a9e7b003a7da99db452
Author:     Michael Meeks <[email protected]>
AuthorDate: Thu Jan 15 12:46:53 2026 +0000
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    Avoid statting share/theme_definitions/online continually.
    
    It is not clear that this FileDefinition drawing code is ever used,
    but getting rid of this is perhaps helpful.
    
    Signed-off-by: Michael Meeks <[email protected]>
    Change-Id: I735c8cc9eb5280afa2e4cdd42597b6a0ea9a2718
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197368
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Andras Timar <[email protected]>

diff --git a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx 
b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
index 9613fae354c8..3cd3f636b261 100644
--- a/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
+++ b/vcl/source/gdi/FileDefinitionWidgetDraw.cxx
@@ -80,8 +80,10 @@ std::shared_ptr<WidgetDefinition> const&
 getWidgetDefinitionForTheme(std::u16string_view rThemenName)
 {
     static std::shared_ptr<WidgetDefinition> spDefinition;
-    if (!spDefinition)
+    static bool bAlreadyChecked = false;
+    if (!bAlreadyChecked)
     {
+        bAlreadyChecked = true;
         OUString sSharedDefinitionBasePath = lcl_getThemeDefinitionPath();
         OUString sThemeFolder = sSharedDefinitionBasePath + rThemenName + "/";
         OUString sThemeDefinitionFile = sThemeFolder + "definition.xml";
commit c6c49ffb9d13957789cfd01810871b21e535b67a
Author:     Aron Budea <[email protected]>
AuthorDate: Thu Jan 15 16:01:53 2026 +1030
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    sw: fix order of attributes in wp:anchor on export
    
    To match original DOCX in eg. tdf#169802 bugdoc.
    
    Change-Id: Ife68c293508bfed4f2a2b1d130e310390513981e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197312
    Tested-by: Jenkins
    Reviewed-by: Aron Budea <[email protected]>
    (cherry picked from commit b2dd08c6af51996f9fd2988f060d5c0f08e247c6)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197412
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sw/source/filter/ww8/docxsdrexport.cxx 
b/sw/source/filter/ww8/docxsdrexport.cxx
index 4c84b825cb26..a6af45eec32f 100644
--- a/sw/source/filter/ww8/docxsdrexport.cxx
+++ b/sw/source/filter/ww8/docxsdrexport.cxx
@@ -847,7 +847,6 @@ void DocxSdrExport::startDMLAnchorInline(const 
SwFrameFormat* pFrameFormat, cons
                       && pObj->GetLayer() != 
iDocumentDrawModelAccess.GetHeaderFooterHellId()
                       && pObj->GetLayer() != 
iDocumentDrawModelAccess.GetInvisibleHellId();
         }
-        attrList->add(XML_behindDoc, bOpaque ? "0" : "1");
 
         attrList->add(XML_distT, OString::number(TwipsToEMU(nDistT)));
         attrList->add(XML_distB, OString::number(TwipsToEMU(nDistB)));
@@ -855,6 +854,11 @@ void DocxSdrExport::startDMLAnchorInline(const 
SwFrameFormat* pFrameFormat, cons
         attrList->add(XML_distR, OString::number(TwipsToEMU(nDistR)));
 
         attrList->add(XML_simplePos, "0");
+
+        // It seems 0 and 1 have special meaning: just start counting from 2 
to avoid issues with that.
+        // Mandatory attribute, write 0 if pObj is null.
+        attrList->add(XML_relativeHeight, pObj ? 
OString::number(pObj->GetOrdNum() + 2) : "0"_ostr);
+        attrList->add(XML_behindDoc, bOpaque ? "0" : "1");
         attrList->add(XML_locked, "0");
 
         bool bLclInTabCell = true;
@@ -876,21 +880,11 @@ void DocxSdrExport::startDMLAnchorInline(const 
SwFrameFormat* pFrameFormat, cons
             bLclInTabCell = true;
         }
 
-        if (bLclInTabCell)
-            attrList->add(XML_layoutInCell, "1");
-        else
-            attrList->add(XML_layoutInCell, "0");
+        attrList->add(XML_layoutInCell, bLclInTabCell ? "1" : "0");
 
         bool bAllowOverlap = 
pFrameFormat->GetWrapInfluenceOnObjPos().GetAllowOverlap();
         attrList->add(XML_allowOverlap, bAllowOverlap ? "1" : "0");
 
-        if (pObj)
-            // It seems 0 and 1 have special meaning: just start counting from 
2 to avoid issues with that.
-            attrList->add(XML_relativeHeight, 
OString::number(pObj->GetOrdNum() + 2));
-        else
-            // relativeHeight is mandatory attribute, if value is not present, 
we must write default value
-            attrList->add(XML_relativeHeight, "0");
-
         if (pObj)
         {
             OUString sAnchorId = lclGetAnchorIdFromGrabBag(pObj);
commit 0a3f01c225254fa4a8b324deacf438b497ac32b5
Author:     Jim Raykowski <[email protected]>
AuthorDate: Sat Jan 3 15:40:11 2026 -0900
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    tdf#169964 Fix folded OLE objects are not saved in docx
    
    Examining DocxAttributeOutput::WriteFlyFrame case ww8::Frame::eOle,
    it seems that OLE objects need to have their frames visible in
    the document for them to be saved. This patch makes all folded
    outline content visible during execution of the
    DocxExportFilter:exportDocument function. SW_DLLPUBLIC's are added to
    make linking succeed with clang.
    
    Change-Id: I8fcaa98402ebd9a7a6135f65467a82bbca8731f9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196516
    Tested-by: Jenkins
    Reviewed-by: Jim Raykowski <[email protected]>
    (cherry picked from commit 9cdb58822849805ca939e1079b01262e75a96bf2)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197316
    Reviewed-by: Adolfo Jayme Barrientos <[email protected]>

diff --git a/sw/Library_msword.mk b/sw/Library_msword.mk
index 7d9d0c7f80f8..ba5ec835d642 100644
--- a/sw/Library_msword.mk
+++ b/sw/Library_msword.mk
@@ -32,6 +32,7 @@ $(eval $(call gb_Library_set_include,msword,\
     -I$(SRCDIR)/sw/source/core/inc \
     -I$(SRCDIR)/sw/source/filter/inc \
     -I$(SRCDIR)/sw/inc \
+    -I$(SRCDIR)/sw/source/uibase/inc \
     $$(INCLUDE) \
 ))
 
diff --git a/sw/inc/viewsh.hxx b/sw/inc/viewsh.hxx
index cece0d0dfdfc..8da56ee9b75b 100644
--- a/sw/inc/viewsh.hxx
+++ b/sw/inc/viewsh.hxx
@@ -523,9 +523,9 @@ public:
     void LockView( bool b )   { mbViewLocked = b;    }
 
     inline void LockPaint(LockPaintReason eReason);
-           void ImplLockPaint();
+    SW_DLLPUBLIC void ImplLockPaint();
     inline void UnlockPaint(bool bVirDev = false );
-           void ImplUnlockPaint( std::vector<LockPaintReason>& rReasons, bool 
bVirDev );
+    SW_DLLPUBLIC void ImplUnlockPaint(std::vector<LockPaintReason>& rReasons, 
bool bVirDev);
            bool IsPaintLocked() const { return mnLockPaint != 0; }
 
     // Get/set DrawView and PageView.
diff --git a/sw/source/filter/ww8/docxexportfilter.cxx 
b/sw/source/filter/ww8/docxexportfilter.cxx
index 8ea56f2f3661..258461dd0565 100644
--- a/sw/source/filter/ww8/docxexportfilter.cxx
+++ b/sw/source/filter/ww8/docxexportfilter.cxx
@@ -30,6 +30,8 @@
 
 #include <unotools/mediadescriptor.hxx>
 
+#include <wrtsh.hxx>
+
 using namespace ::comphelper;
 using namespace ::com::sun::star;
 
@@ -50,6 +52,8 @@ bool DocxExportFilter::exportDocument()
     if ( !pDoc )
         return false;
 
+    MakeAllOutlineContentTemporarilyVisible a(pDoc);
+
     // update layout (if present), for SwWriteTable
     SwViewShell* pViewShell = 
pDoc->getIDocumentLayoutAccess().GetCurrentViewShell();
     if (pViewShell != nullptr)
diff --git a/sw/source/uibase/inc/wrtsh.hxx b/sw/source/uibase/inc/wrtsh.hxx
index f623299e3ac6..24e9c2a62131 100644
--- a/sw/source/uibase/inc/wrtsh.hxx
+++ b/sw/source/uibase/inc/wrtsh.hxx
@@ -524,7 +524,7 @@ typedef bool (SwWrtShell::*FNSimpleMove)();
 
     bool IsOutlineContentVisible(const size_t nPos);
     void MakeOutlineContentVisible(const size_t nPos, bool bMakeVisible = 
true, bool bSetAttrOutlineVisibility = true);
-    void MakeAllFoldedOutlineContentVisible(bool bMakeVisible = true);
+    SW_DLLPUBLIC void MakeAllFoldedOutlineContentVisible(bool bMakeVisible = 
true);
     void InvalidateOutlineContentVisibility();
     bool GetAttrOutlineContentVisible(const size_t nPos) const;
 
@@ -702,7 +702,7 @@ inline bool SwWrtShell::Is_FnDragEQBeginDrag() const
 #endif
 }
 
-class MakeAllOutlineContentTemporarilyVisible
+class SW_DLLPUBLIC MakeAllOutlineContentTemporarilyVisible
 {
 private:
     SwWrtShell* m_pWrtSh = nullptr;
commit e702961630ea4f8794953d3132ba6f7a992599b3
Author:     Miklos Vajna <[email protected]>
AuthorDate: Thu Jan 15 09:27:37 2026 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    cool#13574 sw redline render mode: avoid coloring, set lightness
    
    User A managed to format a piece of text as red, formatted with
    underline and then user B is now confused why rejecting this tracked
    change doesn't work.
    
    This is working as intended for the normal redline render mode, but we
    can try something different for the 'omit insert/delete' redline render
    mode: when showing the old version, we can render deletes unchanged and
    when showing the new version, we can render inserts unchanged. The rest
    of the redlines can be semi-hidden.
    
    That semi-hidden is a bit tricky to provide. Now that we don't add
    layout-level colors in SwModule::GetInsertAuthorAttr(), we go with
    automatic color, which gets resolved quite late. So first figure out if
    we need to "omit" (semi-hide) the current redline portion in
    SwTextPainter::DrawTextLine(), and then pass around a flag, so that once
    SwFntObj::DrawText() is past ApplyAutoColor(), we can set lightness to a
    medium value.
    
    This is needed, because a typical auto color resolves to either white or
    black, and changing saturation has no effect for those colors. And this
    way we still get readable text in both light and dark mode.
    
    Change-Id: I0ff57cd996fda80fadc315ad0c6c85e5af1ff3e7
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197350
    Reviewed-by: Miklos Vajna <[email protected]>
    Tested-by: Jenkins
    (cherry picked from commit a24dd7b1d742ccd59768db8b6b6a522588952108)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197390
    Reviewed-by: Adolfo Jayme Barrientos <[email protected]>

diff --git a/sw/CppunitTest_sw_core_text.mk b/sw/CppunitTest_sw_core_text.mk
index bb6fba294df4..42be7e727b0c 100644
--- a/sw/CppunitTest_sw_core_text.mk
+++ b/sw/CppunitTest_sw_core_text.mk
@@ -34,6 +34,7 @@ $(eval $(call gb_CppunitTest_use_libraries,sw_core_text, \
     sfx \
     subsequenttest \
     svl \
+    svt \
     sw \
        swqahelper \
     test \
diff --git a/sw/qa/core/text/itrpaint.cxx b/sw/qa/core/text/itrpaint.cxx
index 7eaed14187c8..a59960616d68 100644
--- a/sw/qa/core/text/itrpaint.cxx
+++ b/sw/qa/core/text/itrpaint.cxx
@@ -12,10 +12,13 @@
 #include <memory>
 
 #include <o3tl/string_view.hxx>
+#include <svtools/colorcfg.hxx>
 
 #include <docsh.hxx>
 #include <wrtsh.hxx>
 #include <ndtxt.hxx>
+#include <swmodule.hxx>
+#include <swdll.hxx>
 
 namespace
 {
@@ -29,8 +32,8 @@ public:
     }
 };
 
-/// #RRGGBB -> HSL saturation.
-sal_Int16 GetColorSaturation(std::u16string_view rRGB)
+/// #RRGGBB -> HSL lightness.
+sal_Int16 GetColorLightness(std::u16string_view rRGB)
 {
     Color aColor(o3tl::toInt32(rRGB.substr(1, 2), 16), 
o3tl::toInt32(rRGB.substr(3, 2), 16),
                  o3tl::toInt32(rRGB.substr(5, 2), 16));
@@ -38,12 +41,16 @@ sal_Int16 GetColorSaturation(std::u16string_view rRGB)
     sal_uInt16 nSaturation;
     sal_uInt16 nBrightness;
     aColor.RGBtoHSB(nHue, nSaturation, nBrightness);
-    return nSaturation;
+    return nBrightness;
 }
 
 CPPUNIT_TEST_FIXTURE(Test, testRedlineRenderModeOmitInsertDelete)
 {
-    // Default rendering: default, normal saturation, normal saturation.
+    // Reset redline author IDs to a predictable default.
+    SwGlobals::ensure();
+    SwModule::get()->ClearRedlineAuthors();
+
+    // Default rendering: default, normal lightness, normal lightness.
     createSwDoc("redline.docx");
 
     SwDocShell* pDocShell = getSwDocShell();
@@ -64,15 +71,17 @@ CPPUNIT_TEST_FIXTURE(Test, 
testRedlineRenderModeOmitInsertDelete)
     CPPUNIT_ASSERT_EQUAL(u"oldcontent"_ustr, aContent.copy(nIndex2, nLength2));
     OUString aColor2
         = getXPath(pXmlDoc, 
"(//textarray)[2]/preceding-sibling::textcolor[1]", "color");
-    CPPUNIT_ASSERT_GREATER(static_cast<sal_Int16>(50), 
GetColorSaturation(aColor2));
+    Color aRedlineColor = 
SwModule::get()->GetColorConfig().GetColorValue(svtools::AUTHOR1).nColor;
+    OUString aRedlineColorString = u"#"_ustr + aRedlineColor.AsRGBHexString();
+    CPPUNIT_ASSERT_EQUAL(aRedlineColorString, aColor2);
     sal_Int32 nIndex3 = getXPath(pXmlDoc, "(//textarray)[3]", 
"index").toInt32();
     sal_Int32 nLength3 = getXPath(pXmlDoc, "(//textarray)[3]", 
"length").toInt32();
     CPPUNIT_ASSERT_EQUAL(u"newcontent"_ustr, aContent.copy(nIndex3, nLength3));
     OUString aColor3
         = getXPath(pXmlDoc, 
"(//textarray)[3]/preceding-sibling::textcolor[1]", "color");
-    CPPUNIT_ASSERT_GREATER(static_cast<sal_Int16>(50), 
GetColorSaturation(aColor3));
+    CPPUNIT_ASSERT_EQUAL(aRedlineColorString, aColor3);
 
-    // Omit inserts: default, normal saturation, de-saturated.
+    // Omit inserts: default, normal lightness, increased lightness.
     SwWrtShell* pWrtShell = pDocShell->GetWrtShell();
     SwViewOption aOpt(*pWrtShell->GetViewOptions());
     aOpt.SetRedlineRenderMode(SwRedlineRenderMode::OmitInserts);
@@ -91,16 +100,16 @@ CPPUNIT_TEST_FIXTURE(Test, 
testRedlineRenderModeOmitInsertDelete)
     nLength2 = getXPath(pXmlDoc, "(//textarray)[2]", "length").toInt32();
     CPPUNIT_ASSERT_EQUAL(u"oldcontent"_ustr, aContent.copy(nIndex2, nLength2));
     aColor2 = getXPath(pXmlDoc, 
"(//textarray)[2]/preceding-sibling::textcolor[1]", "color");
-    CPPUNIT_ASSERT_GREATER(static_cast<sal_Int16>(50), 
GetColorSaturation(aColor2));
+    CPPUNIT_ASSERT_EQUAL(u"#000000"_ustr, aColor2);
     nIndex3 = getXPath(pXmlDoc, "(//textarray)[3]", "index").toInt32();
     nLength3 = getXPath(pXmlDoc, "(//textarray)[3]", "length").toInt32();
     CPPUNIT_ASSERT_EQUAL(u"newcontent"_ustr, aContent.copy(nIndex3, nLength3));
     aColor3 = getXPath(pXmlDoc, 
"(//textarray)[3]/preceding-sibling::textcolor[1]", "color");
     // Without the accompanying fix in place, this test would have failed with:
-    // - Expected less or equal than: 50
-    // - Actual  : 100
-    // i.e. the 3rd text portion was not de-saturated.
-    CPPUNIT_ASSERT_LESSEQUAL(static_cast<sal_Int16>(50), 
GetColorSaturation(aColor3));
+    // - Expected greater or equal than: 49
+    // - Actual  : 0
+    // i.e. the 3rd text portion had no increased lightness from black.
+    CPPUNIT_ASSERT_GREATEREQUAL(static_cast<sal_Int16>(49), 
GetColorLightness(aColor3));
 
     // Omit deletes: default, de-saturated, normal saturation.
     aOpt.SetRedlineRenderMode(SwRedlineRenderMode::OmitDeletes);
@@ -119,12 +128,12 @@ CPPUNIT_TEST_FIXTURE(Test, 
testRedlineRenderModeOmitInsertDelete)
     nLength2 = getXPath(pXmlDoc, "(//textarray)[2]", "length").toInt32();
     CPPUNIT_ASSERT_EQUAL(u"oldcontent"_ustr, aContent.copy(nIndex2, nLength2));
     aColor2 = getXPath(pXmlDoc, 
"(//textarray)[2]/preceding-sibling::textcolor[1]", "color");
-    CPPUNIT_ASSERT_LESSEQUAL(static_cast<sal_Int16>(50), 
GetColorSaturation(aColor2));
+    CPPUNIT_ASSERT_GREATEREQUAL(static_cast<sal_Int16>(49), 
GetColorLightness(aColor2));
     nIndex3 = getXPath(pXmlDoc, "(//textarray)[3]", "index").toInt32();
     nLength3 = getXPath(pXmlDoc, "(//textarray)[3]", "length").toInt32();
     CPPUNIT_ASSERT_EQUAL(u"newcontent"_ustr, aContent.copy(nIndex3, nLength3));
     aColor3 = getXPath(pXmlDoc, 
"(//textarray)[3]/preceding-sibling::textcolor[1]", "color");
-    CPPUNIT_ASSERT_GREATER(static_cast<sal_Int16>(50), 
GetColorSaturation(aColor3));
+    CPPUNIT_ASSERT_EQUAL(u"#000000"_ustr, aColor3);
 }
 }
 
diff --git a/sw/source/core/inc/drawfont.hxx b/sw/source/core/inc/drawfont.hxx
index 443f47635353..18c7913abf00 100644
--- a/sw/source/core/inc/drawfont.hxx
+++ b/sw/source/core/inc/drawfont.hxx
@@ -91,6 +91,7 @@ class SW_DLLPUBLIC SwDrawTextInfo
     // GetModelPositionForViewPoint should not return the next position if 
screen position is
     // inside second half of bound rect, used for Accessibility
     bool m_bPosMatchesBounds : 1 = false;
+    bool m_bOmitPaint = false;
 
 #ifdef DBG_UTIL
     // These flags should control that the appropriate Set-function has been
@@ -658,6 +659,9 @@ public:
     // as argument, the change if made to the font otherwise the font at the
     // output device is changed returns if the font has been changed
     bool ApplyAutoColor( vcl::Font* pFnt = nullptr );
+
+    void SetOmitPaint(bool bOmitPaint) { m_bOmitPaint = bOmitPaint; }
+    bool GetOmitPaint() const { return m_bOmitPaint; }
 };
 
 #endif
diff --git a/sw/source/core/text/inftxt.cxx b/sw/source/core/text/inftxt.cxx
index 8110a64b95e0..d63102bc4f07 100644
--- a/sw/source/core/text/inftxt.cxx
+++ b/sw/source/core/text/inftxt.cxx
@@ -725,6 +725,11 @@ void SwTextPaintInfo::DrawText_( const OUString &rText, 
const SwLinePortion &rPo
                              rPor.GetNextPortion()->InFixMargGrp() ||
                              rPor.GetNextPortion()->IsHolePortion() );
 
+    if (m_bOmitPaint)
+    {
+        aDrawInf.SetOmitPaint(m_bOmitPaint);
+    }
+
     // Draw text next to the left border
     Point aFontPos(m_aPos);
     if( m_pFnt->GetLeftBorder() && rPor.InTextGrp() && !static_cast<const 
SwTextPortion&>(rPor).GetJoinBorderWithPrev() )
diff --git a/sw/source/core/text/inftxt.hxx b/sw/source/core/text/inftxt.hxx
index d99d93dc248a..1ff88448610d 100644
--- a/sw/source/core/text/inftxt.hxx
+++ b/sw/source/core/text/inftxt.hxx
@@ -370,6 +370,7 @@ class SwTextPaintInfo : public SwTextSizeInfo
 
     sal_uInt16 m_nSpaceIdx;
     SwLineInfo const* m_pLineInfo{nullptr}; // hack: need this to get line 
props
+    bool m_bOmitPaint = false;
 
     void DrawText_(const OUString &rText, const SwLinePortion &rPor,
                    const TextFrameIndex nIdx, const TextFrameIndex nLen,
@@ -494,6 +495,7 @@ public:
     void SetSmartTags(sw::WrongListIterator *const pNew) { m_pSmartTags = 
pNew; }
     sw::WrongListIterator* GetSmartTags() const { return m_pSmartTags; }
     void SetLineInfo(SwLineInfo const*const pLineInfo) { m_pLineInfo = 
pLineInfo; }
+    void SetOmitPaint(bool bOmitPaint) { m_bOmitPaint = bOmitPaint; }
 };
 
 class SwTextFormatInfo : public SwTextPaintInfo
diff --git a/sw/source/core/text/itrpaint.cxx b/sw/source/core/text/itrpaint.cxx
index 14693858cda8..cfbbcd5b62b8 100644
--- a/sw/source/core/text/itrpaint.cxx
+++ b/sw/source/core/text/itrpaint.cxx
@@ -42,6 +42,8 @@
 #include "pormulti.hxx"
 #include <doc.hxx>
 #include <fmturl.hxx>
+#include <IDocumentRedlineAccess.hxx>
+#include <redline.hxx>
 
 // Returns, if we have an underline breaking situation
 // Adding some more conditions here means you also have to change them
@@ -305,6 +307,9 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, 
SwSaveClip &rClip,
     // Reference portion for the paragraph end portion
     SwLinePortion* pEndTempl = m_pCurr->GetFirstPortion();
 
+    const SwDoc& rDoc = GetInfo().GetTextFrame()->GetDoc();
+    const IDocumentRedlineAccess& rIDRA = rDoc.getIDocumentRedlineAccess();
+    const SwRedlineTable& rRedlineTable = rIDRA.GetRedlineTable();
     while( pPor )
     {
         bool bSeeked = true;
@@ -422,6 +427,36 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, 
SwSaveClip &rClip,
             roTaggedLabel.emplace(nullptr, nullptr, &aPorInfo, *pOut);
         }
 
+        // See if the redline render mode requires to omit the paint of the 
text portion.
+        SwRedlineTable::size_type nRedline = SwRedlineTable::npos;
+        SwRedlineRenderMode eRedlineRenderMode = SwRedlineRenderMode::Standard;
+        if (GetRedln() && GetRedln()->IsOn())
+        {
+            nRedline = GetRedln()->GetAct();
+            eRedlineRenderMode = GetInfo().GetOpt().GetRedlineRenderMode();
+        }
+        bool bOmitPaint = false;
+        if (nRedline != SwRedlineTable::npos)
+        {
+            const SwRangeRedline* pRedline = rRedlineTable[nRedline];
+            RedlineType eType = pRedline->GetType();
+            if (eRedlineRenderMode == SwRedlineRenderMode::OmitInserts
+                && eType == RedlineType::Insert)
+            {
+                bOmitPaint = true;
+            }
+            else if (eRedlineRenderMode == SwRedlineRenderMode::OmitDeletes
+                     && eType == RedlineType::Delete)
+            {
+                bOmitPaint = true;
+            }
+        }
+
+        if (bOmitPaint)
+        {
+            GetInfo().SetOmitPaint(true);
+        }
+
         {
             // #i16816# tagged pdf support
             Por_Info aPorInfo(*pPor, *this, 0);
@@ -444,6 +479,11 @@ void SwTextPainter::DrawTextLine( const SwRect &rPaint, 
SwSaveClip &rClip,
             }
         }
 
+        if (bOmitPaint)
+        {
+            GetInfo().SetOmitPaint(false);
+        }
+
         // lazy open LBody and paragraph tag after num portions have been 
painted to Lbl
         if (pPor->InNumberGrp() // also footnote label
             // note: numbering portion may be split if it has multiple scripts
diff --git a/sw/source/core/txtnode/fntcache.cxx 
b/sw/source/core/txtnode/fntcache.cxx
index 30114327effa..bc270a72d139 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -1048,6 +1048,25 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
 
     Color aOldColor( pTmpFont->GetColor() );
     bool bChgColor = rInf.ApplyAutoColor( pTmpFont );
+
+    if (rInf.GetOmitPaint())
+    {
+        Color aColor = pTmpFont->GetColor();
+        sal_uInt16 nHue;
+        sal_uInt16 nSaturation;
+        sal_uInt16 nBrightness;
+        aColor.RGBtoHSB(nHue, nSaturation, nBrightness);
+        // 50% lightness: balance between completely omitting the paint and 
hard-to-notice small
+        // difference.
+        nBrightness = 50;
+        aColor = Color::HSBtoRGB(nHue, nSaturation, nBrightness);
+        if (aColor != pTmpFont->GetColor())
+        {
+            bChgColor = true;
+            pTmpFont->SetColor(aColor);
+        }
+    }
+
     if( !pTmpFont->IsSameInstance( rInf.GetOut().GetFont() ) )
         rInf.GetOut().SetFont( *pTmpFont );
     if ( bChgColor )
diff --git a/sw/source/uibase/app/swmodul1.cxx 
b/sw/source/uibase/app/swmodul1.cxx
index 75d8909559b3..2b6391f8b142 100644
--- a/sw/source/uibase/app/swmodul1.cxx
+++ b/sw/source/uibase/app/swmodul1.cxx
@@ -484,23 +484,16 @@ std::size_t SwModule::InsertRedlineAuthor(const OUString& 
rAuthor)
 static void lcl_FillAuthorAttr( std::size_t nAuthor, SfxItemSet &rSet,
                         const AuthorCharAttr &rAttr, SwRedlineRenderMode 
eRenderMode = SwRedlineRenderMode::Standard )
 {
+    if (eRenderMode != SwRedlineRenderMode::Standard)
+    {
+        return;
+    }
+
     Color aCol( rAttr.m_nColor );
 
     if( rAttr.m_nColor == COL_TRANSPARENT )
     {
         aCol = lcl_GetAuthorColor(nAuthor);
-
-        // See if the redline render mode requires to de-saturize the color of 
the text portion.
-        if (eRenderMode != SwRedlineRenderMode::Standard)
-        {
-            sal_uInt16 nHue;
-            sal_uInt16 nSaturation;
-            sal_uInt16 nBrightness;
-            aCol.RGBtoHSB(nHue, nSaturation, nBrightness);
-            // 25% saturation: balance between complete gray and 
hard-to-notice small difference.
-            nSaturation = nSaturation / 4;
-            aCol = Color::HSBtoRGB(nHue, nSaturation, nBrightness);
-        }
     }
 
     bool bBackGr = rAttr.m_nColor == COL_NONE_COLOR;
@@ -556,22 +549,12 @@ static void lcl_FillAuthorAttr( std::size_t nAuthor, 
SfxItemSet &rSet,
 
 void SwModule::GetInsertAuthorAttr(std::size_t nAuthor, SfxItemSet &rSet, 
SwRedlineRenderMode eRenderMode)
 {
-    SwRedlineRenderMode eMode = SwRedlineRenderMode::Standard;
-    if (eRenderMode == SwRedlineRenderMode::OmitInserts)
-    {
-        eMode = eRenderMode;
-    }
-    lcl_FillAuthorAttr(nAuthor, rSet, m_pModuleConfig->GetInsertAuthorAttr(), 
eMode);
+    lcl_FillAuthorAttr(nAuthor, rSet, m_pModuleConfig->GetInsertAuthorAttr(), 
eRenderMode);
 }
 
 void SwModule::GetDeletedAuthorAttr(std::size_t nAuthor, SfxItemSet &rSet, 
SwRedlineRenderMode eRenderMode)
 {
-    SwRedlineRenderMode eMode = SwRedlineRenderMode::Standard;
-    if (eRenderMode == SwRedlineRenderMode::OmitDeletes)
-    {
-        eMode = eRenderMode;
-    }
-    lcl_FillAuthorAttr(nAuthor, rSet, m_pModuleConfig->GetDeletedAuthorAttr(), 
eMode);
+    lcl_FillAuthorAttr(nAuthor, rSet, m_pModuleConfig->GetDeletedAuthorAttr(), 
eRenderMode);
 }
 
 // For future extension:
commit e3191d99fa6e75b2d78e13f4f1543d91ee2ee5b0
Author:     Noel Grandin <[email protected]>
AuthorDate: Wed Jan 14 21:32:03 2026 +0200
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    tdf#169934 Transparency is lost when applying a duotone filter
    
    regression from
      commit df4873973ed6951ab63c59129226d18055f771fc
      Author: Noel Grandin <[email protected]>
      Date:   Wed Aug 27 20:25:54 2025 +0200
      simplify Graphic::applyDuotone
    
    Change-Id: I69a3da35b53355488c2d6a1f1288048d4096bc6c
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197298
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <[email protected]>
    (cherry picked from commit 0c1df806d965609b46a0c7cec08752c0234b2538)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197313
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/vcl/source/bitmap/BitmapDuoToneFilter.cxx 
b/vcl/source/bitmap/BitmapDuoToneFilter.cxx
index 2dd10459e242..66a4e9ba1037 100644
--- a/vcl/source/bitmap/BitmapDuoToneFilter.cxx
+++ b/vcl/source/bitmap/BitmapDuoToneFilter.cxx
@@ -41,10 +41,12 @@ Bitmap BitmapDuoToneFilter::execute(Bitmap const& rBitmap) 
const
             BitmapColor aColor = pReadAcc->GetColor(y, x);
             sal_uInt8 nLuminance = aColor.GetLuminance();
             BitmapColor aResultColor(
+                ColorAlpha,
                 lcl_getDuotoneColorComponent(nLuminance, aColorOne.GetRed(), 
aColorTwo.GetRed()),
                 lcl_getDuotoneColorComponent(nLuminance, aColorOne.GetGreen(),
                                              aColorTwo.GetGreen()),
-                lcl_getDuotoneColorComponent(nLuminance, aColorOne.GetBlue(), 
aColorTwo.GetBlue()));
+                lcl_getDuotoneColorComponent(nLuminance, aColorOne.GetBlue(), 
aColorTwo.GetBlue()),
+                aColor.GetAlpha());
             pWriteAcc->SetPixel(y, x, aResultColor);
         }
     }
commit 8b4e421150344f5da818c44a44fa7b91ad926eb6
Author:     Andras Timar <[email protected]>
AuthorDate: Fri Jan 16 10:05:33 2026 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    [cp] alternative download location for extra Noto fonts
    
    Change-Id: I0dc1cbed8b318c97ae0a991b4bcabecbcc8af27e

diff --git a/Makefile.fetch b/Makefile.fetch
index a2a73635d832..16296c6871bc 100644
--- a/Makefile.fetch
+++ b/Makefile.fetch
@@ -268,7 +268,7 @@ $(WORKDIR)/download: $(BUILDDIR)/config_$(gb_Side).mk 
$(SRCDIR)/download.lst $(S
                $(call fetch_Optional,NOTO_FONT,FONT_NOTO_SERIF_KR_TARBALL) \
                $(call fetch_Optional,NOTO_FONT,FONT_NOTO_SERIF_SC_TARBALL) \
                $(call fetch_Optional,NOTO_FONT,FONT_NOTO_SERIF_TC_TARBALL) \
-       ,$(call 
fetch_Download_item,https://noto-website-2.storage.googleapis.com/pkgs,$(item)))
+       ,$(call 
fetch_Download_item,https://github.com/CollaboraOnline/online/releases/download/for-code-assets/,$(item)))
        $(foreach item, \
                $(call fetch_Optional,MORE_FONTS,FONT_OPENDYSLEXIC_TARBALL) \
        ,$(call 
fetch_Download_item,https://github.com/antijingoist/opendyslexic/releases/download/v0.91.12,$(item)))
commit 80b15d3871d02cade0432ad358d9612889af0b0b
Author:     Heiko Tietze <[email protected]>
AuthorDate: Fri Dec 12 14:33:49 2025 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    Resolves tdf#160096 [API CHANGE] - Improve data validity handling
    
    * Introduces a new option ValidationAlertStyle_NONE/SC_VALERR_NONE to
      silently reject invalid values
      (This is the behavior before c869fb5ea2fa1dbbfa7c17754aeac48ed7f77cc4)
    * Sets the disabled state depending on "[ ] Handle invalid values"
      (previously "Show Error on loading")
    
    The patch is motivated by bug 159595 respectively the inconsistent
    solution. Excel either allows invalid data or shows a message that
    allows to change/reject/accept the input. But there is not way to
    silently reject invalid data.
    
    The new option does not survive round trips and will be reset to Stop.
    
    Change-Id: I33c965aa7ba999e5850b80d35964b5383928349d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195563
    Tested-by: Jenkins
    Reviewed-by: Heiko Tietze <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197362
    Tested-by: Gabor Kelemen <[email protected]>
    Reviewed-by: Gabor Kelemen <[email protected]>

diff --git a/include/xmloff/xmltoken.hxx b/include/xmloff/xmltoken.hxx
index cd1cb76a3cd7..1a1e23730e8f 100644
--- a/include/xmloff/xmltoken.hxx
+++ b/include/xmloff/xmltoken.hxx
@@ -2313,6 +2313,7 @@ namespace xmloff::token {
         XML_NOTIFY_ON_UPDATE_OF_RANGES,
         XML_BYTE,
         XML_MACRO,
+        XML_REJECT,
         XML_LOCATION,
         XML_APPLICATION,
         XML_SYMBOL_IMAGE,
diff --git a/offapi/com/sun/star/sheet/ValidationAlertStyle.idl 
b/offapi/com/sun/star/sheet/ValidationAlertStyle.idl
index a53933d0fae8..5c38c381d79f 100644
--- a/offapi/com/sun/star/sheet/ValidationAlertStyle.idl
+++ b/offapi/com/sun/star/sheet/ValidationAlertStyle.idl
@@ -45,8 +45,13 @@ published enum ValidationAlertStyle
 
     /** macro is executed.
      */
-    MACRO
+    MACRO,
 
+    /** silently reject
+
+        @since LibreOffice 26.2
+     */
+    NONE
 };
 
 
diff --git a/offapi/type_reference/offapi.idl b/offapi/type_reference/offapi.idl
index 369ca0550221..12302afc524d 100644
--- a/offapi/type_reference/offapi.idl
+++ b/offapi/type_reference/offapi.idl
@@ -13265,7 +13265,8 @@ module com {
      STOP = 0,
      WARNING = 1,
      INFO = 2,
-     MACRO = 3
+     MACRO = 3,
+     NONE = 4
     };
     published enum ValidationType {
      ANY = 0,
diff --git a/sc/inc/validat.hxx b/sc/inc/validat.hxx
index b79b294643c9..a56e590a59a0 100644
--- a/sc/inc/validat.hxx
+++ b/sc/inc/validat.hxx
@@ -54,7 +54,8 @@ enum ScValidErrorStyle
     SC_VALERR_STOP,
     SC_VALERR_WARNING,
     SC_VALERR_INFO,
-    SC_VALERR_MACRO
+    SC_VALERR_MACRO,
+    SC_VALERR_NONE
 };
 
 // Entry for validation (only one condition exists)
@@ -114,6 +115,7 @@ public:
     SC_DLLPUBLIC bool GetErrMsg( OUString& rTitle, OUString& rMsg, 
ScValidErrorStyle& rStyle ) const;
 
     ScValidationMode GetDataMode() const    { return eDataMode; }
+    bool            HasErrMsg() const       { return bShowError; }
 
     sal_Int16 GetListType() const                { return mnListType; }
     void     SetListType( sal_Int16 nListType )  { mnListType = nListType; }
diff --git a/sc/source/core/data/validat.cxx b/sc/source/core/data/validat.cxx
index 7850c0e52304..1c39f0f5c988 100644
--- a/sc/source/core/data/validat.cxx
+++ b/sc/source/core/data/validat.cxx
@@ -382,7 +382,7 @@ void ScValidationData::DoError(weld::Window* pParent, const 
OUString& rInput, co
         return;
     }
 
-    if (!bShowError) {
+    if (eErrorStyle == SC_VALERR_NONE) {
         callback(true);
         return;
     }
diff --git a/sc/source/filter/xml/XMLStylesExportHelper.cxx 
b/sc/source/filter/xml/XMLStylesExportHelper.cxx
index 4daac20f73df..12fafe861c7a 100644
--- a/sc/source/filter/xml/XMLStylesExportHelper.cxx
+++ b/sc/source/filter/xml/XMLStylesExportHelper.cxx
@@ -402,6 +402,12 @@ void ScMyValidationsContainer::WriteValidations(const 
ScDocument& rDoc, ScXMLExp
                     }
                 }
                 break;
+                case sheet::ValidationAlertStyle_NONE :
+                {
+                    rExport.AddAttribute(XML_NAMESPACE_TABLE, 
XML_MESSAGE_TYPE, XML_REJECT);
+                    WriteMessage(rExport, "", "", 
rValidation.bShowErrorMessage, false);
+                }
+                break;
                 default:
                 {
                     // added to avoid warnings
diff --git a/sc/source/filter/xml/xmlcelli.cxx 
b/sc/source/filter/xml/xmlcelli.cxx
index de7a16928f62..5f68c14a2e39 100644
--- a/sc/source/filter/xml/xmlcelli.cxx
+++ b/sc/source/filter/xml/xmlcelli.cxx
@@ -760,6 +760,7 @@ ScValidErrorStyle validAlertToValidError( const 
sheet::ValidationAlertStyle eVAl
         case sheet::ValidationAlertStyle_STOP:          eVErrStyle = 
SC_VALERR_STOP;      break;
         case sheet::ValidationAlertStyle_WARNING:       eVErrStyle = 
SC_VALERR_WARNING;   break;
         case sheet::ValidationAlertStyle_MACRO:         eVErrStyle = 
SC_VALERR_MACRO;     break;
+        case sheet::ValidationAlertStyle_NONE:          eVErrStyle = 
SC_VALERR_NONE;      break;
         default:                                        eVErrStyle = 
SC_VALERR_INFO;      break;
         //should INFO be the default?  seems to be the most unobtrusive choice.
     }
diff --git a/sc/source/filter/xml/xmlcvali.cxx 
b/sc/source/filter/xml/xmlcvali.cxx
index ec7a1ea70b3d..3a364b4babca 100644
--- a/sc/source/filter/xml/xmlcvali.cxx
+++ b/sc/source/filter/xml/xmlcvali.cxx
@@ -247,6 +247,8 @@ uno::Reference< xml::sax::XFastContextHandler > SAL_CALL 
ScXMLContentValidationC
 
 sheet::ValidationAlertStyle ScXMLContentValidationContext::GetAlertStyle() 
const
 {
+    if (IsXMLToken(sErrorMessageType, XML_REJECT))
+        return sheet::ValidationAlertStyle_NONE;
     if (IsXMLToken(sErrorMessageType, XML_MACRO))
         return sheet::ValidationAlertStyle_MACRO;
     if (IsXMLToken(sErrorMessageType, XML_STOP))
diff --git a/sc/source/ui/app/inputhdl.cxx b/sc/source/ui/app/inputhdl.cxx
index cf7b8d0c8d78..a9c3bb76f500 100644
--- a/sc/source/ui/app/inputhdl.cxx
+++ b/sc/source/ui/app/inputhdl.cxx
@@ -3190,7 +3190,7 @@ void ScInputHandler::EnterHandler( ScEnterMode 
nBlockMode, bool bBeforeSavingInL
     {
         ScDocument& rDoc = pActiveViewSh->GetViewData().GetDocument();
         const ScValidationData* pData = rDoc.GetValidationEntry( nValidation );
-        if (pData)
+        if (pData && pData->HasErrMsg())
         {
             // #i67990# don't use pLastPattern in EnterHandler
             const ScPatternAttr* pPattern = rDoc.GetPattern( aCursorPos.Col(), 
aCursorPos.Row(), aCursorPos.Tab() );
diff --git a/sc/source/ui/dbgui/validate.cxx b/sc/source/ui/dbgui/validate.cxx
index 6632b1be1e39..515a595354a2 100644
--- a/sc/source/ui/dbgui/validate.cxx
+++ b/sc/source/ui/dbgui/validate.cxx
@@ -846,23 +846,24 @@ bool ScTPValidationError::FillItemSet( SfxItemSet* 
rArgSet )
 
 IMPL_LINK_NOARG(ScTPValidationError, ToggleErrorMessage, weld::Toggleable&, 
void)
 {
-    bool const bEnable(m_xTsbShow->get_active());
-    m_xLbAction->set_sensitive(bEnable);
-    m_xEdtTitle->set_sensitive(bEnable);
-    m_xEdError->set_sensitive(bEnable);
-    m_xFtError->set_sensitive(bEnable);
-    m_xFtTitle->set_sensitive(bEnable);
-    m_xFtAction->set_sensitive(bEnable);
+    SelectActionHdl(*m_xLbAction);
 }
 
 IMPL_LINK_NOARG(ScTPValidationError, SelectActionHdl, weld::ComboBox&, void)
 {
+    bool const bEnable(m_xTsbShow->get_active());
+
     ScValidErrorStyle eStyle = 
static_cast<ScValidErrorStyle>(m_xLbAction->get_active());
     bool bMacro = ( eStyle == SC_VALERR_MACRO );
+    bool bNone = ( eStyle == SC_VALERR_NONE );
 
-    m_xBtnSearch->set_sensitive( bMacro );
-    m_xFtError->set_sensitive( !bMacro );
-    m_xEdError->set_sensitive( !bMacro );
+    m_xFtTitle->set_sensitive( bEnable && !bNone );
+    m_xLbAction->set_sensitive(bEnable);
+    m_xFtAction->set_sensitive(bEnable);
+    m_xEdtTitle->set_sensitive( bEnable && !bNone );
+    m_xBtnSearch->set_sensitive( bEnable && bMacro);
+    m_xFtError->set_sensitive( bEnable && !bMacro && !bNone );
+    m_xEdError->set_sensitive( bEnable && !bMacro && !bNone );
 }
 
 IMPL_LINK_NOARG(ScTPValidationError, ClickSearchHdl, weld::Button&, void)
diff --git a/sc/source/ui/unoobj/fmtuno.cxx b/sc/source/ui/unoobj/fmtuno.cxx
index 44b2ad31efd9..e093f73d77df 100644
--- a/sc/source/ui/unoobj/fmtuno.cxx
+++ b/sc/source/ui/unoobj/fmtuno.cxx
@@ -820,6 +820,7 @@ void SAL_CALL ScTableValidationObj::setPropertyValue(
             case sheet::ValidationAlertStyle_WARNING: nErrorStyle = 
SC_VALERR_WARNING; break;
             case sheet::ValidationAlertStyle_INFO:    nErrorStyle = 
SC_VALERR_INFO;    break;
             case sheet::ValidationAlertStyle_MACRO:   nErrorStyle = 
SC_VALERR_MACRO;   break;
+            case sheet::ValidationAlertStyle_NONE:    nErrorStyle = 
SC_VALERR_NONE;    break;
             default:
             {
                 // added to avoid warnings
@@ -907,6 +908,7 @@ uno::Any SAL_CALL ScTableValidationObj::getPropertyValue( 
const OUString& aPrope
             case SC_VALERR_WARNING: eStyle = 
sheet::ValidationAlertStyle_WARNING; break;
             case SC_VALERR_INFO:    eStyle = sheet::ValidationAlertStyle_INFO; 
   break;
             case SC_VALERR_MACRO:   eStyle = 
sheet::ValidationAlertStyle_MACRO;   break;
+            case SC_VALERR_NONE:    eStyle = sheet::ValidationAlertStyle_NONE; 
   break;
         }
         aRet <<= eStyle;
     }
diff --git a/sc/uiconfig/scalc/ui/erroralerttabpage.ui 
b/sc/uiconfig/scalc/ui/erroralerttabpage.ui
index 586181da461a..8915b71da84d 100644
--- a/sc/uiconfig/scalc/ui/erroralerttabpage.ui
+++ b/sc/uiconfig/scalc/ui/erroralerttabpage.ui
@@ -12,7 +12,7 @@
     <property name="spacing">12</property>
     <child>
       <object class="GtkCheckButton" id="tsbshow">
-        <property name="label" translatable="yes" 
context="erroralerttabpage|tsbshow">Show error _message when invalid values are 
entered</property>
+        <property name="label" translatable="yes" 
context="erroralerttabpage|tsbshow">Handle invalid values</property>
         <property name="visible">True</property>
         <property name="can-focus">True</property>
         <property name="receives-default">False</property>
@@ -153,6 +153,7 @@
               <item translatable="yes" 
context="erroralerttabpage|actionCB">Warning</item>
               <item translatable="yes" 
context="erroralerttabpage|actionCB">Information</item>
               <item translatable="yes" 
context="erroralerttabpage|actionCB">Macro</item>
+              <item translatable="yes" 
context="erroralerttabpage|actionCB">Reject silently</item>
             </items>
             <child internal-child="accessible">
               <object class="AtkObject" id="actionCB-atkobject">
diff --git a/xmloff/source/core/xmltoken.cxx b/xmloff/source/core/xmltoken.cxx
index f8cfdddf335a..4da955e16d30 100644
--- a/xmloff/source/core/xmltoken.cxx
+++ b/xmloff/source/core/xmltoken.cxx
@@ -2328,6 +2328,7 @@ namespace xmloff::token {
 
         TOKEN( "byte",                             XML_BYTE ),
         TOKEN( "macro",                            XML_MACRO ),
+        TOKEN( "reject",                          XML_REJECT ),
         TOKEN( "location",                        XML_LOCATION ),
         TOKEN( "application",                     XML_APPLICATION ),
 
diff --git a/xmloff/source/token/tokens.txt b/xmloff/source/token/tokens.txt
index 28317a175325..f8e41ff95794 100644
--- a/xmloff/source/token/tokens.txt
+++ b/xmloff/source/token/tokens.txt
@@ -2219,6 +2219,7 @@ horizontal-checkerboard
 notify-on-update-of-ranges
 byte
 macro
+reject
 location
 application
 symbol-image
commit cb5f10887e54c330842600d2409b59f7ee8c7f00
Author:     Christian Lohmaier <[email protected]>
AuthorDate: Thu Jan 15 10:14:54 2026 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    Update git submodules
    
    * Update translations from branch 'distro/collabora/co-26.04'
      to c2096e63384deddc3041011624db43a93b58f149
      - update translations for 26.2.0 rc2
    
        and force-fix errors using pocheck
    
        Change-Id: Ib53599c98419039a138585ecf5a8a06fa372b69c
        (cherry picked from commit 74493d15466a955cf75f5d0766f30a3c9ee80f4e)

diff --git a/translations b/translations
index ddbb80e87b59..c2096e63384d 160000
--- a/translations
+++ b/translations
@@ -1 +1 @@
-Subproject commit ddbb80e87b597375fc0eda328e3666d34a583455
+Subproject commit c2096e63384deddc3041011624db43a93b58f149
commit ca4bb7f685d67d3a622271f9d2e8b72bdbb86de9
Author:     Mike Kaganski <[email protected]>
AuthorDate: Wed Jan 14 08:49:32 2026 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    tdf#170337: find the correct master containing the anchored objects
    
    Was this way since commit f66ac0bacb9a57228dfd3b24b347b985376b63df
    (INTEGRATION: CWS swqbugfixes09 (1.67.38); FILE MERGED, 2004-11-16).
    
    Change-Id: I7feeeb2d77849ef626b6ed7ce6385c10cae02c6e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197240
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <[email protected]>
    Signed-off-by: Xisco Fauli <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197251

diff --git a/sw/qa/core/text/frmform.cxx b/sw/qa/core/text/frmform.cxx
index b73497f42b33..3ad8ab305ad1 100644
--- a/sw/qa/core/text/frmform.cxx
+++ b/sw/qa/core/text/frmform.cxx
@@ -148,6 +148,15 @@ CPPUNIT_TEST_FIXTURE(Test, testFloattableBadFlyPos)
     CPPUNIT_ASSERT(pPage4);
     CPPUNIT_ASSERT(pPage4->GetSortedObjs());
     CPPUNIT_ASSERT_EQUAL(static_cast<size_t>(1), 
pPage4->GetSortedObjs()->size());
+
+    // tdf#170337: Make sure that page 4's toplevel table has the correct 
height (it was 517, not
+    // taking inner floating table height into account):
+    auto pBody = pPage4->FindBodyCont();
+    CPPUNIT_ASSERT(pBody);
+    auto pTable = pBody->GetLower();
+    CPPUNIT_ASSERT(pTable);
+    CPPUNIT_ASSERT(pTable->IsTabFrame());
+    CPPUNIT_ASSERT_EQUAL(tools::Long(3658), pTable->getFrameArea().Height());
 }
 
 CPPUNIT_TEST_FIXTURE(Test, testFullPageShapeWrap)
diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index 68a6f688b8c5..eb7d49360c8f 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -4800,7 +4800,7 @@ static tools::Long CalcHeightWithFlys_Impl(const SwFrame* 
pTmp, const SwFrame* p
     bool bIsFollow( false );
     if ( pTmp->IsTextFrame() && static_cast<const 
SwTextFrame*>(pTmp)->IsFollow() )
     {
-        const SwFrame* pMaster;
+        const SwTextFrame* pMaster;
         // #i46450# Master does not necessarily have
         // to exist if this function is called from JoinFrame() ->
         // Cut() -> Shrink()
@@ -4814,6 +4814,11 @@ static tools::Long CalcHeightWithFlys_Impl(const 
SwFrame* pTmp, const SwFrame* p
 
         if ( pMaster )
         {
+            while (pMaster->IsFollow())
+            {
+                pMaster = pMaster->FindMaster();
+                assert(pMaster);
+            }
             pObjs = pMaster->GetDrawObjs();
             bIsFollow = true;
         }
commit 14fe7287f2008890ce40dd27b8f33196966fc2a6
Author:     Mike Kaganski <[email protected]>
AuthorDate: Wed Jan 14 07:09:06 2026 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:06 2026 +0100

    pMaster is already the object we need - avoid finding it again
    
    Change-Id: I1d719631053a8335c49cc55e4c98e602732e1117
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197231
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <[email protected]>
    Signed-off-by: Xisco Fauli <[email protected]>
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197250

diff --git a/sw/source/core/layout/tabfrm.cxx b/sw/source/core/layout/tabfrm.cxx
index bf525e7c313c..68a6f688b8c5 100644
--- a/sw/source/core/layout/tabfrm.cxx
+++ b/sw/source/core/layout/tabfrm.cxx
@@ -4814,7 +4814,7 @@ static tools::Long CalcHeightWithFlys_Impl(const SwFrame* 
pTmp, const SwFrame* p
 
         if ( pMaster )
         {
-            pObjs = static_cast<const 
SwTextFrame*>(pTmp)->FindMaster()->GetDrawObjs();
+            pObjs = pMaster->GetDrawObjs();
             bIsFollow = true;
         }
     }
commit 3c0657a494ce6d8c2203f22c6b56e58bed08656c
Author:     Andreas Heinisch <[email protected]>
AuthorDate: Mon Dec 22 09:41:13 2025 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:05 2026 +0100

    tdf#112628 - Impress: disable header and footer in master view
    
    Change-Id: Ic3eae2ad1ee204044ec36c83f0541f6ce83d950d
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196067
    Tested-by: Jenkins
    Reviewed-by: Andreas Heinisch <[email protected]>
    (cherry picked from commit 7ccfa4ea6f8c7215fb065b62f08c7e6cbe553997)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196191
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sd/source/ui/view/drviews7.cxx b/sd/source/ui/view/drviews7.cxx
index 7c591d45ed67..44009a6ee9f3 100644
--- a/sd/source/ui/view/drviews7.cxx
+++ b/sd/source/ui/view/drviews7.cxx
@@ -868,6 +868,9 @@ void DrawViewShell::GetMenuState( SfxItemSet &rSet )
         rSet.Put(SfxBoolItem(SID_PAGEMODE, false));
         rSet.Put(SfxBoolItem(SID_MASTERPAGE, true));
 
+        // tdf#112628 - disable header and footer in master view
+        rSet.DisableItem(SID_HEADER_AND_FOOTER);
+
         // tdf#139269 - disable menu entries to paste text into read only 
areas of master views
         const OutlinerView* pOlView = mpDrawView->GetTextEditOutlinerView();
         if (pOlView && pOlView->IsReadOnly())
commit 4c5ef259a15d002626eacabd9f4ad7a812be100b
Author:     Noel Grandin <[email protected]>
AuthorDate: Wed Jan 14 11:07:21 2026 +0200
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:05 2026 +0100

    officeotron: fillcolor is not valid for framePr
    
    because of some generic code adding attributes to the flyAttrList, we end 
with:
    
    <w:pPr>
        ...
        <w:framePr fillcolor="#FF00FF"/>
    
    inside word/header1.xml, which is not valid.
    
    Unfortunately, the code structure here does not allow an elegant solution,
    we need a new virtual method to be able to get at the flyAttrList and clear 
it,
    to prevent attributes leaking into elements they are not meant for.
    
    Change-Id: I2bfd6b1afd78e722a29d79cf853a4678b7d0dea4
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197248
    Tested-by: Jenkins
    Reviewed-by: Michael Stahl <[email protected]>
    (cherry picked from commit f748949b6ffe6e8ef2a7fd27c70669efe8ac3818)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197297
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport7.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport7.cxx
index 1e1057be6661..dd7e7b2e6ae8 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport7.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport7.cxx
@@ -667,9 +667,6 @@ DECLARE_OOXMLEXPORT_TEST(testTdf77219_backgroundShape, 
"tdf77219_backgroundShape
 
 DECLARE_OOXMLEXPORT_TEST(testTdf126533_axialAngle, "tdf126533_axialAngle.docx")
 {
-    //FIXME: validation error in OOXML export: Errors: 1
-    skipValidation();
-
     // axial gradient is purple foreground/lime background in the middle 
(top-left to bottom-right)
     uno::Reference<beans::XPropertySet> 
xPageStyle(getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr),
                                                    uno::UNO_QUERY);
@@ -685,8 +682,6 @@ DECLARE_OOXMLEXPORT_TEST(testTdf126533_axialAngle, 
"tdf126533_axialAngle.docx")
 
 DECLARE_OOXMLEXPORT_TEST(testTdf126533_axialAngle2, 
"tdf126533_axialAngle2.docx")
 {
-    //FIXME: validation error in OOXML export: Errors: 1
-    skipValidation();
     // axial gradient is purple foreground/lime background in the middle 
(top-right to bottom-left)
     uno::Reference<beans::XPropertySet> 
xPageStyle(getStyles(u"PageStyles"_ustr)->getByName(u"Standard"_ustr),
                                                    uno::UNO_QUERY);
diff --git a/sw/source/filter/ww8/docxexport.cxx 
b/sw/source/filter/ww8/docxexport.cxx
index 00d9a1005d8f..7a0b872ebcc1 100644
--- a/sw/source/filter/ww8/docxexport.cxx
+++ b/sw/source/filter/ww8/docxexport.cxx
@@ -740,6 +740,11 @@ void DocxExport::PrepareNewPageDesc( const SfxItemSet* 
pSet,
 
 }
 
+void DocxExport::ClearFlyAttrList()
+{
+    SdrExporter().getFlyAttrList().clear();
+}
+
 void DocxExport::InitStyles()
 {
     m_pStyles.reset(new MSWordStyles( *this, /*bListStyles =*/ true ));
diff --git a/sw/source/filter/ww8/docxexport.hxx 
b/sw/source/filter/ww8/docxexport.hxx
index ac5700d77867..a51285b6dab7 100644
--- a/sw/source/filter/ww8/docxexport.hxx
+++ b/sw/source/filter/ww8/docxexport.hxx
@@ -240,6 +240,8 @@ protected:
                                      const SwPageDesc* pNewPgDesc,
                                      bool bExtraPageBreak = false) override;
 
+    virtual void ClearFlyAttrList() override;
+
 private:
     /// Setup pStyles and write styles.xml
     void InitStyles();
diff --git a/sw/source/filter/ww8/rtfexport.hxx 
b/sw/source/filter/ww8/rtfexport.hxx
index 6b285dbab485..2187a789993a 100644
--- a/sw/source/filter/ww8/rtfexport.hxx
+++ b/sw/source/filter/ww8/rtfexport.hxx
@@ -147,6 +147,8 @@ protected:
     void AppendSection(const SwPageDesc* pPageDesc, const SwSectionFormat* 
pFormat,
                        sal_uLong nLnNum) override;
 
+    void ClearFlyAttrList() override {}
+
 public:
     /// Pass the pDocument, pCurrentPam and pOriginalPam to the base class.
     RtfExport(RtfExportFilter* pFilter, SwDoc& rDocument, 
std::shared_ptr<SwUnoCursor>& pCurrentPam,
diff --git a/sw/source/filter/ww8/wrtw8sty.cxx 
b/sw/source/filter/ww8/wrtw8sty.cxx
index aa25d5945962..2986f84f432f 100644
--- a/sw/source/filter/ww8/wrtw8sty.cxx
+++ b/sw/source/filter/ww8/wrtw8sty.cxx
@@ -1867,6 +1867,7 @@ void MSWordExportBase::SectionProperties( const 
WW8_SepInfo& rSepInfo, WW8_PdAtt
             }
 
             AttrOutput().OutputStyleItemSet( pPdFormat->GetAttrSet(), false );
+            ClearFlyAttrList(); // so they do not leak into other elements
 
             if (titlePage)
             {
diff --git a/sw/source/filter/ww8/wrtww8.hxx b/sw/source/filter/ww8/wrtww8.hxx
index 6aa9cacac1ea..5aa6c208235b 100644
--- a/sw/source/filter/ww8/wrtww8.hxx
+++ b/sw/source/filter/ww8/wrtww8.hxx
@@ -926,6 +926,8 @@ protected:
 
     virtual bool IsDummyFloattableAnchor(SwNode& /*rNode*/) const { return 
false; }
 
+    virtual void ClearFlyAttrList() = 0;
+
 public:
     MSWordExportBase(SwDoc& rDocument, std::shared_ptr<SwUnoCursor> & 
pCurrentPam, SwPaM* pOriginalPam);
     virtual ~MSWordExportBase();
@@ -1225,6 +1227,8 @@ protected:
 
     virtual void AppendSection( const SwPageDesc *pPageDesc, const 
SwSectionFormat* pFormat, sal_uLong nLnNum ) override;
 
+    virtual void ClearFlyAttrList() override {}
+
 private:
     WW8Export(const WW8Export&) = delete;
     WW8Export& operator=(const WW8Export&) = delete;
commit c9ba12a3c7882d985209be5967813cbeed00b398
Author:     Caolán McNamara <[email protected]>
AuthorDate: Wed Jan 14 19:12:48 2026 +0000
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:05 2026 +0100

    add a11y name to preview widget
    
    Change-Id: Ic04f7bac3e4eb62c7735d6e8e7bd611de915f240
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197295
    Tested-by: Jenkins
    Reviewed-by: Caolán McNamara <[email protected]>
    (cherry picked from commit 62a3e245ff9f10b9824cf9dca644894c34c83adb)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197301
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/sw/uiconfig/swriter/ui/outlinepositionpage.ui 
b/sw/uiconfig/swriter/ui/outlinepositionpage.ui
index cfd8a8deb35e..15a534838ceb 100644
--- a/sw/uiconfig/swriter/ui/outlinepositionpage.ui
+++ b/sw/uiconfig/swriter/ui/outlinepositionpage.ui
@@ -516,6 +516,11 @@ numbering and text:</property>
                 <property name="height_request">130</property>
                 <property name="visible">True</property>
                 <property name="can_focus">False</property>
+                <child internal-child="accessible">
+                  <object class="AtkObject" id="preview-atkobject">
+                    <property name="AtkObject::accessible-name" 
translatable="yes" 
context="outlinepositionpage|preview-atkobject">Preview</property>
+                  </object>
+                </child>
               </object>
               <packing>
                 <property name="left_attach">0</property>
commit 14e88b62d5d4e61c5d5119e21a9a6652f7a5cd08
Author:     Aron Budea <[email protected]>
AuthorDate: Mon Jan 12 15:04:20 2026 +1030
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 17 12:42:05 2026 +0100

    tdf#162527 tdf#169802 hidden image/shape in DOCX should be invisible
    
    ...and remain invisible after save.
    
    After 0b9e4f6085d147c43a86d107303eea9b86e7f34c shapes did get
    hidden, but in case of wrap-around shapes text still flowed
    around their supposed placement.
    Hidden images were simply shown before and after.
    
    Add a new Visible property to SwXTextGraphicObject, and let
    it set SwFlyDrawObj's Visible member as SdrObject.
    Import and export wp:docPr's hidden attribute in OOXML based
    on these properties.
    To avoid showing their area, let
    SwAnchoredObject::GetObjRectWithSpaces() return an empty
    rectangle (during opening this is only called from
    SwTextFly's IsAnyObj(...) and InitAnchoredObjList(), though).
    
    Note that Writer lacks support of changing visibility of
    images and shapes. This change adds minimal support for
    hiding them and roundtripping the setting in DOCX, but
    doesn't add ODF or UI support.
    
    Change-Id: I6e9d062628006a7128e380d1af06508625aa3d06
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197056
    Tested-by: Jenkins
    Reviewed-by: Aron Budea <[email protected]>
    (cherry picked from commit c1f7ea0db134d63c54b581f11e843ebd5bb83b54)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/197286
    Reviewed-by: Mike Kaganski <[email protected]>

diff --git a/offapi/com/sun/star/text/TextGraphicObject.idl 
b/offapi/com/sun/star/text/TextGraphicObject.idl
index 423a41778992..7a425f70ea27 100644
--- a/offapi/com/sun/star/text/TextGraphicObject.idl
+++ b/offapi/com/sun/star/text/TextGraphicObject.idl
@@ -123,6 +123,11 @@ published service TextGraphicObject
      */
     [optional, property] com::sun::star::graphic::XGraphic Graphic;
 
+    /** if this is `FALSE`, the graphic is not visible.
+
+        @since LibreOffice 26.2
+     */
+    [ optional, property ] boolean Visible;
 };
 
 
diff --git a/sw/inc/hintids.hxx b/sw/inc/hintids.hxx
index 39676270559c..423dafdcea08 100644
--- a/sw/inc/hintids.hxx
+++ b/sw/inc/hintids.hxx
@@ -411,8 +411,8 @@ inline constexpr TypedWhichId<SwGammaGrf> 
RES_GRFATR_GAMMA(RES_GRFATR_BEGIN + 8)
 inline constexpr TypedWhichId<SwInvertGrf> RES_GRFATR_INVERT(RES_GRFATR_BEGIN 
+ 9);
 inline constexpr TypedWhichId<SwTransparencyGrf> 
RES_GRFATR_TRANSPARENCY(RES_GRFATR_BEGIN + 10);
 inline constexpr TypedWhichId<SwDrawModeGrf> 
RES_GRFATR_DRAWMODE(RES_GRFATR_BEGIN + 11);
+inline constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_VISIBLE(RES_GRFATR_BEGIN 
+ 12);
 
-inline constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_DUMMY4(RES_GRFATR_BEGIN 
+ 12);
 inline constexpr TypedWhichId<SfxBoolItem> RES_GRFATR_DUMMY5(RES_GRFATR_BEGIN 
+ 13);
 inline constexpr sal_uInt16 RES_GRFATR_END(RES_GRFATR_BEGIN + 14);
 
diff --git a/sw/inc/unoprnms.hxx b/sw/inc/unoprnms.hxx
index 27981e05db01..e4b865b3f6de 100644
--- a/sw/inc/unoprnms.hxx
+++ b/sw/inc/unoprnms.hxx
@@ -601,6 +601,7 @@ inline constexpr OUString UNO_NAME_ADJUST_BLUE = 
u"AdjustBlue"_ustr;
 inline constexpr OUString UNO_NAME_GAMMA = u"Gamma"_ustr;
 inline constexpr OUString UNO_NAME_GRAPHIC_IS_INVERTED = 
u"GraphicIsInverted"_ustr;
 inline constexpr OUString UNO_NAME_TRANSPARENCY = u"Transparency"_ustr;
+inline constexpr OUString UNO_NAME_VISIBLE = u"Visible"_ustr;
 inline constexpr OUString UNO_NAME_REDLINE_AUTHOR = u"RedlineAuthor"_ustr;
 inline constexpr OUString UNO_NAME_REDLINE_DATE_TIME = u"RedlineDateTime"_ustr;
 inline constexpr OUString UNO_NAME_REDLINE_MOVED_ID = u"RedlineMovedID"_ustr;
diff --git a/sw/qa/extras/ooxmlexport/data/tdf162527_hidden_image.docx 
b/sw/qa/extras/ooxmlexport/data/tdf162527_hidden_image.docx
new file mode 100644
index 000000000000..5196bd67d772
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf162527_hidden_image.docx differ
diff --git a/sw/qa/extras/ooxmlexport/data/tdf169802_hidden_shape.docx 
b/sw/qa/extras/ooxmlexport/data/tdf169802_hidden_shape.docx
new file mode 100644
index 000000000000..b72fab170a69
Binary files /dev/null and 
b/sw/qa/extras/ooxmlexport/data/tdf169802_hidden_shape.docx differ
diff --git a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx 
b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
index bf8776fc6c41..43c16d0c912d 100644
--- a/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
+++ b/sw/qa/extras/ooxmlexport/ooxmlexport13.cxx
@@ -724,6 +724,34 @@ DECLARE_OOXMLEXPORT_TEST(testTdf156484, "tdf156484.docx")
     CPPUNIT_ASSERT_MESSAGE("Third shape should not be printable.", 
!getProperty<bool>(xShape, u"Printable"_ustr));
 }
 
+CPPUNIT_TEST_FIXTURE(Test, testTdf162527_hidden_image)
+{
+    createSwDoc("tdf162527_hidden_image.docx");
+    save(TestFilter::DOCX);
+
+    xmlDocUniquePtr pXmlDoc = parseExport(u"word/document.xml"_ustr);
+    CPPUNIT_ASSERT(pXmlDoc);
+    // Without the fix this element would have no 'hidden' attribute
+    assertXPath(pXmlDoc, 
"/w:document/w:body/w:p/w:r/w:drawing/wp:anchor/wp:docPr", "hidden",
+                u"1");
+
+    auto xShape(getShape(1));
+    CPPUNIT_ASSERT_MESSAGE("Shape should not be visible.",
+                           !getProperty<bool>(xShape, u"Visible"_ustr));
+}
+
+CPPUNIT_TEST_FIXTURE(Test, testTdf169802_hidden_shape)
+{
+    createSwDoc("tdf169802_hidden_shape.docx");
+    xmlDocUniquePtr pDump = parseLayoutDump();
+    // Just to check that the layout has sane content
+    int nTextNodes = countXPathNodes(pDump, "//*[contains(@type, 
'PortionType::Text')]");
+    CPPUNIT_ASSERT_MESSAGE("Layout must contain text nodes", 0 < nTextNodes);
+    // Layout mustn't contain fly portion, without the fix it would contain 
several
+    int nFlyNodes = countXPathNodes(pDump, "//*[contains(@type, 
'PortionType::Fly')]");
+    CPPUNIT_ASSERT_EQUAL_MESSAGE("No fly portion nodes must exist in the 
layout", 0, nFlyNodes);
+}
+
 DECLARE_OOXMLEXPORT_TEST(testTdf124594, "tdf124594.docx")
 {
     xmlDocUniquePtr pDump = parseLayoutDump();
diff --git a/sw/source/core/bastyp/init.cxx b/sw/source/core/bastyp/init.cxx
index bfc29059a774..cb2471ca3683 100644
--- a/sw/source/core/bastyp/init.cxx
+++ b/sw/source/core/bastyp/init.cxx
@@ -454,9 +454,9 @@ std::unique_ptr<ItemInfoPackage> 
createItemInfoPackageSwAttributes()
             { RES_GRFATR_INVERT, new SwInvertGrf, 0, SFX_ITEMINFOFLAG_NONE },
             { RES_GRFATR_TRANSPARENCY, new SwTransparencyGrf, 0, 
SFX_ITEMINFOFLAG_NONE },
             { RES_GRFATR_DRAWMODE, new SwDrawModeGrf, 0, SFX_ITEMINFOFLAG_NONE 
},
+            { RES_GRFATR_VISIBLE, new SfxBoolItem(RES_GRFATR_VISIBLE, true), 
0, SFX_ITEMINFOFLAG_NONE },
 
             // GraphicAttr - Dummies
-            { RES_GRFATR_DUMMY4, new SfxBoolItem( RES_GRFATR_DUMMY4 ), 0, 
SFX_ITEMINFOFLAG_NONE },
             { RES_GRFATR_DUMMY5, new SfxBoolItem( RES_GRFATR_DUMMY5 ), 0, 
SFX_ITEMINFOFLAG_NONE },
             { RES_BOXATR_FORMAT, new SwTableBoxNumFormat, 0, 
SFX_ITEMINFOFLAG_NONE },
             { RES_BOXATR_FORMULA, new SwTableBoxFormula( OUString() ), 0, 
SFX_ITEMINFOFLAG_NONE },
diff --git a/sw/source/core/layout/anchoredobject.cxx 
b/sw/source/core/layout/anchoredobject.cxx
index c8c418fa310f..39429e8b209f 100644
--- a/sw/source/core/layout/anchoredobject.cxx
+++ b/sw/source/core/layout/anchoredobject.cxx
@@ -564,6 +564,11 @@ bool SwAnchoredObject::HasClearedEnvironment() const
 */
 const SwRect& SwAnchoredObject::GetObjRectWithSpaces() const
 {
+    static const SwRect aEmptyRect;
+    // invisible objects have no area
+    if (!GetDrawObj()->IsVisible())
+        return aEmptyRect;
+
     if ( mbObjRectWithSpacesValid &&
          maLastObjRect != GetObjRect() )
     {
diff --git a/sw/source/core/layout/fly.cxx b/sw/source/core/layout/fly.cxx
index e1c2a35e8a24..380df804bac8 100644
--- a/sw/source/core/layout/fly.cxx
+++ b/sw/source/core/layout/fly.cxx
@@ -1487,6 +1487,14 @@ void SwFlyFrame::Format( vcl::RenderContext* 
/*pRenderContext*/, const SwBorderA
 {
     OSL_ENSURE( pAttrs, "FlyFrame::Format, pAttrs is 0." );
 
+    if (GetDrawObj() && !GetDrawObj()->IsVisible())
+    {
+        SwFrameAreaDefinition::FrameAreaWriteAccess aFrm(*this);
+        aFrm.setSwRect(SwRect());
+        setFrameAreaSizeValid(true);
+        return;
+    }
+
     ColLock();
 
     if ( !isFrameAreaSizeValid() )
diff --git a/sw/source/core/unocore/unoframe.cxx 
b/sw/source/core/unocore/unoframe.cxx
index b87dcd7f29f2..4ea5dbcb08c6 100644
--- a/sw/source/core/unocore/unoframe.cxx
+++ b/sw/source/core/unocore/unoframe.cxx
@@ -1411,7 +1411,14 @@ void SwXFrame::setPropertyValue(const OUString& 
rPropertyName, const ::uno::Any&
             throw beans::PropertyVetoException("Property is read-only: " + 
rPropertyName, getXWeak() );
 
         SwDoc& rDoc = pFormat->GetDoc();
-        if ( ((m_eType == FLYCNTTYPE_GRF) && isGRFATR(pEntry->nWID)) ||
+        if (m_eType == FLYCNTTYPE_GRF && RES_GRFATR_VISIBLE == pEntry->nWID)
+        {
+            bool bVisible = true;
+            aValue >>= bVisible;
+            SdrObject* pObject = 
GetOrCreateSdrObject(static_cast<SwFlyFrameFormat&>(*pFormat));
+            pObject->SetVisible(bVisible);
+        }
+        else if ( ((m_eType == FLYCNTTYPE_GRF) && isGRFATR(pEntry->nWID)) ||
             (FN_PARAM_CONTOUR_PP         == pEntry->nWID) ||
             (FN_UNO_IS_AUTOMATIC_CONTOUR == pEntry->nWID) ||
             (FN_UNO_IS_PIXEL_CONTOUR     == pEntry->nWID) )
@@ -1962,7 +1969,12 @@ uno::Any SwXFrame::getPropertyValue(const OUString& 
rPropertyName)
     }
     else if(pFormat)
     {
-        if( ((m_eType == FLYCNTTYPE_GRF) || (m_eType == FLYCNTTYPE_OLE)) &&
+        if (m_eType == FLYCNTTYPE_GRF && RES_GRFATR_VISIBLE == pEntry->nWID)
+        {
-e 
... etc. - the rest is truncated

Reply via email to