[subset] use a reference to cached global/loca subrs.
Previously they were being copied in. Copying is no longer necessary now that hint dropping doesn't mutate the arrays.
This commit is contained in:
parent
ded9de9cd8
commit
bd37900e0d
|
@ -606,33 +606,33 @@ struct subr_subsetter_t
|
||||||
// If we are not dropping hinting then charstrings are not modified so we can
|
// If we are not dropping hinting then charstrings are not modified so we can
|
||||||
// just use a reference to the cached copies.
|
// just use a reference to the cached copies.
|
||||||
cached_charstrings.resize (plan->num_output_glyphs ());
|
cached_charstrings.resize (plan->num_output_glyphs ());
|
||||||
|
parsed_global_subrs = &cff_accelerator->parsed_global_subrs;
|
||||||
|
parsed_local_subrs = &cff_accelerator->parsed_local_subrs;
|
||||||
} else {
|
} else {
|
||||||
parsed_charstrings.resize (plan->num_output_glyphs ());
|
parsed_charstrings.resize (plan->num_output_glyphs ());
|
||||||
}
|
parsed_global_subrs_storage.resize (acc.globalSubrs->count);
|
||||||
|
|
||||||
parsed_global_subrs.resize (acc.globalSubrs->count);
|
if (unlikely (!parsed_local_subrs_storage.resize (fd_count))) return false;
|
||||||
|
|
||||||
|
for (unsigned int i = 0; i < acc.fdCount; i++)
|
||||||
|
{
|
||||||
|
unsigned count = acc.privateDicts[i].localSubrs->count;
|
||||||
|
parsed_local_subrs_storage[i].resize (count);
|
||||||
|
if (unlikely (parsed_local_subrs_storage[i].in_error ())) return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
parsed_global_subrs = &parsed_global_subrs_storage;
|
||||||
|
parsed_local_subrs = &parsed_local_subrs_storage;
|
||||||
|
}
|
||||||
|
|
||||||
if (unlikely (remaps.in_error()
|
if (unlikely (remaps.in_error()
|
||||||
|| cached_charstrings.in_error ()
|
|| cached_charstrings.in_error ()
|
||||||
|| parsed_charstrings.in_error ()
|
|| parsed_charstrings.in_error ()
|
||||||
|| parsed_global_subrs.in_error ())) {
|
|| parsed_global_subrs->in_error ()
|
||||||
|
|| closures.in_error ())) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (unlikely (!parsed_local_subrs.resize (fd_count))) return false;
|
|
||||||
|
|
||||||
for (unsigned int i = 0; i < acc.fdCount; i++)
|
|
||||||
{
|
|
||||||
unsigned count = cff_accelerator
|
|
||||||
? cff_accelerator->parsed_local_subrs[i].length
|
|
||||||
: acc.privateDicts[i].localSubrs->count;
|
|
||||||
parsed_local_subrs[i].resize (count);
|
|
||||||
if (unlikely (parsed_local_subrs[i].in_error ())) return false;
|
|
||||||
}
|
|
||||||
if (unlikely (closures.in_error ()))
|
|
||||||
return false;
|
|
||||||
|
|
||||||
|
|
||||||
/* phase 1 & 2 */
|
/* phase 1 & 2 */
|
||||||
for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
|
for (unsigned int i = 0; i < plan->num_output_glyphs (); i++)
|
||||||
{
|
{
|
||||||
|
@ -662,8 +662,8 @@ struct subr_subsetter_t
|
||||||
|
|
||||||
parsed_charstrings[i].alloc (str.length / 2);
|
parsed_charstrings[i].alloc (str.length / 2);
|
||||||
subr_subset_param_t param (&parsed_charstrings[i],
|
subr_subset_param_t param (&parsed_charstrings[i],
|
||||||
&parsed_global_subrs,
|
&parsed_global_subrs_storage,
|
||||||
&parsed_local_subrs[fd],
|
&parsed_local_subrs_storage[fd],
|
||||||
&closures.global_closure,
|
&closures.global_closure,
|
||||||
&closures.local_closures[fd],
|
&closures.local_closures[fd],
|
||||||
plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
|
plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
|
||||||
|
@ -679,9 +679,9 @@ struct subr_subsetter_t
|
||||||
// to compute the subroutine closures which would have normally happened during
|
// to compute the subroutine closures which would have normally happened during
|
||||||
// parsing.
|
// parsing.
|
||||||
if (cff_accelerator &&
|
if (cff_accelerator &&
|
||||||
!closure_and_copy_subroutines(!(plan->flags & HB_SUBSET_FLAGS_NO_HINTING),
|
!closure_subroutines(!(plan->flags & HB_SUBSET_FLAGS_NO_HINTING),
|
||||||
cff_accelerator->parsed_global_subrs,
|
*parsed_global_subrs,
|
||||||
cff_accelerator->parsed_local_subrs))
|
*parsed_local_subrs))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if ((plan->flags & HB_SUBSET_FLAGS_NO_HINTING && !cff_accelerator) ||
|
if ((plan->flags & HB_SUBSET_FLAGS_NO_HINTING && !cff_accelerator) ||
|
||||||
|
@ -697,8 +697,8 @@ struct subr_subsetter_t
|
||||||
if (unlikely (fd >= acc.fdCount))
|
if (unlikely (fd >= acc.fdCount))
|
||||||
return false;
|
return false;
|
||||||
subr_subset_param_t param (&parsed_charstrings[i],
|
subr_subset_param_t param (&parsed_charstrings[i],
|
||||||
&parsed_global_subrs,
|
&parsed_global_subrs_storage,
|
||||||
&parsed_local_subrs[fd],
|
&parsed_local_subrs_storage[fd],
|
||||||
&closures.global_closure,
|
&closures.global_closure,
|
||||||
&closures.local_closures[fd],
|
&closures.local_closures[fd],
|
||||||
plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
|
plan->flags & HB_SUBSET_FLAGS_NO_HINTING);
|
||||||
|
@ -715,7 +715,7 @@ struct subr_subsetter_t
|
||||||
/* after dropping hints recreate closures of actually used subrs */
|
/* after dropping hints recreate closures of actually used subrs */
|
||||||
if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING &&
|
if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING &&
|
||||||
!cff_accelerator &&
|
!cff_accelerator &&
|
||||||
!closure_subroutines(false, parsed_global_subrs, parsed_local_subrs)) return false;
|
!closure_subroutines(false, *parsed_global_subrs, *parsed_local_subrs)) return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
remaps.create (closures);
|
remaps.create (closures);
|
||||||
|
@ -766,12 +766,12 @@ struct subr_subsetter_t
|
||||||
|
|
||||||
bool encode_globalsubrs (str_buff_vec_t &buffArray)
|
bool encode_globalsubrs (str_buff_vec_t &buffArray)
|
||||||
{
|
{
|
||||||
return encode_subrs (parsed_global_subrs, remaps.global_remap, 0, buffArray);
|
return encode_subrs (*parsed_global_subrs, remaps.global_remap, 0, buffArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool encode_localsubrs (unsigned int fd, str_buff_vec_t &buffArray) const
|
bool encode_localsubrs (unsigned int fd, str_buff_vec_t &buffArray) const
|
||||||
{
|
{
|
||||||
return encode_subrs (parsed_local_subrs[fd], remaps.local_remaps[fd], fd, buffArray);
|
return encode_subrs ((*parsed_local_subrs)[fd], remaps.local_remaps[fd], fd, buffArray);
|
||||||
}
|
}
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
|
@ -906,31 +906,6 @@ struct subr_subsetter_t
|
||||||
return seen_hint;
|
return seen_hint;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool closure_and_copy_subroutines (bool hinting,
|
|
||||||
parsed_cs_str_vec_t& global_subrs,
|
|
||||||
hb_vector_t<parsed_cs_str_vec_t>& local_subrs)
|
|
||||||
{
|
|
||||||
if (!closure_subroutines(hinting,
|
|
||||||
global_subrs,
|
|
||||||
local_subrs)) return false;
|
|
||||||
|
|
||||||
|
|
||||||
for (unsigned s : closures.global_closure) {
|
|
||||||
parsed_global_subrs[s] = global_subrs[s];
|
|
||||||
}
|
|
||||||
|
|
||||||
unsigned fd = 0;
|
|
||||||
for (const hb_set_t& c : closures.local_closures) {
|
|
||||||
for (unsigned s : c) {
|
|
||||||
parsed_local_subrs[fd][s] = local_subrs[fd][s];
|
|
||||||
}
|
|
||||||
fd++;
|
|
||||||
}
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
bool closure_subroutines (bool hinting,
|
bool closure_subroutines (bool hinting,
|
||||||
parsed_cs_str_vec_t& global_subrs,
|
parsed_cs_str_vec_t& global_subrs,
|
||||||
hb_vector_t<parsed_cs_str_vec_t>& local_subrs)
|
hb_vector_t<parsed_cs_str_vec_t>& local_subrs)
|
||||||
|
@ -1048,8 +1023,8 @@ struct subr_subsetter_t
|
||||||
plan->inprogress_accelerator->cff_accelerator =
|
plan->inprogress_accelerator->cff_accelerator =
|
||||||
cff_subset_accelerator_t::create(acc.blob,
|
cff_subset_accelerator_t::create(acc.blob,
|
||||||
parsed_charstrings,
|
parsed_charstrings,
|
||||||
parsed_global_subrs,
|
parsed_global_subrs_storage,
|
||||||
parsed_local_subrs);
|
parsed_local_subrs_storage);
|
||||||
plan->inprogress_accelerator->destroy_cff_accelerator =
|
plan->inprogress_accelerator->destroy_cff_accelerator =
|
||||||
cff_subset_accelerator_t::destroy;
|
cff_subset_accelerator_t::destroy;
|
||||||
|
|
||||||
|
@ -1075,12 +1050,16 @@ struct subr_subsetter_t
|
||||||
|
|
||||||
hb_vector_t<parsed_cs_str_t*> cached_charstrings;
|
hb_vector_t<parsed_cs_str_t*> cached_charstrings;
|
||||||
parsed_cs_str_vec_t parsed_charstrings;
|
parsed_cs_str_vec_t parsed_charstrings;
|
||||||
parsed_cs_str_vec_t parsed_global_subrs;
|
|
||||||
hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs;
|
parsed_cs_str_vec_t* parsed_global_subrs;
|
||||||
|
hb_vector_t<parsed_cs_str_vec_t>* parsed_local_subrs;
|
||||||
|
|
||||||
subr_remaps_t remaps;
|
subr_remaps_t remaps;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
parsed_cs_str_vec_t parsed_global_subrs_storage;
|
||||||
|
hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs_storage;
|
||||||
typedef typename SUBRS::count_type subr_count_type;
|
typedef typename SUBRS::count_type subr_count_type;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue