diff --git a/assets/fonts/glyph_pack.json b/assets/fonts/glyph_pack.json index 9e02274..6158287 100644 --- a/assets/fonts/glyph_pack.json +++ b/assets/fonts/glyph_pack.json @@ -47,6 +47,24 @@ "size": 26, "max_bitmap": 320, "ranges": [[32, 126], [160, 255], [1024, 1119], [1168, 1169], [8211, 8212], [8216, 8217], [8220, 8221], [8226, 8226], [8230, 8230], [8250, 8250], [8364, 8364], [8482, 8482], [9733, 9733], [10003, 10003]] + }, + { + "name": "cjk_22_a", + "file": "noto-cjk/NotoSansCJKsc-Regular.otf", + "size": 22, + "max_bitmap": 256, + "ranges": [[12288, 12329], [12336, 12336], [12342, 12351], [12353, 12438], [12443, 12543]], + "codecs": [["gb2312", 176, 247], ["euc_jp", 176, 244]], + "codec_ranges": [[19968, 32255]] + }, + { + "name": "cjk_22_b", + "file": "noto-cjk/NotoSansCJKsc-Regular.otf", + "size": 22, + "max_bitmap": 256, + "ranges": [[65281, 65374]], + "codecs": [["euc_kr", 176, 200], ["gb2312", 176, 247], ["euc_jp", 176, 244]], + "codec_ranges": [[32256, 40959], [44032, 55203]] } ] } diff --git a/src/gfx/font.c b/src/gfx/font.c index e9eac9e..6e6e693 100644 --- a/src/gfx/font.c +++ b/src/gfx/font.c @@ -30,11 +30,20 @@ static const Glyph *search(const Font *font, uint32_t codepoint) return NULL; } +static uint32_t pack_face_of(const Font *font, uint32_t codepoint) +{ + if (codepoint < FONT_PACK_CJK_START) { + return font->pack_face; + } + return codepoint < FONT_PACK_CJK_SPLIT ? FONT_PACK_CJK_FACE : FONT_PACK_CJK_FACE + 1u; +} + const Glyph *font_find_glyph(const Font *font, uint32_t codepoint) { const Glyph *glyph = search(font, codepoint); - if (glyph == NULL && font->pack_face != 0) { - glyph = font_pack_find(font->pack_face - 1u, codepoint); + uint32_t face = pack_face_of(font, codepoint); + if (glyph == NULL && face != 0) { + glyph = font_pack_find(face - 1u, codepoint); } return glyph != NULL ? glyph : search(font, FONT_FALLBACK_CODEPOINT); } diff --git a/src/gfx/include/gfx/font_pack.h b/src/gfx/include/gfx/font_pack.h index f8af387..e8b1554 100644 --- a/src/gfx/include/gfx/font_pack.h +++ b/src/gfx/include/gfx/font_pack.h @@ -7,15 +7,18 @@ #include "gfx/font.h" enum { - FONT_PACK_FACES = 7, + FONT_PACK_FACES = 9, FONT_PACK_MAX_BITMAP = 320, FONT_PACK_HEADER_BYTES = 32, FONT_PACK_ENTRY_BYTES = 12, FONT_PACK_ENTRIES_PER_SECTOR = 42, FONT_PACK_SECTOR_BYTES = 512, - FONT_PACK_MAX_DIRECTORY = 8, + FONT_PACK_MAX_DIRECTORY = 160, FONT_PACK_WAYS = 4, - FONT_PACK_VERSION = 1 + FONT_PACK_VERSION = 1, + FONT_PACK_CJK_FACE = 8, + FONT_PACK_CJK_START = 0x2E80, + FONT_PACK_CJK_SPLIT = 0x7E00 }; typedef struct FontPackReader { diff --git a/tools/glyph_pack.py b/tools/glyph_pack.py index f5c933e..3efb707 100644 --- a/tools/glyph_pack.py +++ b/tools/glyph_pack.py @@ -28,7 +28,7 @@ SECTOR_BYTES = 512 ENTRY = struct.Struct("