| 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 #include <climits> | 8 #include <climits> |
| 9 | 9 |
| 10 #include "base/command_line.h" | 10 #include "base/command_line.h" |
| (...skipping 1169 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1180 text_direction_ = base::i18n::RIGHT_TO_LEFT; | 1180 text_direction_ = base::i18n::RIGHT_TO_LEFT; |
| 1181 break; | 1181 break; |
| 1182 default: | 1182 default: |
| 1183 NOTREACHED(); | 1183 NOTREACHED(); |
| 1184 } | 1184 } |
| 1185 } | 1185 } |
| 1186 | 1186 |
| 1187 return text_direction_; | 1187 return text_direction_; |
| 1188 } | 1188 } |
| 1189 | 1189 |
| 1190 size_t RenderText::TextIndexToGivenTextIndex(const base::string16& given_text, |
| 1191 size_t index) { |
| 1192 DCHECK(given_text == layout_text() || given_text == display_text()); |
| 1193 DCHECK_LE(index, text().length()); |
| 1194 ptrdiff_t i = obscured() ? UTF16IndexToOffset(text(), 0, index) : index; |
| 1195 CHECK_GE(i, 0); |
| 1196 // Clamp indices to the length of the given layout or display text. |
| 1197 return std::min<size_t>(given_text.length(), i); |
| 1198 } |
| 1199 |
| 1190 // static | 1200 // static |
| 1191 bool RenderText::RangeContainsCaret(const Range& range, | 1201 bool RenderText::RangeContainsCaret(const Range& range, |
| 1192 size_t caret_pos, | 1202 size_t caret_pos, |
| 1193 LogicalCursorDirection caret_affinity) { | 1203 LogicalCursorDirection caret_affinity) { |
| 1194 // NB: exploits unsigned wraparound (WG14/N1124 section 6.2.5 paragraph 9). | 1204 // NB: exploits unsigned wraparound (WG14/N1124 section 6.2.5 paragraph 9). |
| 1195 size_t adjacent = (caret_affinity == CURSOR_BACKWARD) ? | 1205 size_t adjacent = (caret_affinity == CURSOR_BACKWARD) ? |
| 1196 caret_pos - 1 : caret_pos + 1; | 1206 caret_pos - 1 : caret_pos + 1; |
| 1197 return range.Contains(Range(caret_pos, adjacent)); | 1207 return range.Contains(Range(caret_pos, adjacent)); |
| 1198 } | 1208 } |
| 1199 | 1209 |
| 1200 void RenderText::MoveCursorTo(size_t position, bool select) { | 1210 void RenderText::MoveCursorTo(size_t position, bool select) { |
| 1201 size_t cursor = std::min(position, text().length()); | 1211 size_t cursor = std::min(position, text().length()); |
| 1202 if (IsValidCursorIndex(cursor)) | 1212 if (IsValidCursorIndex(cursor)) |
| 1203 SetSelectionModel(SelectionModel( | 1213 SetSelectionModel(SelectionModel( |
| 1204 Range(select ? selection().start() : cursor, cursor), | 1214 Range(select ? selection().start() : cursor, cursor), |
| 1205 (cursor == 0) ? CURSOR_FORWARD : CURSOR_BACKWARD)); | 1215 (cursor == 0) ? CURSOR_FORWARD : CURSOR_BACKWARD)); |
| 1206 } | 1216 } |
| 1207 | 1217 |
| 1208 void RenderText::OnTextAttributeChanged() { | 1218 void RenderText::OnTextAttributeChanged() { |
| 1209 layout_text_.clear(); | 1219 layout_text_.clear(); |
| 1210 display_text_.clear(); | 1220 display_text_.clear(); |
| 1221 text_elided_ = false; |
| 1211 line_breaks_.SetMax(0); | 1222 line_breaks_.SetMax(0); |
| 1212 | 1223 |
| 1213 if (obscured_) { | 1224 if (obscured_) { |
| 1214 size_t obscured_text_length = | 1225 size_t obscured_text_length = |
| 1215 static_cast<size_t>(UTF16IndexToOffset(text_, 0, text_.length())); | 1226 static_cast<size_t>(UTF16IndexToOffset(text_, 0, text_.length())); |
| 1216 layout_text_.assign(obscured_text_length, kPasswordReplacementChar); | 1227 layout_text_.assign(obscured_text_length, kPasswordReplacementChar); |
| 1217 | 1228 |
| 1218 if (obscured_reveal_index_ >= 0 && | 1229 if (obscured_reveal_index_ >= 0 && |
| 1219 obscured_reveal_index_ < static_cast<int>(text_.length())) { | 1230 obscured_reveal_index_ < static_cast<int>(text_.length())) { |
| 1220 // Gets the index range in |text_| to be revealed. | 1231 // Gets the index range in |text_| to be revealed. |
| (...skipping 232 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1453 | 1464 |
| 1454 SetDisplayOffset(display_offset_.x() + delta_x); | 1465 SetDisplayOffset(display_offset_.x() + delta_x); |
| 1455 } | 1466 } |
| 1456 | 1467 |
| 1457 void RenderText::DrawSelection(Canvas* canvas) { | 1468 void RenderText::DrawSelection(Canvas* canvas) { |
| 1458 for (const Rect& s : GetSubstringBounds(selection())) | 1469 for (const Rect& s : GetSubstringBounds(selection())) |
| 1459 canvas->FillRect(s, selection_background_focused_color_); | 1470 canvas->FillRect(s, selection_background_focused_color_); |
| 1460 } | 1471 } |
| 1461 | 1472 |
| 1462 } // namespace gfx | 1473 } // namespace gfx |
| OLD | NEW |