editeng/source/editeng/impedit3.cxx | 5 include/vcl/glyphitemcache.hxx | 5 include/vcl/metaact.hxx | 15 include/vcl/outdev.hxx | 27 include/vcl/pdfwriter.hxx | 8 include/vcl/rendercontext/SalLayoutFlags.hxx | 3 include/vcl/vcllayout.hxx | 2 sw/source/core/text/guess.cxx | 21 sw/source/core/text/itradj.cxx | 39 - sw/source/core/txtnode/fntcache.cxx | 4 vcl/CppunitTest_vcl_text.mk | 1 vcl/Library_vcl.mk | 4 vcl/inc/ImplLayoutArgs.hxx | 13 vcl/inc/impglyphitem.hxx | 7 vcl/inc/justificationdata.hxx | 125 +++ vcl/inc/pdf/pdfwriter_impl.hxx | 4 vcl/inc/sallayout.hxx | 17 vcl/qa/cppunit/justificationdata.cxx | 113 +++ vcl/qa/cppunit/pdfexport/data/tdf124116-hebrew-track-untrack.odt |binary vcl/qa/cppunit/pdfexport/data/tdf134226-shadda-in-hidden-span.fodt | 328 ++++++++++ vcl/qa/cppunit/pdfexport/data/tdf71956-styled-diacritics.fodt | 320 +++++++++ vcl/qa/cppunit/pdfexport/pdfexport2.cxx | 179 +++++ vcl/qa/cppunit/svm/data/textarraycontext.svm |binary vcl/qa/cppunit/svm/svmtest.cxx | 31 vcl/source/filter/svm/SvmReader.cxx | 28 vcl/source/filter/svm/SvmWriter.cxx | 11 vcl/source/gdi/CommonSalLayout.cxx | 212 +++++- vcl/source/gdi/gdimtf.cxx | 6 vcl/source/gdi/impglyphitem.cxx | 28 vcl/source/gdi/metaact.cxx | 44 + vcl/source/gdi/mtfxmldump.cxx | 8 vcl/source/gdi/pdfwriter.cxx | 16 vcl/source/gdi/pdfwriter_impl.cxx | 27 vcl/source/gdi/pdfwriter_impl2.cxx | 5 vcl/source/gdi/sallayout.cxx | 46 - vcl/source/outdev/font.cxx | 45 - vcl/source/outdev/text.cxx | 164 +++-- vcl/source/outdev/transparent.cxx | 23 vcl/source/text/ImplLayoutArgs.cxx | 22 39 files changed, 1761 insertions(+), 195 deletions(-)
New commits: commit ab0a4543cab77ae0c7c0a79feb8aebab71163dd7 Author: Jonathan Clark <jonat...@libreoffice.org> AuthorDate: Tue May 7 02:43:00 2024 -0600 Commit: Jonathan Clark <jonat...@libreoffice.org> CommitDate: Wed May 22 19:20:38 2024 +0200 tdf#124116 Correct Writer text shaping across formatting changes Previously, Writer performed shaping for each span of text separately. In certain situations, this caused incorrect glyph use, or incorrect glyph positioning. This change updates Writer so it will also consider neighboring text while performing shaping. This change resolves the outstanding duplicates filed against tdf#61444. As a side effect, this change also fixes tdf#134226. In addition to the shaping fix, this change implements rendering for individually-styled glyphs, which is required to fix tdf#71956. However, this change does not implement diacritic selection, which is also required for that issue. Change-Id: Iab4774ffaab5ad6113778c54d02cb260a70c1010 Reviewed-on: https://gerrit.libreoffice.org/c/core/+/167699 Reviewed-by: Jonathan Clark <jonat...@libreoffice.org> Tested-by: Jenkins diff --git a/editeng/source/editeng/impedit3.cxx b/editeng/source/editeng/impedit3.cxx index ffd47d95f56a..b28532ae46d0 100644 --- a/editeng/source/editeng/impedit3.cxx +++ b/editeng/source/editeng/impedit3.cxx @@ -2596,11 +2596,12 @@ void ImpEditEngine::ImpFindKashidas( ContentNode* pNode, sal_Int32 nStart, sal_I } // Validate - std::vector<sal_Int32> aDropped(aKashidaArray.size()); + std::vector<sal_Int32> aDropped; auto nOldLayout = GetRefDevice()->GetLayoutMode(); GetRefDevice()->SetLayoutMode(nOldLayout | vcl::text::ComplexTextLayoutFlags::BiDiRtl); GetRefDevice()->ValidateKashidas(pNode->GetString(), nStart, nEnd - nStart, - aKashidaArray.size(), aKashidaArray.data(), aDropped.data()); + /*nPartIdx=*/nStart, /*nPartLen=*/nEnd - nStart, aKashidaArray, + &aDropped); GetRefDevice()->SetLayoutMode(nOldLayout); for (auto const& pos : aKashidaArray) diff --git a/include/vcl/glyphitemcache.hxx b/include/vcl/glyphitemcache.hxx index ffe9bb7eb0c4..79f05e606550 100644 --- a/include/vcl/glyphitemcache.hxx +++ b/include/vcl/glyphitemcache.hxx @@ -53,6 +53,11 @@ public: const OUString& text, sal_Int32 nIndex, sal_Int32 nLen, tools::Long nLogicWidth = 0, const vcl::text::TextLayoutCache* layoutCache = nullptr); + const SalLayoutGlyphs* GetLayoutGlyphs(const VclPtr<const OutputDevice>& outputDevice, + const OUString& text, sal_Int32 nIndex, sal_Int32 nLen, + sal_Int32 nDrawMinCharPos, sal_Int32 nDrawEndCharPos, + tools::Long nLogicWidth = 0, + const vcl::text::TextLayoutCache* layoutCache = nullptr); void clear(); /// Normally, we cannot cache glyphs when doing font fallback, because the font fallbacks diff --git a/include/vcl/metaact.hxx b/include/vcl/metaact.hxx index 71869689dc55..79a91a629783 100644 --- a/include/vcl/metaact.hxx +++ b/include/vcl/metaact.hxx @@ -510,6 +510,8 @@ private: std::vector<sal_Bool> maKashidaAry; sal_Int32 mnIndex; sal_Int32 mnLen; + sal_Int32 mnLayoutContextIndex = -1; + sal_Int32 mnLayoutContextLen = -1; SAL_DLLPRIVATE virtual ~MetaTextArrayAction() override; @@ -526,6 +528,9 @@ public: std::span<const sal_Bool> pKashidaAry, sal_Int32 nIndex, sal_Int32 nLen ); + MetaTextArrayAction(const Point& rStartPt, OUString aStr, KernArraySpan pDXAry, + std::span<const sal_Bool> pKashidaAry, sal_Int32 nIndex, sal_Int32 nLen, + sal_Int32 nLayoutContextIndex, sal_Int32 nLayoutContextLen); SAL_DLLPRIVATE virtual void Execute( OutputDevice* pOut ) override; @@ -538,12 +543,22 @@ public: const OUString& GetText() const { return maStr; } sal_Int32 GetIndex() const { return mnIndex; } sal_Int32 GetLen() const { return mnLen; } + sal_Int32 GetLayoutContextIndex() const { return mnLayoutContextIndex; } + sal_Int32 GetLayoutContextLen() const { return mnLayoutContextLen; } const KernArray& GetDXArray() const { return maDXAry; } const std::vector<sal_Bool> & GetKashidaArray() const { return maKashidaAry; } void SetPoint(const Point& rPt) { maStartPt = rPt; } void SetText(const OUString& rStr) { maStr = rStr; } void SetIndex(sal_Int32 rIndex) { mnIndex = rIndex; } void SetLen(sal_Int32 rLen) { mnLen = rLen; } + void SetLayoutContextIndex(sal_Int32 nLayoutContextIndex) + { + mnLayoutContextIndex = nLayoutContextIndex; + } + void SetLayoutContextLen(sal_Int32 nLayoutContextLen) + { + mnLayoutContextLen = nLayoutContextLen; + } SAL_DLLPRIVATE void SetDXArray(KernArray aArray); SAL_DLLPRIVATE void SetKashidaArray(std::vector<sal_Bool> aArray); }; diff --git a/include/vcl/outdev.hxx b/include/vcl/outdev.hxx index 6dbb9acf7f32..347d5bb82226 100644 --- a/include/vcl/outdev.hxx +++ b/include/vcl/outdev.hxx @@ -1160,11 +1160,12 @@ public: // i60594 // validate kashida positions against the current font // returns count of invalid kashida positions - sal_Int32 ValidateKashidas( const OUString& rTxt, sal_Int32 nIdx, sal_Int32 nLen, - sal_Int32 nKashCount, // number of suggested kashida positions (in) - const sal_Int32* pKashidaPos, // suggested kashida positions (in) - sal_Int32* pKashidaPosDropped // invalid kashida positions (out) - ) const; + sal_Int32 + ValidateKashidas(const OUString& rTxt, sal_Int32 nIdx, sal_Int32 nLen, sal_Int32 nPartIdx, + sal_Int32 nPartLen, + std::span<const sal_Int32> pKashidaPos, // suggested kashida positions (in) + std::vector<sal_Int32>* pKashidaPosDropped // invalid kashida positions (out) + ) const; static void BeginFontSubstitution(); static void EndFontSubstitution(); @@ -1235,14 +1236,14 @@ public: SAL_DLLPRIVATE void ReMirror( vcl::Region &rRegion ) const; SAL_DLLPRIVATE bool ImplIsRecordLayout() const; virtual bool HasMirroredGraphics() const; - std::unique_ptr<SalLayout> - ImplLayout( const OUString&, sal_Int32 nIndex, sal_Int32 nLen, - const Point& rLogicPos = Point(0,0), tools::Long nLogicWidth=0, - KernArraySpan aKernArray = KernArraySpan(), - std::span<const sal_Bool> pKashidaArray={}, - SalLayoutFlags flags = SalLayoutFlags::NONE, - vcl::text::TextLayoutCache const* = nullptr, - const SalLayoutGlyphs* pGlyphs = nullptr) const; + std::unique_ptr<SalLayout> ImplLayout( + const OUString&, sal_Int32 nIndex, sal_Int32 nLen, const Point& rLogicPos = Point(0, 0), + tools::Long nLogicWidth = 0, KernArraySpan aKernArray = KernArraySpan(), + std::span<const sal_Bool> pKashidaArray = {}, SalLayoutFlags flags = SalLayoutFlags::NONE, + vcl::text::TextLayoutCache const* = nullptr, const SalLayoutGlyphs* pGlyphs = nullptr, + std::optional<sal_Int32> nDrawOriginCluster = std::nullopt, + std::optional<sal_Int32> nDrawMinCharPos = std::nullopt, + std::optional<sal_Int32> nDrawEndCharPos = std::nullopt) const; SAL_DLLPRIVATE vcl::text::ImplLayoutArgs ImplPrepareLayoutArgs( OUString&, const sal_Int32 nIndex, const sal_Int32 nLen, double nPixelWidth, diff --git a/include/vcl/pdfwriter.hxx b/include/vcl/pdfwriter.hxx index f4599154e465..34d44525b4d4 100644 --- a/include/vcl/pdfwriter.hxx +++ b/include/vcl/pdfwriter.hxx @@ -790,11 +790,9 @@ The following structure describes the permissions used in PDF security FontStrikeout eStrikeout, FontLineStyle eUnderline, FontLineStyle eOverline ); - void DrawTextArray( const Point& rStartPt, const OUString& rStr, - KernArraySpan aKernArray, - std::span<const sal_Bool> pKashidaAry, - sal_Int32 nIndex, - sal_Int32 nLen ); + void DrawTextArray(const Point& rStartPt, const OUString& rStr, KernArraySpan aKernArray, + std::span<const sal_Bool> pKashidaAry, sal_Int32 nIndex, sal_Int32 nLen, + sal_Int32 nLayoutContextIndex, sal_Int32 nLayoutContextLen); void DrawStretchText( const Point& rStartPt, sal_Int32 nWidth, const OUString& rStr, sal_Int32 nIndex, sal_Int32 nLen ); diff --git a/include/vcl/rendercontext/SalLayoutFlags.hxx b/include/vcl/rendercontext/SalLayoutFlags.hxx index 576a4abd8fbd..3424fa2a1de4 100644 --- a/include/vcl/rendercontext/SalLayoutFlags.hxx +++ b/include/vcl/rendercontext/SalLayoutFlags.hxx @@ -33,10 +33,11 @@ enum class SalLayoutFlags DisableLigatures = 0x0200, ForFallback = 0x2000, GlyphItemsOnly = 0x4000, + UnclusteredGlyphs = 0x8000, }; namespace o3tl { -template <> struct typed_flags<SalLayoutFlags> : is_typed_flags<SalLayoutFlags, 0x6277> +template <> struct typed_flags<SalLayoutFlags> : is_typed_flags<SalLayoutFlags, 0xE277> { }; } diff --git a/include/vcl/vcllayout.hxx b/include/vcl/vcllayout.hxx index 9370c69ded2e..58ca11b876ef 100644 --- a/include/vcl/vcllayout.hxx +++ b/include/vcl/vcllayout.hxx @@ -137,6 +137,8 @@ private: protected: int mnMinCharPos; int mnEndCharPos; + int mnDrawMinCharPos = std::numeric_limits<int>::min(); + int mnDrawEndCharPos = std::numeric_limits<int>::max(); LanguageTag maLanguageTag; Degree10 mnOrientation; diff --git a/sw/source/core/text/guess.cxx b/sw/source/core/text/guess.cxx index af41e0971090..789cae852921 100644 --- a/sw/source/core/text/guess.cxx +++ b/sw/source/core/text/guess.cxx @@ -248,7 +248,7 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, ( bUnbreakableNumberings && rPor.IsNumberPortion() ) ) { // call GetTextSize with maximum compression (for kanas) - rInf.GetTextSize(&rSI, rInf.GetIdx(), nMaxLen, rPor.GetLayoutContext(), nMaxComp, + rInf.GetTextSize(&rSI, rInf.GetIdx(), nMaxLen, rInf.GetLayoutContext(), nMaxComp, m_nBreakWidth, nMaxSizeDiff); if ( ( m_nBreakWidth <= nLineWidth ) || ( bUnbreakableNumberings && rPor.IsNumberPortion() ) ) @@ -259,7 +259,7 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, || maybeAdjustPositionsForBlockAdjust(m_nCutPos, m_nBreakPos, m_nBreakStart, m_nBreakWidth, m_nExtraBlankWidth, nMaxSizeDiff, rInf, rSI, nMaxComp, - rPor.GetLayoutContext()); + rInf.GetLayoutContext()); if( nItalic && (m_nCutPos >= TextFrameIndex(rInf.GetText().getLength()) || // #i48035# Needed for CalcFitToContent @@ -421,8 +421,8 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, if ( TextFrameIndex(COMPLETE_STRING) != m_nCutPos ) { sal_uInt16 nMinSize; - rInf.GetTextSize(&rSI, rInf.GetIdx(), m_nCutPos - rInf.GetIdx(), - rPor.GetLayoutContext(), nMaxComp, nMinSize, nMaxSizeDiff); + rInf.GetTextSize(&rSI, rInf.GetIdx(), m_nCutPos - rInf.GetIdx(), std::nullopt, nMaxComp, + nMinSize, nMaxSizeDiff); OSL_ENSURE( nMinSize <= nLineWidth, "What a Guess!!!" ); } #endif @@ -432,7 +432,7 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, { // second check if everything fits to line m_nCutPos = m_nBreakPos = rInf.GetIdx() + nMaxLen - TextFrameIndex(1); - rInf.GetTextSize(&rSI, rInf.GetIdx(), nMaxLen, rPor.GetLayoutContext(), nMaxComp, + rInf.GetTextSize(&rSI, rInf.GetIdx(), nMaxLen, rInf.GetLayoutContext(), nMaxComp, m_nBreakWidth, nMaxSizeDiff); // The following comparison should always give true, otherwise @@ -443,7 +443,7 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, || maybeAdjustPositionsForBlockAdjust(m_nCutPos, m_nBreakPos, m_nBreakStart, m_nBreakWidth, m_nExtraBlankWidth, nMaxSizeDiff, rInf, rSI, nMaxComp, - rPor.GetLayoutContext()); + rInf.GetLayoutContext()); if (nItalic && (m_nBreakPos + TextFrameIndex(1)) >= TextFrameIndex(rInf.GetText().getLength())) m_nBreakWidth += nItalic; @@ -734,8 +734,8 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, if( nPorLen ) { - rInf.GetTextSize(&rSI, rInf.GetIdx(), nPorLen, rPor.GetLayoutContext(), nMaxComp, - m_nBreakWidth, nMaxSizeDiff, rInf.GetCachedVclData().get()); + rInf.GetTextSize(&rSI, rInf.GetIdx(), nPorLen, std::nullopt, nMaxComp, m_nBreakWidth, + nMaxSizeDiff, rInf.GetCachedVclData().get()); // save maximum width for later use if ( nMaxSizeDiff ) @@ -749,9 +749,8 @@ bool SwTextGuess::Guess( const SwTextPortion& rPor, SwTextFormatInfo &rInf, if (m_nBreakStart > rInf.GetIdx() + nPorLen + m_nFieldDiff) { rInf.GetTextSize(&rSI, rInf.GetIdx() + nPorLen, - m_nBreakStart - rInf.GetIdx() - nPorLen - m_nFieldDiff, - rPor.GetLayoutContext(), nMaxComp, m_nExtraBlankWidth, nMaxSizeDiff, - rInf.GetCachedVclData().get()); + m_nBreakStart - rInf.GetIdx() - nPorLen - m_nFieldDiff, std::nullopt, + nMaxComp, m_nExtraBlankWidth, nMaxSizeDiff, rInf.GetCachedVclData().get()); } if( m_pHanging ) diff --git a/sw/source/core/text/itradj.cxx b/sw/source/core/text/itradj.cxx index 4dcaf03df1f8..c5e24b0913f5 100644 --- a/sw/source/core/text/itradj.cxx +++ b/sw/source/core/text/itradj.cxx @@ -129,10 +129,18 @@ static bool lcl_CheckKashidaPositions( SwScriptInfo& rSI, SwTextSizeInfo& rInf, // kashida positions found in SwScriptInfo are not necessarily valid in every font // if two characters are replaced by a ligature glyph, there will be no place for a kashida - std::vector<TextFrameIndex> aKashidaPos; - rSI.GetKashidaPositions(nIdx, rItr.GetLength(), aKashidaPos); - assert(aKashidaPos.size() >= o3tl::make_unsigned(rKashidas)); - std::vector<TextFrameIndex> aKashidaPosDropped(aKashidaPos.size()); + std::vector<TextFrameIndex> aUncastKashidaPos; + rSI.GetKashidaPositions(nIdx, rItr.GetLength(), aUncastKashidaPos); + assert(aUncastKashidaPos.size() >= o3tl::make_unsigned(rKashidas)); + + std::vector<sal_Int32> aKashidaPos; + std::transform(std::cbegin(aUncastKashidaPos), std::cend(aUncastKashidaPos), + std::back_inserter(aKashidaPos), + [](TextFrameIndex nPos) { return static_cast<sal_Int32>(nPos); }); + + std::vector<sal_Int32> aKashidaPosDropped; + std::vector<TextFrameIndex> aCastKashidaPosDropped; + sal_Int32 nKashidaIdx = 0; while ( rKashidas && nIdx < nEnd ) { @@ -147,6 +155,14 @@ static bool lcl_CheckKashidaPositions( SwScriptInfo& rSI, SwTextSizeInfo& rInf, if (nNext == TextFrameIndex(COMPLETE_STRING) || nNext > nEnd) nNext = nEnd; + + // Use an expanded context to validate kashida insertions between spans + TextFrameIndex nWholeNext = nNextScript; + if (nWholeNext == TextFrameIndex(COMPLETE_STRING) || nWholeNext > nEnd) + { + nWholeNext = nEnd; + } + sal_Int32 nKashidasInAttr = rSI.KashidaJustify(nullptr, nullptr, nIdx, nNext - nIdx); if (nKashidasInAttr > 0) { @@ -167,14 +183,19 @@ static bool lcl_CheckKashidaPositions( SwScriptInfo& rSI, SwTextSizeInfo& rInf, vcl::text::ComplexTextLayoutFlags nOldLayout = rInf.GetOut()->GetLayoutMode(); rInf.GetOut()->SetLayoutMode ( nOldLayout | vcl::text::ComplexTextLayoutFlags::BiDiRtl ); nKashidasDropped = rInf.GetOut()->ValidateKashidas( - rInf.GetText(), sal_Int32(nIdx), sal_Int32(nNext - nIdx), - nKashidasInAttr, - reinterpret_cast<sal_Int32*>(aKashidaPos.data() + nKashidaIdx), - reinterpret_cast<sal_Int32*>(aKashidaPosDropped.data())); + rInf.GetText(), /*nIdx=*/sal_Int32{ nIdx }, + /*nLen=*/sal_Int32{ nWholeNext - nIdx }, + /*nPartIdx=*/sal_Int32{ nIdx }, /*nPartLen=*/sal_Int32{ nNext - nIdx }, + std::span(aKashidaPos).subspan(nKashidaIdx, nKashidasInAttr), + &aKashidaPosDropped); rInf.GetOut()->SetLayoutMode ( nOldLayout ); if ( nKashidasDropped ) { - rSI.MarkKashidasInvalid(nKashidasDropped, aKashidaPosDropped.data()); + aCastKashidaPosDropped.clear(); + std::transform(std::cbegin(aKashidaPosDropped), std::cend(aKashidaPosDropped), + std::back_inserter(aCastKashidaPosDropped), + [](sal_Int32 nPos) { return TextFrameIndex{ nPos }; }); + rSI.MarkKashidasInvalid(nKashidasDropped, aCastKashidaPosDropped.data()); rKashidas -= nKashidasDropped; nGluePortion -= TextFrameIndex(nKashidasDropped); } diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx index b91f73756c58..fd42378b1bdc 100644 --- a/sw/source/core/txtnode/fntcache.cxx +++ b/sw/source/core/txtnode/fntcache.cxx @@ -751,12 +751,12 @@ static void GetTextArray(const OutputDevice& rDevice, const OUString& rStr, Kern if (nLayoutContext.has_value()) { auto nStrEnd = nIndex + nLen; - auto nContextBegin = std::clamp(nLayoutContext->m_nBegin, sal_Int32{0}, nIndex); + auto nContextBegin = std::clamp(nLayoutContext->m_nBegin, sal_Int32{ 0 }, nIndex); auto nContextEnd = std::clamp(nLayoutContext->m_nEnd, nStrEnd, rStr.getLength()); auto nContextLen = nContextEnd - nContextBegin; const SalLayoutGlyphs* pLayoutCache = SalLayoutGlyphsCache::self()->GetLayoutGlyphs( - &rDevice, rStr, nContextBegin, nContextLen, 0, layoutCache); + &rDevice, rStr, nContextBegin, nContextLen, nIndex, nIndex + nLen, 0, layoutCache); rDevice.GetPartialTextArray(rStr, &rDXAry, nContextBegin, nContextLen, nIndex, nLen, bCaret, layoutCache, pLayoutCache); } diff --git a/vcl/CppunitTest_vcl_text.mk b/vcl/CppunitTest_vcl_text.mk index 4ffa3b1990ca..d829c3fc24b5 100644 --- a/vcl/CppunitTest_vcl_text.mk +++ b/vcl/CppunitTest_vcl_text.mk @@ -17,6 +17,7 @@ $(eval $(call gb_CppunitTest_set_include,vcl_text,\ $(eval $(call gb_CppunitTest_add_exception_objects,vcl_text, \ vcl/qa/cppunit/canvasbitmaptest \ vcl/qa/cppunit/complextext \ + vcl/qa/cppunit/justificationdata \ vcl/qa/cppunit/text \ )) diff --git a/vcl/Library_vcl.mk b/vcl/Library_vcl.mk index c832e712e22f..a92d6281e0b0 100644 --- a/vcl/Library_vcl.mk +++ b/vcl/Library_vcl.mk @@ -242,6 +242,8 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/outdev/nativecontrols \ vcl/source/outdev/map \ vcl/source/text/ImplLayoutArgs \ + vcl/source/text/ImplLayoutRuns \ + vcl/source/text/mnemonic \ vcl/source/text/TextLayoutCache \ vcl/source/text/textlayout \ vcl/source/treelist/headbar \ @@ -261,8 +263,6 @@ $(eval $(call gb_Library_add_exception_objects,vcl,\ vcl/source/treelist/svimpbox \ vcl/source/treelist/svlbitm \ vcl/source/treelist/uiobject \ - vcl/source/text/ImplLayoutRuns \ - vcl/source/text/mnemonic \ vcl/source/gdi/formpdfexport \ vcl/source/gdi/configsettings \ vcl/source/gdi/cvtgrf \ diff --git a/vcl/inc/ImplLayoutArgs.hxx b/vcl/inc/ImplLayoutArgs.hxx index faf170ca72b3..804fe28c3c3f 100644 --- a/vcl/inc/ImplLayoutArgs.hxx +++ b/vcl/inc/ImplLayoutArgs.hxx @@ -22,6 +22,9 @@ #include "impglyphitem.hxx" #include "ImplLayoutRuns.hxx" +#include "justificationdata.hxx" + +#include <span> namespace vcl::text { @@ -34,13 +37,15 @@ public: const OUString& mrStr; int mnMinCharPos; int mnEndCharPos; + int mnDrawOriginCluster = std::numeric_limits<int>::min(); + int mnDrawMinCharPos = std::numeric_limits<int>::min(); + int mnDrawEndCharPos = std::numeric_limits<int>::max(); // performance hack vcl::text::TextLayoutCache const* m_pTextLayoutCache; // positioning related inputs - const double* mpDXArray; // in floating point pixel units - const sal_Bool* mpKashidaArray; + JustificationData mstJustification; double mnLayoutWidth; // in pixel units Degree10 mnOrientation; // in 0-3600 system @@ -52,15 +57,13 @@ public: LanguageTag aLanguageTag, vcl::text::TextLayoutCache const* pLayoutCache); void SetLayoutWidth(double nWidth); - void SetDXArray(const double* pDXArray); - void SetKashidaArray(const sal_Bool* pKashidaArray); + void SetJustificationData(JustificationData stJustification); void SetOrientation(Degree10 nOrientation); void ResetPos(); bool GetNextPos(int* nCharPos, bool* bRTL); bool GetNextRun(int* nMinRunPos, int* nEndRunPos, bool* bRTL); void AddFallbackRun(int nMinRunPos, int nEndRunPos, bool bRTL); - bool HasDXArray() const { return mpDXArray; } // methods used by BiDi and glyph fallback bool HasFallbackRun() const; diff --git a/vcl/inc/impglyphitem.hxx b/vcl/inc/impglyphitem.hxx index bb08031f3ab6..320adc27f667 100644 --- a/vcl/inc/impglyphitem.hxx +++ b/vcl/inc/impglyphitem.hxx @@ -53,7 +53,8 @@ class VCL_DLLPUBLIC GlyphItem { basegfx::B2DPoint m_aLinearPos; // absolute position of non rotated string double m_nOrigWidth; // original glyph width - sal_Int32 m_nCharPos; // index in string + sal_Int32 m_nCharPos; // index in string (by grapheme cluster) + sal_Int32 m_nOrigCharPos; // original index in string, if available double m_nXOffset; double m_nYOffset; double m_nNewWidth; // width after adjustments @@ -64,10 +65,11 @@ class VCL_DLLPUBLIC GlyphItem public: GlyphItem(int nCharPos, int nCharCount, sal_GlyphId aGlyphId, const basegfx::B2DPoint& rLinearPos, GlyphItemFlags nFlags, double nOrigWidth, - double nXOffset, double nYOffset) + double nXOffset, double nYOffset, int nOrigCharPos) : m_aLinearPos(rLinearPos) , m_nOrigWidth(nOrigWidth) , m_nCharPos(nCharPos) + , m_nOrigCharPos(nOrigCharPos) , m_nXOffset(nXOffset) , m_nYOffset(nYOffset) , m_nNewWidth(nOrigWidth) @@ -97,6 +99,7 @@ public: int charCount() const { return m_nCharCount; } double origWidth() const { return m_nOrigWidth; } int charPos() const { return m_nCharPos; } + int origCharPos() const { return m_nOrigCharPos; } double xOffset() const { return m_nXOffset; } double yOffset() const { return m_nYOffset; } double newWidth() const { return m_nNewWidth; } diff --git a/vcl/inc/justificationdata.hxx b/vcl/inc/justificationdata.hxx new file mode 100644 index 000000000000..b8fff6149851 --- /dev/null +++ b/vcl/inc/justificationdata.hxx @@ -0,0 +1,125 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ +#pragma once + +#include <sal/types.h> +#include <o3tl/typed_flags_set.hxx> + +#include <optional> +#include <vector> + +enum class ClusterJustificationFlags +{ + NONE = 0x0000, + KashidaPosition = 0x0001, +}; + +namespace o3tl +{ +template <> +struct typed_flags<ClusterJustificationFlags> : is_typed_flags<ClusterJustificationFlags, 0x0001> +{ +}; +} + +class ClusterJustification +{ +public: + double m_nTotalAdvance = 0.0; + ClusterJustificationFlags m_nFlags = ClusterJustificationFlags::NONE; +}; + +class JustificationData +{ +private: + std::vector<ClusterJustification> m_aClusters; + sal_Int32 m_nBaseIndex = 0; + sal_Int32 m_nEndIndex = 0; + bool m_bContainsAdvances = false; + bool m_bContainsKashidaPositions = false; + + [[nodiscard]] inline std::optional<size_t> GetIndex(sal_Int32 nClusterId) const + { + auto nIndex = nClusterId - m_nBaseIndex; + if (nIndex >= 0 && nIndex < static_cast<sal_Int32>(m_aClusters.size())) + { + return static_cast<size_t>(nIndex); + } + + return std::nullopt; + } + +public: + JustificationData() = default; + JustificationData(sal_Int32 nBaseIndex, sal_Int32 nSize) + : m_nBaseIndex(nBaseIndex) + , m_nEndIndex(nBaseIndex + nSize) + { + m_aClusters.resize(nSize); + } + + [[nodiscard]] bool empty() const { return m_aClusters.empty(); } + + [[nodiscard]] bool ContainsAdvances() const { return m_bContainsAdvances; } + [[nodiscard]] bool ContainsKashidaPositions() const { return m_bContainsKashidaPositions; } + + [[nodiscard]] double GetTotalAdvance(sal_Int32 nClusterId) const + { + if (nClusterId < m_nBaseIndex || m_aClusters.empty()) + { + return 0.0; + } + + if (nClusterId < m_nEndIndex) + { + return m_aClusters.at(nClusterId - m_nBaseIndex).m_nTotalAdvance; + } + + return m_aClusters.back().m_nTotalAdvance; + } + + [[nodiscard]] std::optional<bool> GetPositionHasKashida(sal_Int32 nClusterId) const + { + if (auto nIndex = GetIndex(nClusterId); nIndex.has_value()) + { + return std::optional<bool>{ m_aClusters.at(*nIndex).m_nFlags + & ClusterJustificationFlags::KashidaPosition }; + } + + return std::nullopt; + } + + void SetTotalAdvance(sal_Int32 nClusterId, double nValue) + { + if (auto nIndex = GetIndex(nClusterId); nIndex.has_value()) + { + m_aClusters.at(*nIndex).m_nTotalAdvance = nValue; + m_bContainsAdvances = true; + } + } + + void SetKashidaPosition(sal_Int32 nClusterId, bool bValue) + { + if (auto nIndex = GetIndex(nClusterId); nIndex.has_value()) + { + if (bValue) + { + m_aClusters.at(*nIndex).m_nFlags |= ClusterJustificationFlags::KashidaPosition; + } + else + { + m_aClusters.at(*nIndex).m_nFlags &= ~ClusterJustificationFlags::KashidaPosition; + } + + m_bContainsKashidaPositions = true; + } + } +}; + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/inc/pdf/pdfwriter_impl.hxx b/vcl/inc/pdf/pdfwriter_impl.hxx index 483201f624fd..b0388ecd27a1 100644 --- a/vcl/inc/pdf/pdfwriter_impl.hxx +++ b/vcl/inc/pdf/pdfwriter_impl.hxx @@ -1256,7 +1256,9 @@ public: /* actual drawing functions */ void drawText( const Point& rPos, const OUString& rText, sal_Int32 nIndex, sal_Int32 nLen, bool bTextLines = true ); - void drawTextArray( const Point& rPos, const OUString& rText, KernArraySpan pDXArray, std::span<const sal_Bool> pKashidaArray, sal_Int32 nIndex, sal_Int32 nLen ); + void drawTextArray(const Point& rPos, const OUString& rText, KernArraySpan pDXArray, + std::span<const sal_Bool> pKashidaArray, sal_Int32 nIndex, sal_Int32 nLen, + sal_Int32 nLayoutContextIndex, sal_Int32 nLayoutContextLen); void drawStretchText( const Point& rPos, sal_Int32 nWidth, const OUString& rText, sal_Int32 nIndex, sal_Int32 nLen ); void drawText( const tools::Rectangle& rRect, const OUString& rOrigStr, DrawTextFlags nStyle ); diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx index 43b59e91a30c..49eb0c4ce93a 100644 --- a/vcl/inc/sallayout.hxx +++ b/vcl/inc/sallayout.hxx @@ -29,6 +29,7 @@ #include <vcl/vclenum.hxx> // for typedef sal_UCS4 #include <vcl/vcllayout.hxx> +#include "justificationdata.hxx" #include "ImplLayoutRuns.hxx" #include "impglyphitem.hxx" @@ -37,6 +38,7 @@ #include <hb.h> #include <memory> +#include <span> #include <vector> #define MAX_FALLBACK 16 @@ -81,9 +83,9 @@ public: SAL_DLLPRIVATE void SetIncomplete(bool bIncomplete); - SAL_DLLPRIVATE void ImplAdjustMultiLayout(vcl::text::ImplLayoutArgs& rArgs, - vcl::text::ImplLayoutArgs& rMultiArgs, - const double* pMultiDXArray); + SAL_DLLPRIVATE void ImplAdjustMultiLayout(vcl::text::ImplLayoutArgs& rArgs, + vcl::text::ImplLayoutArgs& rMultiArgs, + const JustificationData& rstJustification); SAL_DLLPRIVATE ImplLayoutRuns* GetFallbackRuns() { return maFallbackRuns; } @@ -101,10 +103,9 @@ private: class VCL_DLLPUBLIC GenericSalLayout : public SalLayout { - friend void MultiSalLayout::ImplAdjustMultiLayout( - vcl::text::ImplLayoutArgs& rArgs, - vcl::text::ImplLayoutArgs& rMultiArgs, - const double* pMultiDXArray); + friend void MultiSalLayout::ImplAdjustMultiLayout(vcl::text::ImplLayoutArgs& rArgs, + vcl::text::ImplLayoutArgs& rMultiArgs, + const JustificationData& rstJustification); public: GenericSalLayout(LogicalFontInstance&); @@ -144,7 +145,7 @@ private: GenericSalLayout( const GenericSalLayout& ) = delete; GenericSalLayout& operator=( const GenericSalLayout& ) = delete; - SAL_DLLPRIVATE void ApplyDXArray(const double*, const sal_Bool*); + SAL_DLLPRIVATE void ApplyJustificationData(const JustificationData& rstJustification); SAL_DLLPRIVATE void Justify(double nNewWidth); SAL_DLLPRIVATE void ApplyAsianKerning(std::u16string_view rStr); diff --git a/vcl/qa/cppunit/justificationdata.cxx b/vcl/qa/cppunit/justificationdata.cxx new file mode 100644 index 000000000000..1c01e3ed00c5 --- /dev/null +++ b/vcl/qa/cppunit/justificationdata.cxx @@ -0,0 +1,113 @@ +/* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4; fill-column: 100 -*- */ +/* + * This file is part of the LibreOffice project. + * + * This Source Code Form is subject to the terms of the Mozilla Public + * License, v. 2.0. If a copy of the MPL was not distributed with this + * file, You can obtain one at http://mozilla.org/MPL/2.0/. + */ + +#include <cppunit/TestFixture.h> +#include <cppunit/extensions/HelperMacros.h> + +#include <justificationdata.hxx> + +class JustificationDataTest : public CppUnit::TestFixture +{ +public: + void testEmpty() + { + JustificationData stJust; + CPPUNIT_ASSERT(stJust.empty()); + + JustificationData stJust2{ /*nBaseIndex*/ 100, /*nSize*/ 5 }; + CPPUNIT_ASSERT(!stJust2.empty()); + } + + void testContainsAdvances() + { + JustificationData stJust{ /*nBaseIndex*/ 100, /*nSize*/ 5 }; + CPPUNIT_ASSERT(!stJust.ContainsAdvances()); + + // Try to set advances out of bounds + stJust.SetTotalAdvance(10, 1.0); + CPPUNIT_ASSERT(!stJust.ContainsAdvances()); + + stJust.SetTotalAdvance(200, 1.0); + CPPUNIT_ASSERT(!stJust.ContainsAdvances()); + + // Insert in bounds + stJust.SetTotalAdvance(102, 1.0); + CPPUNIT_ASSERT(stJust.ContainsAdvances()); + } + + void testAdvances() + { + JustificationData stJust{ /*nBaseIndex*/ 100, /*nSize*/ 3 }; + stJust.SetTotalAdvance(99, 1.0); + stJust.SetTotalAdvance(100, 2.0); + stJust.SetTotalAdvance(101, 3.0); + stJust.SetTotalAdvance(102, 4.0); + stJust.SetTotalAdvance(103, 5.0); + + // Total advance before the valid range must be 0 + CPPUNIT_ASSERT_DOUBLES_EQUAL(0.0, stJust.GetTotalAdvance(99), 0.05); + + CPPUNIT_ASSERT_DOUBLES_EQUAL(2.0, stJust.GetTotalAdvance(100), 0.05); + CPPUNIT_ASSERT_DOUBLES_EQUAL(3.0, stJust.GetTotalAdvance(101), 0.05); + CPPUNIT_ASSERT_DOUBLES_EQUAL(4.0, stJust.GetTotalAdvance(102), 0.05); + + // Total advance after the valid range must be the last advance + CPPUNIT_ASSERT_DOUBLES_EQUAL(4.0, stJust.GetTotalAdvance(103), 0.05); + } + + void testContainsKashidaPositions() + { + JustificationData stJust{ /*nBaseIndex*/ 100, /*nSize*/ 5 }; + CPPUNIT_ASSERT(!stJust.ContainsKashidaPositions()); + + // Try to set kashida positions out of bounds + stJust.SetKashidaPosition(10, true); + CPPUNIT_ASSERT(!stJust.ContainsKashidaPositions()); + + stJust.SetKashidaPosition(200, true); + CPPUNIT_ASSERT(!stJust.ContainsKashidaPositions()); + + // Insert in bounds + stJust.SetKashidaPosition(102, true); + CPPUNIT_ASSERT(stJust.ContainsKashidaPositions()); + } + + void testKashidaPositions() + { + JustificationData stJust{ /*nBaseIndex*/ 100, /*nSize*/ 1 }; + + CPPUNIT_ASSERT(!stJust.GetPositionHasKashida(99).has_value()); + CPPUNIT_ASSERT(!stJust.GetPositionHasKashida(100).value_or(true)); + CPPUNIT_ASSERT(!stJust.GetPositionHasKashida(101).has_value()); + + stJust.SetKashidaPosition(99, true); + stJust.SetKashidaPosition(100, true); + stJust.SetKashidaPosition(101, true); + + CPPUNIT_ASSERT(!stJust.GetPositionHasKashida(99).has_value()); + CPPUNIT_ASSERT(stJust.GetPositionHasKashida(100).value_or(false)); + CPPUNIT_ASSERT(!stJust.GetPositionHasKashida(101).has_value()); + + stJust.SetKashidaPosition(100, false); + + CPPUNIT_ASSERT(!stJust.GetPositionHasKashida(100).value_or(true)); + } + + CPPUNIT_TEST_SUITE(JustificationDataTest); + CPPUNIT_TEST(testEmpty); + CPPUNIT_TEST(testContainsAdvances); + CPPUNIT_TEST(testAdvances); + CPPUNIT_TEST(testContainsKashidaPositions); + CPPUNIT_TEST(testKashidaPositions); + CPPUNIT_TEST_SUITE_END(); +}; + +CPPUNIT_TEST_SUITE_REGISTRATION(JustificationDataTest); + +/* vim:set shiftwidth=4 softtabstop=4 expandtab cinoptions=b1,g0,N-s cinkeys+=0=break: */ diff --git a/vcl/qa/cppunit/pdfexport/data/tdf124116-hebrew-track-untrack.odt b/vcl/qa/cppunit/pdfexport/data/tdf124116-hebrew-track-untrack.odt new file mode 100644 index 000000000000..e3f3becee3a8 Binary files /dev/null and b/vcl/qa/cppunit/pdfexport/data/tdf124116-hebrew-track-untrack.odt differ diff --git a/vcl/qa/cppunit/pdfexport/data/tdf134226-shadda-in-hidden-span.fodt b/vcl/qa/cppunit/pdfexport/data/tdf134226-shadda-in-hidden-span.fodt new file mode 100644 index 000000000000..635ffc86883c --- /dev/null +++ b/vcl/qa/cppunit/pdfexport/data/tdf134226-shadda-in-hidden-span.fodt @@ -0,0 +1,328 @@ +<?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:creation-date>2024-05-17T12:26:58.973389885</meta:creation-date><dc:date>2024-05-17T13:33:16.344029125</dc:date><meta:editing-duration>PT12M29S</meta:editing-duration><meta:editing-cycles>16</meta:editing-cycles><meta:generator>LibreOffice/24.2.3.2$Linux_X86_64 LibreOffice_project/4f88f79086d18691a72ac668802d5bc5b5a88122</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="2" meta:word-count="2" meta:character-count="6" meta:non-whitespace-character-count="6"/></office:meta> + <office:settings> + <config:config-item-set config:name="ooo:view-settings"> + <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaWidth" config:type="long">46651</config:config-item> + <config:config-item config:name="ViewAreaHeight" config:type="long">29386</config:config-item> + <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item> + <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item> + <config:config-item-map-indexed config:name="Views"> + <config:config-item-map-entry> + <config:config-item config:name="ViewId" config:type="string">view2</config:config-item> + <config:config-item config:name="ViewLeft" config:type="long">26141</config:config-item> + <config:config-item config:name="ViewTop" config:type="long">9654</config:config-item> + <config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item> + <config:config-item config:name="VisibleTop" config:type="long">0</config:config-item> + <config:config-item config:name="VisibleRight" config:type="long">46650</config:config-item> + <config:config-item config:name="VisibleBottom" config:type="long">29385</config:config-item> + <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> + <config:config-item config:name="ViewLayoutColumns" config:type="short">1</config:config-item> + <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item> + <config:config-item config:name="ZoomFactor" config:type="short">160</config:config-item> + <config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item> + <config:config-item config:name="KeepRatio" config:type="boolean">false</config:config-item> + <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item> + <config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item> + <config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreBreakAfterMultilineField" config:type="boolean">false</config:config-item> + </config:config-item-map-entry> + </config:config-item-map-indexed> + </config:config-item-set> + <config:config-item-set config:name="ooo:configuration-settings"> + <config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintPageBackground" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintFaxName" config:type="string"/> + <config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item> + <config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintEmptyPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item> + <config:config-item config:name="NoNumberingShowFollowBy" config:type="boolean">false</config:config-item> + <config:config-item config:name="HyphenateURLs" config:type="boolean">false</config:config-item> + <config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item> + <config:config-item config:name="FootnoteInColumnToPageEnd" config:type="boolean">true</config:config-item> + <config:config-item config:name="GutterAtTop" config:type="boolean">false</config:config-item> + <config:config-item config:name="ContinuousEndnotes" config:type="boolean">false</config:config-item> + <config:config-item config:name="FrameAutowidthWithMorePara" config:type="boolean">false</config:config-item> + <config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">false</config:config-item> + <config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item> + <config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabOverSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="AutoFirstLineIndentDisregardLineSpace" config:type="boolean">true</config:config-item> + <config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintTextPlaceholder" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedSystemFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="DisableOffPagePositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="BackgroundParaOverDrawings" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item> + <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="ProtectBookmarks" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item> + <config:config-item config:name="JustifyLinesWithShrinking" config:type="boolean">false</config:config-item> + <config:config-item config:name="RsidRoot" config:type="int">200646</config:config-item> + <config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item> + <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseCommand" config:type="string"/> + <config:config-item config:name="CurrentDatabaseDataSource" config:type="string"/> + <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbeddedDatabaseName" config:type="string"/> + <config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item> + <config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item> + <config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseOldNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item> + <config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">true</config:config-item> + <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item> + <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="HeaderSpacingBelowLastPara" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item> + <config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item> + <config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item> + <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item> + <config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintSingleJobs" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterName" config:type="string"/> + <config:config-item config:name="AddParaLineSpacingToTableCells" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> + <config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> + <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrinterSetup" config:type="base64Binary"/> + <config:config-item config:name="UseVariableWidthNBSP" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item> + <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="ProtectFields" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item> + <config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item> + <config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item> + <config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item> + <config:config-item config:name="StylesNoDefault" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="NoGapAfterNoteNumber" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">true</config:config-item> + <config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item> + <config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item> + <config:config-item config:name="DropCapPunctuation" config:type="boolean">true</config:config-item> + <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item> + <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/> + <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item> + <config:config-item config:name="Rsid" config:type="int">754914</config:config-item> + <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> + <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item> + <config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">false</config:config-item> + <config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item> + </config:config-item-set> + </office:settings> + <office:scripts> + <office:script script:language="ooo:Basic"> + <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink"> + <ooo:library-embedded ooo:name="Standard"/> + </ooo:libraries> + </office:script> + </office:scripts> + <office:font-face-decls> + <style:font-face style:name="Liberation Mono" svg:font-family="'Liberation Mono'" style:font-family-generic="modern" style:font-pitch="fixed"/> + <style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/> + <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" svg:font-family="'Noto Sans'" style:font-adornments="Regular" style:font-family-generic="swiss" style:font-pitch="variable"/> + <style:font-face style:name="Noto Sans Arabic" svg:font-family="'Noto Sans Arabic'" style:font-adornments="Regular" style:font-family-generic="swiss" style:font-pitch="variable"/> + <style:font-face style:name="Noto Sans Mono" svg:font-family="'Noto Sans Mono'" style:font-adornments="Regular" style:font-family-generic="swiss" style:font-pitch="variable"/> + <style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="swiss"/> + <style:font-face style:name="Tahoma1" svg:font-family="Tahoma" style:font-family-generic="system" style:font-pitch="variable"/> + </office:font-face-decls> + <office:styles> + <style:default-style style:family="graphic"> + <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" 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="0cm" 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="Noto Sans" style:font-size-asian="10.5pt" style:font-name-complex="Tahoma1" style:font-size-complex="12pt" style:language-complex="ar" style:country-complex="SA"/> + </style:default-style> + <style:default-style style:family="paragraph"> + <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.251cm" 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="Noto Sans" style:font-size-asian="10.5pt" style:font-name-complex="Tahoma1" style:font-size-complex="12pt" style:language-complex="ar" style:country-complex="SA" 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="5" 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"> + <style:text-properties style:font-name-asian="Noto Sans" style:font-family-asian="'Noto Sans'" style:font-style-name-asian="Regular" style:font-family-generic-asian="swiss" style:font-pitch-asian="variable" style:language-asian="zxx" style:country-asian="none" style:font-name-complex="Noto Sans Arabic" style:font-family-complex="'Noto Sans Arabic'" style:font-style-name-complex="Regular" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="96pt" style:language-complex="ar" style:country-complex="SA"/> + </style:style> + <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text"> + <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:keep-with-next="always"/> + <style:text-properties style:font-name="Liberation Sans" fo:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-complex="Tahoma1" style:font-family-complex="Tahoma" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/> + </style:style> + <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.247cm" style:contextual-spacing="false" fo:line-height="115%"/> + </style:style> + <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list"> + <style:text-properties style:font-name-complex="Tahoma" style:font-family-complex="Tahoma" style:font-family-generic-complex="swiss"/> + </style:style> + <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/> + <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-name-complex="Tahoma" style:font-family-complex="Tahoma" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/> + </style:style> + <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index"> + <style:paragraph-properties text:number-lines="false" text:line-number="0"/> + <style:text-properties style:font-name-complex="Tahoma" style:font-family-complex="Tahoma" style:font-family-generic-complex="swiss"/> + </style:style> + <style:style style:name="Addressee" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.106cm" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/> + </style:style> + <style:style style:name="Quotations" style:family="paragraph" style:parent-style-name="Standard" style:class="html"> + <style:paragraph-properties fo:margin-left="1cm" fo:margin-right="1cm" fo:margin-top="0cm" fo:margin-bottom="0.499cm" style:contextual-spacing="false" fo:text-indent="0cm" style:auto-text-indent="false"/> + </style:style> + <style:style style:name="Table_20_Contents" style:display-name="Table Contents" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties fo:orphans="0" fo:widows="0" text:number-lines="false" text:line-number="0"/> + </style:style> + <style:style style:name="Signature" style:family="paragraph" style:parent-style-name="Standard" style:class="text"> + <style:paragraph-properties text:number-lines="false" text:line-number="0"/> + </style:style> + <style:style style:name="Sender" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.106cm" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/> + </style:style> + <style:style style:name="Preformatted_20_Text" style:display-name="Preformatted Text" style:family="paragraph" style:parent-style-name="Standard" style:class="html"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0cm" style:contextual-spacing="false"/> + <style:text-properties style:font-name="Liberation Mono" fo:font-family="'Liberation Mono'" style:font-family-generic="modern" style:font-pitch="fixed" fo:font-size="10pt" style:font-name-asian="Noto Sans Mono" style:font-family-asian="'Noto Sans Mono'" style:font-style-name-asian="Regular" style:font-family-generic-asian="swiss" style:font-pitch-asian="variable" style:font-size-asian="10pt" style:font-name-complex="Liberation Mono" style:font-family-complex="'Liberation Mono'" style:font-family-generic-complex="modern" style:font-pitch-complex="fixed" style:font-size-complex="10pt"/> + </style:style> + <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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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.499cm" style:num-format="1" text:number-position="left" text:increment="5"/> + <loext:theme loext:name="Office"> + <loext:theme-colors loext:name="LibreOffice"> + <loext:color loext:name="dark1" loext:color="#000000"/> + <loext:color loext:name="light1" loext:color="#ffffff"/> + <loext:color loext:name="dark2" loext:color="#000000"/> + <loext:color loext:name="light2" loext:color="#ffffff"/> + <loext:color loext:name="accent1" loext:color="#18a303"/> + <loext:color loext:name="accent2" loext:color="#0369a3"/> + <loext:color loext:name="accent3" loext:color="#a33e03"/> + <loext:color loext:name="accent4" loext:color="#8e03a3"/> + <loext:color loext:name="accent5" loext:color="#c99c00"/> + <loext:color loext:name="accent6" loext:color="#c9211e"/> + <loext:color loext:name="hyperlink" loext:color="#0000ee"/> + <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/> + </loext:theme-colors> + </loext:theme> + </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:style> + <style:style style:name="T1" style:family="text"> + <style:text-properties fo:font-weight="normal" style:font-weight-complex="normal"/> + </style:style> + <style:page-layout style:name="pm1"> + <style:page-layout-properties fo:page-width="21.59cm" fo:page-height="27.94cm" style:num-format="1" style:print-orientation="portrait" fo:margin-top="2cm" fo:margin-bottom="2cm" fo:margin-left="2cm" fo:margin-right="2cm" style:writing-mode="lr-tb" style:layout-grid-color="#c0c0c0" style:layout-grid-lines="20" style:layout-grid-base-height="0.706cm" style:layout-grid-ruby-height="0.353cm" 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="0cm" loext:margin-gutter="0cm"> + <style:footnote-sep style:width="0.018cm" style:distance-before-sep="0.101cm" style:distance-after-sep="0.101cm" 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:p> + <text:p text:style-name="P1">شق<text:span text:style-name="T1">ّ</text:span>ة</text:p> + </office:text> + </office:body> +</office:document> diff --git a/vcl/qa/cppunit/pdfexport/data/tdf71956-styled-diacritics.fodt b/vcl/qa/cppunit/pdfexport/data/tdf71956-styled-diacritics.fodt new file mode 100644 index 000000000000..408744885c2d --- /dev/null +++ b/vcl/qa/cppunit/pdfexport/data/tdf71956-styled-diacritics.fodt @@ -0,0 +1,320 @@ +<?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:creation-date>2024-05-17T12:26:58.973389885</meta:creation-date><dc:date>2024-05-17T12:40:53.077636652</dc:date><meta:editing-duration>PT9M18S</meta:editing-duration><meta:editing-cycles>6</meta:editing-cycles><meta:generator>LibreOffice/24.2.3.2$Linux_X86_64 LibreOffice_project/4f88f79086d18691a72ac668802d5bc5b5a88122</meta:generator><meta:document-statistic meta:table-count="0" meta:image-count="0" meta:object-count="0" meta:page-count="1" meta:paragraph-count="2" meta:word-count="2" meta:character-count="6" meta:non-whitespace-character-count="6"/></office:meta> + <office:settings> + <config:config-item-set config:name="ooo:view-settings"> + <config:config-item config:name="ViewAreaTop" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaLeft" config:type="long">0</config:config-item> + <config:config-item config:name="ViewAreaWidth" config:type="long">46701</config:config-item> + <config:config-item config:name="ViewAreaHeight" config:type="long">29438</config:config-item> + <config:config-item config:name="ShowRedlineChanges" config:type="boolean">true</config:config-item> + <config:config-item config:name="InBrowseMode" config:type="boolean">false</config:config-item> + <config:config-item-map-indexed config:name="Views"> + <config:config-item-map-entry> + <config:config-item config:name="ViewId" config:type="string">view2</config:config-item> + <config:config-item config:name="ViewLeft" config:type="long">32143</config:config-item> + <config:config-item config:name="ViewTop" config:type="long">2501</config:config-item> + <config:config-item config:name="VisibleLeft" config:type="long">0</config:config-item> + <config:config-item config:name="VisibleTop" config:type="long">0</config:config-item> + <config:config-item config:name="VisibleRight" config:type="long">46699</config:config-item> + <config:config-item config:name="VisibleBottom" config:type="long">29436</config:config-item> + <config:config-item config:name="ZoomType" config:type="short">0</config:config-item> + <config:config-item config:name="ViewLayoutColumns" config:type="short">1</config:config-item> + <config:config-item config:name="ViewLayoutBookMode" config:type="boolean">false</config:config-item> + <config:config-item config:name="ZoomFactor" config:type="short">160</config:config-item> + <config:config-item config:name="IsSelectedFrame" config:type="boolean">false</config:config-item> + <config:config-item config:name="KeepRatio" config:type="boolean">false</config:config-item> + <config:config-item config:name="AnchoredTextOverflowLegacy" config:type="boolean">false</config:config-item> + <config:config-item config:name="LegacySingleLineFontwork" config:type="boolean">false</config:config-item> + <config:config-item config:name="ConnectorUseSnapRect" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreBreakAfterMultilineField" config:type="boolean">false</config:config-item> + </config:config-item-map-entry> + </config:config-item-map-indexed> + </config:config-item-set> + <config:config-item-set config:name="ooo:configuration-settings"> + <config:config-item config:name="PrintProspectRTL" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintPageBackground" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintDrawings" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintFaxName" config:type="string"/> + <config:config-item config:name="PrintReversed" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintAnnotationMode" config:type="short">0</config:config-item> + <config:config-item config:name="PrintHiddenText" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintEmptyPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintGraphics" config:type="boolean">true</config:config-item> + <config:config-item config:name="NoNumberingShowFollowBy" config:type="boolean">false</config:config-item> + <config:config-item config:name="HyphenateURLs" config:type="boolean">false</config:config-item> + <config:config-item config:name="ImagePreferredDPI" config:type="int">0</config:config-item> + <config:config-item config:name="FootnoteInColumnToPageEnd" config:type="boolean">true</config:config-item> + <config:config-item config:name="GutterAtTop" config:type="boolean">false</config:config-item> + <config:config-item config:name="ContinuousEndnotes" config:type="boolean">false</config:config-item> + <config:config-item config:name="FrameAutowidthWithMorePara" config:type="boolean">false</config:config-item> + <config:config-item config:name="SubtractFlysAnchoredAtFlys" config:type="boolean">false</config:config-item> + <config:config-item config:name="SurroundTextWrapSmall" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintControls" config:type="boolean">true</config:config-item> + <config:config-item config:name="TreatSingleColumnBreakAsPageBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabOverSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="AutoFirstLineIndentDisregardLineSpace" config:type="boolean">true</config:config-item> + <config:config-item config:name="TabOverMargin" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedComplexScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbedAsianScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintTextPlaceholder" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedSystemFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="DisableOffPagePositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="BackgroundParaOverDrawings" config:type="boolean">false</config:config-item> + <config:config-item config:name="TabOverflow" config:type="boolean">true</config:config-item> + <config:config-item config:name="AllowPrintJobCancel" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddVerticalFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="ProtectBookmarks" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddFrameOffsets" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintBlackFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="TableRowKeep" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyParagraphMarkFormatToNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterIndependentLayout" config:type="string">high-resolution</config:config-item> + <config:config-item config:name="JustifyLinesWithShrinking" config:type="boolean">false</config:config-item> + <config:config-item config:name="RsidRoot" config:type="int">200646</config:config-item> + <config:config-item config:name="PrintProspect" config:type="boolean">false</config:config-item> + <config:config-item config:name="CollapseEmptyCellPara" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseCommand" config:type="string"/> + <config:config-item config:name="CurrentDatabaseDataSource" config:type="string"/> + <config:config-item config:name="SaveThumbnail" config:type="boolean">true</config:config-item> + <config:config-item config:name="EmbeddedDatabaseName" config:type="string"/> + <config:config-item config:name="UnbreakableNumberings" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveGlobalDocumentLinks" config:type="boolean">false</config:config-item> + <config:config-item config:name="MsWordCompTrailingBlanks" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintTables" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrintLeftPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddParaTableSpacing" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrinterPaperFromSetup" config:type="boolean">false</config:config-item> + <config:config-item config:name="CurrentDatabaseCommandType" config:type="int">0</config:config-item> + <config:config-item config:name="ChartAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item config:name="OutlineLevelYieldsNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseOldNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddParaSpacingToTableCells" config:type="boolean">true</config:config-item> + <config:config-item config:name="FieldAutoUpdate" config:type="boolean">true</config:config-item> + <config:config-item config:name="PropLineSpacingShrinksFirstLine" config:type="boolean">true</config:config-item> + <config:config-item config:name="TabAtLeftIndentForParagraphsInList" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintRightPages" config:type="boolean">true</config:config-item> + <config:config-item config:name="DoNotCaptureDrawObjsOnPage" config:type="boolean">false</config:config-item> + <config:config-item config:name="LoadReadonly" config:type="boolean">false</config:config-item> + <config:config-item config:name="HeaderSpacingBelowLastPara" config:type="boolean">false</config:config-item> + <config:config-item config:name="SaveVersionOnClose" config:type="boolean">false</config:config-item> + <config:config-item config:name="ClippedPictures" config:type="boolean">false</config:config-item> + <config:config-item config:name="MathBaselineAlignment" config:type="boolean">true</config:config-item> + <config:config-item config:name="AlignTabStopPosition" config:type="boolean">true</config:config-item> + <config:config-item config:name="UseFormerLineSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrintSingleJobs" config:type="boolean">false</config:config-item> + <config:config-item config:name="PrinterName" config:type="string"/> + <config:config-item config:name="AddParaLineSpacingToTableCells" config:type="boolean">true</config:config-item> + <config:config-item config:name="IsKernAsianPunctuation" config:type="boolean">false</config:config-item> + <config:config-item config:name="DoNotJustifyLinesWithManualBreak" config:type="boolean">false</config:config-item> + <config:config-item config:name="CharacterCompressionType" config:type="short">0</config:config-item> + <config:config-item config:name="IsLabelDocument" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedLatinScriptFonts" config:type="boolean">true</config:config-item> + <config:config-item config:name="PrinterSetup" config:type="base64Binary"/> + <config:config-item config:name="UseVariableWidthNBSP" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmbedOnlyUsedFonts" config:type="boolean">false</config:config-item> + <config:config-item config:name="ApplyUserData" config:type="boolean">true</config:config-item> + <config:config-item config:name="AddParaTableSpacingAtStart" config:type="boolean">true</config:config-item> + <config:config-item config:name="InvertBorderSpacing" config:type="boolean">false</config:config-item> + <config:config-item config:name="ProtectFields" config:type="boolean">false</config:config-item> + <config:config-item config:name="AddExternalLeading" config:type="boolean">true</config:config-item> + <config:config-item config:name="LinkUpdateMode" config:type="short">1</config:config-item> + <config:config-item config:name="UseFormerObjectPositioning" config:type="boolean">false</config:config-item> + <config:config-item config:name="UnxForceZeroExtLeading" config:type="boolean">false</config:config-item> + <config:config-item config:name="UseFormerTextWrapping" config:type="boolean">false</config:config-item> + <config:config-item config:name="ConsiderTextWrapOnObjPos" config:type="boolean">false</config:config-item> + <config:config-item config:name="StylesNoDefault" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreFirstLineIndentInNumbering" config:type="boolean">false</config:config-item> + <config:config-item config:name="NoGapAfterNoteNumber" config:type="boolean">false</config:config-item> + <config:config-item config:name="EmptyDbFieldHidesPara" config:type="boolean">true</config:config-item> + <config:config-item config:name="DoNotResetParaAttrsForNumFont" config:type="boolean">false</config:config-item> + <config:config-item config:name="IgnoreTabsAndBlanksForLineCalculation" config:type="boolean">false</config:config-item> + <config:config-item config:name="ClipAsCharacterAnchoredWriterFlyFrames" config:type="boolean">false</config:config-item> + <config:config-item config:name="DropCapPunctuation" config:type="boolean">true</config:config-item> + <config:config-item config:name="UseOldPrinterMetrics" config:type="boolean">false</config:config-item> + <config:config-item config:name="RedlineProtectionKey" config:type="base64Binary"/> + <config:config-item config:name="TabsRelativeToIndent" config:type="boolean">true</config:config-item> + <config:config-item config:name="Rsid" config:type="int">313543</config:config-item> + <config:config-item config:name="UpdateFromTemplate" config:type="boolean">true</config:config-item> + <config:config-item config:name="ProtectForm" config:type="boolean">false</config:config-item> + <config:config-item config:name="MsWordCompMinLineHeightByFly" config:type="boolean">false</config:config-item> + <config:config-item config:name="SmallCapsPercentage66" config:type="boolean">false</config:config-item> + </config:config-item-set> + </office:settings> + <office:scripts> + <office:script script:language="ooo:Basic"> + <ooo:libraries xmlns:ooo="http://openoffice.org/2004/office" xmlns:xlink="http://www.w3.org/1999/xlink"/> + </office:script> + </office:scripts> + <office:font-face-decls> + <style:font-face style:name="Liberation Sans" svg:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable"/> + <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 Arabic" svg:font-family="'Noto Sans Arabic'" style:font-adornments="Regular" style:font-family-generic="swiss" style:font-pitch="variable"/> + <style:font-face style:name="Tahoma" svg:font-family="Tahoma" style:font-family-generic="swiss"/> + <style:font-face style:name="Tahoma1" svg:font-family="Tahoma" style:font-family-generic="system" style:font-pitch="variable"/> + </office:font-face-decls> + <office:styles> + <style:default-style style:family="graphic"> + <style:graphic-properties svg:stroke-color="#3465a4" draw:fill-color="#729fcf" fo:wrap-option="no-wrap" draw:shadow-offset-x="0.3cm" draw:shadow-offset-y="0.3cm" draw:start-line-spacing-horizontal="0.283cm" draw:start-line-spacing-vertical="0.283cm" draw:end-line-spacing-horizontal="0.283cm" draw:end-line-spacing-vertical="0.283cm" 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="0cm" 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-complex="Tahoma1" style:font-size-complex="12pt" style:language-complex="fa" style:country-complex="IR"/> + </style:default-style> + <style:default-style style:family="paragraph"> + <style:paragraph-properties fo:orphans="2" fo:widows="2" fo:hyphenation-ladder-count="no-limit" style:text-autospace="ideograph-alpha" style:punctuation-wrap="hanging" style:line-break="strict" style:tab-stop-distance="1.251cm" 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-complex="Tahoma1" style:font-size-complex="12pt" style:language-complex="fa" style:country-complex="IR" 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="5" 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"> + <style:text-properties style:font-name-complex="Noto Sans Arabic" style:font-family-complex="'Noto Sans Arabic'" style:font-style-name-complex="Regular" style:font-family-generic-complex="swiss" style:font-pitch-complex="variable" style:font-size-complex="96pt" style:language-complex="ar" style:country-complex="SA"/> + </style:style> + <style:style style:name="Heading" style:family="paragraph" style:parent-style-name="Standard" style:next-style-name="Text_20_body" style:class="text"> + <style:paragraph-properties fo:margin-top="0.423cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" fo:keep-with-next="always"/> + <style:text-properties style:font-name="Liberation Sans" fo:font-family="'Liberation Sans'" style:font-family-generic="swiss" style:font-pitch="variable" fo:font-size="14pt" style:font-name-complex="Tahoma1" style:font-family-complex="Tahoma" style:font-family-generic-complex="system" style:font-pitch-complex="variable" style:font-size-complex="14pt"/> + </style:style> + <style:style style:name="Text_20_body" style:display-name="Text body" style:family="paragraph" style:parent-style-name="Standard" style:class="text"> + <style:paragraph-properties fo:margin-top="0cm" fo:margin-bottom="0.247cm" style:contextual-spacing="false" fo:line-height="115%"/> + </style:style> + <style:style style:name="List" style:family="paragraph" style:parent-style-name="Text_20_body" style:class="list"> + <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Tahoma" style:font-family-complex="Tahoma" style:font-family-generic-complex="swiss"/> + </style:style> + <style:style style:name="Caption" style:family="paragraph" style:parent-style-name="Standard" style:class="extra"> + <style:paragraph-properties fo:margin-top="0.212cm" fo:margin-bottom="0.212cm" style:contextual-spacing="false" text:number-lines="false" text:line-number="0"/> + <style:text-properties fo:font-size="12pt" fo:font-style="italic" style:font-size-asian="12pt" style:font-style-asian="italic" style:font-name-complex="Tahoma" style:font-family-complex="Tahoma" style:font-family-generic-complex="swiss" style:font-size-complex="12pt" style:font-style-complex="italic"/> + </style:style> + <style:style style:name="Index" style:family="paragraph" style:parent-style-name="Standard" style:class="index"> + <style:paragraph-properties text:number-lines="false" text:line-number="0"/> + <style:text-properties style:font-size-asian="12pt" style:font-name-complex="Tahoma" style:font-family-complex="Tahoma" style:font-family-generic-complex="swiss"/> + </style:style> + <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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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"/> + </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.499cm" style:num-format="1" text:number-position="left" text:increment="5"/> + <loext:theme loext:name="Office"> + <loext:theme-colors loext:name="LibreOffice"> + <loext:color loext:name="dark1" loext:color="#000000"/> + <loext:color loext:name="light1" loext:color="#ffffff"/> + <loext:color loext:name="dark2" loext:color="#000000"/> + <loext:color loext:name="light2" loext:color="#ffffff"/> + <loext:color loext:name="accent1" loext:color="#18a303"/> + <loext:color loext:name="accent2" loext:color="#0369a3"/> + <loext:color loext:name="accent3" loext:color="#a33e03"/> + <loext:color loext:name="accent4" loext:color="#8e03a3"/> + <loext:color loext:name="accent5" loext:color="#c99c00"/> + <loext:color loext:name="accent6" loext:color="#c9211e"/> + <loext:color loext:name="hyperlink" loext:color="#0000ee"/> + <loext:color loext:name="followed-hyperlink" loext:color="#551a8b"/> + </loext:theme-colors> + </loext:theme> + </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 officeooo:paragraph-rsid="00040e0a"/> + </style:style> + <style:style style:name="T1" style:family="text"> + <style:text-properties fo:color="#ff0000" loext:opacity="100%"/> + </style:style> + <style:style style:name="T2" style:family="text"> + <style:text-properties fo:color="#ff8000" loext:opacity="100%"/> + </style:style> + <style:style style:name="T3" style:family="text"> + <style:text-properties fo:color="#ffbf00" loext:opacity="100%"/> + </style:style> + <style:style style:name="T4" style:family="text"> + <style:text-properties fo:color="#81d41a" loext:opacity="100%"/> + </style:style> + <style:style style:name="T5" style:family="text"> + <style:text-properties fo:color="#00a933" loext:opacity="100%"/> + </style:style> + <style:style style:name="T6" style:family="text"> + <style:text-properties fo:color="#2a6099" loext:opacity="100%"/> + </style:style> + <style:page-layout style:name="pm1"> -e ... etc. - the rest is truncated