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

Side by Side Diff: ui/gfx/render_text_unittest.cc

Issue 1819753003: Allow various font weights in gfx. (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Add a lost comment and modify a render text unittest to not test black because of test env font con… Created 4 years, 6 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 unified diff | Download patch
« no previous file with comments | « ui/gfx/render_text_mac.mm ('k') | ui/gfx/text_constants.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « ui/gfx/render_text_mac.mm ('k') | ui/gfx/text_constants.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698