summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorKhaled Hosny <khaledhosny@eglug.org>2016-10-20 16:37:22 +0200
committerKhaled Hosny <khaledhosny@eglug.org>2016-10-20 16:57:23 +0200
commitd5424208a5b63a9d5ac658279c3f9824aa38a2d6 (patch)
tree8a1725955071975eaecaef5ddec77210d78fb236
parent7854d35cd8172b201f1f3ad247860f242e5cb06b (diff)
Reuse the HarfBuzz buffer as much as possible
Less allocations in case we have many sub runs. Change-Id: I50d4a57702c030c185fc7edef576c64d739a6194
-rw-r--r--vcl/source/gdi/CommonSalLayout.cxx18
1 files changed, 11 insertions, 7 deletions
diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx
index b8f18c4416a4..cdb9b1924b0c 100644
--- a/vcl/source/gdi/CommonSalLayout.cxx
+++ b/vcl/source/gdi/CommonSalLayout.cxx
@@ -418,6 +418,13 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
pTextLayout = pNewScriptRun.get();
}
+ hb_buffer_t* pHbBuffer = hb_buffer_create();
+ hb_buffer_pre_allocate(pHbBuffer, nGlyphCapacity);
+#if !HB_VERSION_ATLEAST(1, 1, 0)
+ static hb_unicode_funcs_t* pHbUnicodeFuncs = getUnicodeFuncs();
+ hb_buffer_set_unicode_funcs(pHbBuffer, pHbUnicodeFuncs);
+#endif
+
Point aCurrPos(0, 0);
while (true)
{
@@ -457,6 +464,8 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
for (const auto& aScriptRun : aScriptSubRuns)
{
+ hb_buffer_clear_contents(pHbBuffer);
+
int nMinRunPos = aScriptRun.mnMin;
int nEndRunPos = aScriptRun.mnEnd;
int nRunLen = nEndRunPos - nMinRunPos;
@@ -479,11 +488,6 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
if (nEndRunPos == nLength)
nHbFlags |= HB_BUFFER_FLAG_EOT; /* End-of-text */
- hb_buffer_t *pHbBuffer = hb_buffer_create();
-#if !HB_VERSION_ATLEAST(1, 1, 0)
- static hb_unicode_funcs_t* pHbUnicodeFuncs = getUnicodeFuncs();
- hb_buffer_set_unicode_funcs(pHbBuffer, pHbUnicodeFuncs);
-#endif
if (bVertical)
hb_buffer_set_direction(pHbBuffer, HB_DIRECTION_TTB);
else
@@ -592,11 +596,11 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
aCurrPos.X() += nAdvance;
}
-
- hb_buffer_destroy(pHbBuffer);
}
}
+ hb_buffer_destroy(pHbBuffer);
+
// sort glyphs in visual order
// and then in logical order (e.g. diacritics after cluster start)
// XXX: why?