bin/pack-debug                                   |    2 
 desktop/source/lib/init.cxx                      |   17 +++++
 include/svx/srchdlg.hxx                          |    4 +
 include/vcl/ITiledRenderable.hxx                 |    5 +
 oox/qa/unit/data/tdf170095.pptx                  |binary
 oox/qa/unit/shape.cxx                            |   19 +++++
 oox/source/drawingml/shape.cxx                   |   17 +++--
 sc/inc/docuno.hxx                                |    3 
 sc/qa/unit/tiledrendering/data/PrintRanges.ods   |binary
 sc/qa/unit/tiledrendering/tiledrendering.cxx     |   14 ++++
 sc/source/ui/unoobj/docuno.cxx                   |   14 ++++
 sd/uiconfig/simpress/ui/customanimationspanel.ui |   78 ++++++++++++-----------
 solenv/bin/modules/installer/epmfile.pm          |    2 
 svx/source/dialog/srchdlg.cxx                    |   20 +++++
 svx/source/svdraw/svdobj.cxx                     |   28 ++++++++
 svx/uiconfig/ui/findreplacedialog.ui             |   39 +++++++++++
 sw/source/uibase/docvw/edtwin.cxx                |    2 
 sysui/desktop/freedesktop/freedesktop-menus.spec |    4 -
 vcl/inc/font/LogicalFontInstance.hxx             |   12 ---
 vcl/jsdialog/enabled.cxx                         |    1 
 vcl/source/font/LogicalFontInstance.cxx          |   30 --------
 vcl/source/gdi/CommonSalLayout.cxx               |   13 ---
 vcl/source/treelist/iconview.cxx                 |    5 +
 23 files changed, 228 insertions(+), 101 deletions(-)

New commits:
commit f4055677ca63cfdeb34295bdaa4ea7a04b1f4a16
Author:     Jaume Pujantell <[email protected]>
AuthorDate: Tue Dec 23 09:26:12 2025 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 10 17:11:36 2026 +0100

    tdf#170095 override soft edge if there are 3D effects
    
    In OOXML, 3D effects override the soft-edge effect. Currently in LO 3D
    effects are not implemented, they are just remembered in a grabbag.
    
    To bring LO's behavior closer to other software, if when loaded there
    are both 3D effects and soft edge effect we ignore the soft edge effect.
    And if, while editing, a user adds soft edge effect then we dumb the
    remembered 3D effects in the grabbag.
    
    Change-Id: I2f59422d25c24bb4f9042694e0315bb15a2ac4c5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196151
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Miklos Vajna <[email protected]>

diff --git a/oox/qa/unit/data/tdf170095.pptx b/oox/qa/unit/data/tdf170095.pptx
new file mode 100644
index 000000000000..65bf6535bb48
Binary files /dev/null and b/oox/qa/unit/data/tdf170095.pptx differ
diff --git a/oox/qa/unit/shape.cxx b/oox/qa/unit/shape.cxx
index 13bc7a1a086e..5ac67b454933 100644
--- a/oox/qa/unit/shape.cxx
+++ b/oox/qa/unit/shape.cxx
@@ -1079,6 +1079,25 @@ CPPUNIT_TEST_FIXTURE(OoxShapeTest, 
testDigitGuideName_mathEqual)
         CPPUNIT_ASSERT_DOUBLES_EQUAL(10000.0, fBoundRectHeight, 5);
     }
 }
+
+CPPUNIT_TEST_FIXTURE(OoxShapeTest, testTdf170095SoftEdge3D)
+{
+    // Load file with a shape with both soft edge and 3D effects
+    loadFromFile(u"tdf170095.pptx");
+
+    // Then make sure the shape has no soft edge:
+    uno::Reference<drawing::XDrawPagesSupplier> 
xDrawPagesSupplier(mxComponent, uno::UNO_QUERY);
+    uno::Reference<drawing::XDrawPage> 
xDrawPage(xDrawPagesSupplier->getDrawPages()->getByIndex(0),
+                                                 uno::UNO_QUERY);
+    uno::Reference<beans::XPropertySet> xShape(xDrawPage->getByIndex(0), 
uno::UNO_QUERY);
+    sal_Int32 nSoftEdgeRad{};
+    xShape->getPropertyValue(u"SoftEdgeRadius"_ustr) >>= nSoftEdgeRad;
+    // Without the accompanying fix in place, this test would have failed with:
+    // - Expected: 0
+    // - Actual  : 882
+    CPPUNIT_ASSERT_EQUAL(static_cast<sal_Int32>(0), nSoftEdgeRad);
+}
+
 CPPUNIT_PLUGIN_IMPLEMENT();
 
 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/oox/source/drawingml/shape.cxx b/oox/source/drawingml/shape.cxx
index dece867749bc..336f7dc9172a 100644
--- a/oox/source/drawingml/shape.cxx
+++ b/oox/source/drawingml/shape.cxx
@@ -1620,6 +1620,18 @@ Reference< XShape > const & Shape::createAndInsert(
                 aShapeProps.setProperty(PROP_CharHeight, GetFontHeight( 
mpMasterTextListStyle->getListStyle()[0].getTextCharacterProperties().moHeight.value()
 ));
         }
 
+        Sequence<PropertyValue> aCamera3DEffects = 
get3DProperties().getCameraAttributes();
+        Sequence<PropertyValue> aLightRig3DEffects = 
get3DProperties().getLightRigAttributes();
+        Sequence<PropertyValue> aShape3DEffects
+            = get3DProperties().getShape3DAttributes(rGraphicHelper, 
nFillPhClr);
+        bool bHas3DProps = aCamera3DEffects.hasElements() || 
aLightRig3DEffects.hasElements()
+                           || aShape3DEffects.hasElements();
+        if (bHas3DProps)
+        {
+            // 3D properties override softeEdge
+            getEffectProperties().maSoftEdge.moRad = 0;
+        }
+
         // applying properties
         aShapeProps.assignUsed( getShapeProperties() );
         aShapeProps.assignUsed( maDefaultShapeProperties );
@@ -2013,10 +2025,7 @@ Reference< XShape > const & Shape::createAndInsert(
             }
 
             // add 3D effects if any to GrabBag. They are still used in export.
-            Sequence< PropertyValue > aCamera3DEffects = 
get3DProperties().getCameraAttributes();
-            Sequence< PropertyValue > aLightRig3DEffects = 
get3DProperties().getLightRigAttributes();
-            Sequence< PropertyValue > aShape3DEffects = 
get3DProperties().getShape3DAttributes( rGraphicHelper, nFillPhClr );
-            if( aCamera3DEffects.hasElements() || 
aLightRig3DEffects.hasElements() || aShape3DEffects.hasElements() )
+            if (bHas3DProps)
             {
                 uno::Sequence<beans::PropertyValue> a3DEffectsGrabBag = 
comphelper::InitPropertySequence(
                 {
diff --git a/svx/source/svdraw/svdobj.cxx b/svx/source/svdraw/svdobj.cxx
index 66c35a1086da..3fa54ec4622b 100644
--- a/svx/source/svdraw/svdobj.cxx
+++ b/svx/source/svdraw/svdobj.cxx
@@ -36,6 +36,7 @@
 #include <drawinglayer/processor2d/contourextractor2d.hxx>
 #include <drawinglayer/processor2d/linegeometryextractor2d.hxx>
 #include <comphelper/processfactory.hxx>
+#include <comphelper/sequence.hxx>
 #include <editeng/editeng.hxx>
 #include <editeng/outlobj.hxx>
 #include <o3tl/deleter.hxx>
@@ -2054,6 +2055,33 @@ const SfxPoolItem& SdrObject::GetMergedItem(const 
sal_uInt16 nWhich) const
 void SdrObject::SetMergedItemSetAndBroadcast(const SfxItemSet& rSet, bool 
bClearAllItems)
 {
     GetProperties().SetMergedItemSetAndBroadcast(rSet, bClearAllItems);
+
+    const SdrMetricItem* pItem;
+    const bool bSetSoftEdge
+        = (SfxItemState::SET == rSet.GetItemState(SDRATTR_SOFTEDGE_RADIUS, 
true, &pItem)
+           && pItem->GetValue() > 0);
+    if (bSetSoftEdge)
+    {
+        // Remove 3D grabbag
+        try
+        {
+            css::uno::Any aAnyGrabBag;
+            GetGrabBagItem(aAnyGrabBag);
+            uno::Sequence<beans::PropertyValue> aSeqGrabBag
+                = aAnyGrabBag.get<uno::Sequence<beans::PropertyValue>>();
+            auto it = std::find_if(aSeqGrabBag.begin(), aSeqGrabBag.end(),
+                                   [](const beans::PropertyValue& rProp) {
+                                       return rProp.Name == 
u"3DEffectProperties"_ustr;
+                                   });
+            if (it == aSeqGrabBag.end())
+                return;
+            comphelper::removeElementAt(aSeqGrabBag, it - aSeqGrabBag.begin());
+            SetGrabBagItem(css::uno::Any(aSeqGrabBag));
+        }
+        catch (...)
+        {
+        }
+    }
 }
 
 void SdrObject::ApplyNotPersistAttr(const SfxItemSet& rAttr)
commit e6468bc7da8d83425db3fb2ac0219f9ac26bb3ad
Author:     Szymon Kłos <[email protected]>
AuthorDate: Mon Dec 22 05:39:31 2025 +0000
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 10 17:11:36 2026 +0100

    sidebar: fix span values for Impress -> Animation deck
    
    - in grid we had single element which was in last column
    - span it inside box with the second column item
    - all other fields should occupy full width
    
    Change-Id: Ia7dd79798e436377b18ea0c2dfda1b7754780bd5
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196059
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Darshan Upadhyay <[email protected]>
    Reviewed-by: Szymon Kłos <[email protected]>

diff --git a/sd/uiconfig/simpress/ui/customanimationspanel.ui 
b/sd/uiconfig/simpress/ui/customanimationspanel.ui
index a9ae9154b9da..7c6578232ff9 100644
--- a/sd/uiconfig/simpress/ui/customanimationspanel.ui
+++ b/sd/uiconfig/simpress/ui/customanimationspanel.ui
@@ -315,9 +315,9 @@
                     </child>
                   </object>
                   <packing>
-                    <property name="left-attach">1</property>
+                    <property name="left-attach">0</property>
                     <property name="top-attach">1</property>
-                    <property name="width">2</property>
+                    <property name="width">3</property>
                   </packing>
                 </child>
                 <child>
@@ -473,6 +473,7 @@
                   <packing>
                     <property name="left-attach">1</property>
                     <property name="top-attach">5</property>
+                    <property name="width">2</property>
                   </packing>
                 </child>
                 <child>
@@ -488,25 +489,6 @@
                     <property name="top-attach">6</property>
                   </packing>
                 </child>
-                <child>
-                  <object class="GtkButton" id="more_properties">
-                    <property name="visible">True</property>
-                    <property name="can-focus">True</property>
-                    <property name="receives-default">True</property>
-                    <property name="tooltip-text" translatable="yes" 
context="customanimationspanel|more_properties|tooltip_text">Options</property>
-                    <property name="image">image1</property>
-                    <property name="always-show-image">True</property>
-                    <child internal-child="accessible">
-                      <object class="AtkObject" id="more_properties-atkobject">
-                        <property name="AtkObject::accessible-description" 
translatable="yes" 
context="customanimationspanel|extended_tip|more_properties">Specifies 
additional properties for the selected element in the Custom Animations 
pane.</property>
-                      </object>
-                    </child>
-                  </object>
-                  <packing>
-                    <property name="left-attach">2</property>
-                    <property name="top-attach">6</property>
-                  </packing>
-                </child>
                 <child>
                   <object class="GtkLabel" id="effect_duration">
                     <property name="visible">True</property>
@@ -537,6 +519,7 @@
                   <packing>
                     <property name="left-attach">1</property>
                     <property name="top-attach">7</property>
+                    <property name="width">2</property>
                   </packing>
                 </child>
                 <child>
@@ -569,6 +552,7 @@
                   <packing>
                     <property name="left-attach">1</property>
                     <property name="top-attach">8</property>
+                    <property name="width">2</property>
                   </packing>
                 </child>
                 <child>
@@ -650,32 +634,52 @@
                   </packing>
                 </child>
                 <child>
-                  <object class="GtkBox" id="placeholder">
+                  <object class="GtkBox" id="dirspan">
                     <property name="visible">True</property>
                     <property name="can-focus">False</property>
-                    <property name="hexpand">True</property>
-                    <property name="spacing">6</property>
                     <child>
-                      <placeholder/>
+                      <object class="GtkBox" id="placeholder">
+                        <property name="visible">True</property>
+                        <property name="can-focus">False</property>
+                        <property name="hexpand">True</property>
+                        <property name="spacing">6</property>
+                        <child>
+                          <placeholder/>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">0</property>
+                      </packing>
+                    </child>
+                    <child>
+                      <object class="GtkButton" id="more_properties">
+                        <property name="visible">True</property>
+                        <property name="can-focus">True</property>
+                        <property name="receives-default">True</property>
+                        <property name="tooltip-text" translatable="yes" 
context="customanimationspanel|more_properties|tooltip_text">Options</property>
+                        <property name="image">image1</property>
+                        <property name="always-show-image">True</property>
+                        <child internal-child="accessible">
+                          <object class="AtkObject" 
id="more_properties-atkobject">
+                            <property name="AtkObject::accessible-description" 
translatable="yes" 
context="customanimationspanel|extended_tip|more_properties">Specifies 
additional properties for the selected element in the Custom Animations 
pane.</property>
+                          </object>
+                        </child>
+                      </object>
+                      <packing>
+                        <property name="expand">False</property>
+                        <property name="fill">True</property>
+                        <property name="position">1</property>
+                      </packing>
                     </child>
                   </object>
                   <packing>
                     <property name="left-attach">1</property>
                     <property name="top-attach">6</property>
+                    <property name="width">2</property>
                   </packing>
                 </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
-                <child>
-                  <placeholder/>
-                </child>
               </object>
             </child>
           </object>
commit 2d3f06afe352e73cafbca3b5b03a4d3750601fd9
Author:     Andras Timar <[email protected]>
AuthorDate: Thu Nov 13 08:50:58 2025 +0100
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 10 17:11:36 2026 +0100

    Fedora 43 rejects RPM packages that lack SHA-256 digests in the header
    
    Change-Id: I51b8d5e3203711bc38bec33892cd5d9346fbe4ae
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/193940
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Andras Timar <[email protected]>

diff --git a/bin/pack-debug b/bin/pack-debug
index 70e3f80c7ed4..ab677738f22b 100755
--- a/bin/pack-debug
+++ b/bin/pack-debug
@@ -105,7 +105,7 @@ cat $DEBUGSRC | awk '
 
  # debug build source package
 
- rpmbuild -bb --define "_unpackaged_files_terminate_build  0" --define 
"_binary_payload w1T.xzdio" ${DEBUGSRC}-debugsource --target $build_cpu 
--buildroot=$buildroot
+ rpmbuild -bb --define "_unpackaged_files_terminate_build  0" --define 
"_binary_payload w2.xzdio" --define "_binary_filedigest_algorithm 8" 
${DEBUGSRC}-debugsource --target $build_cpu --buildroot=$buildroot
 
 
 echo Update RPM download tar.gz
diff --git a/solenv/bin/modules/installer/epmfile.pm 
b/solenv/bin/modules/installer/epmfile.pm
index 472cc4b24b4d..60c35853a6b7 100644
--- a/solenv/bin/modules/installer/epmfile.pm
+++ b/solenv/bin/modules/installer/epmfile.pm
@@ -1225,7 +1225,7 @@ sub set_autoprovreq_in_specfile
         close (FINDREQUIRES);
     }
 
-    $autoreqprovline .= "%define _binary_filedigest_algorithm 1
%define _binary_payload w1T.xzdio
";
+    $autoreqprovline .= "%define _binary_filedigest_algorithm 8
%define _binary_payload w2.xzdio
";
 
     for ( my $i = 0; $i <= $#{$changefile}; $i++ )
     {
diff --git a/sysui/desktop/freedesktop/freedesktop-menus.spec 
b/sysui/desktop/freedesktop/freedesktop-menus.spec
index ca79db012a26..a21444ac26a4 100644
--- a/sysui/desktop/freedesktop/freedesktop-menus.spec
+++ b/sysui/desktop/freedesktop/freedesktop-menus.spec
@@ -32,8 +32,8 @@ Conflicts: %pkgprefix-redhat-menus
 Conflicts: %pkgprefix-mandriva-menus
 BuildArch: noarch
 AutoReqProv: no
-%define _binary_filedigest_algorithm 1
-%define _binary_payload w1T.xzdio
+%define _binary_filedigest_algorithm 8
+%define _binary_payload w2.xzdio
 
 %define gnome_dir /usr
 
commit 62be940be76471f0cc54df600c8d03dc806c3253
Author:     Shardul Vikram Singh <[email protected]>
AuthorDate: Wed Oct 22 18:43:21 2025 +0530
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 10 17:11:36 2026 +0100

    JSDialog: implement jsdialog for mergecellsdialog
    
    Change-Id: I5318082404f298563a91467e683ea45b21a99ea0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/192851
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Szymon Kłos <[email protected]>
    Tested-by: Szymon Kłos <[email protected]>

diff --git a/vcl/jsdialog/enabled.cxx b/vcl/jsdialog/enabled.cxx
index 0e6b999e0365..603186c807d6 100644
--- a/vcl/jsdialog/enabled.cxx
+++ b/vcl/jsdialog/enabled.cxx
@@ -172,6 +172,7 @@ constexpr auto ScalcDialogList
         { u"modules/scalc/ui/imoptdialog.ui" },
         { u"modules/scalc/ui/insertcells.ui" },
         { u"modules/scalc/ui/managenamesdialog.ui" },
+        { u"modules/scalc/ui/mergecellsdialog.ui" },
         { u"modules/scalc/ui/movecopysheet.ui" },
         { u"modules/scalc/ui/movingaveragedialog.ui" },
         { u"modules/scalc/ui/optimalcolwidthdialog.ui" },
commit d87d09edeb15884fcf719b5827b73c730cfd447f
Author:     Sahil Gautam <[email protected]>
AuthorDate: Thu Jul 31 12:08:09 2025 +0530
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 10 17:11:36 2026 +0100

    tdf#167647 add tabs to find and replace dialog
    
    add two toggle buttons on top of the "find replace dialog" and make
    them behave as tabs i.e. when replace is clicked, show the replace
    controls.
    
    when the dialog first shows up, we hide the replace controls and when
    the user switches to replace tab, we show the replace controls, find
    controls are always visible.
    
    i thought through various other ways it could have been done (most of
    them being more complicated than the current solution).
    
    1. "could we create one tab and just return a shared pointer to it
    for different tabs so that they share the page". this requires us to
    return a shared pointer from TabPageClass::Create which is passed in
    the AddTabPage function. i thought "could we internally store a raw
    pointer and then in the Create function of the tab page, we return
    the unique_ptr to it." this doesn't seem like a good idea as when the
    first tab page is destructed, the raw pointer in the Create function
    and the unique pointers in other tab pages will become invalid leading
    to double free.
    
    2. "what if i add the frame only to the first tab and in the code
    set it as a child of the second tab as well, using something like
    set_child" -> weld doesn't have any such function as far as i could
    search.
    
    3. convert the current find-replace dialog into a tab page and add two
    different instances of it to the dialog. then transfer the data to
    the other tab on tab switch. this would require addition of a lot of
    getters and setters and might introduce bugs.
    
    Change-Id: I49c5640f39262578e31caee839c2059bb86610a6
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/188644
    Reviewed-by: Szymon Kłos <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/include/svx/srchdlg.hxx b/include/svx/srchdlg.hxx
index 34d82fbb9d28..d35bd5b98cf2 100644
--- a/include/svx/srchdlg.hxx
+++ b/include/svx/srchdlg.hxx
@@ -186,6 +186,8 @@ private:
     std::unique_ptr<weld::Label> m_xSearchLabel;
     std::unique_ptr<weld::Image> m_xSearchIcon;
     std::unique_ptr<weld::Container> m_xSearchBox;
+    std::unique_ptr<weld::ToggleButton> m_xFindTabBtn;
+    std::unique_ptr<weld::ToggleButton> m_xReplaceTabBtn;
 
     std::unique_ptr<weld::Frame> m_xReplaceFrame;
     std::unique_ptr<weld::ComboBox> m_xReplaceLB;
@@ -247,8 +249,10 @@ private:
     DECL_DLLPRIVATE_LINK(NoFormatHdl_Impl, weld::Button&, void);
     DECL_DLLPRIVATE_LINK(AttributeHdl_Impl, weld::Button&, void);
     DECL_DLLPRIVATE_LINK( TimeoutHdl_Impl, Timer*, void );
+    DECL_DLLPRIVATE_LINK(OnTabBtnClick, weld::Toggleable&, void);
     SVX_DLLPRIVATE void ClickHdl_Impl(const weld::Widget* pCtrl);
 
+    SVX_DLLPRIVATE void SetReplaceCtrlsVisible(bool bVisible);
     SVX_DLLPRIVATE void Construct_Impl();
     SVX_DLLPRIVATE void InitControls_Impl();
     SVX_DLLPRIVATE void ShowOptionalControls_Impl();
diff --git a/svx/source/dialog/srchdlg.cxx b/svx/source/dialog/srchdlg.cxx
index d167b729a514..73cc877f8e2d 100644
--- a/svx/source/dialog/srchdlg.cxx
+++ b/svx/source/dialog/srchdlg.cxx
@@ -262,6 +262,8 @@ SvxSearchDialog::SvxSearchDialog(weld::Window* pParent, 
SfxChildWindow* pChildWi
     , m_xSearchLabel(m_xBuilder->weld_label(u"searchlabel"_ustr))
     , m_xSearchIcon(m_xBuilder->weld_image(u"searchicon"_ustr))
     , m_xSearchBox(m_xBuilder->weld_container(u"searchbox"_ustr))
+    , m_xFindTabBtn(m_xBuilder->weld_toggle_button(u"find_tab_btn"_ustr))
+    , m_xReplaceTabBtn(m_xBuilder->weld_toggle_button(u"replace_tab_btn"_ustr))
     , m_xReplaceFrame(m_xBuilder->weld_frame(u"replaceframe"_ustr))
     , m_xReplaceLB(m_xBuilder->weld_combo_box(u"replaceterm"_ustr))
     , m_xReplaceTmplLB(m_xBuilder->weld_combo_box(u"replacelist"_ustr))
@@ -346,6 +348,7 @@ SvxSearchDialog::SvxSearchDialog(weld::Window* pParent, 
SfxChildWindow* pChildWi
     m_xReplaceTmplLB->set_size_request(nTermWidth, -1);
 
     Construct_Impl();
+    SetReplaceCtrlsVisible(false);
 }
 
 IMPL_LINK_NOARG(SvxSearchDialog, PresentTimeoutHdl_Impl, Timer*, void)
@@ -383,6 +386,16 @@ SvxSearchDialog::~SvxSearchDialog()
     m_pImpl.reset();
 }
 
+void SvxSearchDialog::SetReplaceCtrlsVisible(bool bVisible)
+{
+    m_xFindTabBtn->set_active(!bVisible);
+    m_xReplaceTabBtn->set_active(bVisible);
+
+    m_xReplaceFrame->set_visible(bVisible);
+    m_xReplaceBtn->set_visible(bVisible);
+    m_xReplaceAllBtn->set_visible(bVisible);
+}
+
 void SvxSearchDialog::Construct_Impl()
 {
     m_pImpl.reset(new SearchDlg_Impl());
@@ -646,6 +659,8 @@ void SvxSearchDialog::InitControls_Impl()
 
     m_xSearchLB->connect_changed( LINK( this, SvxSearchDialog, ModifyHdl_Impl 
) );
     m_xReplaceLB->connect_changed( LINK( this, SvxSearchDialog, ModifyHdl_Impl 
) );
+    m_xFindTabBtn->connect_toggled(LINK(this, SvxSearchDialog, OnTabBtnClick));
+    m_xReplaceTabBtn->connect_toggled(LINK(this, SvxSearchDialog, 
OnTabBtnClick));
 
     Link<weld::Widget&,void> aLink = LINK( this, SvxSearchDialog, 
FocusHdl_Impl );
     m_xSearchLB->connect_focus_in( aLink );
@@ -1277,6 +1292,11 @@ void SvxSearchDialog::ClickHdl_Impl(const weld::Widget* 
pCtrl)
         SaveToModule_Impl();
 }
 
+IMPL_LINK(SvxSearchDialog, OnTabBtnClick, weld::Toggleable&, rBtn, void)
+{
+    SetReplaceCtrlsVisible(&rBtn == m_xReplaceTabBtn.get());
+}
+
 IMPL_LINK(SvxSearchDialog, CommandHdl_Impl, weld::Button&, rBtn, void)
 {
     bool bInclusive = (m_xLayoutBtn->get_label() == m_sLayoutStr);
diff --git a/svx/uiconfig/ui/findreplacedialog.ui 
b/svx/uiconfig/ui/findreplacedialog.ui
index fc2206515cb1..1c9952ea111c 100644
--- a/svx/uiconfig/ui/findreplacedialog.ui
+++ b/svx/uiconfig/ui/findreplacedialog.ui
@@ -56,6 +56,45 @@
             <property name="position">0</property>
           </packing>
         </child>
+        <child>
+          <object class="GtkBox" id="findreplacetabbox">
+            <property name="visible">True</property>
+            <property name="can-focus">False</property>
+            <property name="halign">start</property>
+            <property name="spacing">6</property>
+            <child>
+              <object class="GtkToggleButton" id="find_tab_btn">
+                <property name="label" translatable="yes" 
context="findreplacedialog|find_tab_btn">Find</property>
+                <property name="visible">True</property>
+                <property name="can-focus">True</property>
+                <property name="receives-default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">0</property>
+              </packing>
+            </child>
+            <child>
+              <object class="GtkToggleButton" id="replace_tab_btn">
+                <property name="label" translatable="yes" 
context="findreplacedialog|replace_tab_btn">Replace</property>
+                <property name="visible">True</property>
+                <property name="can-focus">True</property>
+                <property name="receives-default">True</property>
+              </object>
+              <packing>
+                <property name="expand">False</property>
+                <property name="fill">True</property>
+                <property name="position">1</property>
+              </packing>
+            </child>
+          </object>
+          <packing>
+            <property name="expand">False</property>
+            <property name="fill">False</property>
+            <property name="position">0</property>
+          </packing>
+        </child>
         <child>
           <object class="GtkBox" id="parent _container_box">
             <property name="visible">True</property>
commit 00a4b06defe42dcb222b4bb566ae0630b12fdbb1
Author:     Gökay Şatır <[email protected]>
AuthorDate: Wed Sep 3 20:31:56 2025 +0300
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 10 17:11:36 2026 +0100

    cool#12762: Calc Online: Implement doc_getPrintRanges for document load.
    
    Issue: If a document has print ranges defined, Online side doesn't get it 
on document load and can't show the ranges.
    Fix: Add it to the document status message. There is also an Online side 
commit.
    
    Also a test added for the feature.
    
    Signed-off-by: Gökay Şatır <[email protected]>
    Change-Id: Id7c1f37be435b2ac6e9f7bb6554376e1867bfbcb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/190563
    Reviewed-by: Miklos Vajna <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/desktop/source/lib/init.cxx b/desktop/source/lib/init.cxx
index 459410748b1a..15b79c9bdbb9 100644
--- a/desktop/source/lib/init.cxx
+++ b/desktop/source/lib/init.cxx
@@ -6720,6 +6720,19 @@ static char* getUndoOrRedo(LibreOfficeKitDocument* 
pThis, UndoOrRedo eCommand)
     return pJson;
 }
 
+/// Returns the JSON representation of print ranges in the document
+static char* getPrintRanges(LibreOfficeKitDocument* pThis)
+{
+    ITiledRenderable* pDoc = getTiledRenderable(pThis);
+    if (!pDoc)
+    {
+        SetLastExceptionMsg(u"Document doesn't support tiled rendering"_ustr);
+        return nullptr;
+    }
+
+    return convertOString(rtl::OUStringToOString(pDoc->getPrintRanges(), 
RTL_TEXTENCODING_UTF8));
+}
+
 /// Returns only the number of the undo or redo elements
 static char* getUndoOrRedoCount(LibreOfficeKitDocument* pThis, UndoOrRedo 
eCommand)
 {
@@ -6862,6 +6875,10 @@ static char* 
doc_getCommandValues(LibreOfficeKitDocument* pThis, const char* pCo
     {
         return getUndoOrRedo(pThis, UndoOrRedo::REDO);
     }
+    else if (aCommand == ".uno:DefinePrintArea")
+    {
+        return getPrintRanges(pThis);
+    }
     else if (aCommand == ".uno:UndoCount")
     {
         return getUndoOrRedoCount(pThis, UndoOrRedo::UNDO);
diff --git a/include/vcl/ITiledRenderable.hxx b/include/vcl/ITiledRenderable.hxx
index f7ce84f12d51..f93e831a38ea 100644
--- a/include/vcl/ITiledRenderable.hxx
+++ b/include/vcl/ITiledRenderable.hxx
@@ -95,6 +95,11 @@ public:
         return Size(1, 1);
     }
 
+    virtual OUString getPrintRanges()
+    {
+        return OUString();
+    }
+
     /**
      * Set the document "part", i.e. slide for a slideshow, and
      * tab for a spreadsheet.
diff --git a/sc/inc/docuno.hxx b/sc/inc/docuno.hxx
index 5d62c5a13a35..82654a750055 100644
--- a/sc/inc/docuno.hxx
+++ b/sc/inc/docuno.hxx
@@ -313,6 +313,9 @@ public:
     /// @see vcl::ITiledRenderable::getDataArea().
     virtual Size getDataArea(long nPart) override;
 
+    /// @see vcl::ITiledRenderable::getPrintRanges().
+    virtual OUString getPrintRanges() override;
+
     /// @see vcl::ITiledRenderable::setPart().
     virtual void setPart(int nPart, bool bAllowChangeFocus = true) override;
 
diff --git a/sc/qa/unit/tiledrendering/data/PrintRanges.ods 
b/sc/qa/unit/tiledrendering/data/PrintRanges.ods
new file mode 100644
index 000000000000..a15824d94ad7
Binary files /dev/null and b/sc/qa/unit/tiledrendering/data/PrintRanges.ods 
differ
diff --git a/sc/qa/unit/tiledrendering/tiledrendering.cxx 
b/sc/qa/unit/tiledrendering/tiledrendering.cxx
index 123a6c99f628..8962205b819a 100644
--- a/sc/qa/unit/tiledrendering/tiledrendering.cxx
+++ b/sc/qa/unit/tiledrendering/tiledrendering.cxx
@@ -3655,6 +3655,20 @@ CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, 
testPivotFilterPosition)
     CPPUNIT_ASSERT(it != aView.m_aStateChanges.end());
 }
 
+CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testPrintRanges)
+{
+    ScModelObj* pModelObj = createDoc("PrintRanges.ods");
+    ScTestViewCallback aView;
+    
pModelObj->initializeForTiledRendering(uno::Sequence<beans::PropertyValue>());
+
+    /*
+        Expected output: { \"printranges\": [ { \"sheet\": 0, \"ranges\": [ [ 
2, 6, 2, 6]]}]}
+    */
+    OUString printRanges = pModelObj->getPrintRanges().replaceAll(" ", "");
+
+    
CPPUNIT_ASSERT_EQUAL(u"{\"printranges\":[{\"sheet\":0,\"ranges\":[[2,6,2,6]]}]}"_ustr,
 printRanges);
+}
+
 CPPUNIT_TEST_FIXTURE(ScTiledRenderingTest, testLOKLanguageStatus)
 {
     ScModelObj* pModelObj = createDoc("pivotfr.ods");
diff --git a/sc/source/ui/unoobj/docuno.cxx b/sc/source/ui/unoobj/docuno.cxx
index d2371ceb940d..9288173ef712 100644
--- a/sc/source/ui/unoobj/docuno.cxx
+++ b/sc/source/ui/unoobj/docuno.cxx
@@ -141,6 +141,8 @@
 
 #include <strings.hrc>
 
+#include <prnsave.hxx>
+
 using namespace com::sun::star;
 
 // #i111553# provides the name of the VBA constant for this document type 
(e.g. 'ThisExcelDoc' for Calc)
@@ -803,6 +805,18 @@ Size ScModelObj::getDataArea(long nPart)
     return aSize;
 }
 
+OUString ScModelObj::getPrintRanges()
+{
+    const ScDocument& rDoc = pDocShell->GetDocument();
+
+    std::unique_ptr<ScPrintRangeSaver> pSaver = rDoc.CreatePrintRangeSaver();
+
+    tools::JsonWriter aJsonWriter;
+    pSaver->GetPrintRangesInfo(aJsonWriter);
+
+    return OStringToOUString(aJsonWriter.finishAndGetAsOString(), 
RTL_TEXTENCODING_UTF8);
+}
+
 void ScModelObj::postKeyEvent(int nType, int nCharCode, int nKeyCode)
 {
     SolarMutexGuard aGuard;
commit c62c364bc065ebbe7be70cc33e86f98c1726e1d6
Author:     Maya Stephens <[email protected]>
AuthorDate: Thu Dec 11 15:14:40 2025 +0000
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 10 17:11:36 2026 +0100

    sw: make readonly dialog async when deleting protected content
    
    Open writer-edit.fodt, select all and press backspace; the Read-Only
    Content dialog is synchronous. This commit makes the dialog
    asynchronous.
    
    Very similar to https://gerrit.libreoffice.org/c/core/+/176113, the
    dialog does not give the warning when the delete key is used instead of
    backspace before this commit.
    
    Change-Id: I9db5fd8a4e5ebb20dbb539119aadbf846a6a6964
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195475
    Reviewed-by: Miklos Vajna <[email protected]>
    Tested-by: Jenkins CollaboraOffice <[email protected]>

diff --git a/sw/source/uibase/docvw/edtwin.cxx 
b/sw/source/uibase/docvw/edtwin.cxx
index 8f5a2d3d3e37..1cf591c6605a 100644
--- a/sw/source/uibase/docvw/edtwin.cxx
+++ b/sw/source/uibase/docvw/edtwin.cxx
@@ -2152,7 +2152,7 @@ KEYINPUT_CHECKTABLE_INSDEL:
                     }
                     else if (!rSh.IsCursorInParagraphMetadataField())
                     {
-                        rSh.InfoReadOnlyDialog(false);
+                        rSh.InfoReadOnlyDialog(true);
                         eKeyState = SwKeyState::End;
                     }
                     break;
commit f182015ff73782c8db19ccce421f3d7cb82a2b91
Author:     Maya Stephens <[email protected]>
AuthorDate: Fri Dec 19 15:23:04 2025 +0000
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 10 17:11:36 2026 +0100

    Add size info to icons with ondemand rendering
    
    For icons with on demand rendering, send the image width and height to
    make the placeholder image the correct size.
    
    Change-Id: Ib47e297dca830c153c0c1ac0e130d2c26a6a6964
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/196571
    Tested-by: Jenkins CollaboraOffice <[email protected]>
    Reviewed-by: Michael Stahl <[email protected]>

diff --git a/vcl/source/treelist/iconview.cxx b/vcl/source/treelist/iconview.cxx
index 2eb254eb2fe0..3e65cf847a0b 100644
--- a/vcl/source/treelist/iconview.cxx
+++ b/vcl/source/treelist/iconview.cxx
@@ -327,8 +327,13 @@ void IconView::DumpEntryAndSiblings(tools::JsonWriter& 
rJsonWriter, SvTreeListEn
         if (pIt)
         {
             const SvLBoxContextBmp* pBmpItem = static_cast<const 
SvLBoxContextBmp*>(pIt);
+            Size i = pBmpItem->GetBitmap1().GetSizePixel();
             if (pBmpItem)
+            {
                 rJsonWriter.put("ondemand", true);
+                rJsonWriter.put("width", i.getWidth());
+                rJsonWriter.put("height", i.getHeight());
+            }
         }
 
         if (const OUString tooltip = GetEntryTooltip(pEntry); 
!tooltip.isEmpty())
commit 15eb22a9584d8ac8d3654b06c3466bccaa6c37ba
Author:     Jeff Huang <[email protected]>
AuthorDate: Wed Dec 10 14:19:03 2025 +0800
Commit:     Andras Timar <[email protected]>
CommitDate: Sat Jan 10 17:11:35 2026 +0100

    tdf#169920 Remove hardcoded DFKai-SB fix
    
    Commit 257bb11cbc5b1eb1f90014f528b9e7d6ccfeae86 introduced a compensation
    to glyph position miscalculation for DFKai-SB.
    
    After commit 6f4a949c07eb06345df08c722f8e59e97888a499, this causes over-
    compensation.
    
    This patch reverts commit 257bb11cbc5b1eb1f90014f528b9e7d6ccfeae86
    
    Co-authored-by: Firefly <[email protected]>
    Change-Id: I0027f38d5eae58694c59b7590fc3315aae5deef0
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195347
    Reviewed-by: Mike Kaganski <[email protected]>
    Tested-by: Jenkins
    (cherry picked from commit 005e787efec6c1e352e3cd17231d70508cd18d8e)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/195849
    Tested-by: Xisco Fauli <[email protected]>
    Reviewed-by: Xisco Fauli <[email protected]>

diff --git a/vcl/inc/font/LogicalFontInstance.hxx 
b/vcl/inc/font/LogicalFontInstance.hxx
index 8a199a4c5980..943fd2555558 100644
--- a/vcl/inc/font/LogicalFontInstance.hxx
+++ b/vcl/inc/font/LogicalFontInstance.hxx
@@ -97,9 +97,6 @@ public: // TODO: make data members private
 
     inline hb_font_t* GetHbFont();
     SAL_DLLPRIVATE bool IsGraphiteFont();
-    // NeedOffsetCorrection: Return if the font need offset correction in TTB 
direction.
-    // nYOffset is the original offset. It is used to check if the correction 
is necessary.
-    SAL_DLLPRIVATE bool NeedOffsetCorrection(sal_Int32 nYOffset);
     void SetAverageWidthFactor(double nFactor) { m_nAveWidthFactor = 
std::abs(nFactor); }
     double GetAverageWidthFactor() const { return m_nAveWidthFactor; }
     const vcl::font::FontSelectPattern& GetFontSelectPattern() const { return 
m_aFontSelData; }
@@ -152,15 +149,6 @@ private:
     rtl::Reference<vcl::font::PhysicalFontFace> m_pFontFace;
     std::optional<bool> m_xbIsGraphiteFont;
 
-    enum class FontFamilyEnum
-    {
-        Unclassified,
-        DFKaiSB
-    };
-
-    // The value is initialized and used in NeedOffsetCorrection().
-    std::optional<FontFamilyEnum> m_xeFontFamilyEnum;
-
     mutable hb_draw_funcs_t* m_pHbDrawFuncs = nullptr;
     basegfx::B2DPolygon m_aDrawPolygon;
 };
diff --git a/vcl/source/font/LogicalFontInstance.cxx 
b/vcl/source/font/LogicalFontInstance.cxx
index 971965385164..e79b06bf15d9 100644
--- a/vcl/source/font/LogicalFontInstance.cxx
+++ b/vcl/source/font/LogicalFontInstance.cxx
@@ -243,36 +243,6 @@ bool LogicalFontInstance::IsGraphiteFont()
     return *m_xbIsGraphiteFont;
 }
 
-bool LogicalFontInstance::NeedOffsetCorrection(sal_Int32 nYOffset)
-{
-    if (!m_xeFontFamilyEnum)
-    {
-        m_xeFontFamilyEnum = FontFamilyEnum::Unclassified;
-
-        // DFKai-SB (ukai.ttf) is a built-in font under traditional Chinese
-        // Windows. It has wrong extent values in glyf table. The problem 
results
-        // in wrong positioning of glyphs in vertical writing.
-        // Check https://github.com/harfbuzz/harfbuzz/issues/3521 for 
reference.
-        if (GetFontFace()->GetName(vcl::font::NAME_ID_FONT_FAMILY) == 
"DFKai-SB")
-            m_xeFontFamilyEnum = FontFamilyEnum::DFKaiSB;
-    }
-
-    bool bRet = true;
-
-    switch (*m_xeFontFamilyEnum)
-    {
-        case FontFamilyEnum::DFKaiSB:
-            // -839: optimization for one third of ukai.ttf
-            if (nYOffset == -839)
-                bRet = false;
-            break;
-        default:
-            bRet = false;
-    }
-
-    return bRet;
-}
-
 bool LogicalFontInstance::NeedsArtificialBold() const
 {
     return m_aFontSelData.GetWeight() > WEIGHT_MEDIUM && 
m_pFontFace->GetWeight() <= WEIGHT_MEDIUM;
diff --git a/vcl/source/gdi/CommonSalLayout.cxx 
b/vcl/source/gdi/CommonSalLayout.cxx
index e6ec3a176ce5..4c6f54139e03 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -794,19 +794,6 @@ bool 
GenericSalLayout::LayoutText(vcl::text::ImplLayoutArgs& rArgs, const SalLay
                     nAdvance = -pHbPositions[i].y_advance;
                     nXOffset = -pHbPositions[i].y_offset;
                     nYOffset = -pHbPositions[i].x_offset - nBaseOffset;
-
-                    if 
(GetFont().NeedOffsetCorrection(pHbPositions[i].y_offset))
-                    {
-                        // We need glyph's advance, top bearing, and height to
-                        // correct y offset.
-                        basegfx::B2DRectangle aRect;
-                        // Get cached bound rect value for the font,
-                        GetFont().GetGlyphBoundRect(nGlyphIndex, aRect, true);
-
-                        nXOffset = -(aRect.getMinX() / nXScale  + ( 
pHbPositions[i].y_advance
-                                    + ( aRect.getHeight() / nXScale ) ) / 2.0 
);
-                    }
-
                 }
                 else
                 {

Reply via email to