| 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 427 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 438 | 438 |
| 439 // static | 439 // static |
| 440 RenderText* RenderText::CreateInstanceForEditing() { | 440 RenderText* RenderText::CreateInstanceForEditing() { |
| 441 return new RenderTextHarfBuzz; | 441 return new RenderTextHarfBuzz; |
| 442 } | 442 } |
| 443 | 443 |
| 444 void RenderText::SetText(const base::string16& text) { | 444 void RenderText::SetText(const base::string16& text) { |
| 445 DCHECK(!composition_range_.IsValid()); | 445 DCHECK(!composition_range_.IsValid()); |
| 446 if (text_ == text) | 446 if (text_ == text) |
| 447 return; | 447 return; |
| 448 text_ = text; | 448 text_.clear(); |
| 449 AppendText(text); |
| 449 | 450 |
| 450 // Adjust ranged styles, baselines, and colors to accommodate a new text | 451 // Clear style ranges as they might break new text graphemes and apply |
| 451 // length. Clear style ranges as they might break new text graphemes and apply | |
| 452 // the first style to the whole text instead. | 452 // the first style to the whole text instead. |
| 453 const size_t text_length = text_.length(); | 453 colors_.SetValue(colors_.breaks().begin()->second); |
| 454 colors_.SetMax(text_length); | |
| 455 baselines_.SetValue(baselines_.breaks().begin()->second); | 454 baselines_.SetValue(baselines_.breaks().begin()->second); |
| 456 baselines_.SetMax(text_length); | |
| 457 for (size_t style = 0; style < NUM_TEXT_STYLES; ++style) { | 455 for (size_t style = 0; style < NUM_TEXT_STYLES; ++style) { |
| 458 BreakList<bool>& break_list = styles_[style]; | 456 BreakList<bool>& break_list = styles_[style]; |
| 459 break_list.SetValue(break_list.breaks().begin()->second); | 457 break_list.SetValue(break_list.breaks().begin()->second); |
| 460 break_list.SetMax(text_length); | |
| 461 } | 458 } |
| 462 cached_bounds_and_offset_valid_ = false; | |
| 463 | 459 |
| 464 // Reset selection model. SetText should always followed by SetSelectionModel | 460 // Reset selection model. SetText should always followed by SetSelectionModel |
| 465 // or SetCursorPosition in upper layer. | 461 // or SetCursorPosition in upper layer. |
| 466 SetSelectionModel(SelectionModel()); | 462 SetSelectionModel(SelectionModel()); |
| 467 | 463 |
| 468 // Invalidate the cached text direction if it depends on the text contents. | 464 // Invalidate the cached text direction if it depends on the text contents. |
| 469 if (directionality_mode_ == DIRECTIONALITY_FROM_TEXT) | 465 if (directionality_mode_ == DIRECTIONALITY_FROM_TEXT) |
| 470 text_direction_ = base::i18n::UNKNOWN_DIRECTION; | 466 text_direction_ = base::i18n::UNKNOWN_DIRECTION; |
| 467 } |
| 471 | 468 |
| 469 void RenderText::AppendText(const base::string16& text) { |
| 470 text_ += text; |
| 471 // Adjust ranged styles and colors to accommodate a new text length. |
| 472 const size_t text_length = text_.length(); |
| 473 colors_.SetMax(text_length); |
| 474 baselines_.SetMax(text_length); |
| 475 for (size_t style = 0; style < NUM_TEXT_STYLES; ++style) { |
| 476 BreakList<bool>& break_list = styles_[style]; |
| 477 break_list.SetMax(text_length); |
| 478 } |
| 479 cached_bounds_and_offset_valid_ = false; |
| 472 obscured_reveal_index_ = -1; | 480 obscured_reveal_index_ = -1; |
| 473 OnTextAttributeChanged(); | 481 OnTextAttributeChanged(); |
| 474 } | 482 } |
| 475 | 483 |
| 476 void RenderText::SetHorizontalAlignment(HorizontalAlignment alignment) { | 484 void RenderText::SetHorizontalAlignment(HorizontalAlignment alignment) { |
| 477 if (horizontal_alignment_ != alignment) { | 485 if (horizontal_alignment_ != alignment) { |
| 478 horizontal_alignment_ = alignment; | 486 horizontal_alignment_ = alignment; |
| 479 display_offset_ = Vector2d(); | 487 display_offset_ = Vector2d(); |
| 480 cached_bounds_and_offset_valid_ = false; | 488 cached_bounds_and_offset_valid_ = false; |
| 481 } | 489 } |
| (...skipping 1014 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1496 | 1504 |
| 1497 SetDisplayOffset(display_offset_.x() + delta_x); | 1505 SetDisplayOffset(display_offset_.x() + delta_x); |
| 1498 } | 1506 } |
| 1499 | 1507 |
| 1500 void RenderText::DrawSelection(Canvas* canvas) { | 1508 void RenderText::DrawSelection(Canvas* canvas) { |
| 1501 for (const Rect& s : GetSubstringBounds(selection())) | 1509 for (const Rect& s : GetSubstringBounds(selection())) |
| 1502 canvas->FillRect(s, selection_background_focused_color_); | 1510 canvas->FillRect(s, selection_background_focused_color_); |
| 1503 } | 1511 } |
| 1504 | 1512 |
| 1505 } // namespace gfx | 1513 } // namespace gfx |
| OLD | NEW |