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_ 127