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

Unified Diff: ui/gfx/render_text.h

Issue 16867016: Windows implementation of multiline RenderText (Closed) Base URL: http://git.chromium.org/chromium/src.git@master
Patch Set: Mike's comments 2 Created 7 years, 4 months 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 side-by-side diff with in-line comments
Download patch
Index: ui/gfx/render_text.h
diff --git a/ui/gfx/render_text.h b/ui/gfx/render_text.h
index 34277400b7369e28c41e120950e357555c8c9415..8dd3144142ff1b98f244e779b4e1faa1ba554e32 100644
--- a/ui/gfx/render_text.h
+++ b/ui/gfx/render_text.h
@@ -111,6 +111,38 @@ class StyleIterator {
DISALLOW_COPY_AND_ASSIGN(StyleIterator);
};
+// Line segments are slices of the layout text to be rendered on a single line.
+// This structure holds the logical and visual position information for a line
+// segment.
+struct LineSegment {
+ // X coordinates of this line segment in text coordinate space.
+ ui::Range x_range;
+
+ // The character range this segment corresponds to.
+ ui::Range char_range;
+
+ // Index of the text run that generated this segment.
+ size_t run;
+};
+
+// Holds a list of line segments and metrics for a line.
+struct Line {
+ Line();
+
+ // Segments that make up this line in visual order.
+ std::vector<LineSegment> segments;
+
+ // Total size of this line. Width is the sum of |segment| widths, height is
+ // the maximum height among |segments|.
+ gfx::Size size;
Alexei Svitkine (slow) 2013/08/27 15:40:38 Nit: Remove gfx.
ckocagil 2013/08/28 19:16:26 Done.
+
+ // Sum of the |height| fields of preceding lines.
+ int preceding_heights;
+
+ // Maximum baseline of all runs on this line.
+ int baseline;
+};
+
} // namespace internal
// RenderText represents an abstract model of styled text and its corresponding
@@ -186,6 +218,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.
@@ -287,6 +324,11 @@ class UI_EXPORT RenderText {
// the margin area of text shadows.
virtual Size GetStringSize() = 0;
+ // Returns the size required to display the current multiline text, which is
+ // horizontally capped by the width of |display_rect()|.
+ // TODO(ckocagil): Merge with GetContentWidth.
+ virtual Size GetMultilineTextSize() = 0;
+
// Returns the width of content, which reserves room for the cursor if
// |cursor_enabled_| is true.
int GetContentWidth();
@@ -348,6 +390,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) {
@@ -403,10 +448,10 @@ class UI_EXPORT RenderText {
// which means it is a grapheme boundary or the first character in the text.
virtual bool IsCursorablePosition(size_t position) = 0;
- // Reset the layout to be invalid.
+ // Reset the layout and |lines_| to be invalid.
msw 2013/08/27 01:30:52 I'd avoid describing the internals of a pure virtu
ckocagil 2013/08/28 18:01:45 Done.
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 +460,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 at.
+ 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
+ // Returns the line offset from the origin after applying text alignment and
// display offset.
- Vector2d GetTextOffset();
+ 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 multi-line.
Point ToTextPoint(const Point& point);
Point ToViewPoint(const Point& point);
- // Returns the text offset from the origin, taking into account text alignment
+ // Convert the range in text coordinates to rects in view coordinates that
+ // cover the given range.
+ std::vector<Rect> TextBoundsToViewBounds(const ui::Range& x);
+
+ // Returns the line offset from the origin, taking into account text alignment
// only.
- Vector2d GetAlignmentOffset();
+ Vector2d GetAlignmentOffset(size_t line_number);
// Applies fade effects to |renderer|.
void ApplyFadeEffects(internal::SkiaTextRenderer* renderer);
@@ -457,6 +509,8 @@ 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);
// 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 +601,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 +632,14 @@ class UI_EXPORT RenderText {
// Text shadows to be drawn.
ShadowValues text_shadows_;
+ // BreakList to find valid positions to break the line at.
+ BreakList<size_t> line_breaks_;
+
+ // Lines computed by EnsureLayout. |ResetLayout()| implicitly invalidates
msw 2013/08/27 01:30:52 nit: I liked the old comment format better; ResetL
ckocagil 2013/08/28 18:01:45 Done.
+ // |lines_|. Should be explicitly emptied to invalidate in other conditions,
+ // such as |display_rect_| changes.
+ std::vector<internal::Line> lines_;
+
DISALLOW_COPY_AND_ASSIGN(RenderText);
};
« no previous file with comments | « ui/gfx/break_list.h ('k') | ui/gfx/render_text.cc » ('j') | ui/gfx/render_text.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698