Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(172)

Side by Side Diff: ui/gfx/render_text.h

Issue 2541313002: RenderTextHarfBuzz: Add support for multi line text selection. (Closed)
Patch Set: Tests Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « no previous file | ui/gfx/render_text.cc » ('j') | ui/gfx/render_text_harfbuzz.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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 #ifndef UI_GFX_RENDER_TEXT_H_ 5 #ifndef UI_GFX_RENDER_TEXT_H_
6 #define UI_GFX_RENDER_TEXT_H_ 6 #define UI_GFX_RENDER_TEXT_H_
7 7
8 #include <stddef.h> 8 #include <stddef.h>
9 #include <stdint.h> 9 #include <stdint.h>
10 10
(...skipping 22 matching lines...) Expand all
33 #include "ui/gfx/selection_model.h" 33 #include "ui/gfx/selection_model.h"
34 #include "ui/gfx/shadow_value.h" 34 #include "ui/gfx/shadow_value.h"
35 #include "ui/gfx/text_constants.h" 35 #include "ui/gfx/text_constants.h"
36 36
37 class SkCanvas; 37 class SkCanvas;
38 class SkDrawLooper; 38 class SkDrawLooper;
39 struct SkPoint; 39 struct SkPoint;
40 class SkShader; 40 class SkShader;
41 class SkTypeface; 41 class SkTypeface;
42 42
43 namespace views {
msw 2016/12/13 03:04:55 Hmm, gfx shouldn't reference views, and I'm not su
karandeepb 2016/12/16 02:58:38 Would like to have a test testing multiline select
44 class LabelSelectionTest;
45 }
46
43 namespace gfx { 47 namespace gfx {
44 namespace test { 48 namespace test {
45 class RenderTextTestApi; 49 class RenderTextTestApi;
46 } 50 }
47 51
48 class Canvas; 52 class Canvas;
49 struct DecoratedText; 53 struct DecoratedText;
50 class Font; 54 class Font;
51 55
52 namespace internal { 56 namespace internal {
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
202 SkPaint* paint); 206 SkPaint* paint);
203 207
204 } // namespace internal 208 } // namespace internal
205 209
206 // RenderText represents an abstract model of styled text and its corresponding 210 // RenderText represents an abstract model of styled text and its corresponding
207 // visual layout. Support is built in for a cursor, a selection, simple styling, 211 // visual layout. Support is built in for a cursor, a selection, simple styling,
208 // complex scripts, and bi-directional text. Implementations provide mechanisms 212 // complex scripts, and bi-directional text. Implementations provide mechanisms
209 // for rendering and translation between logical and visual data. 213 // for rendering and translation between logical and visual data.
210 class GFX_EXPORT RenderText { 214 class GFX_EXPORT RenderText {
211 public: 215 public:
212 // The character used for displaying obscured text.
213 // TODO(benrg): GTK uses the first of U+25CF, U+2022, U+2731, U+273A, '*'
214 // that's available in the font (find_invisible_char() in gtkentry.c).
215 // Use a bullet character on Mac.
216 #if defined(OS_MACOSX) 216 #if defined(OS_MACOSX)
217 // The character used for displaying obscured text. Use a bullet character on
218 // Mac.
217 static constexpr base::char16 kPasswordReplacementChar = 0x2022; 219 static constexpr base::char16 kPasswordReplacementChar = 0x2022;
220
221 // On Mac, while selecting text if the cursor is outside the vertical text
222 // bounds, drag to the end of the text.
223 static constexpr bool kDragToEndIfOutsideVerticalBounds = true;
218 #else 224 #else
219 static constexpr base::char16 kPasswordReplacementChar = '*'; 225 static constexpr base::char16 kPasswordReplacementChar = '*';
226 static constexpr bool kDragToEndIfOutsideVerticalBounds = false;
220 #endif 227 #endif
221 228
222 virtual ~RenderText(); 229 virtual ~RenderText();
223 230
224 // Creates a platform-specific or cross-platform RenderText instance. 231 // Creates a platform-specific or cross-platform RenderText instance.
225 static RenderText* CreateInstance(); 232 static RenderText* CreateInstance();
226 static RenderText* CreateInstanceForEditing(); 233 static RenderText* CreateInstanceForEditing();
227 234
228 // Creates another instance of the same concrete class. 235 // Creates another instance of the same concrete class.
229 virtual std::unique_ptr<RenderText> CreateInstanceOfSameType() const = 0; 236 virtual std::unique_ptr<RenderText> CreateInstanceOfSameType() const = 0;
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
405 // RenderText. 412 // RenderText.
406 bool GetStyle(TextStyle style) const; 413 bool GetStyle(TextStyle style) const;
407 414
408 // Set or get the text directionality mode and get the text direction yielded. 415 // Set or get the text directionality mode and get the text direction yielded.
409 void SetDirectionalityMode(DirectionalityMode mode); 416 void SetDirectionalityMode(DirectionalityMode mode);
410 DirectionalityMode directionality_mode() const { 417 DirectionalityMode directionality_mode() const {
411 return directionality_mode_; 418 return directionality_mode_;
412 } 419 }
413 base::i18n::TextDirection GetDisplayTextDirection(); 420 base::i18n::TextDirection GetDisplayTextDirection();
414 421
415 // Returns the visual movement direction corresponding to the logical end 422 // Returns the visual movement direction corresponding to the logical
416 // of the text, considering only the dominant direction returned by 423 // end/beginning of the text, considering only the dominant direction returned
417 // |GetDisplayTextDirection()|, not the direction of a particular run. 424 // by |GetDisplayTextDirection()|, not the direction of a particular run.
418 VisualCursorDirection GetVisualDirectionOfLogicalEnd(); 425 VisualCursorDirection GetVisualDirectionOfLogicalEnd();
426 VisualCursorDirection GetVisualDirectionOfLogicalBeginning();
419 427
420 // Returns the text used to display, which may be obscured, truncated or 428 // Returns the text used to display, which may be obscured, truncated or
421 // elided. The subclass may compute elided text on the fly, or use 429 // elided. The subclass may compute elided text on the fly, or use
422 // precomputed the elided text. 430 // precomputed the elided text.
423 virtual const base::string16& GetDisplayText() = 0; 431 virtual const base::string16& GetDisplayText() = 0;
424 432
425 // Returns the size required to display the current string (which is the 433 // Returns the size required to display the current string (which is the
426 // wrapped size in multiline mode). The returned size does not include space 434 // wrapped size in multiline mode). The returned size does not include space
427 // reserved for the cursor or the offset text shadows. 435 // reserved for the cursor or the offset text shadows.
428 virtual Size GetStringSize() = 0; 436 virtual Size GetStringSize() = 0;
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after
466 // Returns true if this instance supports text selection. 474 // Returns true if this instance supports text selection.
467 virtual bool IsSelectionSupported() const = 0; 475 virtual bool IsSelectionSupported() const = 0;
468 476
469 // Get the visual bounds of a cursor at |caret|. These bounds typically 477 // Get the visual bounds of a cursor at |caret|. These bounds typically
470 // represent a vertical line if |insert_mode| is true. Pass false for 478 // represent a vertical line if |insert_mode| is true. Pass false for
471 // |insert_mode| to retrieve the bounds of the associated glyph. These bounds 479 // |insert_mode| to retrieve the bounds of the associated glyph. These bounds
472 // are in local coordinates, but may be outside the visible region if the text 480 // are in local coordinates, but may be outside the visible region if the text
473 // is longer than the textfield. Subsequent text, cursor, or bounds changes 481 // is longer than the textfield. Subsequent text, cursor, or bounds changes
474 // may invalidate returned values. Note that |caret| must be placed at 482 // may invalidate returned values. Note that |caret| must be placed at
475 // grapheme boundary, i.e. caret.caret_pos() must be a cursorable position. 483 // grapheme boundary, i.e. caret.caret_pos() must be a cursorable position.
484 // TODO(crbug.com/248597): Add multiline support.
476 Rect GetCursorBounds(const SelectionModel& caret, bool insert_mode); 485 Rect GetCursorBounds(const SelectionModel& caret, bool insert_mode);
477 486
478 // Compute the current cursor bounds, panning the text to show the cursor in 487 // Compute the current cursor bounds, panning the text to show the cursor in
479 // the display rect if necessary. These bounds are in local coordinates. 488 // the display rect if necessary. These bounds are in local coordinates.
480 // Subsequent text, cursor, or bounds changes may invalidate returned values. 489 // Subsequent text, cursor, or bounds changes may invalidate returned values.
481 const Rect& GetUpdatedCursorBounds(); 490 const Rect& GetUpdatedCursorBounds();
482 491
483 // Given an |index| in text(), return the next or previous grapheme boundary 492 // Given an |index| in text(), return the next or previous grapheme boundary
484 // in logical order (i.e. the nearest cursorable index). The return value is 493 // in logical order (i.e. the nearest cursorable index). The return value is
485 // in the range 0 to text().length() inclusive (the input is clamped if it is 494 // in the range 0 to text().length() inclusive (the input is clamped if it is
(...skipping 98 matching lines...) Expand 10 before | Expand all | Expand 10 after
584 virtual SelectionModel AdjacentCharSelectionModel( 593 virtual SelectionModel AdjacentCharSelectionModel(
585 const SelectionModel& selection, 594 const SelectionModel& selection,
586 VisualCursorDirection direction) = 0; 595 VisualCursorDirection direction) = 0;
587 596
588 // Get the selection model visually left/right of |selection| by one word. 597 // Get the selection model visually left/right of |selection| by one word.
589 // The returned value represents a cursor/caret position without a selection. 598 // The returned value represents a cursor/caret position without a selection.
590 virtual SelectionModel AdjacentWordSelectionModel( 599 virtual SelectionModel AdjacentWordSelectionModel(
591 const SelectionModel& selection, 600 const SelectionModel& selection,
592 VisualCursorDirection direction) = 0; 601 VisualCursorDirection direction) = 0;
593 602
594 // Get the SelectionModels corresponding to visual text ends. 603 // Get the selection model corresponding to visual text ends.
595 // The returned value represents a cursor/caret position without a selection. 604 // The returned value represents a cursor/caret position without a selection.
596 SelectionModel EdgeSelectionModel(VisualCursorDirection direction); 605 SelectionModel EdgeSelectionModel(VisualCursorDirection direction);
597 606
607 // Get the selection model corresponding to visual text ends for |line_index|.
608 // The returned value represents a cursor/caret position without a selection.
609 SelectionModel LineSelectionModel(size_t line_index,
610 gfx::VisualCursorDirection direction);
611
598 // Sets the selection model, the argument is assumed to be valid. 612 // Sets the selection model, the argument is assumed to be valid.
599 virtual void SetSelectionModel(const SelectionModel& model); 613 virtual void SetSelectionModel(const SelectionModel& model);
600 614
601 // Get the visual bounds containing the logical substring within the |range|. 615 // Get the visual bounds containing the logical substring within the |range|.
602 // If |range| is empty, the result is empty. These bounds could be visually 616 // If |range| is empty, the result is empty. These bounds could be visually
603 // discontinuous if the substring is split by a LTR/RTL level change. 617 // discontinuous if the substring is split by a LTR/RTL level change.
604 // These bounds are in local coordinates, but may be outside the visible 618 // These bounds are in local coordinates, but may be outside the visible
605 // region if the text is longer than the textfield. Subsequent text, cursor, 619 // region if the text is longer than the textfield. Subsequent text, cursor,
606 // or bounds changes may invalidate returned values. 620 // or bounds changes may invalidate returned values.
607 virtual std::vector<Rect> GetSubstringBounds(const Range& range) = 0; 621 virtual std::vector<Rect> GetSubstringBounds(const Range& range) = 0;
(...skipping 25 matching lines...) Expand all
633 // Update the display text. 647 // Update the display text.
634 void UpdateDisplayText(float text_width); 648 void UpdateDisplayText(float text_width);
635 649
636 // Returns display text positions that are suitable for breaking lines. 650 // Returns display text positions that are suitable for breaking lines.
637 const BreakList<size_t>& GetLineBreaks(); 651 const BreakList<size_t>& GetLineBreaks();
638 652
639 // Apply (and undo) temporary composition underlines and selection colors. 653 // Apply (and undo) temporary composition underlines and selection colors.
640 void ApplyCompositionAndSelectionStyles(); 654 void ApplyCompositionAndSelectionStyles();
641 void UndoCompositionAndSelectionStyles(); 655 void UndoCompositionAndSelectionStyles();
642 656
643 // Convert points from the text space to the view space and back. Handles the 657 // Convert points from the text space to the view space. Handles the display
644 // display area, display offset, application LTR/RTL mode and multiline. 658 // area, display offset, application LTR/RTL mode and multiline.
645 Point ToTextPoint(const Point& point);
646 Point ToViewPoint(const Point& point); 659 Point ToViewPoint(const Point& point);
647 660
648 // Convert a text space x-coordinate range to rects in view space.
649 std::vector<Rect> TextBoundsToViewBounds(const Range& x);
650
651 // Get the alignment, resolving ALIGN_TO_HEAD with the current text direction. 661 // Get the alignment, resolving ALIGN_TO_HEAD with the current text direction.
652 HorizontalAlignment GetCurrentHorizontalAlignment(); 662 HorizontalAlignment GetCurrentHorizontalAlignment();
653 663
654 // Returns the line offset from the origin, accounts for text alignment only. 664 // Returns the line offset from the origin, accounts for text alignment only.
655 Vector2d GetAlignmentOffset(size_t line_number); 665 Vector2d GetAlignmentOffset(size_t line_number);
656 666
657 // Applies fade effects to |renderer|. 667 // Applies fade effects to |renderer|.
658 void ApplyFadeEffects(internal::SkiaTextRenderer* renderer); 668 void ApplyFadeEffects(internal::SkiaTextRenderer* renderer);
659 669
660 // Applies text shadows to |renderer|. 670 // Applies text shadows to |renderer|.
(...skipping 13 matching lines...) Expand all
674 void UpdateStyleLengths(); 684 void UpdateStyleLengths();
675 685
676 // A convenience function to check whether the glyph attached to the caret 686 // A convenience function to check whether the glyph attached to the caret
677 // is within the given range. 687 // is within the given range.
678 static bool RangeContainsCaret(const Range& range, 688 static bool RangeContainsCaret(const Range& range,
679 size_t caret_pos, 689 size_t caret_pos,
680 LogicalCursorDirection caret_affinity); 690 LogicalCursorDirection caret_affinity);
681 691
682 private: 692 private:
683 friend class test::RenderTextTestApi; 693 friend class test::RenderTextTestApi;
694 friend class ::views::LabelSelectionTest;
684 695
685 // Set the cursor to |position|, with the caret trailing the previous 696 // Set the cursor to |position|, with the caret trailing the previous
686 // grapheme, or if there is no previous grapheme, leading the cursor position. 697 // grapheme, or if there is no previous grapheme, leading the cursor position.
687 // If |select| is false, the selection start is moved to the same position. 698 // If |select| is false, the selection start is moved to the same position.
688 // If the |position| is not a cursorable position (not on grapheme boundary), 699 // If the |position| is not a cursorable position (not on grapheme boundary),
689 // it is a NO-OP. 700 // it is a NO-OP.
690 void MoveCursorTo(size_t position, bool select); 701 void MoveCursorTo(size_t position, bool select);
691 702
692 // Updates |layout_text_| and |display_text_| as needed (or marks them dirty). 703 // Updates |layout_text_| and |display_text_| as needed (or marks them dirty).
693 void OnTextAttributeChanged(); 704 void OnTextAttributeChanged();
(...skipping 167 matching lines...) Expand 10 before | Expand all | Expand 10 after
861 // Lines computed by EnsureLayout. These should be invalidated upon 872 // Lines computed by EnsureLayout. These should be invalidated upon
862 // OnLayoutTextAttributeChanged and OnDisplayTextAttributeChanged calls. 873 // OnLayoutTextAttributeChanged and OnDisplayTextAttributeChanged calls.
863 std::vector<internal::Line> lines_; 874 std::vector<internal::Line> lines_;
864 875
865 DISALLOW_COPY_AND_ASSIGN(RenderText); 876 DISALLOW_COPY_AND_ASSIGN(RenderText);
866 }; 877 };
867 878
868 } // namespace gfx 879 } // namespace gfx
869 880
870 #endif // UI_GFX_RENDER_TEXT_H_ 881 #endif // UI_GFX_RENDER_TEXT_H_
OLDNEW
« no previous file with comments | « no previous file | ui/gfx/render_text.cc » ('j') | ui/gfx/render_text_harfbuzz.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698