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 3 // found in the LICENSE file. 4 5 #ifndef UI_GFX_RENDER_TEXT_WIN_H_ 6 #define UI_GFX_RENDER_TEXT_WIN_H_ 7 8 #include <usp10.h> 9 10 #include <map> 11 #include <string> 12 #include <vector> 13 14 #include "base/memory/scoped_ptr.h" 15 #include "base/memory/scoped_vector.h" 16 #include "ui/gfx/render_text.h" 17 18 namespace gfx { 19 20 namespace internal { 21 22 struct TextRun { 23 TextRun(); 24 ~TextRun(); 25 26 ui::Range range; 27 Font font; 28 // A gfx::Font::FontStyle flag to specify bold and italic styles. 29 // Supersedes |font.GetFontStyle()|. Stored separately to avoid calling 30 // |font.DeriveFont()|, which is expensive on Windows. 31 int font_style; 32 33 bool strike; 34 bool diagonal_strike; 35 bool underline; 36 37 int width; 38 // The cumulative widths of preceding runs. 39 int preceding_run_widths; 40 41 SCRIPT_ANALYSIS script_analysis; 42 43 scoped_ptr<WORD[]> glyphs; 44 scoped_ptr<WORD[]> logical_clusters; 45 scoped_ptr<SCRIPT_VISATTR[]> visible_attributes; 46 int glyph_count; 47 48 scoped_ptr<int[]> advance_widths; 49 scoped_ptr<GOFFSET[]> offsets; 50 ABC abc_widths; 51 SCRIPT_CACHE script_cache; 52 53 private: 54 DISALLOW_COPY_AND_ASSIGN(TextRun); 55 }; 56 57 } // namespace internal 58 59 // RenderTextWin is the Windows implementation of RenderText using Uniscribe. 60 class RenderTextWin : public RenderText { 61 public: 62 RenderTextWin(); 63 virtual ~RenderTextWin(); 64 65 // Overridden from RenderText: 66 virtual Size GetStringSize() OVERRIDE; 67 virtual int GetBaseline() OVERRIDE; 68 virtual SelectionModel FindCursorPosition(const Point& point) OVERRIDE; 69 virtual std::vector<FontSpan> GetFontSpansForTesting() OVERRIDE; 70 71 protected: 72 // Overridden from RenderText: 73 virtual SelectionModel AdjacentCharSelectionModel( 74 const SelectionModel& selection, 75 VisualCursorDirection direction) OVERRIDE; 76 virtual SelectionModel AdjacentWordSelectionModel( 77 const SelectionModel& selection, 78 VisualCursorDirection direction) OVERRIDE; 79 virtual ui::Range GetGlyphBounds(size_t index) OVERRIDE; 80 virtual std::vector<Rect> GetSubstringBounds(const ui::Range& range) OVERRIDE; 81 virtual size_t TextIndexToLayoutIndex(size_t index) const OVERRIDE; 82 virtual size_t LayoutIndexToTextIndex(size_t index) const OVERRIDE; 83 virtual bool IsCursorablePosition(size_t position) OVERRIDE; 84 virtual void ResetLayout() OVERRIDE; 85 virtual void EnsureLayout() OVERRIDE; 86 virtual void DrawVisualText(Canvas* canvas) OVERRIDE; 87 88 private: 89 FRIEND_TEST_ALL_PREFIXES(RenderTextTest, Win_LogicalClusters); 90 91 void ItemizeLogicalText(); 92 void LayoutVisualText(); 93 void LayoutTextRun(internal::TextRun* run); 94 95 // Helper function that calls |ScriptShape()| on the run, which has logic to 96 // handle E_OUTOFMEMORY return codes. 97 HRESULT ShapeTextRunWithFont(internal::TextRun* run, const Font& font); 98 99 // Returns the number of characters in |run| that have missing glyphs. 100 int CountCharsWithMissingGlyphs(internal::TextRun* run) const; 101 102 // Return the run index that contains the argument; or the length of the 103 // |runs_| vector if argument exceeds the text length or width. 104 size_t GetRunContainingCaret(const SelectionModel& caret) const; 105 size_t GetRunContainingXCoord(int x) const; 106 107 // Given a |run|, returns the SelectionModel that contains the logical first 108 // or last caret position inside (not at a boundary of) the run. 109 // The returned value represents a cursor/caret position without a selection. 110 SelectionModel FirstSelectionModelInsideRun(const internal::TextRun* run); 111 SelectionModel LastSelectionModelInsideRun(const internal::TextRun* run); 112 113 // Cached HDC for performing Uniscribe API calls. 114 static HDC cached_hdc_; 115 116 // Cached map from font name to the last successful substitute font used. 117 // TODO(asvitkine): Move the caching logic to font_fallback_win.cc. 118 static std::map<std::string, Font> successful_substitute_fonts_; 119 120 SCRIPT_CONTROL script_control_; 121 SCRIPT_STATE script_state_; 122 123 ScopedVector<internal::TextRun> runs_; 124 Size string_size_; 125 126 // A common vertical baseline for all the text runs. This is computed as the 127 // largest baseline over all the runs' fonts. 128 int common_baseline_; 129 130 scoped_ptr<int[]> visual_to_logical_; 131 scoped_ptr<int[]> logical_to_visual_; 132 133 bool needs_layout_; 134 135 DISALLOW_COPY_AND_ASSIGN(RenderTextWin); 136 }; 137 138 } // namespace gfx 139 140 #endif // UI_GFX_RENDER_TEXT_WIN_H_ 141