commit
865d174706
|
@ -339,7 +339,7 @@ struct ColorStop
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
auto *out = c->serializer->embed (*this);
|
auto *out = c->serializer->embed (*this);
|
||||||
if (unlikely (!out)) return_trace (false);
|
if (unlikely (!out)) return_trace (false);
|
||||||
return_trace (c->serializer->check_assign (out->paletteIndex, c->plan->colr_palettes->get (paletteIndex),
|
return_trace (c->serializer->check_assign (out->paletteIndex, c->plan->colr_palettes.get (paletteIndex),
|
||||||
HB_SERIALIZE_ERROR_INT_OVERFLOW));
|
HB_SERIALIZE_ERROR_INT_OVERFLOW));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -550,7 +550,7 @@ struct PaintColrLayers
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
auto *out = c->serializer->embed (this);
|
auto *out = c->serializer->embed (this);
|
||||||
if (unlikely (!out)) return_trace (false);
|
if (unlikely (!out)) return_trace (false);
|
||||||
return_trace (c->serializer->check_assign (out->firstLayerIndex, c->plan->colrv1_layers->get (firstLayerIndex),
|
return_trace (c->serializer->check_assign (out->firstLayerIndex, c->plan->colrv1_layers.get (firstLayerIndex),
|
||||||
HB_SERIALIZE_ERROR_INT_OVERFLOW));
|
HB_SERIALIZE_ERROR_INT_OVERFLOW));
|
||||||
|
|
||||||
return_trace (true);
|
return_trace (true);
|
||||||
|
@ -581,7 +581,7 @@ struct PaintSolid
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
auto *out = c->serializer->embed (*this);
|
auto *out = c->serializer->embed (*this);
|
||||||
if (unlikely (!out)) return_trace (false);
|
if (unlikely (!out)) return_trace (false);
|
||||||
return_trace (c->serializer->check_assign (out->paletteIndex, c->plan->colr_palettes->get (paletteIndex),
|
return_trace (c->serializer->check_assign (out->paletteIndex, c->plan->colr_palettes.get (paletteIndex),
|
||||||
HB_SERIALIZE_ERROR_INT_OVERFLOW));
|
HB_SERIALIZE_ERROR_INT_OVERFLOW));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1456,7 +1456,7 @@ struct ClipList
|
||||||
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
||||||
if (!c->serializer->check_assign (out->format, format, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false);
|
if (!c->serializer->check_assign (out->format, format, HB_SERIALIZE_ERROR_INT_OVERFLOW)) return_trace (false);
|
||||||
|
|
||||||
const hb_set_t& glyphset = *c->plan->_glyphset_colred;
|
const hb_set_t& glyphset = c->plan->_glyphset_colred;
|
||||||
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
||||||
|
|
||||||
hb_map_t new_gid_offset_map;
|
hb_map_t new_gid_offset_map;
|
||||||
|
@ -1641,7 +1641,7 @@ struct BaseGlyphList : SortedArray32Of<BaseGlyphPaintRecord>
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
auto *out = c->serializer->start_embed (this);
|
auto *out = c->serializer->start_embed (this);
|
||||||
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
||||||
const hb_set_t* glyphset = c->plan->_glyphset_colred;
|
const hb_set_t* glyphset = &c->plan->_glyphset_colred;
|
||||||
|
|
||||||
for (const auto& _ : as_array ())
|
for (const auto& _ : as_array ())
|
||||||
{
|
{
|
||||||
|
@ -1882,7 +1882,7 @@ struct COLR
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
|
|
||||||
const hb_map_t &reverse_glyph_map = *c->plan->reverse_glyph_map;
|
const hb_map_t &reverse_glyph_map = *c->plan->reverse_glyph_map;
|
||||||
const hb_set_t& glyphset = *c->plan->_glyphset_colred;
|
const hb_set_t& glyphset = c->plan->_glyphset_colred;
|
||||||
|
|
||||||
auto base_it =
|
auto base_it =
|
||||||
+ hb_range (c->plan->num_output_glyphs ())
|
+ hb_range (c->plan->num_output_glyphs ())
|
||||||
|
@ -1931,7 +1931,7 @@ struct COLR
|
||||||
if (unlikely (!c->plan->new_gid_for_old_gid (out_layers[i].glyphId, &new_gid)))
|
if (unlikely (!c->plan->new_gid_for_old_gid (out_layers[i].glyphId, &new_gid)))
|
||||||
return hb_pair_t<bool, hb_vector_t<LayerRecord>> (false, out_layers);
|
return hb_pair_t<bool, hb_vector_t<LayerRecord>> (false, out_layers);
|
||||||
out_layers[i].glyphId = new_gid;
|
out_layers[i].glyphId = new_gid;
|
||||||
out_layers[i].colorIdx = c->plan->colr_palettes->get (layers[i].colorIdx);
|
out_layers[i].colorIdx = c->plan->colr_palettes.get (layers[i].colorIdx);
|
||||||
}
|
}
|
||||||
|
|
||||||
return hb_pair_t<bool, hb_vector_t<LayerRecord>> (true, out_layers);
|
return hb_pair_t<bool, hb_vector_t<LayerRecord>> (true, out_layers);
|
||||||
|
|
|
@ -239,7 +239,7 @@ struct CPAL
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
if (!numPalettes) return_trace (false);
|
if (!numPalettes) return_trace (false);
|
||||||
|
|
||||||
const hb_map_t *color_index_map = c->plan->colr_palettes;
|
const hb_map_t *color_index_map = &c->plan->colr_palettes;
|
||||||
if (color_index_map->is_empty ()) return_trace (false);
|
if (color_index_map->is_empty ()) return_trace (false);
|
||||||
|
|
||||||
hb_set_t retained_color_indices;
|
hb_set_t retained_color_indices;
|
||||||
|
|
|
@ -51,9 +51,9 @@ struct AnchorFormat3
|
||||||
if (unlikely (!c->serializer->embed (yCoordinate))) return_trace (false);
|
if (unlikely (!c->serializer->embed (yCoordinate))) return_trace (false);
|
||||||
|
|
||||||
unsigned x_varidx = xDeviceTable ? (this+xDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
|
unsigned x_varidx = xDeviceTable ? (this+xDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
|
||||||
if (c->plan->layout_variation_idx_delta_map->has (x_varidx))
|
if (c->plan->layout_variation_idx_delta_map.has (x_varidx))
|
||||||
{
|
{
|
||||||
int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (x_varidx));
|
int delta = hb_second (c->plan->layout_variation_idx_delta_map.get (x_varidx));
|
||||||
if (delta != 0)
|
if (delta != 0)
|
||||||
{
|
{
|
||||||
if (!c->serializer->check_assign (out->xCoordinate, xCoordinate + delta,
|
if (!c->serializer->check_assign (out->xCoordinate, xCoordinate + delta,
|
||||||
|
@ -63,9 +63,9 @@ struct AnchorFormat3
|
||||||
}
|
}
|
||||||
|
|
||||||
unsigned y_varidx = yDeviceTable ? (this+yDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
|
unsigned y_varidx = yDeviceTable ? (this+yDeviceTable).get_variation_index () : HB_OT_LAYOUT_NO_VARIATIONS_INDEX;
|
||||||
if (c->plan->layout_variation_idx_delta_map->has (y_varidx))
|
if (c->plan->layout_variation_idx_delta_map.has (y_varidx))
|
||||||
{
|
{
|
||||||
int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (y_varidx));
|
int delta = hb_second (c->plan->layout_variation_idx_delta_map.get (y_varidx));
|
||||||
if (delta != 0)
|
if (delta != 0)
|
||||||
{
|
{
|
||||||
if (!c->serializer->check_assign (out->yCoordinate, yCoordinate + delta,
|
if (!c->serializer->check_assign (out->yCoordinate, yCoordinate + delta,
|
||||||
|
@ -80,8 +80,8 @@ struct AnchorFormat3
|
||||||
if (!c->serializer->embed (xDeviceTable)) return_trace (false);
|
if (!c->serializer->embed (xDeviceTable)) return_trace (false);
|
||||||
if (!c->serializer->embed (yDeviceTable)) return_trace (false);
|
if (!c->serializer->embed (yDeviceTable)) return_trace (false);
|
||||||
|
|
||||||
out->xDeviceTable.serialize_copy (c->serializer, xDeviceTable, this, 0, hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map);
|
out->xDeviceTable.serialize_copy (c->serializer, xDeviceTable, this, 0, hb_serialize_context_t::Head, &c->plan->layout_variation_idx_delta_map);
|
||||||
out->yDeviceTable.serialize_copy (c->serializer, yDeviceTable, this, 0, hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map);
|
out->yDeviceTable.serialize_copy (c->serializer, yDeviceTable, this, 0, hb_serialize_context_t::Head, &c->plan->layout_variation_idx_delta_map);
|
||||||
return_trace (out);
|
return_trace (out);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -298,8 +298,8 @@ struct PairPosFormat2_4
|
||||||
for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map))
|
for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map))
|
||||||
{
|
{
|
||||||
unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2);
|
unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2);
|
||||||
valueFormat1.copy_values (c->serializer, out->valueFormat1, this, &values[idx], c->plan->layout_variation_idx_delta_map);
|
valueFormat1.copy_values (c->serializer, out->valueFormat1, this, &values[idx], &c->plan->layout_variation_idx_delta_map);
|
||||||
valueFormat2.copy_values (c->serializer, out->valueFormat2, this, &values[idx + len1], c->plan->layout_variation_idx_delta_map);
|
valueFormat2.copy_values (c->serializer, out->valueFormat2, this, &values[idx + len1], &c->plan->layout_variation_idx_delta_map);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -177,7 +177,7 @@ struct PairSet
|
||||||
newFormats,
|
newFormats,
|
||||||
len1,
|
len1,
|
||||||
&glyph_map,
|
&glyph_map,
|
||||||
c->plan->layout_variation_idx_delta_map
|
&c->plan->layout_variation_idx_delta_map
|
||||||
};
|
};
|
||||||
|
|
||||||
const PairValueRecord *record = &firstPairValueRecord;
|
const PairValueRecord *record = &firstPairValueRecord;
|
||||||
|
|
|
@ -144,7 +144,7 @@ struct SinglePosFormat1
|
||||||
;
|
;
|
||||||
|
|
||||||
bool ret = bool (it);
|
bool ret = bool (it);
|
||||||
SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned);
|
SinglePos_serialize (c->serializer, this, it, &c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned);
|
||||||
return_trace (ret);
|
return_trace (ret);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -163,7 +163,7 @@ struct SinglePosFormat2
|
||||||
;
|
;
|
||||||
|
|
||||||
bool ret = bool (it);
|
bool ret = bool (it);
|
||||||
SinglePos_serialize (c->serializer, this, it, c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned);
|
SinglePos_serialize (c->serializer, this, it, &c->plan->layout_variation_idx_delta_map, c->plan->all_axes_pinned);
|
||||||
return_trace (ret);
|
return_trace (ret);
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
|
@ -1414,7 +1414,7 @@ struct CmapSubtable
|
||||||
switch (format) {
|
switch (format) {
|
||||||
case 4: return u.format4.serialize (c, it);
|
case 4: return u.format4.serialize (c, it);
|
||||||
case 12: return u.format12.serialize (c, it);
|
case 12: return u.format12.serialize (c, it);
|
||||||
case 14: return u.format14.serialize (c, plan->unicodes, plan->glyphs_requested, plan->glyph_map, base);
|
case 14: return u.format14.serialize (c, plan->unicodes, &plan->glyphs_requested, plan->glyph_map, base);
|
||||||
default: return;
|
default: return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -156,19 +156,19 @@ struct hb_subset_layout_context_t :
|
||||||
{
|
{
|
||||||
if (tag_ == HB_OT_TAG_GSUB)
|
if (tag_ == HB_OT_TAG_GSUB)
|
||||||
{
|
{
|
||||||
lookup_index_map = c_->plan->gsub_lookups;
|
lookup_index_map = &c_->plan->gsub_lookups;
|
||||||
script_langsys_map = c_->plan->gsub_langsys;
|
script_langsys_map = &c_->plan->gsub_langsys;
|
||||||
feature_index_map = c_->plan->gsub_features;
|
feature_index_map = &c_->plan->gsub_features;
|
||||||
feature_substitutes_map = c_->plan->gsub_feature_substitutes_map;
|
feature_substitutes_map = &c_->plan->gsub_feature_substitutes_map;
|
||||||
feature_record_cond_idx_map = c_->plan->user_axes_location->is_empty () ? nullptr : c_->plan->gsub_feature_record_cond_idx_map;
|
feature_record_cond_idx_map = c_->plan->user_axes_location->is_empty () ? nullptr : &c_->plan->gsub_feature_record_cond_idx_map;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
lookup_index_map = c_->plan->gpos_lookups;
|
lookup_index_map = &c_->plan->gpos_lookups;
|
||||||
script_langsys_map = c_->plan->gpos_langsys;
|
script_langsys_map = &c_->plan->gpos_langsys;
|
||||||
feature_index_map = c_->plan->gpos_features;
|
feature_index_map = &c_->plan->gpos_features;
|
||||||
feature_substitutes_map = c_->plan->gpos_feature_substitutes_map;
|
feature_substitutes_map = &c_->plan->gpos_feature_substitutes_map;
|
||||||
feature_record_cond_idx_map = c_->plan->user_axes_location->is_empty () ? nullptr : c_->plan->gpos_feature_record_cond_idx_map;
|
feature_record_cond_idx_map = c_->plan->user_axes_location->is_empty () ? nullptr : &c_->plan->gpos_feature_record_cond_idx_map;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1145,7 +1145,7 @@ struct Script
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
if (!l->visitScript ()) return_trace (false);
|
if (!l->visitScript ()) return_trace (false);
|
||||||
if (tag && !c->plan->layout_scripts->has (*tag))
|
if (tag && !c->plan->layout_scripts.has (*tag))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
auto *out = c->serializer->start_embed (*this);
|
auto *out = c->serializer->start_embed (*this);
|
||||||
|
@ -1532,7 +1532,7 @@ struct ClassDefFormat1_3
|
||||||
const Coverage* glyph_filter = nullptr) const
|
const Coverage* glyph_filter = nullptr) const
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
const hb_map_t &glyph_map = *c->plan->glyph_map_gsub;
|
const hb_map_t &glyph_map = c->plan->glyph_map_gsub;
|
||||||
|
|
||||||
hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> glyph_and_klass;
|
hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> glyph_and_klass;
|
||||||
hb_set_t orig_klasses;
|
hb_set_t orig_klasses;
|
||||||
|
@ -1777,7 +1777,7 @@ struct ClassDefFormat2_4
|
||||||
const Coverage* glyph_filter = nullptr) const
|
const Coverage* glyph_filter = nullptr) const
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
const hb_map_t &glyph_map = *c->plan->glyph_map_gsub;
|
const hb_map_t &glyph_map = c->plan->glyph_map_gsub;
|
||||||
const hb_set_t &glyph_set = *c->plan->glyphset_gsub ();
|
const hb_set_t &glyph_set = *c->plan->glyphset_gsub ();
|
||||||
|
|
||||||
hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> glyph_and_klass;
|
hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> glyph_and_klass;
|
||||||
|
|
|
@ -206,9 +206,9 @@ struct CaretValueFormat3
|
||||||
if (!c->serializer->embed (coordinate)) return_trace (false);
|
if (!c->serializer->embed (coordinate)) return_trace (false);
|
||||||
|
|
||||||
unsigned varidx = (this+deviceTable).get_variation_index ();
|
unsigned varidx = (this+deviceTable).get_variation_index ();
|
||||||
if (c->plan->layout_variation_idx_delta_map->has (varidx))
|
if (c->plan->layout_variation_idx_delta_map.has (varidx))
|
||||||
{
|
{
|
||||||
int delta = hb_second (c->plan->layout_variation_idx_delta_map->get (varidx));
|
int delta = hb_second (c->plan->layout_variation_idx_delta_map.get (varidx));
|
||||||
if (delta != 0)
|
if (delta != 0)
|
||||||
{
|
{
|
||||||
if (!c->serializer->check_assign (out->coordinate, coordinate + delta, HB_SERIALIZE_ERROR_INT_OVERFLOW))
|
if (!c->serializer->check_assign (out->coordinate, coordinate + delta, HB_SERIALIZE_ERROR_INT_OVERFLOW))
|
||||||
|
@ -223,7 +223,7 @@ struct CaretValueFormat3
|
||||||
return_trace (false);
|
return_trace (false);
|
||||||
|
|
||||||
return_trace (out->deviceTable.serialize_copy (c->serializer, deviceTable, this, c->serializer->to_bias (out),
|
return_trace (out->deviceTable.serialize_copy (c->serializer, deviceTable, this, c->serializer->to_bias (out),
|
||||||
hb_serialize_context_t::Head, c->plan->layout_variation_idx_delta_map));
|
hb_serialize_context_t::Head, &c->plan->layout_variation_idx_delta_map));
|
||||||
}
|
}
|
||||||
|
|
||||||
void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
|
void collect_variation_indices (hb_collect_variation_indices_context_t *c) const
|
||||||
|
|
|
@ -2223,7 +2223,7 @@ struct ContextFormat1_4
|
||||||
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
||||||
out->format = format;
|
out->format = format;
|
||||||
|
|
||||||
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
|
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? &c->plan->gsub_lookups : &c->plan->gpos_lookups;
|
||||||
hb_sorted_vector_t<hb_codepoint_t> new_coverage;
|
hb_sorted_vector_t<hb_codepoint_t> new_coverage;
|
||||||
+ hb_zip (this+coverage, ruleSet)
|
+ hb_zip (this+coverage, ruleSet)
|
||||||
| hb_filter (glyphset, hb_first)
|
| hb_filter (glyphset, hb_first)
|
||||||
|
@ -2460,7 +2460,7 @@ struct ContextFormat2_5
|
||||||
hb_set_t coverage_glyph_classes;
|
hb_set_t coverage_glyph_classes;
|
||||||
(this+classDef).intersected_classes (&retained_coverage_glyphs, &coverage_glyph_classes);
|
(this+classDef).intersected_classes (&retained_coverage_glyphs, &coverage_glyph_classes);
|
||||||
|
|
||||||
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
|
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? &c->plan->gsub_lookups : &c->plan->gpos_lookups;
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
int non_zero_index = -1, index = 0;
|
int non_zero_index = -1, index = 0;
|
||||||
auto snapshot = c->serializer->snapshot();
|
auto snapshot = c->serializer->snapshot();
|
||||||
|
@ -2640,7 +2640,7 @@ struct ContextFormat3
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto& lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>> (coverageZ.as_array (glyphCount));
|
const auto& lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>> (coverageZ.as_array (glyphCount));
|
||||||
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
|
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? &c->plan->gsub_lookups : &c->plan->gpos_lookups;
|
||||||
|
|
||||||
|
|
||||||
unsigned count = serialize_lookuprecord_array (c->serializer, lookupRecord.as_array (lookupCount), lookup_map);
|
unsigned count = serialize_lookuprecord_array (c->serializer, lookupRecord.as_array (lookupCount), lookup_map);
|
||||||
|
@ -3304,7 +3304,7 @@ struct ChainContextFormat1_4
|
||||||
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
if (unlikely (!c->serializer->extend_min (out))) return_trace (false);
|
||||||
out->format = format;
|
out->format = format;
|
||||||
|
|
||||||
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
|
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? &c->plan->gsub_lookups : &c->plan->gpos_lookups;
|
||||||
hb_sorted_vector_t<hb_codepoint_t> new_coverage;
|
hb_sorted_vector_t<hb_codepoint_t> new_coverage;
|
||||||
+ hb_zip (this+coverage, ruleSet)
|
+ hb_zip (this+coverage, ruleSet)
|
||||||
| hb_filter (glyphset, hb_first)
|
| hb_filter (glyphset, hb_first)
|
||||||
|
@ -3584,7 +3584,7 @@ struct ChainContextFormat2_5
|
||||||
|
|
||||||
int non_zero_index = -1, index = 0;
|
int non_zero_index = -1, index = 0;
|
||||||
bool ret = true;
|
bool ret = true;
|
||||||
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
|
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? &c->plan->gsub_lookups : &c->plan->gpos_lookups;
|
||||||
auto last_non_zero = c->serializer->snapshot ();
|
auto last_non_zero = c->serializer->snapshot ();
|
||||||
for (const auto& _ : + hb_enumerate (ruleSet)
|
for (const auto& _ : + hb_enumerate (ruleSet)
|
||||||
| hb_filter (input_klass_map, hb_first))
|
| hb_filter (input_klass_map, hb_first))
|
||||||
|
@ -3826,7 +3826,7 @@ struct ChainContextFormat3
|
||||||
return_trace (false);
|
return_trace (false);
|
||||||
|
|
||||||
const auto &lookup = StructAfter<decltype (lookupX)> (lookahead);
|
const auto &lookup = StructAfter<decltype (lookupX)> (lookahead);
|
||||||
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups;
|
const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? &c->plan->gsub_lookups : &c->plan->gpos_lookups;
|
||||||
|
|
||||||
HBUINT16 *lookupCount = c->serializer->copy<HBUINT16> (lookup.len);
|
HBUINT16 *lookupCount = c->serializer->copy<HBUINT16> (lookup.len);
|
||||||
if (!lookupCount) return_trace (false);
|
if (!lookupCount) return_trace (false);
|
||||||
|
|
|
@ -201,7 +201,7 @@ struct MathItalicsCorrectionInfo
|
||||||
bool subset (hb_subset_context_t *c) const
|
bool subset (hb_subset_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
|
const hb_set_t &glyphset = c->plan->_glyphset_mathed;
|
||||||
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
||||||
|
|
||||||
auto *out = c->serializer->start_embed (*this);
|
auto *out = c->serializer->start_embed (*this);
|
||||||
|
@ -254,7 +254,7 @@ struct MathTopAccentAttachment
|
||||||
bool subset (hb_subset_context_t *c) const
|
bool subset (hb_subset_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
|
const hb_set_t &glyphset = c->plan->_glyphset_mathed;
|
||||||
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
||||||
|
|
||||||
auto *out = c->serializer->start_embed (*this);
|
auto *out = c->serializer->start_embed (*this);
|
||||||
|
@ -486,7 +486,7 @@ struct MathKernInfo
|
||||||
bool subset (hb_subset_context_t *c) const
|
bool subset (hb_subset_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
|
const hb_set_t &glyphset = c->plan->_glyphset_mathed;
|
||||||
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
||||||
|
|
||||||
auto *out = c->serializer->start_embed (*this);
|
auto *out = c->serializer->start_embed (*this);
|
||||||
|
@ -567,7 +567,7 @@ struct MathGlyphInfo
|
||||||
out->mathItalicsCorrectionInfo.serialize_subset (c, mathItalicsCorrectionInfo, this);
|
out->mathItalicsCorrectionInfo.serialize_subset (c, mathItalicsCorrectionInfo, this);
|
||||||
out->mathTopAccentAttachment.serialize_subset (c, mathTopAccentAttachment, this);
|
out->mathTopAccentAttachment.serialize_subset (c, mathTopAccentAttachment, this);
|
||||||
|
|
||||||
const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
|
const hb_set_t &glyphset = c->plan->_glyphset_mathed;
|
||||||
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
||||||
|
|
||||||
auto it =
|
auto it =
|
||||||
|
@ -938,7 +938,7 @@ struct MathVariants
|
||||||
bool subset (hb_subset_context_t *c) const
|
bool subset (hb_subset_context_t *c) const
|
||||||
{
|
{
|
||||||
TRACE_SUBSET (this);
|
TRACE_SUBSET (this);
|
||||||
const hb_set_t &glyphset = *c->plan->_glyphset_mathed;
|
const hb_set_t &glyphset = c->plan->_glyphset_mathed;
|
||||||
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
const hb_map_t &glyph_map = *c->plan->glyph_map;
|
||||||
|
|
||||||
auto *out = c->serializer->start_embed (*this);
|
auto *out = c->serializer->start_embed (*this);
|
||||||
|
|
|
@ -139,13 +139,13 @@ static void _collect_layout_indices (hb_subset_plan_t *plan,
|
||||||
hb_vector_t<hb_tag_t> features;
|
hb_vector_t<hb_tag_t> features;
|
||||||
if (!plan->check_success (features.resize (num_features))) return;
|
if (!plan->check_success (features.resize (num_features))) return;
|
||||||
table.get_feature_tags (0, &num_features, features.arrayZ);
|
table.get_feature_tags (0, &num_features, features.arrayZ);
|
||||||
bool retain_all_features = !_filter_tag_list (&features, plan->layout_features);
|
bool retain_all_features = !_filter_tag_list (&features, &plan->layout_features);
|
||||||
|
|
||||||
unsigned num_scripts = table.get_script_count ();
|
unsigned num_scripts = table.get_script_count ();
|
||||||
hb_vector_t<hb_tag_t> scripts;
|
hb_vector_t<hb_tag_t> scripts;
|
||||||
if (!plan->check_success (scripts.resize (num_scripts))) return;
|
if (!plan->check_success (scripts.resize (num_scripts))) return;
|
||||||
table.get_script_tags (0, &num_scripts, scripts.arrayZ);
|
table.get_script_tags (0, &num_scripts, scripts.arrayZ);
|
||||||
bool retain_all_scripts = !_filter_tag_list (&scripts, plan->layout_scripts);
|
bool retain_all_scripts = !_filter_tag_list (&scripts, &plan->layout_scripts);
|
||||||
|
|
||||||
if (!plan->check_success (!features.in_error ()) || !features
|
if (!plan->check_success (!features.in_error ()) || !features
|
||||||
|| !plan->check_success (!scripts.in_error ()) || !scripts)
|
|| !plan->check_success (!scripts.in_error ()) || !scripts)
|
||||||
|
@ -301,7 +301,7 @@ _closure_glyphs_lookups_features (hb_subset_plan_t *plan,
|
||||||
_GSUBGPOS_find_duplicate_features (*table, lookups, &feature_indices, feature_substitutes_map, &duplicate_feature_map);
|
_GSUBGPOS_find_duplicate_features (*table, lookups, &feature_indices, feature_substitutes_map, &duplicate_feature_map);
|
||||||
|
|
||||||
feature_indices.clear ();
|
feature_indices.clear ();
|
||||||
table->prune_langsys (&duplicate_feature_map, plan->layout_scripts, langsys_map, &feature_indices);
|
table->prune_langsys (&duplicate_feature_map, &plan->layout_scripts, langsys_map, &feature_indices);
|
||||||
_remap_indexes (&feature_indices, features);
|
_remap_indexes (&feature_indices, features);
|
||||||
|
|
||||||
table.destroy ();
|
table.destroy ();
|
||||||
|
@ -380,10 +380,10 @@ _collect_layout_variation_indices (hb_subset_plan_t* plan)
|
||||||
}
|
}
|
||||||
|
|
||||||
OT::hb_collect_variation_indices_context_t c (&varidx_set,
|
OT::hb_collect_variation_indices_context_t c (&varidx_set,
|
||||||
plan->layout_variation_idx_delta_map,
|
&plan->layout_variation_idx_delta_map,
|
||||||
font, var_store,
|
font, var_store,
|
||||||
plan->_glyphset_gsub,
|
&plan->_glyphset_gsub,
|
||||||
plan->gpos_lookups,
|
&plan->gpos_lookups,
|
||||||
store_cache);
|
store_cache);
|
||||||
gdef->collect_variation_indices (&c);
|
gdef->collect_variation_indices (&c);
|
||||||
|
|
||||||
|
@ -393,7 +393,7 @@ _collect_layout_variation_indices (hb_subset_plan_t* plan)
|
||||||
hb_font_destroy (font);
|
hb_font_destroy (font);
|
||||||
var_store->destroy_cache (store_cache);
|
var_store->destroy_cache (store_cache);
|
||||||
|
|
||||||
gdef->remap_layout_variation_indices (&varidx_set, plan->layout_variation_idx_delta_map);
|
gdef->remap_layout_variation_indices (&varidx_set, &plan->layout_variation_idx_delta_map);
|
||||||
|
|
||||||
unsigned subtable_count = gdef->has_var_store () ? gdef->get_var_store ().get_sub_table_count () : 0;
|
unsigned subtable_count = gdef->has_var_store () ? gdef->get_var_store ().get_sub_table_count () : 0;
|
||||||
_generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps);
|
_generate_varstore_inner_maps (varidx_set, subtable_count, plan->gdef_varstore_inner_maps);
|
||||||
|
@ -569,7 +569,7 @@ _populate_unicodes_to_retain (const hb_set_t *unicodes,
|
||||||
{
|
{
|
||||||
if (gid >= plan->source->get_num_glyphs ())
|
if (gid >= plan->source->get_num_glyphs ())
|
||||||
break;
|
break;
|
||||||
plan->_glyphset_gsub->add (gid);
|
plan->_glyphset_gsub.add (gid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -577,7 +577,7 @@ _populate_unicodes_to_retain (const hb_set_t *unicodes,
|
||||||
if (arr.length)
|
if (arr.length)
|
||||||
{
|
{
|
||||||
plan->unicodes->add_sorted_array (&arr.arrayZ->first, arr.length, sizeof (*arr.arrayZ));
|
plan->unicodes->add_sorted_array (&arr.arrayZ->first, arr.length, sizeof (*arr.arrayZ));
|
||||||
plan->_glyphset_gsub->add_array (&arr.arrayZ->second, arr.length, sizeof (*arr.arrayZ));
|
plan->_glyphset_gsub.add_array (&arr.arrayZ->second, arr.length, sizeof (*arr.arrayZ));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -619,71 +619,71 @@ _populate_gids_to_retain (hb_subset_plan_t* plan,
|
||||||
OT::cff1::accelerator_t cff (plan->source);
|
OT::cff1::accelerator_t cff (plan->source);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
plan->_glyphset_gsub->add (0); // Not-def
|
plan->_glyphset_gsub.add (0); // Not-def
|
||||||
|
|
||||||
_cmap_closure (plan->source, plan->unicodes, plan->_glyphset_gsub);
|
_cmap_closure (plan->source, plan->unicodes, &plan->_glyphset_gsub);
|
||||||
|
|
||||||
#ifndef HB_NO_SUBSET_LAYOUT
|
#ifndef HB_NO_SUBSET_LAYOUT
|
||||||
if (!drop_tables->has (HB_OT_TAG_GSUB))
|
if (!drop_tables->has (HB_OT_TAG_GSUB))
|
||||||
// closure all glyphs/lookups/features needed for GSUB substitutions.
|
// closure all glyphs/lookups/features needed for GSUB substitutions.
|
||||||
_closure_glyphs_lookups_features<GSUB> (
|
_closure_glyphs_lookups_features<GSUB> (
|
||||||
plan,
|
plan,
|
||||||
plan->_glyphset_gsub,
|
&plan->_glyphset_gsub,
|
||||||
plan->gsub_lookups,
|
&plan->gsub_lookups,
|
||||||
plan->gsub_features,
|
&plan->gsub_features,
|
||||||
plan->gsub_langsys,
|
&plan->gsub_langsys,
|
||||||
plan->gsub_feature_record_cond_idx_map,
|
&plan->gsub_feature_record_cond_idx_map,
|
||||||
plan->gsub_feature_substitutes_map);
|
&plan->gsub_feature_substitutes_map);
|
||||||
|
|
||||||
if (!drop_tables->has (HB_OT_TAG_GPOS))
|
if (!drop_tables->has (HB_OT_TAG_GPOS))
|
||||||
_closure_glyphs_lookups_features<GPOS> (
|
_closure_glyphs_lookups_features<GPOS> (
|
||||||
plan,
|
plan,
|
||||||
plan->_glyphset_gsub,
|
&plan->_glyphset_gsub,
|
||||||
plan->gpos_lookups,
|
&plan->gpos_lookups,
|
||||||
plan->gpos_features,
|
&plan->gpos_features,
|
||||||
plan->gpos_langsys,
|
&plan->gpos_langsys,
|
||||||
plan->gpos_feature_record_cond_idx_map,
|
&plan->gpos_feature_record_cond_idx_map,
|
||||||
plan->gpos_feature_substitutes_map);
|
&plan->gpos_feature_substitutes_map);
|
||||||
#endif
|
#endif
|
||||||
_remove_invalid_gids (plan->_glyphset_gsub, plan->source->get_num_glyphs ());
|
_remove_invalid_gids (&plan->_glyphset_gsub, plan->source->get_num_glyphs ());
|
||||||
|
|
||||||
hb_set_set (plan->_glyphset_mathed, plan->_glyphset_gsub);
|
plan->_glyphset_mathed = plan->_glyphset_gsub;
|
||||||
if (!drop_tables->has (HB_OT_TAG_MATH))
|
if (!drop_tables->has (HB_OT_TAG_MATH))
|
||||||
{
|
{
|
||||||
_math_closure (plan, plan->_glyphset_mathed);
|
_math_closure (plan, &plan->_glyphset_mathed);
|
||||||
_remove_invalid_gids (plan->_glyphset_mathed, plan->source->get_num_glyphs ());
|
_remove_invalid_gids (&plan->_glyphset_mathed, plan->source->get_num_glyphs ());
|
||||||
}
|
}
|
||||||
|
|
||||||
hb_set_t cur_glyphset = *plan->_glyphset_mathed;
|
hb_set_t cur_glyphset = plan->_glyphset_mathed;
|
||||||
if (!drop_tables->has (HB_OT_TAG_COLR))
|
if (!drop_tables->has (HB_OT_TAG_COLR))
|
||||||
{
|
{
|
||||||
_colr_closure (plan->source, plan->colrv1_layers, plan->colr_palettes, &cur_glyphset);
|
_colr_closure (plan->source, &plan->colrv1_layers, &plan->colr_palettes, &cur_glyphset);
|
||||||
_remove_invalid_gids (&cur_glyphset, plan->source->get_num_glyphs ());
|
_remove_invalid_gids (&cur_glyphset, plan->source->get_num_glyphs ());
|
||||||
}
|
}
|
||||||
|
|
||||||
hb_set_set (plan->_glyphset_colred, &cur_glyphset);
|
plan->_glyphset_colred = cur_glyphset;
|
||||||
|
|
||||||
/* Populate a full set of glyphs to retain by adding all referenced
|
/* Populate a full set of glyphs to retain by adding all referenced
|
||||||
* composite glyphs. */
|
* composite glyphs. */
|
||||||
if (glyf.has_data ())
|
if (glyf.has_data ())
|
||||||
for (hb_codepoint_t gid : cur_glyphset)
|
for (hb_codepoint_t gid : cur_glyphset)
|
||||||
_glyf_add_gid_and_children (glyf, gid, plan->_glyphset,
|
_glyf_add_gid_and_children (glyf, gid, &plan->_glyphset,
|
||||||
cur_glyphset.get_population () * HB_COMPOSITE_OPERATIONS_PER_GLYPH);
|
cur_glyphset.get_population () * HB_COMPOSITE_OPERATIONS_PER_GLYPH);
|
||||||
else
|
else
|
||||||
plan->_glyphset->union_ (cur_glyphset);
|
plan->_glyphset.union_ (cur_glyphset);
|
||||||
#ifndef HB_NO_SUBSET_CFF
|
#ifndef HB_NO_SUBSET_CFF
|
||||||
if (!plan->accelerator || plan->accelerator->has_seac)
|
if (!plan->accelerator || plan->accelerator->has_seac)
|
||||||
{
|
{
|
||||||
bool has_seac = false;
|
bool has_seac = false;
|
||||||
if (cff.is_valid ())
|
if (cff.is_valid ())
|
||||||
for (hb_codepoint_t gid : cur_glyphset)
|
for (hb_codepoint_t gid : cur_glyphset)
|
||||||
if (_add_cff_seac_components (cff, gid, plan->_glyphset))
|
if (_add_cff_seac_components (cff, gid, &plan->_glyphset))
|
||||||
has_seac = true;
|
has_seac = true;
|
||||||
plan->has_seac = has_seac;
|
plan->has_seac = has_seac;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
_remove_invalid_gids (plan->_glyphset, plan->source->get_num_glyphs ());
|
_remove_invalid_gids (&plan->_glyphset, plan->source->get_num_glyphs ());
|
||||||
|
|
||||||
|
|
||||||
#ifndef HB_NO_VAR
|
#ifndef HB_NO_VAR
|
||||||
|
@ -842,45 +842,22 @@ hb_subset_plan_create_or_fail (hb_face_t *face,
|
||||||
|
|
||||||
plan->unicode_to_new_gid_list.init ();
|
plan->unicode_to_new_gid_list.init ();
|
||||||
|
|
||||||
plan->name_ids = hb_set_copy (input->sets.name_ids);
|
plan->name_ids = *input->sets.name_ids;
|
||||||
plan->name_languages = hb_set_copy (input->sets.name_languages);
|
plan->name_languages = *input->sets.name_languages;
|
||||||
plan->layout_features = hb_set_copy (input->sets.layout_features);
|
plan->layout_features = *input->sets.layout_features;
|
||||||
plan->layout_scripts = hb_set_copy (input->sets.layout_scripts);
|
plan->layout_scripts = *input->sets.layout_scripts;
|
||||||
plan->glyphs_requested = hb_set_copy (input->sets.glyphs);
|
plan->glyphs_requested = *input->sets.glyphs;
|
||||||
plan->drop_tables = hb_set_copy (input->sets.drop_tables);
|
plan->drop_tables = *input->sets.drop_tables;
|
||||||
plan->no_subset_tables = hb_set_copy (input->sets.no_subset_tables);
|
plan->no_subset_tables = *input->sets.no_subset_tables;
|
||||||
plan->source = hb_face_reference (face);
|
plan->source = hb_face_reference (face);
|
||||||
plan->dest = hb_face_builder_create ();
|
plan->dest = hb_face_builder_create ();
|
||||||
|
|
||||||
plan->_glyphset = hb_set_create ();
|
|
||||||
plan->_glyphset_gsub = hb_set_create ();
|
|
||||||
plan->_glyphset_mathed = hb_set_create ();
|
|
||||||
plan->_glyphset_colred = hb_set_create ();
|
|
||||||
plan->codepoint_to_glyph = hb_map_create ();
|
plan->codepoint_to_glyph = hb_map_create ();
|
||||||
plan->glyph_map = hb_map_create ();
|
plan->glyph_map = hb_map_create ();
|
||||||
plan->reverse_glyph_map = hb_map_create ();
|
plan->reverse_glyph_map = hb_map_create ();
|
||||||
plan->glyph_map_gsub = hb_map_create ();
|
|
||||||
plan->gsub_lookups = hb_map_create ();
|
|
||||||
plan->gpos_lookups = hb_map_create ();
|
|
||||||
|
|
||||||
plan->check_success (plan->gsub_langsys = hb_hashmap_create<unsigned, hb::unique_ptr<hb_set_t>> ());
|
|
||||||
plan->check_success (plan->gpos_langsys = hb_hashmap_create<unsigned, hb::unique_ptr<hb_set_t>> ());
|
|
||||||
|
|
||||||
plan->gsub_features = hb_map_create ();
|
|
||||||
plan->gpos_features = hb_map_create ();
|
|
||||||
|
|
||||||
plan->check_success (plan->gsub_feature_record_cond_idx_map = hb_hashmap_create<unsigned, hb::shared_ptr<hb_set_t>> ());
|
|
||||||
plan->check_success (plan->gpos_feature_record_cond_idx_map = hb_hashmap_create<unsigned, hb::shared_ptr<hb_set_t>> ());
|
|
||||||
|
|
||||||
plan->check_success (plan->gsub_feature_substitutes_map = hb_hashmap_create<unsigned, const OT::Feature*> ());
|
|
||||||
plan->check_success (plan->gpos_feature_substitutes_map = hb_hashmap_create<unsigned, const OT::Feature*> ());
|
|
||||||
|
|
||||||
plan->colrv1_layers = hb_map_create ();
|
|
||||||
plan->colr_palettes = hb_map_create ();
|
|
||||||
plan->check_success (plan->layout_variation_idx_delta_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ());
|
|
||||||
plan->gdef_varstore_inner_maps.init ();
|
plan->gdef_varstore_inner_maps.init ();
|
||||||
|
|
||||||
plan->check_success (plan->sanitized_table_cache = hb_hashmap_create<hb_tag_t, hb::unique_ptr<hb_blob_t>> ());
|
|
||||||
plan->check_success (plan->axes_location = hb_hashmap_create<hb_tag_t, int> ());
|
plan->check_success (plan->axes_location = hb_hashmap_create<hb_tag_t, int> ());
|
||||||
plan->check_success (plan->user_axes_location = hb_hashmap_create<hb_tag_t, float> ());
|
plan->check_success (plan->user_axes_location = hb_hashmap_create<hb_tag_t, float> ());
|
||||||
if (plan->user_axes_location && input->axes_location)
|
if (plan->user_axes_location && input->axes_location)
|
||||||
|
@ -934,15 +911,15 @@ hb_subset_plan_create_or_fail (hb_face_t *face,
|
||||||
|
|
||||||
_create_old_gid_to_new_gid_map (face,
|
_create_old_gid_to_new_gid_map (face,
|
||||||
input->flags & HB_SUBSET_FLAGS_RETAIN_GIDS,
|
input->flags & HB_SUBSET_FLAGS_RETAIN_GIDS,
|
||||||
plan->_glyphset,
|
&plan->_glyphset,
|
||||||
plan->glyph_map,
|
plan->glyph_map,
|
||||||
plan->reverse_glyph_map,
|
plan->reverse_glyph_map,
|
||||||
&plan->_num_output_glyphs);
|
&plan->_num_output_glyphs);
|
||||||
|
|
||||||
_create_glyph_map_gsub (
|
_create_glyph_map_gsub (
|
||||||
plan->_glyphset_gsub,
|
&plan->_glyphset_gsub,
|
||||||
plan->glyph_map,
|
plan->glyph_map,
|
||||||
plan->glyph_map_gsub);
|
&plan->glyph_map_gsub);
|
||||||
|
|
||||||
// Now that we have old to new gid map update the unicode to new gid list.
|
// Now that we have old to new gid map update the unicode to new gid list.
|
||||||
for (unsigned i = 0; i < plan->unicode_to_new_gid_list.length; i++)
|
for (unsigned i = 0; i < plan->unicode_to_new_gid_list.length; i++)
|
||||||
|
@ -952,7 +929,7 @@ hb_subset_plan_create_or_fail (hb_face_t *face,
|
||||||
plan->glyph_map->get(plan->unicode_to_new_gid_list.arrayZ[i].second);
|
plan->glyph_map->get(plan->unicode_to_new_gid_list.arrayZ[i].second);
|
||||||
}
|
}
|
||||||
|
|
||||||
_nameid_closure (face, plan->name_ids, plan->all_axes_pinned, plan->user_axes_location);
|
_nameid_closure (face, &plan->name_ids, plan->all_axes_pinned, plan->user_axes_location);
|
||||||
if (unlikely (plan->in_error ())) {
|
if (unlikely (plan->in_error ())) {
|
||||||
hb_subset_plan_destroy (plan);
|
hb_subset_plan_destroy (plan);
|
||||||
return nullptr;
|
return nullptr;
|
||||||
|
|
|
@ -49,43 +49,17 @@ struct hb_subset_plan_t
|
||||||
~hb_subset_plan_t()
|
~hb_subset_plan_t()
|
||||||
{
|
{
|
||||||
hb_set_destroy (unicodes);
|
hb_set_destroy (unicodes);
|
||||||
hb_set_destroy (name_ids);
|
|
||||||
hb_set_destroy (name_languages);
|
|
||||||
hb_set_destroy (layout_features);
|
|
||||||
hb_set_destroy (layout_scripts);
|
|
||||||
hb_set_destroy (glyphs_requested);
|
|
||||||
hb_set_destroy (drop_tables);
|
|
||||||
hb_set_destroy (no_subset_tables);
|
|
||||||
hb_face_destroy (source);
|
hb_face_destroy (source);
|
||||||
hb_face_destroy (dest);
|
hb_face_destroy (dest);
|
||||||
hb_map_destroy (codepoint_to_glyph);
|
hb_map_destroy (codepoint_to_glyph);
|
||||||
hb_map_destroy (glyph_map);
|
hb_map_destroy (glyph_map);
|
||||||
hb_map_destroy (reverse_glyph_map);
|
hb_map_destroy (reverse_glyph_map);
|
||||||
hb_map_destroy (glyph_map_gsub);
|
|
||||||
hb_set_destroy (_glyphset);
|
|
||||||
hb_set_destroy (_glyphset_gsub);
|
|
||||||
hb_set_destroy (_glyphset_mathed);
|
|
||||||
hb_set_destroy (_glyphset_colred);
|
|
||||||
hb_map_destroy (gsub_lookups);
|
|
||||||
hb_map_destroy (gpos_lookups);
|
|
||||||
hb_map_destroy (gsub_features);
|
|
||||||
hb_map_destroy (gpos_features);
|
|
||||||
hb_map_destroy (colrv1_layers);
|
|
||||||
hb_map_destroy (colr_palettes);
|
|
||||||
hb_map_destroy (axes_index_map);
|
hb_map_destroy (axes_index_map);
|
||||||
hb_map_destroy (axes_old_index_tag_map);
|
hb_map_destroy (axes_old_index_tag_map);
|
||||||
|
|
||||||
hb_hashmap_destroy (gsub_langsys);
|
|
||||||
hb_hashmap_destroy (gpos_langsys);
|
|
||||||
hb_hashmap_destroy (gsub_feature_record_cond_idx_map);
|
|
||||||
hb_hashmap_destroy (gpos_feature_record_cond_idx_map);
|
|
||||||
hb_hashmap_destroy (gsub_feature_substitutes_map);
|
|
||||||
hb_hashmap_destroy (gpos_feature_substitutes_map);
|
|
||||||
hb_hashmap_destroy (axes_location);
|
hb_hashmap_destroy (axes_location);
|
||||||
hb_hashmap_destroy (sanitized_table_cache);
|
|
||||||
hb_hashmap_destroy (hmtx_map);
|
hb_hashmap_destroy (hmtx_map);
|
||||||
hb_hashmap_destroy (vmtx_map);
|
hb_hashmap_destroy (vmtx_map);
|
||||||
hb_hashmap_destroy (layout_variation_idx_delta_map);
|
|
||||||
|
|
||||||
#ifdef HB_EXPERIMENTAL_API
|
#ifdef HB_EXPERIMENTAL_API
|
||||||
if (name_table_overrides)
|
if (name_table_overrides)
|
||||||
|
@ -99,11 +73,7 @@ struct hb_subset_plan_t
|
||||||
if (inprogress_accelerator)
|
if (inprogress_accelerator)
|
||||||
hb_subset_accelerator_t::destroy ((void*) inprogress_accelerator);
|
hb_subset_accelerator_t::destroy ((void*) inprogress_accelerator);
|
||||||
|
|
||||||
if (user_axes_location)
|
hb_hashmap_destroy (user_axes_location);
|
||||||
{
|
|
||||||
hb_object_destroy (user_axes_location);
|
|
||||||
hb_free (user_axes_location);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
hb_object_header_t header;
|
hb_object_header_t header;
|
||||||
|
@ -118,76 +88,76 @@ struct hb_subset_plan_t
|
||||||
hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> unicode_to_new_gid_list;
|
hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> unicode_to_new_gid_list;
|
||||||
|
|
||||||
// name_ids we would like to retain
|
// name_ids we would like to retain
|
||||||
hb_set_t *name_ids;
|
hb_set_t name_ids;
|
||||||
|
|
||||||
// name_languages we would like to retain
|
// name_languages we would like to retain
|
||||||
hb_set_t *name_languages;
|
hb_set_t name_languages;
|
||||||
|
|
||||||
//layout features which will be preserved
|
//layout features which will be preserved
|
||||||
hb_set_t *layout_features;
|
hb_set_t layout_features;
|
||||||
|
|
||||||
// layout scripts which will be preserved.
|
// layout scripts which will be preserved.
|
||||||
hb_set_t *layout_scripts;
|
hb_set_t layout_scripts;
|
||||||
|
|
||||||
//glyph ids requested to retain
|
//glyph ids requested to retain
|
||||||
hb_set_t *glyphs_requested;
|
hb_set_t glyphs_requested;
|
||||||
|
|
||||||
// Tables which should not be processed, just pass them through.
|
// Tables which should not be processed, just pass them through.
|
||||||
hb_set_t *no_subset_tables;
|
hb_set_t no_subset_tables;
|
||||||
|
|
||||||
// Tables which should be dropped.
|
// Tables which should be dropped.
|
||||||
hb_set_t *drop_tables;
|
hb_set_t drop_tables;
|
||||||
|
|
||||||
// The glyph subset
|
// The glyph subset
|
||||||
hb_map_t *codepoint_to_glyph;
|
hb_map_t *codepoint_to_glyph; // Needs to be heap-allocated
|
||||||
|
|
||||||
// Old -> New glyph id mapping
|
// Old -> New glyph id mapping
|
||||||
hb_map_t *glyph_map;
|
hb_map_t *glyph_map; // Needs to be heap-allocated
|
||||||
hb_map_t *reverse_glyph_map;
|
hb_map_t *reverse_glyph_map; // Needs to be heap-allocated
|
||||||
hb_map_t *glyph_map_gsub;
|
hb_map_t glyph_map_gsub;
|
||||||
|
|
||||||
// Plan is only good for a specific source/dest so keep them with it
|
// Plan is only good for a specific source/dest so keep them with it
|
||||||
hb_face_t *source;
|
hb_face_t *source;
|
||||||
hb_face_t *dest;
|
hb_face_t *dest;
|
||||||
|
|
||||||
unsigned int _num_output_glyphs;
|
unsigned int _num_output_glyphs;
|
||||||
hb_set_t *_glyphset;
|
hb_set_t _glyphset;
|
||||||
hb_set_t *_glyphset_gsub;
|
hb_set_t _glyphset_gsub;
|
||||||
hb_set_t *_glyphset_mathed;
|
hb_set_t _glyphset_mathed;
|
||||||
hb_set_t *_glyphset_colred;
|
hb_set_t _glyphset_colred;
|
||||||
|
|
||||||
//active lookups we'd like to retain
|
//active lookups we'd like to retain
|
||||||
hb_map_t *gsub_lookups;
|
hb_map_t gsub_lookups;
|
||||||
hb_map_t *gpos_lookups;
|
hb_map_t gpos_lookups;
|
||||||
|
|
||||||
//active langsys we'd like to retain
|
//active langsys we'd like to retain
|
||||||
hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *gsub_langsys;
|
hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> gsub_langsys;
|
||||||
hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> *gpos_langsys;
|
hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> gpos_langsys;
|
||||||
|
|
||||||
//active features after removing redundant langsys and prune_features
|
//active features after removing redundant langsys and prune_features
|
||||||
hb_map_t *gsub_features;
|
hb_map_t gsub_features;
|
||||||
hb_map_t *gpos_features;
|
hb_map_t gpos_features;
|
||||||
|
|
||||||
//active feature variation records/condition index with variations
|
//active feature variation records/condition index with variations
|
||||||
hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *gsub_feature_record_cond_idx_map;
|
hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> gsub_feature_record_cond_idx_map;
|
||||||
hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> *gpos_feature_record_cond_idx_map;
|
hb_hashmap_t<unsigned, hb::shared_ptr<hb_set_t>> gpos_feature_record_cond_idx_map;
|
||||||
|
|
||||||
//feature index-> address of substituation feature table mapping with
|
//feature index-> address of substituation feature table mapping with
|
||||||
//variations
|
//variations
|
||||||
hb_hashmap_t<unsigned, const OT::Feature*> *gsub_feature_substitutes_map;
|
hb_hashmap_t<unsigned, const OT::Feature*> gsub_feature_substitutes_map;
|
||||||
hb_hashmap_t<unsigned, const OT::Feature*> *gpos_feature_substitutes_map;
|
hb_hashmap_t<unsigned, const OT::Feature*> gpos_feature_substitutes_map;
|
||||||
|
|
||||||
//active layers/palettes we'd like to retain
|
//active layers/palettes we'd like to retain
|
||||||
hb_map_t *colrv1_layers;
|
hb_map_t colrv1_layers;
|
||||||
hb_map_t *colr_palettes;
|
hb_map_t colr_palettes;
|
||||||
|
|
||||||
//Old layout item variation index -> (New varidx, delta) mapping
|
//Old layout item variation index -> (New varidx, delta) mapping
|
||||||
hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *layout_variation_idx_delta_map;
|
hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> layout_variation_idx_delta_map;
|
||||||
|
|
||||||
//gdef varstore retained varidx mapping
|
//gdef varstore retained varidx mapping
|
||||||
hb_vector_t<hb_inc_bimap_t> gdef_varstore_inner_maps;
|
hb_vector_t<hb_inc_bimap_t> gdef_varstore_inner_maps;
|
||||||
|
|
||||||
hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_blob_t>>* sanitized_table_cache;
|
hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_blob_t>> sanitized_table_cache;
|
||||||
//normalized axes location map
|
//normalized axes location map
|
||||||
hb_hashmap_t<hb_tag_t, int> *axes_location;
|
hb_hashmap_t<hb_tag_t, int> *axes_location;
|
||||||
hb_vector_t<int> normalized_coords;
|
hb_vector_t<int> normalized_coords;
|
||||||
|
@ -222,7 +192,7 @@ struct hb_subset_plan_t
|
||||||
{
|
{
|
||||||
hb_lock_t (accelerator ? &accelerator->sanitized_table_cache_lock : nullptr);
|
hb_lock_t (accelerator ? &accelerator->sanitized_table_cache_lock : nullptr);
|
||||||
|
|
||||||
auto *cache = accelerator ? &accelerator->sanitized_table_cache : sanitized_table_cache;
|
auto *cache = accelerator ? &accelerator->sanitized_table_cache : &sanitized_table_cache;
|
||||||
if (cache
|
if (cache
|
||||||
&& !cache->in_error ()
|
&& !cache->in_error ()
|
||||||
&& cache->has (+T::tableTag)) {
|
&& cache->has (+T::tableTag)) {
|
||||||
|
@ -254,7 +224,7 @@ struct hb_subset_plan_t
|
||||||
inline const hb_set_t *
|
inline const hb_set_t *
|
||||||
glyphset () const
|
glyphset () const
|
||||||
{
|
{
|
||||||
return _glyphset;
|
return &_glyphset;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -263,7 +233,7 @@ struct hb_subset_plan_t
|
||||||
inline const hb_set_t *
|
inline const hb_set_t *
|
||||||
glyphset_gsub () const
|
glyphset_gsub () const
|
||||||
{
|
{
|
||||||
return _glyphset_gsub;
|
return &_glyphset_gsub;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -281,7 +251,7 @@ struct hb_subset_plan_t
|
||||||
*/
|
*/
|
||||||
inline bool is_empty_glyph (hb_codepoint_t gid) const
|
inline bool is_empty_glyph (hb_codepoint_t gid) const
|
||||||
{
|
{
|
||||||
return !_glyphset->has (gid);
|
return !_glyphset.has (gid);
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool new_gid_for_codepoint (hb_codepoint_t codepoint,
|
inline bool new_gid_for_codepoint (hb_codepoint_t codepoint,
|
||||||
|
|
|
@ -168,11 +168,11 @@ _get_table_tags (const hb_subset_plan_t* plan,
|
||||||
hb_concat (
|
hb_concat (
|
||||||
+ hb_array (known_tables)
|
+ hb_array (known_tables)
|
||||||
| hb_filter ([&] (hb_tag_t tag) {
|
| hb_filter ([&] (hb_tag_t tag) {
|
||||||
return !_table_is_empty (plan->source, tag) && !plan->no_subset_tables->has (tag);
|
return !_table_is_empty (plan->source, tag) && !plan->no_subset_tables.has (tag);
|
||||||
})
|
})
|
||||||
| hb_map ([] (hb_tag_t tag) -> hb_tag_t { return tag; }),
|
| hb_map ([] (hb_tag_t tag) -> hb_tag_t { return tag; }),
|
||||||
|
|
||||||
plan->no_subset_tables->iter ()
|
plan->no_subset_tables.iter ()
|
||||||
| hb_filter([&] (hb_tag_t tag) {
|
| hb_filter([&] (hb_tag_t tag) {
|
||||||
return !_table_is_empty (plan->source, tag);
|
return !_table_is_empty (plan->source, tag);
|
||||||
}));
|
}));
|
||||||
|
@ -355,7 +355,7 @@ _is_table_present (hb_face_t *source, hb_tag_t tag)
|
||||||
static bool
|
static bool
|
||||||
_should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
|
_should_drop_table (hb_subset_plan_t *plan, hb_tag_t tag)
|
||||||
{
|
{
|
||||||
if (plan->drop_tables->has (tag))
|
if (plan->drop_tables.has (tag))
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
switch (tag)
|
switch (tag)
|
||||||
|
@ -424,7 +424,7 @@ _subset_table (hb_subset_plan_t *plan,
|
||||||
hb_vector_t<char> &buf,
|
hb_vector_t<char> &buf,
|
||||||
hb_tag_t tag)
|
hb_tag_t tag)
|
||||||
{
|
{
|
||||||
if (plan->no_subset_tables->has (tag)) {
|
if (plan->no_subset_tables.has (tag)) {
|
||||||
return _passthrough (plan, tag);
|
return _passthrough (plan, tag);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue