Home | History | Annotate | Download | only in gfx
      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