bool is_cff = data->tables.lsearch (HB_TAG ('C','F','F',' ')) || data->tables.lsearch (HB_TAG ('C','F','F','2'));
hb_tag_t sfnt_tag = is_cff ? OT::OpenTypeFontFile::CFFTag : OT::OpenTypeFontFile::TrueTypeTag;
- Supplier<hb_tag_t> tags_supplier (&data->tables[0].tag, table_count, data->tables.item_size);
- Supplier<hb_blob_t *> blobs_supplier (&data->tables[0].blob, table_count, data->tables.item_size);
+ Supplier<hb_face_builder_data_t::table_entry_t> supplier (data->tables);
bool ret = f->serialize_single (&c,
sfnt_tag,
- tags_supplier,
- blobs_supplier,
+ supplier,
table_count);
c.end_serialize ();
public:
+ template <typename item_t>
bool serialize (hb_serialize_context_t *c,
hb_tag_t sfnt_tag,
- Supplier<hb_tag_t> &tags,
- Supplier<hb_blob_t *> &blobs,
+ Supplier<item_t> &items,
unsigned int table_count)
{
TRACE_SERIALIZE (this);
for (unsigned int i = 0; i < table_count; i++)
{
TableRecord &rec = tables.arrayZ[i];
- hb_blob_t *blob = blobs[i];
- rec.tag.set (tags[i]);
+ hb_blob_t *blob = items[i].blob;
+ rec.tag.set (items[i].tag);
rec.length.set (hb_blob_get_length (blob));
rec.offset.serialize (c, this);
c->align (4);
const char *end = (const char *) c->head;
- if (tags[i] == HB_OT_TAG_head && end - start >= head::static_size)
+ if (items[i].tag == HB_OT_TAG_head && end - start >= head::static_size)
{
head *h = (head *) start;
checksum_adjustment = &h->checkSumAdjustment;
rec.checkSum.set_for_data (start, end - start);
}
- tags += table_count;
- blobs += table_count;
+ items += table_count;
tables.qsort ();
}
}
+ template <typename item_t>
bool serialize_single (hb_serialize_context_t *c,
hb_tag_t sfnt_tag,
- Supplier<hb_tag_t> &tags,
- Supplier<hb_blob_t *> &blobs,
+ Supplier<item_t> &items,
unsigned int table_count)
{
TRACE_SERIALIZE (this);
assert (sfnt_tag != TTCTag);
if (unlikely (!c->extend_min (*this))) return_trace (false);
- return_trace (u.fontFace.serialize (c, sfnt_tag, tags, blobs, table_count));
+ return_trace (u.fontFace.serialize (c, sfnt_tag, items, table_count));
}
bool sanitize (hb_sanitize_context_t *c) const
template <typename T> explicit_operator T * (void) { return arrayZ(); }
template <typename T> explicit_operator const T * (void) const { return arrayZ(); }
operator hb_array_t<Type> (void) { return as_array (); }
- operator hb_array_t<const Type> (void) const { as_array (); }
+ operator hb_array_t<const Type> (void) const { return as_array (); }
Type * operator + (unsigned int i) { return arrayZ() + i; }
const Type * operator + (unsigned int i) const { return arrayZ() + i; }