Add hb_ot_layout_ensure() and hb_uniscribe_font_ensure()
diff --git a/src/hb-ot-layout.cc b/src/hb-ot-layout.cc
index dff3673..eb39c65 100644
--- a/src/hb-ot-layout.cc
+++ b/src/hb-ot-layout.cc
@@ -38,6 +38,13 @@
 #include <string.h>
 
 
+HB_SHAPER_DATA_ENSURE_DECLARE(ot, face)
+hb_bool_t
+hb_ot_layout_ensure (hb_face_t *face)
+{
+  return hb_ot_shaper_face_data_ensure (face);
+}
+
 
 hb_ot_layout_t *
 _hb_ot_layout_create (hb_face_t *face)
diff --git a/src/hb-ot-layout.h b/src/hb-ot-layout.h
index cf178b7..af23478 100644
--- a/src/hb-ot-layout.h
+++ b/src/hb-ot-layout.h
@@ -42,6 +42,12 @@
 #define HB_OT_TAG_GSUB HB_TAG('G','S','U','B')
 #define HB_OT_TAG_GPOS HB_TAG('G','P','O','S')
 
+
+/* Must call before all other funtions in this file.  Idempotent. */
+hb_bool_t
+hb_ot_layout_ensure (hb_face_t *face);
+
+
 /*
  * GDEF
  */
diff --git a/src/hb-shape-plan.cc b/src/hb-shape-plan.cc
index 1820f61..b0a8937 100644
--- a/src/hb-shape-plan.cc
+++ b/src/hb-shape-plan.cc
@@ -30,24 +30,6 @@
 #include "hb-shaper-private.hh"
 #include "hb-font-private.hh"
 
-#define HB_SHAPER_DATA_ENSURE_DECLARE(shaper, object) \
-static inline bool \
-hb_##shaper##_##object##_data_ensure (hb_##object##_t *object) \
-{\
-  retry: \
-  HB_SHAPER_DATA_TYPE (shaper, object) *data = (HB_SHAPER_DATA_TYPE (shaper, object) *) hb_atomic_ptr_get (&HB_SHAPER_DATA (shaper, object)); \
-  if (unlikely (!data)) { \
-    data = HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (object); \
-    if (unlikely (!data)) \
-      data = (HB_SHAPER_DATA_TYPE (shaper, object) *) HB_SHAPER_DATA_INVALID; \
-    if (!hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), NULL, data)) { \
-      HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); \
-      goto retry; \
-    } \
-  } \
-  return data != NULL && !HB_SHAPER_DATA_IS_INVALID (data); \
-}
-
 #define HB_SHAPER_IMPLEMENT(shaper) \
 	HB_SHAPER_DATA_ENSURE_DECLARE(shaper, face) \
 	HB_SHAPER_DATA_ENSURE_DECLARE(shaper, font)
@@ -65,7 +47,7 @@
 
 #define HB_SHAPER_PLAN(shaper) \
 	HB_STMT_START { \
-	  if (hb_##shaper##_face_data_ensure (shape_plan->face)) { \
+	  if (hb_##shaper##_shaper_face_data_ensure (shape_plan->face)) { \
 	    HB_SHAPER_DATA_TYPE (shaper, shape_plan) *data= \
 	      HB_SHAPER_DATA_CREATE_FUNC (shaper, shape_plan) (shape_plan, user_features, num_user_features); \
 	    if (data) { \
@@ -181,7 +163,7 @@
 
 #define HB_SHAPER_EXECUTE(shaper) \
 	HB_STMT_START { \
-	  if (hb_##shaper##_font_data_ensure (font) && \
+	  if (hb_##shaper##_shaper_font_data_ensure (font) && \
 	      _hb_##shaper##_shape (shape_plan, font, buffer, features, num_features)) \
 	    return true; \
 	  else \
diff --git a/src/hb-shaper-private.hh b/src/hb-shaper-private.hh
index e50d869..186318d 100644
--- a/src/hb-shaper-private.hh
+++ b/src/hb-shaper-private.hh
@@ -86,5 +86,23 @@
 	    object->shaper_data.shaper != HB_SHAPER_DATA_SUCCEEDED) \
 	  HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (HB_SHAPER_DATA (shaper, object));
 
+#define HB_SHAPER_DATA_ENSURE_DECLARE(shaper, object) \
+static inline bool \
+hb_##shaper##_shaper_##object##_data_ensure (hb_##object##_t *object) \
+{\
+  retry: \
+  HB_SHAPER_DATA_TYPE (shaper, object) *data = (HB_SHAPER_DATA_TYPE (shaper, object) *) hb_atomic_ptr_get (&HB_SHAPER_DATA (shaper, object)); \
+  if (unlikely (!data)) { \
+    data = HB_SHAPER_DATA_CREATE_FUNC (shaper, object) (object); \
+    if (unlikely (!data)) \
+      data = (HB_SHAPER_DATA_TYPE (shaper, object) *) HB_SHAPER_DATA_INVALID; \
+    if (!hb_atomic_ptr_cmpexch (&HB_SHAPER_DATA (shaper, object), NULL, data)) { \
+      HB_SHAPER_DATA_DESTROY_FUNC (shaper, object) (data); \
+      goto retry; \
+    } \
+  } \
+  return data != NULL && !HB_SHAPER_DATA_IS_INVALID (data); \
+}
+
 
 #endif /* HB_SHAPER_PRIVATE_HH */
diff --git a/src/hb-uniscribe.cc b/src/hb-uniscribe.cc
index 4368f68..7d06a6b 100644
--- a/src/hb-uniscribe.cc
+++ b/src/hb-uniscribe.cc
@@ -56,6 +56,17 @@
 */
 
 
+HB_SHAPER_DATA_ENSURE_DECLARE(uniscribe, face)
+HB_SHAPER_DATA_ENSURE_DECLARE(uniscribe, font)
+hb_bool_t
+hb_uniscribe_font_ensure (hb_font_t *font)
+{
+  hb_face_t *face = font->face;
+  return hb_uniscribe_shaper_face_data_ensure (face) &&
+         hb_uniscribe_shaper_font_data_ensure (font);
+}
+
+
 /*
  * shaper face data
  */
diff --git a/src/hb-uniscribe.h b/src/hb-uniscribe.h
index bb99f39..2758dab 100644
--- a/src/hb-uniscribe.h
+++ b/src/hb-uniscribe.h
@@ -34,6 +34,10 @@
 
 HB_BEGIN_DECLS
 
+/* Must call before all other funtions in this file.  Idempotent. */
+hb_bool_t
+hb_uniscribe_font_ensure (hb_font_t *font);
+
 
 LOGFONTW *
 hb_uniscribe_font_get_logfontw (hb_font_t *font);