// Copyright 2014 The PDFium Authors
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com

#ifndef CORE_FXGE_FREETYPE_FX_FREETYPE_H_
#define CORE_FXGE_FREETYPE_FX_FREETYPE_H_

#include <ft2build.h>

#include <memory>

#include FT_FREETYPE_H
#include FT_GLYPH_H
#include FT_LCD_FILTER_H
#include FT_MULTIPLE_MASTERS_H
#include FT_OUTLINE_H
#include FT_TRUETYPE_TABLES_H

using FXFT_LibraryRec = struct FT_LibraryRec_;
using FXFT_FaceRec = struct FT_FaceRec_;
using FXFT_StreamRec = struct FT_StreamRec_;

struct FXFTFaceRecDeleter {
  inline void operator()(FXFT_FaceRec* pRec) { FT_Done_Face(pRec); }
};

struct FXFTLibraryRecDeleter {
  inline void operator()(FXFT_LibraryRec* pRec) { FT_Done_FreeType(pRec); }
};

struct FXFTMMVarDeleter {
  void operator()(FT_MM_Var* variation_desc);
};

using ScopedFXFTFaceRec = std::unique_ptr<FXFT_FaceRec, FXFTFaceRecDeleter>;
using ScopedFXFTLibraryRec =
    std::unique_ptr<FXFT_LibraryRec, FXFTLibraryRecDeleter>;

class ScopedFXFTMMVar {
 public:
  explicit ScopedFXFTMMVar(FXFT_FaceRec* face);
  ~ScopedFXFTMMVar();

  explicit operator bool() const { return !!variation_desc_; }

  FT_Pos GetAxisDefault(size_t index) const;
  FT_Long GetAxisMin(size_t index) const;
  FT_Long GetAxisMax(size_t index) const;

 private:
  std::unique_ptr<FT_MM_Var, FXFTMMVarDeleter> const variation_desc_;
};

#define FXFT_Get_Glyph_HoriBearingX(face) (face)->glyph->metrics.horiBearingX
#define FXFT_Get_Glyph_HoriBearingY(face) (face)->glyph->metrics.horiBearingY
#define FXFT_Get_Glyph_Width(face) (face)->glyph->metrics.width
#define FXFT_Get_Glyph_Height(face) (face)->glyph->metrics.height
#define FXFT_Get_Glyph_HoriAdvance(face) (face)->glyph->metrics.horiAdvance

int FXFT_unicode_from_adobe_name(const char* glyph_name);
void FXFT_adobe_name_from_unicode(char* name, wchar_t unicode);

#endif  // CORE_FXGE_FREETYPE_FX_FREETYPE_H_
