Espruino/libs/graphics/vector_font.c
2020-05-20 13:48:55 +01:00

538 lines
14 KiB
C

/*
* This file is part of Espruino, a JavaScript interpreter for Microcontrollers
*
* Copyright (C) 2020 Gordon Williams <gw@pur3.co.uk>
*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*
* ----------------------------------------------------------------------------
* Machine generated vector font header (by build_vector_font.sh)
* ----------------------------------------------------------------------------
*/
#ifndef NO_VECTOR_FONT
#include "graphics.h"
const uint8_t vfFirstChar = 33;
const uint8_t vfLastChar = 176;
#define VF_END_OF_POLY 0xFE
#define VF_END_OF_CHAR 0xFF
#define VF_OFFSET_Y (2)
static const uint8_t vfPolys[] IN_FLASH_MEMORY = {
// 33
161,163,195,193,VF_END_OF_POLY,
1,3,131,129,VF_END_OF_CHAR,
// 34
1,3,67,65,VF_END_OF_POLY,
4,6,70,68,VF_END_OF_CHAR,
// 35
4,6,196,194,VF_END_OF_POLY,
8,10,200,198,VF_END_OF_POLY,
112,123,155,144,VF_END_OF_POLY,
49,60,92,81,VF_END_OF_CHAR,
// 36
131,148,180,162,129,VF_END_OF_POLY,
70,53,21,39,72,VF_END_OF_POLY,
4,5,197,196,VF_END_OF_POLY,
20,34,65,98,116,84,67,52,VF_END_OF_POLY,
85,117,134,149,181,167,136,103,VF_END_OF_CHAR,
// 37
9,11,196,194,VF_END_OF_POLY,
48,17,3,35,50,67,99,81,VF_END_OF_POLY,
54,21,3,35,52,67,99,85,VF_END_OF_POLY,
151,120,106,138,153,170,202,184,VF_END_OF_POLY,
157,124,106,138,155,170,202,188,VF_END_OF_CHAR,
// 38
102,88,57,24,6,38,55,70,VF_END_OF_POLY,
166,164,147,116,102,70,98,129,178,198,VF_END_OF_POLY,
198,169,107,105,166,VF_END_OF_POLY,
6,20,51,201,203,53,38,VF_END_OF_CHAR,
// 39
1,3,67,65,VF_END_OF_CHAR,
// 40
38,99,147,214,246,194,145,50,6,VF_END_OF_CHAR,
// 41
33,100,148,209,241,197,150,53,1,VF_END_OF_CHAR,
// 42
132,134,6,4,VF_END_OF_POLY,
36,18,49,67,81,114,100,VF_END_OF_POLY,
38,24,57,71,89,120,102,VF_END_OF_CHAR,
// 43
36,84,81,113,116,164,166,118,121,89,86,38,VF_END_OF_CHAR,
// 44
225,227,164,162,194,VF_END_OF_CHAR,
// 45
81,87,119,113,VF_END_OF_CHAR,
// 46
161,163,195,193,VF_END_OF_CHAR,
// 47
8,10,227,225,VF_END_OF_CHAR,
// 48
196,184,153,57,24,6,4,36,38,55,151,166,164,VF_END_OF_POLY,
196,178,145,49,18,4,36,51,147,164,VF_END_OF_CHAR,
// 49
4,164,161,193,201,169,166,6,VF_END_OF_POLY,
33,4,36,65,VF_END_OF_CHAR,
// 50
4,36,38,71,130,193,201,169,163,179,148,104,73,24,6,VF_END_OF_POLY,
18,49,51,36,4,VF_END_OF_CHAR,
// 51
36,38,55,86,84,116,118,135,166,164,196,198,184,153,104,57,24,4,VF_END_OF_POLY,
18,49,51,36,4,VF_END_OF_POLY,
178,145,147,164,196,VF_END_OF_CHAR,
// 52
6,118,113,145,150,198,200,152,153,121,120,8,VF_END_OF_POLY,
113,115,8,6,VF_END_OF_CHAR,
// 53
115,113,1,9,41,35,83,100,VF_END_OF_POLY,
82,68,88,121,184,196,164,166,151,119,102,100,VF_END_OF_POLY,
178,145,147,164,196,VF_END_OF_CHAR,
// 54
68,82,102,119,151,166,164,196,184,153,88,70,VF_END_OF_POLY,
4,18,49,145,178,196,164,147,115,100,83,51,36,38,6,VF_END_OF_POLY,
24,57,55,38,6,VF_END_OF_CHAR,
// 55
1,33,39,195,197,41,9,VF_END_OF_CHAR,
// 56
4,18,49,98,145,178,196,198,166,164,131,116,118,86,84,51,36,38,6,VF_END_OF_POLY,
6,38,55,86,118,135,198,184,153,104,57,24,VF_END_OF_CHAR,
// 57
134,120,100,83,51,36,38,6,18,49,114,132,VF_END_OF_POLY,
198,184,153,57,24,6,38,55,87,102,119,151,166,164,196,VF_END_OF_POLY,
178,145,147,164,196,VF_END_OF_CHAR,
// 58
65,67,99,97,VF_END_OF_POLY,
161,163,195,193,VF_END_OF_CHAR,
// 59
225,227,164,162,194,VF_END_OF_POLY,
66,68,100,98,VF_END_OF_CHAR,
// 60
41,97,169,137,101,73,VF_END_OF_CHAR,
// 61
49,57,89,81,VF_END_OF_POLY,
113,121,153,145,VF_END_OF_CHAR,
// 62
33,105,161,129,101,65,VF_END_OF_CHAR,
// 63
18,49,51,36,4,VF_END_OF_POLY,
4,36,38,55,86,100,132,134,118,104,73,24,6,VF_END_OF_POLY,
164,166,198,196,VF_END_OF_CHAR,
// 64
104,118,134,170,183,165,116,85,71,90,VF_END_OF_POLY,
75,139,156,187,152,137,104,73,VF_END_OF_POLY,
250,246,228,194,145,50,6,10,41,39,68,99,147,197,217,VF_END_OF_POLY,
217,203,221,250,VF_END_OF_POLY,
10,62,95,143,174,188,187,141,109,59,41,VF_END_OF_CHAR,
// 65
195,193,5,7,VF_END_OF_POLY,
7,54,201,203,VF_END_OF_POLY,
116,147,153,120,VF_END_OF_CHAR,
// 66
1,193,195,3,VF_END_OF_POLY,
35,38,71,86,83,115,119,152,167,163,195,199,185,138,88,104,73,24,6,3,VF_END_OF_CHAR,
// 67
39,52,83,148,167,200,197,162,129,65,19,5,8,VF_END_OF_POLY,
167,200,171,153,VF_END_OF_POLY,
39,8,43,57,VF_END_OF_CHAR,
// 68
35,55,88,151,163,195,198,169,138,74,24,6,3,VF_END_OF_POLY,
3,1,193,195,VF_END_OF_CHAR,
// 69
201,169,163,115,119,87,83,35,41,9,1,193,VF_END_OF_CHAR,
// 70
1,193,195,115,119,87,83,35,41,9,VF_END_OF_CHAR,
// 71
39,52,83,148,167,200,197,162,129,65,19,5,8,VF_END_OF_POLY,
39,57,43,8,VF_END_OF_POLY,
167,153,137,135,103,107,171,200,VF_END_OF_CHAR,
// 72
1,193,195,115,120,88,83,3,VF_END_OF_POLY,
8,10,202,200,VF_END_OF_CHAR,
// 73
2,1,33,34,162,161,193,197,165,164,36,37,5,4,VF_END_OF_CHAR,
// 74
199,196,178,145,131,164,147,166,VF_END_OF_POLY,
10,154,185,199,166,152,167,136,8,VF_END_OF_CHAR,
// 75
1,193,195,131,101,99,3,VF_END_OF_POLY,
8,99,200,202,101,10,VF_END_OF_CHAR,
// 76
1,193,201,169,163,3,VF_END_OF_CHAR,
// 77
1,3,195,193,VF_END_OF_POLY,
12,10,202,204,VF_END_OF_POLY,
166,167,135,3,67,VF_END_OF_POLY,
167,134,10,74,VF_END_OF_CHAR,
// 78
1,3,195,193,VF_END_OF_POLY,
200,136,3,67,VF_END_OF_POLY,
10,8,200,202,VF_END_OF_CHAR,
// 79
39,52,83,148,167,200,197,179,129,65,19,5,8,VF_END_OF_POLY,
39,57,90,153,167,200,171,140,76,26,8,VF_END_OF_CHAR,
// 80
1,193,195,3,VF_END_OF_POLY,
35,38,55,87,102,99,131,134,120,89,24,6,3,VF_END_OF_CHAR,
// 81
8,39,57,122,153,167,234,220,186,140,76,26,VF_END_OF_POLY,
39,52,83,148,167,200,197,162,129,65,19,5,8,VF_END_OF_CHAR,
// 82
1,193,195,3,VF_END_OF_POLY,
35,38,55,87,102,99,131,134,120,89,24,6,3,VF_END_OF_POLY,
117,200,202,119,VF_END_OF_CHAR,
// 83
4,18,49,98,118,135,166,164,196,184,153,104,84,67,36,38,6,VF_END_OF_POLY,
147,164,196,178,145,VF_END_OF_POLY,
55,38,6,24,57,VF_END_OF_CHAR,
// 84
1,33,37,197,199,39,43,11,VF_END_OF_CHAR,
// 85
8,136,167,152,166,199,185,154,10,VF_END_OF_POLY,
199,196,178,145,1,3,131,164,147,166,VF_END_OF_CHAR,
// 86
197,199,3,1,VF_END_OF_POLY,
199,197,9,11,VF_END_OF_CHAR,
// 87
196,198,3,1,VF_END_OF_POLY,
204,139,13,15,VF_END_OF_POLY,
202,204,9,72,VF_END_OF_POLY,
198,133,7,9,VF_END_OF_CHAR,
// 88
1,201,203,3,VF_END_OF_POLY,
11,195,193,9,VF_END_OF_CHAR,
// 89
11,119,199,197,117,9,VF_END_OF_POLY,
1,117,119,3,VF_END_OF_CHAR,
// 90
1,9,41,163,169,201,193,161,39,33,VF_END_OF_CHAR,
// 91
1,241,246,214,211,35,38,6,VF_END_OF_CHAR,
// 92
3,1,232,234,VF_END_OF_CHAR,
// 93
6,246,241,209,212,36,33,1,VF_END_OF_CHAR,
// 94
5,97,99,53,VF_END_OF_POLY,
5,105,103,53,VF_END_OF_CHAR,
// 95
209,217,249,241,VF_END_OF_CHAR,
// 96
1,3,70,68,VF_END_OF_CHAR,
// 97
101,115,147,183,196,178,113,82,68,87,VF_END_OF_POLY,
86,70,72,200,198,165,150,118,101,VF_END_OF_CHAR,
// 98
100,118,150,178,197,183,120,87,69,82,VF_END_OF_POLY,
83,3,1,193,195,164,147,115,100,VF_END_OF_CHAR,
// 99
69,87,120,118,101,VF_END_OF_POLY,
197,178,145,82,68,69,101,115,147,165,VF_END_OF_POLY,
165,150,152,183,197,VF_END_OF_CHAR,
// 100
101,115,147,183,196,178,113,82,68,87,VF_END_OF_POLY,
86,6,8,200,198,165,150,118,101,VF_END_OF_CHAR,
// 101
68,87,152,147,115,118,100,VF_END_OF_POLY,
100,115,147,183,197,178,145,82,68,VF_END_OF_CHAR,
// 102
194,98,97,65,66,19,6,38,52,68,70,102,100,196,VF_END_OF_CHAR,
// 103
213,193,226,244,231,200,56,54,85,102,134,149,166,198,VF_END_OF_POLY,
85,99,131,167,180,162,97,66,52,71,VF_END_OF_CHAR,
// 104
100,118,198,200,120,87,68,82,VF_END_OF_POLY,
83,3,1,193,195,115,100,VF_END_OF_CHAR,
// 105
65,67,195,193,VF_END_OF_POLY,
1,3,35,33,VF_END_OF_CHAR,
// 106
69,197,228,241,209,195,67,VF_END_OF_POLY,
3,5,37,35,VF_END_OF_CHAR,
// 107
1,193,195,163,133,131,3,VF_END_OF_POLY,
70,131,198,200,133,72,VF_END_OF_CHAR,
// 108
1,3,195,193,VF_END_OF_CHAR,
// 109
100,118,198,200,120,105,69,82,VF_END_OF_POLY,
83,67,65,193,195,115,100,VF_END_OF_POLY,
105,123,203,205,125,92,74,87,VF_END_OF_CHAR,
// 110
100,118,198,200,120,87,68,82,VF_END_OF_POLY,
83,67,65,193,195,115,100,VF_END_OF_CHAR,
// 111
101,115,147,165,197,196,178,113,82,69,VF_END_OF_POLY,
101,118,197,183,152,87,69,VF_END_OF_CHAR,
// 112
164,150,118,82,69,87,152,183,197,178,VF_END_OF_POLY,
179,243,241,65,67,100,115,147,164,VF_END_OF_CHAR,
// 113
165,147,115,87,68,82,145,178,196,183,VF_END_OF_POLY,
182,246,248,72,70,101,118,150,165,VF_END_OF_CHAR,
// 114
100,118,104,69,82,VF_END_OF_POLY,
83,67,65,193,195,115,100,VF_END_OF_CHAR,
// 115
197,183,152,99,115,100,119,104,69,82,113,166,150,165,146,161,196,VF_END_OF_CHAR,
// 116
2,66,65,97,98,146,179,198,166,148,100,102,70,68,4,VF_END_OF_CHAR,
// 117
165,147,67,65,145,178,196,183,VF_END_OF_POLY,
182,198,200,72,70,150,165,VF_END_OF_CHAR,
// 118
196,198,67,65,VF_END_OF_POLY,
198,196,71,73,VF_END_OF_CHAR,
// 119
196,198,67,65,VF_END_OF_POLY,
198,196,70,72,VF_END_OF_POLY,
200,202,72,70,VF_END_OF_POLY,
202,200,75,77,VF_END_OF_CHAR,
// 120
65,67,201,199,VF_END_OF_POLY,
73,71,193,195,VF_END_OF_CHAR,
// 121
74,229,242,210,196,72,VF_END_OF_POLY,
65,197,166,67,VF_END_OF_CHAR,
// 122
65,72,104,164,168,200,193,161,101,97,VF_END_OF_CHAR,
// 123
6,20,114,99,113,129,147,130,228,246,247,215,197,165,115,131,85,53,39,7,VF_END_OF_CHAR,
// 124
1,3,243,241,VF_END_OF_CHAR,
// 125
2,20,118,101,119,135,149,134,228,242,241,209,195,163,117,133,83,51,33,1,VF_END_OF_CHAR,
// 126
52,66,113,115,84,VF_END_OF_POLY,
52,84,134,152,120,70,VF_END_OF_POLY,
89,152,138,91,VF_END_OF_CHAR,
// 127
VF_END_OF_CHAR,
// 128
39,52,68,70,86,84,116,118,134,132,148,167,200,197,162,130,128,112,114,82,80,64,66,34,5,8,VF_END_OF_POLY,
167,200,186,171,153,VF_END_OF_POLY,
39,8,43,57,VF_END_OF_CHAR,
// 129
VF_END_OF_CHAR,
// 130
VF_END_OF_CHAR,
// 131
VF_END_OF_CHAR,
// 132
VF_END_OF_CHAR,
// 133
VF_END_OF_CHAR,
// 134
VF_END_OF_CHAR,
// 135
VF_END_OF_CHAR,
// 136
VF_END_OF_CHAR,
// 137
VF_END_OF_CHAR,
// 138
VF_END_OF_CHAR,
// 139
VF_END_OF_CHAR,
// 140
VF_END_OF_CHAR,
// 141
VF_END_OF_CHAR,
// 142
VF_END_OF_CHAR,
// 143
VF_END_OF_CHAR,
// 144
VF_END_OF_CHAR,
// 145
VF_END_OF_CHAR,
// 146
VF_END_OF_CHAR,
// 147
VF_END_OF_CHAR,
// 148
VF_END_OF_CHAR,
// 149
VF_END_OF_CHAR,
// 150
VF_END_OF_CHAR,
// 151
VF_END_OF_CHAR,
// 152
VF_END_OF_CHAR,
// 153
VF_END_OF_CHAR,
// 154
VF_END_OF_CHAR,
// 155
VF_END_OF_CHAR,
// 156
VF_END_OF_CHAR,
// 157
VF_END_OF_CHAR,
// 158
VF_END_OF_CHAR,
// 159
VF_END_OF_CHAR,
// 160
VF_END_OF_CHAR,
// 161
VF_END_OF_CHAR,
// 162
VF_END_OF_CHAR,
// 163
VF_END_OF_CHAR,
// 164
VF_END_OF_CHAR,
// 165
VF_END_OF_CHAR,
// 166
VF_END_OF_CHAR,
// 167
VF_END_OF_CHAR,
// 168
VF_END_OF_CHAR,
// 169
VF_END_OF_CHAR,
// 170
VF_END_OF_CHAR,
// 171
VF_END_OF_CHAR,
// 172
VF_END_OF_CHAR,
// 173
VF_END_OF_CHAR,
// 174
VF_END_OF_CHAR,
// 175
VF_END_OF_CHAR,
// 176
3,5,22,54,69,67,51,53,21,19,VF_END_OF_POLY,
67,50,18,3,VF_END_OF_CHAR,
};
static const uint8_t vfAccentPolys[] IN_FLASH_MEMORY = {
// 240
68,70,120,118,VF_END_OF_CHAR,
// 241
73,71,117,119,VF_END_OF_CHAR,
// 242
115,70,121,119,102,117,VF_END_OF_CHAR,
// 243
83,53,87,57,89,119,85,115,VF_END_OF_CHAR,
// 244
115,83,85,117,VF_END_OF_POLY,
119,87,89,121,VF_END_OF_CHAR,
// 245
69,71,88,120,135,133,117,119,87,85,VF_END_OF_POLY,
133,116,84,69,VF_END_OF_CHAR,
};
static const uint8_t vfAccentPolyIndices[] = {0,5,10,17,26,36};
static const uint8_t *vfGetCharPtr(char sch, const uint8_t **accentPtr, int *accentX, int *accentY) {
unsigned char ch = (unsigned char)sch;
if (ch>=192) {
// 012345 correspond to 0=grave,1=acute,2=circumflex,3=tilde,4=umlaut,5=ring
char *chrMap = "AAAAAAACEEEEIIIIDNOOOOOxOUUUUYIBaaaaaaaceeeeiiiionooooo-ouuuuyly";
char *accMap = "012345E,01240124-301234 /01241o 012345e,01240124+301234:/01241p4";
if (ch>=192) {
int i = ch-192;
ch = (unsigned char)chrMap[i];
if (accentPtr) {
char acc = accMap[i];
*accentX = 0;
*accentY = 0;
if (acc>='0' && acc<='5') {
*accentPtr = &vfAccentPolys[vfAccentPolyIndices[acc-'0']];
if (ch>='a' && ch<='z') { // lowercase
*accentX = -2;
*accentY = -4;
} else {
*accentY = -9;
}
if (ch=='I') *accentX -= 3;
if (ch=='i') *accentX -= 2;
} else if (acc!=' ') {
*accentPtr = vfGetCharPtr(acc, NULL,NULL,NULL);
if (acc=='E') *accentX = 8;
if (acc=='e') *accentX = 4;
if (acc==',') *accentX = 4;
if (acc=='+') *accentY = -4;
if (acc==':') { *accentX = 2;*accentY = -2; }
if (acc=='o') { *accentX = 2;*accentY = -1; }
}
}
}
}
if (ch<vfFirstChar || ch>vfLastChar) return NULL;
if (ch==vfFirstChar) return vfPolys;
int charCounter = ((uint8_t)ch) - vfFirstChar;
for (unsigned int p=0;p < sizeof(vfPolys);p++) {
if (vfPolys[p] == VF_END_OF_CHAR) {
charCounter--;
if (charCounter==0)
return &vfPolys[p+1];
}
}
return 0; // we went past the end
}
// prints character, returns width
unsigned int vfDrawCharPtr(JsGraphics *gfx, int x1, int y1, int size, const uint8_t *charPtr) {
short poly[52];
int polyLen = 0;
int w = 0;
while (*charPtr!=VF_END_OF_CHAR) {
if (*charPtr==VF_END_OF_POLY) {
graphicsFillPoly(gfx, polyLen, poly);
polyLen = 0;
} else {
uint8_t vertex = *charPtr;
int vx = vertex&15;
int vy = vertex>>4;
if (vx>w) w=vx;
poly[polyLen*2 ] = (short)(x1 + ((vx*size+8)>>4));
poly[polyLen*2+1] = (short)(y1 + ((vy*size+8)>>4) + VF_OFFSET_Y);
polyLen++;
}
charPtr++;
}
graphicsFillPoly(gfx, polyLen, poly);
return (unsigned int)(((w+1)*size+7)>>4);
}
// returns the width of a character
unsigned int graphicsVectorCharWidth(JsGraphics *gfx, unsigned int size, char ch) {
NOT_USED(gfx);
const uint8_t *p = vfGetCharPtr(ch, NULL,NULL,NULL);
if (!p) return (unsigned int)(size/2);
int w = 0;
while (*p!=VF_END_OF_CHAR) {
if (*p!=VF_END_OF_POLY) {
uint8_t vertex = *p;
int vx = vertex&15;
if (vx>w) w=vx;
}
p++;
}
return (unsigned int)(((w+1)*size+7)>>4);
}
// prints character, returns width
unsigned int graphicsFillVectorChar(JsGraphics *gfx, int x1, int y1, int size, char ch) {
const uint8_t *accentPtr = 0;
int accentX, accentY;
const uint8_t *charPtr = vfGetCharPtr(ch, &accentPtr, &accentX, &accentY);
if (!charPtr) return (unsigned int)(size/2);
unsigned int w = vfDrawCharPtr(gfx, x1, y1, size, charPtr);
unsigned int w2 = 0;
if (accentPtr)
w2 = vfDrawCharPtr(gfx, x1 + ((accentX*size)>>4), y1 + ((accentY*size)>>4), size, accentPtr);
return (w2>w)?w2:w;
}
#endif