diff options
author | John-Mark Bell <jmb@netsurf-browser.org> | 2021-08-08 19:37:31 +0100 |
---|---|---|
committer | John-Mark Bell <jmb@netsurf-browser.org> | 2021-08-09 23:59:34 +0100 |
commit | 5be9bd8e833c84dbd55511046657e2fcf678d03c (patch) | |
tree | 7c166d3e92ca2fc360976b7135370199e75342a1 /src/rufl_init.c | |
parent | 6f212ee62e6cc19cb686208dd5b510d01217d0af (diff) | |
download | librufl-5be9bd8e833c84dbd55511046657e2fcf678d03c.tar.gz librufl-5be9bd8e833c84dbd55511046657e2fcf678d03c.tar.bz2 |
Include extension plane data in RUfl_cache
This requires us to bump the cache version, as it is a breaking
change.
Diffstat (limited to 'src/rufl_init.c')
-rw-r--r-- | src/rufl_init.c | 109 |
1 files changed, 78 insertions, 31 deletions
diff --git a/src/rufl_init.c b/src/rufl_init.c index 7f6a2ac..d12fac0 100644 --- a/src/rufl_init.c +++ b/src/rufl_init.c @@ -1424,7 +1424,10 @@ rufl_code rufl_save_cache(void) } for (i = 0; i != rufl_font_list_entries; i++) { - if (!rufl_font_list[i].charset) + const struct rufl_character_set *charset = + rufl_font_list[i].charset; + + if (!charset) continue; /* length of font identifier */ @@ -1442,9 +1445,26 @@ rufl_code rufl_save_cache(void) return rufl_OK; } - /* character set */ - if (fwrite(rufl_font_list[i].charset, - PLANE_SIZE(rufl_font_list[i].charset->metadata), + /* character set (all planes) */ + LOG("writing character sets for %s", + rufl_font_list[i].identifier); + while (EXTENSION_FOLLOWS(charset->metadata)) { + LOG("writing plane %d (%u)", + PLANE_ID(charset->metadata), + PLANE_SIZE(charset->metadata)); + if (fwrite(charset, PLANE_SIZE(charset->metadata), + 1, fp) != 1) { + LOG("fwrite: 0x%x: %s", errno, strerror(errno)); + fclose(fp); + return rufl_OK; + } + charset = (void *)(((uint8_t *)charset) + + PLANE_SIZE(charset->metadata)); + } + LOG("writing plane %d (%u)", + PLANE_ID(charset->metadata), + PLANE_SIZE(charset->metadata)); + if (fwrite(charset, PLANE_SIZE(charset->metadata), 1, fp) != 1) { LOG("fwrite: 0x%x: %s", errno, strerror(errno)); fclose(fp); @@ -1528,10 +1548,11 @@ rufl_code rufl_load_cache(void) unsigned int i = 0; bool old_font_manager; char *identifier; - size_t len, size; + size_t len, size = 0; + uint32_t metadata; FILE *fp; struct rufl_font_list_entry *entry; - struct rufl_character_set *charset; + struct rufl_character_set *charset = NULL, *cur_charset; struct rufl_unicode_map *umap = NULL; unsigned int num_umaps = 0; @@ -1603,33 +1624,56 @@ rufl_code rufl_load_cache(void) identifier[len] = 0; /* character set */ - if (fread(&size, sizeof size, 1, fp) != 1) { - if (feof(fp)) - LOG("fread: %s", "unexpected eof"); - else - LOG("fread: 0x%x: %s", errno, strerror(errno)); - free(identifier); - break; - } + LOG("reading character sets for %s", identifier); + do { + if (fread(&metadata, sizeof metadata, 1, fp) != 1) { + if (feof(fp)) + LOG("fread: %s", "unexpected eof"); + else + LOG("fread: 0x%x: %s", + errno, strerror(errno)); + free(identifier); + break; + } - charset = malloc(size); - if (!charset) { - LOG("malloc(%zu) failed", size); - free(identifier); - fclose(fp); - return rufl_OUT_OF_MEMORY; - } + LOG("reading plane %d (%u)", + PLANE_ID(metadata), + PLANE_SIZE(metadata)); + if (!charset) { + charset = cur_charset = malloc( + PLANE_SIZE(metadata)); + } else { + struct rufl_character_set *c2 = realloc(charset, + size + PLANE_SIZE(metadata)); + if (!c2) { + free(charset); + } + charset = c2; + cur_charset = (void *)(((uint8_t *) charset) + + size); + } + if (!charset) { + LOG("malloc(%zu) failed", size); + free(identifier); + fclose(fp); + return rufl_OUT_OF_MEMORY; + } - charset->metadata = size; - if (fread(charset->index, size - sizeof size, 1, fp) != 1) { - if (feof(fp)) - LOG("fread: %s", "unexpected eof"); - else - LOG("fread: 0x%x: %s", errno, strerror(errno)); - free(charset); - free(identifier); - break; - } + size += PLANE_SIZE(metadata); + cur_charset->metadata = metadata; + if (fread(cur_charset->index, + PLANE_SIZE(metadata) - sizeof metadata, + 1, fp) != 1) { + if (feof(fp)) + LOG("fread: %s", "unexpected eof"); + else + LOG("fread: 0x%x: %s", + errno, strerror(errno)); + free(charset); + free(identifier); + break; + } + } while(EXTENSION_FOLLOWS(cur_charset->metadata)); /* unicode map */ if (rufl_old_font_manager) { @@ -1761,6 +1805,9 @@ rufl_code rufl_load_cache(void) free(charset); } + charset = NULL; + size = 0; + free(identifier); } fclose(fp); |