| Index: ui/gfx/render_text_harfbuzz.h
|
| diff --git a/ui/gfx/render_text_harfbuzz.h b/ui/gfx/render_text_harfbuzz.h
|
| index d0e167ecbed1cc421ec7b9eef17fb1aa0d8e50f1..8fbf1d9d96cfbcaefde7e0c3ec50e2e53f608024 100644
|
| --- a/ui/gfx/render_text_harfbuzz.h
|
| +++ b/ui/gfx/render_text_harfbuzz.h
|
| @@ -37,7 +37,7 @@ struct GFX_EXPORT TextRunHarfBuzz {
|
| size_t CharToGlyph(size_t pos) const;
|
|
|
| // Returns the corresponding glyph range of the given character range.
|
| - // |range| is in text-space (0 corresponds to |GetLayoutText()[0]|). Returned
|
| + // |range| is in text-space (0 corresponds to |GetDisplayText()[0]|). Returned
|
| // value is in run-space (0 corresponds to the first glyph in the run).
|
| Range CharRangeToGlyphRange(const Range& range) const;
|
|
|
| @@ -79,6 +79,53 @@ struct GFX_EXPORT TextRunHarfBuzz {
|
| DISALLOW_COPY_AND_ASSIGN(TextRunHarfBuzz);
|
| };
|
|
|
| +// Manages the list of TextRunHarfBuzz and its logical <-> visual index mapping.
|
| +class TextRunList {
|
| + public:
|
| + TextRunList();
|
| + ~TextRunList();
|
| +
|
| + size_t size() const { return runs_.size(); }
|
| +
|
| + // Converts the index between logical and visual index.
|
| + size_t visual_to_logical(size_t index) const {
|
| + return visual_to_logical_[index];
|
| + }
|
| + size_t logical_to_visual(size_t index) const {
|
| + return logical_to_visual_[index];
|
| + }
|
| +
|
| + const ScopedVector<TextRunHarfBuzz>& runs() const { return runs_; }
|
| +
|
| + // Adds the new |run| to the run list.
|
| + void add(TextRunHarfBuzz* run) { runs_.push_back(run); }
|
| +
|
| + // Reset the run list.
|
| + void Reset();
|
| +
|
| + // Initialize the index mapping.
|
| + void InitIndexMap();
|
| +
|
| + // Precomputes the offsets for all runs.
|
| + void ComputePrecedingRunWidths();
|
| +
|
| + // Get the total width of runs, as if they were shown on one line.
|
| + // Do not use this when multiline is enabled.
|
| + float width() const { return width_; }
|
| +
|
| + private:
|
| + // Text runs in logical order.
|
| + ScopedVector<TextRunHarfBuzz> runs_;
|
| +
|
| + // Maps visual run indices to logical run indices and vice versa.
|
| + std::vector<int32_t> visual_to_logical_;
|
| + std::vector<int32_t> logical_to_visual_;
|
| +
|
| + float width_;
|
| +
|
| + DISALLOW_COPY_AND_ASSIGN(TextRunList);
|
| +};
|
| +
|
| } // namespace internal
|
|
|
| class GFX_EXPORT RenderTextHarfBuzz : public RenderText {
|
| @@ -86,8 +133,9 @@ class GFX_EXPORT RenderTextHarfBuzz : public RenderText {
|
| RenderTextHarfBuzz();
|
| ~RenderTextHarfBuzz() override;
|
|
|
| - // Overridden from RenderText.
|
| + // RenderText:
|
| scoped_ptr<RenderText> CreateInstanceOfSameType() const override;
|
| + const base::string16& GetDisplayText() override;
|
| Size GetStringSize() override;
|
| SizeF GetStringSizeF() override;
|
| SelectionModel FindCursorPosition(const Point& point) override;
|
| @@ -95,8 +143,8 @@ class GFX_EXPORT RenderTextHarfBuzz : public RenderText {
|
| Range GetGlyphBounds(size_t index) override;
|
|
|
| protected:
|
| - // Overridden from RenderText.
|
| - int GetLayoutTextBaseline() override;
|
| + // RenderText:
|
| + int GetDisplayTextBaseline() override;
|
| SelectionModel AdjacentCharSelectionModel(
|
| const SelectionModel& selection,
|
| VisualCursorDirection direction) override;
|
| @@ -104,10 +152,11 @@ class GFX_EXPORT RenderTextHarfBuzz : public RenderText {
|
| const SelectionModel& selection,
|
| VisualCursorDirection direction) override;
|
| std::vector<Rect> GetSubstringBounds(const Range& range) override;
|
| - size_t TextIndexToLayoutIndex(size_t index) const override;
|
| - size_t LayoutIndexToTextIndex(size_t index) const override;
|
| + size_t TextIndexToDisplayIndex(size_t index) override;
|
| + size_t DisplayIndexToTextIndex(size_t index) override;
|
| bool IsValidCursorIndex(size_t index) override;
|
| - void ResetLayout() override;
|
| + void OnLayoutTextAttributeChanged(bool text_changed) override;
|
| + void OnDisplayTextAttributeChanged() override;
|
| void EnsureLayout() override;
|
| void DrawVisualText(Canvas* canvas) override;
|
|
|
| @@ -131,7 +180,7 @@ class GFX_EXPORT RenderTextHarfBuzz : public RenderText {
|
|
|
| // Return the run index that contains the argument; or the length of the
|
| // |runs_| vector if argument exceeds the text length or width.
|
| - size_t GetRunContainingCaret(const SelectionModel& caret) const;
|
| + size_t GetRunContainingCaret(const SelectionModel& caret);
|
| size_t GetRunContainingXCoord(float x, float* offset) const;
|
|
|
| // Given a |run|, returns the SelectionModel that contains the logical first
|
| @@ -142,38 +191,65 @@ class GFX_EXPORT RenderTextHarfBuzz : public RenderText {
|
| SelectionModel LastSelectionModelInsideRun(
|
| const internal::TextRunHarfBuzz* run);
|
|
|
| - // Break the text into logical runs and populate the visual <-> logical maps.
|
| - void ItemizeText();
|
| -
|
| - // Helper method for ShapeRun() that calls ShapeRunWithFont() with |run|,
|
| - // |family|, and |render_params|, returning true if the family provides all
|
| - // needed glyphs and false otherwise. Additionally updates |best_family|,
|
| - // |best_render_params|, and |best_missing_glyphs| if |family| has fewer than
|
| - // |best_missing_glyphs| missing glyphs.
|
| - bool CompareFamily(internal::TextRunHarfBuzz* run,
|
| + // Break the text into logical runs and populate the visual <-> logical maps
|
| + // into |run_list_out|.
|
| + void ItemizeTextToRuns(const base::string16& string,
|
| + internal::TextRunList* run_list_out);
|
| +
|
| + // Helper method for ShapeRun() that calls ShapeRunWithFont() with |text|,
|
| + // |run|, |family|, and |render_params|, returning true if the family provides
|
| + // all the glyphs needed for |run|, and false otherwise. Additionally updates
|
| + // |best_family|, |best_render_params|, and |best_missing_glyphs| if |family|
|
| + // has fewer than |best_missing_glyphs| missing glyphs.
|
| + bool CompareFamily(const base::string16& text,
|
| const std::string& family,
|
| const gfx::FontRenderParams& render_params,
|
| + internal::TextRunHarfBuzz* run,
|
| std::string* best_family,
|
| gfx::FontRenderParams* best_render_params,
|
| size_t* best_missing_glyphs);
|
|
|
| - // Shape the glyphs needed for the text |run|.
|
| - void ShapeRun(internal::TextRunHarfBuzz* run);
|
| - bool ShapeRunWithFont(internal::TextRunHarfBuzz* run,
|
| - const std::string& font_family,
|
| - const FontRenderParams& params);
|
| -
|
| - // Text runs in logical order.
|
| - ScopedVector<internal::TextRunHarfBuzz> runs_;
|
| -
|
| - // Maps visual run indices to logical run indices and vice versa.
|
| - std::vector<int32_t> visual_to_logical_;
|
| - std::vector<int32_t> logical_to_visual_;
|
| -
|
| - bool needs_layout_;
|
| + // Shape the glyphs of all runs in |run_list| using |text|.
|
| + void ShapeRunList(const base::string16& text,
|
| + internal::TextRunList* run_list);
|
|
|
| - // ICU grapheme iterator for the layout text. Valid when |!needs_layout_|. Can
|
| - // be NULL in case of an error.
|
| + // Shape the glyphs needed for the |run| within the |text|.
|
| + void ShapeRun(const base::string16& text,
|
| + internal::TextRunHarfBuzz* run);
|
| + bool ShapeRunWithFont(const base::string16& text,
|
| + const std::string& font_family,
|
| + const FontRenderParams& params,
|
| + internal::TextRunHarfBuzz* run);
|
| +
|
| + // Makes sure that text runs for layout text are shaped.
|
| + void EnsureLayoutRunList();
|
| +
|
| + // ICU grapheme iterator for the layout text. Can be NULL in case of an error.
|
| + base::i18n::BreakIterator* GetGraphemeIterator();
|
| +
|
| + // Convert an index in |text_| to the index in |given_text|. The
|
| + // |given_text| should be either |display_text_| or |layout_text_|
|
| + // depending on the elide state.
|
| + size_t TextIndexToGivenTextIndex(const base::string16& given_text,
|
| + size_t index);
|
| +
|
| + // Returns the current run list, |display_run_list_| if the text is
|
| + // elided, or |layout_run_list_| otherwise.
|
| + internal::TextRunList* GetRunList();
|
| + const internal::TextRunList* GetRunList() const;
|
| +
|
| + // Text run list for |layout_text_| and |display_text_|.
|
| + // |display_run_list_| is created only when the text is elided.
|
| + internal::TextRunList layout_run_list_;
|
| + scoped_ptr<internal::TextRunList> display_run_list_;
|
| +
|
| + bool update_layout_run_list_ : 1;
|
| + bool update_display_run_list_ : 1;
|
| + bool update_grapheme_iterator_ : 1;
|
| + bool update_display_text_ : 1;
|
| +
|
| + // ICU grapheme iterator for the layout text. Use GetGraphemeIterator()
|
| + // to access the iterator.
|
| scoped_ptr<base::i18n::BreakIterator> grapheme_iterator_;
|
|
|
| // The total size of the layouted text.
|
|
|