path: Remove use of CoglHandle in the CoglPath API

This replaces the use of CoglHandle with strongly type CoglPath *
pointers instead. The only function not converted for now is
cogl_is_path which will be done in a later commit.
This commit is contained in:
Robert Bragg 2010-05-28 00:35:47 +01:00
parent 5f8fadeb1c
commit 817c1cddcc
4 changed files with 53 additions and 55 deletions

View File

@ -56,7 +56,6 @@ typedef struct _CoglBezCubic
floatVec2 p4;
} CoglBezCubic;
typedef struct _CoglPath CoglPath;
typedef struct _CoglPathData CoglPathData;
struct _CoglPath
@ -81,11 +80,11 @@ struct _CoglPathData
/* This is an internal version of cogl_path_new that doesn't affect
the current path and just creates a new handle */
CoglHandle
CoglPath *
_cogl_path_new (void);
void
_cogl_add_path_to_stencil_buffer (CoglHandle path,
_cogl_add_path_to_stencil_buffer (CoglPath *path,
gboolean merge,
gboolean need_clear);

View File

@ -26,6 +26,7 @@
#endif
#include "cogl.h"
#include "cogl-object.h"
#include "cogl-internal.h"
#include "cogl-context.h"
#include "cogl-journal-private.h"
@ -44,7 +45,7 @@
static void _cogl_path_free (CoglPath *path);
COGL_HANDLE_DEFINE (Path, path);
COGL_OBJECT_DEFINE (Path, path);
static void
_cogl_path_data_unref (CoglPathData *data)
@ -179,7 +180,7 @@ _cogl_path_get_bounds (floatVec2 nodes_min,
}
void
_cogl_add_path_to_stencil_buffer (CoglHandle path_handle,
_cogl_add_path_to_stencil_buffer (CoglPath *path,
gboolean merge,
gboolean need_clear)
{
@ -190,17 +191,14 @@ _cogl_add_path_to_stencil_buffer (CoglHandle path_handle,
float bounds_h;
unsigned long enable_flags = COGL_ENABLE_VERTEX_ARRAY;
CoglHandle prev_source;
CoglHandle framebuffer = _cogl_get_framebuffer ();
CoglFramebuffer *framebuffer = _cogl_get_framebuffer ();
CoglMatrixStack *modelview_stack =
_cogl_framebuffer_get_modelview_stack (framebuffer);
CoglMatrixStack *projection_stack =
_cogl_framebuffer_get_projection_stack (framebuffer);
CoglPath *path;
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
path = COGL_PATH (path_handle);
/* We don't track changes to the stencil buffer in the journal
* so we need to flush any batched geometry first */
_cogl_journal_flush ();
@ -211,7 +209,7 @@ _cogl_add_path_to_stencil_buffer (CoglHandle path_handle,
_cogl_framebuffer_flush_state (framebuffer, 0);
/* Just setup a simple material that doesn't use texturing... */
prev_source = cogl_handle_ref (ctx->source_material);
prev_source = cogl_object_ref (ctx->source_material);
cogl_set_source (ctx->stencil_material);
_cogl_material_flush_gl_state (ctx->source_material, NULL);
@ -316,7 +314,7 @@ _cogl_add_path_to_stencil_buffer (CoglHandle path_handle,
/* restore the original material */
cogl_set_source (prev_source);
cogl_handle_unref (prev_source);
cogl_object_unref (prev_source);
}
static int
@ -525,7 +523,7 @@ _cogl_path_fill_nodes (void)
if (G_LIKELY (!(cogl_debug_flags & COGL_DEBUG_FORCE_SCANLINE_PATHS)) &&
cogl_features_available (COGL_FEATURE_STENCIL_BUFFER))
{
CoglHandle framebuffer;
CoglFramebuffer *framebuffer;
CoglClipState *clip_state;
_cogl_journal_flush ();
@ -689,7 +687,7 @@ cogl_path_new (void)
{
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
cogl_handle_unref (ctx->current_path);
cogl_object_unref (ctx->current_path);
ctx->current_path = _cogl_path_new ();
}
@ -1062,7 +1060,7 @@ cogl_path_rel_curve_to (float x_1,
data->path_pen.y + y_3);
}
CoglHandle
CoglPath *
cogl_path_get (void)
{
_COGL_GET_CONTEXT (ctx, NULL);
@ -1071,21 +1069,21 @@ cogl_path_get (void)
}
void
cogl_path_set (CoglHandle handle)
cogl_path_set (CoglPath *path)
{
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
if (!cogl_is_path (handle))
if (!cogl_is_path (path))
return;
/* Reference the new handle first in case it is the same as the old
handle */
cogl_handle_ref (handle);
cogl_handle_unref (ctx->current_path);
ctx->current_path = handle;
/* Reference the new object first in case it is the same as the old
object */
cogl_object_ref (path);
cogl_object_unref (ctx->current_path);
ctx->current_path = path;
}
CoglHandle
CoglPath *
_cogl_path_new (void)
{
CoglPath *path;
@ -1098,26 +1096,24 @@ _cogl_path_new (void)
data->path_nodes = g_array_new (FALSE, FALSE, sizeof (CoglPathNode));
data->last_path = 0;
return _cogl_path_handle_new (path);
return _cogl_path_object_new (path);
}
CoglHandle
cogl_path_copy (CoglHandle handle)
CoglPath *
cogl_path_copy (CoglPath *old_path)
{
CoglPath *old_path, *new_path;
CoglPath *new_path;
_COGL_GET_CONTEXT (ctx, NULL);
if (!cogl_is_path (handle))
return COGL_INVALID_HANDLE;
old_path = COGL_PATH (handle);
if (!cogl_is_path (old_path))
return NULL;
new_path = g_slice_new (CoglPath);
new_path->data = old_path->data;
new_path->data->ref_count++;
return _cogl_path_handle_new (new_path);
return _cogl_path_object_new (new_path);
}
static void

View File

@ -51,6 +51,8 @@ G_BEGIN_DECLS
* rather then in the absolute coordinates.
*/
typedef struct _CoglPath CoglPath;
/**
* cogl_path_fill:
*
@ -368,49 +370,50 @@ cogl_path_round_rectangle (float x_1,
/**
* cogl_path_get:
*
* Gets a handle to the current path. The path can later be used again
* by calling cogl_path_set(). Note that the path isn't copied so if
* you later call any functions to add to the path it will affect the
* returned handle too. No reference is taken on the path so if you
* want to retain it you should take your own reference with
* cogl_handle_ref().
* Gets a pointer to the current path. The path can later be used
* again by calling cogl_path_set(). Note that the path isn't copied
* so if you later call any functions to add to the path it will
* affect the returned object too. No reference is taken on the path
* so if you want to retain it you should take your own reference with
* cogl_object_ref().
*
* Return value: a handle to the current path.
* Return value: a pointer to the current path.
*
* Since: 1.4
*/
CoglHandle
CoglPath *
cogl_path_get (void);
/**
* cogl_path_set:
* @handle: A %CoglHandle to a path
* @path: A #CoglPath object
*
* Replaces the current path with @handle. A reference is taken on the
* handle so if you no longer need the path you should unref with
* cogl_handle_unref().
* Replaces the current path with @path. A reference is taken on the
* object so if you no longer need the path you should unref with
* cogl_object_unref().
*
* Since: 1.4
*/
void
cogl_path_set (CoglHandle handle);
cogl_path_set (CoglPath *path);
/**
* cogl_path_copy:
* @handle: A %CoglHandle to a path
* @path: A #CoglPath object
*
* Returns a new copy of the path in @handle. The new path has a
* Returns a new copy of the path in @path. The new path has a
* reference count of 1 so you should unref it with
* cogl_handle_unref() if you no longer need it.
* cogl_object_unref() if you no longer need it.
*
* Internally the path will share the data until one of the paths is
* modified so copying paths should be relatively cheap.
*
* Return value: a copy of the path in @handle.
* Return value: a copy of the path in @path.
*/
CoglHandle
cogl_path_copy (CoglHandle handle);
CoglPath *
cogl_path_copy (CoglPath *path);
G_END_DECLS
#endif /* __COGL_PATH_H__ */

View File

@ -389,7 +389,7 @@ cogl_set_viewport (int x,
int width,
int height)
{
CoglHandle framebuffer;
CoglFramebuffer *framebuffer;
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
@ -514,7 +514,7 @@ cogl_features_available (CoglFeatureFlags features)
void
cogl_get_viewport (float v[4])
{
CoglHandle framebuffer;
CoglFramebuffer *framebuffer;
int viewport[4];
int i;
@ -621,7 +621,7 @@ cogl_read_pixels (int x,
CoglPixelFormat format,
guint8 *pixels)
{
CoglHandle framebuffer;
CoglFramebuffer *framebuffer;
int framebuffer_height;
int bpp;
CoglBitmap bmp;
@ -1110,7 +1110,7 @@ cogl_set_projection_matrix (CoglMatrix *matrix)
CoglClipState *
_cogl_get_clip_state (void)
{
CoglHandle framebuffer;
CoglFramebuffer *framebuffer;
framebuffer = _cogl_get_framebuffer ();
return _cogl_framebuffer_get_clip_state (framebuffer);
@ -1147,7 +1147,7 @@ cogl_set_source_texture (CoglHandle texture_handle)
_COGL_GET_CONTEXT (ctx, NO_RETVAL);
g_return_if_fail (texture_handle != COGL_INVALID_HANDLE);
g_return_if_fail (texture_handle != NULL);
cogl_material_set_layer (ctx->simple_material, 0, texture_handle);
cogl_color_set_from_4ub (&white, 0xff, 0xff, 0xff, 0xff);