[instancer] when iup delta opt is enabled, add default deltas to coords

pull/4563/head
Qunxin Liu 1 year ago
parent f1cdcc70c1
commit a3e3473cc8
  1. 32
      src/hb-ot-var-common.hh
  2. 23
      src/hb-subset-plan.hh

@ -1939,8 +1939,9 @@ struct TupleVariationData
return true;
}
/* merge tuple variations with overlapping tents */
void merge_tuple_variations ()
/* merge tuple variations with overlapping tents, if iup delta optimization
* is enabled, add default deltas to contour_points */
bool merge_tuple_variations (contour_point_vector_t* contour_points = nullptr)
{
hb_vector_t<tuple_delta_t> new_vars;
hb_hashmap_t<const hb_hashmap_t<hb_tag_t, Triple>*, unsigned> m;
@ -1948,7 +1949,15 @@ struct TupleVariationData
for (const tuple_delta_t& var : tuple_vars)
{
/* if all axes are pinned, drop the tuple variation */
if (var.axis_tuples.is_empty ()) continue;
if (var.axis_tuples.is_empty ())
{
/* if iup_delta_optimize is enabled, add deltas to contour coords */
if (contour_points && !contour_points->add_deltas (var.deltas_x,
var.deltas_y,
var.indices))
return false;
continue;
}
unsigned *idx;
if (m.has (&(var.axis_tuples), &idx))
@ -1958,12 +1967,14 @@ struct TupleVariationData
else
{
new_vars.push (var);
m.set (&(var.axis_tuples), i);
if (!m.set (&(var.axis_tuples), i))
return false;
i++;
}
}
tuple_vars.fini ();
tuple_vars = std::move (new_vars);
return true;
}
/* compile all point set and store byte data in a point_set->hb_bytes_t hashmap,
@ -2021,7 +2032,7 @@ struct TupleVariationData
}
}
bool calc_inferred_deltas (contour_point_vector_t& contour_points)
bool calc_inferred_deltas (const contour_point_vector_t& contour_points)
{
for (tuple_delta_t& var : tuple_vars)
if (!var.calc_inferred_deltas (contour_points))
@ -2033,7 +2044,8 @@ struct TupleVariationData
public:
bool instantiate (const hb_hashmap_t<hb_tag_t, Triple>& normalized_axes_location,
const hb_hashmap_t<hb_tag_t, TripleDistances>& axes_triple_distances,
contour_point_vector_t* contour_points = nullptr)
contour_point_vector_t* contour_points = nullptr,
bool optimize = false)
{
if (!tuple_vars) return true;
if (!change_tuple_variations_axis_limits (normalized_axes_location, axes_triple_distances))
@ -2043,7 +2055,13 @@ struct TupleVariationData
if (!calc_inferred_deltas (*contour_points))
return false;
merge_tuple_variations ();
/* if iup delta opt is on, contour_points can't be null */
if (optimize && !contour_points)
return false;
if (!merge_tuple_variations (optimize ? contour_points : nullptr))
return false;
return !tuple_vars.in_error ();
}

@ -78,6 +78,13 @@ struct contour_point_t
y = x * matrix[1] + y * matrix[3];
x = x_;
}
void add_delta (float delta_x, float delta_y)
{
x += delta_x;
y += delta_y;
}
HB_ALWAYS_INLINE
void translate (const contour_point_t &p) { x += p.x; y += p.y; }
@ -99,6 +106,22 @@ struct contour_point_vector_t : hb_vector_t<contour_point_t>
unsigned count = a.length;
hb_memcpy (arrayZ, a.arrayZ, count * sizeof (arrayZ[0]));
}
bool add_deltas (const hb_vector_t<float> deltas_x,
const hb_vector_t<float> deltas_y,
const hb_vector_t<bool> indices)
{
if (indices.length != deltas_x.length ||
indices.length != deltas_y.length)
return false;
for (unsigned i = 0; i < indices.length; i++)
{
if (!indices.arrayZ[i]) continue;
arrayZ[i].add_delta (deltas_x.arrayZ[i], deltas_y.arrayZ[i]);
}
return true;
}
};
namespace OT {

Loading…
Cancel
Save