mirror of
https://gitlab.freedesktop.org/cairo/cairo.git
synced 2026-05-05 07:38:22 +02:00
Add cairo_reference and cairo_surface_reference
This commit is contained in:
parent
ee4bb02015
commit
7e46e8e6ca
9 changed files with 66 additions and 29 deletions
15
ChangeLog
15
ChangeLog
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
38
src/cairo.c
38
src/cairo.c
|
|
@ -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)
|
||||
{
|
||||
|
|
|
|||
12
src/cairo.h
12
src/cairo.h
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue