diff options
Diffstat (limited to 'pango/pango-coverage.c')
-rw-r--r-- | pango/pango-coverage.c | 51 |
1 files changed, 40 insertions, 11 deletions
diff --git a/pango/pango-coverage.c b/pango/pango-coverage.c index d6ce8812..cc9ca246 100644 --- a/pango/pango-coverage.c +++ b/pango/pango-coverage.c @@ -39,6 +39,7 @@ struct _PangoBlockInfo struct _PangoCoverage { + guint ref_count; int n_blocks; int data_size; @@ -50,7 +51,8 @@ struct _PangoCoverage * * Create a new #PangoCoverage * - * Return value: a new PangoCoverage object, initialized to PANGO_COVERAGE_NONE + * Return value: a new PangoCoverage object, initialized to %PANGO_COVERAGE_NONE + * with a reference count of 0. **/ PangoCoverage * pango_coverage_new (void) @@ -60,6 +62,7 @@ pango_coverage_new (void) coverage->n_blocks = N_BLOCKS_INCREMENT; coverage->blocks = g_new (PangoBlockInfo, coverage->n_blocks); + coverage->ref_count = 1; for (i=0; i<coverage->n_blocks; i++) { @@ -74,9 +77,11 @@ pango_coverage_new (void) * pango_coverage_copy: * @coverage: a #PangoCoverage * - * Copy an existing #PangoCoverage + * Copy an existing #PangoCoverage. (This function may now be unecessary + * since we refcount the structure. Mail otaylor@redhat.com if you + * use it.) * - * Return value: a copy of @coverage + * Return value: a copy of @coverage with a reference count of 1 **/ PangoCoverage * pango_coverage_copy (PangoCoverage *coverage) @@ -88,6 +93,7 @@ pango_coverage_copy (PangoCoverage *coverage) result->n_blocks = coverage->n_blocks; result->blocks = g_new (PangoBlockInfo, coverage->n_blocks); + result->ref_count = 1; for (i=0; i<coverage->n_blocks; i++) { @@ -106,24 +112,47 @@ pango_coverage_copy (PangoCoverage *coverage) } /** - * pango_coverage_destroy: + * pango_coverage_ref: * @coverage: a #PangoCoverage * - * Destroy a #PangoCoverage object, freeing associated memory + * Increase the reference count on the #PangoCoverage by one **/ -void pango_coverage_destroy (PangoCoverage *coverage) +void +pango_coverage_ref (PangoCoverage *coverage) +{ + g_return_if_fail (coverage != NULL); + + coverage->ref_count++; +} + +/** + * pango_coverage_unref: + * @coverage: a #PangoCoverage + * + * Increase the reference count on the #PangoCoverage by one. + * if the result is zero, free the coverage and all associated memory. + **/ +void +pango_coverage_unref (PangoCoverage *coverage) { int i; g_return_if_fail (coverage != NULL); + g_return_if_fail (coverage->ref_count > 0); - for (i=0; i<coverage->n_blocks; i++) + coverage->ref_count--; + + if (coverage->ref_count == 0) { - if (coverage->blocks[i].data) - g_free (coverage->blocks[i].data); + for (i=0; i<coverage->n_blocks; i++) + { + if (coverage->blocks[i].data) + g_free (coverage->blocks[i].data); + } + + g_free (coverage->blocks); + g_free (coverage); } - - g_free (coverage); } /** |