diff options
author | ckocagil@chromium.org <ckocagil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-19 03:27:57 +0000 |
---|---|---|
committer | ckocagil@chromium.org <ckocagil@chromium.org@0039d316-1c4b-4281-b951-d872f2087c98> | 2014-08-19 03:29:30 +0000 |
commit | 847ee88f3dd51a3c197016f27e5696ed3e3a90bf (patch) | |
tree | 5d6545cf7cace3b689cf3d4b369fae59cf649308 /ui/gfx/render_text_harfbuzz.cc | |
parent | 1eaf664c4bd32593ccce453beacf44e8cb7b46de (diff) | |
download | chromium_src-847ee88f3dd51a3c197016f27e5696ed3e3a90bf.zip chromium_src-847ee88f3dd51a3c197016f27e5696ed3e3a90bf.tar.gz chromium_src-847ee88f3dd51a3c197016f27e5696ed3e3a90bf.tar.bz2 |
RenderTextHarfBuzz: Set font render parameters in font data functions
- Properly pass font render settings to Skia font data functions. Otherwise Skia always returns rounded values.
- If subpixel positioning is off, round the glyph positions to match Pango's rounding logic.
BUG=402715,402374,402347
TEST=On Linux, character positions in UI text (address bar, infobars, tab titles) should be identical with --enable-harfbuzz-rendertext and --disable-harfbuzz-rendertext.
NOTRY=true
Review URL: https://codereview.chromium.org/480533002
Cr-Commit-Position: refs/heads/master@{#290474}
git-svn-id: svn://svn.chromium.org/chrome/trunk/src@290474 0039d316-1c4b-4281-b951-d872f2087c98
Diffstat (limited to 'ui/gfx/render_text_harfbuzz.cc')
-rw-r--r-- | ui/gfx/render_text_harfbuzz.cc | 29 |
1 files changed, 20 insertions, 9 deletions
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc index 01f75e3..a8f6f24 100644 --- a/ui/gfx/render_text_harfbuzz.cc +++ b/ui/gfx/render_text_harfbuzz.cc @@ -269,7 +269,10 @@ class HarfBuzzFace { }; // Creates a HarfBuzz font from the given Skia face and text size. -hb_font_t* CreateHarfBuzzFont(SkTypeface* skia_face, int text_size) { +hb_font_t* CreateHarfBuzzFont(SkTypeface* skia_face, + int text_size, + const FontRenderParams& params, + bool background_is_transparent) { typedef std::pair<HarfBuzzFace, GlyphCache> FaceCache; // TODO(ckocagil): This shouldn't grow indefinitely. Maybe use base::MRUCache? @@ -285,6 +288,9 @@ hb_font_t* CreateHarfBuzzFont(SkTypeface* skia_face, int text_size) { FontData* hb_font_data = new FontData(&face_cache->second); hb_font_data->paint_.setTypeface(skia_face); hb_font_data->paint_.setTextSize(text_size); + // TODO(ckocagil): Do we need to update these params later? + internal::ApplyRenderParams(params, background_is_transparent, + &hb_font_data->paint_); hb_font_set_funcs(harfbuzz_font, g_font_funcs.Get().get(), hb_font_data, DeleteByType<FontData>); hb_font_make_immutable(harfbuzz_font); @@ -871,13 +877,6 @@ void RenderTextHarfBuzz::DrawVisualText(Canvas* canvas) { internal::SkiaTextRenderer renderer(canvas); ApplyFadeEffects(&renderer); ApplyTextShadows(&renderer); - -#if defined(OS_WIN) || defined(OS_LINUX) - renderer.SetFontRenderParams( - font_list().GetPrimaryFont().GetFontRenderParams(), - background_is_transparent()); -#endif - ApplyCompositionAndSelectionStyles(); int current_x = 0; @@ -886,6 +885,10 @@ void RenderTextHarfBuzz::DrawVisualText(Canvas* canvas) { const internal::TextRunHarfBuzz& run = *runs_[visual_to_logical_[i]]; renderer.SetTypeface(run.skia_face.get()); renderer.SetTextSize(run.font_size); +#if defined(OS_WIN) || defined(OS_LINUX) + renderer.SetFontRenderParams(run.render_params, + background_is_transparent()); +#endif Vector2d origin = line_offset + Vector2d(current_x, lines()[0].baseline); scoped_ptr<SkPoint[]> positions(new SkPoint[run.glyph_count]); @@ -1113,8 +1116,13 @@ bool RenderTextHarfBuzz::ShapeRunWithFont(internal::TextRunHarfBuzz* run, if (skia_face == NULL) return false; run->skia_face = skia_face; + FontRenderParamsQuery query(false); + query.families.push_back(font_family); + query.pixel_size = run->font_size; + query.style = run->font_style; + run->render_params = GetFontRenderParams(query, NULL); hb_font_t* harfbuzz_font = CreateHarfBuzzFont(run->skia_face.get(), - run->font_size); + run->font_size, run->render_params, background_is_transparent()); // Create a HarfBuzz buffer and add the string to be shaped. The HarfBuzz // buffer holds our text, run information to be used by the shaping engine, @@ -1148,6 +1156,9 @@ bool RenderTextHarfBuzz::ShapeRunWithFont(internal::TextRunHarfBuzz* run, const int y_offset = SkFixedToScalar(hb_positions[i].y_offset); run->positions[i].set(run->width + x_offset, -y_offset); run->width += SkFixedToScalar(hb_positions[i].x_advance); + // If subpixel positioning isn't enabled, round the glyph x coordinates. + if (!run->render_params.subpixel_positioning) + run->width = std::floor(run->width + 0.5f); } hb_buffer_destroy(buffer); |