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