Commit f5b24fda authored by Ella Ge's avatar Ella Ge Committed by Commit Bot

Fix text autosizer line height with zoomed

TextAutosizer::ComputeAutosizedFontSize are used in both font_builder and
computed_style. The size passed in from font_builder is computedsize,
which has zoom factor applied. But in ComputedStyle::SetTextAutosizingMultiplier,
zoom factor doesn't.
And also, kPleasantSize is hard-coded css pixel (without zoom factor), and it
was used in calculation with computed_size(with zoom factor).
The inconsistancy causes line height incorrect when multiplier applied(crbug/871124),
and also text sometime lost scaling(crbug/871054)

This CL correct the variable in ComputeAutosizedFontSize to computed_size,
and pass in effective_zoom, so the sizes are computed in correct scale.


Bug: 871054, 871124
Change-Id: Icf546795663b76af3cd03e4e42da96483eb83af7
Reviewed-on: https://chromium-review.googlesource.com/1169972Reviewed-by: default avatarPhilip Rogers <pdr@chromium.org>
Commit-Queue: Philip Rogers <pdr@chromium.org>
Cr-Commit-Position: refs/heads/master@{#582447}
parent 3c854146
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=800">
<style>
html { font-size: 16px; }
body { width: 800px; margin: 0; overflow: hidden; }
</style>
<script>
eventSender.setPageZoomFactor(2);
</script>
</head>
<body>
<div style="font-size: 2.5rem; line-height: 1">
When this text is autosized to 40px, the line heights of the nested inline elements below should increase in strict proportion.
<b>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</b>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
<b><i>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</i></b>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</body>
</html>
\ No newline at end of file
<!DOCTYPE html>
<html>
<head>
<meta name="viewport" content="width=800">
<style>
html { font-size: 16px; }
body { width: 800px; margin: 0; overflow: hidden; }
</style>
<script src="resources/autosizingTest.js"></script>
<script>
eventSender.setPageZoomFactor(2);
</script>
</head>
<body>
<div style="line-height: 1em">
When this text is autosized to 40px, the line heights of the nested inline elements below should increase in strict proportion.
<b>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</b>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
<b><i>Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.</i></b>
Lorem ipsum dolor sit amet, consectetur adipisicing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua.
</div>
</body>
</html>
\ No newline at end of file
......@@ -344,7 +344,7 @@ void FontBuilder::UpdateAdjustedSize(FontDescription& font_description,
font_description, style.EffectiveZoom(), adjusted_size);
adjusted_size = TextAutosizer::ComputeAutosizedFontSize(
adjusted_size, style.TextAutosizingMultiplier());
adjusted_size, style.TextAutosizingMultiplier(), style.EffectiveZoom());
font_description.SetAdjustedSize(adjusted_size);
}
......@@ -354,7 +354,7 @@ void FontBuilder::UpdateComputedSize(FontDescription& font_description,
GetComputedSizeFromSpecifiedSize(font_description, style.EffectiveZoom(),
font_description.SpecifiedSize());
computed_size = TextAutosizer::ComputeAutosizedFontSize(
computed_size, style.TextAutosizingMultiplier());
computed_size, style.TextAutosizingMultiplier(), style.EffectiveZoom());
font_description.SetComputedSize(computed_size);
}
......
......@@ -1386,12 +1386,13 @@ TextAutosizer::DeferUpdatePageInfo::~DeferUpdatePageInfo() {
}
}
float TextAutosizer::ComputeAutosizedFontSize(float specified_size,
float multiplier) {
float TextAutosizer::ComputeAutosizedFontSize(float computed_size,
float multiplier,
float effective_zoom) {
DCHECK_GE(multiplier, 0);
// Somewhat arbitrary "pleasant" font size.
const float kPleasantSize = 16;
const float kPleasantSize = 16 * effective_zoom;
// Multiply fonts that the page author has specified to be larger than
// pleasantSize by less and less, until huge fonts are not increased at all.
......@@ -1405,19 +1406,19 @@ float TextAutosizer::ComputeAutosizedFontSize(float specified_size,
// then every 1px increase in specifiedSize increases computedSize by 1px).
const float kGradientAfterPleasantSize = 0.5;
float computed_size;
float auto_sized_size;
// Skip linear backoff for multipliers that shrink the size or when the font
// sizes are small.
if (multiplier <= 1 || specified_size <= kPleasantSize) {
computed_size = multiplier * specified_size;
if (multiplier <= 1 || computed_size <= kPleasantSize) {
auto_sized_size = multiplier * computed_size;
} else {
computed_size =
auto_sized_size =
multiplier * kPleasantSize +
kGradientAfterPleasantSize * (specified_size - kPleasantSize);
if (computed_size < specified_size)
computed_size = specified_size;
kGradientAfterPleasantSize * (computed_size - kPleasantSize);
if (auto_sized_size < computed_size)
auto_sized_size = computed_size;
}
return computed_size;
return auto_sized_size;
}
void TextAutosizer::CheckSuperclusterConsistency() {
......
......@@ -64,7 +64,11 @@ class CORE_EXPORT TextAutosizer final
static TextAutosizer* Create(const Document* document) {
return new TextAutosizer(document);
}
static float ComputeAutosizedFontSize(float specified_size, float multiplier);
// computed_size should include zoom.
static float ComputeAutosizedFontSize(float computed_size,
float multiplier,
float effective_zoom);
void UpdatePageInfoInAllFrames();
void UpdatePageInfo();
......
......@@ -1754,9 +1754,9 @@ Length ComputedStyle::LineHeight() const {
// too, though this involves messily poking into CalcExpressionLength.
if (lh.IsFixed()) {
float multiplier = TextAutosizingMultiplier();
return Length(
TextAutosizer::ComputeAutosizedFontSize(lh.Value(), multiplier),
kFixed);
return Length(TextAutosizer::ComputeAutosizedFontSize(
lh.Value(), multiplier, EffectiveZoom()),
kFixed);
}
return lh;
......@@ -1822,12 +1822,12 @@ void ComputedStyle::SetTextAutosizingMultiplier(float multiplier) {
FontSelector* current_font_selector = GetFont().GetFontSelector();
FontDescription desc(GetFontDescription());
desc.SetSpecifiedSize(size);
desc.SetComputedSize(size);
float autosized_font_size =
TextAutosizer::ComputeAutosizedFontSize(size, multiplier);
float computed_size = autosized_font_size * EffectiveZoom();
desc.SetComputedSize(std::min(kMaximumAllowedFontSize, computed_size));
float computed_size = size * EffectiveZoom();
float autosized_font_size = TextAutosizer::ComputeAutosizedFontSize(
computed_size, multiplier, EffectiveZoom());
desc.SetComputedSize(std::min(kMaximumAllowedFontSize, autosized_font_size));
SetFontDescription(desc);
GetFont().Update(current_font_selector);
......
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