diff options
author | Khaled Hosny <khaledhosny@eglug.org> | 2016-10-20 16:37:22 +0200 |
---|---|---|
committer | Khaled Hosny <khaledhosny@eglug.org> | 2016-10-20 16:57:23 +0200 |
commit | d5424208a5b63a9d5ac658279c3f9824aa38a2d6 (patch) | |
tree | 8a1725955071975eaecaef5ddec77210d78fb236 /vcl | |
parent | 7854d35cd8172b201f1f3ad247860f242e5cb06b (diff) |
Reuse the HarfBuzz buffer as much as possible
Less allocations in case we have many sub runs.
Change-Id: I50d4a57702c030c185fc7edef576c64d739a6194
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/source/gdi/CommonSalLayout.cxx | 18 |
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? |