| 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 <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 3976 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3987 // SUBPIXEL_RENDERING_RGB set above should now take effect. But, after | 3987 // SUBPIXEL_RENDERING_RGB set above should now take effect. But, after |
| 3988 // checking, apply the override anyway to be explicit that it is suppressed. | 3988 // checking, apply the override anyway to be explicit that it is suppressed. |
| 3989 EXPECT_FALSE(GetRendererPaint().isLCDRenderText()); | 3989 EXPECT_FALSE(GetRendererPaint().isLCDRenderText()); |
| 3990 GetHarfBuzzRunList()->runs()[0]->render_params.subpixel_rendering = | 3990 GetHarfBuzzRunList()->runs()[0]->render_params.subpixel_rendering = |
| 3991 FontRenderParams::SUBPIXEL_RENDERING_RGB; | 3991 FontRenderParams::SUBPIXEL_RENDERING_RGB; |
| 3992 DrawVisualText(); | 3992 DrawVisualText(); |
| 3993 #endif | 3993 #endif |
| 3994 EXPECT_FALSE(GetRendererPaint().isLCDRenderText()); | 3994 EXPECT_FALSE(GetRendererPaint().isLCDRenderText()); |
| 3995 } | 3995 } |
| 3996 | 3996 |
| 3997 // Verify GetDecoratedWordAtPoint returns the correct baseline point and | 3997 // Verify GetDecoratedWordAndBaselineAtPoint returns the correct baseline point |
| 3998 // decorated word for an LTR string. | 3998 // and decorated word for an LTR string. |
| 3999 TEST_P(RenderTextHarfBuzzTest, GetDecoratedWordAtPoint_LTR) { | 3999 TEST_P(RenderTextHarfBuzzTest, GetDecoratedWordAndBaselineAtPoint_LTR) { |
| 4000 const base::string16 ltr = ASCIIToUTF16(" ab c "); | 4000 const base::string16 ltr = ASCIIToUTF16(" ab c "); |
| 4001 const int kWordOneStartIndex = 2; | 4001 const int kWordOneStartIndex = 2; |
| 4002 const int kWordTwoStartIndex = 6; | 4002 const int kWordTwoStartIndex = 6; |
| 4003 | 4003 |
| 4004 RenderText* render_text = GetRenderText(); | 4004 RenderText* render_text = GetRenderText(); |
| 4005 render_text->SetDisplayRect(Rect(100, 30)); | 4005 render_text->SetDisplayRect(Rect(100, 30)); |
| 4006 render_text->SetText(ltr); | 4006 render_text->SetText(ltr); |
| 4007 render_text->ApplyWeight(Font::Weight::SEMIBOLD, Range(0, 3)); | 4007 render_text->ApplyWeight(Font::Weight::SEMIBOLD, Range(0, 3)); |
| 4008 render_text->ApplyStyle(UNDERLINE, true, Range(1, 5)); | 4008 render_text->ApplyStyle(UNDERLINE, true, Range(1, 5)); |
| 4009 render_text->ApplyStyle(ITALIC, true, Range(3, 8)); | 4009 render_text->ApplyStyle(ITALIC, true, Range(3, 8)); |
| (...skipping 25 matching lines...) Expand all Loading... |
| 4035 font_spans, 0, kWordTwoStartIndex, Font::Weight::NORMAL, | 4035 font_spans, 0, kWordTwoStartIndex, Font::Weight::NORMAL, |
| 4036 ITALIC_MASK | DIAGONAL_STRIKE_MASK | STRIKE_MASK)); | 4036 ITALIC_MASK | DIAGONAL_STRIKE_MASK | STRIKE_MASK)); |
| 4037 const Rect left_glyph_word_2 = render_text->GetCursorBounds( | 4037 const Rect left_glyph_word_2 = render_text->GetCursorBounds( |
| 4038 SelectionModel(kWordTwoStartIndex, CURSOR_FORWARD), false); | 4038 SelectionModel(kWordTwoStartIndex, CURSOR_FORWARD), false); |
| 4039 | 4039 |
| 4040 DecoratedText decorated_word; | 4040 DecoratedText decorated_word; |
| 4041 Point baseline_point; | 4041 Point baseline_point; |
| 4042 | 4042 |
| 4043 { | 4043 { |
| 4044 SCOPED_TRACE(base::StringPrintf("Query to the left of text bounds")); | 4044 SCOPED_TRACE(base::StringPrintf("Query to the left of text bounds")); |
| 4045 EXPECT_TRUE(render_text->GetDecoratedWordAtPoint( | 4045 EXPECT_TRUE(render_text->GetDecoratedWordAndBaselineAtPoint( |
| 4046 Point(-5, cursor_y), &decorated_word, &baseline_point)); | 4046 Point(-5, cursor_y), &decorated_word, &baseline_point)); |
| 4047 VerifyDecoratedWordsAreEqual(expected_word_1, decorated_word); | 4047 VerifyDecoratedWordsAreEqual(expected_word_1, decorated_word); |
| 4048 EXPECT_TRUE(left_glyph_word_1.Contains(baseline_point)); | 4048 EXPECT_TRUE(left_glyph_word_1.Contains(baseline_point)); |
| 4049 } | 4049 } |
| 4050 { | 4050 { |
| 4051 SCOPED_TRACE(base::StringPrintf("Query to the right of text bounds")); | 4051 SCOPED_TRACE(base::StringPrintf("Query to the right of text bounds")); |
| 4052 EXPECT_TRUE(render_text->GetDecoratedWordAtPoint( | 4052 EXPECT_TRUE(render_text->GetDecoratedWordAndBaselineAtPoint( |
| 4053 Point(105, cursor_y), &decorated_word, &baseline_point)); | 4053 Point(105, cursor_y), &decorated_word, &baseline_point)); |
| 4054 VerifyDecoratedWordsAreEqual(expected_word_2, decorated_word); | 4054 VerifyDecoratedWordsAreEqual(expected_word_2, decorated_word); |
| 4055 EXPECT_TRUE(left_glyph_word_2.Contains(baseline_point)); | 4055 EXPECT_TRUE(left_glyph_word_2.Contains(baseline_point)); |
| 4056 } | 4056 } |
| 4057 | 4057 |
| 4058 for (size_t i = 0; i < render_text->text().length(); i++) { | 4058 for (size_t i = 0; i < render_text->text().length(); i++) { |
| 4059 SCOPED_TRACE(base::StringPrintf("Case[%" PRIuS "]", i)); | 4059 SCOPED_TRACE(base::StringPrintf("Case[%" PRIuS "]", i)); |
| 4060 // Query the decorated word using the origin of the i'th glyph's bounds. | 4060 // Query the decorated word using the origin of the i'th glyph's bounds. |
| 4061 const Point query = | 4061 const Point query = |
| 4062 render_text->GetCursorBounds(SelectionModel(i, CURSOR_FORWARD), false) | 4062 render_text->GetCursorBounds(SelectionModel(i, CURSOR_FORWARD), false) |
| 4063 .origin(); | 4063 .origin(); |
| 4064 | 4064 |
| 4065 EXPECT_TRUE(render_text->GetDecoratedWordAtPoint(query, &decorated_word, | 4065 EXPECT_TRUE(render_text->GetDecoratedWordAndBaselineAtPoint( |
| 4066 &baseline_point)); | 4066 query, &decorated_word, &baseline_point)); |
| 4067 | 4067 |
| 4068 if (i < kWordTwoStartIndex) { | 4068 if (i < kWordTwoStartIndex) { |
| 4069 VerifyDecoratedWordsAreEqual(expected_word_1, decorated_word); | 4069 VerifyDecoratedWordsAreEqual(expected_word_1, decorated_word); |
| 4070 EXPECT_TRUE(left_glyph_word_1.Contains(baseline_point)); | 4070 EXPECT_TRUE(left_glyph_word_1.Contains(baseline_point)); |
| 4071 } else { | 4071 } else { |
| 4072 VerifyDecoratedWordsAreEqual(expected_word_2, decorated_word); | 4072 VerifyDecoratedWordsAreEqual(expected_word_2, decorated_word); |
| 4073 EXPECT_TRUE(left_glyph_word_2.Contains(baseline_point)); | 4073 EXPECT_TRUE(left_glyph_word_2.Contains(baseline_point)); |
| 4074 } | 4074 } |
| 4075 } | 4075 } |
| 4076 } | 4076 } |
| 4077 | 4077 |
| 4078 // Verify GetDecoratedWordAtPoint returns the correct baseline point and | 4078 // Verify GetDecoratedWordAndBaselineAtPoint returns the correct baseline point |
| 4079 // and |
| 4079 // decorated word for an RTL string. | 4080 // decorated word for an RTL string. |
| 4080 TEST_P(RenderTextHarfBuzzTest, GetDecoratedWordAtPoint_RTL) { | 4081 TEST_P(RenderTextHarfBuzzTest, GetDecoratedWordAndBaselineAtPoint_RTL) { |
| 4081 const base::string16 rtl = WideToUTF16( | 4082 const base::string16 rtl = WideToUTF16( |
| 4082 L" " | 4083 L" " |
| 4083 L"\x0634\x0632" | 4084 L"\x0634\x0632" |
| 4084 L" " | 4085 L" " |
| 4085 L"\x0634"); | 4086 L"\x0634"); |
| 4086 const int kWordOneStartIndex = 1; | 4087 const int kWordOneStartIndex = 1; |
| 4087 const int kWordTwoStartIndex = 5; | 4088 const int kWordTwoStartIndex = 5; |
| 4088 | 4089 |
| 4089 RenderText* render_text = GetRenderText(); | 4090 RenderText* render_text = GetRenderText(); |
| 4090 render_text->SetDisplayRect(Rect(100, 30)); | 4091 render_text->SetDisplayRect(Rect(100, 30)); |
| (...skipping 28 matching lines...) Expand all Loading... |
| 4119 expected_word_2.attributes.push_back(CreateRangedAttribute( | 4120 expected_word_2.attributes.push_back(CreateRangedAttribute( |
| 4120 font_spans, 0, kWordTwoStartIndex, Font::Weight::NORMAL, UNDERLINE_MASK)); | 4121 font_spans, 0, kWordTwoStartIndex, Font::Weight::NORMAL, UNDERLINE_MASK)); |
| 4121 const Rect left_glyph_word_2 = render_text->GetCursorBounds( | 4122 const Rect left_glyph_word_2 = render_text->GetCursorBounds( |
| 4122 SelectionModel(kWordTwoStartIndex, CURSOR_FORWARD), false); | 4123 SelectionModel(kWordTwoStartIndex, CURSOR_FORWARD), false); |
| 4123 | 4124 |
| 4124 DecoratedText decorated_word; | 4125 DecoratedText decorated_word; |
| 4125 Point baseline_point; | 4126 Point baseline_point; |
| 4126 | 4127 |
| 4127 { | 4128 { |
| 4128 SCOPED_TRACE(base::StringPrintf("Query to the left of text bounds")); | 4129 SCOPED_TRACE(base::StringPrintf("Query to the left of text bounds")); |
| 4129 EXPECT_TRUE(render_text->GetDecoratedWordAtPoint( | 4130 EXPECT_TRUE(render_text->GetDecoratedWordAndBaselineAtPoint( |
| 4130 Point(-5, cursor_y), &decorated_word, &baseline_point)); | 4131 Point(-5, cursor_y), &decorated_word, &baseline_point)); |
| 4131 VerifyDecoratedWordsAreEqual(expected_word_2, decorated_word); | 4132 VerifyDecoratedWordsAreEqual(expected_word_2, decorated_word); |
| 4132 EXPECT_TRUE(left_glyph_word_2.Contains(baseline_point)); | 4133 EXPECT_TRUE(left_glyph_word_2.Contains(baseline_point)); |
| 4133 } | 4134 } |
| 4134 { | 4135 { |
| 4135 SCOPED_TRACE(base::StringPrintf("Query to the right of text bounds")); | 4136 SCOPED_TRACE(base::StringPrintf("Query to the right of text bounds")); |
| 4136 EXPECT_TRUE(render_text->GetDecoratedWordAtPoint( | 4137 EXPECT_TRUE(render_text->GetDecoratedWordAndBaselineAtPoint( |
| 4137 Point(105, cursor_y), &decorated_word, &baseline_point)); | 4138 Point(105, cursor_y), &decorated_word, &baseline_point)); |
| 4138 VerifyDecoratedWordsAreEqual(expected_word_1, decorated_word); | 4139 VerifyDecoratedWordsAreEqual(expected_word_1, decorated_word); |
| 4139 EXPECT_TRUE(left_glyph_word_1.Contains(baseline_point)); | 4140 EXPECT_TRUE(left_glyph_word_1.Contains(baseline_point)); |
| 4140 } | 4141 } |
| 4141 | 4142 |
| 4142 for (size_t i = 0; i < render_text->text().length(); i++) { | 4143 for (size_t i = 0; i < render_text->text().length(); i++) { |
| 4143 SCOPED_TRACE(base::StringPrintf("Case[%" PRIuS "]", i)); | 4144 SCOPED_TRACE(base::StringPrintf("Case[%" PRIuS "]", i)); |
| 4144 | 4145 |
| 4145 // Query the decorated word using the top right point of the i'th glyph's | 4146 // Query the decorated word using the top right point of the i'th glyph's |
| 4146 // bounds. | 4147 // bounds. |
| 4147 const Point query = | 4148 const Point query = |
| 4148 render_text->GetCursorBounds(SelectionModel(i, CURSOR_FORWARD), false) | 4149 render_text->GetCursorBounds(SelectionModel(i, CURSOR_FORWARD), false) |
| 4149 .top_right(); | 4150 .top_right(); |
| 4150 | 4151 |
| 4151 EXPECT_TRUE(render_text->GetDecoratedWordAtPoint(query, &decorated_word, | 4152 EXPECT_TRUE(render_text->GetDecoratedWordAndBaselineAtPoint( |
| 4152 &baseline_point)); | 4153 query, &decorated_word, &baseline_point)); |
| 4153 if (i < kWordTwoStartIndex) { | 4154 if (i < kWordTwoStartIndex) { |
| 4154 VerifyDecoratedWordsAreEqual(expected_word_1, decorated_word); | 4155 VerifyDecoratedWordsAreEqual(expected_word_1, decorated_word); |
| 4155 EXPECT_TRUE(left_glyph_word_1.Contains(baseline_point)); | 4156 EXPECT_TRUE(left_glyph_word_1.Contains(baseline_point)); |
| 4156 } else { | 4157 } else { |
| 4157 VerifyDecoratedWordsAreEqual(expected_word_2, decorated_word); | 4158 VerifyDecoratedWordsAreEqual(expected_word_2, decorated_word); |
| 4158 EXPECT_TRUE(left_glyph_word_2.Contains(baseline_point)); | 4159 EXPECT_TRUE(left_glyph_word_2.Contains(baseline_point)); |
| 4159 } | 4160 } |
| 4160 } | 4161 } |
| 4161 } | 4162 } |
| 4162 | 4163 |
| 4163 // Verify the boolean return value of GetDecoratedWordAtPoint. | 4164 // Verify the boolean return value of GetDecoratedWordAndBaselineAtPoint. |
| 4164 TEST_P(RenderTextHarfBuzzTest, GetDecoratedWordAtPoint_Return) { | 4165 TEST_P(RenderTextHarfBuzzTest, GetDecoratedWordAndBaselineAtPoint_Return) { |
| 4165 RenderText* render_text = GetRenderText(); | 4166 RenderText* render_text = GetRenderText(); |
| 4166 render_text->SetText(ASCIIToUTF16("...")); | 4167 render_text->SetText(ASCIIToUTF16("...")); |
| 4167 | 4168 |
| 4168 DecoratedText decorated_word; | 4169 DecoratedText decorated_word; |
| 4169 Point baseline_point; | 4170 Point baseline_point; |
| 4170 | 4171 |
| 4171 // False should be returned, when the text does not contain any word. | 4172 // False should be returned, when the text does not contain any word. |
| 4172 Point query = | 4173 Point query = |
| 4173 render_text->GetCursorBounds(SelectionModel(0, CURSOR_FORWARD), false) | 4174 render_text->GetCursorBounds(SelectionModel(0, CURSOR_FORWARD), false) |
| 4174 .origin(); | 4175 .origin(); |
| 4175 EXPECT_FALSE(render_text->GetDecoratedWordAtPoint(query, &decorated_word, | 4176 EXPECT_FALSE(render_text->GetDecoratedWordAndBaselineAtPoint( |
| 4176 &baseline_point)); | 4177 query, &decorated_word, &baseline_point)); |
| 4177 | 4178 |
| 4178 render_text->SetText(ASCIIToUTF16("abc")); | 4179 render_text->SetText(ASCIIToUTF16("abc")); |
| 4179 query = render_text->GetCursorBounds(SelectionModel(0, CURSOR_FORWARD), false) | 4180 query = render_text->GetCursorBounds(SelectionModel(0, CURSOR_FORWARD), false) |
| 4180 .origin(); | 4181 .origin(); |
| 4181 EXPECT_TRUE(render_text->GetDecoratedWordAtPoint(query, &decorated_word, | 4182 EXPECT_TRUE(render_text->GetDecoratedWordAndBaselineAtPoint( |
| 4182 &baseline_point)); | 4183 query, &decorated_word, &baseline_point)); |
| 4183 | 4184 |
| 4184 // False should be returned for obscured text. | 4185 // False should be returned for obscured text. |
| 4185 render_text->SetObscured(true); | 4186 render_text->SetObscured(true); |
| 4186 query = render_text->GetCursorBounds(SelectionModel(0, CURSOR_FORWARD), false) | 4187 query = render_text->GetCursorBounds(SelectionModel(0, CURSOR_FORWARD), false) |
| 4187 .origin(); | 4188 .origin(); |
| 4188 EXPECT_FALSE(render_text->GetDecoratedWordAtPoint(query, &decorated_word, | 4189 EXPECT_FALSE(render_text->GetDecoratedWordAndBaselineAtPoint( |
| 4189 &baseline_point)); | 4190 query, &decorated_word, &baseline_point)); |
| 4190 } | 4191 } |
| 4191 | 4192 |
| 4192 // Tests text selection made at end points of individual lines of multiline | 4193 // Tests text selection made at end points of individual lines of multiline |
| 4193 // text. | 4194 // text. |
| 4194 TEST_P(RenderTextHarfBuzzTest, LineEndSelections) { | 4195 TEST_P(RenderTextHarfBuzzTest, LineEndSelections) { |
| 4195 const wchar_t* const ltr = L"abc\n\ndef"; | 4196 const wchar_t* const ltr = L"abc\n\ndef"; |
| 4196 const wchar_t* const rtl = L"\x5d0\x5d1\x5d2\n\n\x5d3\x5d4\x5d5"; | 4197 const wchar_t* const rtl = L"\x5d0\x5d1\x5d2\n\n\x5d3\x5d4\x5d5"; |
| 4197 const int left_x = -100; | 4198 const int left_x = -100; |
| 4198 const int right_x = 200; | 4199 const int right_x = 200; |
| 4199 struct { | 4200 struct { |
| (...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4283 ::testing::Values(RENDER_TEXT_HARFBUZZ), | 4284 ::testing::Values(RENDER_TEXT_HARFBUZZ), |
| 4284 PrintRenderTextBackend()); | 4285 PrintRenderTextBackend()); |
| 4285 #endif | 4286 #endif |
| 4286 | 4287 |
| 4287 INSTANTIATE_TEST_CASE_P(, | 4288 INSTANTIATE_TEST_CASE_P(, |
| 4288 RenderTextHarfBuzzTest, | 4289 RenderTextHarfBuzzTest, |
| 4289 ::testing::Values(RENDER_TEXT_HARFBUZZ), | 4290 ::testing::Values(RENDER_TEXT_HARFBUZZ), |
| 4290 PrintRenderTextBackend()); | 4291 PrintRenderTextBackend()); |
| 4291 | 4292 |
| 4292 } // namespace gfx | 4293 } // namespace gfx |
| OLD | NEW |