[instancer] simplify item_variations_t API calls

merge create,instantiate and as_item_varstore into one API
diff --git a/src/hb-ot-var-common.hh b/src/hb-ot-var-common.hh
index 00bea20..ee6e358 100644
--- a/src/hb-ot-var-common.hh
+++ b/src/hb-ot-var-common.hh
@@ -1812,6 +1812,20 @@
   const hb_map_t& get_varidx_map () const
   { return varidx_map; }
 
+  bool instantiate (const VariationStore& varStore,
+                    const hb_subset_plan_t *plan,
+                    bool optimize=true,
+                    bool use_no_variation_idx=true,
+                    const hb_array_t <const hb_inc_bimap_t> inner_maps = hb_array_t<const hb_inc_bimap_t> ())
+  {
+    if (!create_from_item_varstore (varStore, plan->axes_old_index_tag_map, inner_maps))
+      return false;
+    if (!instantiate_tuple_vars (plan->axes_location, plan->axes_triple_distances))
+      return false;
+    return as_item_varstore (optimize, use_no_variation_idx);
+  }
+
+  /* keep below APIs public only for unit test: test-item-varstore */
   bool create_from_item_varstore (const VariationStore& varStore,
                                   const hb_map_t& axes_old_index_tag_map,
                                   const hb_array_t <const hb_inc_bimap_t> inner_maps = hb_array_t<const hb_inc_bimap_t> ())
@@ -1840,8 +1854,8 @@
     return !vars.in_error ();
   }
 
-  bool instantiate (const hb_hashmap_t<hb_tag_t, Triple>& normalized_axes_location,
-                    const hb_hashmap_t<hb_tag_t, TripleDistances>& axes_triple_distances)
+  bool instantiate_tuple_vars (const hb_hashmap_t<hb_tag_t, Triple>& normalized_axes_location,
+                               const hb_hashmap_t<hb_tag_t, TripleDistances>& axes_triple_distances)
   {
     for (tuple_variations_t& tuple_vars : vars)
       if (!tuple_vars.instantiate (normalized_axes_location, axes_triple_distances))
@@ -1926,6 +1940,7 @@
    * varstore by default */
   bool as_item_varstore (bool optimize=true, bool use_no_variation_idx=true)
   {
+    if (!region_list) return false;
     unsigned num_cols = region_list.length;
     /* pre-alloc a 2D vector for all sub_table's VarData rows */
     unsigned total_rows = 0;
diff --git a/src/hb-ot-var-hvar-table.hh b/src/hb-ot-var-hvar-table.hh
index e944ff1..ca1ea1c 100644
--- a/src/hb-ot-var-hvar-table.hh
+++ b/src/hb-ot-var-hvar-table.hh
@@ -347,21 +347,11 @@
 
     if (c->plan->normalized_coords)
     {
-      /* TODO: merge these 3 calls into 1 call that executes all 3
-       * functions */
       item_variations_t item_vars;
-      if (!item_vars.create_from_item_varstore (this+varStore,
-                                                c->plan->axes_old_index_tag_map,
-                                                hvar_plan.inner_maps.as_array ()))
-        return_trace (false);
-
-      if (!item_vars.instantiate (c->plan->axes_location, c->plan->axes_triple_distances))
-        return_trace (false);
-
-      /* if glyph indices are used as implicit delta-set indices, no need to
-       * optimiza varstore, maintain original variation indices */
-      if (!item_vars.as_item_varstore (advMap == 0 ? false : true,
-                                       false /* use_no_variation_idx = false */))
+      if (!item_vars.instantiate (this+varStore, c->plan,
+                                  advMap == 0 ? false : true,
+                                  false, /* use_no_variation_idx = false */
+                                  hvar_plan.inner_maps.as_array ()))
         return_trace (false);
 
       if (!out->varStore.serialize_serialize (c->serializer,
diff --git a/src/hb-ot-var-mvar-table.hh b/src/hb-ot-var-mvar-table.hh
index 9bbd904..ceabc9a 100644
--- a/src/hb-ot-var-mvar-table.hh
+++ b/src/hb-ot-var-mvar-table.hh
@@ -105,13 +105,8 @@
 
     item_variations_t item_vars;
     const VariationStore& src_var_store = this+varStore;
-    if (!item_vars.create_from_item_varstore (src_var_store, c->plan->axes_old_index_tag_map))
-      return_trace (false);
 
-    if (!item_vars.instantiate (c->plan->axes_location, c->plan->axes_triple_distances))
-      return_trace (false);
-
-    if (!item_vars.as_item_varstore ())
+    if (!item_vars.instantiate (src_var_store, c->plan))
       return_trace (false);
 
     /* serialize varstore */
diff --git a/src/test-item-varstore.cc b/src/test-item-varstore.cc
index 60ba812..3e0875e 100644
--- a/src/test-item-varstore.cc
+++ b/src/test-item-varstore.cc
@@ -52,7 +52,7 @@
   hb_hashmap_t<hb_tag_t, TripleDistances> axes_triple_distances;
   axes_triple_distances.set (axis_tag, TripleDistances (200.f, 500.f));
 
-  result = item_vars.instantiate (normalized_axes_location, axes_triple_distances);
+  result = item_vars.instantiate_tuple_vars (normalized_axes_location, axes_triple_distances);
   assert (result);
   result = item_vars.as_item_varstore (false);
   assert (result);