vcl/inc/CommonSalLayout.hxx | 4 ++ vcl/source/gdi/CommonSalLayout.cxx | 53 +++++++++++++++++++++++++++++++++++-- 2 files changed, 55 insertions(+), 2 deletions(-)
New commits: commit 36d52726e5b496d8f2d2857bb74489a1bed90a1e Author: Martin Hosken <martin_hos...@sil.org> Date: Mon Oct 17 15:22:32 2016 +0100 Add feature support to CommonLayout Change-Id: I19a0e26cefa5e4185df961ae0f6f2f37811ae5bb Reviewed-on: https://gerrit.libreoffice.org/29978 Reviewed-by: Khaled Hosny <khaledho...@eglug.org> Tested-by: Khaled Hosny <khaledho...@eglug.org> diff --git a/vcl/inc/CommonSalLayout.hxx b/vcl/inc/CommonSalLayout.hxx index 513d2b9..abc5ea7 100644 --- a/vcl/inc/CommonSalLayout.hxx +++ b/vcl/inc/CommonSalLayout.hxx @@ -50,6 +50,9 @@ class CommonSalLayout : public GenericSalLayout #else ServerFont& mrServerFont; #endif + OString mLang; + hb_feature_t * mpFeatures; + unsigned int mnFeats; public: #if defined(_WIN32) @@ -63,6 +66,7 @@ public: const ServerFont& getFontData() const { return mrServerFont; }; #endif + void ParseFeatures(OUString name); void SetNeedFallback(ImplLayoutArgs&, sal_Int32, bool); void AdjustLayout(ImplLayoutArgs&) override; bool LayoutText(ImplLayoutArgs&) override; diff --git a/vcl/source/gdi/CommonSalLayout.cxx b/vcl/source/gdi/CommonSalLayout.cxx index 9eb69b5..0966b29 100644 --- a/vcl/source/gdi/CommonSalLayout.cxx +++ b/vcl/source/gdi/CommonSalLayout.cxx @@ -126,6 +126,52 @@ static hb_unicode_funcs_t* getUnicodeFuncs() } #endif +void CommonSalLayout::ParseFeatures(OUString name) +{ + mnFeats = 0; + mpFeatures = 0; + mLang = OString(""); + int nStart = name.indexOf(':'); + if (nStart < 0) + return; + OString oName = OUStringToOString(name, RTL_TEXTENCODING_ASCII_US); + for (int nNext = nStart; nNext > 0; nNext = name.indexOf('&', nNext + 1)) + { + if (name.match("lang=", nNext+1)) + { + int endamp = name.indexOf('&', nNext+1); + int enddelim = name.indexOf(' ', nNext+1); + int end = name.getLength(); + if (endamp < 0) + { + if (enddelim > 0) + end = enddelim; + } + else if (enddelim < 0 || endamp < enddelim) + end = endamp; + else + end = enddelim; + mLang = oName.copy(nNext+6, end-nNext-6); + } + else + ++mnFeats; + } + if (mnFeats == 0) + return; + + mpFeatures = new hb_feature_t[mnFeats]; + mnFeats = 0; + for (int nThis = nStart, nNext = name.indexOf('&', nStart+1); nThis > 0; nThis = nNext, nNext = name.indexOf('&', nNext + 1)) + { + if (!name.match("lang=", nThis+1)) + { + int end = nNext > 0 ? nNext : name.getLength(); + if (hb_feature_from_string(oName.getStr() + nThis + 1, end - nThis - 1, &mpFeatures[mnFeats])) + ++mnFeats; + } + } +} + #if defined(_WIN32) CommonSalLayout::CommonSalLayout(WinSalGraphics* WSL, WinFontInstance& rWinFontInstance, const WinFontFace& rWinFontFace) : mhFont((HFONT)GetCurrentObject(WSL->getHDC(), OBJ_FONT)), @@ -155,6 +201,7 @@ CommonSalLayout::CommonSalLayout(WinSalGraphics* WSL, WinFontInstance& rWinFontI } scaleHbFont(mpHbFont, mrFontSelData); + ParseFeatures(mrFontSelData.maTargetName); } void CommonSalLayout::InitFont() const @@ -186,6 +233,7 @@ CommonSalLayout::CommonSalLayout(const CoreTextStyle& rCoreTextStyle) } scaleHbFont(mpHbFont, mrFontSelData); + ParseFeatures(mrFontSelData.maTargetName); } #else @@ -205,6 +253,7 @@ CommonSalLayout::CommonSalLayout(ServerFont& rServerFont) } scaleHbFont(mpHbFont, mrFontSelData); + ParseFeatures(mrFontSelData.maTargetName); } #endif @@ -416,7 +465,7 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs) // hb_language_from_string() accept ISO639-3 language tag except for Chinese. LanguageTag &rTag = rArgs.maLanguageTag; - OString sLanguage = OUStringToOString(rTag.getBcp47(), RTL_TEXTENCODING_ASCII_US); + OString sLanguage = mLang.getLength() ? mLang : OUStringToOString(rTag.getBcp47(), RTL_TEXTENCODING_ASCII_US); bool bVertical = false; if ((rArgs.mnFlags & SalLayoutFlags::Vertical) && @@ -449,7 +498,7 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs) #if HB_VERSION_ATLEAST(0, 9, 42) hb_buffer_set_cluster_level(pHbBuffer, HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS); #endif - hb_shape(mpHbFont, pHbBuffer, nullptr, 0); + hb_shape(mpHbFont, pHbBuffer, mpFeatures, mnFeats); int nRunGlyphCount = hb_buffer_get_length(pHbBuffer); hb_glyph_info_t *pHbGlyphInfos = hb_buffer_get_glyph_infos(pHbBuffer, nullptr); _______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/libreoffice-commits