[subset] Re-add glyphs array to subset plan, with new name 'glyphs_deprecated'. Switch CFF subsetting to use it.
This commit is contained in:
parent
03e88eab5c
commit
846e05a298
@ -469,11 +469,11 @@ struct cff_subset_plan {
|
|||||||
supp_size = 0;
|
supp_size = 0;
|
||||||
supp_codes.init ();
|
supp_codes.init ();
|
||||||
|
|
||||||
subset_enc_num_codes = plan->glyphs.length - 1;
|
subset_enc_num_codes = plan->glyphs_deprecated.length - 1;
|
||||||
unsigned int glyph;
|
unsigned int glyph;
|
||||||
for (glyph = 1; glyph < plan->glyphs.length; glyph++)
|
for (glyph = 1; glyph < plan->glyphs_deprecated.length; glyph++)
|
||||||
{
|
{
|
||||||
hb_codepoint_t orig_glyph = plan->glyphs[glyph];
|
hb_codepoint_t orig_glyph = plan->glyphs_deprecated[glyph];
|
||||||
code = acc.glyph_to_code (orig_glyph);
|
code = acc.glyph_to_code (orig_glyph);
|
||||||
if (code == CFF_UNDEF_CODE)
|
if (code == CFF_UNDEF_CODE)
|
||||||
{
|
{
|
||||||
@ -526,9 +526,9 @@ struct cff_subset_plan {
|
|||||||
|
|
||||||
subset_charset_ranges.resize (0);
|
subset_charset_ranges.resize (0);
|
||||||
unsigned int glyph;
|
unsigned int glyph;
|
||||||
for (glyph = 1; glyph < plan->glyphs.length; glyph++)
|
for (glyph = 1; glyph < plan->glyphs_deprecated.length; glyph++)
|
||||||
{
|
{
|
||||||
hb_codepoint_t orig_glyph = plan->glyphs[glyph];
|
hb_codepoint_t orig_glyph = plan->glyphs_deprecated[glyph];
|
||||||
sid = acc.glyph_to_sid (orig_glyph);
|
sid = acc.glyph_to_sid (orig_glyph);
|
||||||
|
|
||||||
if (!acc.is_CID ())
|
if (!acc.is_CID ())
|
||||||
@ -544,7 +544,7 @@ struct cff_subset_plan {
|
|||||||
|
|
||||||
bool two_byte = subset_charset_ranges.finalize (glyph);
|
bool two_byte = subset_charset_ranges.finalize (glyph);
|
||||||
|
|
||||||
size0 = Charset0::min_size + HBUINT16::static_size * (plan->glyphs.length - 1);
|
size0 = Charset0::min_size + HBUINT16::static_size * (plan->glyphs_deprecated.length - 1);
|
||||||
if (!two_byte)
|
if (!two_byte)
|
||||||
size_ranges = Charset1::min_size + Charset1_Range::static_size * subset_charset_ranges.length;
|
size_ranges = Charset1::min_size + Charset1_Range::static_size * subset_charset_ranges.length;
|
||||||
else
|
else
|
||||||
@ -559,7 +559,7 @@ struct cff_subset_plan {
|
|||||||
|
|
||||||
return Charset::calculate_serialized_size (
|
return Charset::calculate_serialized_size (
|
||||||
subset_charset_format,
|
subset_charset_format,
|
||||||
subset_charset_format? subset_charset_ranges.length: plan->glyphs.length);
|
subset_charset_format? subset_charset_ranges.length: plan->glyphs_deprecated.length);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool collect_sids_in_dicts (const OT::cff1::accelerator_subset_t &acc)
|
bool collect_sids_in_dicts (const OT::cff1::accelerator_subset_t &acc)
|
||||||
@ -589,19 +589,19 @@ struct cff_subset_plan {
|
|||||||
hb_subset_plan_t *plan)
|
hb_subset_plan_t *plan)
|
||||||
{
|
{
|
||||||
/* make sure notdef is first */
|
/* make sure notdef is first */
|
||||||
if ((plan->glyphs.length == 0) || (plan->glyphs[0] != 0)) return false;
|
if ((plan->glyphs_deprecated.length == 0) || (plan->glyphs_deprecated[0] != 0)) return false;
|
||||||
|
|
||||||
final_size = 0;
|
final_size = 0;
|
||||||
num_glyphs = plan->glyphs.length;
|
num_glyphs = plan->glyphs_deprecated.length;
|
||||||
orig_fdcount = acc.fdCount;
|
orig_fdcount = acc.fdCount;
|
||||||
drop_hints = plan->drop_hints;
|
drop_hints = plan->drop_hints;
|
||||||
desubroutinize = plan->desubroutinize;
|
desubroutinize = plan->desubroutinize;
|
||||||
|
|
||||||
/* check whether the subset renumbers any glyph IDs */
|
/* check whether the subset renumbers any glyph IDs */
|
||||||
gid_renum = false;
|
gid_renum = false;
|
||||||
for (unsigned int glyph = 0; glyph < plan->glyphs.length; glyph++)
|
for (unsigned int glyph = 0; glyph < plan->glyphs_deprecated.length; glyph++)
|
||||||
{
|
{
|
||||||
if (plan->glyphs[glyph] != glyph) {
|
if (plan->glyphs_deprecated[glyph] != glyph) {
|
||||||
gid_renum = true;
|
gid_renum = true;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@ -644,7 +644,7 @@ struct cff_subset_plan {
|
|||||||
/* Determine re-mapping of font index as fdmap among other info */
|
/* Determine re-mapping of font index as fdmap among other info */
|
||||||
if (acc.fdSelect != &Null(CFF1FDSelect))
|
if (acc.fdSelect != &Null(CFF1FDSelect))
|
||||||
{
|
{
|
||||||
if (unlikely (!hb_plan_subset_cff_fdselect (plan->glyphs,
|
if (unlikely (!hb_plan_subset_cff_fdselect (plan->glyphs_deprecated,
|
||||||
orig_fdcount,
|
orig_fdcount,
|
||||||
*acc.fdSelect,
|
*acc.fdSelect,
|
||||||
subset_fdcount,
|
subset_fdcount,
|
||||||
@ -681,7 +681,7 @@ struct cff_subset_plan {
|
|||||||
{
|
{
|
||||||
/* Flatten global & local subrs */
|
/* Flatten global & local subrs */
|
||||||
subr_flattener_t<const OT::cff1::accelerator_subset_t, cff1_cs_interp_env_t, cff1_cs_opset_flatten_t>
|
subr_flattener_t<const OT::cff1::accelerator_subset_t, cff1_cs_interp_env_t, cff1_cs_opset_flatten_t>
|
||||||
flattener(acc, plan->glyphs, plan->drop_hints);
|
flattener(acc, plan->glyphs_deprecated, plan->drop_hints);
|
||||||
if (!flattener.flatten (subset_charstrings))
|
if (!flattener.flatten (subset_charstrings))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -691,11 +691,11 @@ struct cff_subset_plan {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Subset subrs: collect used subroutines, leaving all unused ones behind */
|
/* Subset subrs: collect used subroutines, leaving all unused ones behind */
|
||||||
if (!subr_subsetter.subset (acc, plan->glyphs, plan->drop_hints))
|
if (!subr_subsetter.subset (acc, plan->glyphs_deprecated, plan->drop_hints))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* encode charstrings, global subrs, local subrs with new subroutine numbers */
|
/* encode charstrings, global subrs, local subrs with new subroutine numbers */
|
||||||
if (!subr_subsetter.encode_charstrings (acc, plan->glyphs, subset_charstrings))
|
if (!subr_subsetter.encode_charstrings (acc, plan->glyphs_deprecated, subset_charstrings))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
|
if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
|
||||||
@ -784,7 +784,7 @@ struct cff_subset_plan {
|
|||||||
offsets.charStringsInfo.offSize = calcOffSize (dataSize);
|
offsets.charStringsInfo.offSize = calcOffSize (dataSize);
|
||||||
if (unlikely (offsets.charStringsInfo.offSize > 4))
|
if (unlikely (offsets.charStringsInfo.offSize > 4))
|
||||||
return false;
|
return false;
|
||||||
final_size += CFF1CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->glyphs.length, dataSize);
|
final_size += CFF1CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->glyphs_deprecated.length, dataSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* private dicts & local subrs */
|
/* private dicts & local subrs */
|
||||||
@ -816,7 +816,7 @@ struct cff_subset_plan {
|
|||||||
if (!acc.is_CID ())
|
if (!acc.is_CID ())
|
||||||
offsets.privateDictInfo = fontdicts_mod[0].privateDictInfo;
|
offsets.privateDictInfo = fontdicts_mod[0].privateDictInfo;
|
||||||
|
|
||||||
return ((subset_charstrings.length == plan->glyphs.length)
|
return ((subset_charstrings.length == plan->glyphs_deprecated.length)
|
||||||
&& (fontdicts_mod.length == subset_fdcount));
|
&& (fontdicts_mod.length == subset_fdcount));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1064,7 +1064,7 @@ _hb_subset_cff1 (const OT::cff1::accelerator_subset_t &acc,
|
|||||||
unsigned int cff_prime_size = cff_plan.get_final_size ();
|
unsigned int cff_prime_size = cff_plan.get_final_size ();
|
||||||
char *cff_prime_data = (char *) calloc (1, cff_prime_size);
|
char *cff_prime_data = (char *) calloc (1, cff_prime_size);
|
||||||
|
|
||||||
if (unlikely (!_write_cff1 (cff_plan, acc, plan->glyphs,
|
if (unlikely (!_write_cff1 (cff_plan, acc, plan->glyphs_deprecated,
|
||||||
cff_prime_size, cff_prime_data))) {
|
cff_prime_size, cff_prime_data))) {
|
||||||
DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff.");
|
DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff.");
|
||||||
free (cff_prime_data);
|
free (cff_prime_data);
|
||||||
|
@ -287,7 +287,7 @@ struct cff2_subset_plan {
|
|||||||
{
|
{
|
||||||
/* Flatten global & local subrs */
|
/* Flatten global & local subrs */
|
||||||
subr_flattener_t<const OT::cff2::accelerator_subset_t, cff2_cs_interp_env_t, cff2_cs_opset_flatten_t>
|
subr_flattener_t<const OT::cff2::accelerator_subset_t, cff2_cs_interp_env_t, cff2_cs_opset_flatten_t>
|
||||||
flattener(acc, plan->glyphs, plan->drop_hints);
|
flattener(acc, plan->glyphs_deprecated, plan->drop_hints);
|
||||||
if (!flattener.flatten (subset_charstrings))
|
if (!flattener.flatten (subset_charstrings))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@ -297,11 +297,11 @@ struct cff2_subset_plan {
|
|||||||
else
|
else
|
||||||
{
|
{
|
||||||
/* Subset subrs: collect used subroutines, leaving all unused ones behind */
|
/* Subset subrs: collect used subroutines, leaving all unused ones behind */
|
||||||
if (!subr_subsetter.subset (acc, plan->glyphs, plan->drop_hints))
|
if (!subr_subsetter.subset (acc, plan->glyphs_deprecated, plan->drop_hints))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
/* encode charstrings, global subrs, local subrs with new subroutine numbers */
|
/* encode charstrings, global subrs, local subrs with new subroutine numbers */
|
||||||
if (!subr_subsetter.encode_charstrings (acc, plan->glyphs, subset_charstrings))
|
if (!subr_subsetter.encode_charstrings (acc, plan->glyphs_deprecated, subset_charstrings))
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
|
if (!subr_subsetter.encode_globalsubrs (subset_globalsubrs))
|
||||||
@ -352,7 +352,7 @@ struct cff2_subset_plan {
|
|||||||
if (acc.fdSelect != &Null(CFF2FDSelect))
|
if (acc.fdSelect != &Null(CFF2FDSelect))
|
||||||
{
|
{
|
||||||
offsets.FDSelectInfo.offset = final_size;
|
offsets.FDSelectInfo.offset = final_size;
|
||||||
if (unlikely (!hb_plan_subset_cff_fdselect (plan->glyphs,
|
if (unlikely (!hb_plan_subset_cff_fdselect (plan->glyphs_deprecated,
|
||||||
orig_fdcount,
|
orig_fdcount,
|
||||||
*(const FDSelect *)acc.fdSelect,
|
*(const FDSelect *)acc.fdSelect,
|
||||||
subset_fdcount,
|
subset_fdcount,
|
||||||
@ -385,7 +385,7 @@ struct cff2_subset_plan {
|
|||||||
offsets.charStringsInfo.offset = final_size;
|
offsets.charStringsInfo.offset = final_size;
|
||||||
unsigned int dataSize = subset_charstrings.total_size ();
|
unsigned int dataSize = subset_charstrings.total_size ();
|
||||||
offsets.charStringsInfo.offSize = calcOffSize (dataSize);
|
offsets.charStringsInfo.offSize = calcOffSize (dataSize);
|
||||||
final_size += CFF2CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->glyphs.length, dataSize);
|
final_size += CFF2CharStrings::calculate_serialized_size (offsets.charStringsInfo.offSize, plan->glyphs_deprecated.length, dataSize);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* private dicts & local subrs */
|
/* private dicts & local subrs */
|
||||||
@ -584,7 +584,7 @@ _hb_subset_cff2 (const OT::cff2::accelerator_subset_t &acc,
|
|||||||
unsigned int cff2_prime_size = cff2_plan.get_final_size ();
|
unsigned int cff2_prime_size = cff2_plan.get_final_size ();
|
||||||
char *cff2_prime_data = (char *) calloc (1, cff2_prime_size);
|
char *cff2_prime_data = (char *) calloc (1, cff2_prime_size);
|
||||||
|
|
||||||
if (unlikely (!_write_cff2 (cff2_plan, acc, plan->glyphs,
|
if (unlikely (!_write_cff2 (cff2_plan, acc, plan->glyphs_deprecated,
|
||||||
cff2_prime_size, cff2_prime_data))) {
|
cff2_prime_size, cff2_prime_data))) {
|
||||||
DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff2.");
|
DEBUG_MSG(SUBSET, nullptr, "Failed to write a subset cff2.");
|
||||||
free (cff2_prime_data);
|
free (cff2_prime_data);
|
||||||
|
@ -53,6 +53,9 @@ struct hb_subset_plan_t
|
|||||||
hb_map_t *glyph_map;
|
hb_map_t *glyph_map;
|
||||||
hb_map_t *reverse_glyph_map;
|
hb_map_t *reverse_glyph_map;
|
||||||
|
|
||||||
|
// Deprecated members:
|
||||||
|
hb_vector_t<hb_codepoint_t> glyphs_deprecated;
|
||||||
|
|
||||||
// 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;
|
||||||
|
Loading…
Reference in New Issue
Block a user