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 <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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 Loading... | |
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 |
OLD | NEW |