[ot-glyph] noop->nil, fix close path

This commit is contained in:
Ebrahim Byagowi 2020-01-23 14:48:59 +03:30
parent 79fed9a1e4
commit 684ff3e0cd
4 changed files with 29 additions and 32 deletions

View File

@ -345,7 +345,7 @@ bool OT::cff1::accelerator_t::get_extents (hb_font_t *font, hb_codepoint_t glyph
struct cff1_path_param_t struct cff1_path_param_t
{ {
void init (const OT::cff1::accelerator_t *cff_, hb_font_t *font_, cff1_path_param_t (const OT::cff1::accelerator_t *cff_, hb_font_t *font_,
const hb_ot_glyph_decompose_funcs_t *funcs_, void *user_data_, const hb_ot_glyph_decompose_funcs_t *funcs_, void *user_data_,
point_t *delta_) point_t *delta_)
{ {
@ -356,6 +356,7 @@ struct cff1_path_param_t
user_data = user_data_; user_data = user_data_;
delta = delta_; delta = delta_;
} }
~cff1_path_param_t () { end_path (); }
void start_path () { funcs->open_path (user_data); path_open = true; } void start_path () { funcs->open_path (user_data); path_open = true; }
void end_path () { if (path_open) funcs->close_path (user_data); path_open = false; } void end_path () { if (path_open) funcs->close_path (user_data); path_open = false; }
@ -457,8 +458,7 @@ bool _get_path (const OT::cff1::accelerator_t *cff, hb_font_t *font, hb_codepoin
const byte_str_t str = (*cff->charStrings)[glyph]; const byte_str_t str = (*cff->charStrings)[glyph];
interp.env.init (str, *cff, fd); interp.env.init (str, *cff, fd);
interp.env.set_in_seac (in_seac); interp.env.set_in_seac (in_seac);
cff1_path_param_t param; cff1_path_param_t param (cff, font, funcs, user_data, delta);
param.init (cff, font, funcs, user_data, delta);
if (unlikely (!interp.interpret (param))) return false; if (unlikely (!interp.interpret (param))) return false;
return true; return true;
} }

View File

@ -145,13 +145,14 @@ bool OT::cff2::accelerator_t::get_extents (hb_font_t *font,
struct cff2_path_param_t struct cff2_path_param_t
{ {
void init (hb_font_t *font_, const hb_ot_glyph_decompose_funcs_t *funcs_, void *user_data_) cff2_path_param_t (hb_font_t *font_, const hb_ot_glyph_decompose_funcs_t *funcs_, void *user_data_)
{ {
path_open = false; path_open = false;
font = font_; font = font_;
funcs = funcs_; funcs = funcs_;
user_data = user_data_; user_data = user_data_;
} }
~cff2_path_param_t () { end_path (); }
void start_path () { funcs->open_path (user_data); path_open = true; } void start_path () { funcs->open_path (user_data); path_open = true; }
void end_path () { if (path_open) funcs->close_path (user_data); path_open = false; } void end_path () { if (path_open) funcs->close_path (user_data); path_open = false; }
@ -223,8 +224,7 @@ bool OT::cff2::accelerator_t::get_path (hb_font_t *font, hb_codepoint_t glyph,
cff2_cs_interpreter_t<cff2_cs_opset_path_t, cff2_path_param_t> interp; cff2_cs_interpreter_t<cff2_cs_opset_path_t, cff2_path_param_t> interp;
const byte_str_t str = (*charStrings)[glyph]; const byte_str_t str = (*charStrings)[glyph];
interp.env.init (str, *this, fd, font->coords, font->num_coords); interp.env.init (str, *this, fd, font->coords, font->num_coords);
cff2_path_param_t param; cff2_path_param_t param (font, funcs, user_data);
param.init (font, funcs, user_data);
if (unlikely (!interp.interpret (param))) return false; if (unlikely (!interp.interpret (param))) return false;
return true; return true;
} }

View File

@ -135,23 +135,20 @@ hb_ot_glyph_decompose_funcs_set_close_path_func (hb_ot_glyph_decompose_funcs_t
} }
static void static void
_move_to_noop (hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED, void *user_data HB_UNUSED) {} _move_line_to_nil (hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED, void *user_data HB_UNUSED) {}
static void static void
_line_to_noop (hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED, void *user_data HB_UNUSED) {} _conic_to_nil (hb_position_t control_x HB_UNUSED, hb_position_t control_y HB_UNUSED,
static void
_conic_to_noop (hb_position_t control_x HB_UNUSED, hb_position_t control_y HB_UNUSED,
hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED, hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED,
void *user_data HB_UNUSED) {} void *user_data HB_UNUSED) {}
static void static void
_cubic_to_noop (hb_position_t control1_x HB_UNUSED, hb_position_t control1_y HB_UNUSED, _cubic_to_nil (hb_position_t control1_x HB_UNUSED, hb_position_t control1_y HB_UNUSED,
hb_position_t control2_x HB_UNUSED, hb_position_t control2_y HB_UNUSED, hb_position_t control2_x HB_UNUSED, hb_position_t control2_y HB_UNUSED,
hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED, hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED,
void *user_data HB_UNUSED) {} void *user_data HB_UNUSED) {}
static void static void
_open_close_path_noop (void *user_data HB_UNUSED) {} _open_close_path_nil (void *user_data HB_UNUSED) {}
/** /**
* hb_ot_glyph_decompose_funcs_create: * hb_ot_glyph_decompose_funcs_create:
@ -167,12 +164,12 @@ hb_ot_glyph_decompose_funcs_create ()
if (unlikely (!(funcs = hb_object_create<hb_ot_glyph_decompose_funcs_t> ()))) if (unlikely (!(funcs = hb_object_create<hb_ot_glyph_decompose_funcs_t> ())))
return const_cast<hb_ot_glyph_decompose_funcs_t *> (&Null (hb_ot_glyph_decompose_funcs_t)); return const_cast<hb_ot_glyph_decompose_funcs_t *> (&Null (hb_ot_glyph_decompose_funcs_t));
funcs->move_to = (hb_ot_glyph_decompose_move_to_func_t) _move_to_noop; funcs->move_to = (hb_ot_glyph_decompose_move_to_func_t) _move_line_to_nil;
funcs->line_to = (hb_ot_glyph_decompose_line_to_func_t) _line_to_noop; funcs->line_to = (hb_ot_glyph_decompose_line_to_func_t) _move_line_to_nil;
funcs->conic_to = (hb_ot_glyph_decompose_conic_to_func_t) _conic_to_noop; funcs->conic_to = (hb_ot_glyph_decompose_conic_to_func_t) _conic_to_nil;
funcs->cubic_to = (hb_ot_glyph_decompose_cubic_to_func_t) _cubic_to_noop; funcs->cubic_to = (hb_ot_glyph_decompose_cubic_to_func_t) _cubic_to_nil;
funcs->open_path = (hb_ot_glyph_decompose_open_path_func_t) _open_close_path_noop; funcs->open_path = (hb_ot_glyph_decompose_open_path_func_t) _open_close_path_nil;
funcs->close_path = (hb_ot_glyph_decompose_close_path_func_t) _open_close_path_noop; funcs->close_path = (hb_ot_glyph_decompose_close_path_func_t) _open_close_path_nil;
return funcs; return funcs;
} }

View File

@ -80,7 +80,6 @@ open_path (user_data_t *user_data HB_UNUSED) {}
static void static void
close_path (user_data_t *user_data) close_path (user_data_t *user_data)
{ {
if (!user_data->consumed) return; /* XXX: CFF tables are inserting an Z in the beginning, we should resolve it */
user_data->consumed += snprintf (user_data->str + user_data->consumed, user_data->consumed += snprintf (user_data->str + user_data->consumed,
user_data->size - user_data->consumed, user_data->size - user_data->consumed,
"Z"); "Z");
@ -154,9 +153,9 @@ test_hb_ot_glyph_cff1 (void)
.consumed = 0 .consumed = 0
}; };
g_assert (hb_ot_glyph_decompose (font, 3, funcs, &user_data)); g_assert (hb_ot_glyph_decompose (font, 3, funcs, &user_data));
char expected[] = "M203,367C227,440 248,512 268,588L272,588C293,512 314,440 338,367L369,267" char expected[] = "M203,367C227,440 248,512 268,588L272,588C293,512 314,440 338,367L369,267L172,267Z"
"L172,267ZM3,0L88,0L151,200L390,200L452,0L541,0L319,656" "M3,0L88,0L151,200L390,200L452,0L541,0L319,656L225,656Z"
"L225,656ZM300,653L342,694L201,861L143,806"; "M300,653L342,694L201,861L143,806Z";
g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1); g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
hb_font_destroy (font); hb_font_destroy (font);
@ -178,9 +177,9 @@ test_hb_ot_glyph_cff2 (void)
g_assert (hb_ot_glyph_decompose (font, 3, funcs, &user_data)); g_assert (hb_ot_glyph_decompose (font, 3, funcs, &user_data));
char expected[] = "M275,442C303,442 337,435 371,417L325,454L350,366" char expected[] = "M275,442C303,442 337,435 371,417L325,454L350,366"
"C357,341 370,321 403,321C428,321 443,333 448,358" "C357,341 370,321 403,321C428,321 443,333 448,358"
"C435,432 361,487 272,487C153,487 43,393 43,236C43,83 129,-13 266,-13" "C435,432 361,487 272,487C153,487 43,393 43,236"
"C360,-13 424,33 451,116L427,128C396,78 345,50 287,50" "C43,83 129,-13 266,-13C360,-13 424,33 451,116L427,128"
"C193,50 126,119 126,245C126,373 188,442 275,442"; "C396,78 345,50 287,50C193,50 126,119 126,245C126,373 188,442 275,442Z";
g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1); g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
hb_variation_t var; hb_variation_t var;
@ -195,10 +194,11 @@ test_hb_ot_glyph_cff2 (void)
.consumed = 0 .consumed = 0
}; };
g_assert (hb_ot_glyph_decompose (font, 3, funcs, &user_data2)); g_assert (hb_ot_glyph_decompose (font, 3, funcs, &user_data2));
char expected2[] = "M323,448C356,448 380,441 411,427L333,469L339,401C343,322 379,297 420,297" char expected2[] = "M323,448C356,448 380,441 411,427L333,469L339,401"
"C458,297 480,314 492,352C486,433 412,501 303,501C148,501 25,406 25,241" "C343,322 379,297 420,297C458,297 480,314 492,352"
"C25,70 143,-16 279,-16C374,-16 447,22 488,103L451,137C423,107 390,86 344,86" "C486,433 412,501 303,501C148,501 25,406 25,241"
"C262,86 209,148 209,261C209,398 271,448 323,448"; "C25,70 143,-16 279,-16C374,-16 447,22 488,103L451,137"
"C423,107 390,86 344,86C262,86 209,148 209,261C209,398 271,448 323,448Z";
g_assert_cmpmem (str2, user_data2.consumed, expected2, sizeof (expected2) - 1); g_assert_cmpmem (str2, user_data2.consumed, expected2, sizeof (expected2) - 1);
hb_font_destroy (font); hb_font_destroy (font);