| 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 #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 <algorithm> | 8 #include <algorithm> |
| 9 #include <cstring> | 9 #include <cstring> |
| 10 #include <string> | 10 #include <string> |
| 11 #include <utility> | 11 #include <utility> |
| 12 #include <vector> | 12 #include <vector> |
| 13 | 13 |
| 14 #include "base/gtest_prod_util.h" | 14 #include "base/gtest_prod_util.h" |
| 15 #include "base/i18n/rtl.h" | 15 #include "base/i18n/rtl.h" |
| 16 #include "base/strings/string16.h" | 16 #include "base/strings/string16.h" |
| 17 #include "skia/ext/refptr.h" | 17 #include "skia/ext/refptr.h" |
| 18 #include "third_party/skia/include/core/SkColor.h" | 18 #include "third_party/skia/include/core/SkColor.h" |
| 19 #include "third_party/skia/include/core/SkPaint.h" | 19 #include "third_party/skia/include/core/SkPaint.h" |
| 20 #include "third_party/skia/include/core/SkRect.h" | 20 #include "third_party/skia/include/core/SkRect.h" |
| 21 #include "ui/base/range/range.h" | |
| 22 #include "ui/gfx/break_list.h" | 21 #include "ui/gfx/break_list.h" |
| 23 #include "ui/gfx/font_list.h" | 22 #include "ui/gfx/font_list.h" |
| 24 #include "ui/gfx/point.h" | 23 #include "ui/gfx/point.h" |
| 24 #include "ui/gfx/range/range.h" |
| 25 #include "ui/gfx/rect.h" | 25 #include "ui/gfx/rect.h" |
| 26 #include "ui/gfx/selection_model.h" | 26 #include "ui/gfx/selection_model.h" |
| 27 #include "ui/gfx/shadow_value.h" | 27 #include "ui/gfx/shadow_value.h" |
| 28 #include "ui/gfx/text_constants.h" | 28 #include "ui/gfx/text_constants.h" |
| 29 #include "ui/gfx/vector2d.h" | 29 #include "ui/gfx/vector2d.h" |
| 30 | 30 |
| 31 class SkCanvas; | 31 class SkCanvas; |
| 32 class SkDrawLooper; | 32 class SkDrawLooper; |
| 33 struct SkPoint; | 33 struct SkPoint; |
| 34 class SkShader; | 34 class SkShader; |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 89 public: | 89 public: |
| 90 StyleIterator(const BreakList<SkColor>& colors, | 90 StyleIterator(const BreakList<SkColor>& colors, |
| 91 const std::vector<BreakList<bool> >& styles); | 91 const std::vector<BreakList<bool> >& styles); |
| 92 ~StyleIterator(); | 92 ~StyleIterator(); |
| 93 | 93 |
| 94 // Get the colors and styles at the current iterator position. | 94 // Get the colors and styles at the current iterator position. |
| 95 SkColor color() const { return color_->second; } | 95 SkColor color() const { return color_->second; } |
| 96 bool style(TextStyle s) const { return style_[s]->second; } | 96 bool style(TextStyle s) const { return style_[s]->second; } |
| 97 | 97 |
| 98 // Get the intersecting range of the current iterator set. | 98 // Get the intersecting range of the current iterator set. |
| 99 ui::Range GetRange() const; | 99 gfx::Range GetRange() const; |
| 100 | 100 |
| 101 // Update the iterator to point to colors and styles applicable at |position|. | 101 // Update the iterator to point to colors and styles applicable at |position|. |
| 102 void UpdatePosition(size_t position); | 102 void UpdatePosition(size_t position); |
| 103 | 103 |
| 104 private: | 104 private: |
| 105 BreakList<SkColor> colors_; | 105 BreakList<SkColor> colors_; |
| 106 std::vector<BreakList<bool> > styles_; | 106 std::vector<BreakList<bool> > styles_; |
| 107 | 107 |
| 108 BreakList<SkColor>::const_iterator color_; | 108 BreakList<SkColor>::const_iterator color_; |
| 109 std::vector<BreakList<bool>::const_iterator> style_; | 109 std::vector<BreakList<bool>::const_iterator> style_; |
| (...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 200 void set_fade_tail(bool fade_tail) { fade_tail_ = fade_tail; } | 200 void set_fade_tail(bool fade_tail) { fade_tail_ = fade_tail; } |
| 201 bool fade_tail() const { return fade_tail_; } | 201 bool fade_tail() const { return fade_tail_; } |
| 202 | 202 |
| 203 bool background_is_transparent() const { return background_is_transparent_; } | 203 bool background_is_transparent() const { return background_is_transparent_; } |
| 204 void set_background_is_transparent(bool transparent) { | 204 void set_background_is_transparent(bool transparent) { |
| 205 background_is_transparent_ = transparent; | 205 background_is_transparent_ = transparent; |
| 206 } | 206 } |
| 207 | 207 |
| 208 const SelectionModel& selection_model() const { return selection_model_; } | 208 const SelectionModel& selection_model() const { return selection_model_; } |
| 209 | 209 |
| 210 const ui::Range& selection() const { return selection_model_.selection(); } | 210 const gfx::Range& selection() const { return selection_model_.selection(); } |
| 211 | 211 |
| 212 size_t cursor_position() const { return selection_model_.caret_pos(); } | 212 size_t cursor_position() const { return selection_model_.caret_pos(); } |
| 213 void SetCursorPosition(size_t position); | 213 void SetCursorPosition(size_t position); |
| 214 | 214 |
| 215 // Moves the cursor left or right. Cursor movement is visual, meaning that | 215 // Moves the cursor left or right. Cursor movement is visual, meaning that |
| 216 // left and right are relative to screen, not the directionality of the text. | 216 // left and right are relative to screen, not the directionality of the text. |
| 217 // If |select| is false, the selection start is moved to the same position. | 217 // If |select| is false, the selection start is moved to the same position. |
| 218 void MoveCursor(BreakType break_type, | 218 void MoveCursor(BreakType break_type, |
| 219 VisualCursorDirection direction, | 219 VisualCursorDirection direction, |
| 220 bool select); | 220 bool select); |
| 221 | 221 |
| 222 // Set the selection_model_ to the value of |selection|. | 222 // Set the selection_model_ to the value of |selection|. |
| 223 // The selection range is clamped to text().length() if out of range. | 223 // The selection range is clamped to text().length() if out of range. |
| 224 // Returns true if the cursor position or selection range changed. | 224 // Returns true if the cursor position or selection range changed. |
| 225 // If any index in |selection_model| is not a cursorable position (not on a | 225 // If any index in |selection_model| is not a cursorable position (not on a |
| 226 // grapheme boundary), it is a no-op and returns false. | 226 // grapheme boundary), it is a no-op and returns false. |
| 227 bool MoveCursorTo(const SelectionModel& selection_model); | 227 bool MoveCursorTo(const SelectionModel& selection_model); |
| 228 | 228 |
| 229 // Move the cursor to the position associated with the clicked point. | 229 // Move the cursor to the position associated with the clicked point. |
| 230 // If |select| is false, the selection start is moved to the same position. | 230 // If |select| is false, the selection start is moved to the same position. |
| 231 // Returns true if the cursor position or selection range changed. | 231 // Returns true if the cursor position or selection range changed. |
| 232 bool MoveCursorTo(const Point& point, bool select); | 232 bool MoveCursorTo(const Point& point, bool select); |
| 233 | 233 |
| 234 // Set the selection_model_ based on |range|. | 234 // Set the selection_model_ based on |range|. |
| 235 // If the |range| start or end is greater than text length, it is modified | 235 // If the |range| start or end is greater than text length, it is modified |
| 236 // to be the text length. | 236 // to be the text length. |
| 237 // If the |range| start or end is not a cursorable position (not on grapheme | 237 // If the |range| start or end is not a cursorable position (not on grapheme |
| 238 // boundary), it is a NO-OP and returns false. Otherwise, returns true. | 238 // boundary), it is a NO-OP and returns false. Otherwise, returns true. |
| 239 bool SelectRange(const ui::Range& range); | 239 bool SelectRange(const gfx::Range& range); |
| 240 | 240 |
| 241 // Returns true if the local point is over selected text. | 241 // Returns true if the local point is over selected text. |
| 242 bool IsPointInSelection(const Point& point); | 242 bool IsPointInSelection(const Point& point); |
| 243 | 243 |
| 244 // Selects no text, keeping the current cursor position and caret affinity. | 244 // Selects no text, keeping the current cursor position and caret affinity. |
| 245 void ClearSelection(); | 245 void ClearSelection(); |
| 246 | 246 |
| 247 // Select the entire text range. If |reversed| is true, the range will end at | 247 // Select the entire text range. If |reversed| is true, the range will end at |
| 248 // the logical beginning of the text; this generally shows the leading portion | 248 // the logical beginning of the text; this generally shows the leading portion |
| 249 // of text that overflows its display area. | 249 // of text that overflows its display area. |
| 250 void SelectAll(bool reversed); | 250 void SelectAll(bool reversed); |
| 251 | 251 |
| 252 // Selects the word at the current cursor position. If there is a non-empty | 252 // Selects the word at the current cursor position. If there is a non-empty |
| 253 // selection, the selection bounds are extended to their nearest word | 253 // selection, the selection bounds are extended to their nearest word |
| 254 // boundaries. | 254 // boundaries. |
| 255 void SelectWord(); | 255 void SelectWord(); |
| 256 | 256 |
| 257 const ui::Range& GetCompositionRange() const; | 257 const gfx::Range& GetCompositionRange() const; |
| 258 void SetCompositionRange(const ui::Range& composition_range); | 258 void SetCompositionRange(const gfx::Range& composition_range); |
| 259 | 259 |
| 260 // Set the text color over the entire text or a logical character range. | 260 // Set the text color over the entire text or a logical character range. |
| 261 // The |range| should be valid, non-reversed, and within [0, text().length()]. | 261 // The |range| should be valid, non-reversed, and within [0, text().length()]. |
| 262 void SetColor(SkColor value); | 262 void SetColor(SkColor value); |
| 263 void ApplyColor(SkColor value, const ui::Range& range); | 263 void ApplyColor(SkColor value, const gfx::Range& range); |
| 264 | 264 |
| 265 // Set various text styles over the entire text or a logical character range. | 265 // Set various text styles over the entire text or a logical character range. |
| 266 // The respective |style| is applied if |value| is true, or removed if false. | 266 // The respective |style| is applied if |value| is true, or removed if false. |
| 267 // The |range| should be valid, non-reversed, and within [0, text().length()]. | 267 // The |range| should be valid, non-reversed, and within [0, text().length()]. |
| 268 void SetStyle(TextStyle style, bool value); | 268 void SetStyle(TextStyle style, bool value); |
| 269 void ApplyStyle(TextStyle style, bool value, const ui::Range& range); | 269 void ApplyStyle(TextStyle style, bool value, const gfx::Range& range); |
| 270 | 270 |
| 271 // Returns whether this style is enabled consistently across the entire | 271 // Returns whether this style is enabled consistently across the entire |
| 272 // RenderText. | 272 // RenderText. |
| 273 bool GetStyle(TextStyle style) const; | 273 bool GetStyle(TextStyle style) const; |
| 274 | 274 |
| 275 // Set the text directionality mode and get the text direction yielded. | 275 // Set the text directionality mode and get the text direction yielded. |
| 276 void SetDirectionalityMode(DirectionalityMode mode); | 276 void SetDirectionalityMode(DirectionalityMode mode); |
| 277 base::i18n::TextDirection GetTextDirection(); | 277 base::i18n::TextDirection GetTextDirection(); |
| 278 | 278 |
| 279 // Returns the visual movement direction corresponding to the logical end | 279 // Returns the visual movement direction corresponding to the logical end |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 328 size_t IndexOfAdjacentGrapheme(size_t index, | 328 size_t IndexOfAdjacentGrapheme(size_t index, |
| 329 LogicalCursorDirection direction); | 329 LogicalCursorDirection direction); |
| 330 | 330 |
| 331 // Return a SelectionModel with the cursor at the current selection's start. | 331 // Return a SelectionModel with the cursor at the current selection's start. |
| 332 // The returned value represents a cursor/caret position without a selection. | 332 // The returned value represents a cursor/caret position without a selection. |
| 333 SelectionModel GetSelectionModelForSelectionStart(); | 333 SelectionModel GetSelectionModelForSelectionStart(); |
| 334 | 334 |
| 335 // Sets shadows to drawn with text. | 335 // Sets shadows to drawn with text. |
| 336 void SetTextShadows(const ShadowValues& shadows); | 336 void SetTextShadows(const ShadowValues& shadows); |
| 337 | 337 |
| 338 typedef std::pair<Font, ui::Range> FontSpan; | 338 typedef std::pair<Font, gfx::Range> FontSpan; |
| 339 // For testing purposes, returns which fonts were chosen for which parts of | 339 // For testing purposes, returns which fonts were chosen for which parts of |
| 340 // the text by returning a vector of Font and Range pairs, where each range | 340 // the text by returning a vector of Font and Range pairs, where each range |
| 341 // specifies the character range for which the corresponding font has been | 341 // specifies the character range for which the corresponding font has been |
| 342 // chosen. | 342 // chosen. |
| 343 virtual std::vector<FontSpan> GetFontSpansForTesting() = 0; | 343 virtual std::vector<FontSpan> GetFontSpansForTesting() = 0; |
| 344 | 344 |
| 345 protected: | 345 protected: |
| 346 RenderText(); | 346 RenderText(); |
| 347 | 347 |
| 348 const BreakList<SkColor>& colors() const { return colors_; } | 348 const BreakList<SkColor>& colors() const { return colors_; } |
| (...skipping 27 matching lines...) Expand all Loading... |
| 376 // The returned value represents a cursor/caret position without a selection. | 376 // The returned value represents a cursor/caret position without a selection. |
| 377 SelectionModel EdgeSelectionModel(VisualCursorDirection direction); | 377 SelectionModel EdgeSelectionModel(VisualCursorDirection direction); |
| 378 | 378 |
| 379 // Sets the selection model, the argument is assumed to be valid. | 379 // Sets the selection model, the argument is assumed to be valid. |
| 380 virtual void SetSelectionModel(const SelectionModel& model); | 380 virtual void SetSelectionModel(const SelectionModel& model); |
| 381 | 381 |
| 382 // Get the horizontal bounds (relative to the left of the text, not the view) | 382 // Get the horizontal bounds (relative to the left of the text, not the view) |
| 383 // of the glyph starting at |index|. If the glyph is RTL then the returned | 383 // of the glyph starting at |index|. If the glyph is RTL then the returned |
| 384 // Range will have is_reversed() true. (This does not return a Rect because a | 384 // Range will have is_reversed() true. (This does not return a Rect because a |
| 385 // Rect can't have a negative width.) | 385 // Rect can't have a negative width.) |
| 386 virtual ui::Range GetGlyphBounds(size_t index) = 0; | 386 virtual gfx::Range GetGlyphBounds(size_t index) = 0; |
| 387 | 387 |
| 388 // Get the visual bounds containing the logical substring within the |range|. | 388 // Get the visual bounds containing the logical substring within the |range|. |
| 389 // If |range| is empty, the result is empty. These bounds could be visually | 389 // If |range| is empty, the result is empty. These bounds could be visually |
| 390 // discontinuous if the substring is split by a LTR/RTL level change. | 390 // discontinuous if the substring is split by a LTR/RTL level change. |
| 391 // These bounds are in local coordinates, but may be outside the visible | 391 // These bounds are in local coordinates, but may be outside the visible |
| 392 // region if the text is longer than the textfield. Subsequent text, cursor, | 392 // region if the text is longer than the textfield. Subsequent text, cursor, |
| 393 // or bounds changes may invalidate returned values. | 393 // or bounds changes may invalidate returned values. |
| 394 virtual std::vector<Rect> GetSubstringBounds(const ui::Range& range) = 0; | 394 virtual std::vector<Rect> GetSubstringBounds(const gfx::Range& range) = 0; |
| 395 | 395 |
| 396 // Convert between indices into |text_| and indices into |obscured_text_|, | 396 // Convert between indices into |text_| and indices into |obscured_text_|, |
| 397 // which differ when the text is obscured. Regardless of whether or not the | 397 // which differ when the text is obscured. Regardless of whether or not the |
| 398 // text is obscured, the character (code point) offsets always match. | 398 // text is obscured, the character (code point) offsets always match. |
| 399 virtual size_t TextIndexToLayoutIndex(size_t index) const = 0; | 399 virtual size_t TextIndexToLayoutIndex(size_t index) const = 0; |
| 400 virtual size_t LayoutIndexToTextIndex(size_t index) const = 0; | 400 virtual size_t LayoutIndexToTextIndex(size_t index) const = 0; |
| 401 | 401 |
| 402 // Return true if cursor can appear in front of the character at |position|, | 402 // Return true if cursor can appear in front of the character at |position|, |
| 403 // which means it is a grapheme boundary or the first character in the text. | 403 // which means it is a grapheme boundary or the first character in the text. |
| 404 virtual bool IsCursorablePosition(size_t position) = 0; | 404 virtual bool IsCursorablePosition(size_t position) = 0; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 433 Vector2d GetAlignmentOffset(); | 433 Vector2d GetAlignmentOffset(); |
| 434 | 434 |
| 435 // Applies fade effects to |renderer|. | 435 // Applies fade effects to |renderer|. |
| 436 void ApplyFadeEffects(internal::SkiaTextRenderer* renderer); | 436 void ApplyFadeEffects(internal::SkiaTextRenderer* renderer); |
| 437 | 437 |
| 438 // Applies text shadows to |renderer|. | 438 // Applies text shadows to |renderer|. |
| 439 void ApplyTextShadows(internal::SkiaTextRenderer* renderer); | 439 void ApplyTextShadows(internal::SkiaTextRenderer* renderer); |
| 440 | 440 |
| 441 // A convenience function to check whether the glyph attached to the caret | 441 // A convenience function to check whether the glyph attached to the caret |
| 442 // is within the given range. | 442 // is within the given range. |
| 443 static bool RangeContainsCaret(const ui::Range& range, | 443 static bool RangeContainsCaret(const gfx::Range& range, |
| 444 size_t caret_pos, | 444 size_t caret_pos, |
| 445 LogicalCursorDirection caret_affinity); | 445 LogicalCursorDirection caret_affinity); |
| 446 | 446 |
| 447 private: | 447 private: |
| 448 friend class RenderTextTest; | 448 friend class RenderTextTest; |
| 449 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, DefaultStyle); | 449 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, DefaultStyle); |
| 450 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, SetColorAndStyle); | 450 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, SetColorAndStyle); |
| 451 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, ApplyColorAndStyle); | 451 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, ApplyColorAndStyle); |
| 452 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, ObscuredText); | 452 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, ObscuredText); |
| 453 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, RevealObscuredText); | 453 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, RevealObscuredText); |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 516 // The color used for drawing selected text. | 516 // The color used for drawing selected text. |
| 517 SkColor selection_color_; | 517 SkColor selection_color_; |
| 518 | 518 |
| 519 // The background color used for drawing the selection when focused. | 519 // The background color used for drawing the selection when focused. |
| 520 SkColor selection_background_focused_color_; | 520 SkColor selection_background_focused_color_; |
| 521 | 521 |
| 522 // The focus state of the text. | 522 // The focus state of the text. |
| 523 bool focused_; | 523 bool focused_; |
| 524 | 524 |
| 525 // Composition text range. | 525 // Composition text range. |
| 526 ui::Range composition_range_; | 526 gfx::Range composition_range_; |
| 527 | 527 |
| 528 // Color and style breaks, used to color and stylize ranges of text. | 528 // Color and style breaks, used to color and stylize ranges of text. |
| 529 // BreakList positions are stored with text indices, not layout indices. | 529 // BreakList positions are stored with text indices, not layout indices. |
| 530 // TODO(msw): Expand to support cursor, selection, background, etc. colors. | 530 // TODO(msw): Expand to support cursor, selection, background, etc. colors. |
| 531 BreakList<SkColor> colors_; | 531 BreakList<SkColor> colors_; |
| 532 std::vector<BreakList<bool> > styles_; | 532 std::vector<BreakList<bool> > styles_; |
| 533 | 533 |
| 534 // Breaks saved without temporary composition and selection styling. | 534 // Breaks saved without temporary composition and selection styling. |
| 535 BreakList<SkColor> saved_colors_; | 535 BreakList<SkColor> saved_colors_; |
| 536 BreakList<bool> saved_underlines_; | 536 BreakList<bool> saved_underlines_; |
| (...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 573 | 573 |
| 574 // Text shadows to be drawn. | 574 // Text shadows to be drawn. |
| 575 ShadowValues text_shadows_; | 575 ShadowValues text_shadows_; |
| 576 | 576 |
| 577 DISALLOW_COPY_AND_ASSIGN(RenderText); | 577 DISALLOW_COPY_AND_ASSIGN(RenderText); |
| 578 }; | 578 }; |
| 579 | 579 |
| 580 } // namespace gfx | 580 } // namespace gfx |
| 581 | 581 |
| 582 #endif // UI_GFX_RENDER_TEXT_H_ | 582 #endif // UI_GFX_RENDER_TEXT_H_ |
| OLD | NEW |