From be63fcee7ff2ef33d25efd873f9a9b79856e1577 Mon Sep 17 00:00:00 2001 From: Neil Roberts Date: Tue, 9 Nov 2010 19:09:25 +0000 Subject: [PATCH] cogl-clip-stack: Move the struct definitions to the header It will be useful to be able to directly examine the contents of the clip stack within the journal code. --- clutter/cogl/cogl/cogl-clip-stack.c | 112 --------------------------- clutter/cogl/cogl/cogl-clip-stack.h | 114 ++++++++++++++++++++++++++++ 2 files changed, 114 insertions(+), 112 deletions(-) diff --git a/clutter/cogl/cogl/cogl-clip-stack.c b/clutter/cogl/cogl/cogl-clip-stack.c index 4bd0bad68..c3c3491a7 100644 --- a/clutter/cogl/cogl/cogl-clip-stack.c +++ b/clutter/cogl/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/clutter/cogl/cogl/cogl-clip-stack.h b/clutter/cogl/cogl/cogl-clip-stack.h index 791cc7b76..2baa4e29b 100644 --- a/clutter/cogl/cogl/cogl-clip-stack.h +++ b/clutter/cogl/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,