Kaydet (Commit) f48cbaac authored tarafından Khaled Hosny's avatar Khaled Hosny

tdf#103103: Many Arabic fonts dont render correctly

Revert the remaining bits of 1da9b4c2,
the rest was reverted in 6323e662.

This break many assumptions made by GenericSalLayout::ApplyDXArray().

Change-Id: I25fbafe06032ab1e8860df6c5932a7157575aa32
üst faddf2ae
...@@ -21,7 +21,6 @@ ...@@ -21,7 +21,6 @@
#include <sallayout.hxx> #include <sallayout.hxx>
#include <salgdi.hxx> #include <salgdi.hxx>
#include <scrptrun.h> #include <scrptrun.h>
#include <limits>
#include <i18nlangtag/mslangid.hxx> #include <i18nlangtag/mslangid.hxx>
...@@ -309,16 +308,14 @@ static unsigned int unicodeDecomposeCompatibility(hb_unicode_funcs_t* /*ufuncs*/ ...@@ -309,16 +308,14 @@ static unsigned int unicodeDecomposeCompatibility(hb_unicode_funcs_t* /*ufuncs*/
{ {
return 0; return 0;
} }
#endif
static hb_unicode_funcs_t* getUnicodeFuncs() static hb_unicode_funcs_t* getUnicodeFuncs()
{ {
static hb_unicode_funcs_t* ufuncs = hb_unicode_funcs_create(hb_icu_get_unicode_funcs()); static hb_unicode_funcs_t* ufuncs = hb_unicode_funcs_create(hb_icu_get_unicode_funcs());
#if !HB_VERSION_ATLEAST(1, 1, 0)
hb_unicode_funcs_set_decompose_compatibility_func(ufuncs, unicodeDecomposeCompatibility, nullptr, nullptr); hb_unicode_funcs_set_decompose_compatibility_func(ufuncs, unicodeDecomposeCompatibility, nullptr, nullptr);
#endif
return ufuncs; return ufuncs;
} }
#endif
class HbLayoutEngine : public ServerFontLayoutEngine class HbLayoutEngine : public ServerFontLayoutEngine
{ {
...@@ -492,8 +489,8 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs) ...@@ -492,8 +489,8 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
nHbFlags |= HB_BUFFER_FLAG_EOT; /* End-of-text */ nHbFlags |= HB_BUFFER_FLAG_EOT; /* End-of-text */
hb_buffer_t *pHbBuffer = hb_buffer_create(); hb_buffer_t *pHbBuffer = hb_buffer_create();
static hb_unicode_funcs_t* pHbUnicodeFuncs = getUnicodeFuncs();
#if !HB_VERSION_ATLEAST(1, 1, 0) #if !HB_VERSION_ATLEAST(1, 1, 0)
static hb_unicode_funcs_t* pHbUnicodeFuncs = getUnicodeFuncs();
hb_buffer_set_unicode_funcs(pHbBuffer, pHbUnicodeFuncs); hb_buffer_set_unicode_funcs(pHbBuffer, pHbUnicodeFuncs);
#endif #endif
hb_buffer_set_direction(pHbBuffer, bRightToLeft ? HB_DIRECTION_RTL: HB_DIRECTION_LTR); hb_buffer_set_direction(pHbBuffer, bRightToLeft ? HB_DIRECTION_RTL: HB_DIRECTION_LTR);
...@@ -503,9 +500,6 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs) ...@@ -503,9 +500,6 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
hb_buffer_add_utf16( hb_buffer_add_utf16(
pHbBuffer, reinterpret_cast<uint16_t const *>(pStr), nLength, pHbBuffer, reinterpret_cast<uint16_t const *>(pStr), nLength,
nMinRunPos, nRunLen); nMinRunPos, nRunLen);
#if HB_VERSION_ATLEAST(0, 9, 42)
hb_buffer_set_cluster_level(pHbBuffer, HB_BUFFER_CLUSTER_LEVEL_MONOTONE_CHARACTERS);
#endif
hb_shape(pHbFont, pHbBuffer, nullptr, 0); hb_shape(pHbFont, pHbBuffer, nullptr, 0);
int nRunGlyphCount = hb_buffer_get_length(pHbBuffer); int nRunGlyphCount = hb_buffer_get_length(pHbBuffer);
...@@ -554,12 +548,15 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs) ...@@ -554,12 +548,15 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
// but usually harmless), so we try to sniff what HarfBuzz thinks // but usually harmless), so we try to sniff what HarfBuzz thinks
// about this glyph by checking if it gives it a zero advance // about this glyph by checking if it gives it a zero advance
// width. // width.
// * If the font has no GDEF table, we then check the unicode class // * If the font has no GDEF table, we just check if the glyph has
// of the glyph. If it is a non spacing mark then the glyph is a // zero advance width, but this is stupid and can be wrong. A
// diacritic. This is only done if the HarfBuzz version is >= 0.9.42 // better way would to check the character's Unicode combining
// Else, we fallback to setting bDiacritic to true if the x advance // class, but unfortunately HarfBuzz gives combining marks the
// of the glyph is zero. This maybe wrong in some cases but needs to // cluster value of its base character, so nCharPos will be
// be kept until the base version of HarfBuzz can be updated. // pointing to the wrong character (but HarfBuzz might change
// this in the future).
// Newer versions of HarfBuzz can control this behaviour with
// hb_buffer_set_cluster_level().
bool bDiacritic = false; bool bDiacritic = false;
if (hb_ot_layout_has_glyph_classes(mpHbFace)) if (hb_ot_layout_has_glyph_classes(mpHbFace))
{ {
...@@ -570,14 +567,9 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs) ...@@ -570,14 +567,9 @@ bool HbLayoutEngine::Layout(ServerFontLayout& rLayout, ImplLayoutArgs& rArgs)
} }
else else
{ {
#if HB_VERSION_ATLEAST(0, 9, 42)
if(hb_unicode_general_category (pHbUnicodeFuncs, aChar) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK)
bDiacritic = true;
#else
// the font lacks GDEF table // the font lacks GDEF table
if (pHbPositions[i].x_advance == 0) if (pHbPositions[i].x_advance == 0)
bDiacritic = true; bDiacritic = true;
#endif
} }
if (bDiacritic) if (bDiacritic)
......
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