/**
 * @file lv_freetype.h
 *
 */
#ifndef LV_FREETYPE_H
#define LV_FREETYPE_H

#ifdef __cplusplus
extern "C" {
#endif

/*********************
 *      INCLUDES
 *********************/
#include "../../lv_conf_internal.h"

#if LV_USE_FREETYPE

#include "../../misc/lv_types.h"
#include "../../misc/lv_event.h"
#include "../../misc/lv_color.h"

#include LV_STDBOOL_INCLUDE

/*********************
*      DEFINES
*********************/

#define LV_FREETYPE_F26DOT6_TO_INT(x)   ((x) >> 6)
#define LV_FREETYPE_F26DOT6_TO_FLOAT(x) ((float)(x) / 64)

#define FT_FONT_STYLE_NORMAL LV_FREETYPE_FONT_STYLE_NORMAL
#define FT_FONT_STYLE_ITALIC LV_FREETYPE_FONT_STYLE_ITALIC
#define FT_FONT_STYLE_BOLD   LV_FREETYPE_FONT_STYLE_BOLD

/**********************
 *      TYPEDEFS
 **********************/

typedef enum {
    LV_FREETYPE_FONT_STYLE_NORMAL = 0,
    LV_FREETYPE_FONT_STYLE_ITALIC = 1 << 0,
    LV_FREETYPE_FONT_STYLE_BOLD = 1 << 1,
} lv_freetype_font_style_t;

typedef lv_freetype_font_style_t LV_FT_FONT_STYLE;

typedef enum {
    LV_FREETYPE_FONT_RENDER_MODE_BITMAP = 0,
    LV_FREETYPE_FONT_RENDER_MODE_OUTLINE = 1,
} lv_freetype_font_render_mode_t;

typedef void * lv_freetype_outline_t;

typedef enum {
    LV_FREETYPE_OUTLINE_END,
    LV_FREETYPE_OUTLINE_MOVE_TO,
    LV_FREETYPE_OUTLINE_LINE_TO,
    LV_FREETYPE_OUTLINE_CUBIC_TO,
    LV_FREETYPE_OUTLINE_CONIC_TO,
    LV_FREETYPE_OUTLINE_BORDER_START,     /* When line width > 0 the border glyph is drawn after the regular glyph */
} lv_freetype_outline_type_t;

/* Only path string is required */
typedef const char lv_freetype_font_src_t;

LV_ATTRIBUTE_EXTERN_DATA extern const lv_font_class_t lv_freetype_font_class;

/**********************
 * GLOBAL PROTOTYPES
 **********************/

/**
 * Initialize the freetype library.
 * @return LV_RESULT_OK on success, otherwise LV_RESULT_INVALID.
 */
lv_result_t lv_freetype_init(uint32_t max_glyph_cnt);

/**
 * Uninitialize the freetype library
 */
void lv_freetype_uninit(void);

/**
 * Initialize a font info structure.
 * @param font_info font info structure to be initialized.
 */
void lv_freetype_init_font_info(lv_font_info_t * font_info);

/**
 * Create a freetype font with a font info structure.
 * @param font_info font info structure.
 * @return Created font, or NULL on failure.
 */
lv_font_t * lv_freetype_font_create_with_info(const lv_font_info_t * font_info);

/**
 * Create a freetype font.
 * @param pathname font file path.
 * @param render_mode font render mode(see @lv_freetype_font_render_mode_t for details).
 * @param size font size.
 * @param style font style(see lv_freetype_font_style_t for details).
 * @return Created font, or NULL on failure.
 */
lv_font_t * lv_freetype_font_create(const char * pathname, lv_freetype_font_render_mode_t render_mode, uint32_t size,
                                    lv_freetype_font_style_t style);

/**
 * Delete a freetype font.
 * @param font freetype font to be deleted.
 */
void lv_freetype_font_delete(lv_font_t * font);

/**
 * Register a callback function to generate outlines for FreeType fonts.
 *
 * @param cb The callback function to be registered.
 * @param user_data User data to be passed to the callback function.
 * @return The ID of the registered callback function, or a negative value on failure.
 */
void lv_freetype_outline_add_event(lv_event_cb_t event_cb, lv_event_code_t filter, void * user_data);

/**
 * Get the scale of a FreeType font.
 *
 * @param font The FreeType font to get the scale of.
 * @return The scale of the FreeType font.
 */
uint32_t lv_freetype_outline_get_scale(const lv_font_t * font);

/**
 * Check if the font is an outline font.
 *
 * @param font The FreeType font.
 * @return Is outline font on success, otherwise false.
 */
bool lv_freetype_is_outline_font(const lv_font_t * font);

/**********************
 *      MACROS
 **********************/

#endif /*LV_USE_FREETYPE*/

#ifdef __cplusplus
} /* extern "C" */
#endif

#endif /* LV_FREETYPE_H */
