[Libreoffice-commits] core.git: sw/source vcl/CppunitTest_vcl_complextext.mk vcl/inc vcl/qa vcl/source
Miklos Vajna (via logerrit)
logerrit at kemper.freedesktop.org
Fri Mar 22 17:46:12 UTC 2019
sw/source/core/txtnode/fntcache.cxx | 11 +----------
vcl/CppunitTest_vcl_complextext.mk | 1 +
vcl/inc/impglyphitem.hxx | 2 ++
vcl/inc/sallayout.hxx | 4 ++--
vcl/qa/cppunit/complextext.cxx | 27 +++++++++++++++++++++++++++
vcl/source/gdi/CommonSalLayout.cxx | 6 ++++++
6 files changed, 39 insertions(+), 12 deletions(-)
New commits:
commit 8308d6a38ff283a2feebf84a95198159887cd685
Author: Miklos Vajna <vmiklos at collabora.com>
AuthorDate: Fri Mar 22 17:57:46 2019 +0100
Commit: Miklos Vajna <vmiklos at collabora.com>
CommitDate: Fri Mar 22 18:45:43 2019 +0100
Related: tdf#124109 vcl: make glyph item caching work with kashida glyphs
This was broken because GenericSalLayout::LayoutText() sets the
SalLayoutFlags::KashidaJustification flag as a side-effect of building
the glyph list. So in case we cache the list and not build it, the flag
will be missing. This means that later in
GenericSalLayout::ApplyDXArray() kashida glyphs won't be inserted.
With this, the workaround in sw can be removed.
Change-Id: Ic18211bf50ca673daa238e8950a381915e4b3096
Reviewed-on: https://gerrit.libreoffice.org/69566
Reviewed-by: Miklos Vajna <vmiklos at collabora.com>
Tested-by: Jenkins
diff --git a/sw/source/core/txtnode/fntcache.cxx b/sw/source/core/txtnode/fntcache.cxx
index e749bc2bdac4..ed39672d4f5a 100644
--- a/sw/source/core/txtnode/fntcache.cxx
+++ b/sw/source/core/txtnode/fntcache.cxx
@@ -1492,7 +1492,6 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
long nSpaceAdd = rInf.GetSpace() / SPACING_PRECISION_FACTOR;
bool bNoHalfSpace = false;
- bool bCacheLayout = true;
if ( rInf.GetFont() && rInf.GetLen() )
{
@@ -1535,12 +1534,7 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
if ( pSI && pSI->CountKashida() &&
pSI->KashidaJustify( pKernArray.get(), pScrArray.get(), rInf.GetIdx(),
rInf.GetLen(), nSpaceAdd ) != -1 )
- {
nSpaceAdd = 0;
- // Layout can't be reused in this case, it would lead to missing gaps in
- // place of kashida.
- bCacheLayout = false;
- }
else
bNoHalfSpace = true;
}
@@ -1821,10 +1815,7 @@ void SwFntObj::DrawText( SwDrawTextInfo &rInf )
? (rInf.GetIdx() ? 1 : 0)
: sal_Int32(rInf.GetIdx());
aGlyphsKey = SwTextGlyphsKey{ &rInf.GetOut(), *pStr, nTmpIdx, nLen };
- if (bCacheLayout)
- pGlyphs = lcl_CreateLayout(aGlyphsKey, m_aTextGlyphs[aGlyphsKey]);
- else
- pGlyphs = nullptr;
+ pGlyphs = lcl_CreateLayout(aGlyphsKey, m_aTextGlyphs[aGlyphsKey]);
rInf.GetOut().DrawTextArray( aTextOriginPos, *pStr, pKernArray.get(),
nTmpIdx , nLen, SalLayoutFlags::NONE, pGlyphs );
if (bBullet)
diff --git a/vcl/CppunitTest_vcl_complextext.mk b/vcl/CppunitTest_vcl_complextext.mk
index 56b9bcd3f72f..540110af99a8 100644
--- a/vcl/CppunitTest_vcl_complextext.mk
+++ b/vcl/CppunitTest_vcl_complextext.mk
@@ -28,6 +28,7 @@ $(eval $(call gb_CppunitTest_use_libraries,vcl_complextext, \
comphelper \
cppu \
cppuhelper \
+ i18nlangtag \
sal \
svt \
test \
diff --git a/vcl/inc/impglyphitem.hxx b/vcl/inc/impglyphitem.hxx
index 24690216db63..987df438894c 100644
--- a/vcl/inc/impglyphitem.hxx
+++ b/vcl/inc/impglyphitem.hxx
@@ -23,6 +23,7 @@
#include <tools/gen.hxx>
#include <vcl/dllapi.h>
#include <vcl/glyphitem.hxx>
+#include <vcl/outdev.hxx>
#include <vector>
#include "fontinstance.hxx"
@@ -103,6 +104,7 @@ public:
private:
mutable rtl::Reference<LogicalFontInstance> m_rFontInstance;
+ SalLayoutFlags mnFlags = SalLayoutFlags::NONE;
SalLayoutGlyphsImpl(SalLayoutGlyphs& rGlyphs, LogicalFontInstance& rFontInstance)
: m_rFontInstance(&rFontInstance)
diff --git a/vcl/inc/sallayout.hxx b/vcl/inc/sallayout.hxx
index e71359e48165..535838aae645 100644
--- a/vcl/inc/sallayout.hxx
+++ b/vcl/inc/sallayout.hxx
@@ -73,7 +73,7 @@ public:
bool PosIsInAnyRun( int nCharPos ) const;
};
-class ImplLayoutArgs
+class VCL_DLLPUBLIC ImplLayoutArgs
{
public:
// string related inputs
@@ -158,7 +158,7 @@ private:
bool mbIncomplete;
};
-class VCL_PLUGIN_PUBLIC GenericSalLayout : public SalLayout
+class VCL_DLLPUBLIC GenericSalLayout : public SalLayout
{
friend void MultiSalLayout::AdjustLayout(ImplLayoutArgs&);
diff --git a/vcl/qa/cppunit/complextext.cxx b/vcl/qa/cppunit/complextext.cxx
index 96332585673b..99b05481ed01 100644
--- a/vcl/qa/cppunit/complextext.cxx
+++ b/vcl/qa/cppunit/complextext.cxx
@@ -19,8 +19,10 @@ static std::ostream& operator<<(std::ostream& rStream, const std::vector<long>&
#include <test/bootstrapfixture.hxx>
#include <vcl/wrkwin.hxx>
+#include <vcl/virdev.hxx>
// workaround MSVC2015 issue with std::unique_ptr
#include <sallayout.hxx>
+#include <salgdi.hxx>
#include <osl/file.hxx>
#include <osl/process.h>
@@ -45,6 +47,7 @@ public:
#if HAVE_MORE_FONTS
/// Play with font measuring etc.
void testArabic();
+ void testKashida();
#endif
#if defined(_WIN32)
void testTdf95650(); // Windows-only issue
@@ -53,6 +56,7 @@ public:
CPPUNIT_TEST_SUITE(VclComplexTextTest);
#if HAVE_MORE_FONTS
CPPUNIT_TEST(testArabic);
+ CPPUNIT_TEST(testKashida);
#endif
#if defined(_WIN32)
CPPUNIT_TEST(testTdf95650);
@@ -136,6 +140,29 @@ void VclComplexTextTest::testArabic()
(void)aRect; (void)aRectRot;
#endif
}
+
+void VclComplexTextTest::testKashida()
+{
+ // Cache the glyph list of some Arabic text.
+ ScopedVclPtrInstance<VirtualDevice> pOutputDevice;
+ auto aText
+ = OUString::fromUtf8(u8"ﻊﻨﺻﺭ ﺎﻠﻓﻮﺴﻓﻭﺭ ﻊﻨﺻﺭ ﻒﻟﺰﻳ ﺺﻠﺑ. ﺖﺘﻛﻮﻧ ﺎﻟﺩﻭﺭﺓ ﺎﻟﺭﺎﺒﻋﺓ ﻢﻧ ١٥ ﻊﻨﺻﺭﺍ.");
+ std::unique_ptr<SalLayout> pLayout = pOutputDevice->ImplLayout(
+ aText, 0, aText.getLength(), Point(0, 0), 0, nullptr, SalLayoutFlags::GlyphItemsOnly);
+ const SalLayoutGlyphs* pGlyphs = pLayout->GetGlyphs();
+ CPPUNIT_ASSERT(pGlyphs);
+ SalLayoutGlyphs aGlyphs = *pGlyphs;
+
+ // Now lay it out using the cached glyph list.
+ ImplLayoutArgs aLayoutArgs(aText, 0, aText.getLength(), SalLayoutFlags::NONE,
+ pOutputDevice->GetFont().GetLanguageTag(), nullptr);
+ pLayout = pOutputDevice->GetGraphics()->GetTextLayout(0);
+ CPPUNIT_ASSERT(pLayout->LayoutText(aLayoutArgs, &aGlyphs));
+
+ // Without the accompanying fix in place, this test would have failed with 'assertion failed'.
+ // The kashida justification flag was lost when going via the glyph cache.
+ CPPUNIT_ASSERT(aLayoutArgs.mnFlags & SalLayoutFlags::KashidaJustification);
+}
#endif
#if defined(_WIN32)
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index bfa4e1a2f503..6187ec6fed5c 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -273,6 +273,8 @@ bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphs*
{
// Work with pre-computed glyph items.
m_GlyphItems = *pGlyphs;
+ // Some flags are set as a side effect of text layout, restore them here.
+ rArgs.mnFlags |= pGlyphs->Impl()->mnFlags;
return true;
}
@@ -580,6 +582,10 @@ bool GenericSalLayout::LayoutText(ImplLayoutArgs& rArgs, const SalLayoutGlyphs*
hb_buffer_destroy(pHbBuffer);
+ // Some flags are set as a side effect of text layout, save them here.
+ if (rArgs.mnFlags & SalLayoutFlags::GlyphItemsOnly)
+ m_GlyphItems.Impl()->mnFlags = rArgs.mnFlags;
+
return true;
}
More information about the Libreoffice-commits
mailing list