[instancer] update STAT table to accept Triples for axes positions

pull/4235/head
Qunxin Liu 2 years ago committed by Garret Rieger
parent 779e8ba080
commit bf46d566f9
  1. 59
      src/hb-ot-stat-table.hh

@ -57,6 +57,21 @@ enum
// Reserved = 0xFFFC /* Reserved for future use — set to zero. */
};
#ifndef HB_NO_VAR
static bool axis_value_is_outside_axis_range (hb_tag_t axis_tag, float axis_value,
const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
{
if (!user_axes_location->has (axis_tag))
return false;
Triple axis_range = user_axes_location->get (axis_tag);
if (axis_value < axis_range.minimum || axis_value > axis_range.maximum)
return true;
return false;
}
#endif
struct StatAxisRecord
{
int cmp (hb_tag_t key) const { return tag.cmp (key); }
@ -96,23 +111,22 @@ struct AxisValueFormat1
}
bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
const hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
{
hb_tag_t axis_tag = get_axis_tag (axis_records);
float axis_value = get_value ();
if (!user_axes_location->has (axis_tag) ||
fabsf(axis_value - user_axes_location->get (axis_tag)) < 0.001f)
return true;
if (axis_value_is_outside_axis_range (axis_tag, axis_value, user_axes_location))
return false;
return true;
}
bool subset (hb_subset_context_t *c,
const hb_array_t<const StatAxisRecord> axis_records) const
{
TRACE_SUBSET (this);
const hb_hashmap_t<hb_tag_t, float>* user_axes_location = &c->plan->user_axes_location;
const hb_hashmap_t<hb_tag_t, Triple>* user_axes_location = &c->plan->user_axes_location;
if (keep_axis_value (axis_records, user_axes_location))
return_trace (c->serializer->embed (this));
@ -155,23 +169,22 @@ struct AxisValueFormat2
}
bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
const hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
{
hb_tag_t axis_tag = get_axis_tag (axis_records);
float axis_value = get_value ();
if (!user_axes_location->has (axis_tag) ||
fabsf(axis_value - user_axes_location->get (axis_tag)) < 0.001f)
return true;
if (axis_value_is_outside_axis_range (axis_tag, axis_value, user_axes_location))
return false;
return true;
}
bool subset (hb_subset_context_t *c,
const hb_array_t<const StatAxisRecord> axis_records) const
{
TRACE_SUBSET (this);
const hb_hashmap_t<hb_tag_t, float>* user_axes_location = &c->plan->user_axes_location;
const hb_hashmap_t<hb_tag_t, Triple>* user_axes_location = &c->plan->user_axes_location;
if (keep_axis_value (axis_records, user_axes_location))
return_trace (c->serializer->embed (this));
@ -218,23 +231,22 @@ struct AxisValueFormat3
}
bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
const hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
{
hb_tag_t axis_tag = get_axis_tag (axis_records);
float axis_value = get_value ();
if (!user_axes_location->has (axis_tag) ||
fabsf(axis_value - user_axes_location->get (axis_tag)) < 0.001f)
return true;
if (axis_value_is_outside_axis_range (axis_tag, axis_value, user_axes_location))
return false;
return true;
}
bool subset (hb_subset_context_t *c,
const hb_array_t<const StatAxisRecord> axis_records) const
{
TRACE_SUBSET (this);
const hb_hashmap_t<hb_tag_t, float>* user_axes_location = &c->plan->user_axes_location;
const hb_hashmap_t<hb_tag_t, Triple>* user_axes_location = &c->plan->user_axes_location;
if (keep_axis_value (axis_records, user_axes_location))
return_trace (c->serializer->embed (this));
@ -291,7 +303,7 @@ struct AxisValueFormat4
{ return axisValues.as_array (axisCount)[axis_index]; }
bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
const hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
{
hb_array_t<const AxisValueRecord> axis_value_records = axisValues.as_array (axisCount);
@ -301,8 +313,7 @@ struct AxisValueFormat4
float axis_value = rec.get_value ();
hb_tag_t axis_tag = axis_records[axis_idx].get_axis_tag ();
if (user_axes_location->has (axis_tag) &&
fabsf(axis_value - user_axes_location->get (axis_tag)) > 0.001f)
if (axis_value_is_outside_axis_range (axis_tag, axis_value, user_axes_location))
return false;
}
@ -313,7 +324,7 @@ struct AxisValueFormat4
const hb_array_t<const StatAxisRecord> axis_records) const
{
TRACE_SUBSET (this);
const hb_hashmap_t<hb_tag_t, float> *user_axes_location = &c->plan->user_axes_location;
const hb_hashmap_t<hb_tag_t, Triple> *user_axes_location = &c->plan->user_axes_location;
if (!keep_axis_value (axis_records, user_axes_location))
return_trace (false);
@ -402,7 +413,7 @@ struct AxisValue
}
bool keep_axis_value (const hb_array_t<const StatAxisRecord> axis_records,
hb_hashmap_t<hb_tag_t, float> *user_axes_location) const
hb_hashmap_t<hb_tag_t, Triple> *user_axes_location) const
{
switch (u.format)
{
@ -517,7 +528,7 @@ struct STAT
return axis_value.get_value_name_id ();
}
void collect_name_ids (hb_hashmap_t<hb_tag_t, float> *user_axes_location,
void collect_name_ids (hb_hashmap_t<hb_tag_t, Triple> *user_axes_location,
hb_set_t *nameids_to_retain /* OUT */) const
{
if (!has_data ()) return;

Loading…
Cancel
Save