dropped support of legacy CFF CharString ops

along with test & font
This commit is contained in:
Michiharu Ariza 2018-10-25 13:40:40 -07:00
parent 2ebf360102
commit be746009e9
3 changed files with 1 additions and 157 deletions

View File

@ -41,15 +41,10 @@ struct CFF1CSInterpEnv : CSInterpEnv<Number, CFF1Subrs>
SUPER::init (str, *acc.globalSubrs, *acc.privateDicts[fd].localSubrs);
processed_width = false;
has_width = false;
transient_array.init ();
transient_array.resize (kTransientArraySize);
for (unsigned int i = 0; i < kTransientArraySize; i++)
transient_array[i].set_int (0);
}
inline void fini (void)
{
transient_array.fini ();
SUPER::fini ();
}
@ -73,9 +68,6 @@ struct CFF1CSInterpEnv : CSInterpEnv<Number, CFF1Subrs>
bool has_width;
Number width;
static const unsigned int kTransientArraySize = 32;
hb_vector_t<Number, kTransientArraySize> transient_array;
private:
typedef CSInterpEnv<Number, CFF1Subrs> SUPER;
};
@ -83,132 +75,7 @@ struct CFF1CSInterpEnv : CSInterpEnv<Number, CFF1Subrs>
template <typename OPSET, typename PARAM, typename PATH=PathProcsNull<CFF1CSInterpEnv, PARAM> >
struct CFF1CSOpSet : CSOpSet<Number, OPSET, CFF1CSInterpEnv, PARAM, PATH>
{
static inline void process_op (OpCode op, CFF1CSInterpEnv &env, PARAM& param)
{
Number n1, n2;
switch (op) {
case OpCode_and:
env.argStack.pop_num2 (n1, n2);
env.argStack.push_int ((n1.to_real() != 0.0f) && (n2.to_real() != 0.0f));
break;
case OpCode_or:
env.argStack.pop_num2 (n1, n2);
env.argStack.push_int ((n1.to_real() != 0.0f) || (n2.to_real() != 0.0f));
break;
case OpCode_not:
n1 = env.argStack.pop_num ();
env.argStack.push_int (n1.to_real() == 0.0f);
break;
case OpCode_abs:
n1 = env.argStack.pop_num ();
env.argStack.push_real (fabs(n1.to_real ()));
break;
case OpCode_add:
env.argStack.pop_num2 (n1, n2);
env.argStack.push_real (n1.to_real() + n2.to_real());
break;
case OpCode_sub:
env.argStack.pop_num2 (n1, n2);
env.argStack.push_real (n1.to_real() - n2.to_real());
break;
case OpCode_div:
env.argStack.pop_num2 (n1, n2);
if (unlikely (n2.to_real() == 0.0f))
env.argStack.push_int (0);
else
env.argStack.push_real (n1.to_real() / n2.to_real());
break;
case OpCode_neg:
n1 = env.argStack.pop_num ();
env.argStack.push_real (-n1.to_real ());
break;
case OpCode_eq:
env.argStack.pop_num2 (n1, n2);
env.argStack.push_int (n1.to_real() == n2.to_real());
break;
case OpCode_drop:
n1 = env.argStack.pop_num ();
break;
case OpCode_put:
env.argStack.pop_num2 (n1, n2);
env.transient_array[n2.to_int ()] = n1;
break;
case OpCode_get:
n1 = env.argStack.pop_num ();
env.argStack.push (env.transient_array[n1.to_int ()]);
break;
case OpCode_ifelse:
{
env.argStack.pop_num2 (n1, n2);
bool test = n1.to_real () <= n2.to_real ();
env.argStack.pop_num2 (n1, n2);
env.argStack.push (test? n1: n2);
}
break;
case OpCode_random:
env.argStack.push_int (1); /* we can't deal with random behavior; make it constant */
break;
case OpCode_mul:
env.argStack.pop_num2 (n1, n2);
env.argStack.push_real (n1.to_real() * n2.to_real());
break;
case OpCode_sqrt:
n1 = env.argStack.pop_num ();
env.argStack.push_real ((float)sqrt (n1.to_real ()));
break;
case OpCode_dup:
n1 = env.argStack.pop_num ();
env.argStack.push (n1);
env.argStack.push (n1);
break;
case OpCode_exch:
env.argStack.pop_num2 (n1, n2);
env.argStack.push (n2);
env.argStack.push (n1);
break;
case OpCode_index:
{
n1 = env.argStack.pop_num ();
int i = n1.to_int ();
if (i < 0) i = 0;
if (unlikely ((unsigned int)i >= env.argStack.get_count ()))
{
env.set_error ();
return;
}
env.argStack.push (env.argStack[env.argStack.get_count () - i - 1]);
}
break;
case OpCode_roll:
{
env.argStack.pop_num2 (n1, n2);
int n = n1.to_int ();
int j = n2.to_int ();
if (unlikely (n < 0 || (unsigned int)n > env.argStack.get_count ()))
{
env.set_error ();
return;
}
if (likely (n > 0))
{
if (j < 0)
j = n - (-j % n);
j %= n;
unsigned int top = env.argStack.get_count () - 1;
unsigned int bot = top - n + 1;
env.argStack.reverse_range (top - j + 1, top);
env.argStack.reverse_range (bot, top - j);
env.argStack.reverse_range (bot, top);
}
}
break;
default:
SUPER::process_op (op, env, param);
break;
}
}
/* PostScript-originated legacy opcodes (OpCode_add etc) are unsupported */
static inline void flush_args (CFF1CSInterpEnv &env, PARAM& param, unsigned int start_arg = 0)
{

Binary file not shown.

View File

@ -68,28 +68,6 @@ test_extents_cff1 (void)
hb_font_destroy (font_j);
}
static void
test_extents_cff1_legacyops (void)
{
hb_face_t *face = hb_test_open_font_file ("fonts/cff1_legacyops.otf");
g_assert (face);
hb_font_t *font = hb_font_create (face);
hb_face_destroy (face);
g_assert (font);
hb_ot_font_set_funcs (font);
hb_glyph_extents_t extents;
hb_bool_t result = hb_font_get_glyph_extents (font, 0, &extents);
g_assert (result);
g_assert_cmpint (extents.x_bearing, ==, 20);
g_assert_cmpint (extents.y_bearing, ==, 800);
g_assert_cmpint (extents.width, ==, 160);
g_assert_cmpint (extents.height, ==, -810);
hb_font_destroy (font);
}
static void
test_extents_cff1_flex (void)
{
@ -182,7 +160,6 @@ main (int argc, char **argv)
hb_test_init (&argc, &argv);
hb_test_add (test_extents_cff1);
hb_test_add (test_extents_cff1_legacyops);
hb_test_add (test_extents_cff1_flex);
hb_test_add (test_extents_cff2);
hb_test_add (test_extents_cff2_vsindex);