1
0
mirror of https://github.com/trezor/trezor-firmware.git synced 2024-11-18 05:28:40 +00:00

refactor(tools): add gen_upper arg to gen_font

The new option allows generation of font glyph definition where both
lowercase and uppercase letters are mapped to uppercase glyphs.

[no changelog]
This commit is contained in:
obrusvit 2024-04-09 13:17:05 +02:00 committed by Vít Obrusník
parent 86e543c8d3
commit c448a7bcfc
32 changed files with 651 additions and 171 deletions

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
// clang-format off
@ -6,6 +8,8 @@
// - the third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph
// - the rest is packed 1-bit glyph data
// NOTE: hand-changed the width and advance of '_' to 5
/* */ static const uint8_t Font_PixelOperator_Bold_8_glyph_32[] = { 0, 0, 4, 0, 0 };
/* ! */ static const uint8_t Font_PixelOperator_Bold_8_glyph_33[] = { 2, 7, 5, 1, 7, 255, 204 };
/* " */ static const uint8_t Font_PixelOperator_Bold_8_glyph_34[] = { 5, 3, 6, 0, 7, 222, 246 };
@ -69,7 +73,7 @@
/* \ */ static const uint8_t Font_PixelOperator_Bold_8_glyph_92[] = { 4, 7, 5, 0, 7, 204, 102, 99, 48 };
/* ] */ static const uint8_t Font_PixelOperator_Bold_8_glyph_93[] = { 4, 7, 6, 0, 7, 243, 51, 51, 240 };
/* ^ */ static const uint8_t Font_PixelOperator_Bold_8_glyph_94[] = { 6, 4, 7, 0, 7, 49, 236, 225, 0 };
/* _ */ static const uint8_t Font_PixelOperator_Bold_8_glyph_95[] = { 5, 1, 5, 0, 0, 248 };
/* _ */ static const uint8_t Font_PixelOperator_Bold_8_glyph_95[] = { 5, 1, 5, 0, 0, 248 }; // width (1st), advance (3rd) changed to 5, last byte to 248
/* ` */ static const uint8_t Font_PixelOperator_Bold_8_glyph_96[] = { 3, 2, 5, 0, 7, 204 };
/* a */ static const uint8_t Font_PixelOperator_Bold_8_glyph_97[] = { 6, 5, 7, 0, 5, 120, 55, 243, 124 };
/* b */ static const uint8_t Font_PixelOperator_Bold_8_glyph_98[] = { 6, 7, 7, 0, 7, 195, 15, 179, 207, 63, 128 };
@ -104,6 +108,8 @@
/* ? */ const uint8_t Font_PixelOperator_Bold_8_glyph_nonprintable[] = { 6, 7, 7, 0, 7, 132, 207, 57, 207, 252, 255 };
/* ? */ const uint8_t Font_PixelOperator_Bold_8_upper_glyph_nonprintable[] = { 6, 7, 7, 0, 7, 132, 207, 57, 207, 252, 255 };
const uint8_t * const Font_PixelOperator_Bold_8[126 + 1 - 32] = {
Font_PixelOperator_Bold_8_glyph_32,
Font_PixelOperator_Bold_8_glyph_33,
@ -201,3 +207,101 @@ const uint8_t * const Font_PixelOperator_Bold_8[126 + 1 - 32] = {
Font_PixelOperator_Bold_8_glyph_125,
Font_PixelOperator_Bold_8_glyph_126,
};
const uint8_t * const Font_PixelOperator_Bold_8_upper[126 + 1 - 32] = {
Font_PixelOperator_Bold_8_glyph_32,
Font_PixelOperator_Bold_8_glyph_33,
Font_PixelOperator_Bold_8_glyph_34,
Font_PixelOperator_Bold_8_glyph_35,
Font_PixelOperator_Bold_8_glyph_36,
Font_PixelOperator_Bold_8_glyph_37,
Font_PixelOperator_Bold_8_glyph_38,
Font_PixelOperator_Bold_8_glyph_39,
Font_PixelOperator_Bold_8_glyph_40,
Font_PixelOperator_Bold_8_glyph_41,
Font_PixelOperator_Bold_8_glyph_42,
Font_PixelOperator_Bold_8_glyph_43,
Font_PixelOperator_Bold_8_glyph_44,
Font_PixelOperator_Bold_8_glyph_45,
Font_PixelOperator_Bold_8_glyph_46,
Font_PixelOperator_Bold_8_glyph_47,
Font_PixelOperator_Bold_8_glyph_48,
Font_PixelOperator_Bold_8_glyph_49,
Font_PixelOperator_Bold_8_glyph_50,
Font_PixelOperator_Bold_8_glyph_51,
Font_PixelOperator_Bold_8_glyph_52,
Font_PixelOperator_Bold_8_glyph_53,
Font_PixelOperator_Bold_8_glyph_54,
Font_PixelOperator_Bold_8_glyph_55,
Font_PixelOperator_Bold_8_glyph_56,
Font_PixelOperator_Bold_8_glyph_57,
Font_PixelOperator_Bold_8_glyph_58,
Font_PixelOperator_Bold_8_glyph_59,
Font_PixelOperator_Bold_8_glyph_60,
Font_PixelOperator_Bold_8_glyph_61,
Font_PixelOperator_Bold_8_glyph_62,
Font_PixelOperator_Bold_8_glyph_63,
Font_PixelOperator_Bold_8_glyph_64,
Font_PixelOperator_Bold_8_glyph_65,
Font_PixelOperator_Bold_8_glyph_66,
Font_PixelOperator_Bold_8_glyph_67,
Font_PixelOperator_Bold_8_glyph_68,
Font_PixelOperator_Bold_8_glyph_69,
Font_PixelOperator_Bold_8_glyph_70,
Font_PixelOperator_Bold_8_glyph_71,
Font_PixelOperator_Bold_8_glyph_72,
Font_PixelOperator_Bold_8_glyph_73,
Font_PixelOperator_Bold_8_glyph_74,
Font_PixelOperator_Bold_8_glyph_75,
Font_PixelOperator_Bold_8_glyph_76,
Font_PixelOperator_Bold_8_glyph_77,
Font_PixelOperator_Bold_8_glyph_78,
Font_PixelOperator_Bold_8_glyph_79,
Font_PixelOperator_Bold_8_glyph_80,
Font_PixelOperator_Bold_8_glyph_81,
Font_PixelOperator_Bold_8_glyph_82,
Font_PixelOperator_Bold_8_glyph_83,
Font_PixelOperator_Bold_8_glyph_84,
Font_PixelOperator_Bold_8_glyph_85,
Font_PixelOperator_Bold_8_glyph_86,
Font_PixelOperator_Bold_8_glyph_87,
Font_PixelOperator_Bold_8_glyph_88,
Font_PixelOperator_Bold_8_glyph_89,
Font_PixelOperator_Bold_8_glyph_90,
Font_PixelOperator_Bold_8_glyph_91,
Font_PixelOperator_Bold_8_glyph_92,
Font_PixelOperator_Bold_8_glyph_93,
Font_PixelOperator_Bold_8_glyph_94,
Font_PixelOperator_Bold_8_glyph_95,
Font_PixelOperator_Bold_8_glyph_96,
Font_PixelOperator_Bold_8_glyph_65, // a -> A
Font_PixelOperator_Bold_8_glyph_66, // b -> B
Font_PixelOperator_Bold_8_glyph_67, // c -> C
Font_PixelOperator_Bold_8_glyph_68, // d -> D
Font_PixelOperator_Bold_8_glyph_69, // e -> E
Font_PixelOperator_Bold_8_glyph_70, // f -> F
Font_PixelOperator_Bold_8_glyph_71, // g -> G
Font_PixelOperator_Bold_8_glyph_72, // h -> H
Font_PixelOperator_Bold_8_glyph_73, // i -> I
Font_PixelOperator_Bold_8_glyph_74, // j -> J
Font_PixelOperator_Bold_8_glyph_75, // k -> K
Font_PixelOperator_Bold_8_glyph_76, // l -> L
Font_PixelOperator_Bold_8_glyph_77, // m -> M
Font_PixelOperator_Bold_8_glyph_78, // n -> N
Font_PixelOperator_Bold_8_glyph_79, // o -> O
Font_PixelOperator_Bold_8_glyph_80, // p -> P
Font_PixelOperator_Bold_8_glyph_81, // q -> Q
Font_PixelOperator_Bold_8_glyph_82, // r -> R
Font_PixelOperator_Bold_8_glyph_83, // s -> S
Font_PixelOperator_Bold_8_glyph_84, // t -> T
Font_PixelOperator_Bold_8_glyph_85, // u -> U
Font_PixelOperator_Bold_8_glyph_86, // v -> V
Font_PixelOperator_Bold_8_glyph_87, // w -> W
Font_PixelOperator_Bold_8_glyph_88, // x -> X
Font_PixelOperator_Bold_8_glyph_89, // y -> Y
Font_PixelOperator_Bold_8_glyph_90, // z -> Z
Font_PixelOperator_Bold_8_glyph_123,
Font_PixelOperator_Bold_8_glyph_124,
Font_PixelOperator_Bold_8_glyph_125,
Font_PixelOperator_Bold_8_glyph_126,
};

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
#if TREZOR_FONT_BPP != 1
@ -8,3 +10,8 @@
#define Font_PixelOperator_Bold_8_BASELINE 1
extern const uint8_t* const Font_PixelOperator_Bold_8[126 + 1 - 32];
extern const uint8_t Font_PixelOperator_Bold_8_glyph_nonprintable[];
#define Font_PixelOperator_Bold_8_upper_HEIGHT 8
#define Font_PixelOperator_Bold_8_upper_MAX_HEIGHT 8
#define Font_PixelOperator_Bold_8_upper_BASELINE 1
extern const uint8_t* const Font_PixelOperator_Bold_8_upper[126 + 1 - 32];
extern const uint8_t Font_PixelOperator_Bold_8_upper_glyph_nonprintable[];

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
// clang-format off
@ -6,6 +8,8 @@
// - the third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph
// - the rest is packed 1-bit glyph data
// NOTE: hand-changed the width and advance of '_' to 5
/* */ static const uint8_t Font_PixelOperator_Regular_8_glyph_32[] = { 0, 0, 4, 0, 0 };
/* ! */ static const uint8_t Font_PixelOperator_Regular_8_glyph_33[] = { 1, 7, 4, 1, 7, 250 };
/* " */ static const uint8_t Font_PixelOperator_Regular_8_glyph_34[] = { 3, 3, 6, 1, 7, 182, 128 };
@ -69,7 +73,7 @@
/* \ */ static const uint8_t Font_PixelOperator_Regular_8_glyph_92[] = { 3, 7, 4, 0, 7, 145, 36, 72 };
/* ] */ static const uint8_t Font_PixelOperator_Regular_8_glyph_93[] = { 3, 7, 6, 0, 7, 228, 146, 120 };
/* ^ */ static const uint8_t Font_PixelOperator_Regular_8_glyph_94[] = { 5, 3, 6, 0, 7, 34, 162 };
/* _ */ static const uint8_t Font_PixelOperator_Regular_8_glyph_95[] = { 5, 1, 5, 0, 0, 248 };
/* _ */ static const uint8_t Font_PixelOperator_Regular_8_glyph_95[] = { 5, 1, 5, 0, 0, 248 }; // width (1st), advance (3rd) changed to 5, last byte to 248
/* ` */ static const uint8_t Font_PixelOperator_Regular_8_glyph_96[] = { 2, 2, 4, 0, 7, 144 };
/* a */ static const uint8_t Font_PixelOperator_Regular_8_glyph_97[] = { 5, 5, 6, 0, 5, 112, 95, 23, 128 };
/* b */ static const uint8_t Font_PixelOperator_Regular_8_glyph_98[] = { 5, 7, 6, 0, 7, 132, 61, 24, 199, 192 };
@ -104,6 +108,8 @@
/* ? */ const uint8_t Font_PixelOperator_Regular_8_glyph_nonprintable[] = { 5, 7, 6, 0, 7, 139, 189, 221, 255, 127 };
/* ? */ const uint8_t Font_PixelOperator_Regular_8_upper_glyph_nonprintable[] = { 5, 7, 6, 0, 7, 139, 189, 221, 255, 127 };
const uint8_t * const Font_PixelOperator_Regular_8[126 + 1 - 32] = {
Font_PixelOperator_Regular_8_glyph_32,
Font_PixelOperator_Regular_8_glyph_33,
@ -201,3 +207,101 @@ const uint8_t * const Font_PixelOperator_Regular_8[126 + 1 - 32] = {
Font_PixelOperator_Regular_8_glyph_125,
Font_PixelOperator_Regular_8_glyph_126,
};
const uint8_t * const Font_PixelOperator_Regular_8_upper[126 + 1 - 32] = {
Font_PixelOperator_Regular_8_glyph_32,
Font_PixelOperator_Regular_8_glyph_33,
Font_PixelOperator_Regular_8_glyph_34,
Font_PixelOperator_Regular_8_glyph_35,
Font_PixelOperator_Regular_8_glyph_36,
Font_PixelOperator_Regular_8_glyph_37,
Font_PixelOperator_Regular_8_glyph_38,
Font_PixelOperator_Regular_8_glyph_39,
Font_PixelOperator_Regular_8_glyph_40,
Font_PixelOperator_Regular_8_glyph_41,
Font_PixelOperator_Regular_8_glyph_42,
Font_PixelOperator_Regular_8_glyph_43,
Font_PixelOperator_Regular_8_glyph_44,
Font_PixelOperator_Regular_8_glyph_45,
Font_PixelOperator_Regular_8_glyph_46,
Font_PixelOperator_Regular_8_glyph_47,
Font_PixelOperator_Regular_8_glyph_48,
Font_PixelOperator_Regular_8_glyph_49,
Font_PixelOperator_Regular_8_glyph_50,
Font_PixelOperator_Regular_8_glyph_51,
Font_PixelOperator_Regular_8_glyph_52,
Font_PixelOperator_Regular_8_glyph_53,
Font_PixelOperator_Regular_8_glyph_54,
Font_PixelOperator_Regular_8_glyph_55,
Font_PixelOperator_Regular_8_glyph_56,
Font_PixelOperator_Regular_8_glyph_57,
Font_PixelOperator_Regular_8_glyph_58,
Font_PixelOperator_Regular_8_glyph_59,
Font_PixelOperator_Regular_8_glyph_60,
Font_PixelOperator_Regular_8_glyph_61,
Font_PixelOperator_Regular_8_glyph_62,
Font_PixelOperator_Regular_8_glyph_63,
Font_PixelOperator_Regular_8_glyph_64,
Font_PixelOperator_Regular_8_glyph_65,
Font_PixelOperator_Regular_8_glyph_66,
Font_PixelOperator_Regular_8_glyph_67,
Font_PixelOperator_Regular_8_glyph_68,
Font_PixelOperator_Regular_8_glyph_69,
Font_PixelOperator_Regular_8_glyph_70,
Font_PixelOperator_Regular_8_glyph_71,
Font_PixelOperator_Regular_8_glyph_72,
Font_PixelOperator_Regular_8_glyph_73,
Font_PixelOperator_Regular_8_glyph_74,
Font_PixelOperator_Regular_8_glyph_75,
Font_PixelOperator_Regular_8_glyph_76,
Font_PixelOperator_Regular_8_glyph_77,
Font_PixelOperator_Regular_8_glyph_78,
Font_PixelOperator_Regular_8_glyph_79,
Font_PixelOperator_Regular_8_glyph_80,
Font_PixelOperator_Regular_8_glyph_81,
Font_PixelOperator_Regular_8_glyph_82,
Font_PixelOperator_Regular_8_glyph_83,
Font_PixelOperator_Regular_8_glyph_84,
Font_PixelOperator_Regular_8_glyph_85,
Font_PixelOperator_Regular_8_glyph_86,
Font_PixelOperator_Regular_8_glyph_87,
Font_PixelOperator_Regular_8_glyph_88,
Font_PixelOperator_Regular_8_glyph_89,
Font_PixelOperator_Regular_8_glyph_90,
Font_PixelOperator_Regular_8_glyph_91,
Font_PixelOperator_Regular_8_glyph_92,
Font_PixelOperator_Regular_8_glyph_93,
Font_PixelOperator_Regular_8_glyph_94,
Font_PixelOperator_Regular_8_glyph_95,
Font_PixelOperator_Regular_8_glyph_96,
Font_PixelOperator_Regular_8_glyph_65, // a -> A
Font_PixelOperator_Regular_8_glyph_66, // b -> B
Font_PixelOperator_Regular_8_glyph_67, // c -> C
Font_PixelOperator_Regular_8_glyph_68, // d -> D
Font_PixelOperator_Regular_8_glyph_69, // e -> E
Font_PixelOperator_Regular_8_glyph_70, // f -> F
Font_PixelOperator_Regular_8_glyph_71, // g -> G
Font_PixelOperator_Regular_8_glyph_72, // h -> H
Font_PixelOperator_Regular_8_glyph_73, // i -> I
Font_PixelOperator_Regular_8_glyph_74, // j -> J
Font_PixelOperator_Regular_8_glyph_75, // k -> K
Font_PixelOperator_Regular_8_glyph_76, // l -> L
Font_PixelOperator_Regular_8_glyph_77, // m -> M
Font_PixelOperator_Regular_8_glyph_78, // n -> N
Font_PixelOperator_Regular_8_glyph_79, // o -> O
Font_PixelOperator_Regular_8_glyph_80, // p -> P
Font_PixelOperator_Regular_8_glyph_81, // q -> Q
Font_PixelOperator_Regular_8_glyph_82, // r -> R
Font_PixelOperator_Regular_8_glyph_83, // s -> S
Font_PixelOperator_Regular_8_glyph_84, // t -> T
Font_PixelOperator_Regular_8_glyph_85, // u -> U
Font_PixelOperator_Regular_8_glyph_86, // v -> V
Font_PixelOperator_Regular_8_glyph_87, // w -> W
Font_PixelOperator_Regular_8_glyph_88, // x -> X
Font_PixelOperator_Regular_8_glyph_89, // y -> Y
Font_PixelOperator_Regular_8_glyph_90, // z -> Z
Font_PixelOperator_Regular_8_glyph_123,
Font_PixelOperator_Regular_8_glyph_124,
Font_PixelOperator_Regular_8_glyph_125,
Font_PixelOperator_Regular_8_glyph_126,
};

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
#if TREZOR_FONT_BPP != 1
@ -8,3 +10,8 @@
#define Font_PixelOperator_Regular_8_BASELINE 1
extern const uint8_t* const Font_PixelOperator_Regular_8[126 + 1 - 32];
extern const uint8_t Font_PixelOperator_Regular_8_glyph_nonprintable[];
#define Font_PixelOperator_Regular_8_upper_HEIGHT 8
#define Font_PixelOperator_Regular_8_upper_MAX_HEIGHT 8
#define Font_PixelOperator_Regular_8_upper_BASELINE 1
extern const uint8_t* const Font_PixelOperator_Regular_8_upper[126 + 1 - 32];
extern const uint8_t Font_PixelOperator_Regular_8_upper_glyph_nonprintable[];

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
#if TREZOR_FONT_BPP != 1

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
// clang-format off

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
#if TREZOR_FONT_BPP != 4

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
// clang-format off

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
#if TREZOR_FONT_BPP != 4

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
// clang-format off

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
#if TREZOR_FONT_BPP != 4

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
// clang-format off
@ -71,40 +73,14 @@
/* ^ */ static const uint8_t Font_TTHoves_Bold_17_glyph_94[] = { 8, 5, 8, 0, 12, 0, 251, 159, 0, 16, 255, 255, 0, 112, 207, 253, 5, 192, 111, 248, 10, 242, 31, 242, 31 };
/* _ */ static const uint8_t Font_TTHoves_Bold_17_glyph_95[] = { 9, 3, 8, 0, 0, 82, 85, 85, 85, 0, 245, 255, 255, 255, 1, 245, 255, 255, 255, 1 };
/* ` */ static const uint8_t Font_TTHoves_Bold_17_glyph_96[] = { 5, 3, 5, 0, 13, 114, 23, 0, 176, 175, 0, 0, 253, 5 };
/* a */ static const uint8_t Font_TTHoves_Bold_17_glyph_97[] = { 9, 9, 10, 0, 9, 0, 214, 239, 42, 0, 128, 255, 255, 239, 1, 192, 172, 114, 255, 7, 0, 0, 0, 255, 9, 48, 235, 255, 255, 10, 241, 239, 187, 255, 10, 245, 95, 80, 255, 10, 242, 255, 255, 255, 10, 48, 252, 158, 250, 10 };
/* b */ static const uint8_t Font_TTHoves_Bold_17_glyph_98[] = { 10, 12, 11, 1, 12, 254, 10, 0, 0, 0, 254, 10, 0, 0, 0, 254, 10, 0, 0, 0, 254, 171, 238, 26, 0, 254, 255, 255, 239, 1, 254, 207, 167, 255, 10, 254, 14, 0, 251, 14, 254, 10, 0, 247, 15, 254, 13, 0, 251, 14, 254, 207, 166, 255, 10, 254, 255, 255, 239, 1, 254, 168, 238, 26, 0 };
/* c */ static const uint8_t Font_TTHoves_Bold_17_glyph_99[] = { 10, 9, 10, 0, 9, 0, 178, 254, 76, 0, 64, 255, 255, 255, 6, 224, 255, 120, 254, 31, 243, 111, 0, 147, 57, 245, 47, 0, 0, 0, 243, 111, 0, 131, 56, 224, 255, 120, 254, 31, 64, 255, 255, 255, 6, 0, 179, 254, 76, 0 };
/* d */ static const uint8_t Font_TTHoves_Bold_17_glyph_100[] = { 10, 12, 11, 0, 12, 0, 0, 0, 240, 159, 0, 0, 0, 240, 159, 0, 0, 0, 240, 159, 0, 179, 238, 247, 159, 80, 255, 255, 255, 159, 224, 255, 120, 254, 159, 243, 111, 0, 243, 159, 245, 47, 0, 240, 159, 243, 111, 0, 243, 159, 224, 255, 120, 254, 159, 80, 255, 255, 255, 159, 0, 179, 239, 183, 159 };
/* e */ static const uint8_t Font_TTHoves_Bold_17_glyph_101[] = { 10, 9, 10, 0, 9, 0, 179, 238, 75, 0, 64, 255, 255, 255, 6, 224, 207, 18, 250, 47, 243, 175, 136, 249, 111, 245, 255, 255, 255, 127, 243, 95, 0, 0, 0, 224, 223, 34, 201, 28, 64, 255, 255, 255, 6, 0, 178, 238, 75, 0 };
/* f */ static const uint8_t Font_TTHoves_Bold_17_glyph_102[] = { 7, 13, 7, 0, 13, 0, 212, 255, 4, 0, 255, 255, 4, 32, 255, 25, 0, 32, 255, 6, 0, 247, 255, 255, 4, 247, 255, 255, 4, 115, 255, 106, 1, 32, 255, 6, 0, 32, 255, 6, 0, 32, 255, 6, 0, 32, 255, 6, 0, 32, 255, 6, 0, 32, 255, 6, 0 };
/* g */ static const uint8_t Font_TTHoves_Bold_17_glyph_103[] = { 10, 13, 10, 0, 9, 0, 197, 223, 245, 63, 96, 255, 255, 255, 63, 241, 255, 152, 255, 63, 243, 111, 0, 248, 63, 245, 47, 0, 245, 63, 244, 111, 0, 248, 63, 241, 255, 135, 255, 63, 112, 255, 255, 255, 63, 0, 197, 223, 249, 63, 32, 2, 0, 246, 63, 241, 223, 84, 253, 15, 112, 255, 255, 255, 8, 0, 197, 239, 92, 0 };
/* h */ static const uint8_t Font_TTHoves_Bold_17_glyph_104[] = { 9, 12, 10, 1, 12, 254, 10, 0, 0, 0, 254, 10, 0, 0, 0, 254, 10, 0, 0, 0, 254, 171, 239, 25, 0, 254, 255, 255, 207, 0, 254, 207, 249, 255, 3, 254, 14, 80, 255, 6, 254, 10, 32, 255, 6, 254, 10, 16, 255, 6, 254, 10, 16, 255, 6, 254, 10, 16, 255, 6, 254, 10, 16, 255, 6 };
/* i */ static const uint8_t Font_TTHoves_Bold_17_glyph_105[] = { 3, 13, 5, 1, 13, 51, 1, 255, 8, 255, 8, 0, 0, 255, 8, 255, 8, 255, 8, 255, 8, 255, 8, 255, 8, 255, 8, 255, 8, 255, 8 };
/* j */ static const uint8_t Font_TTHoves_Bold_17_glyph_106[] = { 5, 17, 6, 0, 13, 0, 51, 1, 0, 255, 8, 0, 255, 8, 0, 0, 0, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0, 255, 8, 117, 255, 8, 253, 255, 6, 253, 175, 0 };
/* k */ static const uint8_t Font_TTHoves_Bold_17_glyph_107[] = { 9, 12, 9, 1, 12, 254, 10, 0, 0, 0, 254, 10, 0, 0, 0, 254, 10, 0, 0, 0, 254, 10, 176, 255, 2, 254, 10, 247, 111, 0, 254, 58, 255, 10, 0, 254, 235, 223, 0, 0, 254, 255, 111, 0, 0, 254, 202, 239, 1, 0, 254, 42, 255, 12, 0, 254, 10, 245, 143, 0, 254, 10, 144, 255, 4 };
/* l */ static const uint8_t Font_TTHoves_Bold_17_glyph_108[] = { 3, 12, 5, 1, 12, 254, 10, 254, 10, 254, 10, 254, 10, 254, 10, 254, 10, 254, 10, 254, 10, 254, 10, 254, 10, 254, 10, 254, 10 };
/* m */ static const uint8_t Font_TTHoves_Bold_17_glyph_109[] = { 13, 9, 15, 1, 9, 255, 167, 206, 67, 252, 60, 0, 255, 255, 255, 255, 255, 255, 2, 255, 159, 252, 255, 186, 255, 9, 255, 11, 240, 207, 0, 254, 11, 255, 8, 224, 175, 0, 252, 12, 255, 8, 224, 175, 0, 252, 12, 255, 8, 224, 175, 0, 252, 12, 255, 8, 224, 175, 0, 252, 12, 255, 8, 224, 175, 0, 252, 12 };
/* n */ static const uint8_t Font_TTHoves_Bold_17_glyph_110[] = { 9, 9, 10, 1, 9, 255, 183, 239, 8, 0, 255, 255, 255, 175, 0, 255, 191, 249, 255, 2, 255, 12, 112, 255, 4, 255, 9, 48, 255, 5, 255, 8, 48, 255, 5, 255, 8, 48, 255, 5, 255, 8, 48, 255, 5, 255, 8, 48, 255, 5 };
/* o */ static const uint8_t Font_TTHoves_Bold_17_glyph_111[] = { 10, 9, 10, 0, 9, 0, 178, 238, 75, 0, 64, 255, 255, 255, 7, 224, 255, 120, 254, 47, 243, 111, 0, 243, 111, 245, 47, 0, 240, 143, 243, 111, 0, 243, 111, 224, 255, 120, 254, 47, 64, 255, 255, 255, 7, 0, 179, 238, 75, 0 };
/* p */ static const uint8_t Font_TTHoves_Bold_17_glyph_112[] = { 10, 13, 11, 1, 9, 255, 182, 223, 9, 0, 255, 255, 255, 223, 0, 255, 191, 183, 255, 8, 255, 12, 0, 252, 13, 255, 9, 0, 249, 15, 255, 13, 0, 252, 13, 255, 191, 182, 255, 8, 255, 255, 255, 223, 0, 255, 187, 223, 25, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0, 255, 8, 0, 0, 0 };
/* q */ static const uint8_t Font_TTHoves_Bold_17_glyph_113[] = { 10, 13, 11, 0, 9, 0, 179, 238, 184, 159, 80, 255, 255, 255, 159, 224, 255, 120, 254, 159, 243, 111, 0, 243, 159, 245, 47, 0, 240, 159, 243, 111, 0, 243, 159, 224, 255, 120, 254, 159, 80, 255, 255, 255, 159, 0, 179, 239, 248, 159, 0, 0, 0, 240, 159, 0, 0, 0, 240, 159, 0, 0, 0, 240, 159, 0, 0, 0, 240, 159 };
/* r */ static const uint8_t Font_TTHoves_Bold_17_glyph_114[] = { 6, 9, 7, 1, 9, 255, 218, 159, 255, 255, 159, 255, 159, 54, 255, 11, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0, 255, 8, 0 };
/* s */ static const uint8_t Font_TTHoves_Bold_17_glyph_115[] = { 9, 9, 9, 0, 9, 48, 234, 223, 6, 0, 242, 255, 255, 143, 0, 246, 63, 128, 187, 0, 245, 207, 88, 1, 0, 144, 255, 255, 111, 0, 0, 65, 214, 255, 0, 214, 29, 112, 255, 1, 225, 255, 254, 191, 0, 32, 235, 223, 8, 0 };
/* t */ static const uint8_t Font_TTHoves_Bold_17_glyph_116[] = { 7, 12, 7, 0, 12, 32, 255, 6, 0, 32, 255, 6, 0, 32, 255, 6, 0, 247, 255, 255, 5, 247, 255, 255, 5, 115, 255, 106, 2, 32, 255, 6, 0, 32, 255, 6, 0, 32, 255, 6, 0, 32, 255, 91, 2, 0, 255, 255, 5, 0, 213, 255, 5 };
/* u */ static const uint8_t Font_TTHoves_Bold_17_glyph_117[] = { 9, 9, 10, 1, 9, 255, 8, 48, 255, 5, 255, 8, 48, 255, 5, 255, 8, 48, 255, 5, 255, 8, 48, 255, 5, 255, 9, 48, 255, 5, 255, 12, 96, 255, 5, 252, 191, 249, 255, 5, 245, 255, 255, 255, 5, 80, 253, 109, 255, 5 };
/* v */ static const uint8_t Font_TTHoves_Bold_17_glyph_118[] = { 10, 9, 9, 0, 9, 252, 13, 0, 248, 31, 247, 47, 0, 253, 12, 241, 127, 32, 255, 7, 192, 207, 96, 255, 2, 112, 255, 177, 207, 0, 32, 255, 247, 127, 0, 0, 253, 255, 47, 0, 0, 248, 255, 13, 0, 0, 243, 255, 8, 0 };
/* w */ static const uint8_t Font_TTHoves_Bold_17_glyph_119[] = { 14, 9, 14, 0, 9, 251, 14, 128, 255, 4, 242, 127, 247, 47, 192, 255, 8, 246, 63, 243, 95, 240, 255, 12, 250, 15, 240, 159, 244, 255, 15, 253, 11, 176, 223, 248, 217, 95, 255, 7, 112, 255, 255, 149, 255, 255, 3, 48, 255, 255, 81, 255, 255, 0, 0, 255, 223, 16, 255, 191, 0, 0, 251, 175, 0, 254, 127, 0 };
/* x */ static const uint8_t Font_TTHoves_Bold_17_glyph_120[] = { 11, 9, 10, 0, 9, 160, 255, 2, 242, 175, 0, 16, 255, 9, 249, 31, 0, 0, 247, 63, 255, 7, 0, 0, 224, 255, 239, 0, 0, 0, 96, 255, 111, 0, 0, 0, 176, 255, 191, 0, 0, 0, 246, 143, 255, 6, 0, 32, 255, 10, 250, 47, 0, 176, 239, 1, 225, 191, 0 };
/* y */ static const uint8_t Font_TTHoves_Bold_17_glyph_121[] = { 11, 13, 10, 0, 9, 224, 207, 0, 112, 255, 4, 144, 255, 2, 176, 239, 0, 48, 255, 7, 240, 159, 0, 0, 253, 13, 244, 79, 0, 0, 248, 47, 249, 14, 0, 0, 242, 143, 253, 10, 0, 0, 208, 255, 255, 4, 0, 0, 112, 255, 255, 0, 0, 0, 32, 255, 175, 0, 0, 0, 0, 252, 95, 0, 0, 0, 101, 253, 15, 0, 0, 0, 255, 255, 9, 0, 0, 0, 255, 174, 1, 0, 0 };
/* z */ static const uint8_t Font_TTHoves_Bold_17_glyph_122[] = { 8, 9, 9, 0, 9, 245, 255, 255, 239, 245, 255, 255, 239, 98, 102, 254, 175, 0, 144, 255, 12, 0, 247, 223, 1, 80, 255, 46, 0, 243, 255, 89, 85, 246, 255, 255, 255, 246, 255, 255, 255 };
/* { */ static const uint8_t Font_TTHoves_Bold_17_glyph_123[] = { 7, 17, 7, 0, 13, 0, 16, 67, 0, 0, 245, 255, 1, 0, 254, 255, 1, 16, 255, 10, 0, 32, 255, 6, 0, 32, 255, 6, 0, 48, 255, 6, 0, 211, 255, 3, 0, 245, 110, 0, 0, 245, 175, 0, 0, 177, 255, 4, 0, 32, 255, 6, 0, 32, 255, 6, 0, 32, 255, 6, 0, 16, 255, 76, 0, 0, 253, 255, 1, 0, 178, 255, 1 };
/* | */ static const uint8_t Font_TTHoves_Bold_17_glyph_124[] = { 3, 16, 7, 2, 12, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9, 255, 9 };
/* } */ static const uint8_t Font_TTHoves_Bold_17_glyph_125[] = { 7, 17, 7, 0, 13, 65, 3, 0, 0, 246, 223, 1, 0, 246, 255, 10, 0, 16, 254, 13, 0, 0, 251, 13, 0, 0, 251, 13, 0, 0, 251, 14, 0, 0, 248, 207, 0, 0, 128, 255, 0, 0, 210, 255, 0, 0, 249, 127, 0, 0, 251, 14, 0, 0, 251, 13, 0, 0, 251, 13, 0, 81, 255, 12, 0, 246, 255, 8, 0, 246, 158, 0, 0 };
/* ~ */ static const uint8_t Font_TTHoves_Bold_17_glyph_126[] = { 10, 4, 10, 0, 7, 0, 98, 2, 0, 0, 128, 255, 159, 246, 143, 242, 255, 255, 255, 79, 245, 63, 180, 239, 7 };
/* ? */ const uint8_t Font_TTHoves_Bold_17_glyph_nonprintable[] = { 9, 12, 9, 0, 12, 255, 40, 32, 230, 255, 63, 0, 0, 16, 254, 10, 32, 39, 0, 248, 90, 213, 207, 0, 246, 255, 255, 95, 0, 249, 255, 223, 2, 96, 255, 255, 95, 0, 250, 255, 255, 47, 64, 255, 255, 255, 239, 238, 255, 255, 255, 63, 99, 255, 255, 255, 15, 48, 255, 255, 255, 15, 48, 255, 255 };
/* ? */ const uint8_t Font_TTHoves_Bold_17_upper_glyph_nonprintable[] = { 9, 12, 9, 0, 12, 255, 40, 32, 230, 255, 63, 0, 0, 16, 254, 10, 32, 39, 0, 248, 90, 213, 207, 0, 246, 255, 255, 95, 0, 249, 255, 223, 2, 96, 255, 255, 95, 0, 250, 255, 255, 47, 64, 255, 255, 255, 239, 238, 255, 255, 255, 63, 99, 255, 255, 255, 15, 48, 255, 255, 255, 15, 48, 255, 255 };
const uint8_t * const Font_TTHoves_Bold_17[126 + 1 - 32] = {
const uint8_t * const Font_TTHoves_Bold_17_upper[126 + 1 - 32] = {
Font_TTHoves_Bold_17_glyph_32,
Font_TTHoves_Bold_17_glyph_33,
Font_TTHoves_Bold_17_glyph_34,
@ -170,32 +146,32 @@ const uint8_t * const Font_TTHoves_Bold_17[126 + 1 - 32] = {
Font_TTHoves_Bold_17_glyph_94,
Font_TTHoves_Bold_17_glyph_95,
Font_TTHoves_Bold_17_glyph_96,
Font_TTHoves_Bold_17_glyph_97,
Font_TTHoves_Bold_17_glyph_98,
Font_TTHoves_Bold_17_glyph_99,
Font_TTHoves_Bold_17_glyph_100,
Font_TTHoves_Bold_17_glyph_101,
Font_TTHoves_Bold_17_glyph_102,
Font_TTHoves_Bold_17_glyph_103,
Font_TTHoves_Bold_17_glyph_104,
Font_TTHoves_Bold_17_glyph_105,
Font_TTHoves_Bold_17_glyph_106,
Font_TTHoves_Bold_17_glyph_107,
Font_TTHoves_Bold_17_glyph_108,
Font_TTHoves_Bold_17_glyph_109,
Font_TTHoves_Bold_17_glyph_110,
Font_TTHoves_Bold_17_glyph_111,
Font_TTHoves_Bold_17_glyph_112,
Font_TTHoves_Bold_17_glyph_113,
Font_TTHoves_Bold_17_glyph_114,
Font_TTHoves_Bold_17_glyph_115,
Font_TTHoves_Bold_17_glyph_116,
Font_TTHoves_Bold_17_glyph_117,
Font_TTHoves_Bold_17_glyph_118,
Font_TTHoves_Bold_17_glyph_119,
Font_TTHoves_Bold_17_glyph_120,
Font_TTHoves_Bold_17_glyph_121,
Font_TTHoves_Bold_17_glyph_122,
Font_TTHoves_Bold_17_glyph_65, // a -> A
Font_TTHoves_Bold_17_glyph_66, // b -> B
Font_TTHoves_Bold_17_glyph_67, // c -> C
Font_TTHoves_Bold_17_glyph_68, // d -> D
Font_TTHoves_Bold_17_glyph_69, // e -> E
Font_TTHoves_Bold_17_glyph_70, // f -> F
Font_TTHoves_Bold_17_glyph_71, // g -> G
Font_TTHoves_Bold_17_glyph_72, // h -> H
Font_TTHoves_Bold_17_glyph_73, // i -> I
Font_TTHoves_Bold_17_glyph_74, // j -> J
Font_TTHoves_Bold_17_glyph_75, // k -> K
Font_TTHoves_Bold_17_glyph_76, // l -> L
Font_TTHoves_Bold_17_glyph_77, // m -> M
Font_TTHoves_Bold_17_glyph_78, // n -> N
Font_TTHoves_Bold_17_glyph_79, // o -> O
Font_TTHoves_Bold_17_glyph_80, // p -> P
Font_TTHoves_Bold_17_glyph_81, // q -> Q
Font_TTHoves_Bold_17_glyph_82, // r -> R
Font_TTHoves_Bold_17_glyph_83, // s -> S
Font_TTHoves_Bold_17_glyph_84, // t -> T
Font_TTHoves_Bold_17_glyph_85, // u -> U
Font_TTHoves_Bold_17_glyph_86, // v -> V
Font_TTHoves_Bold_17_glyph_87, // w -> W
Font_TTHoves_Bold_17_glyph_88, // x -> X
Font_TTHoves_Bold_17_glyph_89, // y -> Y
Font_TTHoves_Bold_17_glyph_90, // z -> Z
Font_TTHoves_Bold_17_glyph_123,
Font_TTHoves_Bold_17_glyph_124,
Font_TTHoves_Bold_17_glyph_125,

View File

@ -1,10 +1,12 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
#if TREZOR_FONT_BPP != 4
#error Wrong TREZOR_FONT_BPP (expected 4)
#endif
#define Font_TTHoves_Bold_17_HEIGHT 17
#define Font_TTHoves_Bold_17_MAX_HEIGHT 18
#define Font_TTHoves_Bold_17_BASELINE 4
extern const uint8_t* const Font_TTHoves_Bold_17[126 + 1 - 32];
extern const uint8_t Font_TTHoves_Bold_17_glyph_nonprintable[];
#define Font_TTHoves_Bold_17_upper_HEIGHT 17
#define Font_TTHoves_Bold_17_upper_MAX_HEIGHT 18
#define Font_TTHoves_Bold_17_upper_BASELINE 4
extern const uint8_t* const Font_TTHoves_Bold_17_upper[126 + 1 - 32];
extern const uint8_t Font_TTHoves_Bold_17_upper_glyph_nonprintable[];

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
// clang-format off

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
#if TREZOR_FONT_BPP != 4

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
// clang-format off

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
#if TREZOR_FONT_BPP != 4

View File

@ -1,3 +1,5 @@
// This file is generated by core/tools/codegen/gen_font.py
#include <stdint.h>
// clang-format off

View File

@ -27,11 +27,12 @@ def add_font(
font_name: str, font: str | None, defines: list[str], sources: list[str]
) -> None:
if font is not None:
font_filename = font.replace("_upper", "").lower()
defines += [
"TREZOR_FONT_" + font_name + "_ENABLE=" + font,
"TREZOR_FONT_" + font_name + '_INCLUDE=\\"' + font.lower() + '.h\\"',
"TREZOR_FONT_" + font_name + '_INCLUDE=\\"' + font_filename + '.h\\"',
]
sourcefile = "embed/lib/fonts/" + font.lower() + ".c"
sourcefile = "embed/lib/fonts/" + font_filename + ".c"
if sourcefile not in sources:
sources.append(sourcefile)

View File

@ -1,6 +1,6 @@
#!/usr/bin/env python3
# script used to generate /embed/extmod/modtrezorui/font_*_*.c
# script used to generate core/embed/lib/fonts/font_*_*.c
from __future__ import annotations
@ -167,12 +167,12 @@ class Glyph:
advance += -bearingX
bearingX = 0
else:
raise ValueError("Negative bearingX for character '%s'" % c)
raise ValueError(f"Negative bearingX for character '{c}'")
bearingY = metrics.horiBearingY // 64
assert advance >= 0 and advance <= 255
assert bearingX >= 0 and bearingX <= 255
if bearingY < 0: # HACK
print("normalizing bearingY %d for '%s'" % (bearingY, c))
print(f"normalizing bearingY {bearingY} for '{c}'")
bearingY = 0
assert bearingY >= 0 and bearingY <= 255
buf = list(bitmap.buffer)
@ -184,9 +184,7 @@ class Glyph:
width -= remove_left
assert advance > remove_left
advance -= remove_left
print(
'Glyph "%c": removed %d pixel columns from the left' % (c, remove_left)
)
print(f'Glyph "{c}": removed {remove_left} pixel columns from the left')
return Glyph(
char=c,
@ -202,17 +200,7 @@ class Glyph:
def print_metrics(self) -> None:
print(
'Loaded glyph "%c" ... %d x %d @ %d grays (%d bytes, metrics: %d, %d, %d)'
% (
self.char,
self.width,
self.rows,
self.num_grays,
len(self.buf),
self.advance,
self.bearingX,
self.bearingY,
)
f'Loaded glyph "{self.char}" ... {self.width} x {self.rows} @ {self.num_grays} grays ({len(self.buf)} bytes, metrics: {self.advance}, {self.bearingX}, {self.bearingY})'
)
def process_byte(self, b: int) -> int:
@ -222,7 +210,11 @@ class Glyph:
return b
def get_definition_line(
self, name_style_size: str, bpp: int, i: int | str, static: bool = True
self,
name_style_size: str,
bpp: int,
i: int | str,
static: bool = True,
) -> str:
numbers = ", ".join(str(n) for n in self.to_bytes(bpp))
comment = f"/* {self.char} */"
@ -260,17 +252,25 @@ class FaceProcessor:
bpp: int = 4,
shaveX: int = 0,
ext: str = "ttf",
gen_normal: bool = True, # generate font with all the letters
gen_upper: bool = False, # generate font with only upper-cased letters
):
print("Processing ... %s %s %s" % (name, style, size))
if gen_normal is False and gen_upper is False:
raise ValueError(
"At least one must be selected from normal glyphs or only uppercased glyphs."
)
print(f"Processing ... {name} {style} {size}")
self.name = name
self.style = style
self.size = size
self.bpp = bpp
self.shaveX = shaveX
self.ext = ext
self.gen_normal = gen_normal
self.gen_upper = gen_upper
self.face = freetype.Face(str(FONTS_DIR / f"{name}-{style}.{ext}"))
self.face.set_pixel_sizes(0, size) # type: ignore
self.fontname = "%s_%s_%d" % (name.lower(), style.lower(), size)
self.fontname = f"{name.lower()}_{style.lower()}_{size}"
self.font_ymin = 0
self.font_ymax = 0
@ -288,7 +288,10 @@ class FaceProcessor:
def write_files(self) -> None:
self.write_c_files()
self.write_foreign_json()
if self.gen_normal:
self.write_foreign_json(upper_cased=False)
if self.gen_upper:
self.write_foreign_json(upper_cased=True)
if WRITE_WIDTHS:
self.write_char_widths_files()
@ -296,17 +299,25 @@ class FaceProcessor:
self._write_c_file()
self._write_h_file()
def write_foreign_json(self) -> None:
def write_foreign_json(self, upper_cased=False) -> None:
for lang, language_chars in all_languages.items():
fontdata = {}
for item in language_chars:
c = _normalize(item)
map_from = c
if c.islower() and upper_cased and c != "ß":
# FIXME not sure how to properly handle the german "ß"
c = c.upper()
assert len(c) == 1
assert len(map_from) == 1
self._load_char(c)
glyph = Glyph.from_face(self.face, c, self.shaveX)
glyph.print_metrics()
fontdata[c] = glyph.to_bytes(self.bpp).hex()
file = JSON_FONTS_DEST / f"font_{self.fontname}_{lang}.json"
fontdata[map_from] = glyph.to_bytes(self.bpp).hex()
file = (
JSON_FONTS_DEST
/ f"font_{self.fontname}{'_upper' if upper_cased else ''}_{lang}.json"
)
json_content = json.dumps(fontdata, indent=2, ensure_ascii=False)
file.write_text(json_content + "\n")
@ -317,6 +328,8 @@ class FaceProcessor:
# "normal" ASCII characters
for i in range(MIN_GLYPH, MAX_GLYPH + 1):
c = chr(i)
if c.islower() and not self.gen_normal:
c = c.upper()
chars.add(c)
# foreign language data
for _lang, lang_chars in all_languages.items():
@ -341,23 +354,45 @@ class FaceProcessor:
def _write_c_file_content(self, f: TextIO) -> None:
# Write "normal" ASCII characters
for i in range(MIN_GLYPH, MAX_GLYPH + 1):
c = chr(i)
self._write_char_definition(f, c, i)
if chr(i).islower() and not self.gen_normal:
continue
self._write_char_definition(f, chr(i), i)
# Write non-printable character
f.write("\n")
nonprintable = self._get_nonprintable_definition_line()
f.write(nonprintable)
# Write nonprintable glyph
if self.gen_normal:
f.write("\n")
nonprintable = self._get_nonprintable_definition_line()
f.write(nonprintable)
if self.gen_upper:
f.write("\n")
nonprintable = self._get_nonprintable_definition_line(upper=True)
f.write(nonprintable)
# Write array of all glyphs
f.write("\n")
f.write(
"const uint8_t * const Font_%s[%d + 1 - %d] = {\n"
% (self._name_style_size, MAX_GLYPH, MIN_GLYPH)
)
for i in range(MIN_GLYPH, MAX_GLYPH + 1):
f.write(" Font_%s_glyph_%d,\n" % (self._name_style_size, i))
f.write("};\n")
if self.gen_normal:
f.write("\n")
f.write(
f"const uint8_t * const Font_{self._name_style_size}[{MAX_GLYPH} + 1 - {MIN_GLYPH}] = {{\n"
)
for i in range(MIN_GLYPH, MAX_GLYPH + 1):
f.write(f" Font_{self._name_style_size}_glyph_{i},\n")
f.write("};\n")
# Write array of all glyphs for _upper version
if self.gen_upper:
f.write("\n")
f.write(
f"const uint8_t * const Font_{self._name_style_size}_upper[{MAX_GLYPH} + 1 - {MIN_GLYPH}] = {{\n"
)
for i in range(MIN_GLYPH, MAX_GLYPH + 1):
comment = ""
if chr(i).islower():
c_from = chr(i)
c_to = c_from.upper()
i = ord(c_to)
comment = f" // {c_from} -> {c_to}"
f.write(f" Font_{self._name_style_size}_glyph_{i},{comment}\n")
f.write("};\n")
def _write_char_definition(self, f: TextIO, c: str, i: int) -> None:
self._load_char(c)
@ -373,49 +408,68 @@ class FaceProcessor:
self.font_ymax = max(self.font_ymax, yMax)
def _write_c_file_header(self, f: TextIO) -> None:
f.write("// This file is generated by core/tools/codegen/gen_font.py\n\n")
f.write("#include <stdint.h>\n\n")
f.write("// clang-format off\n\n")
f.write("// - the first two bytes are width and height of the glyph\n")
f.write(
"// - the third, fourth and fifth bytes are advance, bearingX and bearingY of the horizontal metrics of the glyph\n"
)
f.write("// - the rest is packed %d-bit glyph data\n\n" % self.bpp)
f.write(f"// - the rest is packed {self.bpp}-bit glyph data\n\n")
def _get_nonprintable_definition_line(self) -> str:
def _get_nonprintable_definition_line(self, upper: bool = False) -> str:
c = "?"
self._load_char(c)
glyph = Glyph.from_face(self.face, c, self.shaveX, inverse_colors=True)
return glyph.get_definition_line(
self._name_style_size, self.bpp, "nonprintable", static=False
)
if upper:
return glyph.get_definition_line(
f"{self._name_style_size}_upper", self.bpp, "nonprintable", static=False
)
else:
return glyph.get_definition_line(
self._name_style_size, self.bpp, "nonprintable", static=False
)
def _load_char(self, c: str) -> None:
self.face.load_char(c, freetype.FT_LOAD_RENDER | freetype.FT_LOAD_TARGET_NORMAL) # type: ignore
def _write_h_file(self) -> None:
with open(OUT_DIR / self._h_file_name, "wt") as f:
f.write("// This file is generated by core/tools/codegen/gen_font.py\n\n")
f.write("#include <stdint.h>\n\n")
f.write("#if TREZOR_FONT_BPP != %d\n" % self.bpp)
f.write("#error Wrong TREZOR_FONT_BPP (expected %d)\n" % self.bpp)
f.write(f"#if TREZOR_FONT_BPP != {self.bpp}\n")
f.write(f"#error Wrong TREZOR_FONT_BPP (expected {self.bpp})\n")
f.write("#endif\n")
f.write("#define Font_%s_HEIGHT %d\n" % (self._name_style_size, self.size))
f.write(
"#define Font_%s_MAX_HEIGHT %d\n"
% (self._name_style_size, self.font_ymax - self.font_ymin)
)
f.write(
"#define Font_%s_BASELINE %d\n"
% (self._name_style_size, -self.font_ymin)
)
f.write(
"extern const uint8_t* const Font_%s[%d + 1 - %d];\n"
% (self._name_style_size, MAX_GLYPH, MIN_GLYPH)
)
f.write(
"extern const uint8_t Font_%s_glyph_nonprintable[];\n"
% (self._name_style_size)
)
if self.gen_normal:
f.write(f"#define Font_{self._name_style_size}_HEIGHT {self.size}\n")
f.write(
f"#define Font_{self._name_style_size}_MAX_HEIGHT {self.font_ymax - self.font_ymin}\n"
)
f.write(
f"#define Font_{self._name_style_size}_BASELINE {-self.font_ymin}\n"
)
f.write(
f"extern const uint8_t* const Font_{self._name_style_size}[{MAX_GLYPH} + 1 - {MIN_GLYPH}];\n"
)
f.write(
f"extern const uint8_t Font_{self._name_style_size}_glyph_nonprintable[];\n"
)
if self.gen_upper:
f.write(
f"#define Font_{self._name_style_size}_upper_HEIGHT {self.size}\n"
)
f.write(
f"#define Font_{self._name_style_size}_upper_MAX_HEIGHT {self.font_ymax - self.font_ymin}\n"
)
f.write(
f"#define Font_{self._name_style_size}_upper_BASELINE {-self.font_ymin}\n"
)
f.write(
f"extern const uint8_t* const Font_{self._name_style_size}_upper[{MAX_GLYPH} + 1 - {MIN_GLYPH}];\n"
)
f.write(
f"extern const uint8_t Font_{self._name_style_size}_upper_glyph_nonprintable[];\n"
)
if __name__ == "__main__":
@ -427,12 +481,29 @@ if __name__ == "__main__":
FaceProcessor("TTHoves", "Regular", 21, ext="otf").write_files()
FaceProcessor("TTHoves", "DemiBold", 21, ext="otf").write_files()
FaceProcessor("TTHoves", "Bold", 17, ext="otf").write_files()
FaceProcessor(
"TTHoves", "Bold", 17, ext="otf", gen_normal=False, gen_upper=True
).write_files()
FaceProcessor("RobotoMono", "Medium", 20).write_files()
FaceProcessor("PixelOperator", "Regular", 8, bpp=1, shaveX=1).write_files()
FaceProcessor("PixelOperator", "Bold", 8, bpp=1, shaveX=1).write_files()
FaceProcessor(
"PixelOperator",
"Regular",
8,
bpp=1,
shaveX=1,
gen_normal=True,
gen_upper=True,
).write_files()
FaceProcessor(
"PixelOperator",
"Bold",
8,
bpp=1,
shaveX=1,
gen_normal=True,
gen_upper=True,
).write_files()
FaceProcessor("PixelOperatorMono", "Regular", 8, bpp=1, shaveX=1).write_files()
# For model R

View File

@ -0,0 +1,32 @@
{
"Á": "060707000718c7b3cffcc0",
"Č": "0607070007cde7b3c33780",
"Ď": "0607070007cdefb3cf3f80",
"É": "060707000718cff0f30fc0",
"Ě": "0607070007cdeff0f30fc0",
"Í": "0307050107786db0",
"Ň": "0607070007cdecfbff7cc0",
"Ó": "060707000718c7b3cf3780",
"Ř": "0607070007cdefb3cfecc0",
"Š": "0607070007cde7b0783f80",
"Ť": "0607070007cdefcc30c300",
"Ú": "060707000718ccf3cf3780",
"Ů": "06070700077b3780cf3780",
"Ý": "060707000718ccf378c300",
"Ž": "0607070007cdefc6318fc0",
"á": "060707000718c7b3cffcc0",
"č": "0607070007cde7b3c33780",
"ď": "0607070007cdefb3cf3f80",
"é": "060707000718cff0f30fc0",
"ě": "0607070007cdeff0f30fc0",
"í": "0307050107786db0",
"ň": "0607070007cdecfbff7cc0",
"ó": "060707000718c7b3cf3780",
"ř": "0607070007cdefb3cfecc0",
"š": "0607070007cde7b0783f80",
"ť": "0607070007cdefcc30c300",
"ú": "060707000718ccf3cf3780",
"ů": "06070700077b3780cf3780",
"ý": "060707000718ccf378c300",
"ž": "0607070007cdefc6318fc0"
}

View File

@ -0,0 +1,9 @@
{
"Ä": "0607070007cc07b3cffcc0",
"Ö": "0607070007cc07b3cf3780",
"Ü": "0607070007cc0cf3cf3780",
"ß": "06070700077b3cf6cf3d80",
"ä": "0607070007cc07b3cffcc0",
"ö": "0607070007cc07b3cf3780",
"ü": "0607070007cc0cf3cf3780"
}

View File

@ -0,0 +1,17 @@
{
"Á": "060707000718c7b3cffcc0",
"É": "060707000718cff0f30fc0",
"Í": "0307050107786db0",
"Ñ": "070707000777bb376fdbb300",
"Ó": "060707000718c7b3cf3780",
"Ú": "060707000718ccf3cf3780",
"Ü": "0607070007cc0cf3cf3780",
"á": "060707000718c7b3cffcc0",
"é": "060707000718cff0f30fc0",
"í": "0307050107786db0",
"ñ": "070707000777bb376fdbb300",
"ó": "060707000718c7b3cf3780",
"ú": "060707000718ccf3cf3780",
"ü": "0607070007cc0cf3cf3780",
"¿": "0607070006300318c33780"
}

View File

@ -0,0 +1,34 @@
{
"À": "060707000760c7b3cffcc0",
"Â": "0707070007fd0de66cdfb300",
"Æ": "0a070b00077ff30cc33cfc330cfc",
"Ç": "06080700077b3c30cde19c00",
"È": "060707000760cff0f30fc0",
"É": "060707000718cff0f30fc0",
"Ê": "06070700077b3ff0f30fc0",
"Ë": "0607070007cc0ff0f30fc0",
"Î": "0507050007f4d8c63180",
"Ï": "05070500079818c63180",
"Ô": "0707070007fd0de66cd99e00",
"Ù": "060707000760ccf3cf3780",
"Û": "06070700077b3033cf3780",
"Ü": "0607070007cc0cf3cf3780",
"Ÿ": "0607070007cc0cf378c300",
"Œ": "0a070b00077ff30cc33ccc3307fc",
"à": "060707000760c7b3cffcc0",
"â": "0707070007fd0de66cdfb300",
"æ": "0a070b00077ff30cc33cfc330cfc",
"ç": "06080700077b3c30cde19c00",
"è": "060707000760cff0f30fc0",
"é": "060707000718cff0f30fc0",
"ê": "06070700077b3ff0f30fc0",
"ë": "0607070007cc0ff0f30fc0",
"î": "0507050007f4d8c63180",
"ï": "05070500079818c63180",
"ô": "0707070007fd0de66cd99e00",
"ù": "060707000760ccf3cf3780",
"û": "06070700077b3033cf3780",
"ü": "0607070007cc0cf3cf3780",
"ÿ": "0607070007cc0cf378c300",
"œ": "0a070b00077ff30cc33ccc3307fc"
}

View File

@ -0,0 +1,32 @@
{
"Á": "0507060007111d18fe20",
"Č": "0507060007511d1845c0",
"Ď": "0507060007513d18c7c0",
"É": "0507060007113f0e43e0",
"Ě": "0507060007513f0e43e0",
"Í": "020704010762a8",
"Ň": "050706000751239ace20",
"Ó": "0507060007111d18c5c0",
"Ř": "0507060007513d18fa20",
"Š": "0507060007511d0707c0",
"Ť": "0507060007513e421080",
"Ú": "0507060007112318c5c0",
"Ů": "0507060007228918c5c0",
"Ý": "05070600071123151080",
"Ž": "0507060007513e2223e0",
"á": "0507060007111d18fe20",
"č": "0507060007511d1845c0",
"ď": "0507060007513d18c7c0",
"é": "0507060007113f0e43e0",
"ě": "0507060007513f0e43e0",
"í": "020704010762a8",
"ň": "050706000751239ace20",
"ó": "0507060007111d18c5c0",
"ř": "0507060007513d18fa20",
"š": "0507060007511d0707c0",
"ť": "0507060007513e421080",
"ú": "0507060007112318c5c0",
"ů": "0507060007228918c5c0",
"ý": "05070600071123151080",
"ž": "0507060007513e2223e0"
}

View File

@ -0,0 +1,9 @@
{
"Ä": "0507060007501d18fe20",
"Ö": "0507060007501d18c5c0",
"Ü": "0507060007502318c5c0",
"ß": "0507060007746368c6c0",
"ä": "0507060007501d18fe20",
"ö": "0507060007501d18c5c0",
"ü": "0507060007502318c5c0"
}

View File

@ -0,0 +1,17 @@
{
"Á": "0507060007111d18fe20",
"É": "0507060007113f0e43e0",
"Í": "020704010762a8",
"Ñ": "06070600076668b2aa6880",
"Ó": "0507060007111d18c5c0",
"Ú": "0507060007112318c5c0",
"Ü": "0507060007502318c5c0",
"á": "0507060007111d18fe20",
"é": "0507060007113f0e43e0",
"í": "020704010762a8",
"ñ": "06070600076668b2aa6880",
"ó": "0507060007111d18c5c0",
"ú": "0507060007112318c5c0",
"ü": "0507060007502318c5c0",
"¿": "050706000620088845c0"
}

View File

@ -0,0 +1,34 @@
{
"À": "0507060007411d18fe20",
"Â": "0507060007229d18fe20",
"Æ": "09070a00077fc42211cf84423e",
"Ç": "0508060007746108b84c00",
"È": "0507060007413f0e43e0",
"É": "0507060007113f0e43e0",
"Ê": "050706000722bf0e43e0",
"Ë": "0507060007503f0e43e0",
"Î": "0307040007542490",
"Ï": "0307040007a12490",
"Ô": "0507060007229d18c5c0",
"Ù": "0507060007412318c5c0",
"Û": "0507060007228118c5c0",
"Ü": "0507060007502318c5c0",
"Ÿ": "05070600075023151080",
"Œ": "09070a00077fc42211c88441fe",
"à": "0507060007411d18fe20",
"â": "0507060007229d18fe20",
"æ": "09070a00077fc42211cf84423e",
"ç": "0508060007746108b84c00",
"è": "0507060007413f0e43e0",
"é": "0507060007113f0e43e0",
"ê": "050706000722bf0e43e0",
"ë": "0507060007503f0e43e0",
"î": "0307040007542490",
"ï": "0307040007a12490",
"ô": "0507060007229d18c5c0",
"ù": "0507060007412318c5c0",
"û": "0507060007228118c5c0",
"ü": "0507060007502318c5c0",
"ÿ": "05070600075023151080",
"œ": "09070a00077fc42211c88441fe"
}

View File

@ -14,19 +14,19 @@
"Ů": "0b110c01110000100000000050fe08000000b07a0e00000050ff080000000010000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"Ý": "0d100c001000000070270000000000f90c0000000040df01000000000000000000e1ff0100f2df0070ff0800fa5f0000fe1f20ff0c0000f68fa0ff040000e0fff3cf00000060ffff3f00000000fdff0b00000000f5ff0300000000e0df0000000000e0cf0000000000e0cf0000000000e0cf000000",
"Ž": "0a100b0010007503760100f2bf9f000040ff0c000000000000f3ffffffcff3ffffffcfa2aaaaffaf000090ff1e0000f5ff030020ff6f0000d1ff090000fbcf000080ff1e0000f3ff9c9989f5ffffffdff5ffffffdf",
"á": "090d0a000d00004067000000f24f000000fc0700000000000000d6ef2a0080ffffef01c0ac72ff07000000ff0930ebffff0af1efbbff0af55f50ff0af2ffffff0a30fc9efa0a",
"č": "0a0d0a000d007611670000f5dd5f000080ff0800000000000000b2fe4c0040ffffff06e0ff78fe1ff36f009339f52f000000f36f008338e0ff78fe1f40ffffff0600b3fe4c00",
"ď": "0e0c0d000c000000f09ff31f000000f09ff70a000000f09fea0400b3eef79f000050ffffff9f0000e0ff78fe9f0000f36f00f39f0000f52f00f09f0000f36f00f39f0000e0ff78fe9f000050ffffff9f000000b3efb79f0000",
"é": "0a0d0a000d00003067000000e15f000000fa0800000000000000b3ee4b0040ffffff06e0cf12fa2ff3af88f96ff5ffffff7ff35f000000e0df22c91c40ffffff0600b2ee4b00",
"ě": "0a0d0a000d007611670000f5dd5f000080ff0800000000000000b3ee4b0040ffffff06e0cf12fa2ff3af88f96ff5ffffff7ff35f000000e0df22c91c40ffffff0600b2ee4b00",
"í": "050d05010d70ef01f23f00740400000000ff0800ff0800ff0800ff0800ff0800ff0800ff0800ff0800ff0800",
"ň": "090d0a010d503770170030effb080000f5bf00000000000000ffb7ef0800ffffffaf00ffbff9ff02ff0c70ff04ff0930ff05ff0830ff05ff0830ff05ff0830ff05ff0830ff05",
"ó": "0a0d0a000d00003077000000e07f000000f90900000000000000b2ee4b0040ffffff07e0ff78fe2ff36f00f36ff52f00f08ff36f00f36fe0ff78fe2f40ffffff0700b3ee4b00",
"ř": "080d07000db07ff80b10fddf000072270000000000f0affd09f0ffff09f0ff6903f0bf0000f08f0000f08f0000f08f0000f08f0000f08f0000",
"š": "090d09000d503760170020fffb090000f4bf0000000000000030eadf0600f2ffff8f00f63f80bb00f5cf58010090ffff6f000041d6ff00d61d70ff01e1fffebf0020ebdf0800",
"ť": "0a0d09000d000000d40d20ff06f80a20ff06fc0420ff060000f7ffff0500f7ffff050073ff6a020020ff06000020ff06000020ff06000020ff5b020000ffff050000d5ff0500",
"ú": "090d0a010d0000fa0c000040ef010000502700000000000000ff0830ff05ff0830ff05ff0830ff05ff0830ff05ff0930ff05ff0c60ff05fcbff9ff05f5ffffff0550fd6dff05",
"ů": "090e0a010e000001000000e49f000000baf6000000e49f00000000010000ff0830ff05ff0830ff05ff0830ff05ff0830ff05ff0930ff05ff0c60ff05fcbff9ff05f5ffffff0550fd6dff05",
"ý": "0b110a000d000020ff05000000c07f0000000072060000000000000000e0cf0070ff0490ff02b0ef0030ff07f09f0000fd0df44f0000f82ff90e0000f28ffd0a0000d0ffff04000070ffff00000020ffaf00000000fc5f00000065fd0f000000ffff09000000ffae010000",
"ž": "080d09000d60cff32e00f9ff040070470000000000f5ffffeff5ffffef6266feaf0090ff0c00f7df0150ff2e00f3ff5955f6fffffff6ffffff"
"á": "0d100d001000000040670000000000f24f0000000000fb070000000000000000000000f3ff1f00000000f8ff6f00000000fdffbf00000030ffa8ff01000080ff53ff060000e0ef00ff0c0000f39f00fb1f0000f9ffffff6f0000feffffffcf0030ff6b66c6ff0190ff050070ff07e0ff000020ff0c",
"č": "0c100c00100040376017000020fefb0a000000f4cf00000000000000000020c9df290000f5ffffff0420ffdfebff1ec0ff0700f88ff0bf00007068f37f00000000f37f00000000f0bf00008079c0ff0600f88f20ffdfdaff1e00f5ffffff040020d9df2900",
"ď": "0b100c011000761277000000f4ce7f00000060ff0a0000000000000000fcffdf290000fcffffff0600fcafdaff3f00fc0e00f6df00fc0e00b0ff01fc0e0060ff04fc0e0060ff04fc0e00b0ff01fc0e00f6df00fc9fdaff3f00fcffffff0600fcffdf290000",
"é": "09100a011000007217000000fc09000060cf00000000000000fcffffff05fcffffff05fc7f777702fc0e000000fc0e000000fcffffff00fcffffff00fc6f666600fc0e000000fc7f777702fcffffff05fcffffff05",
"ě": "09100a0110503760170020fffb090000f4cf00000000000000fcffffff05fcffffff05fc7f777702fc0e000000fc0e000000fcffffff00fcffffff00fc6f666600fc0e000000fc7f777702fcffffff05fcffffff05",
"í": "051005011000770370df00f22e00000000fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00",
"ň": "0b100d011000740376010000e2bfaf00000040ff0c0000000000000000fccf0060ff04fcff0460ff04fcff0c60ff04fcff4f60ff04fcffcf60ff04fc7eff64ff04fc0efe6cff04fc0ef6dfff04fc0ed0ffff04fc0e50ffff04fc0e00fdff04fc0e00f4ff04",
"ó": "0d100d001000000070270000000000f90c0000000030ef010000000000000000000020c9cf19000000f5ffffef040020ffdfdbff1f00c0ff0700f8af00f0bf0000d0ff00f37f000090ff02f37f000090ff02f0bf0000d0ff00c0ff0600f8af0020ffdfdaff1f0000f5ffffef04000020d9cf190000",
"ř": "0b100c011020674047000000fbfa1d000000d1ff020000000000000000fcffff9d0000fcffffff0c00fc8f98fe5f00fc0e00f49f00fc0e00f1af00fc0e00f88f00fcffffff2f00fcffffdf0300fcafff0c0000fc0efaaf0000fc0eb0ff0900fc0e00fc9f00",
"š": "0b100b001000740476020000e1afaf00000030ff0d000000000000000000b4fe9d010060ffffff2f00f0ff79fccf00f39f00c0ff00f1ef3600000090ffffcf060000b5feff9f00000010e5ff00f65f0090ff02f2ff68f8ef0070ffffff5f0000b3fdad0300",
"ť": "0a100a0010007611670000f5dd5f000080ff08000000000000faffffffaffaffffffafa6caffac7a0050ff05000050ff05000050ff05000050ff05000050ff05000050ff05000050ff05000050ff05000050ff0500",
"ú": "0b100c01100000306700000000e16f00000000fa080000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"ů": "0b110c01110000100000000050fe08000000b07a0e00000050ff080000000010000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"ý": "0d100c001000000070270000000000f90c0000000040df01000000000000000000e1ff0100f2df0070ff0800fa5f0000fe1f20ff0c0000f68fa0ff040000e0fff3cf00000060ffff3f00000000fdff0b00000000f5ff0300000000e0df0000000000e0cf0000000000e0cf0000000000e0cf000000",
"ž": "0a100b0010007503760100f2bf9f000040ff0c000000000000f3ffffffcff3ffffffcfa2aaaaffaf000090ff1e0000f5ff030020ff6f0000d1ff090000fbcf000080ff1e0000f3ff9c9989f5ffffffdff5ffffffdf"
}

View File

@ -3,7 +3,7 @@
"Ö": "0d100d0010000011100100000050dff03f00000050dff03f0000000000000000000020c9cf19000000f5ffffef040020ffdfdbff1f00c0ff0700f8af00f0bf0000d0ff00f37f000090ff02f37f000090ff02f0bf0000d0ff00c0ff0600f8af0020ffdfdaff1f0000f5ffffef04000020d9cf190000",
"Ü": "0b100c011000110011000000fa48ef000000fa48ef0000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"ß": "090c0a010c30ebcf0700f3ffffbf00fbafd7ff03fe0d60ff05ff0bd5ff02ff1bff7f00ff1bffbf00ff0b80ff06ff0b20ff0aff0bb5ff08ff1bffff02ff1bef3b00",
"ä": "090d0a000d001100110000fc66cf0000fc66cf00000000000000d6ef2a0080ffffef01c0ac72ff07000000ff0930ebffff0af1efbbff0af55f50ff0af2ffffff0a30fc9efa0a",
"ö": "0a0d0a000d001100110000fb47ef0000fb47ef00000000000000b2ee4b0040ffffff07e0ff78fe2ff36f00f36ff52f00f08ff36f00f36fe0ff78fe2f40ffffff0700b3ee4b00",
"ü": "090d0a010d1011100100909ff30f00909ff30f000000000000ff0830ff05ff0830ff05ff0830ff05ff0830ff05ff0930ff05ff0c60ff05fcbff9ff05f5ffffff0550fd6dff05"
"ä": "0d100d0010000011001100000000fd75bf00000000fd75bf0000000000000000000000f3ff1f00000000f8ff6f00000000fdffbf00000030ffa8ff01000080ff53ff060000e0ef00ff0c0000f39f00fb1f0000f9ffffff6f0000feffffffcf0030ff6b66c6ff0190ff050070ff07e0ff000020ff0c",
"ö": "0d100d0010000011100100000050dff03f00000050dff03f0000000000000000000020c9cf19000000f5ffffef040020ffdfdbff1f00c0ff0700f8af00f0bf0000d0ff00f37f000090ff02f37f000090ff02f0bf0000d0ff00c0ff0600f8af0020ffdfdaff1f0000f5ffffef04000020d9cf190000",
"ü": "0b100c011000110011000000fa48ef000000fa48ef0000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000"
}

View File

@ -6,12 +6,12 @@
"Ó": "0d100d001000000070270000000000f90c0000000030ef010000000000000000000020c9cf19000000f5ffffef040020ffdfdbff1f00c0ff0700f8af00f0bf0000d0ff00f37f000090ff02f37f000090ff02f0bf0000d0ff00c0ff0600f8af0020ffdfdaff1f0000f5ffffef04000020d9cf190000",
"Ú": "0b100c01100000306700000000e16f00000000fa080000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"Ü": "0b100c011000110011000000fa48ef000000fa48ef0000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"á": "090d0a000d00004067000000f24f000000fc0700000000000000d6ef2a0080ffffef01c0ac72ff07000000ff0930ebffff0af1efbbff0af55f50ff0af2ffffff0a30fc9efa0a",
"é": "0a0d0a000d00003067000000e15f000000fa0800000000000000b3ee4b0040ffffff06e0cf12fa2ff3af88f96ff5ffffff7ff35f000000e0df22c91c40ffffff0600b2ee4b00",
"í": "050d05010d70ef01f23f00740400000000ff0800ff0800ff0800ff0800ff0800ff0800ff0800ff0800ff0800",
"ñ": "090d0a010d007251090040ffed0d00a03fcb02000000000000ffb7ef0800ffffffaf00ffbff9ff02ff0c70ff04ff0930ff05ff0830ff05ff0830ff05ff0830ff05ff0830ff05",
"ó": "0a0d0a000d00003077000000e07f000000f90900000000000000b2ee4b0040ffffff07e0ff78fe2ff36f00f36ff52f00f08ff36f00f36fe0ff78fe2f40ffffff0700b3ee4b00",
"ú": "090d0a010d0000fa0c000040ef010000502700000000000000ff0830ff05ff0830ff05ff0830ff05ff0830ff05ff0930ff05ff0c60ff05fcbff9ff05f5ffffff0550fd6dff05",
"ü": "090d0a010d1011100100909ff30f00909ff30f000000000000ff0830ff05ff0830ff05ff0830ff05ff0830ff05ff0930ff05ff0c60ff05fcbff9ff05f5ffffff0550fd6dff05",
"á": "0d100d001000000040670000000000f24f0000000000fb070000000000000000000000f3ff1f00000000f8ff6f00000000fdffbf00000030ffa8ff01000080ff53ff060000e0ef00ff0c0000f39f00fb1f0000f9ffffff6f0000feffffffcf0030ff6b66c6ff0190ff050070ff07e0ff000020ff0c",
"é": "09100a011000007217000000fc09000060cf00000000000000fcffffff05fcffffff05fc7f777702fc0e000000fc0e000000fcffffff00fcffffff00fc6f666600fc0e000000fc7f777702fcffffff05fcffffff05",
"í": "051005011000770370df00f22e00000000fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00fc0e00",
"ñ": "0b100d011000603895010000f5ffef0000009552290000000000000000fccf0060ff04fcff0460ff04fcff0c60ff04fcff4f60ff04fcffcf60ff04fc7eff64ff04fc0efe6cff04fc0ef6dfff04fc0ed0ffff04fc0e50ffff04fc0e00fdff04fc0e00f4ff04",
"ó": "0d100d001000000070270000000000f90c0000000030ef010000000000000000000020c9cf19000000f5ffffef040020ffdfdbff1f00c0ff0700f8af00f0bf0000d0ff00f37f000090ff02f37f000090ff02f0bf0000d0ff00c0ff0600f8af0020ffdfdaff1f0000f5ffffef04000020d9cf190000",
"ú": "0b100c01100000306700000000e16f00000000fa080000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"ü": "0b100c011000110011000000fa48ef000000fa48ef0000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"¿": "090d0900090090ff01000090ff01000070cc010000000000000080ee000000c0ff000010fc9f0000d0ff090000f59f000000f76f10cc08f4efc8ff07c0ffffdf0000d8df1900"
}

View File

@ -15,20 +15,20 @@
"Ü": "0b100c011000110011000000fa48ef000000fa48ef0000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"Ÿ": "0d100c0010000011100100000050dff03f00000050dff03f000000000000000000e1ff0100f2df0070ff0800fa5f0000fe1f20ff0c0000f68fa0ff040000e0fff3cf00000060ffff3f00000000fdff0b00000000f5ff0300000000e0df0000000000e0cf0000000000e0cf0000000000e0cf000000",
"Œ": "120c12000c0020d9df97ffffff6f00f5ffffffffffff6f20ffafc8ffff777737b0ff0500f9ff000000f0bf0000f1ff000000f37f0000c0ffffff1ff47f0000b0ffffff1ff1af0000e0ff666606d0ff0300f7ff00000040ffafb8ffff77773700f7ffffffffffff6f0020dadf97ffffff6f",
"à": "090d0a000d007604000000f51e00000080bf0000000000000000d6ef2a0080ffffef01c0ac72ff07000000ff0930ebffff0af1efbbff0af55f50ff0af2ffffff0a30fc9efa0a",
"â": "090d0a000d002077020000d0ff0d0000fb77bf00000000000000d6ef2a0080ffffef01c0ac72ff07000000ff0930ebffff0af1efbbff0af55f50ff0af2ffffff0a30fc9efa0a",
"æ": "0f090f000900d7df07d6cf070080ffffefffffaf00c09c61ff8f71ff05006388ff5f55fe09a0ffffffffffff0cf39f33ff3e222202f56f70ff7f51cc04f1ffffdfffffbf0030fcbe03d7cf0800",
"ç": "0a0d0a000900a2fe4c0040ffffff05e0ff78fe1ff36f009339f52f000000f45f007227e0ef66fd1f60ffffff0700d5ff6d000000ed00000000f90b000010f70e000040cf0500",
"è": "0a0d0a000d007604000000f42f00000060cf0000000000000000b3ee4b0040ffffff06e0cf12fa2ff3af88f96ff5ffffff7ff35f000000e0df22c91c40ffffff0600b2ee4b00",
"é": "0a0d0a000d00003067000000e15f000000fa0800000000000000b3ee4b0040ffffff06e0cf12fa2ff3af88f96ff5ffffff7ff35f000000e0df22c91c40ffffff0600b2ee4b00",
"ê": "0a0d0a000d002077020000d0ff0d0000fb77bf00000000000000b3ee4b0040ffffff06e0cf12fa2ff3af88f96ff5ffffff7ff35f000000e0df22c91c40ffffff0600b2ee4b00",
"ë": "0a0d0a000d001100110000fc66cf0000fc66cf00000000000000b3ee4b0040ffffff06e0cf12fa2ff3af88f96ff5ffffff7ff35f000000e0df22c91c40ffffff0600b2ee4b00",
"î": "070d06000d30ff0c00e2bfaf00740477010000000000ff080000ff080000ff080000ff080000ff080000ff080000ff080000ff080000ff0800",
"ï": "070d06000d10011100f81aff01f81aff010000000000ff080000ff080000ff080000ff080000ff080000ff080000ff080000ff080000ff0800",
"ô": "0a0d0a000d001077020000c0ff1e0000fa69cf00000000000000b2ee4b0040ffffff07e0ff78fe2ff36f00f36ff52f00f08ff36f00f36fe0ff78fe2f40ffffff0700b3ee4b00",
"ù": "090d0a010d70ef01000000fa0a000000700700000000000000ff0830ff05ff0830ff05ff0830ff05ff0830ff05ff0930ff05ff0c60ff05fcbff9ff05f5ffffff0550fd6dff05",
"û": "090d0a010d00f5af000030effb080050377017000000000000ff0830ff05ff0830ff05ff0830ff05ff0830ff05ff0930ff05ff0c60ff05fcbff9ff05f5ffffff0550fd6dff05",
"ü": "090d0a010d1011100100909ff30f00909ff30f000000000000ff0830ff05ff0830ff05ff0830ff05ff0830ff05ff0930ff05ff0c60ff05fcbff9ff05f5ffffff0550fd6dff05",
"ÿ": "0b110a000d00100111000000f21ffb070000f21ffb0700000000000000e0cf0070ff0490ff02b0ef0030ff07f09f0000fd0df44f0000f82ff90e0000f28ffd0a0000d0ffff04000070ffff00000020ffaf00000000fc5f00000065fd0f000000ffff09000000ffae010000",
"œ": "100910000900b3ee1a91ee4b0050ffffeffeffff06e0ef87ffef13fa1ff35f00f8cf88f95ff52f00f5ffffff6ff36f00f99f000000e0ff97ffff14c90c40ffffeffeffff0600b3ee1aa2ee5b00"
"à": "0d100d0010000076040000000000f51f000000000070bf000000000000000000000000f3ff1f00000000f8ff6f00000000fdffbf00000030ffa8ff01000080ff53ff060000e0ef00ff0c0000f39f00fb1f0000f9ffffff6f0000feffffffcf0030ff6b66c6ff0190ff050070ff07e0ff000020ff0c",
"â": "0d100d0010000020770100000000d1ff0c00000000fc86af0000000000000000000000f3ff1f00000000f8ff6f00000000fdffbf00000030ffa8ff01000080ff53ff060000e0ef00ff0c0000f39f00fb1f0000f9ffffff6f0000feffffffcf0030ff6b66c6ff0190ff050070ff07e0ff000020ff0c",
"æ": "110c11000c000050ffffffffff080000c0ffffffffff080000f3bffc8f7777040000fa2ff91f0000000010ff0bf91f0000000080ff05f9ffffff0300e0ef00f9ffffff0300f6ffffff7f66660100fdffffff1f00000040ff8c88fd8f777703b0ff0300f9ffffff08f2df0000f9ffffff08",
"ç": "0c100c000c0020c9df290000f5ffffef0320ffdfebff0ec0ff0700f87ff0cf00008079f37f00000000f47f00000000f1af00006067d0ff0400f59f50ffafa7ff2f00f8ffffff040050fcff4c000000b01f0000000080cf0000000071fe00000000f26d0000",
"è": "09100a0110406700000010fe05000000f31e00000000000000fcffffff05fcffffff05fc7f777702fc0e000000fc0e000000fcffffff00fcffffff00fc6f666600fc0e000000fc7f777702fcffffff05fcffffff05",
"é": "09100a011000007217000000fc09000060cf00000000000000fcffffff05fcffffff05fc7f777702fc0e000000fc0e000000fcffffff00fcffffff00fc6f666600fc0e000000fc7f777702fcffffff05fcffffff05",
"ê": "09100a0110007037000000faff030070bff41e000000000000fcffffff05fcffffff05fc7f777702fc0e000000fc0e000000fcffffff00fcffffff00fc6f666600fc0e000000fc7f777702fcffffff05fcffffff05",
"ë": "09100a0110001110010080aff20f0080aff20f000000000000fcffffff05fcffffff05fc7f777702fc0e000000fc0e000000fcffffff00fcffffff00fc6f666600fc0e000000fc7f777702fcffffff05fcffffff05",
"î": "07100600100075060050ff6f00f33efd040000000000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e00",
"ï": "071006001010011100f40ffd05f40ffd050000000000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e0000fc0e00",
"ô": "0d100d0010000060570000000000f7ff0500000040dfe33f0000000000000000000020c9cf19000000f5ffffef040020ffdfdbff1f00c0ff0700f8af00f0bf0000d0ff00f37f000090ff02f37f000090ff02f0bf0000d0ff00c0ff0600f8af0020ffdfdaff1f0000f5ffffef04000020d9cf190000",
"ù": "0b100c011000750500000000f33f0000000050df000000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"û": "0b100c011000107702000000c0ff1e000000f969cf0000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"ü": "0b100c011000110011000000fa48ef000000fa48ef0000000000000000fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0c0090ff01fe0d0090ff01fc0e00b0ff00fa6f00f3df00f4ffbcff7f0090ffffff0c0000b4ee7c0000",
"ÿ": "0d100c0010000011100100000050dff03f00000050dff03f000000000000000000e1ff0100f2df0070ff0800fa5f0000fe1f20ff0c0000f68fa0ff040000e0fff3cf00000060ffff3f00000000fdff0b00000000f5ff0300000000e0df0000000000e0cf0000000000e0cf0000000000e0cf000000",
"œ": "120c12000c0020d9df97ffffff6f00f5ffffffffffff6f20ffafc8ffff777737b0ff0500f9ff000000f0bf0000f1ff000000f37f0000c0ffffff1ff47f0000b0ffffff1ff1af0000e0ff666606d0ff0300f7ff00000040ffafb8ffff77773700f7ffffffffffff6f0020dadf97ffffff6f"
}