diff --git a/cogl/cogl-clip-stack.c b/cogl/cogl-clip-stack.c
index 4bd0bad68..c3c3491a7 100644
--- a/cogl/cogl-clip-stack.c
+++ b/cogl/cogl-clip-stack.c
@@ -42,118 +42,6 @@
 #include "cogl-matrix-private.h"
 #include "cogl-primitives-private.h"
 
-typedef struct _CoglClipStackRect CoglClipStackRect;
-typedef struct _CoglClipStackWindowRect CoglClipStackWindowRect;
-typedef struct _CoglClipStackPath CoglClipStackPath;
-
-typedef enum
-  {
-    COGL_CLIP_STACK_RECT,
-    COGL_CLIP_STACK_WINDOW_RECT,
-    COGL_CLIP_STACK_PATH
-  } CoglClipStackType;
-
-/* A clip stack consists a list of entries. Each entry has a reference
- * count and a link to its parent node. The child takes a reference on
- * the parent and the CoglClipStack holds a reference to the top of
- * the stack. There are no links back from the parent to the
- * children. This allows stacks that have common ancestry to share the
- * entries.
- *
- * For example, the following sequence of operations would generate
- * the tree below:
- *
- * CoglClipStack *stack_a = NULL;
- * stack_a = _cogl_clip_stack_push_rectangle (stack_a, ...);
- * stack_a = _cogl_clip_stack_push_rectangle (stack_a, ...);
- * stack_a = _cogl_clip_stack_push_from_path (stack_a, ...);
- * CoglClipStack *stack_b = NULL;
- * stack_b = cogl_clip_stack_push_window_rectangle (stack_b, ...);
- *
- *  stack_a
- *         \ holds a ref to
- *          +-----------+
- *          | path node |
- *          |ref count 1|
- *          +-----------+
- *                       \
- *                        +-----------+  +-----------+
- *       both tops hold   | rect node |  | rect node |
- *       a ref to the     |ref count 2|--|ref count 1|
- *       same rect node   +-----------+  +-----------+
- *                       /
- *          +-----------+
- *          | win. rect |
- *          |ref count 1|
- *          +-----------+
- *         / holds a ref to
- *  stack_b
- *
- */
-
-struct _CoglClipStack
-{
-  CoglClipStackType  type;
-
-  /* This will be null if there is no parent. If it is not null then
-     this node must be holding a reference to the parent */
-  CoglClipStack     *parent;
-
-  /* All clip entries have a window-space bounding box which we can
-     use to calculate a scissor. The scissor limits the clip so that
-     we don't need to do a full stencil clear if the stencil buffer is
-     needed. This is stored in Cogl's coordinate space (ie, 0,0 is the
-     top left) */
-  int                     bounds_x0;
-  int                     bounds_y0;
-  int                     bounds_x1;
-  int                     bounds_y1;
-
-  unsigned int            ref_count;
-};
-
-struct _CoglClipStackRect
-{
-  CoglClipStack     _parent_data;
-
-  /* The rectangle for this clip */
-  float                  x0;
-  float                  y0;
-  float                  x1;
-  float                  y1;
-
-  /* If this is true then the clip for this rectangle is entirely
-     described by the scissor bounds. This implies that the rectangle
-     is screen aligned and we don't need to use the stencil buffer to
-     set the clip. We keep the entry as a rect entry rather than a
-     window rect entry so that it will be easier to detect if the
-     modelview matrix is that same as when a rectangle is added to the
-     journal. In that case we can use the original clip coordinates
-     and modify the rectangle instead. */
-  gboolean               can_be_scissor;
-
-  /* The matrix that was current when the clip was set */
-  CoglMatrix             matrix;
-};
-
-struct _CoglClipStackWindowRect
-{
-  CoglClipStack     _parent_data;
-
-  /* The window rect clip doesn't need any specific data because it
-     just adds to the scissor clip */
-};
-
-struct _CoglClipStackPath
-{
-  CoglClipStack     _parent_data;
-
-  /* The matrix that was current when the clip was set */
-  CoglMatrix             matrix;
-
-  CoglPath              *path;
-};
-
 static void
 project_vertex (const CoglMatrix *modelview_projection,
 		float *vertex)
diff --git a/cogl/cogl-clip-stack.h b/cogl/cogl-clip-stack.h
index 791cc7b76..2baa4e29b 100644
--- a/cogl/cogl-clip-stack.h
+++ b/cogl/cogl-clip-stack.h
@@ -24,6 +24,9 @@
 #ifndef __COGL_CLIP_STACK_H
 #define __COGL_CLIP_STACK_H
 
+#include "cogl2-path.h"
+#include "cogl-matrix.h"
+
 /* The clip stack works like a GSList where only a pointer to the top
    of the stack is stored. The empty clip stack is represented simply
    by the NULL pointer. When an entry is added to or removed from the
@@ -33,6 +36,117 @@
    effectively loses ownership of all entries in the stack */
 
 typedef struct _CoglClipStack CoglClipStack;
+typedef struct _CoglClipStackRect CoglClipStackRect;
+typedef struct _CoglClipStackWindowRect CoglClipStackWindowRect;
+typedef struct _CoglClipStackPath CoglClipStackPath;
+
+typedef enum
+  {
+    COGL_CLIP_STACK_RECT,
+    COGL_CLIP_STACK_WINDOW_RECT,
+    COGL_CLIP_STACK_PATH
+  } CoglClipStackType;
+
+/* A clip stack consists a list of entries. Each entry has a reference
+ * count and a link to its parent node. The child takes a reference on
+ * the parent and the CoglClipStack holds a reference to the top of
+ * the stack. There are no links back from the parent to the
+ * children. This allows stacks that have common ancestry to share the
+ * entries.
+ *
+ * For example, the following sequence of operations would generate
+ * the tree below:
+ *
+ * CoglClipStack *stack_a = NULL;
+ * stack_a = _cogl_clip_stack_push_rectangle (stack_a, ...);
+ * stack_a = _cogl_clip_stack_push_rectangle (stack_a, ...);
+ * stack_a = _cogl_clip_stack_push_from_path (stack_a, ...);
+ * CoglClipStack *stack_b = NULL;
+ * stack_b = cogl_clip_stack_push_window_rectangle (stack_b, ...);
+ *
+ *  stack_a
+ *         \ holds a ref to
+ *          +-----------+
+ *          | path node |
+ *          |ref count 1|
+ *          +-----------+
+ *                       \
+ *                        +-----------+  +-----------+
+ *       both tops hold   | rect node |  | rect node |
+ *       a ref to the     |ref count 2|--|ref count 1|
+ *       same rect node   +-----------+  +-----------+
+ *                       /
+ *          +-----------+
+ *          | win. rect |
+ *          |ref count 1|
+ *          +-----------+
+ *         / holds a ref to
+ *  stack_b
+ *
+ */
+
+struct _CoglClipStack
+{
+  CoglClipStackType  type;
+
+  /* This will be null if there is no parent. If it is not null then
+     this node must be holding a reference to the parent */
+  CoglClipStack     *parent;
+
+  /* All clip entries have a window-space bounding box which we can
+     use to calculate a scissor. The scissor limits the clip so that
+     we don't need to do a full stencil clear if the stencil buffer is
+     needed. This is stored in Cogl's coordinate space (ie, 0,0 is the
+     top left) */
+  int                     bounds_x0;
+  int                     bounds_y0;
+  int                     bounds_x1;
+  int                     bounds_y1;
+
+  unsigned int            ref_count;
+};
+
+struct _CoglClipStackRect
+{
+  CoglClipStack     _parent_data;
+
+  /* The rectangle for this clip */
+  float                  x0;
+  float                  y0;
+  float                  x1;
+  float                  y1;
+
+  /* If this is true then the clip for this rectangle is entirely
+     described by the scissor bounds. This implies that the rectangle
+     is screen aligned and we don't need to use the stencil buffer to
+     set the clip. We keep the entry as a rect entry rather than a
+     window rect entry so that it will be easier to detect if the
+     modelview matrix is that same as when a rectangle is added to the
+     journal. In that case we can use the original clip coordinates
+     and modify the rectangle instead. */
+  gboolean               can_be_scissor;
+
+  /* The matrix that was current when the clip was set */
+  CoglMatrix             matrix;
+};
+
+struct _CoglClipStackWindowRect
+{
+  CoglClipStack     _parent_data;
+
+  /* The window rect clip doesn't need any specific data because it
+     just adds to the scissor clip */
+};
+
+struct _CoglClipStackPath
+{
+  CoglClipStack     _parent_data;
+
+  /* The matrix that was current when the clip was set */
+  CoglMatrix             matrix;
+
+  CoglPath              *path;
+};
 
 CoglClipStack *
 _cogl_clip_stack_push_window_rectangle (CoglClipStack *stack,