summaryrefslogtreecommitdiff
path: root/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh')
-rw-r--r--Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh147
1 files changed, 46 insertions, 101 deletions
diff --git a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh
index 3c66119603f..3400892830c 100644
--- a/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh
+++ b/Build/source/libs/harfbuzz/harfbuzz-src/src/hb-subset-cff-common.hh
@@ -44,7 +44,7 @@ struct str_encoder_t
void encode_byte (unsigned char b)
{
- if (unlikely (buff.push (b) == &Crap(unsigned char)))
+ if (unlikely (buff.push (b) == &Crap (unsigned char)))
set_error ();
}
@@ -128,26 +128,17 @@ struct str_encoder_t
bool error;
};
-struct cff_sub_table_offsets_t {
- cff_sub_table_offsets_t () : privateDictsOffset (0)
+struct cff_sub_table_info_t {
+ cff_sub_table_info_t ()
+ : fd_array_link (0),
+ char_strings_link (0)
{
- topDictInfo.init ();
- FDSelectInfo.init ();
- FDArrayInfo.init ();
- charStringsInfo.init ();
- globalSubrsInfo.init ();
- localSubrsInfos.init ();
+ fd_select.init ();
}
- ~cff_sub_table_offsets_t () { localSubrsInfos.fini (); }
-
- table_info_t topDictInfo;
- table_info_t FDSelectInfo;
- table_info_t FDArrayInfo;
- table_info_t charStringsInfo;
- unsigned int privateDictsOffset;
- table_info_t globalSubrsInfo;
- hb_vector_t<table_info_t> localSubrsInfos;
+ table_info_t fd_select;
+ objidx_t fd_array_link;
+ objidx_t char_strings_link;
};
template <typename OPSTR=op_str_t>
@@ -155,40 +146,26 @@ struct cff_top_dict_op_serializer_t : op_serializer_t
{
bool serialize (hb_serialize_context_t *c,
const OPSTR &opstr,
- const cff_sub_table_offsets_t &offsets) const
+ const cff_sub_table_info_t &info) const
{
TRACE_SERIALIZE (this);
switch (opstr.op)
{
case OpCode_CharStrings:
- return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.charStringsInfo.offset));
+ return_trace (FontDict::serialize_link4_op(c, opstr.op, info.char_strings_link, whence_t::Absolute));
case OpCode_FDArray:
- return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.FDArrayInfo.offset));
+ return_trace (FontDict::serialize_link4_op(c, opstr.op, info.fd_array_link, whence_t::Absolute));
case OpCode_FDSelect:
- return_trace (FontDict::serialize_offset4_op(c, opstr.op, offsets.FDSelectInfo.offset));
+ return_trace (FontDict::serialize_link4_op(c, opstr.op, info.fd_select.link, whence_t::Absolute));
default:
return_trace (copy_opstr (c, opstr));
}
return_trace (true);
}
-
- unsigned int calculate_serialized_size (const OPSTR &opstr) const
- {
- switch (opstr.op)
- {
- case OpCode_CharStrings:
- case OpCode_FDArray:
- case OpCode_FDSelect:
- return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (opstr.op);
-
- default:
- return opstr.str.length;
- }
- }
};
struct cff_font_dict_op_serializer_t : op_serializer_t
@@ -202,33 +179,17 @@ struct cff_font_dict_op_serializer_t : op_serializer_t
if (opstr.op == OpCode_Private)
{
/* serialize the private dict size & offset as 2-byte & 4-byte integers */
- if (unlikely (!UnsizedByteStr::serialize_int2 (c, privateDictInfo.size) ||
- !UnsizedByteStr::serialize_int4 (c, privateDictInfo.offset)))
- return_trace (false);
-
- /* serialize the opcode */
- HBUINT8 *p = c->allocate_size<HBUINT8> (1);
- if (unlikely (p == nullptr)) return_trace (false);
- *p = OpCode_Private;
-
- return_trace (true);
+ return_trace (UnsizedByteStr::serialize_int2 (c, privateDictInfo.size) &&
+ Dict::serialize_link4_op (c, opstr.op, privateDictInfo.link, whence_t::Absolute));
}
else
{
HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length);
- if (unlikely (d == nullptr)) return_trace (false);
+ if (unlikely (!d)) return_trace (false);
memcpy (d, &opstr.str[0], opstr.str.length);
}
return_trace (true);
}
-
- unsigned int calculate_serialized_size (const op_str_t &opstr) const
- {
- if (opstr.op == OpCode_Private)
- return OpCode_Size (OpCode_longintdict) + 4 + OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (OpCode_Private);
- else
- return opstr.str.length;
- }
};
struct cff_private_dict_op_serializer_t : op_serializer_t
@@ -238,7 +199,7 @@ struct cff_private_dict_op_serializer_t : op_serializer_t
bool serialize (hb_serialize_context_t *c,
const op_str_t &opstr,
- const unsigned int subrsOffset) const
+ objidx_t subrs_link) const
{
TRACE_SERIALIZE (this);
@@ -246,31 +207,15 @@ struct cff_private_dict_op_serializer_t : op_serializer_t
return true;
if (opstr.op == OpCode_Subrs)
{
- if (desubroutinize || (subrsOffset == 0))
+ if (desubroutinize || !subrs_link)
return_trace (true);
else
- return_trace (FontDict::serialize_offset2_op (c, opstr.op, subrsOffset));
+ return_trace (FontDict::serialize_link2_op (c, opstr.op, subrs_link));
}
else
return_trace (copy_opstr (c, opstr));
}
- unsigned int calculate_serialized_size (const op_str_t &opstr,
- bool has_localsubr=true) const
- {
- if (drop_hints && dict_opset_t::is_hint_op (opstr.op))
- return 0;
- if (opstr.op == OpCode_Subrs)
- {
- if (desubroutinize || !has_localsubr)
- return 0;
- else
- return OpCode_Size (OpCode_shortint) + 2 + OpCode_Size (opstr.op);
- }
- else
- return opstr.str.length;
- }
-
protected:
const bool desubroutinize;
const bool drop_hints;
@@ -300,14 +245,14 @@ struct subr_flattener_t
hb_codepoint_t glyph;
if (!plan->old_gid_for_new_gid (i, &glyph))
{
- /* add an endchar only charstring for a missing glyph if CFF1 */
- if (endchar_op != OpCode_Invalid) flat_charstrings[i].push (endchar_op);
- continue;
+ /* add an endchar only charstring for a missing glyph if CFF1 */
+ if (endchar_op != OpCode_Invalid) flat_charstrings[i].push (endchar_op);
+ continue;
}
const byte_str_t str = (*acc.charStrings)[glyph];
unsigned int fd = acc.fdSelect->get_fd (glyph);
if (unlikely (fd >= acc.fdCount))
- return false;
+ return false;
cs_interpreter_t<ENV, OPSET, flatten_param_t> interp;
interp.env.init (str, acc, fd);
flatten_param_t param = { flat_charstrings[i], plan->drop_hints };
@@ -456,7 +401,7 @@ struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t>
bool vsindex_dropped;
bool has_prefix_;
op_code_t prefix_op_;
- number_t prefix_num_;
+ number_t prefix_num_;
private:
typedef parsed_values_t<parsed_cs_op_t> SUPER;
@@ -516,19 +461,19 @@ struct subr_subset_param_t
template <typename ENV>
void set_current_str (ENV &env, bool calling)
{
- parsed_cs_str_t *parsed_str = get_parsed_str_for_context (env.context);
- if (likely (parsed_str != nullptr))
+ parsed_cs_str_t *parsed_str = get_parsed_str_for_context (env.context);
+ if (unlikely (!parsed_str))
{
- /* If the called subroutine is parsed partially but not completely yet,
- * it must be because we are calling it recursively.
- * Handle it as an error. */
- if (unlikely (calling && !parsed_str->is_parsed () && (parsed_str->values.length > 0)))
- env.set_error ();
- else
- current_parsed_str = parsed_str;
+ env.set_error ();
+ return;
}
- else
+ /* If the called subroutine is parsed partially but not completely yet,
+ * it must be because we are calling it recursively.
+ * Handle it as an error. */
+ if (unlikely (calling && !parsed_str->is_parsed () && (parsed_str->values.length > 0)))
env.set_error ();
+ else
+ current_parsed_str = parsed_str;
}
parsed_cs_str_t *current_parsed_str;
@@ -659,11 +604,11 @@ struct subr_subsetter_t
{
hb_codepoint_t glyph;
if (!plan->old_gid_for_new_gid (i, &glyph))
- continue;
+ continue;
const byte_str_t str = (*acc.charStrings)[glyph];
unsigned int fd = acc.fdSelect->get_fd (glyph);
if (unlikely (fd >= acc.fdCount))
- return false;
+ return false;
cs_interpreter_t<ENV, OPSET, subr_subset_param_t> interp;
interp.env.init (str, acc, fd);
@@ -677,8 +622,8 @@ struct subr_subsetter_t
if (unlikely (!interp.interpret (param)))
return false;
- /* finalize parsed string esp. copy CFF1 width or CFF2 vsindex to the parsed charstring for encoding */
- SUBSETTER::finalize_parsed_str (interp.env, param, parsed_charstrings[i]);
+ /* complete parsed string esp. copy CFF1 width or CFF2 vsindex to the parsed charstring for encoding */
+ SUBSETTER::complete_parsed_str (interp.env, param, parsed_charstrings[i]);
}
if (plan->drop_hints)
@@ -740,13 +685,13 @@ struct subr_subsetter_t
hb_codepoint_t glyph;
if (!plan->old_gid_for_new_gid (i, &glyph))
{
- /* add an endchar only charstring for a missing glyph if CFF1 */
- if (endchar_op != OpCode_Invalid) buffArray[i].push (endchar_op);
- continue;
+ /* add an endchar only charstring for a missing glyph if CFF1 */
+ if (endchar_op != OpCode_Invalid) buffArray[i].push (endchar_op);
+ continue;
}
unsigned int fd = acc.fdSelect->get_fd (glyph);
if (unlikely (fd >= acc.fdCount))
- return false;
+ return false;
if (unlikely (!encode_str (parsed_charstrings[i], fd, buffArray[i])))
return false;
}
@@ -900,11 +845,11 @@ struct subr_subsetter_t
{
parsed_cs_op_t &csop = str.values[pos];
if (csop.op == OpCode_return)
- break;
+ break;
if (!csop.for_drop ())
{
- drop.all_dropped = false;
- break;
+ drop.all_dropped = false;
+ break;
}
}
@@ -986,7 +931,7 @@ struct subr_subsetter_t
}
protected:
- const ACC &acc;
+ const ACC &acc;
const hb_subset_plan_t *plan;
subr_closures_t closures;