Upstream version 5.34.104.0
[platform/framework/web/crosswalk.git] / src / ui / gfx / platform_font_pango.h
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_PLATFORM_FONT_PANGO_H_
6 #define UI_GFX_PLATFORM_FONT_PANGO_H_
7
8 #include <string>
9
10 #include "base/compiler_specific.h"
11 #include "base/memory/scoped_ptr.h"
12 #include "skia/ext/refptr.h"
13 #include "third_party/skia/include/core/SkRefCnt.h"
14 #include "ui/gfx/platform_font.h"
15
16 class SkTypeface;
17 class SkPaint;
18
19 namespace gfx {
20
21 class GFX_EXPORT PlatformFontPango : public PlatformFont {
22  public:
23   PlatformFontPango();
24   explicit PlatformFontPango(NativeFont native_font);
25   PlatformFontPango(const std::string& font_name, int font_size);
26
27   // Converts |gfx_font| to a new pango font. Free the returned font with
28   // pango_font_description_free().
29   static PangoFontDescription* PangoFontFromGfxFont(const gfx::Font& gfx_font);
30
31   // Resets and reloads the cached system font used by the default constructor.
32   // This function is useful when the system font has changed, for example, when
33   // the locale has changed.
34   static void ReloadDefaultFont();
35
36 #if defined(OS_CHROMEOS)
37   // Sets the default font.
38   static void SetDefaultFontDescription(const std::string& font_description);
39 #endif
40
41   // Position as an offset from the height of the drawn text, used to draw
42   // an underline. This is a negative number, so the underline would be
43   // drawn at y + height + underline_position.
44   double underline_position() const;
45   // The thickness to draw the underline.
46   double underline_thickness() const;
47
48   // Overridden from PlatformFont:
49   virtual Font DeriveFont(int size_delta, int style) const OVERRIDE;
50   virtual int GetHeight() const OVERRIDE;
51   virtual int GetBaseline() const OVERRIDE;
52   virtual int GetCapHeight() const OVERRIDE;
53   virtual int GetExpectedTextWidth(int length) const OVERRIDE;
54   virtual int GetStyle() const OVERRIDE;
55   virtual std::string GetFontName() const OVERRIDE;
56   virtual std::string GetActualFontNameForTesting() const OVERRIDE;
57   virtual int GetFontSize() const OVERRIDE;
58   virtual NativeFont GetNativeFont() const OVERRIDE;
59
60  private:
61   // Create a new instance of this object with the specified properties. Called
62   // from DeriveFont.
63   PlatformFontPango(const skia::RefPtr<SkTypeface>& typeface,
64                     const std::string& name,
65                     int size,
66                     int style);
67   virtual ~PlatformFontPango();
68
69   // Returns a Pango font description (suitable for parsing by
70   // pango_font_description_from_string()) for the default UI font.
71   static std::string GetDefaultFont();
72
73   // Initialize this object.
74   void InitWithNameAndSize(const std::string& font_name, int font_size);
75   void InitWithTypefaceNameSizeAndStyle(
76       const skia::RefPtr<SkTypeface>& typeface,
77       const std::string& font_family,
78       int font_size,
79       int style);
80   void InitFromPlatformFont(const PlatformFontPango* other);
81
82   // Potentially slow call to get pango metrics (average width, underline info).
83   void InitPangoMetrics();
84
85   // Setup a Skia context to use the current typeface.
86   void PaintSetup(SkPaint* paint) const;
87
88   // Make |this| a copy of |other|.
89   void CopyFont(const Font& other);
90
91   // The average width of a character, initialized and cached if needed.
92   double GetAverageWidth() const;
93
94   skia::RefPtr<SkTypeface> typeface_;
95
96   // Additional information about the face
97   // Skia actually expects a family name and not a font name.
98   std::string font_family_;
99   int font_size_pixels_;
100   int style_;
101
102   // Cached metrics, generated at construction.
103   int height_pixels_;
104   int ascent_pixels_;
105   int cap_height_pixels_;
106
107   // The pango metrics are much more expensive so we wait until we need them
108   // to compute them.
109   bool pango_metrics_inited_;
110   double average_width_pixels_;
111   double underline_position_pixels_;
112   double underline_thickness_pixels_;
113
114   // The default font, used for the default constructor.
115   static Font* default_font_;
116
117 #if defined(OS_CHROMEOS)
118   static std::string* default_font_description_;
119 #endif
120
121   DISALLOW_COPY_AND_ASSIGN(PlatformFontPango);
122 };
123
124 }  // namespace gfx
125
126 #endif  // UI_GFX_PLATFORM_FONT_PANGO_H_