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 308 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
319 render_text->SetText(WideToUTF16(cases[i])); | 319 render_text->SetText(WideToUTF16(cases[i])); |
320 } | 320 } |
321 } | 321 } |
322 | 322 |
323 TEST_F(RenderTextTest, SetStyles) { | 323 TEST_F(RenderTextTest, SetStyles) { |
324 // Ensure custom default styles persist across setting and clearing text. | 324 // Ensure custom default styles persist across setting and clearing text. |
325 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); | 325 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); |
326 const SkColor color = SK_ColorRED; | 326 const SkColor color = SK_ColorRED; |
327 render_text->SetColor(color); | 327 render_text->SetColor(color); |
328 render_text->SetBaselineStyle(SUPERSCRIPT); | 328 render_text->SetBaselineStyle(SUPERSCRIPT); |
329 render_text->SetStyle(BOLD, true); | 329 render_text->SetWeight(Font::Weight::BOLD); |
330 render_text->SetStyle(UNDERLINE, false); | 330 render_text->SetStyle(UNDERLINE, false); |
331 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; | 331 const wchar_t* const cases[] = { kWeak, kLtr, L"Hello", kRtl, L"", L"" }; |
332 for (size_t i = 0; i < arraysize(cases); ++i) { | 332 for (size_t i = 0; i < arraysize(cases); ++i) { |
333 EXPECT_TRUE(render_text->colors().EqualsValueForTesting(color)); | 333 EXPECT_TRUE(render_text->colors().EqualsValueForTesting(color)); |
334 EXPECT_TRUE(render_text->baselines().EqualsValueForTesting(SUPERSCRIPT)); | 334 EXPECT_TRUE(render_text->baselines().EqualsValueForTesting(SUPERSCRIPT)); |
335 EXPECT_TRUE(render_text->styles()[BOLD].EqualsValueForTesting(true)); | 335 EXPECT_TRUE( |
| 336 render_text->weights().EqualsValueForTesting(Font::Weight::BOLD)); |
336 EXPECT_TRUE(render_text->styles()[UNDERLINE].EqualsValueForTesting(false)); | 337 EXPECT_TRUE(render_text->styles()[UNDERLINE].EqualsValueForTesting(false)); |
337 render_text->SetText(WideToUTF16(cases[i])); | 338 render_text->SetText(WideToUTF16(cases[i])); |
338 | 339 |
339 // Ensure custom default styles can be applied after text has been set. | 340 // Ensure custom default styles can be applied after text has been set. |
340 if (i == 1) | 341 if (i == 1) |
341 render_text->SetStyle(STRIKE, true); | 342 render_text->SetStyle(STRIKE, true); |
342 if (i >= 1) | 343 if (i >= 1) |
343 EXPECT_TRUE(render_text->styles()[STRIKE].EqualsValueForTesting(true)); | 344 EXPECT_TRUE(render_text->styles()[STRIKE].EqualsValueForTesting(true)); |
344 } | 345 } |
345 } | 346 } |
346 | 347 |
347 TEST_F(RenderTextTest, ApplyStyles) { | 348 TEST_F(RenderTextTest, ApplyStyles) { |
348 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); | 349 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); |
349 render_text->SetText(ASCIIToUTF16("012345678")); | 350 render_text->SetText(ASCIIToUTF16("012345678")); |
350 | 351 |
351 // Apply a ranged color and style and check the resulting breaks. | 352 // Apply a ranged color and style and check the resulting breaks. |
352 render_text->ApplyColor(SK_ColorRED, Range(1, 4)); | 353 render_text->ApplyColor(SK_ColorRED, Range(1, 4)); |
353 render_text->ApplyBaselineStyle(SUPERIOR, Range(2, 4)); | 354 render_text->ApplyBaselineStyle(SUPERIOR, Range(2, 4)); |
354 render_text->ApplyStyle(BOLD, true, Range(2, 5)); | 355 render_text->ApplyWeight(Font::Weight::BOLD, Range(2, 5)); |
355 std::vector<std::pair<size_t, SkColor> > expected_color; | 356 std::vector<std::pair<size_t, SkColor> > expected_color; |
356 expected_color.push_back(std::pair<size_t, SkColor>(0, SK_ColorBLACK)); | 357 expected_color.push_back(std::pair<size_t, SkColor>(0, SK_ColorBLACK)); |
357 expected_color.push_back(std::pair<size_t, SkColor>(1, SK_ColorRED)); | 358 expected_color.push_back(std::pair<size_t, SkColor>(1, SK_ColorRED)); |
358 expected_color.push_back(std::pair<size_t, SkColor>(4, SK_ColorBLACK)); | 359 expected_color.push_back(std::pair<size_t, SkColor>(4, SK_ColorBLACK)); |
359 EXPECT_TRUE(render_text->colors().EqualsForTesting(expected_color)); | 360 EXPECT_TRUE(render_text->colors().EqualsForTesting(expected_color)); |
360 std::vector<std::pair<size_t, BaselineStyle>> expected_baseline_style; | 361 std::vector<std::pair<size_t, BaselineStyle>> expected_baseline_style; |
361 expected_baseline_style.push_back( | 362 expected_baseline_style.push_back( |
362 std::pair<size_t, BaselineStyle>(0, NORMAL_BASELINE)); | 363 std::pair<size_t, BaselineStyle>(0, NORMAL_BASELINE)); |
363 expected_baseline_style.push_back( | 364 expected_baseline_style.push_back( |
364 std::pair<size_t, BaselineStyle>(2, SUPERIOR)); | 365 std::pair<size_t, BaselineStyle>(2, SUPERIOR)); |
365 expected_baseline_style.push_back( | 366 expected_baseline_style.push_back( |
366 std::pair<size_t, BaselineStyle>(4, NORMAL_BASELINE)); | 367 std::pair<size_t, BaselineStyle>(4, NORMAL_BASELINE)); |
367 EXPECT_TRUE( | 368 EXPECT_TRUE( |
368 render_text->baselines().EqualsForTesting(expected_baseline_style)); | 369 render_text->baselines().EqualsForTesting(expected_baseline_style)); |
369 std::vector<std::pair<size_t, bool> > expected_style; | 370 std::vector<std::pair<size_t, Font::Weight>> expected_weight; |
370 expected_style.push_back(std::pair<size_t, bool>(0, false)); | 371 expected_weight.push_back( |
371 expected_style.push_back(std::pair<size_t, bool>(2, true)); | 372 std::pair<size_t, Font::Weight>(0, Font::Weight::NORMAL)); |
372 expected_style.push_back(std::pair<size_t, bool>(5, false)); | 373 expected_weight.push_back( |
373 EXPECT_TRUE(render_text->styles()[BOLD].EqualsForTesting(expected_style)); | 374 std::pair<size_t, Font::Weight>(2, Font::Weight::BOLD)); |
| 375 expected_weight.push_back( |
| 376 std::pair<size_t, Font::Weight>(5, Font::Weight::NORMAL)); |
| 377 EXPECT_TRUE(render_text->weights().EqualsForTesting(expected_weight)); |
374 | 378 |
375 // Ensure that setting a value overrides the ranged values. | 379 // Ensure that setting a value overrides the ranged values. |
376 render_text->SetColor(SK_ColorBLUE); | 380 render_text->SetColor(SK_ColorBLUE); |
377 EXPECT_TRUE(render_text->colors().EqualsValueForTesting(SK_ColorBLUE)); | 381 EXPECT_TRUE(render_text->colors().EqualsValueForTesting(SK_ColorBLUE)); |
378 render_text->SetBaselineStyle(SUBSCRIPT); | 382 render_text->SetBaselineStyle(SUBSCRIPT); |
379 EXPECT_TRUE(render_text->baselines().EqualsValueForTesting(SUBSCRIPT)); | 383 EXPECT_TRUE(render_text->baselines().EqualsValueForTesting(SUBSCRIPT)); |
380 render_text->SetStyle(BOLD, false); | 384 render_text->SetWeight(Font::Weight::NORMAL); |
381 EXPECT_TRUE(render_text->styles()[BOLD].EqualsValueForTesting(false)); | 385 EXPECT_TRUE( |
| 386 render_text->weights().EqualsValueForTesting(Font::Weight::NORMAL)); |
382 | 387 |
383 // Apply a value over the text end and check the resulting breaks (INT_MAX | 388 // Apply a value over the text end and check the resulting breaks (INT_MAX |
384 // should be used instead of the text length for the range end) | 389 // should be used instead of the text length for the range end) |
385 const size_t text_length = render_text->text().length(); | 390 const size_t text_length = render_text->text().length(); |
386 render_text->ApplyColor(SK_ColorRED, Range(0, text_length)); | 391 render_text->ApplyColor(SK_ColorRED, Range(0, text_length)); |
387 render_text->ApplyBaselineStyle(SUPERIOR, Range(0, text_length)); | 392 render_text->ApplyBaselineStyle(SUPERIOR, Range(0, text_length)); |
388 render_text->ApplyStyle(BOLD, true, Range(2, text_length)); | 393 render_text->ApplyWeight(Font::Weight::BOLD, Range(2, text_length)); |
389 std::vector<std::pair<size_t, SkColor> > expected_color_end; | 394 std::vector<std::pair<size_t, SkColor> > expected_color_end; |
390 expected_color_end.push_back(std::pair<size_t, SkColor>(0, SK_ColorRED)); | 395 expected_color_end.push_back(std::pair<size_t, SkColor>(0, SK_ColorRED)); |
391 EXPECT_TRUE(render_text->colors().EqualsForTesting(expected_color_end)); | 396 EXPECT_TRUE(render_text->colors().EqualsForTesting(expected_color_end)); |
392 std::vector<std::pair<size_t, BaselineStyle>> expected_baseline_end; | 397 std::vector<std::pair<size_t, BaselineStyle>> expected_baseline_end; |
393 expected_baseline_end.push_back( | 398 expected_baseline_end.push_back( |
394 std::pair<size_t, BaselineStyle>(0, SUPERIOR)); | 399 std::pair<size_t, BaselineStyle>(0, SUPERIOR)); |
395 EXPECT_TRUE(render_text->baselines().EqualsForTesting(expected_baseline_end)); | 400 EXPECT_TRUE(render_text->baselines().EqualsForTesting(expected_baseline_end)); |
396 std::vector<std::pair<size_t, bool> > expected_style_end; | 401 std::vector<std::pair<size_t, Font::Weight>> expected_weight_end; |
397 expected_style_end.push_back(std::pair<size_t, bool>(0, false)); | 402 expected_weight_end.push_back( |
398 expected_style_end.push_back(std::pair<size_t, bool>(2, true)); | 403 std::pair<size_t, Font::Weight>(0, Font::Weight::NORMAL)); |
399 EXPECT_TRUE(render_text->styles()[BOLD].EqualsForTesting(expected_style_end)); | 404 expected_weight_end.push_back( |
| 405 std::pair<size_t, Font::Weight>(2, Font::Weight::BOLD)); |
| 406 EXPECT_TRUE(render_text->weights().EqualsForTesting(expected_weight_end)); |
400 | 407 |
401 // Ensure ranged values adjust to accommodate text length changes. | 408 // Ensure ranged values adjust to accommodate text length changes. |
402 render_text->ApplyStyle(ITALIC, true, Range(0, 2)); | 409 render_text->ApplyStyle(ITALIC, true, Range(0, 2)); |
403 render_text->ApplyStyle(ITALIC, true, Range(3, 6)); | 410 render_text->ApplyStyle(ITALIC, true, Range(3, 6)); |
404 render_text->ApplyStyle(ITALIC, true, Range(7, text_length)); | 411 render_text->ApplyStyle(ITALIC, true, Range(7, text_length)); |
405 std::vector<std::pair<size_t, bool> > expected_italic; | 412 std::vector<std::pair<size_t, bool> > expected_italic; |
406 expected_italic.push_back(std::pair<size_t, bool>(0, true)); | 413 expected_italic.push_back(std::pair<size_t, bool>(0, true)); |
407 expected_italic.push_back(std::pair<size_t, bool>(2, false)); | 414 expected_italic.push_back(std::pair<size_t, bool>(2, false)); |
408 expected_italic.push_back(std::pair<size_t, bool>(3, true)); | 415 expected_italic.push_back(std::pair<size_t, bool>(3, true)); |
409 expected_italic.push_back(std::pair<size_t, bool>(6, false)); | 416 expected_italic.push_back(std::pair<size_t, bool>(6, false)); |
(...skipping 336 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
746 TEST_F(RenderTextTest, MultilineElide) { | 753 TEST_F(RenderTextTest, MultilineElide) { |
747 std::unique_ptr<RenderText> render_text(new RenderTextHarfBuzz); | 754 std::unique_ptr<RenderText> render_text(new RenderTextHarfBuzz); |
748 base::string16 input_text; | 755 base::string16 input_text; |
749 // Aim for 3 lines of text. | 756 // Aim for 3 lines of text. |
750 for (int i = 0; i < 20; ++i) | 757 for (int i = 0; i < 20; ++i) |
751 input_text.append(ASCIIToUTF16("hello world ")); | 758 input_text.append(ASCIIToUTF16("hello world ")); |
752 render_text->SetText(input_text); | 759 render_text->SetText(input_text); |
753 // Apply a style that tweaks the layout to make sure elision is calculated | 760 // Apply a style that tweaks the layout to make sure elision is calculated |
754 // with these styles. This can expose a behavior in layout where text is | 761 // with these styles. This can expose a behavior in layout where text is |
755 // slightly different width. This must be done after |SetText()|. | 762 // slightly different width. This must be done after |SetText()|. |
756 render_text->ApplyStyle(gfx::BOLD, true, gfx::Range(1, 20)); | 763 render_text->ApplyWeight(Font::Weight::BOLD, Range(1, 20)); |
757 render_text->ApplyStyle(gfx::ITALIC, true, gfx::Range(1, 20)); | 764 render_text->ApplyStyle(ITALIC, true, Range(1, 20)); |
758 render_text->ApplyStyle(gfx::DIAGONAL_STRIKE, true, gfx::Range(1, 20)); | 765 render_text->ApplyStyle(DIAGONAL_STRIKE, true, Range(1, 20)); |
759 render_text->SetMultiline(true); | 766 render_text->SetMultiline(true); |
760 render_text->SetElideBehavior(ELIDE_TAIL); | 767 render_text->SetElideBehavior(ELIDE_TAIL); |
761 render_text->SetMaxLines(3); | 768 render_text->SetMaxLines(3); |
762 const gfx::Size size = render_text->GetStringSize(); | 769 const Size size = render_text->GetStringSize(); |
763 // Fit in 3 lines. (If we knew the width of a word, we could | 770 // Fit in 3 lines. (If we knew the width of a word, we could |
764 // anticipate word wrap better.) | 771 // anticipate word wrap better.) |
765 render_text->SetDisplayRect(gfx::Rect((size.width() + 96) / 3, 0)); | 772 render_text->SetDisplayRect(Rect((size.width() + 96) / 3, 0)); |
766 // Trigger rendering. | 773 // Trigger rendering. |
767 render_text->GetStringSize(); | 774 render_text->GetStringSize(); |
768 EXPECT_EQ(input_text, render_text->GetDisplayText()); | 775 EXPECT_EQ(input_text, render_text->GetDisplayText()); |
769 | 776 |
770 const base::char16 kEllipsisUTF16[] = {0x2026, 0}; | 777 const base::char16 kEllipsisUTF16[] = {0x2026, 0}; |
771 base::string16 actual_text; | 778 base::string16 actual_text; |
772 // Try widening the space gradually, one pixel at a time, trying | 779 // Try widening the space gradually, one pixel at a time, trying |
773 // to trigger a failure in layout. There was an issue where, right at | 780 // to trigger a failure in layout. There was an issue where, right at |
774 // the edge of a word getting truncated, the estimate would be wrong | 781 // the edge of a word getting truncated, the estimate would be wrong |
775 // and it would wrap instead. | 782 // and it would wrap instead. |
776 for (int i = (size.width() - 12) / 3; i < (size.width() + 30) / 3; ++i) { | 783 for (int i = (size.width() - 12) / 3; i < (size.width() + 30) / 3; ++i) { |
777 render_text->SetDisplayRect(gfx::Rect(i, 0)); | 784 render_text->SetDisplayRect(Rect(i, 0)); |
778 // Trigger rendering. | 785 // Trigger rendering. |
779 render_text->GetStringSize(); | 786 render_text->GetStringSize(); |
780 actual_text = render_text->GetDisplayText(); | 787 actual_text = render_text->GetDisplayText(); |
781 EXPECT_LT(actual_text.size(), input_text.size()); | 788 EXPECT_LT(actual_text.size(), input_text.size()); |
782 EXPECT_EQ(actual_text, input_text.substr(0, actual_text.size() - 1) + | 789 EXPECT_EQ(actual_text, input_text.substr(0, actual_text.size() - 1) + |
783 base::string16(kEllipsisUTF16)); | 790 base::string16(kEllipsisUTF16)); |
784 EXPECT_EQ(3U, render_text->GetNumLines()); | 791 EXPECT_EQ(3U, render_text->GetNumLines()); |
785 } | 792 } |
786 // Now remove line restriction. | 793 // Now remove line restriction. |
787 render_text->SetMaxLines(0); | 794 render_text->SetMaxLines(0); |
788 render_text->GetStringSize(); | 795 render_text->GetStringSize(); |
789 EXPECT_EQ(input_text, render_text->GetDisplayText()); | 796 EXPECT_EQ(input_text, render_text->GetDisplayText()); |
790 | 797 |
791 // And put it back. | 798 // And put it back. |
792 render_text->SetMaxLines(3); | 799 render_text->SetMaxLines(3); |
793 render_text->GetStringSize(); | 800 render_text->GetStringSize(); |
794 EXPECT_LT(actual_text.size(), input_text.size()); | 801 EXPECT_LT(actual_text.size(), input_text.size()); |
795 EXPECT_EQ(actual_text, input_text.substr(0, actual_text.size() - 1) + | 802 EXPECT_EQ(actual_text, input_text.substr(0, actual_text.size() - 1) + |
796 base::string16(kEllipsisUTF16)); | 803 base::string16(kEllipsisUTF16)); |
797 } | 804 } |
798 | 805 |
799 #endif // !defined(OS_MACOSX) | 806 #endif // !defined(OS_MACOSX) |
800 | 807 |
801 TEST_F(RenderTextTest, ElidedEmail) { | 808 TEST_F(RenderTextTest, ElidedEmail) { |
802 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); | 809 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); |
803 render_text->SetText(ASCIIToUTF16("test@example.com")); | 810 render_text->SetText(ASCIIToUTF16("test@example.com")); |
804 const gfx::Size size = render_text->GetStringSize(); | 811 const Size size = render_text->GetStringSize(); |
805 | 812 |
806 const base::string16 long_email = | 813 const base::string16 long_email = |
807 ASCIIToUTF16("longemailaddresstest@example.com"); | 814 ASCIIToUTF16("longemailaddresstest@example.com"); |
808 render_text->SetText(long_email); | 815 render_text->SetText(long_email); |
809 render_text->SetElideBehavior(ELIDE_EMAIL); | 816 render_text->SetElideBehavior(ELIDE_EMAIL); |
810 render_text->SetDisplayRect(gfx::Rect(size)); | 817 render_text->SetDisplayRect(Rect(size)); |
811 EXPECT_GE(size.width(), render_text->GetStringSize().width()); | 818 EXPECT_GE(size.width(), render_text->GetStringSize().width()); |
812 EXPECT_GT(long_email.size(), render_text->GetDisplayText().size()); | 819 EXPECT_GT(long_email.size(), render_text->GetDisplayText().size()); |
813 } | 820 } |
814 | 821 |
815 TEST_F(RenderTextTest, TruncatedText) { | 822 TEST_F(RenderTextTest, TruncatedText) { |
816 struct { | 823 struct { |
817 const wchar_t* text; | 824 const wchar_t* text; |
818 const wchar_t* display_text; | 825 const wchar_t* display_text; |
819 } cases[] = { | 826 } cases[] = { |
820 // Strings shorter than the truncation length should be laid out in full. | 827 // Strings shorter than the truncation length should be laid out in full. |
(...skipping 909 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1730 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); | 1737 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); |
1731 render_text->SetFontList(FontList("Arial,Symbol, 13px")); | 1738 render_text->SetFontList(FontList("Arial,Symbol, 13px")); |
1732 const std::vector<Font>& fonts = render_text->font_list().GetFonts(); | 1739 const std::vector<Font>& fonts = render_text->font_list().GetFonts(); |
1733 ASSERT_EQ(2U, fonts.size()); | 1740 ASSERT_EQ(2U, fonts.size()); |
1734 EXPECT_EQ("Arial", fonts[0].GetFontName()); | 1741 EXPECT_EQ("Arial", fonts[0].GetFontName()); |
1735 EXPECT_EQ("Symbol", fonts[1].GetFontName()); | 1742 EXPECT_EQ("Symbol", fonts[1].GetFontName()); |
1736 EXPECT_EQ(13, render_text->font_list().GetFontSize()); | 1743 EXPECT_EQ(13, render_text->font_list().GetFontSize()); |
1737 } | 1744 } |
1738 | 1745 |
1739 TEST_F(RenderTextTest, StringSizeBoldWidth) { | 1746 TEST_F(RenderTextTest, StringSizeBoldWidth) { |
| 1747 // TODO(mboc): Add some unittests for other weights (currently not |
| 1748 // implemented because of test system font configuration). |
1740 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); | 1749 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); |
1741 render_text->SetText(UTF8ToUTF16("Hello World")); | 1750 render_text->SetText(UTF8ToUTF16("Hello World")); |
1742 | 1751 |
1743 const int plain_width = render_text->GetStringSize().width(); | 1752 const int plain_width = render_text->GetStringSize().width(); |
1744 EXPECT_GT(plain_width, 0); | 1753 EXPECT_GT(plain_width, 0); |
1745 | 1754 |
1746 // Apply a bold style and check that the new width is greater. | 1755 // Apply a bold style and check that the new width is greater. |
1747 render_text->SetStyle(BOLD, true); | 1756 render_text->SetWeight(Font::Weight::BOLD); |
1748 const int bold_width = render_text->GetStringSize().width(); | 1757 const int bold_width = render_text->GetStringSize().width(); |
1749 EXPECT_GT(bold_width, plain_width); | 1758 EXPECT_GT(bold_width, plain_width); |
1750 | 1759 |
| 1760 #if defined(OS_WIN) |
| 1761 render_text->SetWeight(Font::Weight::SEMIBOLD); |
| 1762 const int semibold_width = render_text->GetStringSize().width(); |
| 1763 EXPECT_GT(bold_width, semibold_width); |
| 1764 #endif |
| 1765 |
1751 // Now, apply a plain style over the first word only. | 1766 // Now, apply a plain style over the first word only. |
1752 render_text->ApplyStyle(BOLD, false, Range(0, 5)); | 1767 render_text->ApplyWeight(Font::Weight::NORMAL, Range(0, 5)); |
1753 const int plain_bold_width = render_text->GetStringSize().width(); | 1768 const int plain_bold_width = render_text->GetStringSize().width(); |
1754 EXPECT_GT(plain_bold_width, plain_width); | 1769 EXPECT_GT(plain_bold_width, plain_width); |
1755 EXPECT_LT(plain_bold_width, bold_width); | 1770 EXPECT_LT(plain_bold_width, bold_width); |
1756 } | 1771 } |
1757 | 1772 |
1758 TEST_F(RenderTextTest, StringSizeHeight) { | 1773 TEST_F(RenderTextTest, StringSizeHeight) { |
1759 base::string16 cases[] = { | 1774 base::string16 cases[] = { |
1760 WideToUTF16(L"Hello World!"), // English | 1775 WideToUTF16(L"Hello World!"), // English |
1761 WideToUTF16(L"\x6328\x62f6"), // Japanese | 1776 WideToUTF16(L"\x6328\x62f6"), // Japanese |
1762 WideToUTF16(L"\x0915\x093f"), // Hindi | 1777 WideToUTF16(L"\x0915\x093f"), // Hindi |
(...skipping 661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2424 // to the original text. | 2439 // to the original text. |
2425 render_text.SetMultiline(true); | 2440 render_text.SetMultiline(true); |
2426 EXPECT_EQ(WideToUTF16(kTestStrings[i]), render_text.GetDisplayText()); | 2441 EXPECT_EQ(WideToUTF16(kTestStrings[i]), render_text.GetDisplayText()); |
2427 } | 2442 } |
2428 } | 2443 } |
2429 | 2444 |
2430 // Ensure horizontal alignment works in multiline mode. | 2445 // Ensure horizontal alignment works in multiline mode. |
2431 TEST_F(RenderTextTest, Multiline_HorizontalAlignment) { | 2446 TEST_F(RenderTextTest, Multiline_HorizontalAlignment) { |
2432 const struct { | 2447 const struct { |
2433 const wchar_t* const text; | 2448 const wchar_t* const text; |
2434 const gfx::HorizontalAlignment alignment; | 2449 const HorizontalAlignment alignment; |
2435 } kTestStrings[] = { | 2450 } kTestStrings[] = { |
2436 { L"abcdefghij\nhijkl", gfx::ALIGN_LEFT }, | 2451 { L"abcdefghij\nhijkl", ALIGN_LEFT }, |
2437 { L"nhijkl\nabcdefghij", gfx::ALIGN_LEFT }, | 2452 { L"nhijkl\nabcdefghij", ALIGN_LEFT }, |
2438 // hebrew, 2nd line shorter | 2453 // hebrew, 2nd line shorter |
2439 { L"\x5d0\x5d1\x5d2\x5d3\x5d4\x5d5\x5d6\x5d7\n\x5d0\x5d1\x5d2\x5d3", | 2454 { L"\x5d0\x5d1\x5d2\x5d3\x5d4\x5d5\x5d6\x5d7\n\x5d0\x5d1\x5d2\x5d3", |
2440 gfx::ALIGN_RIGHT }, | 2455 ALIGN_RIGHT }, |
2441 // hebrew, 2nd line longer | 2456 // hebrew, 2nd line longer |
2442 { L"\x5d0\x5d1\x5d2\x5d3\n\x5d0\x5d1\x5d2\x5d3\x5d4\x5d5\x5d6\x5d7", | 2457 { L"\x5d0\x5d1\x5d2\x5d3\n\x5d0\x5d1\x5d2\x5d3\x5d4\x5d5\x5d6\x5d7", |
2443 gfx::ALIGN_RIGHT }, | 2458 ALIGN_RIGHT }, |
2444 // arabic, 2nd line shorter | 2459 // arabic, 2nd line shorter |
2445 { L"\x62a\x62b\x62c\x62d\x62e\x62f\x630\n\x660\x661\x662\x663\x664", | 2460 { L"\x62a\x62b\x62c\x62d\x62e\x62f\x630\n\x660\x661\x662\x663\x664", |
2446 gfx::ALIGN_RIGHT }, | 2461 ALIGN_RIGHT }, |
2447 // arabic, 2nd line longer | 2462 // arabic, 2nd line longer |
2448 { L"\x660\x661\x662\x663\x664\n\x62a\x62b\x62c\x62d\x62e\x62f\x630", | 2463 { L"\x660\x661\x662\x663\x664\n\x62a\x62b\x62c\x62d\x62e\x62f\x630", |
2449 gfx::ALIGN_RIGHT }, | 2464 ALIGN_RIGHT }, |
2450 }; | 2465 }; |
2451 const int kGlyphSize = 5; | 2466 const int kGlyphSize = 5; |
2452 RenderTextHarfBuzz render_text; | 2467 RenderTextHarfBuzz render_text; |
2453 render_text.SetHorizontalAlignment(gfx::ALIGN_TO_HEAD); | 2468 render_text.SetHorizontalAlignment(ALIGN_TO_HEAD); |
2454 render_text.set_glyph_width_for_test(kGlyphSize); | 2469 render_text.set_glyph_width_for_test(kGlyphSize); |
2455 render_text.SetDisplayRect(Rect(100, 1000)); | 2470 render_text.SetDisplayRect(Rect(100, 1000)); |
2456 render_text.SetMultiline(true); | 2471 render_text.SetMultiline(true); |
2457 | 2472 |
2458 Canvas canvas; | 2473 Canvas canvas; |
2459 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { | 2474 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
2460 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "] %ls", i, | 2475 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "] %ls", i, |
2461 kTestStrings[i].text)); | 2476 kTestStrings[i].text)); |
2462 render_text.SetText(WideToUTF16(kTestStrings[i].text)); | 2477 render_text.SetText(WideToUTF16(kTestStrings[i].text)); |
2463 render_text.Draw(&canvas); | 2478 render_text.Draw(&canvas); |
2464 ASSERT_LE(2u, render_text.lines().size()); | 2479 ASSERT_LE(2u, render_text.lines().size()); |
2465 if (kTestStrings[i].alignment == gfx::ALIGN_LEFT) { | 2480 if (kTestStrings[i].alignment == ALIGN_LEFT) { |
2466 EXPECT_EQ(0, render_text.GetAlignmentOffset(0).x()); | 2481 EXPECT_EQ(0, render_text.GetAlignmentOffset(0).x()); |
2467 EXPECT_EQ(0, render_text.GetAlignmentOffset(1).x()); | 2482 EXPECT_EQ(0, render_text.GetAlignmentOffset(1).x()); |
2468 } else { | 2483 } else { |
2469 std::vector<base::string16> lines = base::SplitString( | 2484 std::vector<base::string16> lines = base::SplitString( |
2470 base::WideToUTF16(kTestStrings[i].text), | 2485 base::WideToUTF16(kTestStrings[i].text), |
2471 base::string16(1, '\n'), base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); | 2486 base::string16(1, '\n'), base::TRIM_WHITESPACE, base::SPLIT_WANT_ALL); |
2472 ASSERT_EQ(2u, lines.size()); | 2487 ASSERT_EQ(2u, lines.size()); |
2473 int difference = (lines[0].length() - lines[1].length()) * kGlyphSize; | 2488 int difference = (lines[0].length() - lines[1].length()) * kGlyphSize; |
2474 EXPECT_EQ(render_text.GetAlignmentOffset(0).x() + difference, | 2489 EXPECT_EQ(render_text.GetAlignmentOffset(0).x() + difference, |
2475 render_text.GetAlignmentOffset(1).x()); | 2490 render_text.GetAlignmentOffset(1).x()); |
(...skipping 546 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3022 EXPECT_EQ(Range(3, 8), chars); | 3037 EXPECT_EQ(Range(3, 8), chars); |
3023 EXPECT_EQ(Range(0, 0), glyphs); | 3038 EXPECT_EQ(Range(0, 0), glyphs); |
3024 } | 3039 } |
3025 | 3040 |
3026 // Ensure the line breaker doesn't compute the word's width bigger than the | 3041 // Ensure the line breaker doesn't compute the word's width bigger than the |
3027 // actual size. See http://crbug.com/470073 | 3042 // actual size. See http://crbug.com/470073 |
3028 TEST_F(RenderTextTest, HarfBuzz_WordWidthWithDiacritics) { | 3043 TEST_F(RenderTextTest, HarfBuzz_WordWidthWithDiacritics) { |
3029 RenderTextHarfBuzz render_text; | 3044 RenderTextHarfBuzz render_text; |
3030 const base::string16 kWord = WideToUTF16(L"\u0906\u092A\u0915\u0947 "); | 3045 const base::string16 kWord = WideToUTF16(L"\u0906\u092A\u0915\u0947 "); |
3031 render_text.SetText(kWord); | 3046 render_text.SetText(kWord); |
3032 const gfx::SizeF text_size = render_text.GetStringSizeF(); | 3047 const SizeF text_size = render_text.GetStringSizeF(); |
3033 | 3048 |
3034 render_text.SetText(kWord + kWord); | 3049 render_text.SetText(kWord + kWord); |
3035 render_text.SetMultiline(true); | 3050 render_text.SetMultiline(true); |
3036 EXPECT_EQ(text_size.width() * 2, render_text.GetStringSizeF().width()); | 3051 EXPECT_EQ(text_size.width() * 2, render_text.GetStringSizeF().width()); |
3037 EXPECT_EQ(text_size.height(), render_text.GetStringSizeF().height()); | 3052 EXPECT_EQ(text_size.height(), render_text.GetStringSizeF().height()); |
3038 render_text.SetDisplayRect(gfx::Rect(0, 0, std::ceil(text_size.width()), 0)); | 3053 render_text.SetDisplayRect(Rect(0, 0, std::ceil(text_size.width()), 0)); |
3039 EXPECT_NEAR(text_size.width(), render_text.GetStringSizeF().width(), 1.0f); | 3054 EXPECT_NEAR(text_size.width(), render_text.GetStringSizeF().width(), 1.0f); |
3040 EXPECT_EQ(text_size.height() * 2, render_text.GetStringSizeF().height()); | 3055 EXPECT_EQ(text_size.height() * 2, render_text.GetStringSizeF().height()); |
3041 } | 3056 } |
3042 | 3057 |
3043 // Ensure a string fits in a display rect with a width equal to the string's. | 3058 // Ensure a string fits in a display rect with a width equal to the string's. |
3044 TEST_F(RenderTextTest, StringFitsOwnWidth) { | 3059 TEST_F(RenderTextTest, StringFitsOwnWidth) { |
3045 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); | 3060 std::unique_ptr<RenderText> render_text(RenderText::CreateInstance()); |
3046 const base::string16 kString = ASCIIToUTF16("www.example.com"); | 3061 const base::string16 kString = ASCIIToUTF16("www.example.com"); |
3047 | 3062 |
3048 render_text->SetText(kString); | 3063 render_text->SetText(kString); |
3049 render_text->ApplyStyle(BOLD, true, Range(0, 3)); | 3064 render_text->ApplyWeight(Font::Weight::BOLD, Range(0, 3)); |
3050 render_text->SetElideBehavior(ELIDE_TAIL); | 3065 render_text->SetElideBehavior(ELIDE_TAIL); |
3051 | 3066 |
3052 render_text->SetDisplayRect(Rect(0, 0, 500, 100)); | 3067 render_text->SetDisplayRect(Rect(0, 0, 500, 100)); |
3053 EXPECT_EQ(kString, render_text->GetDisplayText()); | 3068 EXPECT_EQ(kString, render_text->GetDisplayText()); |
3054 render_text->SetDisplayRect(Rect(0, 0, render_text->GetContentWidth(), 100)); | 3069 render_text->SetDisplayRect(Rect(0, 0, render_text->GetContentWidth(), 100)); |
3055 EXPECT_EQ(kString, render_text->GetDisplayText()); | 3070 EXPECT_EQ(kString, render_text->GetDisplayText()); |
3056 } | 3071 } |
3057 | 3072 |
3058 // TODO(derat): Figure out why this fails on Windows: http://crbug.com/427184 | 3073 // TODO(derat): Figure out why this fails on Windows: http://crbug.com/427184 |
3059 #if !defined(OS_WIN) | 3074 #if !defined(OS_WIN) |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3147 render_text->SetColor(SK_ColorBLACK); | 3162 render_text->SetColor(SK_ColorBLACK); |
3148 | 3163 |
3149 for (auto string : kTestStrings) { | 3164 for (auto string : kTestStrings) { |
3150 surface->getCanvas()->clear(SK_ColorWHITE); | 3165 surface->getCanvas()->clear(SK_ColorWHITE); |
3151 render_text->SetText(WideToUTF16(string)); | 3166 render_text->SetText(WideToUTF16(string)); |
3152 const Size string_size = render_text->GetStringSize(); | 3167 const Size string_size = render_text->GetStringSize(); |
3153 render_text->ApplyBaselineStyle(SUPERSCRIPT, Range(1, 2)); | 3168 render_text->ApplyBaselineStyle(SUPERSCRIPT, Range(1, 2)); |
3154 render_text->ApplyBaselineStyle(SUPERIOR, Range(3, 4)); | 3169 render_text->ApplyBaselineStyle(SUPERIOR, Range(3, 4)); |
3155 render_text->ApplyBaselineStyle(INFERIOR, Range(5, 6)); | 3170 render_text->ApplyBaselineStyle(INFERIOR, Range(5, 6)); |
3156 render_text->ApplyBaselineStyle(SUBSCRIPT, Range(7, 8)); | 3171 render_text->ApplyBaselineStyle(SUBSCRIPT, Range(7, 8)); |
3157 render_text->SetStyle(BOLD, true); | 3172 render_text->SetWeight(Font::Weight::BOLD); |
3158 render_text->SetDisplayRect( | 3173 render_text->SetDisplayRect( |
3159 Rect(kTestSize, kTestSize, string_size.width(), string_size.height())); | 3174 Rect(kTestSize, kTestSize, string_size.width(), string_size.height())); |
3160 // Allow the RenderText to paint outside of its display rect. | 3175 // Allow the RenderText to paint outside of its display rect. |
3161 render_text->set_clip_to_display_rect(false); | 3176 render_text->set_clip_to_display_rect(false); |
3162 ASSERT_LE(string_size.width() + kTestSize * 2, kCanvasSize.width()); | 3177 ASSERT_LE(string_size.width() + kTestSize * 2, kCanvasSize.width()); |
3163 | 3178 |
3164 render_text->Draw(&canvas); | 3179 render_text->Draw(&canvas); |
3165 ASSERT_LT(string_size.width() + kTestSize, kCanvasSize.width()); | 3180 ASSERT_LT(string_size.width() + kTestSize, kCanvasSize.width()); |
3166 SkPixmap pixmap; | 3181 SkPixmap pixmap; |
3167 surface->peekPixels(&pixmap); | 3182 surface->peekPixels(&pixmap); |
(...skipping 109 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
3277 kTestSize, kTestSize, fake_height); | 3292 kTestSize, kTestSize, fake_height); |
3278 } | 3293 } |
3279 } | 3294 } |
3280 } | 3295 } |
3281 | 3296 |
3282 #if defined(OS_MACOSX) | 3297 #if defined(OS_MACOSX) |
3283 TEST_F(RenderTextTest, Mac_ElidedText) { | 3298 TEST_F(RenderTextTest, Mac_ElidedText) { |
3284 RenderTextMac render_text; | 3299 RenderTextMac render_text; |
3285 base::string16 text(ASCIIToUTF16("This is an example.")); | 3300 base::string16 text(ASCIIToUTF16("This is an example.")); |
3286 render_text.SetText(text); | 3301 render_text.SetText(text); |
3287 gfx::Size string_size = render_text.GetStringSize(); | 3302 Size string_size = render_text.GetStringSize(); |
3288 render_text.SetDisplayRect(gfx::Rect(string_size)); | 3303 render_text.SetDisplayRect(Rect(string_size)); |
3289 render_text.EnsureLayout(); | 3304 render_text.EnsureLayout(); |
3290 // NOTE: Character and glyph counts are only comparable for simple text. | 3305 // NOTE: Character and glyph counts are only comparable for simple text. |
3291 EXPECT_EQ(text.size(), | 3306 EXPECT_EQ(text.size(), |
3292 static_cast<size_t>(CTLineGetGlyphCount(render_text.line_))); | 3307 static_cast<size_t>(CTLineGetGlyphCount(render_text.line_))); |
3293 | 3308 |
3294 render_text.SetElideBehavior(ELIDE_TAIL); | 3309 render_text.SetElideBehavior(ELIDE_TAIL); |
3295 string_size.set_width(string_size.width() / 2); | 3310 string_size.set_width(string_size.width() / 2); |
3296 render_text.SetDisplayRect(gfx::Rect(string_size)); | 3311 render_text.SetDisplayRect(Rect(string_size)); |
3297 render_text.EnsureLayout(); | 3312 render_text.EnsureLayout(); |
3298 CFIndex glyph_count = CTLineGetGlyphCount(render_text.line_); | 3313 CFIndex glyph_count = CTLineGetGlyphCount(render_text.line_); |
3299 EXPECT_GT(text.size(), static_cast<size_t>(glyph_count)); | 3314 EXPECT_GT(text.size(), static_cast<size_t>(glyph_count)); |
3300 EXPECT_NE(0, glyph_count); | 3315 EXPECT_NE(0, glyph_count); |
3301 } | 3316 } |
3302 #endif | 3317 #endif |
3303 | 3318 |
3304 // Ensure color changes are picked up by the RenderText implementation. | 3319 // Ensure color changes are picked up by the RenderText implementation. |
3305 TEST_F(RenderTextTest, ColorChange) { | 3320 TEST_F(RenderTextTest, ColorChange) { |
3306 RenderTextAllBackends backend; | 3321 RenderTextAllBackends backend; |
(...skipping 18 matching lines...) Expand all Loading... |
3325 } | 3340 } |
3326 | 3341 |
3327 // Ensure style information propagates to the typeface on the text renderer. | 3342 // Ensure style information propagates to the typeface on the text renderer. |
3328 TEST_F(RenderTextTest, StylePropagated) { | 3343 TEST_F(RenderTextTest, StylePropagated) { |
3329 RenderTextAllBackends backend; | 3344 RenderTextAllBackends backend; |
3330 | 3345 |
3331 // Default-constructed fonts on Mac are system fonts. These can have all kinds | 3346 // Default-constructed fonts on Mac are system fonts. These can have all kinds |
3332 // of weird weights and style, which are preserved by PlatformFontMac, but do | 3347 // of weird weights and style, which are preserved by PlatformFontMac, but do |
3333 // not map simply to a SkTypeface::Style (the full details in SkFontStyle is | 3348 // not map simply to a SkTypeface::Style (the full details in SkFontStyle is |
3334 // needed). They also vary depending on the OS version, so set a known font. | 3349 // needed). They also vary depending on the OS version, so set a known font. |
3335 gfx::FontList font_list(gfx::Font("Arial", 10)); | 3350 FontList font_list(Font("Arial", 10)); |
3336 | 3351 |
3337 while (backend.Advance()) { | 3352 while (backend.Advance()) { |
3338 SCOPED_TRACE(testing::Message() << "backend: " << backend.GetName()); | 3353 SCOPED_TRACE(testing::Message() << "backend: " << backend.GetName()); |
3339 backend->SetText(ASCIIToUTF16("x")); | 3354 backend->SetText(ASCIIToUTF16("x")); |
3340 backend->SetFontList(font_list); | 3355 backend->SetFontList(font_list); |
3341 | 3356 |
3342 backend.DrawVisualText(); | 3357 backend.DrawVisualText(); |
3343 EXPECT_EQ(SkTypeface::kNormal, backend.paint().getTypeface()->style()); | 3358 EXPECT_EQ(SkTypeface::kNormal, backend.paint().getTypeface()->style()); |
3344 | 3359 |
3345 backend->SetStyle(TextStyle::BOLD, true); | 3360 backend->SetWeight(Font::Weight::BOLD); |
3346 backend.DrawVisualText(); | 3361 backend.DrawVisualText(); |
3347 EXPECT_EQ(SkTypeface::kBold, backend.paint().getTypeface()->style()); | 3362 EXPECT_EQ(SkTypeface::kBold, backend.paint().getTypeface()->style()); |
3348 | 3363 |
3349 backend->SetStyle(TextStyle::ITALIC, true); | 3364 backend->SetStyle(TextStyle::ITALIC, true); |
3350 backend.DrawVisualText(); | 3365 backend.DrawVisualText(); |
3351 EXPECT_EQ(SkTypeface::kBoldItalic, backend.paint().getTypeface()->style()); | 3366 EXPECT_EQ(SkTypeface::kBoldItalic, backend.paint().getTypeface()->style()); |
3352 | 3367 |
3353 backend->SetStyle(TextStyle::BOLD, false); | 3368 backend->SetWeight(Font::Weight::NORMAL); |
3354 backend.DrawVisualText(); | 3369 backend.DrawVisualText(); |
3355 EXPECT_EQ(SkTypeface::kItalic, backend.paint().getTypeface()->style()); | 3370 EXPECT_EQ(SkTypeface::kItalic, backend.paint().getTypeface()->style()); |
3356 } | 3371 } |
3357 } | 3372 } |
3358 | 3373 |
3359 // Ensure the painter adheres to RenderText::subpixel_rendering_suppressed(). | 3374 // Ensure the painter adheres to RenderText::subpixel_rendering_suppressed(). |
3360 TEST_F(RenderTextTest, SubpixelRenderingSuppressed) { | 3375 TEST_F(RenderTextTest, SubpixelRenderingSuppressed) { |
3361 RenderTextAllBackends backend; | 3376 RenderTextAllBackends backend; |
3362 | 3377 |
3363 while (backend.Advance()) { | 3378 while (backend.Advance()) { |
(...skipping 20 matching lines...) Expand all Loading... |
3384 EXPECT_FALSE(backend.paint().isLCDRenderText()); | 3399 EXPECT_FALSE(backend.paint().isLCDRenderText()); |
3385 backend.GetHarfbuzzRunList()->runs()[0]->render_params.subpixel_rendering = | 3400 backend.GetHarfbuzzRunList()->runs()[0]->render_params.subpixel_rendering = |
3386 FontRenderParams::SUBPIXEL_RENDERING_RGB; | 3401 FontRenderParams::SUBPIXEL_RENDERING_RGB; |
3387 backend.DrawVisualText(); | 3402 backend.DrawVisualText(); |
3388 #endif | 3403 #endif |
3389 EXPECT_FALSE(backend.paint().isLCDRenderText()); | 3404 EXPECT_FALSE(backend.paint().isLCDRenderText()); |
3390 } | 3405 } |
3391 } | 3406 } |
3392 | 3407 |
3393 } // namespace gfx | 3408 } // namespace gfx |
OLD | NEW |