[subset-cff2] Faster instancing
Instantiate blends during parsing. Dedups code as well.
This commit is contained in:
parent
3757baab2c
commit
4867e0b192
|
@ -163,15 +163,14 @@ struct cff2_cs_interp_env_t : cs_interp_env_t<ELEM, CFF2Subrs>
|
||||||
return v;
|
return v;
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
public:
|
||||||
const int *coords;
|
const int *coords;
|
||||||
unsigned int num_coords;
|
unsigned int num_coords;
|
||||||
|
protected:
|
||||||
const CFF2VariationStore *varStore;
|
const CFF2VariationStore *varStore;
|
||||||
unsigned int region_count;
|
unsigned int region_count;
|
||||||
unsigned int ivs;
|
unsigned int ivs;
|
||||||
public:
|
|
||||||
hb_vector_t<float> scalars;
|
hb_vector_t<float> scalars;
|
||||||
protected:
|
|
||||||
bool do_blend;
|
bool do_blend;
|
||||||
bool seen_vsindex_;
|
bool seen_vsindex_;
|
||||||
bool seen_blend;
|
bool seen_blend;
|
||||||
|
@ -224,7 +223,10 @@ struct cff2_cs_opset_t : cs_opset_t<ELEM, OPSET, cff2_cs_interp_env_t<ELEM>, PAR
|
||||||
const hb_array_t<const ELEM> blends,
|
const hb_array_t<const ELEM> blends,
|
||||||
unsigned n, unsigned i)
|
unsigned n, unsigned i)
|
||||||
{
|
{
|
||||||
arg.set_blends (n, i, blends);
|
if (env.num_coords)
|
||||||
|
arg.set_int (round (arg.to_real () + env.blend_deltas (blends)));
|
||||||
|
else
|
||||||
|
arg.set_blends (n, i, blends);
|
||||||
}
|
}
|
||||||
template <typename T = ELEM,
|
template <typename T = ELEM,
|
||||||
hb_enable_if (!hb_is_same (T, blend_arg_t))>
|
hb_enable_if (!hb_is_same (T, blend_arg_t))>
|
||||||
|
@ -233,7 +235,7 @@ struct cff2_cs_opset_t : cs_opset_t<ELEM, OPSET, cff2_cs_interp_env_t<ELEM>, PAR
|
||||||
const hb_array_t<const ELEM> blends,
|
const hb_array_t<const ELEM> blends,
|
||||||
unsigned n, unsigned i)
|
unsigned n, unsigned i)
|
||||||
{
|
{
|
||||||
arg.set_real (arg.to_real () + env.blend_deltas (blends));
|
arg.set_int (round (arg.to_real () + env.blend_deltas (blends)));
|
||||||
}
|
}
|
||||||
|
|
||||||
static void process_blend (cff2_cs_interp_env_t<ELEM> &env, PARAM& param)
|
static void process_blend (cff2_cs_interp_env_t<ELEM> &env, PARAM& param)
|
||||||
|
|
|
@ -122,43 +122,8 @@ struct cff2_cs_opset_flatten_t : cff2_cs_opset_t<cff2_cs_opset_flatten_t, flatte
|
||||||
SUPER::flush_args (env, param);
|
SUPER::flush_args (env, param);
|
||||||
}
|
}
|
||||||
|
|
||||||
static double instantiate_blend (const blend_arg_t &arg, cff2_cs_interp_env_t<blend_arg_t> &env, flatten_param_t& param)
|
|
||||||
{
|
|
||||||
double v = arg.to_real ();
|
|
||||||
|
|
||||||
auto &scalars = env.scalars;
|
|
||||||
auto &deltas = arg.deltas;
|
|
||||||
|
|
||||||
if (scalars.length != deltas.length)
|
|
||||||
return v;
|
|
||||||
|
|
||||||
unsigned count = scalars.length;
|
|
||||||
for (unsigned i = 0; i < count; i++)
|
|
||||||
v += (double) scalars.arrayZ[i] * deltas.arrayZ[i].to_real ();
|
|
||||||
|
|
||||||
return v;
|
|
||||||
}
|
|
||||||
|
|
||||||
static void flatten_blends (const blend_arg_t &arg, unsigned int i, cff2_cs_interp_env_t<blend_arg_t> &env, flatten_param_t& param)
|
static void flatten_blends (const blend_arg_t &arg, unsigned int i, cff2_cs_interp_env_t<blend_arg_t> &env, flatten_param_t& param)
|
||||||
{
|
{
|
||||||
if (param.plan->normalized_coords)
|
|
||||||
{
|
|
||||||
str_encoder_t encoder (param.flatStr);
|
|
||||||
for (unsigned int j = 0; j < arg.numValues; j++)
|
|
||||||
{
|
|
||||||
blend_arg_t arg1 = env.argStack[i + j];
|
|
||||||
if (unlikely (!((arg1.blending () && (arg.numValues == arg1.numValues) && (arg1.valueIndex == j) &&
|
|
||||||
(arg1.deltas.length == env.get_region_count ())))))
|
|
||||||
{
|
|
||||||
env.set_error ();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
arg1.set_int (round (instantiate_blend (arg1, env, param)));
|
|
||||||
encoder.encode_num (arg1);
|
|
||||||
}
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* flatten the default values */
|
/* flatten the default values */
|
||||||
str_encoder_t encoder (param.flatStr);
|
str_encoder_t encoder (param.flatStr);
|
||||||
for (unsigned int j = 0; j < arg.numValues; j++)
|
for (unsigned int j = 0; j < arg.numValues; j++)
|
||||||
|
@ -276,7 +241,7 @@ struct cff2_subset_plan {
|
||||||
|
|
||||||
drop_hints = plan->flags & HB_SUBSET_FLAGS_NO_HINTING;
|
drop_hints = plan->flags & HB_SUBSET_FLAGS_NO_HINTING;
|
||||||
desubroutinize = plan->flags & HB_SUBSET_FLAGS_DESUBROUTINIZE ||
|
desubroutinize = plan->flags & HB_SUBSET_FLAGS_DESUBROUTINIZE ||
|
||||||
plan->normalized_coords;
|
plan->normalized_coords; // For instancing we need this path
|
||||||
|
|
||||||
if (desubroutinize)
|
if (desubroutinize)
|
||||||
{
|
{
|
||||||
|
|
Loading…
Reference in New Issue