feat: Include superscripts and subscripts in fonts (#463)

## Summary

* Include superscripts and subscripts in fonts

## Additional Context

* Original change came from
https://github.com/crosspoint-reader/crosspoint-reader/pull/248

---

### AI Usage

While CrossPoint doesn't have restrictions on AI tools in contributing,
please be transparent about their usage as it
helps set the right context for reviewers.

Did you use AI tools to help write this code? No

---------

Co-authored-by: cor <cor@pruijs.dev>
This commit is contained in:
Dave Allie
2026-01-21 22:42:41 +11:00
committed by GitHub
parent e548bfc0e1
commit c9b5462370
55 changed files with 23129 additions and 18679 deletions

View File

@@ -7,7 +7,7 @@
#pragma once
#include "EpdFontData.h"
static const uint8_t ubuntu_12_regularBitmaps[16913] = {
static const uint8_t ubuntu_12_regularBitmaps[17102] = {
0x73, 0x9C, 0xE7, 0x39, 0xCE, 0x73, 0x9C, 0xE0, 0x01, 0xDE, 0x70, 0xF7, 0xF7, 0xF7, 0x67, 0x67,
0x67, 0x0E, 0x18, 0x1C, 0x70, 0x38, 0xE0, 0x71, 0xC0, 0xC3, 0x9F, 0xFF, 0xFF, 0xFF, 0x8E, 0x38,
0x1C, 0x70, 0x30, 0xE3, 0xFF, 0xFF, 0xFF, 0xF3, 0x8E, 0x07, 0x1C, 0x0E, 0x38, 0x38, 0x60, 0x71,
@@ -1037,35 +1037,46 @@ static const uint8_t ubuntu_12_regularBitmaps[16913] = {
0xFE, 0x0E, 0x07, 0xC3, 0xE0, 0x0C, 0x38, 0xF1, 0xC7, 0x8E, 0x1E, 0x1C, 0x3C, 0x38, 0x30, 0xC3,
0x87, 0x1E, 0x38, 0xF3, 0x9E, 0x73, 0x8C, 0x00, 0x00, 0x38, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0E,
0x00, 0xE0, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x38, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x1C, 0x00, 0xE0,
0x0E, 0x00, 0x70, 0x00, 0x07, 0xF8, 0x7F, 0x87, 0xCC, 0x38, 0x03, 0x80, 0x7F, 0xF3, 0xFF, 0x87,
0x00, 0x38, 0x07, 0xFE, 0x3F, 0xF0, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x7C, 0x61, 0xFF, 0x07, 0xF8,
0xFF, 0xFF, 0xFF, 0xC1, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xF0, 0x1F, 0x83, 0xF0, 0x7F, 0x03, 0xF8,
0x01, 0xF8, 0x0F, 0xC1, 0xF8, 0x3F, 0x81, 0xFC, 0x00, 0xE0, 0x07, 0x00, 0x1F, 0xC0, 0x7F, 0xC1,
0x8F, 0x00, 0x1C, 0x00, 0x71, 0xFF, 0xF7, 0xFF, 0xC0, 0xF8, 0x07, 0xC0, 0x7C, 0x07, 0xFF, 0xDF,
0xFF, 0x38, 0x00, 0xE0, 0x03, 0xC7, 0x0F, 0xFE, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0x03,
0x8F, 0xFF, 0x7F, 0xF8, 0x07, 0x00, 0xF8, 0xFF, 0x87, 0xF0, 0x1E, 0x00, 0x78, 0x01, 0xC0, 0x07,
0x00, 0x3C, 0x00, 0xF0, 0x03, 0xC0, 0x7F, 0x83, 0xFE, 0x18, 0xF8, 0x01, 0xE0, 0x07, 0x00, 0x38,
0x01, 0xC3, 0xFF, 0x3F, 0xFB, 0xE7, 0xFC, 0x1F, 0xC0, 0xFE, 0x07, 0x70, 0x3B, 0x81, 0xDC, 0x1C,
0xFB, 0xE3, 0xFE, 0x0F, 0xE0, 0x03, 0xC0, 0x01, 0xE0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x67, 0x00,
0x73, 0x80, 0x38, 0xE0, 0x38, 0x70, 0x1C, 0x38, 0x1C, 0x0E, 0x0E, 0x07, 0x07, 0x03, 0xC7, 0x00,
0xE3, 0x80, 0x71, 0xC0, 0x3D, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0xF8,
0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0,
0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF,
0xDC, 0x00, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x07, 0x80, 0x1C, 0x01, 0xE0, 0x1E,
0x00, 0xE0, 0x0F, 0x00, 0xF0, 0x07, 0x00, 0x78, 0x03, 0x80, 0x3F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF,
0xFF, 0x00, 0x38, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x07, 0x00,
0x38, 0x03, 0x80, 0x1C, 0x01, 0xC0, 0x1C, 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x00, 0xFF, 0xF0, 0x00,
0x0E, 0x00, 0x18, 0x00, 0x70, 0x00, 0xE0, 0x01, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x30,
0x00, 0xE1, 0xE1, 0xC7, 0xC3, 0x0F, 0xCE, 0x03, 0x9C, 0x03, 0xB8, 0x07, 0x60, 0x07, 0xC0, 0x0F,
0x80, 0x1E, 0x00, 0x1C, 0x00, 0x3C, 0xF9, 0xFF, 0xF7, 0x7D, 0xF8, 0xE3, 0x77, 0xDD, 0xFF, 0xF3,
0xEF, 0x80, 0x07, 0x83, 0xE0, 0xF0, 0x78, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0,
0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x1F, 0x0F, 0x83, 0xC0,
0x7C, 0x3F, 0xF7, 0xEF, 0xFC, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x3F, 0xF7, 0xEF, 0xFC, 0x3E, 0x00,
0xC0, 0x1C, 0x01, 0xCF, 0xFF, 0xFF, 0xF0, 0x70, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x38, 0x03,
0x80, 0x30, 0x00, 0x00, 0x70, 0x1F, 0x0F, 0xE3, 0xF8, 0xFC, 0x0F, 0x00, 0xFC, 0x03, 0xF8, 0x0F,
0xE0, 0x1F, 0x00, 0x70, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0xE0, 0x0F, 0x80, 0x7F, 0x00, 0xFC,
0x03, 0xF0, 0x0F, 0x03, 0xF0, 0xFC, 0x7F, 0x0F, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF,
0xF0,
0x0E, 0x00, 0x70, 0x00, 0x3E, 0x3F, 0x9D, 0xDC, 0x6E, 0x3F, 0x1F, 0x8C, 0xEE, 0x7F, 0x1F, 0x00,
0x07, 0x07, 0x87, 0xC7, 0xE7, 0x73, 0x3B, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0x7E, 0xFD, 0x87, 0xEF,
0xE3, 0xC1, 0xE7, 0xFF, 0xF8, 0x0F, 0x1F, 0x9F, 0x0F, 0xC7, 0xF3, 0xB9, 0x8E, 0xEE, 0x7F, 0x1F,
0x00, 0x7F, 0x3F, 0x81, 0xC1, 0xC0, 0xE0, 0xE0, 0x70, 0x30, 0x38, 0x1C, 0x00, 0x3E, 0x3F, 0x9D,
0xCE, 0xE7, 0xE3, 0xF9, 0x8D, 0xEE, 0x7F, 0x1F, 0x00, 0x3E, 0x3F, 0x9D, 0xDC, 0x67, 0xF1, 0xF8,
0x1C, 0x3E, 0x7E, 0x3C, 0x00, 0x3E, 0x3F, 0x9D, 0xDC, 0x6E, 0x3F, 0x1F, 0x8C, 0xEE, 0x7F, 0x1F,
0x00, 0x3B, 0xFF, 0xF1, 0x8C, 0x63, 0x18, 0xC0, 0x7E, 0x7F, 0x67, 0x07, 0x0E, 0x1C, 0x38, 0x70,
0x7F, 0x7F, 0x7E, 0x7E, 0x6F, 0x3E, 0x3E, 0x0F, 0x07, 0x67, 0x7F, 0x7E, 0x07, 0x07, 0x87, 0xC7,
0xE7, 0x73, 0x3B, 0xFF, 0xFF, 0x07, 0x03, 0x80, 0x7E, 0xFD, 0x87, 0xEF, 0xE3, 0xC1, 0xE7, 0xFF,
0xF8, 0x0F, 0x1F, 0x9F, 0x0F, 0xC7, 0xF3, 0xB9, 0x8E, 0xEE, 0x7F, 0x1F, 0x00, 0x7F, 0x3F, 0x81,
0xC1, 0xC0, 0xE0, 0xE0, 0x70, 0x30, 0x38, 0x1C, 0x00, 0x3E, 0x3F, 0x9D, 0xCE, 0xE7, 0xE3, 0xF9,
0x8D, 0xEE, 0x7F, 0x1F, 0x00, 0x3E, 0x3F, 0x9D, 0xDC, 0x67, 0xF1, 0xF8, 0x1C, 0x3E, 0x7E, 0x3C,
0x00, 0x07, 0xF8, 0x7F, 0x87, 0xCC, 0x38, 0x03, 0x80, 0x7F, 0xF3, 0xFF, 0x87, 0x00, 0x38, 0x07,
0xFE, 0x3F, 0xF0, 0x70, 0x03, 0xC0, 0x0E, 0x00, 0x7C, 0x61, 0xFF, 0x07, 0xF8, 0xFF, 0xFF, 0xFF,
0xC1, 0xC0, 0x0E, 0x00, 0x70, 0x03, 0xF0, 0x1F, 0x83, 0xF0, 0x7F, 0x03, 0xF8, 0x01, 0xF8, 0x0F,
0xC1, 0xF8, 0x3F, 0x81, 0xFC, 0x00, 0xE0, 0x07, 0x00, 0x1F, 0xC0, 0x7F, 0xC1, 0x8F, 0x00, 0x1C,
0x00, 0x71, 0xFF, 0xF7, 0xFF, 0xC0, 0xF8, 0x07, 0xC0, 0x7C, 0x07, 0xFF, 0xDF, 0xFF, 0x38, 0x00,
0xE0, 0x03, 0xC7, 0x0F, 0xFE, 0x0F, 0xF0, 0xFF, 0xFF, 0xFF, 0xC0, 0xF0, 0x03, 0x8F, 0xFF, 0x7F,
0xF8, 0x07, 0x00, 0xF8, 0xFF, 0x87, 0xF0, 0x1E, 0x00, 0x78, 0x01, 0xC0, 0x07, 0x00, 0x3C, 0x00,
0xF0, 0x03, 0xC0, 0x7F, 0x83, 0xFE, 0x18, 0xF8, 0x01, 0xE0, 0x07, 0x00, 0x38, 0x01, 0xC3, 0xFF,
0x3F, 0xFB, 0xE7, 0xFC, 0x1F, 0xC0, 0xFE, 0x07, 0x70, 0x3B, 0x81, 0xDC, 0x1C, 0xFB, 0xE3, 0xFE,
0x0F, 0xE0, 0x03, 0xC0, 0x01, 0xE0, 0x01, 0xF8, 0x00, 0xFC, 0x00, 0x67, 0x00, 0x73, 0x80, 0x38,
0xE0, 0x38, 0x70, 0x1C, 0x38, 0x1C, 0x0E, 0x0E, 0x07, 0x07, 0x03, 0xC7, 0x00, 0xE3, 0x80, 0x71,
0xC0, 0x3D, 0xFF, 0xFE, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F,
0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE,
0x03, 0xF8, 0x0F, 0xE0, 0x3F, 0x80, 0xFE, 0x03, 0xF8, 0x0F, 0xFF, 0xFF, 0xFF, 0xDC, 0x00, 0x70,
0x03, 0xC0, 0x0E, 0x00, 0x38, 0x01, 0xE0, 0x07, 0x80, 0x1C, 0x01, 0xE0, 0x1E, 0x00, 0xE0, 0x0F,
0x00, 0xF0, 0x07, 0x00, 0x78, 0x03, 0x80, 0x3F, 0xFF, 0xFF, 0xF0, 0xFF, 0xFF, 0xFF, 0x00, 0x38,
0x03, 0x80, 0x1C, 0x01, 0xC0, 0x0E, 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x07, 0x00, 0x38, 0x03, 0x80,
0x1C, 0x01, 0xC0, 0x1C, 0x00, 0xE0, 0x0E, 0x00, 0x70, 0x00, 0xFF, 0xF0, 0x00, 0x0E, 0x00, 0x18,
0x00, 0x70, 0x00, 0xE0, 0x01, 0x80, 0x07, 0x00, 0x0E, 0x00, 0x1C, 0x00, 0x30, 0x00, 0xE1, 0xE1,
0xC7, 0xC3, 0x0F, 0xCE, 0x03, 0x9C, 0x03, 0xB8, 0x07, 0x60, 0x07, 0xC0, 0x0F, 0x80, 0x1E, 0x00,
0x1C, 0x00, 0x3C, 0xF9, 0xFF, 0xF7, 0x7D, 0xF8, 0xE3, 0x77, 0xDD, 0xFF, 0xF3, 0xEF, 0x80, 0x07,
0x83, 0xE0, 0xF0, 0x78, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x07,
0x01, 0xC0, 0x70, 0x1C, 0x07, 0x01, 0xC0, 0x70, 0x1C, 0x1F, 0x0F, 0x83, 0xC0, 0x7C, 0x3F, 0xF7,
0xEF, 0xFC, 0x3E, 0x00, 0x00, 0x00, 0x7C, 0x3F, 0xF7, 0xEF, 0xFC, 0x3E, 0x00, 0xC0, 0x1C, 0x01,
0xCF, 0xFF, 0xFF, 0xF0, 0x70, 0x07, 0x00, 0xE0, 0xFF, 0xFF, 0xFF, 0x38, 0x03, 0x80, 0x30, 0x00,
0x00, 0x70, 0x1F, 0x0F, 0xE3, 0xF8, 0xFC, 0x0F, 0x00, 0xFC, 0x03, 0xF8, 0x0F, 0xE0, 0x1F, 0x00,
0x70, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0, 0xE0, 0x0F, 0x80, 0x7F, 0x00, 0xFC, 0x03, 0xF0, 0x0F,
0x03, 0xF0, 0xFC, 0x7F, 0x0F, 0x80, 0xE0, 0x00, 0x00, 0x00, 0x0F, 0xFF, 0xFF, 0xF0,
};
static const EpdGlyph ubuntu_12_regularGlyphs[] = {
@@ -1625,24 +1636,41 @@ static const EpdGlyph ubuntu_12_regularGlyphs[] = {
{ 7, 11, 7, 0, 13, 10, 16421 }, //
{ 6, 11, 7, 1, 13, 9, 16431 }, //
{ 13, 17, 4, -5, 17, 28, 16440 }, //
{ 13, 17, 14, 1, 17, 28, 16468 }, //
{ 13, 17, 14, 1, 17, 28, 16496 }, //
{ 14, 17, 14, 0, 17, 30, 16524 }, //
{ 13, 17, 14, 1, 17, 28, 16554 }, //
{ 13, 19, 15, 1, 19, 31, 16582 }, //
{ 17, 17, 16, 0, 17, 37, 16613 }, //
{ 14, 20, 17, 2, 17, 35, 16650 }, //
{ 13, 20, 13, 0, 17, 33, 16685 }, //
{ 12, 2, 14, 1, 8, 3, 16718 }, //
{ 13, 17, 4, -5, 17, 28, 16721 }, //
{ 4, 3, 6, 1, 9, 2, 16749 }, //
{ 15, 20, 14, 0, 20, 38, 16751 }, //
{ 14, 7, 15, 0, 11, 13, 16789 }, //
{ 10, 24, 9, 0, 19, 30, 16802 }, //
{ 12, 10, 14, 1, 13, 15, 16832 }, //
{ 12, 13, 14, 1, 14, 20, 16847 }, //
{ 12, 15, 14, 1, 15, 23, 16867 }, //
{ 12, 15, 14, 1, 15, 23, 16890 }, //
{ 9, 10, 9, 0, 18, 12, 16468 }, //
{ 9, 10, 9, 0, 18, 12, 16480 }, //
{ 7, 10, 9, 1, 18, 9, 16492 }, //
{ 9, 10, 9, 0, 18, 12, 16501 }, //
{ 9, 10, 9, 0, 18, 12, 16513 }, //
{ 9, 10, 9, 0, 18, 12, 16525 }, //
{ 9, 10, 9, 0, 18, 12, 16537 }, //
{ 9, 10, 9, 0, 10, 12, 16549 }, //
{ 5, 10, 9, 1, 10, 7, 16561 }, //
{ 8, 10, 9, 0, 10, 10, 16568 }, //
{ 8, 10, 9, 0, 10, 10, 16578 }, //
{ 9, 10, 9, 0, 10, 12, 16588 }, //
{ 7, 10, 9, 1, 10, 9, 16600 }, //
{ 9, 10, 9, 0, 10, 12, 16609 }, //
{ 9, 10, 9, 0, 10, 12, 16621 }, //
{ 9, 10, 9, 0, 10, 12, 16633 }, //
{ 9, 10, 9, 0, 10, 12, 16645 }, //
{ 13, 17, 14, 1, 17, 28, 16657 }, //
{ 13, 17, 14, 1, 17, 28, 16685 }, // ₮
{ 14, 17, 14, 0, 17, 30, 16713 }, // ₴
{ 13, 17, 14, 1, 17, 28, 16743 }, // ₹
{ 13, 19, 15, 1, 19, 31, 16771 }, // ∂
{ 17, 17, 16, 0, 17, 37, 16802 }, // ∆
{ 14, 20, 17, 2, 17, 35, 16839 }, // ∏
{ 13, 20, 13, 0, 17, 33, 16874 }, // ∑
{ 12, 2, 14, 1, 8, 3, 16907 }, //
{ 13, 17, 4, -5, 17, 28, 16910 }, //
{ 4, 3, 6, 1, 9, 2, 16938 }, // ∙
{ 15, 20, 14, 0, 20, 38, 16940 }, // √
{ 14, 7, 15, 0, 11, 13, 16978 }, // ∞
{ 10, 24, 9, 0, 19, 30, 16991 }, // ∫
{ 12, 10, 14, 1, 13, 15, 17021 }, // ≈
{ 12, 13, 14, 1, 14, 20, 17036 }, // ≠
{ 12, 15, 14, 1, 15, 23, 17056 }, // ≤
{ 12, 15, 14, 1, 15, 23, 17079 }, // ≥
};
static const EpdUnicodeInterval ubuntu_12_regularIntervals[] = {
@@ -1666,28 +1694,31 @@ static const EpdUnicodeInterval ubuntu_12_regularIntervals[] = {
{ 0x2030, 0x2030, 0x228 },
{ 0x2039, 0x203A, 0x229 },
{ 0x2044, 0x2044, 0x22B },
{ 0x20AC, 0x20AC, 0x22C },
{ 0x20AE, 0x20AE, 0x22D },
{ 0x20B4, 0x20B4, 0x22E },
{ 0x20B9, 0x20B9, 0x22F },
{ 0x2202, 0x2202, 0x230 },
{ 0x2206, 0x2206, 0x231 },
{ 0x220F, 0x220F, 0x232 },
{ 0x2211, 0x2212, 0x233 },
{ 0x2215, 0x2215, 0x235 },
{ 0x2219, 0x221A, 0x236 },
{ 0x221E, 0x221E, 0x238 },
{ 0x222B, 0x222B, 0x239 },
{ 0x2248, 0x2248, 0x23A },
{ 0x2260, 0x2260, 0x23B },
{ 0x2264, 0x2265, 0x23C },
{ 0x2070, 0x2070, 0x22C },
{ 0x2074, 0x2079, 0x22D },
{ 0x2080, 0x2089, 0x233 },
{ 0x20AC, 0x20AC, 0x23D },
{ 0x20AE, 0x20AE, 0x23E },
{ 0x20B4, 0x20B4, 0x23F },
{ 0x20B9, 0x20B9, 0x240 },
{ 0x2202, 0x2202, 0x241 },
{ 0x2206, 0x2206, 0x242 },
{ 0x220F, 0x220F, 0x243 },
{ 0x2211, 0x2212, 0x244 },
{ 0x2215, 0x2215, 0x246 },
{ 0x2219, 0x221A, 0x247 },
{ 0x221E, 0x221E, 0x249 },
{ 0x222B, 0x222B, 0x24A },
{ 0x2248, 0x2248, 0x24B },
{ 0x2260, 0x2260, 0x24C },
{ 0x2264, 0x2265, 0x24D },
};
static const EpdFontData ubuntu_12_regular = {
ubuntu_12_regularBitmaps,
ubuntu_12_regularGlyphs,
ubuntu_12_regularIntervals,
35,
38,
29,
24,
-5,