src/hb-ot-cbdt-table.hh | 81 +++++++--- src/hb-ot-font.cc | 56 +++--- test/shaping/Makefile.am | 1 test/shaping/fonts/sha1sum/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf |binary test/shaping/tests/color-fonts.tests | 1 5 files changed, 88 insertions(+), 51 deletions(-)
New commits: commit 9f6144cdb9dd2bc8cd147306e678d76ae82663d8 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 4 19:55:17 2016 -0800 [CBDT] Add test for fetching glyph extents diff --git a/test/shaping/Makefile.am b/test/shaping/Makefile.am index c5efe62..57369fd 100644 --- a/test/shaping/Makefile.am +++ b/test/shaping/Makefile.am @@ -44,6 +44,7 @@ TESTS = \ tests/arabic-fallback-shaping.tests \ tests/arabic-feature-order.tests \ tests/cluster.tests \ + tests/color-fonts.tests \ tests/context-matching.tests \ tests/cursive-positioning.tests \ tests/default-ignorables.tests \ diff --git a/test/shaping/fonts/sha1sum/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf b/test/shaping/fonts/sha1sum/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf new file mode 100644 index 0000000..fa2d0e1 Binary files /dev/null and b/test/shaping/fonts/sha1sum/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf differ diff --git a/test/shaping/tests/color-fonts.tests b/test/shaping/tests/color-fonts.tests new file mode 100644 index 0000000..397796a --- /dev/null +++ b/test/shaping/tests/color-fonts.tests @@ -0,0 +1 @@ +fonts/sha1sum/ee39587d13b2afa5499cc79e45780aa79293bbd4.ttf:--font-funcs=ot --show-extents:U+1F42F:[gid1=0+2963<0,2178,2963,-2788>] commit e4bfccfb2a0f425ff69b0a50ca8a4731c4001069 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 4 19:43:33 2016 -0800 [CBDT] Minor diff --git a/src/hb-ot-cbdt-table.hh b/src/hb-ot-cbdt-table.hh index 7269688..52897ab 100644 --- a/src/hb-ot-cbdt-table.hh +++ b/src/hb-ot-cbdt-table.hh @@ -56,6 +56,15 @@ struct SmallGlyphMetrics DEFINE_SIZE_STATIC(5); }; +struct BigGlyphMetrics : SmallGlyphMetrics +{ + CHAR vertBearingX; + CHAR vertBearingY; + BYTE vertAdvance; + + DEFINE_SIZE_STATIC(8); +}; + struct SBitLineMetrics { inline bool sanitize (hb_sanitize_context_t *c) const @@ -171,6 +180,7 @@ struct IndexSubtable IndexSubtableHeader header; IndexSubtableFormat1 format1; IndexSubtableFormat3 format3; + /* TODO: Format 2, 4, 5. */ } u; public: DEFINE_SIZE_UNION (8, header); @@ -321,7 +331,6 @@ struct CBLC { /* TODO: Make it possible to select strike. */ - const BitmapSizeTable *sizeTable = &Null(BitmapSizeTable); unsigned int count = sizeTables.len; for (uint32_t i = 0; i < count; ++i) { @@ -329,15 +338,13 @@ struct CBLC unsigned int endGlyphIndex = sizeTables.array[i].endGlyphIndex; if (startGlyphIndex <= glyph && glyph <= endGlyphIndex) { - sizeTable = &sizeTables[i]; - break; + *x_ppem = sizeTables[i].ppemX; + *y_ppem = sizeTables[i].ppemY; + return sizeTables[i].find_table (glyph, this); } } - *x_ppem = sizeTable->ppemX; - *y_ppem = sizeTable->ppemY; - - return sizeTable->find_table (glyph, this); + return NULL; } protected: diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 1b6cea4..df01bc9 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -246,14 +246,12 @@ struct hb_ot_face_cbdt_accelerator_t { unsigned int x_ppem = upem, y_ppem = upem; /* TODO Use font ppem if available. */ - if (cblc == NULL) { + if (cblc == NULL) return false; // Not a color bitmap font. - } const OT::IndexSubtableRecord *subtable_record = this->cblc->find_table(glyph, &x_ppem, &y_ppem); - if (subtable_record == NULL) { + if (subtable_record == NULL) return false; - } if (subtable_record->get_extents (extents)) return true; @@ -262,23 +260,27 @@ struct hb_ot_face_cbdt_accelerator_t if (!subtable_record->get_image_data (glyph, &image_offset, &image_length, &image_format)) return false; - if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length)) - return false; - - switch (image_format) { - case 17: { - if (unlikely (image_length < OT::GlyphBitmapDataFormat17::min_size)) - return false; + /* TODO Move the following into CBDT struct when adding more formats. */ - const OT::GlyphBitmapDataFormat17& glyphFormat17 = - OT::StructAtOffset<OT::GlyphBitmapDataFormat17> (this->cbdt, image_offset); - glyphFormat17.glyphMetrics.get_extents (extents); - } - break; - default: - // TODO: Support other image formats. + if (unlikely (image_offset > cbdt_len || cbdt_len - image_offset < image_length)) return false; + + switch (image_format) + { + case 17: { + if (unlikely (image_length < OT::GlyphBitmapDataFormat17::min_size)) + return false; + + const OT::GlyphBitmapDataFormat17& glyphFormat17 = + OT::StructAtOffset<OT::GlyphBitmapDataFormat17> (this->cbdt, image_offset); + glyphFormat17.glyphMetrics.get_extents (extents); + } + break; + default: + // TODO: Support other image formats. + return false; + } } /* Convert to the font units. */ commit b7068af423dba30fd831041aabf4b805d26fe349 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 4 19:36:30 2016 -0800 [CBDT] Fix thinko! diff --git a/src/hb-ot-cbdt-table.hh b/src/hb-ot-cbdt-table.hh index 3bf5794..7269688 100644 --- a/src/hb-ot-cbdt-table.hh +++ b/src/hb-ot-cbdt-table.hh @@ -216,7 +216,7 @@ struct IndexSubtableArray inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const { TRACE_SANITIZE (this); - if (unlikely (!c->check_array (&indexSubtablesZ, indexSubtablesZ[0].static_size, sizeof (count)))) + if (unlikely (!c->check_array (&indexSubtablesZ, indexSubtablesZ[0].static_size, count))) return_trace (false); for (unsigned int i = 0; i < count; i++) if (unlikely (!indexSubtablesZ[i].sanitize (c, this))) commit a141d1da9bb0f91521a9a7749f9533c75cfe6a2f Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 4 19:26:54 2016 -0800 [CBDT] Implement IndexSubtableFormat3 diff --git a/src/hb-ot-cbdt-table.hh b/src/hb-ot-cbdt-table.hh index 4770cf3..3bf5794 100644 --- a/src/hb-ot-cbdt-table.hh +++ b/src/hb-ot-cbdt-table.hh @@ -100,7 +100,8 @@ struct IndexSubtableHeader DEFINE_SIZE_STATIC(8); }; -struct IndexSubtableFormat1 +template <typename OffsetType> +struct IndexSubtableFormat1Or3 { inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const { @@ -122,11 +123,14 @@ struct IndexSubtableFormat1 } IndexSubtableHeader header; - Offset<ULONG> offsetArrayZ[VAR]; + Offset<OffsetType> offsetArrayZ[VAR]; DEFINE_SIZE_ARRAY(8, offsetArrayZ); }; +struct IndexSubtableFormat1 : IndexSubtableFormat1Or3<ULONG> {}; +struct IndexSubtableFormat3 : IndexSubtableFormat1Or3<USHORT> {}; + struct IndexSubtable { inline bool sanitize (hb_sanitize_context_t *c, unsigned int glyph_count) const @@ -135,6 +139,7 @@ struct IndexSubtable if (!u.header.sanitize (c)) return_trace (false); switch (u.header.indexFormat) { case 1: return_trace (u.format1.sanitize (c, glyph_count)); + case 3: return_trace (u.format3.sanitize (c, glyph_count)); default:return_trace (true); } } @@ -156,6 +161,7 @@ struct IndexSubtable *format = u.header.imageFormat; switch (u.header.indexFormat) { case 1: return u.format1.get_image_data (idx, offset, length); + case 3: return u.format3.get_image_data (idx, offset, length); default: return false; } } @@ -164,6 +170,7 @@ struct IndexSubtable union { IndexSubtableHeader header; IndexSubtableFormat1 format1; + IndexSubtableFormat3 format3; } u; public: DEFINE_SIZE_UNION (8, header); commit 9eda74c92c9024ffb8ec6e9344c99d51dd763f0c Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 4 19:12:52 2016 -0800 [cbdt] Move some more code around diff --git a/src/hb-ot-cbdt-table.hh b/src/hb-ot-cbdt-table.hh index 2043a25..4770cf3 100644 --- a/src/hb-ot-cbdt-table.hh +++ b/src/hb-ot-cbdt-table.hh @@ -80,9 +80,11 @@ struct SBitLineMetrics DEFINE_SIZE_STATIC(12); }; + /* * Index Subtables. */ + struct IndexSubtableHeader { inline bool sanitize (hb_sanitize_context_t *c) const @@ -202,19 +204,6 @@ struct IndexSubtableRecord DEFINE_SIZE_STATIC(8); }; -/* - * Glyph Bitmap Data Formats. - */ - -struct GlyphBitmapDataFormat17 -{ - SmallGlyphMetrics glyphMetrics; - ULONG dataLen; - BYTE dataZ[VAR]; - - DEFINE_SIZE_ARRAY(9, dataZ); -}; - struct IndexSubtableArray { inline bool sanitize (hb_sanitize_context_t *c, unsigned int count) const @@ -251,6 +240,8 @@ struct IndexSubtableArray struct BitmapSizeTable { + friend struct CBLC; + inline bool sanitize (hb_sanitize_context_t *c, const void *base) const { TRACE_SANITIZE (this); @@ -261,6 +252,12 @@ struct BitmapSizeTable vertical.sanitize (c)); } + const IndexSubtableRecord *find_table (hb_codepoint_t glyph, const void *base) const + { + return (base+indexSubtableArrayOffset).find_table (glyph, numberOfIndexSubtables); + } + + protected: OffsetTo<IndexSubtableArray, ULONG> indexSubtableArrayOffset; ULONG indexTablesSize; ULONG numberOfIndexSubtables; @@ -274,9 +271,25 @@ struct BitmapSizeTable BYTE bitDepth; CHAR flags; +public: DEFINE_SIZE_STATIC(48); }; + +/* + * Glyph Bitmap Data Formats. + */ + +struct GlyphBitmapDataFormat17 +{ + SmallGlyphMetrics glyphMetrics; + ULONG dataLen; + BYTE dataZ[VAR]; + + DEFINE_SIZE_ARRAY(9, dataZ); +}; + + /* * CBLC -- Color Bitmap Location Table */ @@ -296,18 +309,28 @@ struct CBLC } public: - const BitmapSizeTable* find_table (hb_codepoint_t glyph) const + const IndexSubtableRecord *find_table (hb_codepoint_t glyph, + unsigned int *x_ppem, unsigned int *y_ppem) const { - // TODO: Make it possible to select strike. + /* TODO: Make it possible to select strike. */ + + const BitmapSizeTable *sizeTable = &Null(BitmapSizeTable); unsigned int count = sizeTables.len; - for (uint32_t i = 0; i < count; ++i) { + for (uint32_t i = 0; i < count; ++i) + { unsigned int startGlyphIndex = sizeTables.array[i].startGlyphIndex; unsigned int endGlyphIndex = sizeTables.array[i].endGlyphIndex; - if (startGlyphIndex <= glyph && glyph <= endGlyphIndex) { - return &sizeTables[i]; + if (startGlyphIndex <= glyph && glyph <= endGlyphIndex) + { + sizeTable = &sizeTables[i]; + break; } } - return NULL; + + *x_ppem = sizeTable->ppemX; + *y_ppem = sizeTable->ppemY; + + return sizeTable->find_table (glyph, this); } protected: diff --git a/src/hb-ot-font.cc b/src/hb-ot-font.cc index 1a2d382..1b6cea4 100644 --- a/src/hb-ot-font.cc +++ b/src/hb-ot-font.cc @@ -244,17 +244,13 @@ struct hb_ot_face_cbdt_accelerator_t inline bool get_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) const { + unsigned int x_ppem = upem, y_ppem = upem; /* TODO Use font ppem if available. */ + if (cblc == NULL) { return false; // Not a color bitmap font. } - const OT::BitmapSizeTable* sizeTable = this->cblc->find_table(glyph); - if (sizeTable == NULL) { - return false; - } - - const OT::IndexSubtableArray& subtables = this->cblc + sizeTable->indexSubtableArrayOffset; - const OT::IndexSubtableRecord *subtable_record = subtables.find_table (glyph, sizeTable->numberOfIndexSubtables); + const OT::IndexSubtableRecord *subtable_record = this->cblc->find_table(glyph, &x_ppem, &y_ppem); if (subtable_record == NULL) { return false; } @@ -286,10 +282,10 @@ struct hb_ot_face_cbdt_accelerator_t } /* Convert to the font units. */ - extents->x_bearing *= upem / (float)(sizeTable->ppemX); - extents->y_bearing *= upem / (float)(sizeTable->ppemY); - extents->width *= upem / (float)(sizeTable->ppemX); - extents->height *= upem / (float)(sizeTable->ppemY); + extents->x_bearing *= upem / (float) x_ppem; + extents->y_bearing *= upem / (float) y_ppem; + extents->width *= upem / (float) x_ppem; + extents->height *= upem / (float) y_ppem; return true; } commit 654f9ab0d8d5ee032b5da763e34e7b1f454416b9 Author: Behdad Esfahbod <beh...@behdad.org> Date: Sun Dec 4 18:56:24 2016 -0800 [cbdt] Fix sign bug Was introduced in d495fc5e38038f4cfb20425b1109324fa70bf2f9 diff --git a/src/hb-ot-cbdt-table.hh b/src/hb-ot-cbdt-table.hh index 4319067..2043a25 100644 --- a/src/hb-ot-cbdt-table.hh +++ b/src/hb-ot-cbdt-table.hh @@ -44,7 +44,7 @@ struct SmallGlyphMetrics extents->x_bearing = bearingX; extents->y_bearing = bearingY; extents->width = width; - extents->height = height; + extents->height = -height; } BYTE height; _______________________________________________ HarfBuzz mailing list HarfBuzz@lists.freedesktop.org https://lists.freedesktop.org/mailman/listinfo/harfbuzz