aboutsummaryrefslogtreecommitdiffstats
path: root/src/gdisp/mcufont/mf_font.h
blob: c7929cdfa919a6a6aa7cffcc4afbc75e077f8648 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
/*
 * This file is subject to the terms of the GFX License. If a copy of
 * the license was not distributed with this file, you can obtain one at:
 *
 *              http://ugfx.org/license.html
 */

/* Generic font type that supports fonts with multiple kinds of compression.
 * Provides an interface for decoding and rendering single characters.
 */

#ifndef _MF_FONT_H_
#define _MF_FONT_H_

#include "mf_encoding.h"

/* Callback function that writes pixels to screen / buffer / whatever.
 *
 * x:     X coordinate of the first pixel to write.
 * y:     Y coordinate of the first pixel to write.
 * count: Number of pixels to fill (horizontally).
 * alpha: The "opaqueness" of the pixels, 0 for background, 255 for text.
 * state: Free variable that was passed to render_character().
 */
typedef void (*mf_pixel_callback_t) (int16_t x, int16_t y, uint8_t count,
                                     uint8_t alpha, void *state);

/* General information about a font. */
struct mf_font_s
{
    /* Full name of the font, comes from the original font file. */
    const char *full_name;

    /* Short name of the font, comes from file name. */
    const char *short_name;

    /* Width and height of the character bounding box. */
    uint8_t width;
    uint8_t height;

    /* Minimum and maximum tracking width of characters. */
    uint8_t min_x_advance;
    uint8_t max_x_advance;

    /* Location of the text baseline relative to character. */
    int8_t baseline_x;
    uint8_t baseline_y;

    /* Line height of the font (vertical advance). */
    uint8_t line_height;

    /* Flags identifying various aspects of the font. */
    uint8_t flags;

    /* Fallback character to use for missing glyphs. */
    uint16_t fallback_character;

    /* Function to get character width. Should return 0 if character is
     * not found. */
    uint8_t (*character_width)(const struct mf_font_s *font, uint16_t character);

    /* Function to render a character. Returns the character width or 0 if
     * character is not found. */
    uint8_t (*render_character)(const struct mf_font_s *font,
                                int16_t x0, int16_t y0,
                                uint16_t character,
                                mf_pixel_callback_t callback,
                                void *state);
};

/* The flag definitions for the font.flags field. */
#define MF_FONT_FLAG_MONOSPACE 0x01
#define MF_FONT_FLAG_BW        0x02

/* Lookup structure for searching fonts by name. */
struct mf_font_list_s
{
    const struct mf_font_list_s *next;
    const struct mf_font_s *font;
};


/* Function to decode and render a single character.
 *
 * font:      Pointer to the font definition.
 * x0, y0:    Upper left corner of the target area.
 * character: The character code (unicode) to render.
 * callback:  Callback function to write out the pixels.
 * state:     Free variable for caller to use (can be NULL).
 *
 * Returns width of the character.
 */
MF_EXTERN uint8_t mf_render_character(const struct mf_font_s *font,
                                      int16_t x0, int16_t y0,
                                      mf_char character,
                                      mf_pixel_callback_t callback,
                                      void *state);

/* Function to get the width of a single character.
 * This is not necessarily the bounding box of the character
 * data, but rather the tracking width.
 *
 * font:      Pointer to the font definition.
 * character: The character code (unicode) to render.
 *
 * Returns width of the character in pixels.
 */
MF_EXTERN uint8_t mf_character_width(const struct mf_font_s *font,
                                     mf_char character);

/* Find a font based on name. The name can be either short name or full name.
 * Note: You can pass MF_INCLUDED_FONTS to search among all the included .h
 * files.
 *
 * name: Font name to search for.
 * fonts: Pointer to the first font search entry.
 *
 * Returns a pointer to the font or NULL if not found.
 */
MF_EXTERN const struct mf_font_s *mf_find_font(const char *name);

/* Get the list of included fonts */
MF_EXTERN const struct mf_font_list_s *mf_get_font_list(void);

#endif