[Libreoffice-commits] core.git: Branch 'feature/commonsallayout' - vcl/inc vcl/source
Martin Hosken
martin_hosken at sil.org
Mon Oct 17 17:00:15 UTC 2016
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_hosken at 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 <khaledhosny at eglug.org>
Tested-by: Khaled Hosny <khaledhosny at 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);
More information about the Libreoffice-commits
mailing list