Add option to buffer serialization to not output glyph advances

When advances are not printed, glyph offsets reflect absolute glyph
positions.

New API:
HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES
hb-shape --no-advances
This commit is contained in:
Behdad Esfahbod 2018-01-10 02:20:14 +01:00
parent 316a28f8f8
commit 71fd6325b6
5 changed files with 37 additions and 10 deletions

View File

@ -109,6 +109,7 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
nullptr : hb_buffer_get_glyph_positions (buffer, nullptr); nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
*buf_consumed = 0; *buf_consumed = 0;
hb_position_t x = 0, y = 0;
for (unsigned int i = start; i < end; i++) for (unsigned int i = start; i < end; i++)
{ {
char b[1024]; char b[1024];
@ -146,9 +147,10 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
{ {
p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d", p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"dx\":%d,\"dy\":%d",
pos[i].x_offset, pos[i].y_offset)); x+pos[i].x_offset, y+pos[i].y_offset));
p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d", if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
pos[i].x_advance, pos[i].y_advance)); p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"ax\":%d,\"ay\":%d",
pos[i].x_advance, pos[i].y_advance));
} }
if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS) if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
@ -179,6 +181,12 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer,
*buf = '\0'; *buf = '\0';
} else } else
return i - start; return i - start;
if (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)
{
x += pos[i].x_advance;
y += pos[i].y_advance;
}
} }
return end - start; return end - start;
@ -199,6 +207,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
nullptr : hb_buffer_get_glyph_positions (buffer, nullptr); nullptr : hb_buffer_get_glyph_positions (buffer, nullptr);
*buf_consumed = 0; *buf_consumed = 0;
hb_position_t x = 0, y = 0;
for (unsigned int i = start; i < end; i++) for (unsigned int i = start; i < end; i++)
{ {
char b[1024]; char b[1024];
@ -223,13 +232,16 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS)) if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS))
{ {
if (pos[i].x_offset || pos[i].y_offset) if (x+pos[i].x_offset || y+pos[i].y_offset)
p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", pos[i].x_offset, pos[i].y_offset)); p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "@%d,%d", x+pos[i].x_offset, y+pos[i].y_offset));
*p++ = '+'; if (!(flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES))
p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance)); {
if (pos[i].y_advance) *p++ = '+';
p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance)); p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "%d", pos[i].x_advance));
if (pos[i].y_advance)
p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
}
} }
if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS) if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS)
@ -255,6 +267,12 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer,
*buf = '\0'; *buf = '\0';
} else } else
return i - start; return i - start;
if (flags & HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES)
{
x += pos[i].x_advance;
y += pos[i].y_advance;
}
} }
return end - start; return end - start;

View File

@ -412,6 +412,8 @@ hb_buffer_normalize_glyphs (hb_buffer_t *buffer);
* @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information. * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information.
* @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name. * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name.
* @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents. * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents.
* @HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS: serialize glyph flags. Since: 1.5.0
* @HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES: do not serialize glyph advances. Since: 1.8.0
* *
* Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs(). * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs().
* *
@ -423,7 +425,8 @@ typedef enum { /*< flags >*/
HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS = 0x00000002u, HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS = 0x00000002u,
HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES = 0x00000004u, HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES = 0x00000004u,
HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS = 0x00000008u, HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS = 0x00000008u,
HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS = 0x00000010u HB_BUFFER_SERIALIZE_FLAG_GLYPH_FLAGS = 0x00000010u,
HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES = 0x00000020u
} hb_buffer_serialize_flags_t; } hb_buffer_serialize_flags_t;
/** /**

View File

@ -72,6 +72,8 @@ struct output_buffer_t
flags |= HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS; flags |= HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS;
if (!format.show_positions) if (!format.show_positions)
flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS; flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
if (!format.show_advances)
flags |= HB_BUFFER_SERIALIZE_FLAG_NO_ADVANCES;
if (format.show_extents) if (format.show_extents)
flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS; flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS;
if (format.show_flags) if (format.show_flags)

View File

@ -844,6 +844,8 @@ format_options_t::add_options (option_parser_t *parser)
G_OPTION_ARG_NONE, &this->show_glyph_names, "Output glyph indices instead of names", nullptr}, G_OPTION_ARG_NONE, &this->show_glyph_names, "Output glyph indices instead of names", nullptr},
{"no-positions", 0, G_OPTION_FLAG_REVERSE, {"no-positions", 0, G_OPTION_FLAG_REVERSE,
G_OPTION_ARG_NONE, &this->show_positions, "Do not output glyph positions", nullptr}, G_OPTION_ARG_NONE, &this->show_positions, "Do not output glyph positions", nullptr},
{"no-advances", 0, G_OPTION_FLAG_REVERSE,
G_OPTION_ARG_NONE, &this->show_advances, "Do not output glyph advances", nullptr},
{"no-clusters", 0, G_OPTION_FLAG_REVERSE, {"no-clusters", 0, G_OPTION_FLAG_REVERSE,
G_OPTION_ARG_NONE, &this->show_clusters, "Do not output cluster indices", nullptr}, G_OPTION_ARG_NONE, &this->show_clusters, "Do not output cluster indices", nullptr},
{"show-extents", 0, 0, G_OPTION_ARG_NONE, &this->show_extents, "Output glyph extents", nullptr}, {"show-extents", 0, 0, G_OPTION_ARG_NONE, &this->show_extents, "Output glyph extents", nullptr},

View File

@ -584,6 +584,7 @@ struct format_options_t : option_group_t
format_options_t (option_parser_t *parser) { format_options_t (option_parser_t *parser) {
show_glyph_names = true; show_glyph_names = true;
show_positions = true; show_positions = true;
show_advances = true;
show_clusters = true; show_clusters = true;
show_text = false; show_text = false;
show_unicode = false; show_unicode = false;
@ -628,6 +629,7 @@ struct format_options_t : option_group_t
hb_bool_t show_glyph_names; hb_bool_t show_glyph_names;
hb_bool_t show_positions; hb_bool_t show_positions;
hb_bool_t show_advances;
hb_bool_t show_clusters; hb_bool_t show_clusters;
hb_bool_t show_text; hb_bool_t show_text;
hb_bool_t show_unicode; hb_bool_t show_unicode;