Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(520)

Unified Diff: ui/gfx/render_text_harfbuzz.cc

Issue 440213004: Support float widths in RenderTextHarfBuzz. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Update RenderTextWin minimally. Created 6 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « ui/gfx/render_text_harfbuzz.h ('k') | ui/gfx/render_text_win.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: ui/gfx/render_text_harfbuzz.cc
diff --git a/ui/gfx/render_text_harfbuzz.cc b/ui/gfx/render_text_harfbuzz.cc
index a1aced102e8d93dface016e39cc224fa58edd455..c808376d366d0a1d5b441b3673081c93621e94ac 100644
--- a/ui/gfx/render_text_harfbuzz.cc
+++ b/ui/gfx/render_text_harfbuzz.cc
@@ -433,8 +433,8 @@ void GetClusterAtImpl(size_t pos,
namespace internal {
TextRunHarfBuzz::TextRunHarfBuzz()
- : width(0),
- preceding_run_widths(0),
+ : width(0.0f),
+ preceding_run_widths(0.0f),
is_rtl(false),
level(0),
script(USCRIPT_INVALID_CODE),
@@ -497,8 +497,10 @@ Range TextRunHarfBuzz::GetGraphemeBounds(
base::i18n::BreakIterator* grapheme_iterator,
size_t text_index) {
DCHECK_LT(text_index, range.end());
+ // TODO(msw): Support floating point grapheme bounds.
+ const int preceding_run_widths_int = SkScalarRoundToInt(preceding_run_widths);
if (glyph_count == 0)
- return Range(preceding_run_widths, preceding_run_widths + width);
+ return Range(preceding_run_widths_int, preceding_run_widths_int + width);
Range chars;
Range glyphs;
@@ -532,13 +534,13 @@ Range TextRunHarfBuzz::GetGraphemeBounds(
cluster_width * before / static_cast<float>(total));
const int grapheme_end_x = cluster_begin_x + static_cast<int>(0.5f +
cluster_width * (before + 1) / static_cast<float>(total));
- return Range(preceding_run_widths + grapheme_begin_x,
- preceding_run_widths + grapheme_end_x);
+ return Range(preceding_run_widths_int + grapheme_begin_x,
+ preceding_run_widths_int + grapheme_end_x);
}
}
- return Range(preceding_run_widths + cluster_begin_x,
- preceding_run_widths + cluster_end_x);
+ return Range(preceding_run_widths_int + cluster_begin_x,
+ preceding_run_widths_int + cluster_end_x);
}
} // namespace internal
@@ -550,6 +552,11 @@ RenderTextHarfBuzz::RenderTextHarfBuzz()
RenderTextHarfBuzz::~RenderTextHarfBuzz() {}
Size RenderTextHarfBuzz::GetStringSize() {
+ const SizeF size_f = GetStringSizeF();
+ return Size(std::ceil(size_f.width()), size_f.height());
+}
+
+SizeF RenderTextHarfBuzz::GetStringSizeF() {
EnsureLayout();
return lines()[0].size;
}
@@ -789,7 +796,7 @@ void RenderTextHarfBuzz::EnsureLayout() {
ShapeRun(runs_[i]);
// Precalculate run width information.
- size_t preceding_run_widths = 0;
+ float preceding_run_widths = 0.0f;
for (size_t i = 0; i < runs_.size(); ++i) {
internal::TextRunHarfBuzz* run = runs_[visual_to_logical_[i]];
run->preceding_run_widths = preceding_run_widths;
@@ -826,7 +833,7 @@ void RenderTextHarfBuzz::EnsureLayout() {
lines[0].size.set_width(lines[0].size.width() + run.width);
lines[0].size.set_height(std::max(lines[0].size.height(),
- SkScalarRoundToInt(metrics.fDescent - metrics.fAscent)));
+ metrics.fDescent - metrics.fAscent));
lines[0].baseline = std::max(lines[0].baseline,
SkScalarRoundToInt(-metrics.fAscent));
}
@@ -1071,7 +1078,7 @@ void RenderTextHarfBuzz::ShapeRun(internal::TextRunHarfBuzz* run) {
}
run->glyph_count = 0;
- run->width = 0;
+ run->width = 0.0f;
}
bool RenderTextHarfBuzz::ShapeRunWithFont(internal::TextRunHarfBuzz* run,
@@ -1109,17 +1116,14 @@ bool RenderTextHarfBuzz::ShapeRunWithFont(internal::TextRunHarfBuzz* run,
run->glyphs.reset(new uint16[run->glyph_count]);
run->glyph_to_char.resize(run->glyph_count);
run->positions.reset(new SkPoint[run->glyph_count]);
- run->width = 0;
+ run->width = 0.0f;
for (size_t i = 0; i < run->glyph_count; ++i) {
run->glyphs[i] = infos[i].codepoint;
run->glyph_to_char[i] = infos[i].cluster;
- const int x_offset =
- SkScalarRoundToInt(SkFixedToScalar(hb_positions[i].x_offset));
- const int y_offset =
- SkScalarRoundToInt(SkFixedToScalar(hb_positions[i].y_offset));
+ const int x_offset = SkFixedToScalar(hb_positions[i].x_offset);
+ const int y_offset = SkFixedToScalar(hb_positions[i].y_offset);
run->positions[i].set(run->width + x_offset, -y_offset);
- run->width +=
- SkScalarRoundToInt(SkFixedToScalar(hb_positions[i].x_advance));
+ run->width += SkFixedToScalar(hb_positions[i].x_advance);
}
hb_buffer_destroy(buffer);
« no previous file with comments | « ui/gfx/render_text_harfbuzz.h ('k') | ui/gfx/render_text_win.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698