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 2072 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2083 } | 2083 } |
2084 | 2084 |
2085 // Ensure strings wrap onto multiple lines for a small available width. | 2085 // Ensure strings wrap onto multiple lines for a small available width. |
2086 TEST_F(RenderTextTest, Multiline_MinWidth) { | 2086 TEST_F(RenderTextTest, Multiline_MinWidth) { |
2087 const wchar_t* kTestStrings[] = { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl, | 2087 const wchar_t* kTestStrings[] = { kWeak, kLtr, kLtrRtl, kLtrRtlLtr, kRtl, |
2088 kRtlLtr, kRtlLtrRtl }; | 2088 kRtlLtr, kRtlLtrRtl }; |
2089 | 2089 |
2090 RenderTextHarfBuzz render_text; | 2090 RenderTextHarfBuzz render_text; |
2091 render_text.SetDisplayRect(Rect(1, 1000)); | 2091 render_text.SetDisplayRect(Rect(1, 1000)); |
2092 render_text.SetMultiline(true); | 2092 render_text.SetMultiline(true); |
| 2093 render_text.SetWordWrapBehavior(WRAP_LONG_WORDS); |
2093 Canvas canvas; | 2094 Canvas canvas; |
2094 | 2095 |
2095 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { | 2096 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
2096 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i)); | 2097 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i)); |
2097 render_text.SetText(WideToUTF16(kTestStrings[i])); | 2098 render_text.SetText(WideToUTF16(kTestStrings[i])); |
2098 render_text.Draw(&canvas); | 2099 render_text.Draw(&canvas); |
2099 EXPECT_GT(render_text.lines_.size(), 1U); | 2100 EXPECT_GT(render_text.lines_.size(), 1U); |
2100 } | 2101 } |
2101 } | 2102 } |
2102 | 2103 |
(...skipping 13 matching lines...) Expand all Loading... |
2116 { L"\x062A\x0641\x0627\x062D\x05EA\x05E4\x05D5\x05D6\x05D9" | 2117 { L"\x062A\x0641\x0627\x062D\x05EA\x05E4\x05D5\x05D6\x05D9" |
2117 L"\x05DA\x05DB\x05DD", Range(0, 4), Range(4, 12), false } | 2118 L"\x05DA\x05DB\x05DD", Range(0, 4), Range(4, 12), false } |
2118 }; | 2119 }; |
2119 | 2120 |
2120 RenderTextHarfBuzz render_text; | 2121 RenderTextHarfBuzz render_text; |
2121 // Specify the fixed width for characters to suppress the possible variations | 2122 // Specify the fixed width for characters to suppress the possible variations |
2122 // of linebreak results. | 2123 // of linebreak results. |
2123 render_text.set_glyph_width_for_test(5); | 2124 render_text.set_glyph_width_for_test(5); |
2124 render_text.SetDisplayRect(Rect(50, 1000)); | 2125 render_text.SetDisplayRect(Rect(50, 1000)); |
2125 render_text.SetMultiline(true); | 2126 render_text.SetMultiline(true); |
| 2127 render_text.SetWordWrapBehavior(WRAP_LONG_WORDS); |
2126 render_text.SetHorizontalAlignment(ALIGN_TO_HEAD); | 2128 render_text.SetHorizontalAlignment(ALIGN_TO_HEAD); |
2127 | 2129 |
2128 Canvas canvas; | 2130 Canvas canvas; |
2129 TestSkiaTextRenderer renderer(&canvas); | 2131 TestSkiaTextRenderer renderer(&canvas); |
2130 | 2132 |
2131 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { | 2133 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
2132 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i)); | 2134 SCOPED_TRACE(base::StringPrintf("kTestStrings[%" PRIuS "]", i)); |
2133 render_text.SetText(WideToUTF16(kTestStrings[i].text)); | 2135 render_text.SetText(WideToUTF16(kTestStrings[i].text)); |
2134 render_text.EnsureLayout(); | 2136 render_text.EnsureLayout(); |
2135 render_text.DrawVisualTextInternal(&renderer); | 2137 render_text.DrawVisualTextInternal(&renderer); |
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2302 std::vector<base::string16> lines; | 2304 std::vector<base::string16> lines; |
2303 base::SplitString(base::WideToUTF16(kTestStrings[i].text), '\n', &lines); | 2305 base::SplitString(base::WideToUTF16(kTestStrings[i].text), '\n', &lines); |
2304 ASSERT_EQ(2u, lines.size()); | 2306 ASSERT_EQ(2u, lines.size()); |
2305 int difference = (lines[0].length() - lines[1].length()) * kGlyphSize; | 2307 int difference = (lines[0].length() - lines[1].length()) * kGlyphSize; |
2306 EXPECT_EQ(render_text.GetAlignmentOffset(0).x() + difference, | 2308 EXPECT_EQ(render_text.GetAlignmentOffset(0).x() + difference, |
2307 render_text.GetAlignmentOffset(1).x()); | 2309 render_text.GetAlignmentOffset(1).x()); |
2308 } | 2310 } |
2309 } | 2311 } |
2310 } | 2312 } |
2311 | 2313 |
| 2314 TEST_F(RenderTextTest, Multiline_WordWrapBehavior) { |
| 2315 const int kGlyphSize = 5; |
| 2316 const struct { |
| 2317 const WordWrapBehavior behavior; |
| 2318 const size_t num_lines; |
| 2319 const Range char_ranges[4]; |
| 2320 } kTestScenarios[] = { |
| 2321 { IGNORE_LONG_WORDS, 3u, |
| 2322 { Range(0, 4), Range(4, 11), Range(11, 14), Range::InvalidRange() } }, |
| 2323 { TRUNCATE_LONG_WORDS, 3u, |
| 2324 { Range(0, 4), Range(4, 8), Range(11, 14), Range::InvalidRange() } }, |
| 2325 { WRAP_LONG_WORDS, 4u, |
| 2326 { Range(0, 4), Range(4, 8), Range(8, 11), Range(11, 14) } }, |
| 2327 // TODO(mukai): implement ELIDE_LONG_WORDS. It's not used right now. |
| 2328 }; |
| 2329 RenderTextHarfBuzz render_text; |
| 2330 render_text.SetMultiline(true); |
| 2331 render_text.SetText(ASCIIToUTF16("foo fooooo foo")); |
| 2332 render_text.set_glyph_width_for_test(kGlyphSize); |
| 2333 render_text.SetDisplayRect(Rect(0, 0, kGlyphSize * 4, 0)); |
| 2334 |
| 2335 Canvas canvas; |
| 2336 |
| 2337 for (size_t i = 0; i < arraysize(kTestScenarios); ++i) { |
| 2338 SCOPED_TRACE(base::StringPrintf( |
| 2339 "kTestScenarios[%" PRIuS "] %d", i, kTestScenarios[i].behavior)); |
| 2340 render_text.SetWordWrapBehavior(kTestScenarios[i].behavior); |
| 2341 render_text.Draw(&canvas); |
| 2342 |
| 2343 ASSERT_EQ(kTestScenarios[i].num_lines, render_text.lines().size()); |
| 2344 for (size_t j = 0; j < render_text.lines().size(); ++j) { |
| 2345 SCOPED_TRACE(base::StringPrintf("%" PRIuS "-th line", j)); |
| 2346 EXPECT_EQ(kTestScenarios[i].char_ranges[j], |
| 2347 render_text.lines()[j].segments[0].char_range); |
| 2348 EXPECT_EQ(kTestScenarios[i].char_ranges[j].length() * kGlyphSize, |
| 2349 render_text.lines()[j].size.width()); |
| 2350 } |
| 2351 } |
| 2352 } |
| 2353 |
2312 TEST_F(RenderTextTest, NewlineWithoutMultilineFlag) { | 2354 TEST_F(RenderTextTest, NewlineWithoutMultilineFlag) { |
2313 const wchar_t* kTestStrings[] = { | 2355 const wchar_t* kTestStrings[] = { |
2314 L"abc\ndef", L"a \n b ", L"ab\n", L"a\n\nb", L"\nab", L"\n", | 2356 L"abc\ndef", L"a \n b ", L"ab\n", L"a\n\nb", L"\nab", L"\n", |
2315 }; | 2357 }; |
2316 | 2358 |
2317 RenderTextHarfBuzz render_text; | 2359 RenderTextHarfBuzz render_text; |
2318 render_text.SetDisplayRect(Rect(200, 1000)); | 2360 render_text.SetDisplayRect(Rect(200, 1000)); |
2319 Canvas canvas; | 2361 Canvas canvas; |
2320 | 2362 |
2321 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { | 2363 for (size_t i = 0; i < arraysize(kTestStrings); ++i) { |
(...skipping 564 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2886 string_size.set_width(string_size.width() / 2); | 2928 string_size.set_width(string_size.width() / 2); |
2887 render_text.SetDisplayRect(gfx::Rect(string_size)); | 2929 render_text.SetDisplayRect(gfx::Rect(string_size)); |
2888 render_text.EnsureLayout(); | 2930 render_text.EnsureLayout(); |
2889 CFIndex glyph_count = CTLineGetGlyphCount(render_text.line_); | 2931 CFIndex glyph_count = CTLineGetGlyphCount(render_text.line_); |
2890 EXPECT_GT(text.size(), static_cast<size_t>(glyph_count)); | 2932 EXPECT_GT(text.size(), static_cast<size_t>(glyph_count)); |
2891 EXPECT_NE(0, glyph_count); | 2933 EXPECT_NE(0, glyph_count); |
2892 } | 2934 } |
2893 #endif | 2935 #endif |
2894 | 2936 |
2895 } // namespace gfx | 2937 } // namespace gfx |
OLD | NEW |