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_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 GetAverageCharacterWidth() const OVERRIDE;
     54   virtual int GetStringWidth(const base::string16& text) const OVERRIDE;
     55   virtual int GetExpectedTextWidth(int length) const OVERRIDE;
     56   virtual int GetStyle() const OVERRIDE;
     57   virtual std::string GetFontName() const OVERRIDE;
     58   virtual std::string GetActualFontNameForTesting() const OVERRIDE;
     59   virtual int GetFontSize() const OVERRIDE;
     60   virtual NativeFont GetNativeFont() const OVERRIDE;
     61 
     62  private:
     63   // Create a new instance of this object with the specified properties. Called
     64   // from DeriveFont.
     65   PlatformFontPango(const skia::RefPtr<SkTypeface>& typeface,
     66                     const std::string& name,
     67                     int size,
     68                     int style);
     69   virtual ~PlatformFontPango();
     70 
     71   // Returns a Pango font description (suitable for parsing by
     72   // pango_font_description_from_string()) for the default UI font.
     73   static std::string GetDefaultFont();
     74 
     75   // Initialize this object.
     76   void InitWithNameAndSize(const std::string& font_name, int font_size);
     77   void InitWithTypefaceNameSizeAndStyle(
     78       const skia::RefPtr<SkTypeface>& typeface,
     79       const std::string& font_family,
     80       int font_size,
     81       int style);
     82   void InitFromPlatformFont(const PlatformFontPango* other);
     83 
     84   // Potentially slow call to get pango metrics (average width, underline info).
     85   void InitPangoMetrics();
     86 
     87   // Setup a Skia context to use the current typeface.
     88   void PaintSetup(SkPaint* paint) const;
     89 
     90   // Make |this| a copy of |other|.
     91   void CopyFont(const Font& other);
     92 
     93   // The average width of a character, initialized and cached if needed.
     94   double GetAverageWidth() const;
     95 
     96   skia::RefPtr<SkTypeface> typeface_;
     97 
     98   // Additional information about the face
     99   // Skia actually expects a family name and not a font name.
    100   std::string font_family_;
    101   int font_size_pixels_;
    102   int style_;
    103 
    104   // Cached metrics, generated at construction.
    105   int height_pixels_;
    106   int ascent_pixels_;
    107 
    108   // The pango metrics are much more expensive so we wait until we need them
    109   // to compute them.
    110   bool pango_metrics_inited_;
    111   double average_width_pixels_;
    112   double underline_position_pixels_;
    113   double underline_thickness_pixels_;
    114 
    115   // The default font, used for the default constructor.
    116   static Font* default_font_;
    117 
    118 #if defined(OS_CHROMEOS)
    119   static std::string* default_font_description_;
    120 #endif
    121 
    122   DISALLOW_COPY_AND_ASSIGN(PlatformFontPango);
    123 };
    124 
    125 }  // namespace gfx
    126 
    127 #endif  // UI_GFX_PLATFORM_FONT_PANGO_H_
    128