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

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

Issue 916203002: Reduce the number of text reshaping in RenderText (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Created 5 years, 10 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
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 <algorithm> 7 #include <algorithm>
8 8
9 #include "base/format_macros.h" 9 #include "base/format_macros.h"
10 #include "base/i18n/break_iterator.h" 10 #include "base/i18n/break_iterator.h"
(...skipping 367 matching lines...) Expand 10 before | Expand all | Expand 10 after
378 EXPECT_EQ(valid_expect_5_and_6, render_text->GetLayoutText()); 378 EXPECT_EQ(valid_expect_5_and_6, render_text->GetLayoutText());
379 } 379 }
380 380
381 TEST_F(RenderTextTest, ElidedText) { 381 TEST_F(RenderTextTest, ElidedText) {
382 // TODO(skanuj) : Add more test cases for following 382 // TODO(skanuj) : Add more test cases for following
383 // - RenderText styles. 383 // - RenderText styles.
384 // - Cross interaction of truncate, elide and obscure. 384 // - Cross interaction of truncate, elide and obscure.
385 // - ElideText tests from text_elider.cc. 385 // - ElideText tests from text_elider.cc.
386 struct { 386 struct {
387 const wchar_t* text; 387 const wchar_t* text;
388 const wchar_t* layout_text; 388 const wchar_t* layout_text;
msw 2015/02/13 05:53:37 nit: display_text
389 const bool elision_expected; 389 const bool elision_expected;
390 } cases[] = { 390 } cases[] = {
391 // Strings shorter than the elision width should be laid out in full. 391 // Strings shorter than the elision width should be laid out in full.
392 { L"", L"" , false }, 392 { L"", L"" , false },
393 { L"M", L"" , false }, 393 { L"M", L"" , false },
394 { L" . ", L" . " , false }, 394 { L" . ", L" . " , false },
395 { kWeak, kWeak , false }, 395 { kWeak, kWeak , false },
396 { kLtr, kLtr , false }, 396 { kLtr, kLtr , false },
397 { kLtrRtl, kLtrRtl , false }, 397 { kLtrRtl, kLtrRtl , false },
398 { kLtrRtlLtr, kLtrRtlLtr, false }, 398 { kLtrRtlLtr, kLtrRtlLtr, false },
(...skipping 23 matching lines...) Expand all
422 422
423 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance()); 423 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance());
424 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px")); 424 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px"));
425 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100)); 425 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100));
426 426
427 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 427 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
428 render_text->SetFontList(FontList("serif, Sans serif, 12px")); 428 render_text->SetFontList(FontList("serif, Sans serif, 12px"));
429 render_text->SetElideBehavior(ELIDE_TAIL); 429 render_text->SetElideBehavior(ELIDE_TAIL);
430 430
431 for (size_t i = 0; i < arraysize(cases); i++) { 431 for (size_t i = 0; i < arraysize(cases); i++) {
432 SCOPED_TRACE(base::StringPrintf("Testing cases[%" PRIuS "] '%ls'", i,
433 cases[i].text));
434
432 // Compute expected width 435 // Compute expected width
433 expected_render_text->SetText(WideToUTF16(cases[i].layout_text)); 436 expected_render_text->SetText(WideToUTF16(cases[i].layout_text));
434 int expected_width = expected_render_text->GetContentWidth(); 437 int expected_width = expected_render_text->GetContentWidth();
435 438
436 base::string16 input = WideToUTF16(cases[i].text); 439 base::string16 input = WideToUTF16(cases[i].text);
437 // Extend the input text to ensure that it is wider than the layout_text, 440 // Extend the input text to ensure that it is wider than the layout_text,
438 // and so it will get elided. 441 // and so it will get elided.
439 if (cases[i].elision_expected) 442 if (cases[i].elision_expected)
440 input.append(WideToUTF16(L" MMMMMMMMMMM")); 443 input.append(WideToUTF16(L" MMMMMMMMMMM"));
441
442 render_text->SetText(input); 444 render_text->SetText(input);
443 render_text->SetDisplayRect(Rect(0, 0, expected_width, 100)); 445 render_text->SetDisplayRect(Rect(0, 0, expected_width, 100));
444 EXPECT_EQ(input, render_text->text()) 446 EXPECT_EQ(input, render_text->text());
445 << "->For case " << i << ": " << cases[i].text << "\n"; 447 EXPECT_EQ(WideToUTF16(cases[i].layout_text), render_text->GetLayoutText());
446 EXPECT_EQ(WideToUTF16(cases[i].layout_text), render_text->GetLayoutText())
447 << "->For case " << i << ": " << cases[i].text << "\n";
448 expected_render_text->SetText(base::string16()); 448 expected_render_text->SetText(base::string16());
449 } 449 }
450 } 450 }
451 451
452 TEST_F(RenderTextTest, ElidedObscuredText) { 452 TEST_F(RenderTextTest, ElidedObscuredText) {
453 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance()); 453 scoped_ptr<RenderText> expected_render_text(RenderText::CreateInstance());
454 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px")); 454 expected_render_text->SetFontList(FontList("serif, Sans serif, 12px"));
455 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100)); 455 expected_render_text->SetDisplayRect(Rect(0, 0, 9999, 100));
456 expected_render_text->SetText(WideToUTF16(L"**\x2026")); 456 expected_render_text->SetText(WideToUTF16(L"**\x2026"));
457 457
(...skipping 902 matching lines...) Expand 10 before | Expand all | Expand 10 after
1360 1360
1361 TEST_F(RenderTextTest, MinLineHeight) { 1361 TEST_F(RenderTextTest, MinLineHeight) {
1362 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1362 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1363 1363
1364 render_text->SetText(ASCIIToUTF16("Hello!")); 1364 render_text->SetText(ASCIIToUTF16("Hello!"));
1365 SizeF default_size = render_text->GetStringSizeF(); 1365 SizeF default_size = render_text->GetStringSizeF();
1366 ASSERT_NE(0, default_size.height()); 1366 ASSERT_NE(0, default_size.height());
1367 ASSERT_NE(0, default_size.width()); 1367 ASSERT_NE(0, default_size.width());
1368 1368
1369 render_text->SetMinLineHeight(default_size.height() / 2); 1369 render_text->SetMinLineHeight(default_size.height() / 2);
1370 // MacOSX does not recompute the bounds properly, so invoke ResetLayout()
1371 // explicitly.
1372 // TODO(mukai): fix this.
1373 render_text->ResetLayout();
1374 EXPECT_EQ(default_size.ToString(), render_text->GetStringSizeF().ToString()); 1370 EXPECT_EQ(default_size.ToString(), render_text->GetStringSizeF().ToString());
1375 1371
1376 render_text->SetMinLineHeight(default_size.height() * 2); 1372 render_text->SetMinLineHeight(default_size.height() * 2);
1377 render_text->ResetLayout();
1378 SizeF taller_size = render_text->GetStringSizeF(); 1373 SizeF taller_size = render_text->GetStringSizeF();
1379 EXPECT_EQ(default_size.height() * 2, taller_size.height()); 1374 EXPECT_EQ(default_size.height() * 2, taller_size.height());
1380 EXPECT_EQ(default_size.width(), taller_size.width()); 1375 EXPECT_EQ(default_size.width(), taller_size.width());
1381 } 1376 }
1382 1377
1383 TEST_F(RenderTextTest, SetFontList) { 1378 TEST_F(RenderTextTest, SetFontList) {
1384 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 1379 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
1385 render_text->SetFontList(FontList("Arial,Symbol, 13px")); 1380 render_text->SetFontList(FontList("Arial,Symbol, 13px"));
1386 const std::vector<Font>& fonts = render_text->font_list().GetFonts(); 1381 const std::vector<Font>& fonts = render_text->font_list().GetFonts();
1387 ASSERT_EQ(2U, fonts.size()); 1382 ASSERT_EQ(2U, fonts.size());
(...skipping 608 matching lines...) Expand 10 before | Expand all | Expand 10 after
1996 continue; 1991 continue;
1997 1992
1998 for (size_t j = 0; j < kTestStrings[i].lines_count; ++j) { 1993 for (size_t j = 0; j < kTestStrings[i].lines_count; ++j) {
1999 SCOPED_TRACE(base::StringPrintf("Line %" PRIuS "", j)); 1994 SCOPED_TRACE(base::StringPrintf("Line %" PRIuS "", j));
2000 VerifyLineSegments(kTestStrings[i].line_char_ranges[j], 1995 VerifyLineSegments(kTestStrings[i].line_char_ranges[j],
2001 render_text.lines_[j].segments); 1996 render_text.lines_[j].segments);
2002 } 1997 }
2003 } 1998 }
2004 } 1999 }
2005 2000
2001 // Make sure that multiple mode ignores elide behavior.
msw 2015/02/13 05:53:37 "multi-line", not "multiple". Ultimately, we want
oshima 2015/02/13 21:03:12 Done.
2002 TEST_F(RenderTextTest, Multiline_IgnoreElide) {
2003 const wchar_t kTestString[] =
2004 L"very very very long string xxxxxxxxxxxxxxxxxxxxxxxxxx";
2005 const wchar_t kEllipsis[] = L"\x2026";
2006
2007 RenderTextHarfBuzz render_text;
2008 render_text.SetElideBehavior(ELIDE_TAIL);
2009 render_text.SetDisplayRect(Rect(20, 1000));
2010 render_text.SetText(base::WideToUTF16(kTestString));
2011 EXPECT_NE(base::string16::npos,
2012 render_text.GetLayoutText().find(base::WideToUTF16(kEllipsis)));
2013
2014 render_text.SetMultiline(true);
2015 EXPECT_EQ(base::string16::npos,
2016 render_text.GetLayoutText().find(base::WideToUTF16(kEllipsis)));
2017 }
2018
2006 TEST_F(RenderTextTest, NewlineWithoutMultilineFlag) { 2019 TEST_F(RenderTextTest, NewlineWithoutMultilineFlag) {
2007 const wchar_t* kTestStrings[] = { 2020 const wchar_t* kTestStrings[] = {
2008 L"abc\ndef", L"a \n b ", L"ab\n", L"a\n\nb", L"\nab", L"\n", 2021 L"abc\ndef", L"a \n b ", L"ab\n", L"a\n\nb", L"\nab", L"\n",
2009 }; 2022 };
2010 2023
2011 RenderTextHarfBuzz render_text; 2024 RenderTextHarfBuzz render_text;
2012 render_text.SetDisplayRect(Rect(200, 1000)); 2025 render_text.SetDisplayRect(Rect(200, 1000));
2013 Canvas canvas; 2026 Canvas canvas;
2014 2027
2015 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { 2028 for (size_t i = 0; i < arraysize(kTestStrings); ++i) {
(...skipping 74 matching lines...) Expand 10 before | Expand all | Expand 10 after
2090 }; 2103 };
2091 2104
2092 RenderTextHarfBuzz render_text; 2105 RenderTextHarfBuzz render_text;
2093 2106
2094 for (size_t i = 0; i < arraysize(cases); ++i) { 2107 for (size_t i = 0; i < arraysize(cases); ++i) {
2095 SCOPED_TRACE(base::StringPrintf("Case %" PRIuS, i)); 2108 SCOPED_TRACE(base::StringPrintf("Case %" PRIuS, i));
2096 2109
2097 base::string16 text = WideToUTF16(cases[i]); 2110 base::string16 text = WideToUTF16(cases[i]);
2098 render_text.SetText(text); 2111 render_text.SetText(text);
2099 render_text.EnsureLayout(); 2112 render_text.EnsureLayout();
2100 ASSERT_EQ(1U, render_text.runs_.size()); 2113 internal::TextRunList* run_list = render_text.GetRunList();
2101 internal::TextRunHarfBuzz* run = render_text.runs_[0]; 2114 ASSERT_EQ(1U, run_list->size());
2115 internal::TextRunHarfBuzz* run = run_list->runs()[0];
2102 2116
2103 base::i18n::BreakIterator* iter = render_text.grapheme_iterator_.get(); 2117 base::i18n::BreakIterator* iter = render_text.grapheme_iterator_.get();
2104 auto first_grapheme_bounds = run->GetGraphemeBounds(iter, 0); 2118 auto first_grapheme_bounds = run->GetGraphemeBounds(iter, 0);
2105 EXPECT_EQ(first_grapheme_bounds, run->GetGraphemeBounds(iter, 1)); 2119 EXPECT_EQ(first_grapheme_bounds, run->GetGraphemeBounds(iter, 1));
2106 auto second_grapheme_bounds = run->GetGraphemeBounds(iter, 2); 2120 auto second_grapheme_bounds = run->GetGraphemeBounds(iter, 2);
2107 EXPECT_EQ(first_grapheme_bounds.second, second_grapheme_bounds.first); 2121 EXPECT_EQ(first_grapheme_bounds.second, second_grapheme_bounds.first);
2108 } 2122 }
2109 } 2123 }
2110 2124
2111 // Test the partition of a multi-grapheme cluster into grapheme ranges. 2125 // Test the partition of a multi-grapheme cluster into grapheme ranges.
(...skipping 51 matching lines...) Expand 10 before | Expand all | Expand 10 after
2163 } 2177 }
2164 } 2178 }
2165 } 2179 }
2166 2180
2167 TEST_F(RenderTextTest, HarfBuzz_RunDirection) { 2181 TEST_F(RenderTextTest, HarfBuzz_RunDirection) {
2168 RenderTextHarfBuzz render_text; 2182 RenderTextHarfBuzz render_text;
2169 const base::string16 mixed = 2183 const base::string16 mixed =
2170 WideToUTF16(L"\x05D0\x05D1" L"1234" L"\x05D2\x05D3"); 2184 WideToUTF16(L"\x05D0\x05D1" L"1234" L"\x05D2\x05D3");
2171 render_text.SetText(mixed); 2185 render_text.SetText(mixed);
2172 render_text.EnsureLayout(); 2186 render_text.EnsureLayout();
2173 ASSERT_EQ(3U, render_text.runs_.size()); 2187 internal::TextRunList* run_list = render_text.GetRunList();
2174 EXPECT_TRUE(render_text.runs_[0]->is_rtl); 2188 ASSERT_EQ(3U, run_list->size());
2175 EXPECT_FALSE(render_text.runs_[1]->is_rtl); 2189 EXPECT_TRUE(run_list->runs()[0]->is_rtl);
2176 EXPECT_TRUE(render_text.runs_[2]->is_rtl); 2190 EXPECT_FALSE(run_list->runs()[1]->is_rtl);
2191 EXPECT_TRUE(run_list->runs()[2]->is_rtl);
2177 } 2192 }
2178 2193
2179 TEST_F(RenderTextTest, HarfBuzz_BreakRunsByUnicodeBlocks) { 2194 TEST_F(RenderTextTest, HarfBuzz_BreakRunsByUnicodeBlocks) {
2180 RenderTextHarfBuzz render_text; 2195 RenderTextHarfBuzz render_text;
2181 2196
2182 // The '\x25B6' "play character" should break runs. http://crbug.com/278913 2197 // The '\x25B6' "play character" should break runs. http://crbug.com/278913
2183 render_text.SetText(WideToUTF16(L"x\x25B6y")); 2198 render_text.SetText(WideToUTF16(L"x\x25B6y"));
2184 render_text.EnsureLayout(); 2199 render_text.EnsureLayout();
2185 ASSERT_EQ(3U, render_text.runs_.size()); 2200 internal::TextRunList* run_list = render_text.GetRunList();
2186 EXPECT_EQ(Range(0, 1), render_text.runs_[0]->range); 2201 ASSERT_EQ(3U, run_list->size());
2187 EXPECT_EQ(Range(1, 2), render_text.runs_[1]->range); 2202 EXPECT_EQ(Range(0, 1), run_list->runs()[0]->range);
2188 EXPECT_EQ(Range(2, 3), render_text.runs_[2]->range); 2203 EXPECT_EQ(Range(1, 2), run_list->runs()[1]->range);
2204 EXPECT_EQ(Range(2, 3), run_list->runs()[2]->range);
2189 2205
2190 render_text.SetText(WideToUTF16(L"x \x25B6 y")); 2206 render_text.SetText(WideToUTF16(L"x \x25B6 y"));
2191 render_text.EnsureLayout(); 2207 render_text.EnsureLayout();
2192 ASSERT_EQ(3U, render_text.runs_.size()); 2208 run_list = render_text.GetRunList();
2193 EXPECT_EQ(Range(0, 2), render_text.runs_[0]->range); 2209 ASSERT_EQ(3U, run_list->size());
2194 EXPECT_EQ(Range(2, 3), render_text.runs_[1]->range); 2210 EXPECT_EQ(Range(0, 2), run_list->runs()[0]->range);
2195 EXPECT_EQ(Range(3, 5), render_text.runs_[2]->range); 2211 EXPECT_EQ(Range(2, 3), run_list->runs()[1]->range);
2212 EXPECT_EQ(Range(3, 5), run_list->runs()[2]->range);
2196 } 2213 }
2197 2214
2198 TEST_F(RenderTextTest, HarfBuzz_BreakRunsByEmoji) { 2215 TEST_F(RenderTextTest, HarfBuzz_BreakRunsByEmoji) {
2199 RenderTextHarfBuzz render_text; 2216 RenderTextHarfBuzz render_text;
2200 2217
2201 // \xF0\x9F\x98\x81 (U+1F601) is smile icon emoji. \xE2\x9C\xA8 (U+2728) is 2218 // \xF0\x9F\x98\x81 (U+1F601) is smile icon emoji. \xE2\x9C\xA8 (U+2728) is
2202 // a sparkle icon. Both can be drawn with color emoji fonts, so runs should be 2219 // a sparkle icon. Both can be drawn with color emoji fonts, so runs should be
2203 // separated. See crbug.com/448909 2220 // separated. See crbug.com/448909
2204 render_text.SetText(UTF8ToUTF16("x\xF0\x9F\x98\x81y\xE2\x9C\xA8")); 2221 render_text.SetText(UTF8ToUTF16("x\xF0\x9F\x98\x81y\xE2\x9C\xA8"));
2205 render_text.EnsureLayout(); 2222 render_text.EnsureLayout();
2206 ASSERT_EQ(4U, render_text.runs_.size()); 2223 internal::TextRunList* run_list = render_text.GetRunList();
2207 EXPECT_EQ(Range(0, 1), render_text.runs_[0]->range); 2224 ASSERT_EQ(4U, run_list->size());
2225 EXPECT_EQ(Range(0, 1), run_list->runs()[0]->range);
2208 // The length is 2 since U+1F601 is represented as a surrogate pair in UTF16. 2226 // The length is 2 since U+1F601 is represented as a surrogate pair in UTF16.
2209 EXPECT_EQ(Range(1, 3), render_text.runs_[1]->range); 2227 EXPECT_EQ(Range(1, 3), run_list->runs()[1]->range);
2210 EXPECT_EQ(Range(3, 4), render_text.runs_[2]->range); 2228 EXPECT_EQ(Range(3, 4), run_list->runs()[2]->range);
2211 EXPECT_EQ(Range(4, 5), render_text.runs_[3]->range); 2229 EXPECT_EQ(Range(4, 5), run_list->runs()[3]->range);
2212 } 2230 }
2213 2231
2214 TEST_F(RenderTextTest, GlyphBounds) { 2232 TEST_F(RenderTextTest, GlyphBounds) {
2215 const wchar_t* kTestStrings[] = { 2233 const wchar_t* kTestStrings[] = {
2216 L"asdf 1234 qwer", L"\x0647\x0654", L"\x0645\x0631\x062D\x0628\x0627" 2234 L"asdf 1234 qwer", L"\x0647\x0654", L"\x0645\x0631\x062D\x0628\x0627"
2217 }; 2235 };
2218 scoped_ptr<RenderText> render_text(new RenderTextHarfBuzz); 2236 scoped_ptr<RenderText> render_text(new RenderTextHarfBuzz);
2219 2237
2220 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { 2238 for (size_t i = 0; i < arraysize(kTestStrings); ++i) {
2221 render_text->SetText(WideToUTF16(kTestStrings[i])); 2239 render_text->SetText(WideToUTF16(kTestStrings[i]));
2222 render_text->EnsureLayout(); 2240 render_text->EnsureLayout();
2223 2241
2224 for (size_t j = 0; j < render_text->text().length(); ++j) 2242 for (size_t j = 0; j < render_text->text().length(); ++j)
2225 EXPECT_FALSE(render_text->GetGlyphBounds(j).is_empty()); 2243 EXPECT_FALSE(render_text->GetGlyphBounds(j).is_empty());
2226 } 2244 }
2227 } 2245 }
2228 2246
2229 // Ensure that shaping with a non-existent font does not cause a crash. 2247 // Ensure that shaping with a non-existent font does not cause a crash.
2230 TEST_F(RenderTextTest, HarfBuzz_NonExistentFont) { 2248 TEST_F(RenderTextTest, HarfBuzz_NonExistentFont) {
2231 RenderTextHarfBuzz render_text; 2249 RenderTextHarfBuzz render_text;
2232 render_text.SetText(ASCIIToUTF16("test")); 2250 render_text.SetText(ASCIIToUTF16("test"));
2233 render_text.EnsureLayout(); 2251 render_text.EnsureLayout();
2234 ASSERT_EQ(1U, render_text.runs_.size()); 2252 internal::TextRunList* run_list = render_text.GetRunList();
2235 internal::TextRunHarfBuzz* run = render_text.runs_[0]; 2253 ASSERT_EQ(1U, run_list->size());
2254 internal::TextRunHarfBuzz* run = run_list->runs()[0];
2236 render_text.ShapeRunWithFont( 2255 render_text.ShapeRunWithFont(
2237 run, "TheFontThatDoesntExist", FontRenderParams()); 2256 render_text.text(), "TheFontThatDoesntExist", FontRenderParams(), run);
2238 } 2257 }
2239 2258
2240 // Ensure an empty run returns sane values to queries. 2259 // Ensure an empty run returns sane values to queries.
2241 TEST_F(RenderTextTest, HarfBuzz_EmptyRun) { 2260 TEST_F(RenderTextTest, HarfBuzz_EmptyRun) {
2242 internal::TextRunHarfBuzz run; 2261 internal::TextRunHarfBuzz run;
2243 const base::string16 kString = ASCIIToUTF16("abcdefgh"); 2262 const base::string16 kString = ASCIIToUTF16("abcdefgh");
2244 scoped_ptr<base::i18n::BreakIterator> iter(new base::i18n::BreakIterator( 2263 scoped_ptr<base::i18n::BreakIterator> iter(new base::i18n::BreakIterator(
2245 kString, base::i18n::BreakIterator::BREAK_CHARACTER)); 2264 kString, base::i18n::BreakIterator::BREAK_CHARACTER));
2246 ASSERT_TRUE(iter->Init()); 2265 ASSERT_TRUE(iter->Init());
2247 2266
(...skipping 57 matching lines...) Expand 10 before | Expand all | Expand 10 after
2305 PlatformFontWin* font_win = new PlatformFontWin("Meiryo", 12); 2324 PlatformFontWin* font_win = new PlatformFontWin("Meiryo", 12);
2306 // Japanese name for Meiryo. This name won't be found in the system's linked 2325 // Japanese name for Meiryo. This name won't be found in the system's linked
2307 // fonts, forcing RTHB to try the Uniscribe font and its fallbacks. 2326 // fonts, forcing RTHB to try the Uniscribe font and its fallbacks.
2308 font_win->font_ref_->font_name_ = WideToUTF8(L"\x30e1\x30a4\x30ea\x30aa"); 2327 font_win->font_ref_->font_name_ = WideToUTF8(L"\x30e1\x30a4\x30ea\x30aa");
2309 FontList font_list((Font(font_win))); 2328 FontList font_list((Font(font_win)));
2310 2329
2311 render_text.SetFontList(font_list); 2330 render_text.SetFontList(font_list);
2312 // Korean character "han". 2331 // Korean character "han".
2313 render_text.SetText(WideToUTF16(L"\xd55c")); 2332 render_text.SetText(WideToUTF16(L"\xd55c"));
2314 render_text.EnsureLayout(); 2333 render_text.EnsureLayout();
2315 ASSERT_EQ(1U, render_text.runs_.size()); 2334 internal::TextRunList* run_list = render_text.GetRunList();
2316 EXPECT_EQ(0U, render_text.runs_[0]->CountMissingGlyphs()); 2335 ASSERT_EQ(1U, run_list->size());
2336 EXPECT_EQ(0U, run_list->runs()[0]->CountMissingGlyphs());
2317 } 2337 }
2318 #endif // defined(OS_WIN) 2338 #endif // defined(OS_WIN)
2319 2339
2320 // Ensure that the width reported by RenderText is sufficient for drawing. Draws 2340 // Ensure that the width reported by RenderText is sufficient for drawing. Draws
2321 // to a canvas and checks whether any pixel beyond the width is colored. 2341 // to a canvas and checks whether any pixel beyond the width is colored.
2322 TEST_F(RenderTextTest, TextDoesntClip) { 2342 TEST_F(RenderTextTest, TextDoesntClip) {
2323 const wchar_t* kTestStrings[] = { L"Save", L"Remove", L"TEST", L"W", L"WWW" }; 2343 const wchar_t* kTestStrings[] = { L"Save", L"Remove", L"TEST", L"W", L"WWW" };
2324 const Size kCanvasSize(300, 50); 2344 const Size kCanvasSize(300, 50);
2325 const int kTestWidth = 10; 2345 const int kTestWidth = 10;
2326 2346
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
2383 base::StringToLowerASCII(fonts[0].GetActualFontNameForTesting())); 2403 base::StringToLowerASCII(fonts[0].GetActualFontNameForTesting()));
2384 2404
2385 scoped_ptr<RenderText> render_text(RenderText::CreateInstance()); 2405 scoped_ptr<RenderText> render_text(RenderText::CreateInstance());
2386 render_text->SetDisplayRect(Rect(0, 0, 25, 25)); 2406 render_text->SetDisplayRect(Rect(0, 0, 25, 25));
2387 render_text->SetFontList(font_list); 2407 render_text->SetFontList(font_list);
2388 EXPECT_GT(render_text->GetBaseline(), font_list.GetBaseline()); 2408 EXPECT_GT(render_text->GetBaseline(), font_list.GetBaseline());
2389 } 2409 }
2390 #endif 2410 #endif
2391 2411
2392 } // namespace gfx 2412 } // namespace gfx
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698