[hb-shape] Add --show-text and --show-unicode options
diff --git a/util/hb-shape.cc b/util/hb-shape.cc
index 906bac2..1910848 100644
--- a/util/hb-shape.cc
+++ b/util/hb-shape.cc
@@ -42,6 +42,7 @@
   protected:
   GString *gs;
   hb_font_t *font;
+  hb_buffer_t *scratch;
 };
 
 void
@@ -50,6 +51,7 @@
   get_file_handle ();
   font = hb_font_reference (font_opts->get_font ());
   gs = g_string_new (NULL);
+  scratch = hb_buffer_create ();
 }
 
 void
@@ -58,13 +60,28 @@
 			       unsigned int  text_len)
 {
   g_string_set_size (gs, 0);
-  serialize (buffer, font, gs);
+
+  if (show_text) {
+    g_string_append_len (gs, text, text_len);
+    g_string_append_c (gs, '\n');
+  }
+
+  if (show_unicode) {
+    hb_buffer_reset (scratch);
+    hb_buffer_add_utf8 (scratch, text, text_len, 0, -1);
+    serialize_unicode (buffer, gs);
+    g_string_append_c (gs, '\n');
+  }
+
+  serialize_glyphs (buffer, font, gs);
   fprintf (fp, "%s\n", gs->str);
 }
 
 void
 output_buffer_t::finish (const font_options_t *font_opts)
 {
+  hb_buffer_destroy (scratch);
+  scratch = NULL;
   g_string_free (gs, TRUE);
   gs = NULL;
   hb_font_destroy (font);
diff --git a/util/options.cc b/util/options.cc
index 6585eb4..e497d72 100644
--- a/util/options.cc
+++ b/util/options.cc
@@ -676,6 +676,8 @@
     {"no-glyph-names",	0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE,	&this->show_glyph_names,	"Use glyph indices instead of names",	NULL},
     {"no-positions",	0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE,	&this->show_positions,		"Do not show glyph positions",		NULL},
     {"no-clusters",	0, G_OPTION_FLAG_REVERSE, G_OPTION_ARG_NONE,	&this->show_clusters,		"Do not show cluster mapping",		NULL},
+    {"show-text",	0, 0,			  G_OPTION_ARG_NONE,	&this->show_text,		"Show input text",			NULL},
+    {"show-unicode",	0, 0,			  G_OPTION_ARG_NONE,	&this->show_unicode,		"Show input Unicode codepoints",	NULL},
     {NULL}
   };
   parser->add_group (entries,
@@ -686,9 +688,27 @@
 }
 
 void
-format_options_t::serialize (hb_buffer_t *buffer,
-			     hb_font_t   *font,
-			     GString     *gs)
+format_options_t::serialize_unicode (hb_buffer_t *buffer,
+				     GString     *gs)
+{
+  unsigned int num_glyphs = hb_buffer_get_length (buffer);
+  hb_glyph_info_t *info = hb_buffer_get_glyph_infos (buffer, NULL);
+
+  g_string_append_c (gs, '<');
+  for (unsigned int i = 0; i < num_glyphs; i++)
+  {
+    if (i)
+      g_string_append_c (gs, ',');
+    g_string_append_printf (gs, "U+%04X", info->codepoint);
+    info++;
+  }
+  g_string_append_c (gs, '>');
+}
+
+void
+format_options_t::serialize_glyphs (hb_buffer_t *buffer,
+				    hb_font_t   *font,
+				    GString     *gs)
 {
   FT_Face ft_face = show_glyph_names ? hb_ft_font_get_face (font) : NULL;
 
diff --git a/util/options.hh b/util/options.hh
index fbf5f36..470a313 100644
--- a/util/options.hh
+++ b/util/options.hh
@@ -283,6 +283,8 @@
     show_glyph_names = true;
     show_positions = true;
     show_clusters = true;
+    show_text = false;
+    show_unicode = false;
 
     add_options (parser);
   }
@@ -291,14 +293,18 @@
 
   void add_options (option_parser_t *parser);
 
-  void serialize (hb_buffer_t *buffer,
-		  hb_font_t   *font,
-		  GString     *gs);
+  void serialize_unicode (hb_buffer_t *buffer,
+			  GString     *gs);
+  void serialize_glyphs (hb_buffer_t *buffer,
+			 hb_font_t   *font,
+			 GString     *gs);
 
   protected:
   hb_bool_t show_glyph_names;
   hb_bool_t show_positions;
   hb_bool_t show_clusters;
+  hb_bool_t show_text;
+  hb_bool_t show_unicode;
 };