Apply non-controversial parts of ot-style (#1464)

Things to be used in https://github.com/harfbuzz/harfbuzz/pull/1459
diff --git a/src/hb-aat-fdsc-table.hh b/src/hb-aat-fdsc-table.hh
index 136172c..c3bc1d5 100644
--- a/src/hb-aat-fdsc-table.hh
+++ b/src/hb-aat-fdsc-table.hh
@@ -26,6 +26,7 @@
 #define HB_AAT_FDSC_TABLE_HH
 
 #include "hb-aat-layout-common.hh"
+#include "hb-open-type.hh"
 
 /*
  * fdsc -- Font descriptors
@@ -37,17 +38,36 @@
 namespace AAT {
 
 
-struct GXFontDescriptor
+struct FontDescriptor
 {
+  inline bool has_data () const { return tag; }
+
+  inline int cmp (hb_tag_t a) const { return tag.cmp (a); }
+
+  inline float get_value () const { return u.value.to_float (); }
+
+  enum non_alphabetic_value_t {
+    Alphabetic		= 0,
+    Dingbats		= 1,
+    PiCharacters	= 2,
+    Fleurons		= 3,
+    DecorativeBorders	= 4,
+    InternationalSymbols= 5,
+    MathSymbols		= 6
+  };
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
     return_trace (c->check_struct (this));
   }
 
-  public:
+  protected:
   Tag		tag;		/* The 4-byte table tag name. */
+  union {
   Fixed		value;		/* The value for the descriptor tag. */
+  HBUINT32	nalfType;	/* If the tag is `nalf`, see non_alphabetic_value_t */
+  } u;
   public:
   DEFINE_SIZE_STATIC (8);
 };
@@ -77,6 +97,9 @@
 				 * (default value: 0) */
   };
 
+  inline const FontDescriptor &get_descriptor (hb_tag_t style) const
+  { return descriptors.lsearch (style); }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
@@ -87,7 +110,7 @@
   protected:
   Fixed		version;	/* Version number of the font descriptors
 				 * table (0x00010000 for the current version). */
-  LArrayOf<GXFontDescriptor>
+  LArrayOf<FontDescriptor>
 		descriptors;	/* List of tagged-coordinate pairs style descriptors
 				 * that will be included to characterize this font.
 				 * Each descriptor consists of a <tag, value> pair.
diff --git a/src/hb-aat-layout-common.hh b/src/hb-aat-layout-common.hh
index 57228c4..74c70de 100644
--- a/src/hb-aat-layout-common.hh
+++ b/src/hb-aat-layout-common.hh
@@ -28,6 +28,7 @@
 #define HB_AAT_LAYOUT_COMMON_HH
 
 #include "hb-aat-layout.hh"
+#include "hb-open-type.hh"
 
 
 namespace AAT {
diff --git a/src/hb-ot-head-table.hh b/src/hb-ot-head-table.hh
index 931ccd4..85867db 100644
--- a/src/hb-ot-head-table.hh
+++ b/src/hb-ot-head-table.hh
@@ -54,6 +54,19 @@
     return 16 <= upem && upem <= 16384 ? upem : 1000;
   }
 
+  enum mac_style_flag_t {
+    BOLD	= 1u<<0,
+    ITALIC	= 1u<<1,
+    UNDERLINE	= 1u<<2,
+    OUTLINE	= 1u<<3,
+    SHADOW	= 1u<<4,
+    CONDENSED	= 1u<<5
+  };
+
+  inline bool is_bold (void) const      { return macStyle & BOLD; }
+  inline bool is_italic (void) const    { return macStyle & ITALIC; }
+  inline bool is_condensed (void) const { return macStyle & CONDENSED; }
+
   inline bool sanitize (hb_sanitize_context_t *c) const
   {
     TRACE_SANITIZE (this);
diff --git a/src/hb-ot-os2-table.hh b/src/hb-ot-os2-table.hh
index 46e8b70..e06ed57 100644
--- a/src/hb-ot-os2-table.hh
+++ b/src/hb-ot-os2-table.hh
@@ -93,10 +93,56 @@
 {
   enum { tableTag = HB_OT_TAG_OS2 };
 
+  inline bool has_data () const { return this != &Null (OS2); }
+
   inline const OS2V1Tail &v1 (void) const { return version >= 1 ? v1X : Null (OS2V1Tail); }
   inline const OS2V2Tail &v2 (void) const { return version >= 2 ? v2X : Null (OS2V2Tail); }
   inline const OS2V5Tail &v5 (void) const { return version >= 5 ? v5X : Null (OS2V5Tail); }
 
+  enum fs_selection_flag_t {
+    ITALIC		= 1u<<0,
+    UNDERSCORE		= 1u<<1,
+    NEGATIVE		= 1u<<2,
+    OUTLINED		= 1u<<3,
+    STRIKEOUT		= 1u<<4,
+    BOLD		= 1u<<5,
+    REGULAR		= 1u<<6,
+    USE_TYPO_METRICS	= 1u<<7,
+    WWS			= 1u<<8,
+    OBLIQUE		= 1u<<9
+  };
+
+  inline bool is_italic (void) const  { return fsSelection & ITALIC; }
+  inline bool is_oblique (void) const { return fsSelection & OBLIQUE; }
+
+  enum us_width_class_t {
+    FWIDTH_ULTRA_CONDENSED	= 1, /* 50% */
+    FWIDTH_EXTRA_CONDENSED	= 2, /* 62.5% */
+    FWIDTH_CONDENSED		= 3, /* 75% */
+    FWIDTH_SEMI_CONDENSED	= 4, /* 87.5% */
+    FWIDTH_NORMAL		= 5, /* 100% */
+    FWIDTH_SEMI_EXPANDED	= 6, /* 112.5% */
+    FWIDTH_EXPANDED		= 7, /* 125% */
+    FWIDTH_EXTRA_EXPANDED	= 8, /* 150% */
+    FWIDTH_ULTRA_EXPANDED	= 9  /* 200% */
+  };
+
+  inline float get_width () const
+  {
+    switch (usWidthClass) {
+    case FWIDTH_ULTRA_CONDENSED:return 50.f;
+    case FWIDTH_EXTRA_CONDENSED:return 62.5f;
+    case FWIDTH_CONDENSED:	return 75.f;
+    case FWIDTH_SEMI_CONDENSED:	return 87.5f;
+    default:
+    case FWIDTH_NORMAL:		return 100.f;
+    case FWIDTH_SEMI_EXPANDED:	return 112.5f;
+    case FWIDTH_EXPANDED:	return 125.f;
+    case FWIDTH_EXTRA_EXPANDED:	return 150.f;
+    case FWIDTH_ULTRA_EXPANDED:	return 200.f;
+    }
+  }
+
   inline bool subset (hb_subset_plan_t *plan) const
   {
     hb_blob_t *os2_blob = hb_sanitize_context_t ().reference_table<OS2> (plan->source);
diff --git a/src/hb-ot-stat-table.hh b/src/hb-ot-stat-table.hh
index 7ad45db..e18ff1e 100644
--- a/src/hb-ot-stat-table.hh
+++ b/src/hb-ot-stat-table.hh
@@ -57,25 +57,6 @@
   // Reserved = 0xFFFC				/* Reserved for future use — set to zero. */
 };
 
-struct StatAxisRecord
-{
-  inline bool sanitize (hb_sanitize_context_t *c) const
-  {
-    TRACE_SANITIZE (this);
-    return_trace (likely (c->check_struct (this)));
-  }
-
-  protected:
-  Tag		axisTag;	/* A tag identifying the axis of design variation. */
-  NameID	axisNameID;	/* The name ID for entries in the 'name' table that
-				 * provide a display string for this axis. */
-  HBUINT16	axisOrdering;	/* A value that applications can use to determine
-				 * primary sorting of face names, or for ordering
-				 * of descriptors when composing family or face names. */
-  public:
-  DEFINE_SIZE_STATIC (8);
-};
-
 struct AxisValueFormat1
 {
   inline bool sanitize (hb_sanitize_context_t *c) const
@@ -223,6 +204,25 @@
   DEFINE_SIZE_UNION (2, format);
 };
 
+struct StatAxisRecord
+{
+  inline bool sanitize (hb_sanitize_context_t *c) const
+  {
+    TRACE_SANITIZE (this);
+    return_trace (likely (c->check_struct (this)));
+  }
+
+  protected:
+  Tag		tag;		/* A tag identifying the axis of design variation. */
+  NameID	nameID;		/* The name ID for entries in the 'name' table that
+				 * provide a display string for this axis. */
+  HBUINT16	ordering;	/* A value that applications can use to determine
+				 * primary sorting of face names, or for ordering
+				 * of descriptors when composing family or face names. */
+  public:
+  DEFINE_SIZE_STATIC (8);
+};
+
 struct STAT
 {
   enum { tableTag = HB_OT_TAG_STAT };