sc/source/core/tool/compiler.cxx            |   31 ++-----
 svx/source/unodraw/unoshap4.cxx             |   12 ++
 sw/qa/extras/layout/data/tdf157829-ltr.fodt |  123 ++++++++++++++++++++++++++++
 sw/qa/extras/layout/data/tdf157829-rtl.fodt |  122 +++++++++++++++++++++++++++
 sw/qa/extras/layout/layout3.cxx             |   28 ++++++
 sw/source/core/text/pormulti.cxx            |   54 ++++++------
 6 files changed, 326 insertions(+), 44 deletions(-)

New commits:
commit 92eea298224897c47dab903b607b7ae53196f7ee
Author:     Noel Grandin <noel.gran...@collabora.co.uk>
AuthorDate: Mon Jul 22 09:39:49 2024 +0200
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Fri Jul 26 13:04:32 2024 +0200

    cid#1557678 Check of thread-shared field evades lock acquisition
    
    and
    
    cid#1556287 Check of thread-shared field evades lock acquisition
    
    (1) std::mutex can be initialised at load time, since it is a
    single-word object, i.e. no need to use a static function local.
    (2) std::mutex is really fast, so no need to use tricky double-checked
    locking
    
    Change-Id: Ieb2239908204baaaccfe9d1e0e2c8ed369d108fb
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170833
    Tested-by: Jenkins
    Reviewed-by: Noel Grandin <noel.gran...@collabora.co.uk>
    (cherry picked from commit 4b6390290fcfdea882fde93facef00ac33dd8b88)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170957
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sc/source/core/tool/compiler.cxx b/sc/source/core/tool/compiler.cxx
index d26f07f5c664..a4bba4f2e08d 100644
--- a/sc/source/core/tool/compiler.cxx
+++ b/sc/source/core/tool/compiler.cxx
@@ -187,8 +187,11 @@ void ScCompiler::fillFromAddInCollectionEnglishName( const 
NonConstOpCodeMapPtr&
     }
 }
 
+static std::mutex gCharClassMutex;
+
 void ScCompiler::DeInit()
 {
+    std::scoped_lock aGuard(gCharClassMutex);
     if (pCharClassEnglish)
     {
         delete pCharClassEnglish;
@@ -224,38 +227,26 @@ bool ScCompiler::IsEnglishSymbol( const OUString& rName )
     return !aIntName.isEmpty();       // no valid function name
 }
 
-static std::mutex& getCharClassMutex()
-{
-    static std::mutex aMutex;
-    return aMutex;
-}
-
 const CharClass* ScCompiler::GetCharClassEnglish()
 {
+    std::scoped_lock aGuard(gCharClassMutex);
     if (!pCharClassEnglish)
     {
-        std::scoped_lock aGuard(getCharClassMutex());
-        if (!pCharClassEnglish)
-        {
-            pCharClassEnglish = new CharClass( 
::comphelper::getProcessComponentContext(),
-                    LanguageTag( LANGUAGE_ENGLISH_US));
-        }
+        pCharClassEnglish = new CharClass( 
::comphelper::getProcessComponentContext(),
+                LanguageTag( LANGUAGE_ENGLISH_US));
     }
     return pCharClassEnglish;
 }
 
 const CharClass* ScCompiler::GetCharClassLocalized()
 {
+    // Switching UI language requires restart; if not, we would have to
+    // keep track of that.
+    std::scoped_lock aGuard(gCharClassMutex);
     if (!pCharClassLocalized)
     {
-        // Switching UI language requires restart; if not, we would have to
-        // keep track of that.
-        std::scoped_lock aGuard(getCharClassMutex());
-        if (!pCharClassLocalized)
-        {
-            pCharClassLocalized = new CharClass( 
::comphelper::getProcessComponentContext(),
-                    Application::GetSettings().GetUILanguageTag());
-        }
+        pCharClassLocalized = new CharClass( 
::comphelper::getProcessComponentContext(),
+                Application::GetSettings().GetUILanguageTag());
     }
     return pCharClassLocalized;
 }
commit a38e6e65057f0380f07dae724be3b8b33ca3afee
Author:     Jonathan Clark <jonat...@libreoffice.org>
AuthorDate: Thu Jul 18 08:40:16 2024 -0600
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Fri Jul 26 13:04:19 2024 +0200

    tdf#157829 sw: Implemented line break underflow for bidi portions
    
    Previously, bidi portions did not handle underflow in word wrapping.
    This caused bidi portions to break at format changes during wrapping,
    instead of backtracking to a valid break opportunity.
    
    Change-Id: Ib86effe2642a9d133242c28538026d9b4a7e90e9
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/171006
    Tested-by: Jenkins
    Reviewed-by: Jonathan Clark <jonat...@libreoffice.org>
    (cherry picked from commit 04184aa7e3aada8f4d938d20dfdb54b3a7dd3896)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170958
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/sw/qa/extras/layout/data/tdf157829-ltr.fodt 
b/sw/qa/extras/layout/data/tdf157829-ltr.fodt
new file mode 100644
index 000000000000..c65ddea3f588
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf157829-ltr.fodt
@@ -0,0 +1,123 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/"; 
xmlns:grddl="http://www.w3.org/2003/g/data-view#"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:xforms="http://www.w3.org/2002/xforms"; 
xmlns:dom="http://www.w3.org/2001/xml-events"; 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
xmlns:math="http://www.w3.org/1998/Math/MathML"; 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" 
xmlns:ooow="http://openoffice.org/2004/writer"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:drawooo="http://openoffice.org/2010/draw"; 
xmlns:oooc="http://openoffice.org/2004/calc"; 
xmlns:dc="http://purl.org/dc/elements/1.1/"; xmlns:c
 alcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:tableooo="http://openoffice.org/2009/table"; 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:rpt="http://openoffice.org/2005/report"; 
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
 xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:officeooo="http://openoffice.org/2009/office"; 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:
 meta:1.0" 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
 office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta><meta:initial-creator>Lior 
Kaplan</meta:initial-creator><meta:creation-date>2012-10-25T19:53:27</meta:creation-date><dc:date>2024-07-17T09:23:21.008633324</dc:date><meta:editing-duration>PT9M55S</meta:editing-duration><meta:editing-cycles>14</meta:editing-cycles><meta:generator>LibreOfficeDev/25.2.0.0.alpha0$Linux_X86_64
 
LibreOffice_project/aa938fe03cfb968f7f4ed9760dcbe579a74bdc02</meta:generator><meta:document-statistic
 meta:table-count="0" meta:image-count="0" meta:object-count="0" 
meta:page-count="1" meta:paragraph-count="1" meta:word-count="5" 
meta:character-count="37" 
meta:non-whitespace-character-count="33"/></office:meta>
+ <office:font-face-decls>
+  <style:font-face style:name="DejaVu Sans" svg:font-family="'DejaVu Sans'" 
style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="FreeSans" svg:font-family="FreeSans" 
style:font-family-generic="swiss"/>
+  <style:font-face style:name="Liberation Serif" svg:font-family="'Liberation 
Serif'" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Noto Sans Hebrew" svg:font-family="'Noto Sans 
Hebrew'" style:font-family-generic="swiss" style:font-pitch="variable"/>
+  <style:font-face style:name="Noto Sans1" svg:font-family="'Noto Sans'" 
style:font-family-generic="swiss" style:font-pitch="variable"/>
+  </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#808080" 
draw:fill-color="#cfe7f5" fo:wrap-option="no-wrap" 
draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" 
draw:start-line-spacing-horizontal="0.1114in" 
draw:start-line-spacing-vertical="0.1114in" 
draw:end-line-spacing-horizontal="0.1114in" 
draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" 
style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" 
style:line-break="strict" loext:tab-stop-distance="0in" 
style:writing-mode="lr-tb" style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" 
loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" 
fo:language="en" fo:country="US" style:letter-kerning="true" 
style:font-name-asian="DejaVu Sans" style:font-size-asian="10.5pt" 
style:language-asian="zh" style:country-asian="CN" 
style:font-name-complex="FreeSans" style:font-size-complex="12pt" 
style:language-complex="he" style:country-complex="IL"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" 
fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" 
style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" 
style:line-break="strict" style:tab-stop-distance="0.4925in" 
style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" 
loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" 
fo:language="en" fo:country="US" style:letter-kerning="true" 
style:font-name-asian="DejaVu Sans" style:font-size-asian="10.5pt" 
style:language-asian="zh" style:country-asian="CN" 
style:font-name-complex="FreeSans" style:font-size-complex="12pt" 
style:language-complex="he" style:country-complex="IL" fo:hyphenate="false" 
fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" 
loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" 
loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" 
style:class="text"/>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.3in" fo:text-indent="-0.3in" 
fo:margin-left="0.3in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.4in" fo:text-indent="-0.4in" 
fo:margin-left="0.4in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.5in" fo:text-indent="-0.5in" 
fo:margin-left="0.5in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.6in" fo:text-indent="-0.6in" 
fo:margin-left="0.6in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.7in" fo:text-indent="-0.7in" 
fo:margin-left="0.7in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.8in" fo:text-indent="-0.8in" 
fo:margin-left="0.8in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.9in" fo:text-indent="-0.9in" 
fo:margin-left="0.9in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="1in" fo:text-indent="-1in" fo:margin-left="1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="1.1in" fo:text-indent="-1.1in" 
fo:margin-left="1.1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="1.2in" fo:text-indent="-1.2in" 
fo:margin-left="1.2in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" 
text:start-value="0" text:footnotes-position="page" 
text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" 
text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" 
text:offset="0.1965in" style:num-format="1" text:number-position="left" 
text:increment="5"/>
+  </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="P1" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:text-align="start" 
style:justify-single-word="false" style:writing-mode="lr-tb"/>
+   <style:text-properties style:font-name="Noto Sans1" fo:font-size="36pt" 
style:font-size-asian="36pt" style:font-name-complex="Noto Sans1" 
style:font-size-complex="36pt"/>
+  </style:style>
+  <style:style style:name="T1" style:family="text">
+   <style:text-properties fo:color="#c9211e" loext:opacity="100%" 
fo:font-weight="normal" style:font-weight-asian="normal" 
style:font-name-complex="Noto Sans Hebrew" style:font-weight-complex="normal"/>
+  </style:style>
+  <style:style style:name="T2" style:family="text">
+   <style:text-properties style:use-window-font-color="true" 
loext:opacity="0%" fo:font-weight="normal" style:font-weight-asian="normal" 
style:font-name-complex="Noto Sans Hebrew" style:font-weight-complex="normal"/>
+  </style:style>
+  <style:page-layout style:name="pm1" style:page-usage="mirrored">
+   <style:page-layout-properties fo:page-width="8.2681in" 
fo:page-height="11.6929in" style:num-format="1" 
style:print-orientation="portrait" fo:margin-top="0.7874in" 
fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" 
fo:margin-right="0.7874in" style:writing-mode="lr-tb" 
style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" 
style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" 
style:layout-grid-mode="none" style:layout-grid-ruby-below="false" 
style:layout-grid-print="false" style:layout-grid-display="false" 
style:footnote-max-height="0in" loext:margin-gutter="0in">
+    <style:footnote-sep style:width="0.0071in" 
style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" 
style:line-style="solid" style:adjustment="left" style:rel-width="25%" 
style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+  <style:style style:name="dp1" style:family="drawing-page">
+   <style:drawing-page-properties draw:background-size="full"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1" 
draw:style-name="dp1"/>
+ </office:master-styles>
+ <office:body>
+  <office:text>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" 
text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="P1">English English English <text:span 
text:style-name="T1">ע</text:span><text:span 
text:style-name="T2">ב</text:span><text:span 
text:style-name="T1">ר</text:span><text:span 
text:style-name="T2">י</text:span><text:span text:style-name="T1">ת</text:span> 
English</text:p>
+  </office:text>
+ </office:body>
+</office:document>
\ No newline at end of file
diff --git a/sw/qa/extras/layout/data/tdf157829-rtl.fodt 
b/sw/qa/extras/layout/data/tdf157829-rtl.fodt
new file mode 100644
index 000000000000..96ddbbb3ed04
--- /dev/null
+++ b/sw/qa/extras/layout/data/tdf157829-rtl.fodt
@@ -0,0 +1,122 @@
+<?xml version='1.0' encoding='UTF-8'?>
+<office:document xmlns:css3t="http://www.w3.org/TR/css3-text/"; 
xmlns:grddl="http://www.w3.org/2003/g/data-view#"; 
xmlns:xhtml="http://www.w3.org/1999/xhtml"; 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"; 
xmlns:xsd="http://www.w3.org/2001/XMLSchema"; 
xmlns:xforms="http://www.w3.org/2002/xforms"; 
xmlns:dom="http://www.w3.org/2001/xml-events"; 
xmlns:script="urn:oasis:names:tc:opendocument:xmlns:script:1.0" 
xmlns:form="urn:oasis:names:tc:opendocument:xmlns:form:1.0" 
xmlns:math="http://www.w3.org/1998/Math/MathML"; 
xmlns:office="urn:oasis:names:tc:opendocument:xmlns:office:1.0" 
xmlns:ooo="http://openoffice.org/2004/office"; 
xmlns:fo="urn:oasis:names:tc:opendocument:xmlns:xsl-fo-compatible:1.0" 
xmlns:config="urn:oasis:names:tc:opendocument:xmlns:config:1.0" 
xmlns:ooow="http://openoffice.org/2004/writer"; 
xmlns:xlink="http://www.w3.org/1999/xlink"; 
xmlns:drawooo="http://openoffice.org/2010/draw"; 
xmlns:oooc="http://openoffice.org/2004/calc"; 
xmlns:dc="http://purl.org/dc/elements/1.1/"; xmlns:c
 alcext="urn:org:documentfoundation:names:experimental:calc:xmlns:calcext:1.0" 
xmlns:style="urn:oasis:names:tc:opendocument:xmlns:style:1.0" 
xmlns:text="urn:oasis:names:tc:opendocument:xmlns:text:1.0" 
xmlns:of="urn:oasis:names:tc:opendocument:xmlns:of:1.2" 
xmlns:tableooo="http://openoffice.org/2009/table"; 
xmlns:draw="urn:oasis:names:tc:opendocument:xmlns:drawing:1.0" 
xmlns:dr3d="urn:oasis:names:tc:opendocument:xmlns:dr3d:1.0" 
xmlns:rpt="http://openoffice.org/2005/report"; 
xmlns:formx="urn:openoffice:names:experimental:ooxml-odf-interop:xmlns:form:1.0"
 xmlns:svg="urn:oasis:names:tc:opendocument:xmlns:svg-compatible:1.0" 
xmlns:chart="urn:oasis:names:tc:opendocument:xmlns:chart:1.0" 
xmlns:officeooo="http://openoffice.org/2009/office"; 
xmlns:table="urn:oasis:names:tc:opendocument:xmlns:table:1.0" 
xmlns:field="urn:openoffice:names:experimental:ooo-ms-interop:xmlns:field:1.0" 
xmlns:number="urn:oasis:names:tc:opendocument:xmlns:datastyle:1.0" 
xmlns:meta="urn:oasis:names:tc:opendocument:xmlns:
 meta:1.0" 
xmlns:loext="urn:org:documentfoundation:names:experimental:office:xmlns:loext:1.0"
 office:version="1.3" office:mimetype="application/vnd.oasis.opendocument.text">
+ <office:meta><meta:initial-creator>Lior 
Kaplan</meta:initial-creator><meta:creation-date>2012-10-25T19:53:27</meta:creation-date><dc:date>2024-07-17T09:24:55.161291056</dc:date><meta:editing-duration>PT12M2S</meta:editing-duration><meta:editing-cycles>16</meta:editing-cycles><meta:generator>LibreOfficeDev/25.2.0.0.alpha0$Linux_X86_64
 
LibreOffice_project/aa938fe03cfb968f7f4ed9760dcbe579a74bdc02</meta:generator><meta:document-statistic
 meta:table-count="0" meta:image-count="0" meta:object-count="0" 
meta:page-count="1" meta:paragraph-count="1" meta:word-count="6" 
meta:character-count="37" 
meta:non-whitespace-character-count="32"/></office:meta>
+ <office:font-face-decls>
+  <style:font-face style:name="DejaVu Sans" svg:font-family="'DejaVu Sans'" 
style:font-family-generic="system" style:font-pitch="variable"/>
+  <style:font-face style:name="FreeSans" svg:font-family="FreeSans" 
style:font-family-generic="swiss"/>
+  <style:font-face style:name="Liberation Serif" svg:font-family="'Liberation 
Serif'" style:font-family-generic="roman" style:font-pitch="variable"/>
+  <style:font-face style:name="Noto Sans Hebrew" svg:font-family="'Noto Sans 
Hebrew'" style:font-family-generic="swiss" style:font-pitch="variable"/>
+  </office:font-face-decls>
+ <office:styles>
+  <style:default-style style:family="graphic">
+   <style:graphic-properties svg:stroke-color="#808080" 
draw:fill-color="#cfe7f5" fo:wrap-option="no-wrap" 
draw:shadow-offset-x="0.1181in" draw:shadow-offset-y="0.1181in" 
draw:start-line-spacing-horizontal="0.1114in" 
draw:start-line-spacing-vertical="0.1114in" 
draw:end-line-spacing-horizontal="0.1114in" 
draw:end-line-spacing-vertical="0.1114in" style:writing-mode="lr-tb" 
style:flow-with-text="false"/>
+   <style:paragraph-properties style:text-autospace="ideograph-alpha" 
style:line-break="strict" loext:tab-stop-distance="0in" 
style:font-independent-line-spacing="false">
+    <style:tab-stops/>
+   </style:paragraph-properties>
+   <style:text-properties style:use-window-font-color="true" 
loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" 
fo:language="en" fo:country="US" style:letter-kerning="true" 
style:font-name-asian="DejaVu Sans" style:font-size-asian="10.5pt" 
style:language-asian="zh" style:country-asian="CN" 
style:font-name-complex="FreeSans" style:font-size-complex="12pt" 
style:language-complex="he" style:country-complex="IL"/>
+  </style:default-style>
+  <style:default-style style:family="paragraph">
+   <style:paragraph-properties fo:hyphenation-ladder-count="no-limit" 
fo:hyphenation-keep="auto" loext:hyphenation-keep-type="column" 
style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" 
style:line-break="strict" style:tab-stop-distance="0.4925in" 
style:writing-mode="page"/>
+   <style:text-properties style:use-window-font-color="true" 
loext:opacity="0%" style:font-name="Liberation Serif" fo:font-size="12pt" 
fo:language="en" fo:country="US" style:letter-kerning="true" 
style:font-name-asian="DejaVu Sans" style:font-size-asian="10.5pt" 
style:language-asian="zh" style:country-asian="CN" 
style:font-name-complex="FreeSans" style:font-size-complex="12pt" 
style:language-complex="he" style:country-complex="IL" fo:hyphenate="false" 
fo:hyphenation-remain-char-count="2" fo:hyphenation-push-char-count="2" 
loext:hyphenation-no-caps="false" loext:hyphenation-no-last-word="false" 
loext:hyphenation-word-char-count="no-limit" loext:hyphenation-zone="no-limit"/>
+  </style:default-style>
+  <style:default-style style:family="table">
+   <style:table-properties table:border-model="collapsing"/>
+  </style:default-style>
+  <style:default-style style:family="table-row">
+   <style:table-row-properties fo:keep-together="auto"/>
+  </style:default-style>
+  <style:style style:name="Standard" style:family="paragraph" 
style:class="text"/>
+  <text:outline-style style:name="Outline">
+   <text:outline-level-style text:level="1" loext:num-list-format="%1%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.3in" fo:text-indent="-0.3in" 
fo:margin-left="0.3in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="2" loext:num-list-format="%2%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.4in" fo:text-indent="-0.4in" 
fo:margin-left="0.4in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="3" loext:num-list-format="%3%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.5in" fo:text-indent="-0.5in" 
fo:margin-left="0.5in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="4" loext:num-list-format="%4%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.6in" fo:text-indent="-0.6in" 
fo:margin-left="0.6in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="5" loext:num-list-format="%5%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.7in" fo:text-indent="-0.7in" 
fo:margin-left="0.7in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="6" loext:num-list-format="%6%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.8in" fo:text-indent="-0.8in" 
fo:margin-left="0.8in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="7" loext:num-list-format="%7%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="0.9in" fo:text-indent="-0.9in" 
fo:margin-left="0.9in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="8" loext:num-list-format="%8%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="1in" fo:text-indent="-1in" fo:margin-left="1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="9" loext:num-list-format="%9%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="1.1in" fo:text-indent="-1.1in" 
fo:margin-left="1.1in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+   <text:outline-level-style text:level="10" loext:num-list-format="%10%" 
style:num-format="">
+    <style:list-level-properties 
text:list-level-position-and-space-mode="label-alignment">
+     <style:list-level-label-alignment text:label-followed-by="listtab" 
text:list-tab-stop-position="1.2in" fo:text-indent="-1.2in" 
fo:margin-left="1.2in"/>
+    </style:list-level-properties>
+   </text:outline-level-style>
+  </text:outline-style>
+  <text:notes-configuration text:note-class="footnote" style:num-format="1" 
text:start-value="0" text:footnotes-position="page" 
text:start-numbering-at="document"/>
+  <text:notes-configuration text:note-class="endnote" style:num-format="i" 
text:start-value="0"/>
+  <text:linenumbering-configuration text:number-lines="false" 
text:offset="0.1965in" style:num-format="1" text:number-position="left" 
text:increment="5"/>
+  </office:styles>
+ <office:automatic-styles>
+  <style:style style:name="P1" style:family="paragraph" 
style:parent-style-name="Standard">
+   <style:paragraph-properties fo:text-align="end" 
style:justify-single-word="false" style:writing-mode="rl-tb"/>
+   <style:text-properties style:font-name="Noto Sans Hebrew" 
fo:font-size="36pt" style:font-size-asian="36pt" style:font-name-complex="Noto 
Sans Hebrew" style:font-size-complex="36pt"/>
+  </style:style>
+  <style:style style:name="T1" style:family="text">
+   <style:text-properties fo:color="#bf0041" loext:opacity="100%"/>
+  </style:style>
+  <style:style style:name="T2" style:family="text">
+   <style:text-properties style:use-window-font-color="true" 
loext:opacity="0%"/>
+  </style:style>
+  <style:page-layout style:name="pm1" style:page-usage="mirrored">
+   <style:page-layout-properties fo:page-width="8.2681in" 
fo:page-height="11.6929in" style:num-format="1" 
style:print-orientation="portrait" fo:margin-top="0.7874in" 
fo:margin-bottom="0.7874in" fo:margin-left="0.7874in" 
fo:margin-right="0.7874in" style:writing-mode="lr-tb" 
style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" 
style:layout-grid-base-height="0.278in" style:layout-grid-ruby-height="0.139in" 
style:layout-grid-mode="none" style:layout-grid-ruby-below="false" 
style:layout-grid-print="false" style:layout-grid-display="false" 
style:footnote-max-height="0in" loext:margin-gutter="0in">
+    <style:footnote-sep style:width="0.0071in" 
style:distance-before-sep="0.0398in" style:distance-after-sep="0.0398in" 
style:line-style="solid" style:adjustment="left" style:rel-width="25%" 
style:color="#000000"/>
+   </style:page-layout-properties>
+   <style:header-style/>
+   <style:footer-style/>
+  </style:page-layout>
+  <style:style style:name="dp1" style:family="drawing-page">
+   <style:drawing-page-properties draw:background-size="full"/>
+  </style:style>
+ </office:automatic-styles>
+ <office:master-styles>
+  <style:master-page style:name="Standard" style:page-layout-name="pm1" 
draw:style-name="dp1"/>
+ </office:master-styles>
+ <office:body>
+  <office:text>
+   <text:sequence-decls>
+    <text:sequence-decl text:display-outline-level="0" 
text:name="Illustration"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Table"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Text"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Drawing"/>
+    <text:sequence-decl text:display-outline-level="0" text:name="Figure"/>
+   </text:sequence-decls>
+   <text:p text:style-name="P1">עברית עברית עברית עברית <text:span 
text:style-name="T1">E</text:span><text:span 
text:style-name="T2">n</text:span><text:span 
text:style-name="T1">g</text:span><text:span 
text:style-name="T2">l</text:span><text:span 
text:style-name="T1">i</text:span><text:span 
text:style-name="T2">s</text:span><text:span text:style-name="T1">h</text:span> 
עברית</text:p>
+  </office:text>
+ </office:body>
+</office:document>
\ No newline at end of file
diff --git a/sw/qa/extras/layout/layout3.cxx b/sw/qa/extras/layout/layout3.cxx
index 88cf2dd8ddf6..b21e7c938d68 100644
--- a/sw/qa/extras/layout/layout3.cxx
+++ b/sw/qa/extras/layout/layout3.cxx
@@ -3119,6 +3119,34 @@ CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, TestTdf146081)
     CPPUNIT_ASSERT_EQUAL(nTotalHeight, nHeight1 * 4);
 }
 
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, TestTdf157829LTR)
+{
+    // Verify that line breaking inside a bidi portion triggers underflow to 
previous bidi portions
+    createSwDoc("tdf157829-ltr.fodt");
+    auto pXmlDoc = parseLayoutDump();
+
+    assertXPath(pXmlDoc, "//page"_ostr, 1);
+
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout[1]"_ostr, "portion"_ostr,
+                u"English English English "_ustr);
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout[2]"_ostr, "portion"_ostr,
+                u"עברית English"_ustr);
+}
+
+CPPUNIT_TEST_FIXTURE(SwLayoutWriter3, TestTdf157829RTL)
+{
+    // Verify that line breaking inside a bidi portion triggers underflow to 
previous bidi portions
+    createSwDoc("tdf157829-rtl.fodt");
+    auto pXmlDoc = parseLayoutDump();
+
+    assertXPath(pXmlDoc, "//page"_ostr, 1);
+
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout[1]"_ostr, "portion"_ostr,
+                u"עברית עברית עברית עברית "_ustr);
+    assertXPath(pXmlDoc, 
"/root/page/body/txt/SwParaPortion/SwLineLayout[2]"_ostr, "portion"_ostr,
+                u"English עברית"_ustr);
+}
+
 } // end of anonymous namespace
 
 CPPUNIT_PLUGIN_IMPLEMENT();
diff --git a/sw/source/core/text/pormulti.cxx b/sw/source/core/text/pormulti.cxx
index 2a780b8e2f1f..ba570ca48fa9 100644
--- a/sw/source/core/text/pormulti.cxx
+++ b/sw/source/core/text/pormulti.cxx
@@ -1923,7 +1923,7 @@ static bool lcl_ExtractFieldFollow( SwLineLayout* pLine, 
SwLinePortion* &rpField
 // next line, this function is called to truncate
 // the rest of the remaining multi portion
 static void lcl_TruncateMultiPortion(SwMultiPortion& rMulti, SwTextFormatInfo& 
rInf,
-                                     TextFrameIndex const nStartIdx, bool 
bIsBidiPortion)
+                                     TextFrameIndex const nStartIdx)
 {
     rMulti.GetRoot().Truncate();
     rMulti.GetRoot().SetLen(TextFrameIndex(0));
@@ -1939,28 +1939,25 @@ static void lcl_TruncateMultiPortion(SwMultiPortion& 
rMulti, SwTextFormatInfo& r
     rMulti.SetLen(TextFrameIndex(0));
     rInf.SetIdx( nStartIdx );
 
-    if (bIsBidiPortion)
+    if (rMulti.IsBidi())
     {
         // The truncated portion is a bidi portion. Bidi portions contain 
ordinary text, and may
         // potentially underflow in the case that none of the text fits on the 
current line.
-        if (auto* pPrevPor = rInf.GetLast();
-            pPrevPor && pPrevPor->GetWhichPor() == PortionType::Text)
-        {
-            // Check if the start of the bidi portion is a valid break. In 
that case, truncating
-            // the multi portion is sufficient.
-            css::i18n::LineBreakHyphenationOptions aHyphOptions;
-            css::i18n::LineBreakUserOptions aUserOptions;
-            css::lang::Locale aLocale;
-            auto aResult = g_pBreakIt->GetBreakIter()->getLineBreak(
-                rInf.GetText(), sal_Int32(nStartIdx), aLocale, 
sal_Int32(rInf.GetLineStart()),
-                aHyphOptions, aUserOptions);
-
-            if (aResult.breakIndex != sal_Int32{ nStartIdx })
-            {
-                // The start of the bidi portion is not a valid break. 
Instead, a break should be
-                // inserted into a previous text portion on this line.
-                rInf.SetUnderflow(&rMulti);
-            }
+
+        // Check if the start of the bidi portion is a valid break. In that 
case, truncating
+        // the multi portion is sufficient.
+        css::i18n::LineBreakHyphenationOptions aHyphOptions;
+        css::i18n::LineBreakUserOptions aUserOptions;
+        css::lang::Locale aLocale;
+        auto aResult = g_pBreakIt->GetBreakIter()->getLineBreak(
+            rInf.GetText(), sal_Int32(nStartIdx), aLocale, 
sal_Int32(rInf.GetLineStart()),
+            aHyphOptions, aUserOptions);
+
+        if (aResult.breakIndex != sal_Int32{ nStartIdx })
+        {
+            // The start of the bidi portion is not a valid break. Instead, a 
break should be
+            // inserted into a previous text portion on this line.
+            rInf.SetUnderflow(&rMulti);
         }
     }
 }
@@ -2120,6 +2117,15 @@ bool SwTextFormatter::BuildMultiPortion( 
SwTextFormatInfo &rInf,
         aInf.SetNumDone( rInf.IsNumDone() );
         aInf.SetFootnoteDone( rInf.IsFootnoteDone() );
 
+        // tdf#157829: Bidi portions contain text; word wrapping should 
underflow.
+        // By default, the SwTextFormatInfo constructor assumes the current 
index is the start of
+        // a new line. As a result, Writer cut breaks MultiPortions as if they 
were wider than the
+        // entire document. This is incorrect behavior for bidi portions.
+        if (rMulti.IsBidi())
+        {
+            aInf.SetLineStart(rInf.GetLineStart());
+        }
+
         // if there's a bookmark at the start of the MultiPortion, it will be
         // painted with the rotation etc. of the MultiPortion; move it *inside*
         // so it gets positioned correctly; currently there's no other portion
@@ -2373,7 +2379,7 @@ bool SwTextFormatter::BuildMultiPortion( SwTextFormatInfo 
&rInf,
             else
             {
                 // we try to keep our ruby portion together
-                lcl_TruncateMultiPortion(rMulti, rInf, nStartIdx, 
/*bIsBidiPortion=*/false);
+                lcl_TruncateMultiPortion(rMulti, rInf, nStartIdx);
                 pTmp = nullptr;
                 // A follow field portion may still be waiting. If nobody wants
                 // it, we delete it.
@@ -2383,7 +2389,7 @@ bool SwTextFormatter::BuildMultiPortion( SwTextFormatInfo 
&rInf,
         else if( rMulti.HasRotation() )
         {
             // we try to keep our rotated portion together
-            lcl_TruncateMultiPortion(rMulti, rInf, nStartIdx, 
/*bIsBidiPortion=*/false);
+            lcl_TruncateMultiPortion(rMulti, rInf, nStartIdx);
             pTmp = new SwRotatedPortion( nMultiLen + rInf.GetIdx(),
                                          rMulti.GetDirection() );
         }
@@ -2391,9 +2397,9 @@ bool SwTextFormatter::BuildMultiPortion( SwTextFormatInfo 
&rInf,
         // a new SwBidiPortion, this would cause a memory leak
         else if( rMulti.IsBidi() && ! m_pMulti )
         {
-            if (!rMulti.GetLen())
+            if (aInf.IsUnderflow() || !rMulti.GetLen())
             {
-                lcl_TruncateMultiPortion(rMulti, rInf, nStartIdx, 
/*bIsBidiPortion=*/true);
+                lcl_TruncateMultiPortion(rMulti, rInf, nStartIdx);
             }
 
             // If there is a HolePortion at the end of the bidi portion,
commit d875b5acdd50588d0d570890bd7eef6abb208199
Author:     Vladislav Tarakanov <vladislav.taraka...@bk.ru>
AuthorDate: Fri Jul 12 04:22:21 2024 +0400
Commit:     Xisco Fauli <xiscofa...@libreoffice.org>
CommitDate: Fri Jul 26 13:04:13 2024 +0200

    tdf#158510 Launch media from a presentation dir path
    
    Added a check for the existence of a file at a given URL.
    If the specified file could not be found, the path formed from the
    directory containing the presentation file and the file name is used.
    
    Change-Id: Ia4124f4fa5e5cef19c81f325676749a2540e486a
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/164023
    Tested-by: Jenkins
    Reviewed-by: Mike Kaganski <mike.kagan...@collabora.com>
    (cherry picked from commit fe897b36aef28dfe175461c43614e22588fcfd84)
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/170473
    Reviewed-by: Xisco Fauli <xiscofa...@libreoffice.org>

diff --git a/svx/source/unodraw/unoshap4.cxx b/svx/source/unodraw/unoshap4.cxx
index 58ad9a6b2db0..712c43560803 100644
--- a/svx/source/unodraw/unoshap4.cxx
+++ b/svx/source/unodraw/unoshap4.cxx
@@ -30,6 +30,7 @@
 #include <svx/svdomedia.hxx>
 #include <svx/svdpool.hxx>
 #include <comphelper/classids.hxx>
+#include <comphelper/DirectoryHelper.hxx>
 #include <comphelper/embeddedobjectcontainer.hxx>
 #include <comphelper/propertysequence.hxx>
 #include <comphelper/propertyvalue.hxx>
@@ -822,6 +823,17 @@ bool SvxMediaShape::setPropertyValueImpl( const OUString& 
rName, const SfxItemPr
             if( rValue >>= aURL )
             {
                 bOk = true;
+                if ( aURL.startsWith("file:///") && 
!comphelper::DirectoryHelper::fileExists(aURL) )
+                {
+                    comphelper::IEmbeddedHelper* pPersist = 
GetSdrObject()->getSdrModelFromSdrObject().GetPersist();
+                    auto fileDirectoryEndIdx = 
pPersist->getDocumentBaseURL().lastIndexOf("/");
+                    auto fileNameStartIdx = aURL.lastIndexOf("/");
+                    if (fileDirectoryEndIdx != -1 && fileNameStartIdx != -1)
+                    {
+                        aURL = 
OUString::Concat(pPersist->getDocumentBaseURL().subView(0, fileDirectoryEndIdx 
+ 1))
+                            + aURL.subView(fileNameStartIdx + 1);
+                    }
+                }
                 aItem.setURL( aURL, u""_ustr, referer_ );
             }
         }

Reply via email to