// 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_RENDERER_RASTERIZER_SKIA_TYPEFACE_H_
#define COBALT_RENDERER_RASTERIZER_SKIA_TYPEFACE_H_

#include "base/hash_tables.h"
#include "base/memory/scoped_ptr.h"
#include "base/threading/thread_checker.h"
#include "cobalt/render_tree/font.h"
#include "cobalt/render_tree/typeface.h"
#include "cobalt/renderer/rasterizer/skia/skia/src/ports/SkTypeface_cobalt.h"

#include "third_party/skia/include/core/SkPaint.h"
#include "third_party/skia/include/core/SkRefCnt.h"

namespace cobalt {
namespace renderer {
namespace rasterizer {
namespace skia {

// Describes a render_tree::Typeface using Skia objects such as SkTypeface.
// NOTE: Character glyph queries are not thread-safe and should only occur from
// a single thread. However, the typeface can be created on a different thread
// than the thread making the character glyph queries.
class SkiaTypeface : public render_tree::Typeface {
 public:
  explicit SkiaTypeface(SkTypeface_Cobalt* typeface);

  // Returns the contained SkTypeface_Cobalt object, which has its reference
  // count incremented.
  // NOTE: The caller is responsible for decrementing the reference count after
  // finishing with the object.
  SkTypeface_Cobalt* GetSkTypeface() const;

  // From render_tree::Typeface

  // Returns the typeface's id, which is guaranteed to be unique among the
  // typefaces registered with the resource provider.
  render_tree::TypefaceId GetId() const OVERRIDE;

  // Returns a size estimate for this typeface in bytes.
  uint32 GetEstimatedSizeInBytes() const OVERRIDE;

  // Creates a font using this typeface, with the font's size set to the passed
  // in value.
  scoped_refptr<render_tree::Font> CreateFontWithSize(float font_size) OVERRIDE;

  // 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. The results are cached to speed up subsequent requests
  // for the same character.
  render_tree::GlyphIndex GetGlyphForCharacter(int32 utf32_character) OVERRIDE;

 private:
  // Usually covers Latin-1 in a single page.
  static const int kPrimaryPageSize = 256;
  typedef base::hash_map<int32, render_tree::GlyphIndex> CharacterToGlyphMap;

  // The underlying SkTypeface that was used to create this typeface.
  SkAutoTUnref<SkTypeface_Cobalt> typeface_;

  // The glyphs for characters are lazily computed and cached to speed up later
  // lookups. The page containing indices 0-255 is optimized within an array.
  // Thread checking is used to used to ensure that they are only accessed and
  // modified on a single thread.
  scoped_array<render_tree::GlyphIndex> primary_page_character_glyphs_;
  CharacterToGlyphMap character_to_glyph_map_;
  base::ThreadChecker character_glyph_thread_checker_;
};

}  // namespace skia
}  // namespace rasterizer
}  // namespace renderer
}  // namespace cobalt

#endif  // COBALT_RENDERER_RASTERIZER_SKIA_TYPEFACE_H_
