From af08f388ab2c2e48f39c0b31644baab5b37c1975 Mon Sep 17 00:00:00 2001 From: Ebrahim Byagowi Date: Mon, 21 Oct 2019 13:28:05 +0330 Subject: [PATCH] [ot-glyph] Support CFF1's seac --- src/hb-ot-cff1-table.cc | 43 +++++++++++++++++++---------------------- 1 file changed, 20 insertions(+), 23 deletions(-) diff --git a/src/hb-ot-cff1-table.cc b/src/hb-ot-cff1-table.cc index 36c737928..e5136e68a 100644 --- a/src/hb-ot-cff1-table.cc +++ b/src/hb-ot-cff1-table.cc @@ -344,13 +344,14 @@ bool OT::cff1::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph struct cff1_path_param_t { - void init (const OT::cff1::accelerator_t *cff_, hb_font_t *font_, hb_vector_t *points_, hb_vector_t *commands_) + void init (const OT::cff1::accelerator_t *cff_, hb_font_t *font_, hb_vector_t *points_, hb_vector_t *commands_, point_t *delta_) { path_open = false; cff = cff_; font = font_; points = points_; commands = commands_; + delta = delta_; } void start_path () { path_open = true; } @@ -359,8 +360,10 @@ struct cff1_path_param_t void push_point (const point_t &p) { - points->push (font->em_scalef_x (p.x.to_real ())); - points->push (font->em_scalef_y (p.y.to_real ())); + point_t point = p; + if (delta) point.move (*delta); + points->push (font->em_scalef_x (point.x.to_real ())); + points->push (font->em_scalef_y (point.y.to_real ())); } void push_command (uint8_t c) { commands->push (c); } @@ -368,6 +371,7 @@ struct cff1_path_param_t hb_font_t *font; hb_vector_t *points; hb_vector_t *commands; + point_t *delta; const OT::cff1::accelerator_t *cff; }; @@ -409,34 +413,27 @@ struct cff1_path_procs_path_t : path_procs_t *points, hb_vector_t *commands, bool in_seac=false); +static bool _get_path (const OT::cff1::accelerator_t *cff, hb_font_t *font, hb_codepoint_t glyph, hb_vector_t *points, hb_vector_t *commands, bool in_seac=false, point_t *delta = nullptr); struct cff1_cs_opset_path_t : cff1_cs_opset_t { static void process_seac (cff1_cs_interp_env_t &env, cff1_path_param_t& param) { -// unsigned int n = env.argStack.get_count (); -// point_t delta; -// delta.x = env.argStack[n-4]; -// delta.y = env.argStack[n-3]; -// hb_codepoint_t base = param.cff->std_code_to_glyph (env.argStack[n-2].to_int ()); -// hb_codepoint_t accent = param.cff->std_code_to_glyph (env.argStack[n-1].to_int ()); + unsigned int n = env.argStack.get_count (); + point_t delta; + delta.x = env.argStack[n-4]; + delta.y = env.argStack[n-3]; + hb_codepoint_t base = param.cff->std_code_to_glyph (env.argStack[n-2].to_int ()); + hb_codepoint_t accent = param.cff->std_code_to_glyph (env.argStack[n-1].to_int ()); -// bounds_t base_bounds, accent_bounds; -// if (likely (!env.in_seac && base && accent -// && _get_path (param.cff, base, base_bounds, true) -// && _get_path (param.cff, accent, accent_bounds, true))) -// { -// param.bounds.merge (base_bounds); -// accent_bounds.offset (delta); -// param.bounds.merge (accent_bounds); -// } -// else -// env.set_error (); + if (unlikely (!(!env.in_seac && base && accent + && _get_path (param.cff, param.font, base, param.points, param.commands, true) + && _get_path (param.cff, param.font, accent, param.points, param.commands, true, &delta)))) + env.set_error (); } }; -bool _get_path (const OT::cff1::accelerator_t *cff, hb_font_t *font, hb_codepoint_t glyph, hb_vector_t *points, hb_vector_t *commands, bool in_seac) +bool _get_path (const OT::cff1::accelerator_t *cff, hb_font_t *font, hb_codepoint_t glyph, hb_vector_t *points, hb_vector_t *commands, bool in_seac, point_t *delta) { if (unlikely (!cff->is_valid () || (glyph >= cff->num_glyphs))) return false; @@ -446,7 +443,7 @@ bool _get_path (const OT::cff1::accelerator_t *cff, hb_font_t *font, hb_codepoin interp.env.init (str, *cff, fd); interp.env.set_in_seac (in_seac); cff1_path_param_t param; - param.init (cff, font, points, commands); + param.init (cff, font, points, commands, delta); if (unlikely (!interp.interpret (param))) return false; return true; }