Add API/cmdline to show glyph extents when serializing buffer

New API: HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS

hb-shape now accepts --show-extents.

Patch from Simon Cozens.
diff --git a/src/hb-buffer-serialize.cc b/src/hb-buffer-serialize.cc
index 8a22224..81f75ae 100644
--- a/src/hb-buffer-serialize.cc
+++ b/src/hb-buffer-serialize.cc
@@ -145,6 +145,16 @@
 		     pos[i].x_advance, pos[i].y_advance);
     }
 
+    if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
+    {
+      hb_glyph_extents_t extents;
+      hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"xb\":%d,\"yb\":%d",
+        extents.x_bearing, extents.y_bearing));
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",\"w\":%d,\"h\":%d",
+        extents.width, extents.height));
+    }
+
     *p++ = '}';
 
     unsigned int l = p - b;
@@ -210,6 +220,13 @@
 	p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), ",%d", pos[i].y_advance));
     }
 
+    if (flags & HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS)
+    {
+      hb_glyph_extents_t extents;
+      hb_font_get_glyph_extents(font, info[i].codepoint, &extents);
+      p += MAX (0, snprintf (p, ARRAY_LENGTH (b) - (p - b), "<%d,%d,%d,%d>", extents.x_bearing, extents.y_bearing, extents.width, extents.height));
+    }
+
     unsigned int l = p - b;
     if (buf_size > l)
     {
diff --git a/src/hb-buffer.h b/src/hb-buffer.h
index 4b285bb..1cfe13c 100644
--- a/src/hb-buffer.h
+++ b/src/hb-buffer.h
@@ -323,7 +323,8 @@
   HB_BUFFER_SERIALIZE_FLAG_DEFAULT		= 0x00000000u,
   HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS		= 0x00000001u,
   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_flags_t;
 
 typedef enum {
diff --git a/util/hb-shape.cc b/util/hb-shape.cc
index f38f387..3bd2184 100644
--- a/util/hb-shape.cc
+++ b/util/hb-shape.cc
@@ -70,6 +70,8 @@
       flags |= HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS;
     if (!format.show_positions)
       flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS;
+    if (format.show_extents)
+      flags |= HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS;
     format_flags = (hb_buffer_serialize_flags_t) flags;
   }
   void new_line (void)
diff --git a/util/options.cc b/util/options.cc
index 0821a17..0005f5c 100644
--- a/util/options.cc
+++ b/util/options.cc
@@ -706,6 +706,7 @@
 			      G_OPTION_ARG_NONE,	&this->show_positions,		"Do not output glyph positions",					NULL},
     {"no-clusters",	0, G_OPTION_FLAG_REVERSE,
 			      G_OPTION_ARG_NONE,	&this->show_clusters,		"Do not output cluster indices",					NULL},
+    {"show-extents",	0, 0, G_OPTION_ARG_NONE,	&this->show_extents,		"Output glyph extents",							NULL},
     {NULL}
   };
   parser->add_group (entries,
diff --git a/util/options.hh b/util/options.hh
index 6eb6c04..f1ec8cf 100644
--- a/util/options.hh
+++ b/util/options.hh
@@ -410,6 +410,7 @@
     show_text = false;
     show_unicode = false;
     show_line_num = false;
+    show_extents = false;
 
     add_options (parser);
   }
@@ -450,6 +451,7 @@
   hb_bool_t show_text;
   hb_bool_t show_unicode;
   hb_bool_t show_line_num;
+  hb_bool_t show_extents;
 };