| 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 411 matching lines...) Expand 10 before | Expand all | Expand 10 after 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. |
| 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 |