diff options
author | ckocagil <ckocagil@chromium.org> | 2014-10-29 13:47:33 -0700 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2014-10-29 20:48:36 +0000 |
commit | 31227048b11f0bc84a295ff82b5056599afa07f7 (patch) | |
tree | 3b6ffb65a5077fcf987f93a6d6b1484431c8c5f8 /ui/gfx/render_text_harfbuzz.cc | |
parent | f17aa9ef58fbc4711cfc7a0c93cc921affb05d79 (diff) | |
download | chromium_src-31227048b11f0bc84a295ff82b5056599afa07f7.zip chromium_src-31227048b11f0bc84a295ff82b5056599afa07f7.tar.gz chromium_src-31227048b11f0bc84a295ff82b5056599afa07f7.tar.bz2 |
RenderTextHarfBuzz: Try fallback fonts of the Uniscribe font while shaping
This CL also fixes a Linux issue where a fallback font could be skipped.
BUG=426052
R=msw
Review URL: https://codereview.chromium.org/674233003
Cr-Commit-Position: refs/heads/master@{#301920}
Diffstat (limited to 'ui/gfx/render_text_harfbuzz.cc')
-rw-r--r-- | ui/gfx/render_text_harfbuzz.cc | 43 |
1 files changed, 32 insertions, 11 deletions
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc index 642c76e..1aba788 100644 --- a/ui/gfx/render_text_harfbuzz.cc +++ b/ui/gfx/render_text_harfbuzz.cc @@ -1091,6 +1091,7 @@ bool RenderTextHarfBuzz::CompareFamily( void RenderTextHarfBuzz::ShapeRun(internal::TextRunHarfBuzz* run) { const Font& primary_font = font_list().GetPrimaryFont(); + const std::string primary_family = primary_font.GetFontName(); run->font_size = primary_font.GetFontSize(); std::string best_family; @@ -1105,26 +1106,46 @@ void RenderTextHarfBuzz::ShapeRun(internal::TextRunHarfBuzz* run) { #if defined(OS_WIN) Font uniscribe_font; + std::string uniscribe_family; const base::char16* run_text = &(GetLayoutText()[run->range.start()]); if (GetUniscribeFallbackFont(primary_font, run_text, run->range.length(), - &uniscribe_font) && - CompareFamily(run, uniscribe_font.GetFontName(), - uniscribe_font.GetFontRenderParams(), - &best_family, &best_render_params, &best_missing_glyphs)) - return; + &uniscribe_font)) { + uniscribe_family = uniscribe_font.GetFontName(); + if (CompareFamily(run, uniscribe_family, + uniscribe_font.GetFontRenderParams(), + &best_family, &best_render_params, &best_missing_glyphs)) + return; + } #endif - // Skip the first fallback font, which is |primary_font|. std::vector<std::string> fallback_families = - GetFallbackFontFamilies(primary_font.GetFontName()); - for (size_t i = 1; i < fallback_families.size(); ++i) { + GetFallbackFontFamilies(primary_family); + +#if defined(OS_WIN) + // Append fonts in the fallback list of the Uniscribe font. + if (!uniscribe_family.empty()) { + std::vector<std::string> uniscribe_fallbacks = + GetFallbackFontFamilies(uniscribe_family); + fallback_families.insert(fallback_families.end(), + uniscribe_fallbacks.begin(), uniscribe_fallbacks.end()); + } +#endif + + // Try shaping with the fallback fonts. + for (auto family : fallback_families) { + if (family == primary_family) + continue; +#if defined(OS_WIN) + if (family == uniscribe_family) + continue; +#endif FontRenderParamsQuery query(false); - query.families.push_back(fallback_families[i]); + query.families.push_back(family); query.pixel_size = run->font_size; query.style = run->font_style; FontRenderParams fallback_render_params = GetFontRenderParams(query, NULL); - if (CompareFamily(run, fallback_families[i], fallback_render_params, - &best_family, &best_render_params, &best_missing_glyphs)) + if (CompareFamily(run, family, fallback_render_params, &best_family, + &best_render_params, &best_missing_glyphs)) return; } |