diff options
Diffstat (limited to 'ui/gfx/render_text.h')
-rw-r--r-- | ui/gfx/render_text.h | 91 |
1 files changed, 77 insertions, 14 deletions
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h index 1fc8ed7..fe4720f 100644 --- a/ui/gfx/render_text.h +++ b/ui/gfx/render_text.h @@ -111,6 +111,40 @@ class StyleIterator { DISALLOW_COPY_AND_ASSIGN(StyleIterator); }; +// Line segments are slices of the layout text to be rendered on a single line. +struct LineSegment { + LineSegment(); + ~LineSegment(); + + // X coordinates of this line segment in text space. + Range x_range; + + // The character range this segment corresponds to. + Range char_range; + + // Index of the text run that generated this segment. + size_t run; +}; + +// A line of layout text, comprised of a line segment list and some metrics. +struct Line { + Line(); + ~Line(); + + // Segments that make up this line in visual order. + std::vector<LineSegment> segments; + + // A line size is the sum of segment widths and the maximum of segment + // heights. + Size size; + + // Sum of preceding lines' heights. + int preceding_heights; + + // Maximum baseline of all segments on this line. + int baseline; +}; + } // namespace internal // RenderText represents an abstract model of styled text and its corresponding @@ -186,6 +220,11 @@ class UI_EXPORT RenderText { // cleared when SetText or SetObscured is called. void SetObscuredRevealIndex(int index); + // TODO(ckocagil): Multiline text rendering is currently only supported on + // Windows. Support other platforms. + bool multiline() const { return multiline_; } + void SetMultiline(bool multiline); + // Set the maximum length of the displayed layout text, not the actual text. // A |length| of 0 forgoes a hard limit, but does not guarantee proper // functionality of very long strings. Applies to subsequent SetText calls. @@ -281,14 +320,14 @@ class UI_EXPORT RenderText { // |GetTextDirection()|, not the direction of a particular run. VisualCursorDirection GetVisualDirectionOfLogicalEnd(); - // Returns the size in pixels of the entire string. For the height, this will - // return the maximum height among the different fonts in the text runs. - // Note that this returns the raw size of the string, which does not include - // the margin area of text shadows. + // Returns the size required to display the current string (which is the + // wrapped size in multiline mode). Note that this returns the raw size of the + // string, which does not include the cursor or the margin area of text + // shadows. virtual Size GetStringSize() = 0; - // Returns the width of content, which reserves room for the cursor if - // |cursor_enabled_| is true. + // Returns the width of the content (which is the wrapped width in multiline + // mode). Reserves room for the cursor if |cursor_enabled_| is true. int GetContentWidth(); // Returns the common baseline of the text. The returned value is the vertical @@ -348,6 +387,9 @@ class UI_EXPORT RenderText { const BreakList<SkColor>& colors() const { return colors_; } const std::vector<BreakList<bool> >& styles() const { return styles_; } + const std::vector<internal::Line>& lines() const { return lines_; } + void set_lines(std::vector<internal::Line>* lines) { lines_.swap(*lines); } + const Vector2d& GetUpdatedDisplayOffset(); void set_cached_bounds_and_offset_valid(bool valid) { @@ -406,7 +448,7 @@ class UI_EXPORT RenderText { // Reset the layout to be invalid. virtual void ResetLayout() = 0; - // Ensure the text is laid out. + // Ensure the text is laid out, lines are computed, and |lines_| is valid. virtual void EnsureLayout() = 0; // Draw the text. @@ -415,22 +457,29 @@ class UI_EXPORT RenderText { // Returns the text used for layout, which may be obscured or truncated. const base::string16& GetLayoutText() const; + // Returns layout text positions that are suitable for breaking lines. + const BreakList<size_t>& GetLineBreaks(); + // Apply (and undo) temporary composition underlines and selection colors. void ApplyCompositionAndSelectionStyles(); void UndoCompositionAndSelectionStyles(); - // Returns the text offset from the origin after applying text alignment and - // display offset. - Vector2d GetTextOffset(); + // Returns the line offset from the origin after applying the text alignment + // and the display offset. + Vector2d GetLineOffset(size_t line_number); - // Convert points from the text space to the view space and back. - // Handles the display area, display offset, and the application LTR/RTL mode. + // Convert points from the text space to the view space and back. Handles the + // display area, display offset, application LTR/RTL mode and multiline. Point ToTextPoint(const Point& point); Point ToViewPoint(const Point& point); - // Returns the text offset from the origin, taking into account text alignment + // Convert a text space x-coordinate range to corresponding rects in view + // space. + std::vector<Rect> TextBoundsToViewBounds(const Range& x); + + // Returns the line offset from the origin, accounting for text alignment // only. - Vector2d GetAlignmentOffset(); + Vector2d GetAlignmentOffset(size_t line_number); // Applies fade effects to |renderer|. void ApplyFadeEffects(internal::SkiaTextRenderer* renderer); @@ -457,6 +506,9 @@ class UI_EXPORT RenderText { FRIEND_TEST_ALL_PREFIXES(RenderTextTest, EdgeSelectionModels); FRIEND_TEST_ALL_PREFIXES(RenderTextTest, GetTextOffset); FRIEND_TEST_ALL_PREFIXES(RenderTextTest, GetTextOffsetHorizontalDefaultInRTL); + FRIEND_TEST_ALL_PREFIXES(RenderTextTest, Multiline_MinWidth); + FRIEND_TEST_ALL_PREFIXES(RenderTextTest, Multiline_NormalWidth); + FRIEND_TEST_ALL_PREFIXES(RenderTextTest, Multiline_SufficientWidth); // Set the cursor to |position|, with the caret trailing the previous // grapheme, or if there is no previous grapheme, leading the cursor position. @@ -547,6 +599,10 @@ class UI_EXPORT RenderText { // The obscured and/or truncated text that will be displayed. base::string16 layout_text_; + // Whether the text should be broken into multiple lines. Uses the width of + // |display_rect_| as the width cap. + bool multiline_; + // Fade text head and/or tail, if text doesn't fit into |display_rect_|. bool fade_head_; bool fade_tail_; @@ -574,6 +630,13 @@ class UI_EXPORT RenderText { // Text shadows to be drawn. ShadowValues text_shadows_; + // A list of valid layout text line break positions. + BreakList<size_t> line_breaks_; + + // Lines computed by EnsureLayout. These should be invalidated with + // ResetLayout and on |display_rect_| changes. + std::vector<internal::Line> lines_; + DISALLOW_COPY_AND_ASSIGN(RenderText); }; |