/*
 * Copyright 2014 Google Inc. All Rights Reserved.
 *
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 *     http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 */

#ifndef COBALT_RENDER_TREE_FONT_H_
#define COBALT_RENDER_TREE_FONT_H_

#include <vector>

#include "base/memory/ref_counted.h"
#include "cobalt/math/rect_f.h"
#include "cobalt/render_tree/glyph.h"
#include "cobalt/render_tree/typeface.h"

namespace cobalt {
namespace render_tree {

// Contains metrics common to all glyphs in the font.
class FontMetrics {
 public:
  FontMetrics(float ascent, float descent, float leading, float x_height)
      : ascent_(ascent),
        descent_(descent),
        leading_(leading),
        x_height_(x_height) {}
  float ascent() const { return ascent_; }
  float descent() const { return descent_; }
  float leading() const { return leading_; }
  float x_height() const { return x_height_; }
  float em_box_height() const { return ascent_ + descent_ + leading_; }
  float baseline_offset_from_top() const { return ascent_ + leading_ / 2; }

 private:
  // The recommended distance above the baseline.
  float ascent_;
  // The recommended distance below the baseline.
  float descent_;
  // The recommended distance to add between lines of text.
  float leading_;
  // The x-height, aka the height of the 'x' glyph, used for centering.
  // See also https://en.wikipedia.org/wiki/X-height
  float x_height_;
};

// Used as a parameter to GetLocalTypeface() and GetCharacterFallbackTypeface()
// to describe the font style the caller is seeking.
struct FontStyle {
  enum Weight {
    kThinWeight = 100,
    kExtraLightWeight = 200,
    kLightWeight = 300,
    kNormalWeight = 400,
    kMediumWeight = 500,
    kSemiBoldWeight = 600,
    kBoldWeight = 700,
    kExtraBoldWeight = 800,
    kBlackWeight = 900
  };

  enum Slant {
    kUprightSlant,
    kItalicSlant,
  };

  FontStyle() : weight(kNormalWeight), slant(kUprightSlant) {}
  FontStyle(Weight font_weight, Slant font_slant)
      : weight(font_weight), slant(font_slant) {}

  Weight weight;
  Slant slant;
};

// The Font class is an abstract base class representing a typeface with a
// specific size. It provides the font metrics common to all glyphs in the
// font, and supports retrieval of both the glyph that it uses for each UTF-32
// character and the bounds and width information for any of its contained
// glyphs. Since Font objects may be created in the front-end, but must be
// accessed by the rasterizer during GlyphBuffer creation, it is expected that
// they will be downcast again to a rasterizer-specific type through
// base::polymorphic_downcast().
// NOTE: Font objects are not immutable and offer no thread safety guarantees.
// While Font is intended to assist in the creation of GlyphBuffer objects, only
// GlyphBuffer objects, which are immutable and thread-safe, should be accessed
// on multiple threads.
class Font : public base::RefCounted<Font> {
 public:
  // Returns the font's typeface id, which is guaranteed to be unique among the
  // typefaces registered with the font's resource provider.
  virtual TypefaceId GetTypefaceId() const = 0;

  // Returns the metrics common to all glyphs in the font. Used to calculate
  // the recommended line height and spacing between the lines.
  virtual FontMetrics GetFontMetrics() const = 0;

  // Returns an index to the glyph that the font provides for a given UTF-32
  // unicode character. If the character is unsupported, then it returns
  // kInvalidGlyphIndex.
  virtual GlyphIndex GetGlyphForCharacter(int32 utf32_character) = 0;

  // Returns the bounding box for a given glyph. While left is always zero,
  // note that since the glyph is output with the origin vertically on the
  // baseline, the top of the bounding box will likely be non-zero and is used
  // to indicate the offset of the glyph bounding box from the origin.  The
  // return value is given in units of pixels.
  virtual const math::RectF& GetGlyphBounds(GlyphIndex glyph) = 0;

  // Returns the width of a given glyph. The return value is given in units of
  // pixels.
  virtual float GetGlyphWidth(GlyphIndex glyph) = 0;

 protected:
  virtual ~Font() {}

  // Allow the reference counting system access to our destructor.
  friend class base::RefCounted<Font>;
};

typedef std::vector<scoped_refptr<Font> > FontVector;

}  // namespace render_tree
}  // namespace cobalt

#endif  // COBALT_RENDER_TREE_FONT_H_
