26 #ifndef HB_CFF_INTERP_CS_COMMON_HH
27 #define HB_CFF_INTERP_CS_COMMON_HH
62 template <
typename SUBRS>
65 void init (
const SUBRS *subrs_)
71 else if (nSubrs < 33900)
112 template <
typename ARG,
typename SUBRS>
147 int n = SUPER::argStack.pop_int ();
152 subr_num = (
unsigned int)
n;
158 unsigned int subr_num = 0;
219 template <
typename ENV,
typename PARAM>
244 template <
typename ARG,
typename OPSET,
typename ENV,
typename PARAM,
typename PATH=path_procs_null_t<ENV, PARAM>>
252 env.return_from_subr ();
255 OPSET::check_width (
op, env,
param);
256 env.set_endchar (
true);
257 OPSET::flush_args_and_op (
op, env,
param);
261 env.argStack.push_fixed_from_substr (env.str_ref);
274 OPSET::check_width (
op, env,
param);
275 OPSET::process_hstem (
op, env,
param);
279 OPSET::check_width (
op, env,
param);
280 OPSET::process_vstem (
op, env,
param);
284 OPSET::check_width (
op, env,
param);
285 OPSET::process_hintmask (
op, env,
param);
288 OPSET::check_width (
op, env,
param);
289 PATH::rmoveto (env,
param);
290 OPSET::process_post_move (
op, env,
param);
293 OPSET::check_width (
op, env,
param);
294 PATH::hmoveto (env,
param);
295 OPSET::process_post_move (
op, env,
param);
298 OPSET::check_width (
op, env,
param);
299 PATH::vmoveto (env,
param);
300 OPSET::process_post_move (
op, env,
param);
303 PATH::rlineto (env,
param);
307 PATH::hlineto (env,
param);
311 PATH::vlineto (env,
param);
315 PATH::rrcurveto (env,
param);
319 PATH::rcurveline (env,
param);
323 PATH::rlinecurve (env,
param);
327 PATH::vvcurveto (env,
param);
331 PATH::hhcurveto (env,
param);
335 PATH::vhcurveto (env,
param);
339 PATH::hvcurveto (env,
param);
344 PATH::hflex (env,
param);
345 OPSET::process_post_flex (
op, env,
param);
349 PATH::flex (env,
param);
350 OPSET::process_post_flex (
op, env,
param);
354 PATH::hflex1 (env,
param);
355 OPSET::process_post_flex (
op, env,
param);
359 PATH::flex1 (env,
param);
360 OPSET::process_post_flex (
op, env,
param);
364 SUPER::process_op (
op, env);
371 env.hstem_count += env.argStack.get_count () / 2;
372 OPSET::flush_args_and_op (
op, env,
param);
377 env.vstem_count += env.argStack.get_count () / 2;
378 OPSET::flush_args_and_op (
op, env,
param);
383 env.determine_hintmask_size ();
384 if (
likely (env.str_ref.avail (env.hintmask_size)))
386 OPSET::flush_hintmask (
op, env,
param);
387 env.str_ref.inc (env.hintmask_size);
393 OPSET::flush_args_and_op (
op, env,
param);
401 if (!env.seen_moveto)
403 env.determine_hintmask_size ();
404 env.seen_moveto =
true;
406 OPSET::flush_args_and_op (
op, env,
param);
411 OPSET::flush_args_and_op (
op, env,
param);
416 OPSET::flush_args (env,
param);
417 OPSET::flush_op (
op, env,
param);
422 env.pop_n_args (env.argStack.get_count ());
431 OPSET::flush_args_and_op (
op, env,
param);
456 template <
typename PATH,
typename ENV,
typename PARAM>
462 const number_t &dy = env.pop_arg ();
463 const number_t &dx = env.pop_arg ();
465 PATH::moveto (env,
param, pt1);
471 pt1.
move_x (env.pop_arg ());
472 PATH::moveto (env,
param, pt1);
478 pt1.
move_y (env.pop_arg ());
479 PATH::moveto (env,
param, pt1);
484 for (
unsigned int i = 0;
i + 2 <= env.argStack.get_count ();
i += 2)
487 pt1.
move (env.eval_arg (
i), env.eval_arg (
i+1));
496 for (;
i + 2 <= env.argStack.get_count ();
i += 2)
501 pt1.
move_y (env.eval_arg (
i+1));
504 if (
i < env.argStack.get_count ())
516 for (;
i + 2 <= env.argStack.get_count ();
i += 2)
521 pt1.
move_x (env.eval_arg (
i+1));
524 if (
i < env.argStack.get_count ())
534 for (
unsigned int i = 0;
i + 6 <= env.argStack.get_count ();
i += 6)
537 pt1.
move (env.eval_arg (
i), env.eval_arg (
i+1));
539 pt2.
move (env.eval_arg (
i+2), env.eval_arg (
i+3));
541 pt3.
move (env.eval_arg (
i+4), env.eval_arg (
i+5));
542 PATH::curve (env,
param, pt1, pt2, pt3);
548 unsigned int arg_count = env.argStack.get_count ();
553 unsigned int curve_limit = arg_count - 2;
554 for (;
i + 6 <= curve_limit;
i += 6)
557 pt1.
move (env.eval_arg (
i), env.eval_arg (
i+1));
559 pt2.
move (env.eval_arg (
i+2), env.eval_arg (
i+3));
561 pt3.
move (env.eval_arg (
i+4), env.eval_arg (
i+5));
562 PATH::curve (env,
param, pt1, pt2, pt3);
566 pt1.
move (env.eval_arg (
i), env.eval_arg (
i+1));
572 unsigned int arg_count = env.argStack.get_count ();
577 unsigned int line_limit = arg_count - 6;
578 for (;
i + 2 <= line_limit;
i += 2)
581 pt1.
move (env.eval_arg (
i), env.eval_arg (
i+1));
586 pt1.
move (env.eval_arg (
i), env.eval_arg (
i+1));
588 pt2.
move (env.eval_arg (
i+2), env.eval_arg (
i+3));
590 pt3.
move (env.eval_arg (
i+4), env.eval_arg (
i+5));
591 PATH::curve (env,
param, pt1, pt2, pt3);
598 if ((env.argStack.get_count () & 1) != 0)
599 pt1.
move_x (env.eval_arg (
i++));
600 for (;
i + 4 <= env.argStack.get_count ();
i += 4)
604 pt2.
move (env.eval_arg (
i+1), env.eval_arg (
i+2));
606 pt3.
move_y (env.eval_arg (
i+3));
607 PATH::curve (env,
param, pt1, pt2, pt3);
616 if ((env.argStack.get_count () & 1) != 0)
617 pt1.
move_y (env.eval_arg (
i++));
618 for (;
i + 4 <= env.argStack.get_count ();
i += 4)
622 pt2.
move (env.eval_arg (
i+1), env.eval_arg (
i+2));
624 pt3.
move_x (env.eval_arg (
i+3));
625 PATH::curve (env,
param, pt1, pt2, pt3);
634 if ((env.argStack.get_count () % 8) >= 4)
639 pt2.
move (env.eval_arg (
i+1), env.eval_arg (
i+2));
641 pt3.
move_x (env.eval_arg (
i+3));
644 for (;
i + 8 <= env.argStack.get_count ();
i += 8)
646 PATH::curve (env,
param, pt1, pt2, pt3);
650 pt2.
move (env.eval_arg (
i+1), env.eval_arg (
i+2));
652 pt3.
move_y (env.eval_arg (
i+3));
653 PATH::curve (env,
param, pt1, pt2, pt3);
656 pt1.
move_y (env.eval_arg (
i+4));
658 pt2.
move (env.eval_arg (
i+5), env.eval_arg (
i+6));
660 pt3.
move_x (env.eval_arg (
i+7));
662 if (
i < env.argStack.get_count ())
664 PATH::curve (env,
param, pt1, pt2, pt3);
668 for (;
i + 8 <= env.argStack.get_count ();
i += 8)
673 pt2.
move (env.eval_arg (
i+1), env.eval_arg (
i+2));
675 pt3.
move_x (env.eval_arg (
i+3));
676 PATH::curve (env,
param, pt1, pt2, pt3);
679 pt1.
move_x (env.eval_arg (
i+4));
681 pt2.
move (env.eval_arg (
i+5), env.eval_arg (
i+6));
683 pt3.
move_y (env.eval_arg (
i+7));
684 if ((env.argStack.get_count () -
i < 16) && ((env.argStack.get_count () & 1) != 0))
685 pt3.
move_x (env.eval_arg (
i+8));
686 PATH::curve (env,
param, pt1, pt2, pt3);
695 if ((env.argStack.get_count () % 8) >= 4)
700 pt2.
move (env.eval_arg (
i+1), env.eval_arg (
i+2));
702 pt3.
move_y (env.eval_arg (
i+3));
705 for (;
i + 8 <= env.argStack.get_count ();
i += 8)
707 PATH::curve (env,
param, pt1, pt2, pt3);
711 pt2.
move (env.eval_arg (
i+1), env.eval_arg (
i+2));
713 pt3.
move_x (env.eval_arg (
i+3));
714 PATH::curve (env,
param, pt1, pt2, pt3);
717 pt1.
move_x (env.eval_arg (
i+4));
719 pt2.
move (env.eval_arg (
i+5), env.eval_arg (
i+6));
721 pt3.
move_y (env.eval_arg (
i+7));
723 if (
i < env.argStack.get_count ())
725 PATH::curve (env,
param, pt1, pt2, pt3);
729 for (;
i + 8 <= env.argStack.get_count ();
i += 8)
734 pt2.
move (env.eval_arg (
i+1), env.eval_arg (
i+2));
736 pt3.
move_y (env.eval_arg (
i+3));
737 PATH::curve (env,
param, pt1, pt2, pt3);
740 pt1.
move_y (env.eval_arg (
i+4));
742 pt2.
move (env.eval_arg (
i+5), env.eval_arg (
i+6));
744 pt3.
move_x (env.eval_arg (
i+7));
745 if ((env.argStack.get_count () -
i < 16) && ((env.argStack.get_count () & 1) != 0))
746 pt3.
move_y (env.eval_arg (
i+8));
747 PATH::curve (env,
param, pt1, pt2, pt3);
757 { PATH::moveto (env,
param, pt1); }
760 { PATH::moveto (env,
param, pt3); }
764 if (
likely (env.argStack.get_count () == 7))
767 pt1.
move_x (env.eval_arg (0));
769 pt2.
move (env.eval_arg (1), env.eval_arg (2));
771 pt3.
move_x (env.eval_arg (3));
773 pt4.
move_x (env.eval_arg (4));
775 pt5.
move_x (env.eval_arg (5));
778 pt6.
move_x (env.eval_arg (6));
788 if (
likely (env.argStack.get_count () == 13))
791 pt1.
move (env.eval_arg (0), env.eval_arg (1));
793 pt2.
move (env.eval_arg (2), env.eval_arg (3));
795 pt3.
move (env.eval_arg (4), env.eval_arg (5));
797 pt4.
move (env.eval_arg (6), env.eval_arg (7));
799 pt5.
move (env.eval_arg (8), env.eval_arg (9));
801 pt6.
move (env.eval_arg (10), env.eval_arg (11));
811 if (
likely (env.argStack.get_count () == 9))
814 pt1.
move (env.eval_arg (0), env.eval_arg (1));
816 pt2.
move (env.eval_arg (2), env.eval_arg (3));
818 pt3.
move_x (env.eval_arg (4));
820 pt4.
move_x (env.eval_arg (5));
822 pt5.
move (env.eval_arg (6), env.eval_arg (7));
824 pt6.
move_x (env.eval_arg (8));
825 pt6.
y = env.get_pt ().y;
835 if (
likely (env.argStack.get_count () == 11))
838 for (
unsigned int i = 0;
i < 10;
i += 2)
839 d.move (env.eval_arg (
i), env.eval_arg (
i+1));
842 pt1.
move (env.eval_arg (0), env.eval_arg (1));
844 pt2.
move (env.eval_arg (2), env.eval_arg (3));
846 pt3.
move (env.eval_arg (4), env.eval_arg (5));
848 pt4.
move (env.eval_arg (6), env.eval_arg (7));
850 pt5.
move (env.eval_arg (8), env.eval_arg (9));
853 if (fabs (
d.x.to_real ()) > fabs (
d.y.to_real ()))
855 pt6.
move_x (env.eval_arg (10));
856 pt6.
y = env.get_pt ().y;
860 pt6.
x = env.get_pt ().x;
861 pt6.
move_y (env.eval_arg (10));
875 PATH::curve (env,
param, pt1, pt2, pt3);
876 PATH::curve (env,
param, pt4, pt5, pt6);
880 template <
typename ENV,
typename OPSET,
typename PARAM>
885 SUPER::env.set_endchar (
false);
888 OPSET::process_op (SUPER::env.fetch_op (), SUPER::env,
param);
889 if (
unlikely (SUPER::env.in_error ()))
891 if (SUPER::env.is_endchar ())
small capitals from c petite p scientific i
[1]
#define OpCode_rlinecurve
#define OpCode_TwoBytePosInt1
#define OpCode_OneByteIntLast
#define OpCode_TwoBytePosInt3
#define OpCode_TwoBytePosInt2
#define OpCode_TwoBytePosInt0
#define OpCode_rcurveline
#define OpCode_TwoByteNegInt1
#define OpCode_TwoByteNegInt2
#define OpCode_OneByteIntFirst
#define OpCode_TwoByteNegInt3
#define OpCode_TwoByteNegInt0
const unsigned int kMaxCallLimit
set set set set set set set macro pixldst1 op
GLint GLint GLint GLint GLint x
[0]
GLenum const GLint * param
void init(const SUBRS *subrs_)
unsigned int get_bias() const
byte_str_t operator[](unsigned int index) const
unsigned int get_count() const
void init(const byte_str_ref_t substr_=byte_str_ref_t(), cs_type_t type_=CSType_CharString, unsigned int subr_num_=0)
unsigned int get_count() const
void determine_hintmask_size()
biased_subrs_t< SUBRS > globalSubrs
const number_t & get_x() const
void init(const byte_str_t &str, const SUBRS *globalSubrs_, const SUBRS *localSubrs_)
unsigned int hintmask_size
bool pop_subr_num(const biased_subrs_t< SUBRS > &biasedSubrs, unsigned int &subr_num)
void call_subr(const biased_subrs_t< SUBRS > &biasedSubrs, cs_type_t type)
biased_subrs_t< SUBRS > localSubrs
void moveto(const point_t &pt_)
void set_endchar(bool endchar_flag_)
const number_t & get_y() const
const point_t & get_pt() const
bool interpret(PARAM ¶m)
static void process_post_flex(op_code_t op, ENV &env, PARAM ¶m)
static void process_hintmask(op_code_t op, ENV &env, PARAM ¶m)
static void check_width(op_code_t op, ENV &env, PARAM ¶m)
static void flush_args(ENV &env, PARAM ¶m)
static void process_hstem(op_code_t op, ENV &env, PARAM ¶m)
static void flush_hintmask(op_code_t op, ENV &env, PARAM ¶m)
static void flush_op(op_code_t op, ENV &env, PARAM ¶m)
static void process_post_move(op_code_t op, ENV &env, PARAM ¶m)
static void process_vstem(op_code_t op, ENV &env, PARAM ¶m)
static bool is_number_op(op_code_t op)
static void flush_args_and_op(op_code_t op, ENV &env, PARAM ¶m)
static void process_post_path(op_code_t op, ENV &env, PARAM ¶m)
static void process_op(op_code_t op, ENV &env, PARAM ¶m)
void init(const byte_str_t &str_)
static void hvcurveto(ENV &env, PARAM ¶m)
static void rlinecurve(ENV &env, PARAM ¶m)
static void vlineto(ENV &env, PARAM ¶m)
static void rlineto(ENV &env, PARAM ¶m)
static void flex(ENV &env, PARAM ¶m)
static void hhcurveto(ENV &env, PARAM ¶m)
static void rmoveto(ENV &env, PARAM ¶m)
static void moveto(ENV &env, PARAM ¶m, const point_t &pt)
static void rrcurveto(ENV &env, PARAM ¶m)
static void line(ENV &env, PARAM ¶m, const point_t &pt1)
static void hflex1(ENV &env, PARAM ¶m)
static void vhcurveto(ENV &env, PARAM ¶m)
static void rcurveline(ENV &env, PARAM ¶m)
static void curve(ENV &env, PARAM ¶m, const point_t &pt1, const point_t &pt2, const point_t &pt3)
static void vmoveto(ENV &env, PARAM ¶m)
static void hflex(ENV &env, PARAM ¶m)
static void hmoveto(ENV &env, PARAM ¶m)
static void hlineto(ENV &env, PARAM ¶m)
static void vvcurveto(ENV &env, PARAM ¶m)
static void flex1(ENV &env, PARAM ¶m)
static void rmoveto(ENV &env, PARAM ¶m)
static void curve2(ENV &env, PARAM ¶m, const point_t &pt1, const point_t &pt2, const point_t &pt3, const point_t &pt4, const point_t &pt5, const point_t &pt6)
static void rlineto(ENV &env, PARAM ¶m)
static void hlineto(ENV &env, PARAM ¶m)
static void hvcurveto(ENV &env, PARAM ¶m)
static void curve(ENV &env, PARAM ¶m, const point_t &pt1, const point_t &pt2, const point_t &pt3)
static void rlinecurve(ENV &env, PARAM ¶m)
static void hhcurveto(ENV &env, PARAM ¶m)
static void flex(ENV &env, PARAM ¶m)
static void hflex1(ENV &env, PARAM ¶m)
static void moveto(ENV &env, PARAM ¶m, const point_t &pt)
static void vhcurveto(ENV &env, PARAM ¶m)
static void flex1(ENV &env, PARAM ¶m)
static void rcurveline(ENV &env, PARAM ¶m)
static void hmoveto(ENV &env, PARAM ¶m)
static void hflex(ENV &env, PARAM ¶m)
static void rrcurveto(ENV &env, PARAM ¶m)
static void vvcurveto(ENV &env, PARAM ¶m)
static void line(ENV &env, PARAM ¶m, const point_t &pt1)
static void vlineto(ENV &env, PARAM ¶m)
static void vmoveto(ENV &env, PARAM ¶m)
void move(const number_t &dx, const number_t &dy)
void set_int(int _x, int _y)
void move(const point_t &d)
void move_y(const number_t &dy)
void move_x(const number_t &dx)