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_MAC_H_
      6 #define UI_GFX_RENDER_TEXT_MAC_H_
      7 
      8 #include <ApplicationServices/ApplicationServices.h>
      9 
     10 #include <string>
     11 #include <vector>
     12 
     13 #include "base/mac/scoped_cftyperef.h"
     14 #include "ui/gfx/render_text.h"
     15 
     16 namespace gfx {
     17 
     18 // RenderTextMac is the Mac implementation of RenderText that uses CoreText for
     19 // layout and Skia for drawing.
     20 //
     21 // Note: The current implementation only supports drawing and sizing the text,
     22 //       but not text selection or cursor movement.
     23 class RenderTextMac : public RenderText {
     24  public:
     25   RenderTextMac();
     26   virtual ~RenderTextMac();
     27 
     28   // Overridden from RenderText:
     29   virtual Size GetStringSize() OVERRIDE;
     30   virtual int GetBaseline() OVERRIDE;
     31   virtual SelectionModel FindCursorPosition(const Point& point) OVERRIDE;
     32   virtual std::vector<FontSpan> GetFontSpansForTesting() OVERRIDE;
     33 
     34  protected:
     35   // Overridden from RenderText:
     36   virtual SelectionModel AdjacentCharSelectionModel(
     37       const SelectionModel& selection,
     38       VisualCursorDirection direction) OVERRIDE;
     39   virtual SelectionModel AdjacentWordSelectionModel(
     40       const SelectionModel& selection,
     41       VisualCursorDirection direction) OVERRIDE;
     42   virtual ui::Range GetGlyphBounds(size_t index) OVERRIDE;
     43   virtual std::vector<Rect> GetSubstringBounds(const ui::Range& range) OVERRIDE;
     44   virtual size_t TextIndexToLayoutIndex(size_t index) const OVERRIDE;
     45   virtual size_t LayoutIndexToTextIndex(size_t index) const OVERRIDE;
     46   virtual bool IsCursorablePosition(size_t position) OVERRIDE;
     47   virtual void ResetLayout() OVERRIDE;
     48   virtual void EnsureLayout() OVERRIDE;
     49   virtual void DrawVisualText(Canvas* canvas) OVERRIDE;
     50 
     51  private:
     52   struct TextRun {
     53     CTRunRef ct_run;
     54     SkPoint origin;
     55     std::vector<uint16> glyphs;
     56     std::vector<SkPoint> glyph_positions;
     57     SkScalar width;
     58     std::string font_name;
     59     int font_style;
     60     SkScalar text_size;
     61     SkColor foreground;
     62     bool underline;
     63     bool strike;
     64     bool diagonal_strike;
     65 
     66     TextRun();
     67     ~TextRun();
     68   };
     69 
     70   // Applies RenderText styles to |attr_string| with the given |ct_font|.
     71   void ApplyStyles(CFMutableAttributedStringRef attr_string, CTFontRef ct_font);
     72 
     73   // Updates |runs_| based on |line_| and sets |runs_valid_| to true.
     74   void ComputeRuns();
     75 
     76   // The Core Text line of text. Created by |EnsureLayout()|.
     77   base::ScopedCFTypeRef<CTLineRef> line_;
     78 
     79   // Array to hold CFAttributedString attributes that allows Core Text to hold
     80   // weak references to them without leaking.
     81   base::ScopedCFTypeRef<CFMutableArrayRef> attributes_;
     82 
     83   // Visual dimensions of the text. Computed by |EnsureLayout()|.
     84   Size string_size_;
     85 
     86   // Common baseline for this line of text. Computed by |EnsureLayout()|.
     87   SkScalar common_baseline_;
     88 
     89   // Visual text runs. Only valid if |runs_valid_| is true. Computed by
     90   // |ComputeRuns()|.
     91   std::vector<TextRun> runs_;
     92 
     93   // Indicates that |runs_| are valid, set by |ComputeRuns()|.
     94   bool runs_valid_;
     95 
     96   DISALLOW_COPY_AND_ASSIGN(RenderTextMac);
     97 };
     98 
     99 }  // namespace gfx
    100 
    101 #endif  // UI_GFX_RENDER_TEXT_MAC_H_
    102