diff options
author | Adrian Johnson <ajohnson@redneon.com> | 2016-07-17 21:33:12 +0930 |
---|---|---|
committer | Adrian Johnson <ajohnson@redneon.com> | 2016-07-17 21:33:12 +0930 |
commit | 8a921e6c3ee1cbd7353cd28c23802cfef3e48224 (patch) | |
tree | e3661f79d0b6e09022ec7a496a6132669b534761 /src/cairo-truetype-subset.c | |
parent | 16a8c13b6acad62c8844bf641c1296a9f4aac09d (diff) | |
download | cairo-8a921e6c3ee1cbd7353cd28c23802cfef3e48224.tar.gz |
truetype: reverse cmap search should end when 0xffff- 0xffff range reached
Diffstat (limited to 'src/cairo-truetype-subset.c')
-rw-r--r-- | src/cairo-truetype-subset.c | 21 |
1 files changed, 15 insertions, 6 deletions
diff --git a/src/cairo-truetype-subset.c b/src/cairo-truetype-subset.c index f47b966a5..afd396e1b 100644 --- a/src/cairo-truetype-subset.c +++ b/src/cairo-truetype-subset.c @@ -1309,11 +1309,14 @@ _cairo_truetype_reverse_cmap (cairo_scaled_font_t *scaled_font, /* search for glyph in segments with rangeOffset=0 */ for (i = 0; i < num_segments; i++) { + uint16_t start = be16_to_cpu (start_code[i]); + uint16_t end = be16_to_cpu (end_code[i]); + + if (start == 0xffff && end == 0xffff) + break; + c = index - be16_to_cpu (delta[i]); - if (range_offset[i] == 0 && - c >= be16_to_cpu (start_code[i]) && - c <= be16_to_cpu (end_code[i])) - { + if (range_offset[i] == 0 && c >= start && c <= end) { *ucs4 = c; goto found; } @@ -1321,9 +1324,15 @@ _cairo_truetype_reverse_cmap (cairo_scaled_font_t *scaled_font, /* search for glyph in segments with rangeOffset=1 */ for (i = 0; i < num_segments; i++) { + uint16_t start = be16_to_cpu (start_code[i]); + uint16_t end = be16_to_cpu (end_code[i]); + + if (start == 0xffff && end == 0xffff) + break; + if (range_offset[i] != 0) { uint16_t *glyph_ids = &range_offset[i] + be16_to_cpu (range_offset[i])/2; - int range_size = be16_to_cpu (end_code[i]) - be16_to_cpu (start_code[i]) + 1; + int range_size = end - start + 1; uint16_t g_id_be = cpu_to_be16 (index); int j; @@ -1333,7 +1342,7 @@ _cairo_truetype_reverse_cmap (cairo_scaled_font_t *scaled_font, for (j = 0; j < range_size; j++) { if (glyph_ids[j] == g_id_be) { - *ucs4 = be16_to_cpu (start_code[i]) + j; + *ucs4 = start + j; goto found; } } |