diff --git a/src/hb-cff1-interp-cs.hh b/src/hb-cff1-interp-cs.hh index 33c8148d1..d0114613a 100644 --- a/src/hb-cff1-interp-cs.hh +++ b/src/hb-cff1-interp-cs.hh @@ -41,15 +41,10 @@ struct CFF1CSInterpEnv : CSInterpEnv 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 bool has_width; Number width; - static const unsigned int kTransientArraySize = 32; - hb_vector_t transient_array; - private: typedef CSInterpEnv SUPER; }; @@ -83,132 +75,7 @@ struct CFF1CSInterpEnv : CSInterpEnv template > struct CFF1CSOpSet : CSOpSet { - 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) { diff --git a/test/api/fonts/cff1_legacyops.otf b/test/api/fonts/cff1_legacyops.otf deleted file mode 100644 index ca50dab5a..000000000 Binary files a/test/api/fonts/cff1_legacyops.otf and /dev/null differ diff --git a/test/api/test-ot-extents-cff.c b/test/api/test-ot-extents-cff.c index 259437c46..9b3bdf263 100644 --- a/test/api/test-ot-extents-cff.c +++ b/test/api/test-ot-extents-cff.c @@ -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);