diff options
author | Khaled Hosny <khaledhosny@eglug.org> | 2016-10-17 19:59:23 +0200 |
---|---|---|
committer | Khaled Hosny <khaledhosny@eglug.org> | 2016-10-18 20:41:34 +0200 |
commit | 8b9ec421accf344e0e6921c35ba53d8ff0b2de40 (patch) | |
tree | 30f38b8e0e26ba9666926a751f6cc3716e62c166 /vcl | |
parent | 970db61951beebc44ca3dfff6dc14ad12733d97c (diff) |
Fix debug build and few cleanups
Change-Id: I805962667c3ef2dcaf07a0acebeacca74c74892a
Diffstat (limited to 'vcl')
-rw-r--r-- | vcl/inc/CommonSalLayout.hxx | 8 | ||||
-rw-r--r-- | vcl/source/gdi/CommonSalLayout.cxx | 34 |
2 files changed, 20 insertions, 22 deletions
diff --git a/vcl/inc/CommonSalLayout.hxx b/vcl/inc/CommonSalLayout.hxx index abc5ea723ef4..cd43becfc75b 100644 --- a/vcl/inc/CommonSalLayout.hxx +++ b/vcl/inc/CommonSalLayout.hxx @@ -50,9 +50,10 @@ class CommonSalLayout : public GenericSalLayout #else ServerFont& mrServerFont; #endif - OString mLang; - hb_feature_t * mpFeatures; - unsigned int mnFeats; + + void ParseFeatures(const OUString& name); + OString msLanguage; + std::vector<hb_feature_t> maFeatures; public: #if defined(_WIN32) @@ -66,7 +67,6 @@ 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 0966b29290db..f6088b821b4f 100644 --- a/vcl/source/gdi/CommonSalLayout.cxx +++ b/vcl/source/gdi/CommonSalLayout.cxx @@ -126,18 +126,16 @@ static hb_unicode_funcs_t* getUnicodeFuncs() } #endif -void CommonSalLayout::ParseFeatures(OUString name) +void CommonSalLayout::ParseFeatures(const OUString& name) { - mnFeats = 0; - mpFeatures = 0; - mLang = OString(""); + int nFeatures = 0; 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)) + if (name.match("lang=", nNext + 1)) { int endamp = name.indexOf('&', nNext+1); int enddelim = name.indexOf(' ', nNext+1); @@ -151,23 +149,23 @@ void CommonSalLayout::ParseFeatures(OUString name) end = endamp; else end = enddelim; - mLang = oName.copy(nNext+6, end-nNext-6); + msLanguage = oName.copy(nNext + 6, end - nNext - 6); } else - ++mnFeats; + ++nFeatures; } - if (mnFeats == 0) + if (nFeatures == 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)) + maFeatures.reserve(nFeatures); + for (int nThis = nStart, nNext = name.indexOf('&', nStart + 1); nThis > 0; nThis = nNext, nNext = name.indexOf('&', nNext + 1)) { - if (!name.match("lang=", nThis+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; + hb_feature_t aFeature; + if (hb_feature_from_string(oName.getStr() + nThis + 1, end - nThis - 1, &aFeature)) + maFeatures.push_back(aFeature); } } } @@ -463,9 +461,9 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs) int nRunLen = nEndRunPos - nMinRunPos; aHbScript = hb_icu_script_to_script(aScriptRun.maScript); - // hb_language_from_string() accept ISO639-3 language tag except for Chinese. - LanguageTag &rTag = rArgs.maLanguageTag; - OString sLanguage = mLang.getLength() ? mLang : OUStringToOString(rTag.getBcp47(), RTL_TEXTENCODING_ASCII_US); + OString sLanguage = msLanguage; + if (sLanguage.isEmpty()) + sLanguage = OUStringToOString(rArgs.maLanguageTag.getBcp47(), RTL_TEXTENCODING_ASCII_US); bool bVertical = false; if ((rArgs.mnFlags & SalLayoutFlags::Vertical) && @@ -498,7 +496,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, mpFeatures, mnFeats); + hb_shape(mpHbFont, pHbBuffer, maFeatures.data(), maFeatures.size()); int nRunGlyphCount = hb_buffer_get_length(pHbBuffer); hb_glyph_info_t *pHbGlyphInfos = hb_buffer_get_glyph_infos(pHbBuffer, nullptr); |