OLD | NEW |
---|---|
1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include "ui/gfx/render_text.h" | 5 #include "ui/gfx/render_text.h" |
6 | 6 |
7 #include <limits.h> | 7 #include <limits.h> |
8 #include <stddef.h> | 8 #include <stddef.h> |
9 #include <stdint.h> | 9 #include <stdint.h> |
10 | 10 |
(...skipping 4387 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
4398 #endif | 4398 #endif |
4399 const std::string font_name = "invalid_font"; | 4399 const std::string font_name = "invalid_font"; |
4400 const int kFontSize = 13; | 4400 const int kFontSize = 13; |
4401 RenderText* render_text = GetRenderText(); | 4401 RenderText* render_text = GetRenderText(); |
4402 render_text->SetFontList(FontList(Font(font_name, kFontSize))); | 4402 render_text->SetFontList(FontList(Font(font_name, kFontSize))); |
4403 render_text->SetText(ASCIIToUTF16("abc")); | 4403 render_text->SetText(ASCIIToUTF16("abc")); |
4404 | 4404 |
4405 DrawVisualText(); | 4405 DrawVisualText(); |
4406 } | 4406 } |
4407 | 4407 |
4408 // Ensures that text is centered vertically and consistently when either the | |
4409 // display rectangle height changes, or when the minimum line height changes. | |
4410 // The difference between the two is the selection rectangle, which should match | |
4411 // the line height. | |
4412 TEST_P(RenderTextHarfBuzzTest, BaselineWithLineHeight) { | |
4413 RenderText* render_text = GetRenderText(); | |
4414 const int font_height = render_text->font_list().GetHeight(); | |
4415 render_text->SetDisplayRect(Rect(500, font_height)); | |
4416 render_text->SetText(ASCIIToUTF16("abc")); | |
4417 | |
4418 // Select everything so the test can use GetSelectionBoundsUnion(). | |
4419 render_text->SelectAll(false); | |
4420 | |
4421 test_api()->EnsureLayout(); | |
4422 ASSERT_EQ(1u, test_api()->lines().size()); | |
4423 EXPECT_EQ(font_height, test_api()->lines()[0].size.height()); | |
4424 | |
4425 // Note this is equivalent to RenderText::GetDisplayTextBaseline(). | |
msw
2017/03/31 17:19:27
q: why not just use that here and on 4457, 4482, a
tapted
2017/04/02 23:52:42
Done (added to TestApi + replaced the EnsureLayout
| |
4426 const int normal_baseline = test_api()->lines()[0].baseline; | |
4427 | |
4428 // With a matching display height, the baseline calculated using font metrics | |
4429 // and the baseline from the layout engine should agree. This works because | |
4430 // the text string is simple (exotic glyphs may use fonts with different | |
4431 // metrics). | |
4432 EXPECT_EQ(normal_baseline, render_text->GetBaseline()); | |
4433 EXPECT_EQ(0, render_text->GetLineOffset(0).y()); | |
4434 | |
4435 const gfx::Rect normal_selection_bounds = GetSelectionBoundsUnion(); | |
4436 | |
4437 // Sanity check: selection should start from (0,0). | |
4438 EXPECT_EQ(gfx::Vector2d(), normal_selection_bounds.OffsetFromOrigin()); | |
4439 | |
4440 constexpr int kDelta = 16; | |
4441 | |
4442 // Grow just the display rectangle. | |
4443 render_text->SetDisplayRect(Rect(500, font_height + kDelta)); | |
4444 test_api()->EnsureLayout(); | |
4445 ASSERT_EQ(1u, test_api()->lines().size()); | |
4446 EXPECT_EQ(font_height, test_api()->lines()[0].size.height()); | |
4447 | |
4448 // Save the baseline calculated using the display rectangle before enabling | |
4449 // multi-line or SetMinLineHeight(). | |
4450 const int reported_baseline = render_text->GetBaseline(); | |
4451 const int baseline_shift = reported_baseline - normal_baseline; | |
4452 | |
4453 // When line height matches font height, this should match the line offset. | |
4454 EXPECT_EQ(baseline_shift, render_text->GetLineOffset(0).y()); | |
4455 | |
4456 // The display text baseline does not move: GetLineOffset() moves it instead. | |
4457 EXPECT_EQ(normal_baseline, test_api()->lines()[0].baseline); | |
4458 | |
4459 // The actual shift depends on font metrics, but it should be within a pixel | |
msw
2017/03/31 17:19:27
Can we use the actual font metrics to make this a
tapted
2017/04/02 23:52:42
We'd have to repeat all the calculations done in D
| |
4460 // of (kDelta / 2). That is, 7, 8 or 9 pixels (for a delta of 16). An unusual | |
4461 // font in future may need more leeway. | |
4462 constexpr int kFuzz = 1; // If the next EXPECT fails, try increasing this. | |
4463 EXPECT_LE(abs(baseline_shift - kDelta / 2), kFuzz); | |
4464 | |
4465 // Increasing display height (but not line height) should shift the selection | |
4466 // bounds down by |baseline_shift|, but leave a matching size. | |
4467 gfx::Rect current_selection_bounds = GetSelectionBoundsUnion(); | |
4468 EXPECT_EQ(baseline_shift, current_selection_bounds.y()); | |
4469 EXPECT_EQ(0, current_selection_bounds.x()); | |
4470 EXPECT_EQ(normal_selection_bounds.size(), current_selection_bounds.size()); | |
4471 | |
4472 // Now increase the line height, but remain single-line. Note the line height | |
4473 // now matches the display rect. | |
4474 render_text->SetMinLineHeight(font_height + kDelta); | |
4475 test_api()->EnsureLayout(); | |
4476 ASSERT_EQ(1u, test_api()->lines().size()); | |
4477 EXPECT_EQ(font_height + kDelta, test_api()->lines()[0].size.height()); | |
4478 | |
4479 // The line offset should go back to zero, but now the display text baseline | |
4480 // should shift down to compensate, and the shift amount should match. | |
4481 EXPECT_EQ(0, render_text->GetLineOffset(0).y()); | |
4482 EXPECT_EQ(normal_baseline + baseline_shift, test_api()->lines()[0].baseline); | |
tapted
2017/03/31 10:31:14
(without the fix, these are the first two lines th
| |
4483 | |
4484 // Now selection bounds should grow in height, but not shift its origin. | |
4485 current_selection_bounds = GetSelectionBoundsUnion(); | |
4486 EXPECT_EQ(font_height + kDelta, current_selection_bounds.height()); | |
4487 EXPECT_EQ(normal_selection_bounds.width(), current_selection_bounds.width()); | |
4488 EXPECT_EQ(gfx::Vector2d(), current_selection_bounds.OffsetFromOrigin()); | |
tapted
2017/03/31 10:31:14
(which means this also fails - the selection bound
| |
4489 | |
4490 // Flipping the multiline flag should change nothing. | |
4491 render_text->SetMultiline(true); | |
4492 test_api()->EnsureLayout(); | |
4493 ASSERT_EQ(1u, test_api()->lines().size()); | |
4494 EXPECT_EQ(font_height + kDelta, test_api()->lines()[0].size.height()); | |
4495 EXPECT_EQ(0, render_text->GetLineOffset(0).y()); | |
4496 EXPECT_EQ(normal_baseline + baseline_shift, test_api()->lines()[0].baseline); | |
tapted
2017/03/31 10:31:14
(for the multiline case, this is the only case tha
| |
4497 current_selection_bounds = GetSelectionBoundsUnion(); | |
4498 EXPECT_EQ(font_height + kDelta, current_selection_bounds.height()); | |
4499 EXPECT_EQ(normal_selection_bounds.width(), current_selection_bounds.width()); | |
4500 EXPECT_EQ(gfx::Vector2d(), current_selection_bounds.OffsetFromOrigin()); | |
4501 } | |
4502 | |
4408 // Prefix for test instantiations intentionally left blank since each test | 4503 // Prefix for test instantiations intentionally left blank since each test |
4409 // fixture class has a single parameterization. | 4504 // fixture class has a single parameterization. |
4410 #if defined(OS_MACOSX) | 4505 #if defined(OS_MACOSX) |
4411 INSTANTIATE_TEST_CASE_P(, | 4506 INSTANTIATE_TEST_CASE_P(, |
4412 RenderTextTest, | 4507 RenderTextTest, |
4413 ::testing::Values(RENDER_TEXT_HARFBUZZ, | 4508 ::testing::Values(RENDER_TEXT_HARFBUZZ, |
4414 RENDER_TEXT_MAC), | 4509 RENDER_TEXT_MAC), |
4415 PrintRenderTextBackend()); | 4510 PrintRenderTextBackend()); |
4416 INSTANTIATE_TEST_CASE_P(, | 4511 INSTANTIATE_TEST_CASE_P(, |
4417 RenderTextMacTest, | 4512 RenderTextMacTest, |
4418 ::testing::Values(RENDER_TEXT_MAC), | 4513 ::testing::Values(RENDER_TEXT_MAC), |
4419 PrintRenderTextBackend()); | 4514 PrintRenderTextBackend()); |
4420 #else | 4515 #else |
4421 INSTANTIATE_TEST_CASE_P(, | 4516 INSTANTIATE_TEST_CASE_P(, |
4422 RenderTextTest, | 4517 RenderTextTest, |
4423 ::testing::Values(RENDER_TEXT_HARFBUZZ), | 4518 ::testing::Values(RENDER_TEXT_HARFBUZZ), |
4424 PrintRenderTextBackend()); | 4519 PrintRenderTextBackend()); |
4425 #endif | 4520 #endif |
4426 | 4521 |
4427 INSTANTIATE_TEST_CASE_P(, | 4522 INSTANTIATE_TEST_CASE_P(, |
4428 RenderTextHarfBuzzTest, | 4523 RenderTextHarfBuzzTest, |
4429 ::testing::Values(RENDER_TEXT_HARFBUZZ), | 4524 ::testing::Values(RENDER_TEXT_HARFBUZZ), |
4430 PrintRenderTextBackend()); | 4525 PrintRenderTextBackend()); |
4431 | 4526 |
4432 } // namespace gfx | 4527 } // namespace gfx |
OLD | NEW |