// Copyright 2016 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_TYPEFACE_H_
#define COBALT_RENDER_TREE_TYPEFACE_H_

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

namespace cobalt {
namespace render_tree {

class Font;

typedef uint32_t TypefaceId;

// The Typeface class is an abstract base class representing an implementation
// specific typeface object. While it has no associated size, it supports the
// creation of concrete Font objects at any requested size. The specific glyph
// that the typeface provides for each UTF-32 character is queryable.
// NOTE: Typeface objects are not immutable and offer no thread safety
// guarantees. While Typeface 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 Typeface : public base::RefCounted<Typeface> {
 public:
  // Returns the typeface's id, which is guaranteed to be unique among the
  // typefaces registered with the resource provider.
  virtual TypefaceId GetId() const = 0;

  // Returns a size estimate for this typeface in bytes. While the derived class
  // can potentially return an exact value, there is no guarantee that this will
  // be the case.
  virtual uint32 GetEstimatedSizeInBytes() const = 0;

  // Returns a newly created font using this typeface, with the font size set to
  // the passed in value.
  virtual scoped_refptr<Font> CreateFontWithSize(float font_size) = 0;

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

 protected:
  virtual ~Typeface() {}

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

}  // namespace render_tree
}  // namespace cobalt

#endif  // COBALT_RENDER_TREE_TYPEFACE_H_
