Use 16-bit integers to store builtin vector font data.
This significantly increases font legibility, since curves are represented more precisely. The file size is increased by mere ~1M (from 7M).
This commit is contained in:
parent
0128b86796
commit
bd6c4c0cbd
@ -37,19 +37,19 @@ static const VectorGlyph &GetVectorGlyph(char32_t chr) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// The internal font metrics are as follows:
|
// The internal font metrics are as follows:
|
||||||
// * Cap height (measured on "A"): 87
|
// * Cap height (measured on "A"): 22684
|
||||||
// * Ascender (measured on "h"): 87
|
// * Ascender (measured on "h"): 22684
|
||||||
// * Descender (measured on "p"): -30
|
// * Descender (measured on "p"): -7562
|
||||||
// * Font size (ascender+descender): 126
|
// * Font size (ascender+descender): 30246
|
||||||
// Internally and in the UI, the vector font is sized using cap height.
|
// Internally and in the UI, the vector font is sized using cap height.
|
||||||
#define FONT_SCALE(h) ((h)/87.0)
|
#define FONT_SCALE(h) ((h)/22684.0)
|
||||||
double ssglStrCapHeight(double h)
|
double ssglStrCapHeight(double h)
|
||||||
{
|
{
|
||||||
return /*cap height*/87.0 * FONT_SCALE(h) / SS.GW.scale;
|
return /*cap height*/22684.0 * FONT_SCALE(h) / SS.GW.scale;
|
||||||
}
|
}
|
||||||
double ssglStrFontSize(double h)
|
double ssglStrFontSize(double h)
|
||||||
{
|
{
|
||||||
return /*font size*/126.0 * FONT_SCALE(h) / SS.GW.scale;
|
return /*font size*/30246.0 * FONT_SCALE(h) / SS.GW.scale;
|
||||||
}
|
}
|
||||||
double ssglStrWidth(const std::string &str, double h)
|
double ssglStrWidth(const std::string &str, double h)
|
||||||
{
|
{
|
||||||
@ -79,7 +79,7 @@ void ssglWriteTextRefCenter(const std::string &str, double h, Vector t, Vector u
|
|||||||
t = t.Plus(v.ScaledBy(-fh/2));
|
t = t.Plus(v.ScaledBy(-fh/2));
|
||||||
|
|
||||||
// Apply additional offset to get an exact center alignment.
|
// Apply additional offset to get an exact center alignment.
|
||||||
t = t.Plus(v.ScaledBy(-18*scale));
|
t = t.Plus(v.ScaledBy(-4608*scale));
|
||||||
|
|
||||||
ssglWriteText(str, h, t, u, v, fn, fndata);
|
ssglWriteText(str, h, t, u, v, fn, fndata);
|
||||||
}
|
}
|
||||||
@ -121,12 +121,12 @@ int ssglDrawCharacter(const VectorGlyph &glyph, Vector t, Vector o, Vector u, Ve
|
|||||||
width = max(glyph.width, baseWidth);
|
width = max(glyph.width, baseWidth);
|
||||||
}
|
}
|
||||||
|
|
||||||
const int8_t *data = glyph.data;
|
const int16_t *data = glyph.data;
|
||||||
bool pen_up = true;
|
bool pen_up = true;
|
||||||
Vector prevp;
|
Vector prevp;
|
||||||
while(true) {
|
while(true) {
|
||||||
int8_t x = *data++;
|
int16_t x = *data++;
|
||||||
int8_t y = *data++;
|
int16_t y = *data++;
|
||||||
|
|
||||||
if(x == PEN_UP && y == PEN_UP) {
|
if(x == PEN_UP && y == PEN_UP) {
|
||||||
if(pen_up) break;
|
if(pen_up) break;
|
||||||
@ -152,7 +152,7 @@ void ssglWriteText(const std::string &str, double h, Vector t, Vector u, Vector
|
|||||||
v = v.WithMagnitude(1);
|
v = v.WithMagnitude(1);
|
||||||
|
|
||||||
double scale = FONT_SCALE(h) / SS.GW.scale;
|
double scale = FONT_SCALE(h) / SS.GW.scale;
|
||||||
Vector o = { 15.0, 15.0 };
|
Vector o = { 3840.0, 3840.0 };
|
||||||
for(char32_t chr : ReadUTF8(str)) {
|
for(char32_t chr : ReadUTF8(str)) {
|
||||||
const VectorGlyph &glyph = GetVectorGlyph(chr);
|
const VectorGlyph &glyph = GetVectorGlyph(chr);
|
||||||
o.x += ssglDrawCharacter(glyph, t, o, u, v, scale, fn, fndata);
|
o.x += ssglDrawCharacter(glyph, t, o, u, v, scale, fn, fndata);
|
||||||
|
@ -318,7 +318,7 @@ struct Font {
|
|||||||
double minX, minY, maxX, maxY;
|
double minX, minY, maxX, maxY;
|
||||||
getGlyphBound(&minX, &minY, &maxX, &maxY);
|
getGlyphBound(&minX, &minY, &maxX, &maxY);
|
||||||
|
|
||||||
double size = 126.0;
|
double size = 32766.0;
|
||||||
double scale = size / std::max({ fabs(maxX), fabs(minX), fabs(maxY), fabs(minY) });
|
double scale = size / std::max({ fabs(maxX), fabs(minX), fabs(maxY), fabs(minY) });
|
||||||
|
|
||||||
// We use tabs for indentation here to make compilation slightly faster
|
// We use tabs for indentation here to make compilation slightly faster
|
||||||
@ -327,17 +327,17 @@ struct Font {
|
|||||||
"#ifndef __VECTORFONT_TABLE_H\n"
|
"#ifndef __VECTORFONT_TABLE_H\n"
|
||||||
"#define __VECTORFONT_TABLE_H\n"
|
"#define __VECTORFONT_TABLE_H\n"
|
||||||
"\n"
|
"\n"
|
||||||
"#define PEN_UP 127\n"
|
"#define PEN_UP 32767\n"
|
||||||
"#define UP PEN_UP\n"
|
"#define UP PEN_UP\n"
|
||||||
"\n"
|
"\n"
|
||||||
"struct VectorGlyph {\n"
|
"struct VectorGlyph {\n"
|
||||||
"\tchar32_t character;\n"
|
"\tchar32_t character;\n"
|
||||||
"\tchar32_t baseCharacter;\n"
|
"\tchar32_t baseCharacter;\n"
|
||||||
"\tint width;\n"
|
"\tint width;\n"
|
||||||
"\tconst int8_t *data;\n"
|
"\tconst int16_t *data;\n"
|
||||||
"};\n"
|
"};\n"
|
||||||
"\n"
|
"\n"
|
||||||
"const int8_t VectorFontData[] = {\n"
|
"const int16_t VectorFontData[] = {\n"
|
||||||
"\tUP, UP,\n";
|
"\tUP, UP,\n";
|
||||||
|
|
||||||
std::map<char32_t, size_t> glyphIndexes;
|
std::map<char32_t, size_t> glyphIndexes;
|
||||||
|
Loading…
Reference in New Issue
Block a user