[hb-info] Add --quiet
diff --git a/util/hb-info.cc b/util/hb-info.cc
index 03ee8e1..d49d604 100644
--- a/util/hb-info.cc
+++ b/util/hb-info.cc
@@ -56,9 +56,12 @@
 		       false /* We add below. */);
   }
 
-  private:
+  protected:
   hb_face_t *face = nullptr;
   hb_font_t *font = nullptr;
+
+  hb_bool_t verbose = true;
+
   hb_bool_t list_all = false;
   hb_bool_t list_tables = false;
   hb_bool_t list_unicodes = false;
@@ -67,12 +70,15 @@
 #ifndef HB_NO_VAR
   hb_bool_t list_variations = false;
 #endif
+
   public:
 
-  void operator () (font_options_t *font_opts)
+  template <typename app_t>
+  void operator () (app_t *app)
   {
-    face = hb_face_reference (font_opts->face);
-    font = hb_font_reference (font_opts->font);
+    face = hb_face_reference (((font_options_t *) app)->face);
+    font = hb_font_reference (((font_options_t *) app)->font);
+    verbose = !app->quiet;
 
     if (list_all)
     {
@@ -98,10 +104,16 @@
     hb_face_destroy (face);
   }
 
-  private:
+  protected:
 
   void _list_tables ()
   {
+    if (verbose)
+    {
+      printf ("\nFont table information:");
+      printf ("\nTag	Size\n");
+    }
+
     unsigned count = hb_face_get_table_tags (face, 0, nullptr, nullptr);
     hb_tag_t *tags = (hb_tag_t *) calloc (count, sizeof (hb_tag_t));
     hb_face_get_table_tags (face, 0, &count, tags);
@@ -123,6 +135,12 @@
   void
   _list_unicodes ()
   {
+    if (verbose)
+    {
+      printf ("\nCharacter-set information:");
+      printf ("\nUnicode	Glyph name\n");
+    }
+
     hb_face_t *face = hb_font_get_face (font);
 
     hb_set_t *unicodes = hb_set_create ();
@@ -178,6 +196,12 @@
   void
   _list_glyphs ()
   {
+    if (verbose)
+    {
+      printf ("\nGlyph-set information:");
+      printf ("\nGlyphID	Glyph name\n");
+    }
+
     hb_face_t *face = hb_font_get_face (font);
 
     unsigned num_glyphs = hb_face_get_glyph_count (face);
@@ -195,6 +219,11 @@
   void
   _list_features ()
   {
+    if (verbose)
+    {
+      printf ("\nLayout features information:\n");
+    }
+
     hb_tag_t table_tags[] = {HB_OT_TAG_GSUB, HB_OT_TAG_GPOS, HB_TAG_NONE};
     auto language = hb_language_get_default ();
     hb_set_t *features = hb_set_create ();
@@ -297,6 +326,11 @@
   void
   _list_variations ()
   {
+    if (verbose)
+    {
+      printf ("\nFace variations information:\n");
+    }
+
     hb_ot_var_axis_info_t *axes;
 
     unsigned count = hb_ot_var_get_axis_infos (face, 0, nullptr, nullptr);
@@ -306,8 +340,11 @@
     auto language = hb_language_get_default ();
     bool has_hidden = false;
 
-    printf ("Varitation axes:\n");
-    printf ("Tag:	Minimum	Default	Maximum	Name\n\n");
+    if (verbose && count)
+    {
+      printf ("Varitation axes:\n");
+      printf ("Tag:	Minimum	Default	Maximum	Name\n\n");
+    }
     for (unsigned i = 0; i < count; i++)
     {
       const auto &axis = axes[i];
@@ -338,7 +375,10 @@
     count = hb_ot_var_get_named_instance_count (face);
     if (count)
     {
-      printf ("\n\nNamed instances: \n\n");
+      if (verbose)
+      {
+	printf ("\n\nNamed instances: \n\n");
+      }
 
       for (unsigned i = 0; i < count; i++)
       {
@@ -394,6 +434,7 @@
 
     GOptionEntry entries[] =
     {
+      {"quiet",		'q', 0, G_OPTION_ARG_NONE,	&this->quiet,			"Generate machine-readable output",	nullptr},
       {G_OPTION_REMAINING,	0, G_OPTION_FLAG_IN_MAIN,
 				G_OPTION_ARG_CALLBACK,	(gpointer) &collect_rest,	nullptr,	"[FONT-FILE]"},
       {nullptr}
@@ -422,6 +463,9 @@
 		 "Too many arguments on the command line");
     return false;
   }
+
+  public:
+  hb_bool_t quiet = false;
 };
 
 int