Add cairo_reference and cairo_surface_reference

This commit is contained in:
Carl Worth 2003-09-16 06:45:19 +00:00
parent ee4bb02015
commit 7e46e8e6ca
9 changed files with 66 additions and 29 deletions

View file

@ -1,3 +1,18 @@
2003-09-16 Carl Worth <cworth@isi.edu>
* configure.in (CAIRO_VERSION): Bumped to 0.1.3 for new functions:
cairo_reference and cairo_surface_reference.
* src/cairo_surface.c (cairo_surface_reference): Export
cairo_surface_reference.
* src/cairo.c (cairo_reference): Add new function to increase
reference count of cairo_t.
(cairo_create):
(cairo_copy):
(cairo_destroy): Make these functions aware of the new reference
count.
2003-09-15 Carl Worth <cworth@east.isi.edu>
* configure.in: Require xrender >= 0.6.0

View file

@ -3,7 +3,7 @@ AC_INIT(src/cairo.h)
dnl ===========================================================================
# Package version number, (as distinct from shared library version)
CAIRO_VERSION=0.1.2
CAIRO_VERSION=0.1.3
# libtool shared library version

View file

@ -119,9 +119,9 @@ _cairo_gstate_init_copy (cairo_gstate_t *gstate, cairo_gstate_t *other)
if (status)
goto CLEANUP_DASHES;
_cairo_surface_reference (gstate->surface);
_cairo_surface_reference (gstate->source);
_cairo_surface_reference (gstate->clip.surface);
cairo_surface_reference (gstate->surface);
cairo_surface_reference (gstate->source);
cairo_surface_reference (gstate->clip.surface);
status = _cairo_path_init_copy (&gstate->path, &other->path);
if (status)
@ -293,7 +293,7 @@ _cairo_gstate_set_target_surface (cairo_gstate_t *gstate, cairo_surface_t *surfa
cairo_surface_destroy (gstate->surface);
gstate->surface = surface;
_cairo_surface_reference (gstate->surface);
cairo_surface_reference (gstate->surface);
scale = surface->ppm / gstate->ppm;
_cairo_gstate_scale (gstate, scale, scale);
@ -321,7 +321,7 @@ _cairo_gstate_set_pattern (cairo_gstate_t *gstate, cairo_surface_t *pattern)
gstate->source = pattern;
gstate->source_is_solid = 0;
_cairo_surface_reference (gstate->source);
cairo_surface_reference (gstate->source);
_cairo_gstate_current_point (gstate,
&gstate->source_offset.x,

View file

@ -309,7 +309,7 @@ cairo_surface_create_similar_solid (cairo_surface_t *other,
slim_hidden_def(cairo_surface_create_similar_solid);
void
_cairo_surface_reference (cairo_surface_t *surface)
cairo_surface_reference (cairo_surface_t *surface)
{
if (surface == NULL)
return;

View file

@ -42,6 +42,7 @@ cairo_create (void)
return NULL;
cr->status = CAIRO_STATUS_SUCCESS;
cr->ref_count = 1;
cr->gstate = _cairo_gstate_create ();
if (cr->gstate == NULL)
@ -50,16 +51,6 @@ cairo_create (void)
return cr;
}
void
cairo_destroy (cairo_t *cr)
{
while (cr->gstate) {
cairo_restore (cr);
}
free (cr);
}
cairo_t *
cairo_copy (cairo_t *cr_other)
{
@ -70,6 +61,7 @@ cairo_copy (cairo_t *cr_other)
return NULL;
*cr = *cr_other;
cr->ref_count = 0;
cr->gstate = _cairo_gstate_clone (cr_other->gstate);
if (cr->gstate == NULL)
@ -78,6 +70,32 @@ cairo_copy (cairo_t *cr_other)
return cr;
}
void
cairo_reference (cairo_t *cr)
{
if (cr->status)
return;
cr->ref_count++;
}
void
cairo_destroy (cairo_t *cr)
{
if (cr->status)
return;
cr->ref_count--;
if (cr->ref_count)
return;
while (cr->gstate) {
cairo_restore (cr);
}
free (cr);
}
void
cairo_save (cairo_t *cr)
{

View file

@ -50,12 +50,15 @@ extern "C" {
extern cairo_t * __external_linkage
cairo_create (void);
extern void __external_linkage
cairo_destroy (cairo_t *cr);
extern cairo_t * __external_linkage
cairo_copy (cairo_t *cr_other);
extern void __external_linkage
cairo_reference (cairo_t *cr);
extern void __external_linkage
cairo_destroy (cairo_t *cr);
extern void __external_linkage
cairo_save (cairo_t *cr);
@ -443,6 +446,9 @@ cairo_surface_create_similar_solid (cairo_surface_t *other,
double blue,
double alpha);
extern void __external_linkage
cairo_surface_reference (cairo_surface_t *surface);
extern void __external_linkage
cairo_surface_destroy (cairo_surface_t *surface);

View file

@ -119,9 +119,9 @@ _cairo_gstate_init_copy (cairo_gstate_t *gstate, cairo_gstate_t *other)
if (status)
goto CLEANUP_DASHES;
_cairo_surface_reference (gstate->surface);
_cairo_surface_reference (gstate->source);
_cairo_surface_reference (gstate->clip.surface);
cairo_surface_reference (gstate->surface);
cairo_surface_reference (gstate->source);
cairo_surface_reference (gstate->clip.surface);
status = _cairo_path_init_copy (&gstate->path, &other->path);
if (status)
@ -293,7 +293,7 @@ _cairo_gstate_set_target_surface (cairo_gstate_t *gstate, cairo_surface_t *surfa
cairo_surface_destroy (gstate->surface);
gstate->surface = surface;
_cairo_surface_reference (gstate->surface);
cairo_surface_reference (gstate->surface);
scale = surface->ppm / gstate->ppm;
_cairo_gstate_scale (gstate, scale, scale);
@ -321,7 +321,7 @@ _cairo_gstate_set_pattern (cairo_gstate_t *gstate, cairo_surface_t *pattern)
gstate->source = pattern;
gstate->source_is_solid = 0;
_cairo_surface_reference (gstate->source);
cairo_surface_reference (gstate->source);
_cairo_gstate_current_point (gstate,
&gstate->source_offset.x,

View file

@ -309,7 +309,7 @@ cairo_surface_create_similar_solid (cairo_surface_t *other,
slim_hidden_def(cairo_surface_create_similar_solid);
void
_cairo_surface_reference (cairo_surface_t *surface)
cairo_surface_reference (cairo_surface_t *surface)
{
if (surface == NULL)
return;

View file

@ -370,6 +370,7 @@ typedef struct cairo_gstate {
} cairo_gstate_t;
struct cairo {
unsigned int ref_count;
cairo_gstate_t *gstate;
cairo_status_t status;
};
@ -690,9 +691,6 @@ extern cairo_status_t __internal_linkage
_cairo_path_stroke_to_traps (cairo_path_t *path, cairo_gstate_t *gstate, cairo_traps_t *traps);
/* cairo_surface.c */
extern void __internal_linkage
_cairo_surface_reference (cairo_surface_t *surface);
extern void __internal_linkage
_cairo_surface_fill_rectangle (cairo_surface_t *surface,
cairo_operator_t operator,