Generate new fonts¶
The Commercial edition allows to generate new fonts, to be used as header files or uploaded to an external SPI Flash.
The set of characters corresponds to the ISO 8859-1 or Latin 1 specification. The font example displays all the characters available.
Configure¶
$ |
|
The command installs PHP and other dependencies.
$ $ $ |
|
The commands download and install the utility from this repository and select this specific version.
Use¶
$ |
|
font_conv_core
generates the font.
The parameters are
-
name
sets the name of the generated C file; -
font
sets the name of the TTF font; -
height
selects the height in pixels; -
bpp
should be set to1
; -
uni_first
is set to32
for space; -
uni_last
could be set to127
or to255
to include extended characters.
Rename the Font_DejaVuSans28.c
file as Font_DejaVuSans28.cpp
$ |
|
Create the corresponding header file Font_DejaVuSans28.h
// Configuration
#include "hV_Configuration.h"
// The Arduino IDE doesn't allow to select the libraries, hence this condition.
#if (FONT_MODE == USE_FONT_HEADER)
#ifndef DEJAVUSANS28FONT_RELEASE
#define DEJAVUSANS28FONT_RELEASE 507
#include "hV_Font.h"
#if (hV_FONT_HEADER_STRUCTURE_RELEASE < 507)
#error Required hV_FONT_HEADER_STRUCTURE_RELEASE 507
#endif // hV_FONT_HEADER_STRUCTURE_RELEASE
extern const font_s Font_DejaVuSans28;
#endif // DEJAVUSANS28FONT_RELEASE
#endif // FONT_MODE
Edit the Font_DejaVuSans28.cpp
file and add at the beginning
// Configuration
#include "hV_Configuration.h"
// The Arduino IDE doesn't allow to select the libraries, hence this condition.
#if (FONT_MODE == USE_FONT_HEADER)
// Font_DejaVuSans28.h
#include "Font_DejaVuSans28.h"
Replace
static const uint8_t DejaVuSans28_glyph_bitmap[]
by
static const width_s Width_DejaVuSans28[] PLACE_IN_FRAM
The PLACE_IN_FRAM
macro tells the compiler to locate the array in a specific region of memory, here upper-FRAM for the MSP430FR5994.
Replace
static const lv_font_glyph_dsc_t DejaVuSans28_glyph_dsc[]
by
static const uint8_t Table_DejaVuSans28[] PLACE_IN_FRAM
The PLACE_IN_FRAM
macro tells the compiler to locate the array in a specific region of memory, here upper-FRAM for the MSP430FR5994.
Replace w_px
and glyph_index
on each entry
{.w_px = 8, | .glyph_index = 0}, | /*Unicode: U+0020 ( )*/
by pixel
and index
{.pixel = 8, .index = 0}, | /*Unicode: U+0020 ( )*/
Finally, replace
lv_font_t DejaVuSans28 =
{
.unicode_first = 32, /*First Unicode letter in this font*/
.unicode_last = 255, /*Last Unicode letter in this font*/
.h_px = 28, /*Font height in pixels*/
.glyph_bitmap = DejaVuSans28_glyph_bitmap, /*Bitmap of glyphs*/
.glyph_dsc = DejaVuSans28_glyph_dsc, /*Description of glyphs*/
.glyph_cnt = 224, /*Number of glyphs in the font*/
.unicode_list = NULL, /*Every character in the font from 'unicode_first' to 'unicode_last'*/
.get_bitmap = lv_font_get_bitmap_continuous | /*Function pointer to get glyph's bitmap*/
.get_width = lv_font_get_width_continuous, /*Function pointer to get glyph's width*/
.bpp = 1, /*Bit per pixel*/
.monospace = 0, /*Fix width (0: if not used)*/
.next_page = NULL, /*Pointer to a font extension*/
};
by
const font_s Font_DejaVuSans28 =
{
.kind = 0x20, // kind of font: Sans Serif
.height = 28, // reference size, from source font
.maxWidth = 23,
.first = 32, // number of first character, usually 32
.number = 224, // number of characters, usually 96 or 224
.width = Width_DejaVuSans28, // characters widths and relative addresses
.table = Table_DejaVuSans28 // characters definitions
};
with
-
kind
: kind of font, to be set according to the table below; -
height
: height, set during font generation, set fromh_px
; -
maxWidth
: maximum width, to be calculated from the*width
array; -
first
: first character, usually32
, set fromh_px
; -
number
: number of characters, usually96
or224
, set fromglyph_cnt
orunicode_last - unicode_first + 1
; -
width
: characters index and length in bytes, see* width
array; -
table
: character definition, see* table
array.
The kind of font is coded on 8 bits according to
Bit | Value | Content |
---|---|---|
7 |
0x80 |
High definition, 2 bits per pixel |
6 |
0x40 |
Fixed Mono font |
5 |
0x20 |
Proportional font, Sans Serif |
4 |
0x10 |
Proportional font, Serif |
3 |
0x08 |
Italic |
2 |
0x04 |
Bold |
1 ..0 |
0x00 ..0x03 |
Variant number |
Example
0x20
refers to a proportional Sans Serif font.
Add at the end
#endif // FONT_MODE
Example¶
Header file Font_DejaVuSans28.h
// SDK
#include "hV_HAL_Peripherals.h"
// Configuration
#include "hV_Configuration.h"
#ifndef hV_FONT_HEADER_STRUCTURE_RELEASE
#define hV_FONT_HEADER_STRUCTURE_RELEASE 507
// The Arduino IDE doesn't allow to select the libraries, hence this condition.
#if (FONT_MODE == USE_FONT_HEADER)
struct width_s
{
uint16_t pixel; ///< width in pixel
uint16_t index; ///< relative address
};
struct font_s
{
uint8_t kind; ///< font description
uint8_t height; ///< general height in pixels
uint8_t maxWidth; ///< maximum width in pixels from *width array
uint8_t first; ///< number of first character, usually 32
uint8_t number; ///< number of characters, usually 96 or 224
const width_s * width; ///< characters widths and relative addresses
const uint8_t * table; ///< characters definitions
};
#endif // USE_FONT_HEADER
#endif // hV_FONT_HEADER_STRUCTURE_RELEASE
Code file Font_DejaVuSans28.cpp
// Configuration
#include "hV_Configuration.h"
// The Arduino IDE doesn't allow to select the libraries, hence this condition.
#if (FONT_MODE == USE_FONT_HEADER)
// Font_DejaVuSans28.h
#include "Font_DejaVuSans28.h"
static const uint8_t Table_DejaVuSans28[] PLACE_IN_FRAM =
{
/*Unicode: U+0020 ( ) , Width: 8 */
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
0x00, //........
/*Unicode: U+0021 (!) , Width: 2 */
0x00, //..
0x00, //..
0x00, //..
0x00, //..
0xc0, //%%
0xc0, //%%
0xc0, //%%
0xc0, //%%
0xc0, //%%
0xc0, //%%
0xc0, //%%
0xc0, //%%
0xc0, //%%
0xc0, //%%
0xc0, //%%
0xc0, //%%
0x00, //..
0x00, //..
0x00, //..
0xc0, //%%
0xc0, //%%
0xc0, //%%
0x00, //..
0x00, //..
0x00, //..
0x00, //..
0x00, //..
0x00, //..
// ...
/*Unicode: U+00ff (ÿ) , Width: 13 */
0x00, 0x00, //.............
0x00, 0x00, //.............
0x00, 0x00, //.............
0x00, 0x00, //.............
0x0d, 0x80, //....%%.%%....
0x0d, 0x80, //....%%.%%....
0x00, 0x00, //.............
0x00, 0x00, //.............
0x00, 0x00, //.............
0xc0, 0x18, //%%.........%%
0x60, 0x30, //.%%.......%%.
0x60, 0x30, //.%%.......%%.
0x70, 0x70, //.%%%.....%%%.
0x30, 0x60, //..%%.....%%..
0x30, 0xe0, //..%%....%%%..
0x18, 0xc0, //...%%...%%...
0x18, 0xc0, //...%%...%%...
0x0d, 0x80, //....%%.%%....
0x0d, 0x80, //....%%.%%....
0x0f, 0x80, //....%%%%%....
0x07, 0x00, //.....%%%.....
0x07, 0x00, //.....%%%.....
0x06, 0x00, //.....%%......
0x06, 0x00, //.....%%......
0x0c, 0x00, //....%%.......
0x7c, 0x00, //.%%%%%.......
0x78, 0x00, //.%%%%........
0x00, 0x00, //.............
};
static const width_s Width_DejaVuSans28[] PLACE_IN_FRAM =
{
{ .pixel = 8, .index = 0 }, /*Unicode: U+0020 ( )*/
{ .pixel = 2, .index = 28 }, /*Unicode: U+0021 (!)*/
// ...
{ .pixel = 13, .index = 11592 }, /*Unicode: U+00ff (ÿ)*/
};
const font_s Font_DejaVuSans28 =
{
.kind = 0x20, // kind of font: Sans Serif
.height = 28, // reference size, from source font
.maxWidth = 23,
.first = 32, // number of first character, usually 32
.number = 224, // number of characters, usually 96 or 224
.width = Width_DejaVuSans28, // characters widths and relative addresses
.table = Table_DejaVuSans28 // characters definitions
};
#endif // FONT_MODE