Rename hb_outline_decompose to hb_font_draw_glyph and hb_outline_decompose_funcs_t to hb_draw_funcs_t
diff --git a/docs/harfbuzz-sections.txt b/docs/harfbuzz-sections.txt
index 53f2c57..9f1d86c 100644
--- a/docs/harfbuzz-sections.txt
+++ b/docs/harfbuzz-sections.txt
@@ -222,6 +222,24 @@
 </SECTION>
 
 <SECTION>
+<FILE>hb-draw</FILE>
+hb_draw_funcs_t
+hb_draw_close_path_func_t
+hb_draw_conic_to_func_t
+hb_draw_cubic_to_func_t
+hb_draw_line_to_func_t
+hb_draw_move_to_func_t
+hb_draw_funcs_create
+hb_draw_funcs_destroy
+hb_draw_funcs_reference
+hb_draw_funcs_set_close_path_func
+hb_draw_funcs_set_conic_to_func
+hb_draw_funcs_set_cubic_to_func
+hb_draw_funcs_set_line_to_func
+hb_draw_funcs_set_move_to_func
+</SECTION>
+
+<SECTION>
 <FILE>hb-face</FILE>
 hb_face_count
 hb_face_t
@@ -256,6 +274,7 @@
 hb_font_create
 hb_font_create_sub_font
 hb_font_destroy
+hb_font_draw_glyph
 hb_font_funcs_create
 hb_font_funcs_destroy
 hb_font_funcs_get_empty
@@ -657,25 +676,6 @@
 </SECTION>
 
 <SECTION>
-<FILE>hb-outline</FILE>
-hb_outline_decompose_funcs_t
-hb_outline_decompose_close_path_func_t
-hb_outline_decompose_conic_to_func_t
-hb_outline_decompose_cubic_to_func_t
-hb_outline_decompose_line_to_func_t
-hb_outline_decompose_move_to_func_t
-hb_outline_decompose
-hb_outline_decompose_funcs_create
-hb_outline_decompose_funcs_destroy
-hb_outline_decompose_funcs_reference
-hb_outline_decompose_funcs_set_close_path_func
-hb_outline_decompose_funcs_set_conic_to_func
-hb_outline_decompose_funcs_set_cubic_to_func
-hb_outline_decompose_funcs_set_line_to_func
-hb_outline_decompose_funcs_set_move_to_func
-</SECTION>
-
-<SECTION>
 <FILE>hb-set</FILE>
 HB_SET_VALUE_INVALID
 hb_set_add
diff --git a/src/Makefile.sources b/src/Makefile.sources
index a464f28..81b5cde 100644
--- a/src/Makefile.sources
+++ b/src/Makefile.sources
@@ -35,13 +35,13 @@
 	hb-config.hh \
 	hb-debug.hh \
 	hb-dispatch.hh \
+	hb-draw.cc \
+	hb-draw.hh \
 	hb-face.cc \
 	hb-face.hh \
 	hb-fallback-shape.cc \
 	hb-font.cc \
 	hb-font.hh \
-	hb-outline.cc \
-	hb-outline.hh \
 	hb-iter.hh \
 	hb-kern.hh \
 	hb-machinery.hh \
@@ -195,9 +195,9 @@
 	hb-buffer.h \
 	hb-common.h \
 	hb-deprecated.h \
+	hb-draw.h \
 	hb-face.h \
 	hb-font.h \
-	hb-outline.h \
 	hb-map.h \
 	hb-ot-color.h \
 	hb-ot-deprecated.h \
diff --git a/src/harfbuzz.cc b/src/harfbuzz.cc
index 9da30df..6a07a9e 100644
--- a/src/harfbuzz.cc
+++ b/src/harfbuzz.cc
@@ -4,10 +4,10 @@
 #include "hb-buffer-serialize.cc"
 #include "hb-buffer.cc"
 #include "hb-common.cc"
+#include "hb-draw.cc"
 #include "hb-face.cc"
 #include "hb-fallback-shape.cc"
 #include "hb-font.cc"
-#include "hb-outline.cc"
 #include "hb-map.cc"
 #include "hb-number.cc"
 #include "hb-ot-cff1-table.cc"
diff --git a/src/hb-config.hh b/src/hb-config.hh
index 41bd6c6..07659fa 100644
--- a/src/hb-config.hh
+++ b/src/hb-config.hh
@@ -58,6 +58,7 @@
 #define HB_NO_BITMAP
 #define HB_NO_CFF
 #define HB_NO_COLOR
+#define HB_NO_DRAW
 #define HB_NO_ERRNO
 #define HB_NO_FACE_COLLECT_UNICODES
 #define HB_NO_GETENV
@@ -72,7 +73,6 @@
 #define HB_NO_MMAP
 #define HB_NO_NAME
 #define HB_NO_OPEN
-#define HB_NO_OUTLINE
 #define HB_NO_SETLOCALE
 #define HB_NO_OT_FONT_GLYPH_NAMES
 #define HB_NO_OT_SHAPE_FRACTIONS
diff --git a/src/hb-outline.cc b/src/hb-draw.cc
similarity index 61%
rename from src/hb-outline.cc
rename to src/hb-draw.cc
index d2d3061..a19d46a 100644
--- a/src/hb-outline.cc
+++ b/src/hb-draw.cc
@@ -24,16 +24,16 @@
 
 #include "hb.hh"
 
-#ifndef HB_NO_OUTLINE
+#ifndef HB_NO_DRAW
 
+#include "hb-draw.hh"
 #include "hb-ot.h"
 #include "hb-ot-glyf-table.hh"
 #include "hb-ot-cff1-table.hh"
 #include "hb-ot-cff2-table.hh"
-#include "hb-outline.hh"
 
 /**
- * hb_outline_decompose_funcs_set_move_to_func:
+ * hb_draw_funcs_set_move_to_func:
  * @funcs: decompose functions object
  * @move_to: move-to callback
  *
@@ -42,15 +42,15 @@
  * Since: REPLACEME
  **/
 void
-hb_outline_decompose_funcs_set_move_to_func (hb_outline_decompose_funcs_t        *funcs,
-					     hb_outline_decompose_move_to_func_t  move_to)
+hb_draw_funcs_set_move_to_func (hb_draw_funcs_t        *funcs,
+				hb_draw_move_to_func_t  move_to)
 {
   if (unlikely (hb_object_is_immutable (funcs))) return;
   funcs->move_to = move_to;
 }
 
 /**
- * hb_outline_decompose_funcs_set_line_to_func:
+ * hb_draw_funcs_set_line_to_func:
  * @funcs: decompose functions object
  * @line_to: line-to callback
  *
@@ -59,32 +59,32 @@
  * Since: REPLACEME
  **/
 void
-hb_outline_decompose_funcs_set_line_to_func (hb_outline_decompose_funcs_t        *funcs,
-					     hb_outline_decompose_line_to_func_t  line_to)
+hb_draw_funcs_set_line_to_func (hb_draw_funcs_t        *funcs,
+				hb_draw_line_to_func_t  line_to)
 {
   if (unlikely (hb_object_is_immutable (funcs))) return;
   funcs->line_to = line_to;
 }
 
 /**
- * hb_outline_decompose_funcs_set_conic_to_func:
+ * hb_draw_funcs_set_conic_to_func:
  * @funcs: decompose functions object
- * @move_to: conic-to callback
+ * @move_to: quadratic-to callback
  *
- * Sets conic-to callback to the decompose functions object.
+ * Sets quadratic-to callback to the decompose functions object.
  *
  * Since: REPLACEME
  **/
 void
-hb_outline_decompose_funcs_set_conic_to_func (hb_outline_decompose_funcs_t         *funcs,
-					      hb_outline_decompose_conic_to_func_t  conic_to)
+hb_draw_funcs_set_conic_to_func (hb_draw_funcs_t         *funcs,
+				 hb_draw_conic_to_func_t  conic_to)
 {
   if (unlikely (hb_object_is_immutable (funcs))) return;
   funcs->conic_to = conic_to;
 }
 
 /**
- * hb_outline_decompose_funcs_set_cubic_to_func:
+ * hb_draw_funcs_set_cubic_to_func:
  * @funcs: decompose functions
  * @cubic_to: cubic-to callback
  *
@@ -93,15 +93,15 @@
  * Since: REPLACEME
  **/
 void
-hb_outline_decompose_funcs_set_cubic_to_func (hb_outline_decompose_funcs_t         *funcs,
-					      hb_outline_decompose_cubic_to_func_t  cubic_to)
+hb_draw_funcs_set_cubic_to_func (hb_draw_funcs_t         *funcs,
+				 hb_draw_cubic_to_func_t  cubic_to)
 {
   if (unlikely (hb_object_is_immutable (funcs))) return;
   funcs->cubic_to = cubic_to;
 }
 
 /**
- * hb_outline_decompose_funcs_set_close_path_func:
+ * hb_draw_funcs_set_close_path_func:
  * @funcs: decompose functions object
  * @close_path: close-path callback
  *
@@ -110,8 +110,8 @@
  * Since: REPLACEME
  **/
 void
-hb_outline_decompose_funcs_set_close_path_func (hb_outline_decompose_funcs_t           *funcs,
-					        hb_outline_decompose_close_path_func_t  close_path)
+hb_draw_funcs_set_close_path_func (hb_draw_funcs_t           *funcs,
+				   hb_draw_close_path_func_t  close_path)
 {
   if (unlikely (hb_object_is_immutable (funcs))) return;
   funcs->close_path = close_path;
@@ -125,41 +125,42 @@
 
 static void
 _conic_to_nil (hb_position_t control_x HB_UNUSED, hb_position_t control_y HB_UNUSED,
-		hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED,
-		void *user_data HB_UNUSED) {}
+	       hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED,
+	       void *user_data HB_UNUSED) {}
+
 static void
 _cubic_to_nil (hb_position_t control1_x HB_UNUSED, hb_position_t control1_y HB_UNUSED,
-		hb_position_t control2_x HB_UNUSED, hb_position_t control2_y HB_UNUSED,
-		hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED,
-		void *user_data HB_UNUSED) {}
+	       hb_position_t control2_x HB_UNUSED, hb_position_t control2_y HB_UNUSED,
+	       hb_position_t to_x HB_UNUSED, hb_position_t to_y HB_UNUSED,
+	       void *user_data HB_UNUSED) {}
 
 static void
 _close_path_nil (void *user_data HB_UNUSED) {}
 
 /**
- * hb_outline_decompose_funcs_create:
+ * hb_draw_funcs_create:
  *
  * Creates a new decompose callbacks object.
  *
  * Since: REPLACEME
  **/
-hb_outline_decompose_funcs_t *
-hb_outline_decompose_funcs_create ()
+hb_draw_funcs_t *
+hb_draw_funcs_create ()
 {
-  hb_outline_decompose_funcs_t *funcs;
-  if (unlikely (!(funcs = hb_object_create<hb_outline_decompose_funcs_t> ())))
-    return const_cast<hb_outline_decompose_funcs_t *> (&Null (hb_outline_decompose_funcs_t));
+  hb_draw_funcs_t *funcs;
+  if (unlikely (!(funcs = hb_object_create<hb_draw_funcs_t> ())))
+    return const_cast<hb_draw_funcs_t *> (&Null (hb_draw_funcs_t));
 
-  funcs->move_to = (hb_outline_decompose_move_to_func_t) _move_to_nil;
-  funcs->line_to = (hb_outline_decompose_line_to_func_t) _line_to_nil;
-  funcs->conic_to = (hb_outline_decompose_conic_to_func_t) _conic_to_nil;
-  funcs->cubic_to = (hb_outline_decompose_cubic_to_func_t) _cubic_to_nil;
-  funcs->close_path = (hb_outline_decompose_close_path_func_t) _close_path_nil;
+  funcs->move_to = (hb_draw_move_to_func_t) _move_to_nil;
+  funcs->line_to = (hb_draw_line_to_func_t) _line_to_nil;
+  funcs->conic_to = (hb_draw_conic_to_func_t) _conic_to_nil;
+  funcs->cubic_to = (hb_draw_cubic_to_func_t) _cubic_to_nil;
+  funcs->close_path = (hb_draw_close_path_func_t) _close_path_nil;
   return funcs;
 }
 
 /**
- * hb_outline_decompose_funcs_reference:
+ * hb_draw_funcs_reference:
  * @funcs: decompose functions
  *
  * Add to callbacks object refcount.
@@ -167,14 +168,14 @@
  * Returns: The same object.
  * Since: REPLACEME
  **/
-hb_outline_decompose_funcs_t *
-hb_outline_decompose_funcs_reference (hb_outline_decompose_funcs_t *funcs)
+hb_draw_funcs_t *
+hb_draw_funcs_reference (hb_draw_funcs_t *funcs)
 {
   return hb_object_reference (funcs);
 }
 
 /**
- * hb_outline_decompose_funcs_destroy:
+ * hb_draw_funcs_destroy:
  * @funcs: decompose functions
  *
  * Decreases refcount of callbacks object and deletes the object if it reaches
@@ -183,7 +184,7 @@
  * Since: REPLACEME
  **/
 void
-hb_outline_decompose_funcs_destroy (hb_outline_decompose_funcs_t *funcs)
+hb_draw_funcs_destroy (hb_draw_funcs_t *funcs)
 {
   if (!hb_object_destroy (funcs)) return;
 
@@ -191,7 +192,7 @@
 }
 
 /**
- * hb_outline_decompose:
+ * hb_draw:
  * @font: a font object
  * @glyph: a glyph id
  * @funcs: decompose callbacks object
@@ -203,11 +204,11 @@
  * Since: REPLACEME
  **/
 hb_bool_t
-hb_outline_decompose (hb_font_t *font, hb_codepoint_t glyph,
-		    const hb_outline_decompose_funcs_t *funcs,
+hb_font_draw_glyph (hb_font_t *font, hb_codepoint_t glyph,
+		    const hb_draw_funcs_t *funcs,
 		    void *user_data)
 {
-  if (unlikely (funcs == &Null (hb_outline_decompose_funcs_t) ||
+  if (unlikely (funcs == &Null (hb_draw_funcs_t) ||
 		glyph >= font->face->get_num_glyphs ()))
     return false;
 
diff --git a/src/hb-draw.h b/src/hb-draw.h
new file mode 100644
index 0000000..3f386ce
--- /dev/null
+++ b/src/hb-draw.h
@@ -0,0 +1,87 @@
+/*
+ * Copyright © 2019-2020  Ebrahim Byagowi
+ *
+ *  This is part of HarfBuzz, a text shaping library.
+ *
+ * Permission is hereby granted, without written agreement and without
+ * license or royalty fees, to use, copy, modify, and distribute this
+ * software and its documentation for any purpose, provided that the
+ * above copyright notice and the following two paragraphs appear in
+ * all copies of this software.
+ *
+ * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
+ * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
+ * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
+ * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+ * DAMAGE.
+ *
+ * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
+ * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
+ * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
+ * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
+ * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
+ */
+
+#ifndef HB_H_IN
+#error "Include <hb.h> instead."
+#endif
+
+#ifndef HB_DRAW_H
+#define HB_DRAW_H
+
+#include "hb.h"
+
+HB_BEGIN_DECLS
+
+typedef void (*hb_draw_move_to_func_t) (hb_position_t to_x, hb_position_t to_y, void *user_data);
+typedef void (*hb_draw_line_to_func_t) (hb_position_t to_x, hb_position_t to_y, void *user_data);
+typedef void (*hb_draw_conic_to_func_t) (hb_position_t control_x, hb_position_t control_y,
+					 hb_position_t to_x, hb_position_t to_y,
+					 void *user_data);
+typedef void (*hb_draw_cubic_to_func_t) (hb_position_t control1_x, hb_position_t control1_y,
+					 hb_position_t control2_x, hb_position_t control2_y,
+					 hb_position_t to_x, hb_position_t to_y,
+					 void *user_data);
+typedef void (*hb_draw_close_path_func_t) (void *user_data);
+
+/**
+ * hb_draw_funcs_t:
+ *
+ * Glyph decompose callbacks.
+ *
+ * Since: REPLACEME
+ **/
+typedef struct hb_draw_funcs_t hb_draw_funcs_t;
+
+HB_EXTERN void
+hb_draw_funcs_set_move_to_func (hb_draw_funcs_t        *funcs,
+				hb_draw_move_to_func_t  move_to);
+
+HB_EXTERN void
+hb_draw_funcs_set_line_to_func (hb_draw_funcs_t        *funcs,
+				hb_draw_move_to_func_t  line_to);
+
+HB_EXTERN void
+hb_draw_funcs_set_conic_to_func (hb_draw_funcs_t         *funcs,
+				 hb_draw_conic_to_func_t  conic_to);
+
+HB_EXTERN void
+hb_draw_funcs_set_cubic_to_func (hb_draw_funcs_t         *funcs,
+				 hb_draw_cubic_to_func_t  cubic_to);
+
+HB_EXTERN void
+hb_draw_funcs_set_close_path_func (hb_draw_funcs_t           *funcs,
+				   hb_draw_close_path_func_t  close_path);
+
+HB_EXTERN hb_draw_funcs_t *
+hb_draw_funcs_create (void);
+
+HB_EXTERN hb_draw_funcs_t *
+hb_draw_funcs_reference (hb_draw_funcs_t *funcs);
+
+HB_EXTERN void
+hb_draw_funcs_destroy (hb_draw_funcs_t *funcs);
+
+HB_END_DECLS
+
+#endif /* HB_DRAW_H */
diff --git a/src/hb-outline.hh b/src/hb-draw.hh
similarity index 76%
rename from src/hb-outline.hh
rename to src/hb-draw.hh
index a66b2d9..6b4c592 100644
--- a/src/hb-outline.hh
+++ b/src/hb-draw.hh
@@ -22,21 +22,21 @@
  * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
  */
 
-#ifndef HB_OUTLINE_HH
-#define HB_OUTLINE_HH
+#ifndef HB_DRAW_HH
+#define HB_DRAW_HH
 
 #include "hb.hh"
 
-struct hb_outline_decompose_funcs_t
+struct hb_draw_funcs_t
 {
   hb_object_header_t header;
 
-  hb_outline_decompose_move_to_func_t move_to;
-  hb_outline_decompose_line_to_func_t line_to;
-  hb_outline_decompose_conic_to_func_t conic_to;
-  hb_outline_decompose_cubic_to_func_t cubic_to;
-  hb_outline_decompose_close_path_func_t close_path;
+  hb_draw_move_to_func_t move_to;
+  hb_draw_line_to_func_t line_to;
+  hb_draw_conic_to_func_t conic_to;
+  hb_draw_cubic_to_func_t cubic_to;
+  hb_draw_close_path_func_t close_path;
 };
 
 
-#endif /* HB_OUTLINE_HH */
+#endif /* HB_DRAW_HH */
diff --git a/src/hb-font.h b/src/hb-font.h
index 01ff201..ca4627f 100644
--- a/src/hb-font.h
+++ b/src/hb-font.h
@@ -33,6 +33,7 @@
 
 #include "hb-common.h"
 #include "hb-face.h"
+#include "hb-draw.h"
 
 HB_BEGIN_DECLS
 
@@ -717,6 +718,10 @@
 hb_font_set_var_named_instance (hb_font_t *font,
 				unsigned instance_index);
 
+HB_EXTERN hb_bool_t
+hb_font_draw_glyph (hb_font_t *font, hb_codepoint_t glyph,
+		    const hb_draw_funcs_t *funcs, void *user_data);
+
 HB_END_DECLS
 
 #endif /* HB_FONT_H */
diff --git a/src/hb-ot-cff1-table.cc b/src/hb-ot-cff1-table.cc
index 878a022..83bf919 100644
--- a/src/hb-ot-cff1-table.cc
+++ b/src/hb-ot-cff1-table.cc
@@ -28,7 +28,7 @@
 
 #ifndef HB_NO_CFF
 
-#include "hb-outline.hh"
+#include "hb-draw.hh"
 #include "hb-ot-cff1-table.hh"
 #include "hb-cff1-interp-cs.hh"
 
@@ -346,7 +346,7 @@
 struct cff1_path_param_t
 {
   cff1_path_param_t (const OT::cff1::accelerator_t *cff_, hb_font_t *font_,
-		     const hb_outline_decompose_funcs_t *funcs_, void *user_data_,
+		     const hb_draw_funcs_t *funcs_, void *user_data_,
 		     point_t *delta_)
   {
     path_open = false;
@@ -395,7 +395,7 @@
 
   bool path_open;
   hb_font_t *font;
-  const hb_outline_decompose_funcs_t *funcs;
+  const hb_draw_funcs_t *funcs;
   void *user_data;
   point_t *delta;
 
@@ -427,7 +427,7 @@
 };
 
 static bool _get_path (const OT::cff1::accelerator_t *cff, hb_font_t *font, hb_codepoint_t glyph,
-		       const hb_outline_decompose_funcs_t *funcs, void *user_data,
+		       const hb_draw_funcs_t *funcs, void *user_data,
 		       bool in_seac = false, point_t *delta = nullptr);
 
 struct cff1_cs_opset_path_t : cff1_cs_opset_t<cff1_cs_opset_path_t, cff1_path_param_t, cff1_path_procs_path_t>
@@ -449,7 +449,7 @@
 };
 
 bool _get_path (const OT::cff1::accelerator_t *cff, hb_font_t *font, hb_codepoint_t glyph,
-		const hb_outline_decompose_funcs_t *funcs, void *user_data, bool in_seac, point_t *delta)
+		const hb_draw_funcs_t *funcs, void *user_data, bool in_seac, point_t *delta)
 {
   if (unlikely (!cff->is_valid () || (glyph >= cff->num_glyphs))) return false;
 
@@ -464,7 +464,7 @@
 }
 
 bool OT::cff1::accelerator_t::get_path (hb_font_t *font, hb_codepoint_t glyph,
-					const hb_outline_decompose_funcs_t *funcs, void *user_data) const
+					const hb_draw_funcs_t *funcs, void *user_data) const
 {
 #ifdef HB_NO_OT_FONT_CFF
   /* XXX Remove check when this code moves to .hh file. */
diff --git a/src/hb-ot-cff1-table.hh b/src/hb-ot-cff1-table.hh
index 3eb254f..08e507c 100644
--- a/src/hb-ot-cff1-table.hh
+++ b/src/hb-ot-cff1-table.hh
@@ -1348,7 +1348,7 @@
     HB_INTERNAL bool get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const;
     HB_INTERNAL bool get_seac_components (hb_codepoint_t glyph, hb_codepoint_t *base, hb_codepoint_t *accent) const;
     HB_INTERNAL bool get_path (hb_font_t *font, hb_codepoint_t glyph,
-			       const hb_outline_decompose_funcs_t *funcs, void *user_data) const;
+			       const hb_draw_funcs_t *funcs, void *user_data) const;
 
     private:
     struct gname_t
diff --git a/src/hb-ot-cff2-table.cc b/src/hb-ot-cff2-table.cc
index 847e71a..d772f77 100644
--- a/src/hb-ot-cff2-table.cc
+++ b/src/hb-ot-cff2-table.cc
@@ -30,7 +30,7 @@
 
 #include "hb-ot-cff2-table.hh"
 #include "hb-cff2-interp-cs.hh"
-#include "hb-outline.hh"
+#include "hb-draw.hh"
 
 using namespace CFF;
 
@@ -145,7 +145,7 @@
 
 struct cff2_path_param_t
 {
-  cff2_path_param_t (hb_font_t *font_, const hb_outline_decompose_funcs_t *funcs_, void *user_data_)
+  cff2_path_param_t (hb_font_t *font_, const hb_draw_funcs_t *funcs_, void *user_data_)
   {
     path_open = false;
     font = font_;
@@ -180,7 +180,7 @@
 
   bool  path_open;
   hb_font_t *font;
-  const hb_outline_decompose_funcs_t *funcs;
+  const hb_draw_funcs_t *funcs;
   void *user_data;
 };
 
@@ -211,7 +211,7 @@
 struct cff2_cs_opset_path_t : cff2_cs_opset_t<cff2_cs_opset_path_t, cff2_path_param_t, cff2_path_procs_path_t> {};
 
 bool OT::cff2::accelerator_t::get_path (hb_font_t *font, hb_codepoint_t glyph,
-					const hb_outline_decompose_funcs_t *funcs, void *user_data) const
+					const hb_draw_funcs_t *funcs, void *user_data) const
 {
 #ifdef HB_NO_OT_FONT_CFF
   /* XXX Remove check when this code moves to .hh file. */
diff --git a/src/hb-ot-cff2-table.hh b/src/hb-ot-cff2-table.hh
index f77fc70..51867a5 100644
--- a/src/hb-ot-cff2-table.hh
+++ b/src/hb-ot-cff2-table.hh
@@ -534,7 +534,7 @@
 				  hb_codepoint_t glyph,
 				  hb_glyph_extents_t *extents) const;
     HB_INTERNAL bool get_path (hb_font_t *font, hb_codepoint_t glyph,
-			       const hb_outline_decompose_funcs_t *funcs, void *user_data) const;
+			       const hb_draw_funcs_t *funcs, void *user_data) const;
   };
 
   typedef accelerator_templ_t<cff2_private_dict_opset_subset_t, cff2_private_dict_values_subset_t> accelerator_subset_t;
diff --git a/src/hb-ot-glyf-table.hh b/src/hb-ot-glyf-table.hh
index 7567c98..99f54ab 100644
--- a/src/hb-ot-glyf-table.hh
+++ b/src/hb-ot-glyf-table.hh
@@ -34,7 +34,7 @@
 #include "hb-ot-head-table.hh"
 #include "hb-ot-hmtx-table.hh"
 #include "hb-ot-var-gvar-table.hh"
-#include "hb-outline.hh"
+#include "hb-draw.hh"
 
 #include <float.h>
 
@@ -1045,7 +1045,7 @@
 
     bool
     get_path (hb_font_t *font, hb_codepoint_t gid,
-	      const hb_outline_decompose_funcs_t *funcs, void *user_data) const
+	      const hb_draw_funcs_t *funcs, void *user_data) const
     {
       /* Making this completely alloc free is not that easy
 	 https://github.com/harfbuzz/harfbuzz/issues/2095
diff --git a/src/hb-outline.h b/src/hb-outline.h
deleted file mode 100644
index ab123ca..0000000
--- a/src/hb-outline.h
+++ /dev/null
@@ -1,92 +0,0 @@
-/*
- * Copyright © 2019-2020  Ebrahim Byagowi
- *
- *  This is part of HarfBuzz, a text shaping library.
- *
- * Permission is hereby granted, without written agreement and without
- * license or royalty fees, to use, copy, modify, and distribute this
- * software and its documentation for any purpose, provided that the
- * above copyright notice and the following two paragraphs appear in
- * all copies of this software.
- *
- * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR
- * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES
- * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN
- * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
- * DAMAGE.
- *
- * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING,
- * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
- * FITNESS FOR A PARTICULAR PURPOSE.  THE SOFTWARE PROVIDED HEREUNDER IS
- * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO
- * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS.
- */
-
-#ifndef HB_H_IN
-#error "Include <hb.h> instead."
-#endif
-
-#ifndef HB_OUTLINE_H
-#define HB_OUTLINE_H
-
-#include "hb.h"
-
-HB_BEGIN_DECLS
-
-typedef void (*hb_outline_decompose_move_to_func_t) (hb_position_t to_x, hb_position_t to_y, void *user_data);
-typedef void (*hb_outline_decompose_line_to_func_t) (hb_position_t to_x, hb_position_t to_y, void *user_data);
-typedef void (*hb_outline_decompose_conic_to_func_t) (hb_position_t control_x, hb_position_t control_y,
-						      hb_position_t to_x, hb_position_t to_y,
-						      void *user_data);
-typedef void (*hb_outline_decompose_cubic_to_func_t) (hb_position_t control1_x, hb_position_t control1_y,
-						      hb_position_t control2_x, hb_position_t control2_y,
-						      hb_position_t to_x, hb_position_t to_y,
-						      void *user_data);
-typedef void (*hb_outline_decompose_close_path_func_t) (void *user_data);
-
-/**
- * hb_outline_decompose_funcs_t:
- *
- * Glyph decompose callbacks.
- *
- * Since: REPLACEME
- **/
-typedef struct hb_outline_decompose_funcs_t hb_outline_decompose_funcs_t;
-
-HB_EXTERN void
-hb_outline_decompose_funcs_set_move_to_func (hb_outline_decompose_funcs_t        *funcs,
-					     hb_outline_decompose_move_to_func_t  move_to);
-
-HB_EXTERN void
-hb_outline_decompose_funcs_set_line_to_func (hb_outline_decompose_funcs_t        *funcs,
-					     hb_outline_decompose_move_to_func_t  line_to);
-
-HB_EXTERN void
-hb_outline_decompose_funcs_set_conic_to_func (hb_outline_decompose_funcs_t         *funcs,
-					      hb_outline_decompose_conic_to_func_t  conic_to);
-
-HB_EXTERN void
-hb_outline_decompose_funcs_set_cubic_to_func (hb_outline_decompose_funcs_t         *funcs,
-					      hb_outline_decompose_cubic_to_func_t  cubic_to);
-
-HB_EXTERN void
-hb_outline_decompose_funcs_set_close_path_func (hb_outline_decompose_funcs_t           *funcs,
-						hb_outline_decompose_close_path_func_t  close_path);
-
-HB_EXTERN hb_outline_decompose_funcs_t *
-hb_outline_decompose_funcs_create (void);
-
-HB_EXTERN hb_outline_decompose_funcs_t *
-hb_outline_decompose_funcs_reference (hb_outline_decompose_funcs_t *funcs);
-
-HB_EXTERN void
-hb_outline_decompose_funcs_destroy (hb_outline_decompose_funcs_t *funcs);
-
-HB_EXTERN hb_bool_t
-hb_outline_decompose (hb_font_t *font, hb_codepoint_t glyph,
-		      const hb_outline_decompose_funcs_t *funcs,
-		      void *user_data);
-
-HB_END_DECLS
-
-#endif /* HB_OUTLINE_H */
diff --git a/src/hb.h b/src/hb.h
index 0d1eed0..b0cc06c 100644
--- a/src/hb.h
+++ b/src/hb.h
@@ -32,9 +32,9 @@
 #include "hb-buffer.h"
 #include "hb-common.h"
 #include "hb-deprecated.h"
+#include "hb-draw.h"
 #include "hb-face.h"
 #include "hb-font.h"
-#include "hb-outline.h"
 #include "hb-map.h"
 #include "hb-set.h"
 #include "hb-shape.h"
diff --git a/src/main.cc b/src/main.cc
index 31ca250..1310a7c 100644
--- a/src/main.cc
+++ b/src/main.cc
@@ -37,7 +37,7 @@
 #define hb_blob_create_from_file(x)  hb_blob_get_empty ()
 #endif
 
-#if !defined(HB_NO_COLOR) && !defined(HB_NO_OUTLINE)
+#if !defined(HB_NO_COLOR) && !defined(HB_NO_DRAW)
 static void
 svg_dump (hb_face_t *face, unsigned face_index)
 {
@@ -169,7 +169,7 @@
 }
 
 static void
-layered_glyph_dump (hb_font_t *font, hb_outline_decompose_funcs_t *funcs, unsigned face_index)
+layered_glyph_dump (hb_font_t *font, hb_draw_funcs_t *funcs, unsigned face_index)
 {
   hb_face_t *face = hb_font_get_face (font);
   unsigned num_glyphs = hb_face_get_glyph_count (face);
@@ -224,7 +224,7 @@
 	    if (hb_color_get_alpha (color) != 255)
 	      fprintf (f, "fill-opacity=\"%.3f\"", (double) hb_color_get_alpha (color) / 255.);
 	    fprintf (f, "d=\"");
-	    if (!hb_outline_decompose (font, layers[layer].glyph, funcs, &user_data))
+	    if (!hb_font_draw_glyph (font, layers[layer].glyph, funcs, &user_data))
 	      printf ("Failed to decompose layer %d while %d\n", layers[layer].glyph, gid);
 	    fprintf (f, "\"/>\n");
 	  }
@@ -242,7 +242,7 @@
 }
 
 static void
-dump_glyphs (hb_font_t *font, hb_outline_decompose_funcs_t *funcs, unsigned face_index)
+dump_glyphs (hb_font_t *font, hb_draw_funcs_t *funcs, unsigned face_index)
 {
   unsigned num_glyphs = hb_face_get_glyph_count (hb_font_get_face (font));
   for (unsigned gid = 0; gid < num_glyphs; ++gid)
@@ -266,7 +266,7 @@
     user_data_t user_data;
     user_data.ascender = font_extents.ascender;
     user_data.f = f;
-    if (!hb_outline_decompose (font, gid, funcs, &user_data))
+    if (!hb_font_draw_glyph (font, gid, funcs, &user_data))
       printf ("Failed to decompose gid: %d\n", gid);
     fprintf (f, "\"/></svg>");
     fclose (f);
@@ -293,12 +293,12 @@
   fwrite (font_name, 1, strlen (font_name), font_name_file);
   fclose (font_name_file);
 
-  hb_outline_decompose_funcs_t *funcs = hb_outline_decompose_funcs_create ();
-  hb_outline_decompose_funcs_set_move_to_func (funcs, (hb_outline_decompose_move_to_func_t) move_to);
-  hb_outline_decompose_funcs_set_line_to_func (funcs, (hb_outline_decompose_line_to_func_t) line_to);
-  hb_outline_decompose_funcs_set_conic_to_func (funcs, (hb_outline_decompose_conic_to_func_t) conic_to);
-  hb_outline_decompose_funcs_set_cubic_to_func (funcs, (hb_outline_decompose_cubic_to_func_t) cubic_to);
-  hb_outline_decompose_funcs_set_close_path_func (funcs, (hb_outline_decompose_close_path_func_t) close_path);
+  hb_draw_funcs_t *funcs = hb_draw_funcs_create ();
+  hb_draw_funcs_set_move_to_func (funcs, (hb_draw_move_to_func_t) move_to);
+  hb_draw_funcs_set_line_to_func (funcs, (hb_draw_line_to_func_t) line_to);
+  hb_draw_funcs_set_conic_to_func (funcs, (hb_draw_conic_to_func_t) conic_to);
+  hb_draw_funcs_set_cubic_to_func (funcs, (hb_draw_cubic_to_func_t) cubic_to);
+  hb_draw_funcs_set_close_path_func (funcs, (hb_draw_close_path_func_t) close_path);
 
   unsigned num_faces = hb_face_count (blob);
   for (unsigned face_index = 0; face_index < num_faces; ++face_index)
@@ -324,7 +324,7 @@
     hb_face_destroy (face);
   }
 
-  hb_outline_decompose_funcs_destroy (funcs);
+  hb_draw_funcs_destroy (funcs);
 }
 #endif
 
@@ -501,7 +501,7 @@
   hb_blob_t *blob = hb_blob_create_from_file (argv[1]);
   printf ("Opened font file %s: %d bytes long\n", argv[1], hb_blob_get_length (blob));
   print_layout_info_using_private_api (blob);
-#if !defined(HB_NO_COLOR) && !defined(HB_NO_OUTLINE)
+#if !defined(HB_NO_COLOR) && !defined(HB_NO_DRAW)
   dump_glyphs (blob, argv[1]);
 #endif
   hb_blob_destroy (blob);
diff --git a/test/api/Makefile.am b/test/api/Makefile.am
index d6f47a5..32b0bff 100644
--- a/test/api/Makefile.am
+++ b/test/api/Makefile.am
@@ -34,12 +34,12 @@
 	test-buffer \
 	test-collect-unicodes \
 	test-common \
+	test-draw \
 	test-font \
 	test-map \
 	test-object \
 	test-ot-face \
 	test-ot-glyphname \
-	test-outline \
 	test-set \
 	test-shape \
 	test-subset \
diff --git a/test/api/test-outline.c b/test/api/test-draw.c
similarity index 92%
rename from test/api/test-outline.c
rename to test/api/test-draw.c
index 345fa8c..a376622 100644
--- a/test/api/test-outline.c
+++ b/test/api/test-draw.c
@@ -159,12 +159,12 @@
   user_data->str[user_data->consumed++] = 'Z';
 }
 
-static hb_outline_decompose_funcs_t *funcs;
+static hb_draw_funcs_t *funcs;
 
 static void
 test_hb_glyph_empty (void)
 {
-  g_assert (!hb_outline_decompose (hb_font_get_empty (), 3, funcs, NULL));
+  g_assert (!hb_font_draw_glyph (hb_font_get_empty (), 3, funcs, NULL));
 }
 
 static void
@@ -182,9 +182,9 @@
   };
 
   user_data.consumed = 0;
-  g_assert (!hb_outline_decompose (font, 4, funcs, &user_data));
+  g_assert (!hb_font_draw_glyph (font, 4, funcs, &user_data));
   user_data.consumed = 0;
-  g_assert (hb_outline_decompose (font, 3, funcs, &user_data));
+  g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
   char expected[] = "M275,442L275,442Q232,442 198,420Q164,397 145,353Q126,309 126,245L126,245"
 		    "Q126,182 147,139Q167,95 204,73Q240,50 287,50L287,50Q330,50 367,70"
 		    "Q404,90 427,128L427,128L451,116Q431,54 384,21Q336,-13 266,-13L266,-13Q198,-13 148,18"
@@ -199,7 +199,7 @@
   hb_font_set_variations (font, &var, 1);
 
   user_data.consumed = 0;
-  g_assert (hb_outline_decompose (font, 3, funcs, &user_data));
+  g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
   char expected2[] = "M323,448L323,448Q297,448 271,430Q244,412 227,371"
 		     "Q209,330 209,261L209,261Q209,204 226,166Q242,127 273,107Q303,86 344,86L344,86Q378,86 404,101"
 		     "Q430,115 451,137L451,137L488,103Q458,42 404,13Q350,-16 279,-16L279,-16Q211,-16 153,13Q95,41 60,99"
@@ -224,7 +224,7 @@
     .size = sizeof (str),
     .consumed = 0
   };
-  g_assert (hb_outline_decompose (font, 3, funcs, &user_data));
+  g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
   char expected[] = "M203,367C227,440 248,512 268,588L272,588C293,512 314,440 338,367L369,267L172,267Z"
 		    "M3,0L88,0L151,200L390,200L452,0L541,0L319,656L225,656Z"
 		    "M300,653L342,694L201,861L143,806Z";
@@ -247,7 +247,7 @@
     .size = sizeof (str),
     .consumed = 0
   };
-  g_assert (hb_outline_decompose (font, 1, funcs, &user_data));
+  g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
   char expected[] = "M775,400C705,400 650,343 650,274L650,250L391,250L713,572L392,893"
 		    "L287,1000C311,942 296,869 250,823C250,823 286,858 321,823L571,572"
 		    "L150,150L750,150L750,276C750,289 761,300 775,300C789,300 800,289 800,276"
@@ -272,7 +272,7 @@
   };
 
   user_data.consumed = 0;
-  g_assert (hb_outline_decompose (font, 3, funcs, &user_data));
+  g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
   char expected[] = "M275,442C303,442 337,435 371,417L325,454L350,366"
 		    "C357,341 370,321 403,321C428,321 443,333 448,358"
 		    "C435,432 361,487 272,487C153,487 43,393 43,236"
@@ -286,7 +286,7 @@
   hb_font_set_variations (font, &var, 1);
 
   user_data.consumed = 0;
-  g_assert (hb_outline_decompose (font, 3, funcs, &user_data));
+  g_assert (hb_font_draw_glyph (font, 3, funcs, &user_data));
   char expected2[] = "M323,448C356,448 380,441 411,427L333,469L339,401"
 		     "C343,322 379,297 420,297C458,297 480,314 492,352"
 		     "C486,433 412,501 303,501C148,501 25,406 25,241"
@@ -313,19 +313,19 @@
     {
       /* We aren't identical on paths points for glyf with ttf-parser but visually, investigate */
       user_data.consumed = 0;
-      g_assert (hb_outline_decompose (font, 0, funcs, &user_data));
+      g_assert (hb_font_draw_glyph (font, 0, funcs, &user_data));
       char expected[] = "M450,0L50,0L50,750L450,750L450,0Z";
       g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
     }
     {
       user_data.consumed = 0;
-      g_assert (hb_outline_decompose (font, 1, funcs, &user_data));
+      g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
       char expected[] = "M514,416L56,416L56,487L514,487L514,416ZM514,217L56,217L56,288L514,288L514,217Z";
       g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
     }
     {
       user_data.consumed = 0;
-      g_assert (hb_outline_decompose (font, 4, funcs, &user_data));
+      g_assert (hb_font_draw_glyph (font, 4, funcs, &user_data));
       char expected[] = "M332,536L332,468L197,468L197,0L109,0L109,468L15,468L15,509L109,539L109,570"
 			"Q109,674 155,720Q201,765 283,765L283,765Q315,765 342,760Q368,754 387,747"
 			"L387,747L364,678Q348,683 327,688Q306,693 284,693L284,693Q240,693 219,664"
@@ -338,13 +338,13 @@
     {
       /* According to tests on tts-parser we should return an empty on single point but we aren't */
       user_data.consumed = 0;
-      g_assert (hb_outline_decompose (font, 5, funcs, &user_data));
+      g_assert (hb_font_draw_glyph (font, 5, funcs, &user_data));
       char expected[] = "M15,0Q15,0 15,0Z";
       g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
     }
     {
       user_data.consumed = 0;
-      g_assert (hb_outline_decompose (font, 6, funcs, &user_data));
+      g_assert (hb_font_draw_glyph (font, 6, funcs, &user_data));
       char expected[] = "M346,536L346,468L211,468L211,0L123,0L123,468L29,468"
 			"L29,509L123,539L123,570Q123,674 169,720Q215,765 297,765"
 			"L297,765Q329,765 356,760Q382,754 401,747L401,747L378,678"
@@ -361,7 +361,7 @@
     hb_face_destroy (face);
 
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, 1, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
     char expected[] = "M0,0C100,0 150,-20 250,-20C350,-20 400,0 500,0C500,100 520,150 520,250"
 		      "C520,350 500,400 500,500C400,500 350,520 250,520C150,520 100,500 0,500"
 		      "C0,400 -20,350 -20,250C-20,150 0,100 0,0ZM50,50C50,130 34,170 34,250"
@@ -378,7 +378,7 @@
     hb_face_destroy (face);
 
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, 1, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
     char expected[] = "M82,0L164,0L164,486L82,486ZM124,586C156,586 181,608 181,639"
 		      "C181,671 156,692 124,692C92,692 67,671 67,639C67,608 92,586 124,586Z";
     g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
@@ -404,7 +404,7 @@
 
     /* should get a path for the glyph */
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, 37, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, 37, funcs, &user_data));
     char expected[] = "M201,0L201,1462L614,1462Q905,1462 1035,1375Q1165,1288 1165,1100"
 		      "L1165,1100Q1165,970 1093,886Q1020,801 881,776L881,776L881,766"
 		      "Q1214,709 1214,416L1214,416Q1214,220 1082,110Q949,0 711,0L711,0L201,0Z"
@@ -416,7 +416,7 @@
 
     /* should get a path for the glyph */
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, 171, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, 171, funcs, &user_data));
     char expected2[] = "M639,-20L639,-20Q396,-20 256,128Q115,276 115,539L115,539"
 		       "Q115,804 246,960Q376,1116 596,1116L596,1116Q802,1116 922,981"
 		       "Q1042,845 1042,623L1042,623L1042,518L287,518Q292,325 385,225"
@@ -445,7 +445,7 @@
 
     /* should resolve composite glyphs recursively */
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, codepoint, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
     char expected[] = "M581,170L581,274L443,274Q409,274 384,259Q359,243 348,219"
 		      "Q336,194 340,166Q343,138 365,111L365,111L468,-13Q470,-10 473,-7"
 		      "Q475,-3 477,0L477,0L253,0Q225,0 203,8Q180,15 168,32Q155,48 155,73"
@@ -463,7 +463,7 @@
 
     /* should transform points of a composite glyph */
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, 2, funcs, &user_data)); /* 2 == arAlef.fina */
+    g_assert (hb_font_draw_glyph (font, 2, funcs, &user_data)); /* 2 == arAlef.fina */
     char expected2[] = "M50,624L155,624L155,84Q150,90 146,95Q141,99 136,105L136,105"
 		       "L292,105L292,0L156,0Q128,0 104,14Q79,27 65,51Q50,74 50,104"
 		       "L50,104L50,624ZM282,0L282,105L312,105L312,0L282,0Z";
@@ -478,7 +478,7 @@
     hb_face_destroy (face);
 
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, 5, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, 5, funcs, &user_data));
     char expected[] = "M90,0L258,0C456,0 564,122 564,331C564,539 456,656 254,656L90,656ZM173,68"
 		      "L173,588L248,588C401,588 478,496 478,331C478,165 401,68 248,68Z";
     g_assert_cmpmem (str, user_data.consumed, expected, sizeof (expected) - 1);
@@ -493,7 +493,7 @@
     hb_face_destroy (face);
 
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, 1, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, 1, funcs, &user_data));
     char expected[] = "M139,390C175,390 205,419 205,459C205,501 175,530 139,530C103,530 73,501 73,459"
 		      "C73,419 103,390 139,390ZM139,-13C175,-13 205,15 205,56C205,97 175,127 139,127"
 		      "C103,127 73,97 73,56C73,15 103,-13 139,-13Z";
@@ -538,7 +538,7 @@
     hb_buffer_destroy (buffer);
 
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, codepoint, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
     char expected[] = "M414,-102L371,-102L371,539L914,539L914,-27Q914,-102 840,-102L840,-102Q796,-102 755,-98"
 		      "L755,-98L742,-59Q790,-66 836,-66L836,-66Q871,-66 871,-31L871,-31L871,504L414,504L414,-102Z"
 		      "M203,-94L203,-94Q138,-94 86,-90L86,-90L74,-52Q137,-59 188,-59L188,-59Q211,-59 222,-47"
@@ -584,7 +584,7 @@
     hb_buffer_destroy (buffer);
 
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, codepoint, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
     char expected[] = "M414,-102L371,-102L371,539L914,539L914,-27Q914,-102 840,-102L840,-102Q796,-102 755,-98"
 		      "L755,-98L742,-59Q790,-66 836,-66L836,-66Q871,-66 871,-31L871,-31L871,504L414,504"
 		      "L414,-102ZM203,-94L203,-94Q138,-94 86,-90L86,-90L74,-52Q137,-59 188,-59L188,-59"
@@ -630,7 +630,7 @@
     hb_buffer_destroy (buffer);
 
     user_data.consumed = 0;
-    g_assert (hb_outline_decompose (font, codepoint, funcs, &user_data));
+    g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
     char expected[] = "M414,-102L371,-102L371,539L914,539L914,-27Q914,-102 840,-102L840,-102"
 		      "Q796,-102 755,-98L755,-98L742,-59Q790,-66 836,-66L836,-66Q871,-66 871,-31"
 		      "L871,-31L871,504L414,504L414,-102ZM203,-94L203,-94Q138,-94 86,-90"
@@ -680,7 +680,7 @@
       hb_buffer_destroy (buffer);
 
       user_data.consumed = 0;
-      g_assert (hb_outline_decompose (font, codepoint, funcs, &user_data));
+      g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
       char expected[] = "M246,15C188,15 147,27 101,68L142,23L117,117C111,143 96,149 81,149"
 		        "C65,149 56,141 52,126C71,40 137,-13 244,-13C348,-13 436,46 436,156"
 		        "C436,229 405,295 271,349L247,359C160,393 119,439 119,506"
@@ -704,7 +704,7 @@
       hb_buffer_destroy (buffer);
 
       user_data.consumed = 0;
-      g_assert (hb_outline_decompose (font, codepoint, funcs, &user_data));
+      g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
       char expected[] = "M251,36C206,36 165,42 118,61L176,21L161,99C151,152 129,167 101,167"
 			"C78,167 61,155 51,131C54,43 133,-14 247,-14C388,-14 474,64 474,171"
 			"C474,258 430,321 294,370L257,383C188,406 150,438 150,499"
@@ -729,7 +729,7 @@
       hb_buffer_destroy (buffer);
 
       user_data.consumed = 0;
-      g_assert (hb_outline_decompose (font, codepoint, funcs, &user_data));
+      g_assert (hb_font_draw_glyph (font, codepoint, funcs, &user_data));
       char expected[] = "M258,38C197,38 167,48 118,71L192,19L183,103C177,155 155,174 115,174"
 			"C89,174 64,161 51,125C52,36 124,-16 258,-16C417,-16 513,67 513,175"
 			"C513,278 457,328 322,388L289,403C232,429 203,452 203,500C203,562 244,589 301,589"
@@ -747,12 +747,12 @@
 int
 main (int argc, char **argv)
 {
-  funcs = hb_outline_decompose_funcs_create ();
-  hb_outline_decompose_funcs_set_move_to_func (funcs, (hb_outline_decompose_move_to_func_t) move_to);
-  hb_outline_decompose_funcs_set_line_to_func (funcs, (hb_outline_decompose_line_to_func_t) line_to);
-  hb_outline_decompose_funcs_set_conic_to_func (funcs, (hb_outline_decompose_conic_to_func_t) conic_to);
-  hb_outline_decompose_funcs_set_cubic_to_func (funcs, (hb_outline_decompose_cubic_to_func_t) cubic_to);
-  hb_outline_decompose_funcs_set_close_path_func (funcs, (hb_outline_decompose_close_path_func_t) close_path);
+  funcs = hb_draw_funcs_create ();
+  hb_draw_funcs_set_move_to_func (funcs, (hb_draw_move_to_func_t) move_to);
+  hb_draw_funcs_set_line_to_func (funcs, (hb_draw_line_to_func_t) line_to);
+  hb_draw_funcs_set_conic_to_func (funcs, (hb_draw_conic_to_func_t) conic_to);
+  hb_draw_funcs_set_cubic_to_func (funcs, (hb_draw_cubic_to_func_t) cubic_to);
+  hb_draw_funcs_set_close_path_func (funcs, (hb_draw_close_path_func_t) close_path);
 
   hb_test_init (&argc, &argv);
   hb_test_add (test_itoa);
@@ -766,6 +766,6 @@
   hb_test_add (test_hb_glyph_font_kit_variations_tests);
   unsigned result = hb_test_run ();
 
-  hb_outline_decompose_funcs_destroy (funcs);
+  hb_draw_funcs_destroy (funcs);
   return result;
 }
diff --git a/test/api/test-ot-face.c b/test/api/test-ot-face.c
index 62c52fe..b9fd50a 100644
--- a/test/api/test-ot-face.c
+++ b/test/api/test-ot-face.c
@@ -121,10 +121,10 @@
   hb_ot_var_normalize_variations (face, NULL, 0, NULL, 0);
   hb_ot_var_normalize_coords (face, 0, NULL, NULL);
 
-  hb_outline_decompose_funcs_t *funcs = hb_outline_decompose_funcs_create ();
+  hb_draw_funcs_t *funcs = hb_draw_funcs_create ();
   for (unsigned gid = 0; gid < 10; ++gid)
-    hb_outline_decompose (font, gid, funcs, NULL);
-  hb_outline_decompose_funcs_destroy (funcs);
+    hb_font_draw_glyph (font, gid, funcs, NULL);
+  hb_draw_funcs_destroy (funcs);
 
   hb_set_destroy (set);
   hb_font_destroy (font);