Kaydet (Commit) 970db619 authored tarafından Martin Hosken's avatar Martin Hosken Kaydeden (comit) Khaled Hosny

Add feature support to CommonLayout

Change-Id: I19a0e26cefa5e4185df961ae0f6f2f37811ae5bb
Reviewed-on: https://gerrit.libreoffice.org/29978Reviewed-by: 's avatarKhaled Hosny <khaledhosny@eglug.org>
Tested-by: 's avatarKhaled Hosny <khaledhosny@eglug.org>
üst 3a304a4e
...@@ -50,6 +50,9 @@ class CommonSalLayout : public GenericSalLayout ...@@ -50,6 +50,9 @@ class CommonSalLayout : public GenericSalLayout
#else #else
ServerFont& mrServerFont; ServerFont& mrServerFont;
#endif #endif
OString mLang;
hb_feature_t * mpFeatures;
unsigned int mnFeats;
public: public:
#if defined(_WIN32) #if defined(_WIN32)
...@@ -63,6 +66,7 @@ public: ...@@ -63,6 +66,7 @@ public:
const ServerFont& getFontData() const { return mrServerFont; }; const ServerFont& getFontData() const { return mrServerFont; };
#endif #endif
void ParseFeatures(OUString name);
void SetNeedFallback(ImplLayoutArgs&, sal_Int32, bool); void SetNeedFallback(ImplLayoutArgs&, sal_Int32, bool);
void AdjustLayout(ImplLayoutArgs&) override; void AdjustLayout(ImplLayoutArgs&) override;
bool LayoutText(ImplLayoutArgs&) override; bool LayoutText(ImplLayoutArgs&) override;
......
...@@ -126,6 +126,52 @@ static hb_unicode_funcs_t* getUnicodeFuncs() ...@@ -126,6 +126,52 @@ static hb_unicode_funcs_t* getUnicodeFuncs()
} }
#endif #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) #if defined(_WIN32)
CommonSalLayout::CommonSalLayout(WinSalGraphics* WSL, WinFontInstance& rWinFontInstance, const WinFontFace& rWinFontFace) CommonSalLayout::CommonSalLayout(WinSalGraphics* WSL, WinFontInstance& rWinFontInstance, const WinFontFace& rWinFontFace)
: mhFont((HFONT)GetCurrentObject(WSL->getHDC(), OBJ_FONT)), : mhFont((HFONT)GetCurrentObject(WSL->getHDC(), OBJ_FONT)),
...@@ -155,6 +201,7 @@ CommonSalLayout::CommonSalLayout(WinSalGraphics* WSL, WinFontInstance& rWinFontI ...@@ -155,6 +201,7 @@ CommonSalLayout::CommonSalLayout(WinSalGraphics* WSL, WinFontInstance& rWinFontI
} }
scaleHbFont(mpHbFont, mrFontSelData); scaleHbFont(mpHbFont, mrFontSelData);
ParseFeatures(mrFontSelData.maTargetName);
} }
void CommonSalLayout::InitFont() const void CommonSalLayout::InitFont() const
...@@ -186,6 +233,7 @@ CommonSalLayout::CommonSalLayout(const CoreTextStyle& rCoreTextStyle) ...@@ -186,6 +233,7 @@ CommonSalLayout::CommonSalLayout(const CoreTextStyle& rCoreTextStyle)
} }
scaleHbFont(mpHbFont, mrFontSelData); scaleHbFont(mpHbFont, mrFontSelData);
ParseFeatures(mrFontSelData.maTargetName);
} }
#else #else
...@@ -205,6 +253,7 @@ CommonSalLayout::CommonSalLayout(ServerFont& rServerFont) ...@@ -205,6 +253,7 @@ CommonSalLayout::CommonSalLayout(ServerFont& rServerFont)
} }
scaleHbFont(mpHbFont, mrFontSelData); scaleHbFont(mpHbFont, mrFontSelData);
ParseFeatures(mrFontSelData.maTargetName);
} }
#endif #endif
...@@ -416,7 +465,7 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs) ...@@ -416,7 +465,7 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
// hb_language_from_string() accept ISO639-3 language tag except for Chinese. // hb_language_from_string() accept ISO639-3 language tag except for Chinese.
LanguageTag &rTag = rArgs.maLanguageTag; 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; bool bVertical = false;
if ((rArgs.mnFlags & SalLayoutFlags::Vertical) && if ((rArgs.mnFlags & SalLayoutFlags::Vertical) &&
...@@ -449,7 +498,7 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs) ...@@ -449,7 +498,7 @@ bool CommonSalLayout::LayoutText(ImplLayoutArgs& rArgs)
#if HB_VERSION_ATLEAST(0, 9, 42) #if HB_VERSION_ATLEAST(0, 9, 42)
hb_buffer_set_cluster_level(pHbBuffer, HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS); hb_buffer_set_cluster_level(pHbBuffer, HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS);
#endif #endif
hb_shape(mpHbFont, pHbBuffer, nullptr, 0); hb_shape(mpHbFont, pHbBuffer, mpFeatures, mnFeats);
int nRunGlyphCount = hb_buffer_get_length(pHbBuffer); int nRunGlyphCount = hb_buffer_get_length(pHbBuffer);
hb_glyph_info_t *pHbGlyphInfos = hb_buffer_get_glyph_infos(pHbBuffer, nullptr); hb_glyph_info_t *pHbGlyphInfos = hb_buffer_get_glyph_infos(pHbBuffer, nullptr);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment