// Copyright (c) 2012 The Chromium Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

#ifndef UI_GFX_FONT_LIST_H_
#define UI_GFX_FONT_LIST_H_

#include <string>
#include <vector>

#include "base/memory/ref_counted.h"
#include "ui/gfx/font.h"
#include "ui/gfx/gfx_export.h"

namespace gfx {

class FontListImpl;

// FontList represents a list of fonts and provides metrics which are common
// across the fonts.  FontList is copyable and quite cheap to copy.
//
// The format of font description strings is a subset of that used by Pango, as
// described at
// http://developer.gnome.org/pango/stable/pango-Fonts.html#pango-font-description-from-string
//
// Pango font description strings should not be passed directly into FontLists.
//
// The format is "<FONT_FAMILY_LIST>,[STYLES] <SIZE>", where:
// - FONT_FAMILY_LIST is a comma-separated list of font family names,
// - STYLES is an optional space-separated list of style names (case-sensitive
//   "Italic" "Ultra-Light" "Light" "Normal" "Semi-Bold" "Bold" "Ultra-Bold"
//   "Heavy" are supported), and
// - SIZE is an integer font size in pixels with the suffix "px"
//
// Here are examples of valid font description strings:
// - "Arial, Helvetica, Italic Semi-Bold 14px"
// - "Arial, 14px"
class GFX_EXPORT FontList {
 public:
  // Parses a FontList description string into |families_out|, |style_out| (a
  // bitfield of gfx::Font::Style values), |size_pixels_out| and |weight_out|.
  // Returns true if the string is properly-formed.
  static bool ParseDescription(const std::string& description,
                               std::vector<std::string>* families_out,
                               int* style_out,
                               int* size_pixels_out,
                               Font::Weight* weight_out);

  // Creates a font list with default font names, size and style, which are
  // specified by SetDefaultFontDescription().
  FontList();

  // Creates a font list that is a clone of another font list.
  FontList(const FontList& other);

  // Creates a font list from a string representing font names, styles, and
  // size.
  explicit FontList(const std::string& font_description_string);

  // Creates a font list from font names, styles, size and weight.
  FontList(const std::vector<std::string>& font_names,
           int font_style,
           int font_size,
           Font::Weight font_weight);

  // Creates a font list from a Font vector.
  // All fonts in this vector should have the same style and size.
  explicit FontList(const std::vector<Font>& fonts);

  // Creates a font list from a Font.
  explicit FontList(const Font& font);

  ~FontList();

  // Copies the given font list into this object.
  FontList& operator=(const FontList& other);

  // Sets the description string for default FontList construction. If it's
  // empty, FontList will initialize using the default Font constructor.
  //
  // The client code must call this function before any call of the default
  // constructor. This should be done on the UI thread.
  //
  // ui::ResourceBundle may call this function more than once when UI language
  // is changed.
  static void SetDefaultFontDescription(const std::string& font_description);

  // Returns a new FontList with the same font names but resized and the given
  // style and weight. |size_delta| is the size in pixels to add to the current
  // font size. |font_style| specifies the new style, which is a bitmask of the
  // values: Font::ITALIC and Font::UNDERLINE. |weight| is the requested font
  // weight.
  FontList Derive(int size_delta,
                  int font_style,
                  Font::Weight weight) const;

  // Returns a new FontList with the same font names and style but resized.
  // |size_delta| is the size in pixels to add to the current font size.
  FontList DeriveWithSizeDelta(int size_delta) const;

  // Returns a new FontList with the same font names, weight and size but the
  // given style. |font_style| specifies the new style, which is a bitmask of
  // the values: Font::ITALIC and Font::UNDERLINE.
  FontList DeriveWithStyle(int font_style) const;

  // Returns a new FontList with the same font name, size and style but with
  // the given weight.
  FontList DeriveWithWeight(Font::Weight weight) const;

  // Shrinks the font size until the font list fits within |height| while
  // having its cap height vertically centered. Returns a new FontList with
  // the correct height.
  //
  // The expected layout:
  //   +--------+-----------------------------------------------+------------+
  //   |        | y offset                                      | space      |
  //   |        +--------+-------------------+------------------+ above      |
  //   |        |        |                   | internal leading | cap height |
  //   | box    | font   | ascent (baseline) +------------------+------------+
  //   | height | height |                   | cap height                    |
  //   |        |        |-------------------+------------------+------------+
  //   |        |        | descent (height - baseline)          | space      |
  //   |        +--------+--------------------------------------+ below      |
  //   |        | space at bottom                               | cap height |
  //   +--------+-----------------------------------------------+------------+
  // Goal:
  //     center of box height == center of cap height
  //     (i.e. space above cap height == space below cap height)
  // Restrictions:
  //     y offset >= 0
  //     space at bottom >= 0
  //     (i.e. Entire font must be visible inside the box.)
  FontList DeriveWithHeightUpperBound(int height) const;

  // Returns the height of this font list, which is max(ascent) + max(descent)
  // for all the fonts in the font list.
  int GetHeight() const;

  // Returns the baseline of this font list, which is max(baseline) for all the
  // fonts in the font list.
  int GetBaseline() const;

  // Returns the cap height of this font list.
  // Currently returns the cap height of the primary font.
  int GetCapHeight() const;

  // Returns the expected number of horizontal pixels needed to display the
  // specified length of characters. Call GetStringWidth() to retrieve the
  // actual number.
  int GetExpectedTextWidth(int length) const;

  // Returns the |Font::FontStyle| style flags for this font list.
  int GetFontStyle() const;

  // Returns the font size in pixels.
  int GetFontSize() const;

  // Returns the font weight.
  Font::Weight GetFontWeight() const;

  // Returns the Font vector.
  const std::vector<Font>& GetFonts() const;

  // Returns the first font in the list.
  const Font& GetPrimaryFont() const;

  // Returns the first available font name. If there is no available font,
  // returns the first font name. Empty entries are ignored.
  // Used by Blink and webui to pick the primary standard/serif/sans/fixed/etc.
  // fonts from region-specific IDS lists.
  static std::string FirstAvailableOrFirst(const std::string& font_name_list);

 private:
  explicit FontList(FontListImpl* impl);

  static const scoped_refptr<FontListImpl>& GetDefaultImpl();

  scoped_refptr<FontListImpl> impl_;
};

}  // namespace gfx

#endif  // UI_GFX_FONT_LIST_H_
