diff --git a/src/hb-ot-cbdt-table.hh b/src/hb-ot-cbdt-table.hh index 7269688ee..52897abd3 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 1b6cea438..df01bc9fa 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 (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 (this->cbdt, image_offset); + glyphFormat17.glyphMetrics.get_extents (extents); + } + break; + default: + // TODO: Support other image formats. + return false; + } } /* Convert to the font units. */