From 707e597665b437ec66320df362f0481c56385d7a Mon Sep 17 00:00:00 2001 From: Michael Natterer Date: Mon, 26 May 2003 17:02:06 +0000 Subject: [PATCH] added "gint ref_count" to the TileManager struct. 2003-05-26 Michael Natterer * app/base/tile-manager-private.h: added "gint ref_count" to the TileManager struct. * app/base/tile-manager.[ch]: replaced tile_manager_destroy() by tile_manager_ref() and tile_manager_unref(). * app/core/gimpimage-undo-push.c: ref the tile managers stored in the undo system and DON'T destroy them if no undo could be pushed. Should fix the remaining crashes with undo disabled like in bug #9350. (!!!) Note that the tiles passed to gimp_image_undo_push_image() and gimp_drawable_push_undo() as well as the tile managers of drawables passed to gimp_image_undo_push_[layer|channel]_mod() must be unref'ed by the caller now. * app/core/gimpdrawable-transform.c (gimp_drawable_transform_paste): don't take ownership of the passed tiles but ref them if needed. (!!!) Callers must unref the passed tiles themselves now. * app/core/gimpbuffer.c * app/core/gimpdrawable-blend.c * app/core/gimpdrawable-bucket-fill.c * app/core/gimpdrawable-offset.c * app/core/gimpdrawable.c * app/core/gimpedit.c * app/core/gimpimage-convert.c * app/core/gimpimage-mask.c * app/core/gimpimage-projection.c * app/core/gimpimage.c * app/core/gimpimagemap.c * app/core/gimplayer-floating-sel.c * app/core/gimplayer.c * app/paint/gimppaintcore.c * app/text/gimptextlayer.c * app/tools/gimpinktool.c * app/tools/gimpiscissorstool.c * app/tools/gimptransformtool-undo.c * app/tools/gimptransformtool.c: changed accordingly. --- ChangeLog | 43 +++++++++++++++ app/base/tile-manager-private.h | 2 + app/base/tile-manager.c | 82 +++++++++++++++++------------ app/base/tile-manager.h | 5 +- app/core/gimp-edit.c | 8 +-- app/core/gimp-transform-region.c | 33 +++++++----- app/core/gimpbuffer.c | 2 +- app/core/gimpdrawable-blend.c | 6 +-- app/core/gimpdrawable-bucket-fill.c | 2 +- app/core/gimpdrawable-offset.c | 1 + app/core/gimpdrawable-transform.c | 33 +++++++----- app/core/gimpdrawable.c | 21 ++++++-- app/core/gimpedit.c | 8 +-- app/core/gimpimage-convert.c | 2 + app/core/gimpimage-mask.c | 2 +- app/core/gimpimage-projection.c | 8 +-- app/core/gimpimage-undo-push.c | 33 +++++------- app/core/gimpimage.c | 2 +- app/core/gimpimagemap.c | 11 ++-- app/core/gimplayer-floating-sel.c | 2 +- app/core/gimplayer.c | 8 +-- app/core/gimpprojection-construct.c | 8 +-- app/paint/gimpink.c | 18 ++++--- app/paint/gimppaintcore.c | 10 ++-- app/text/gimptextlayer.c | 4 +- app/tools/gimpinktool.c | 18 ++++--- app/tools/gimpiscissorstool.c | 2 +- app/tools/gimptransformtool-undo.c | 5 +- app/tools/gimptransformtool.c | 5 +- 29 files changed, 241 insertions(+), 143 deletions(-) diff --git a/ChangeLog b/ChangeLog index 9008ff299a..6801fc9cd8 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,46 @@ +2003-05-26 Michael Natterer + + * app/base/tile-manager-private.h: added "gint ref_count" to the + TileManager struct. + + * app/base/tile-manager.[ch]: replaced tile_manager_destroy() + by tile_manager_ref() and tile_manager_unref(). + + * app/core/gimpimage-undo-push.c: ref the tile managers stored in + the undo system and DON'T destroy them if no undo could be pushed. + Should fix the remaining crashes with undo disabled like in + bug #9350. + + (!!!) Note that the tiles passed to gimp_image_undo_push_image() + and gimp_drawable_push_undo() as well as the tile managers of + drawables passed to gimp_image_undo_push_[layer|channel]_mod() + must be unref'ed by the caller now. + + * app/core/gimpdrawable-transform.c (gimp_drawable_transform_paste): + don't take ownership of the passed tiles but ref them if needed. + + (!!!) Callers must unref the passed tiles themselves now. + + * app/core/gimpbuffer.c + * app/core/gimpdrawable-blend.c + * app/core/gimpdrawable-bucket-fill.c + * app/core/gimpdrawable-offset.c + * app/core/gimpdrawable.c + * app/core/gimpedit.c + * app/core/gimpimage-convert.c + * app/core/gimpimage-mask.c + * app/core/gimpimage-projection.c + * app/core/gimpimage.c + * app/core/gimpimagemap.c + * app/core/gimplayer-floating-sel.c + * app/core/gimplayer.c + * app/paint/gimppaintcore.c + * app/text/gimptextlayer.c + * app/tools/gimpinktool.c + * app/tools/gimpiscissorstool.c + * app/tools/gimptransformtool-undo.c + * app/tools/gimptransformtool.c: changed accordingly. + 2003-05-26 Raphael Quinet * plug-ins/imagemap/Makefile.am: Moved the -i flag for lex. diff --git a/app/base/tile-manager-private.h b/app/base/tile-manager-private.h index 3068581ed2..d43258ed5f 100644 --- a/app/base/tile-manager-private.h +++ b/app/base/tile-manager-private.h @@ -22,6 +22,8 @@ struct _TileManager { + gint ref_count; /* reference counter */ + gint x, y; /* tile manager offsets */ gint width; /* the width of the tiled area */ diff --git a/app/base/tile-manager.c b/app/base/tile-manager.c index 65f77550a1..df5200034b 100644 --- a/app/base/tile-manager.c +++ b/app/base/tile-manager.c @@ -46,54 +46,70 @@ tile_manager_new (gint toplevel_width, gint width; gint height; - tm = g_new (TileManager, 1); - - tm->user_data = NULL; - tm->validate_proc = NULL; + tm = g_new0 (TileManager, 1); width = toplevel_width; height = toplevel_height; - tm->x = 0; - tm->y = 0; - tm->width = width; - tm->height = height; - tm->bpp = bpp; - tm->ntile_rows = (height + TILE_HEIGHT - 1) / TILE_HEIGHT; - tm->ntile_cols = (width + TILE_WIDTH - 1) / TILE_WIDTH; - tm->tiles = NULL; - - tm->cached_num = -1; - tm->cached_tile = NULL; - + tm->ref_count = 1; + tm->x = 0; + tm->y = 0; + tm->width = width; + tm->height = height; + tm->bpp = bpp; + tm->ntile_rows = (height + TILE_HEIGHT - 1) / TILE_HEIGHT; + tm->ntile_cols = (width + TILE_WIDTH - 1) / TILE_WIDTH; + tm->tiles = NULL; + tm->validate_proc = NULL; + + tm->cached_num = -1; + tm->cached_tile = NULL; + + tm->user_data = NULL; + + return tm; +} + +TileManager * +tile_manager_ref (TileManager *tm) +{ + g_return_val_if_fail (tm != NULL, NULL); + + tm->ref_count++; + return tm; } void -tile_manager_destroy (TileManager *tm) +tile_manager_unref (TileManager *tm) { - gint ntiles; - gint i; - g_return_if_fail (tm != NULL); - - if (tm->cached_tile) - tile_release (tm->cached_tile, FALSE); - if (tm->tiles) + tm->ref_count--; + + if (tm->ref_count < 1) { - ntiles = tm->ntile_rows * tm->ntile_cols; + gint ntiles; + gint i; - for (i = 0; i < ntiles; i++) - { - TILE_MUTEX_LOCK (tm->tiles[i]); - tile_detach (tm->tiles[i], tm, i); - } + if (tm->cached_tile) + tile_release (tm->cached_tile, FALSE); - g_free (tm->tiles); + if (tm->tiles) + { + ntiles = tm->ntile_rows * tm->ntile_cols; + + for (i = 0; i < ntiles; i++) + { + TILE_MUTEX_LOCK (tm->tiles[i]); + tile_detach (tm->tiles[i], tm, i); + } + + g_free (tm->tiles); + } + + g_free (tm); } - - g_free (tm); } diff --git a/app/base/tile-manager.h b/app/base/tile-manager.h index e5de8eff50..c40644c8c5 100644 --- a/app/base/tile-manager.h +++ b/app/base/tile-manager.h @@ -42,9 +42,10 @@ TileManager * tile_manager_new (gint toplevel_width, gint toplevel_height, gint bpp); -/* Destroy a tile manager and all the tiles it contains. +/* Ref/Unref a tile manager. */ -void tile_manager_destroy (TileManager *tm); +TileManager * tile_manager_ref (TileManager *tm); +void tile_manager_unref (TileManager *tm); /* Set the validate procedure for the tile manager. * The validate procedure is called when an invalid tile diff --git a/app/core/gimp-edit.c b/app/core/gimp-edit.c index 6dc17382de..41ce098f44 100644 --- a/app/core/gimp-edit.c +++ b/app/core/gimp-edit.c @@ -76,7 +76,7 @@ gimp_edit_cut (GimpImage *gimage, if (cropped_cut != cut) { - tile_manager_destroy (cut); + tile_manager_unref (cut); cut = NULL; } } @@ -134,7 +134,7 @@ gimp_edit_copy (GimpImage *gimage, if (cropped_copy != copy) { - tile_manager_destroy (copy); + tile_manager_unref (copy); copy = NULL; } } @@ -323,7 +323,7 @@ gimp_edit_clear (GimpImage *gimage, (x2 - x1), (y2 - y1)); /* free the temporary tiles */ - tile_manager_destroy (buf_tiles); + tile_manager_unref (buf_tiles); return TRUE; } @@ -405,7 +405,7 @@ gimp_edit_fill (GimpImage *gimage, (x2 - x1), (y2 - y1)); /* free the temporary tiles */ - tile_manager_destroy (buf_tiles); + tile_manager_unref (buf_tiles); return TRUE; } diff --git a/app/core/gimp-transform-region.c b/app/core/gimp-transform-region.c index 32418ff07e..0613c39279 100644 --- a/app/core/gimp-transform-region.c +++ b/app/core/gimp-transform-region.c @@ -847,11 +847,14 @@ gimp_drawable_transform_affine (GimpDrawable *drawable, NULL, NULL); /* Free the cut/copied buffer */ - tile_manager_destroy (orig_tiles); + tile_manager_unref (orig_tiles); if (new_tiles) - success = gimp_drawable_transform_paste (drawable, new_tiles, - new_layer); + { + success = gimp_drawable_transform_paste (drawable, new_tiles, + new_layer); + tile_manager_unref (new_tiles); + } } /* push the undo group end */ @@ -911,11 +914,14 @@ gimp_drawable_transform_flip (GimpDrawable *drawable, flip_type, axis, FALSE); /* Free the cut/copied buffer */ - tile_manager_destroy (orig_tiles); + tile_manager_unref (orig_tiles); if (new_tiles) - success = gimp_drawable_transform_paste (drawable, new_tiles, - new_layer); + { + success = gimp_drawable_transform_paste (drawable, new_tiles, + new_layer); + tile_manager_unref (new_tiles); + } } /* push the undo group end */ @@ -966,11 +972,14 @@ gimp_drawable_transform_rotate (GimpDrawable *drawable, FALSE); /* Free the cut/copied buffer */ - tile_manager_destroy (orig_tiles); + tile_manager_unref (orig_tiles); if (new_tiles) - success = gimp_drawable_transform_paste (drawable, new_tiles, - new_layer); + { + success = gimp_drawable_transform_paste (drawable, new_tiles, + new_layer); + tile_manager_unref (new_tiles); + } } /* push the undo group end */ @@ -1062,9 +1071,6 @@ gimp_drawable_transform_paste (GimpDrawable *drawable, /* End the group undo */ gimp_image_undo_group_end (gimage); - /* Free the tiles */ - tile_manager_destroy (tiles); - return TRUE; } else @@ -1102,7 +1108,8 @@ gimp_drawable_transform_paste (GimpDrawable *drawable, channel); /* set the current layer's data */ - drawable->tiles = tiles; + tile_manager_unref (drawable->tiles); + drawable->tiles = tile_manager_ref (tiles); /* Fill in the new layer's attributes */ GIMP_ITEM (drawable)->width = tile_manager_width (tiles); diff --git a/app/core/gimpbuffer.c b/app/core/gimpbuffer.c index 8b7fecd016..704b16a227 100644 --- a/app/core/gimpbuffer.c +++ b/app/core/gimpbuffer.c @@ -128,7 +128,7 @@ gimp_buffer_finalize (GObject *object) if (buffer->tiles) { - tile_manager_destroy (buffer->tiles); + tile_manager_unref (buffer->tiles); buffer->tiles = NULL; } diff --git a/app/core/gimpdrawable-blend.c b/app/core/gimpdrawable-blend.c index 6fe3d9b21e..4f60e4e36f 100644 --- a/app/core/gimpdrawable-blend.c +++ b/app/core/gimpdrawable-blend.c @@ -226,7 +226,7 @@ gimp_drawable_blend (GimpDrawable *drawable, if (distR.tiles) { - tile_manager_destroy (distR.tiles); + tile_manager_unref (distR.tiles); distR.tiles = NULL; } @@ -240,7 +240,7 @@ gimp_drawable_blend (GimpDrawable *drawable, gimp_drawable_update (drawable, x1, y1, (x2 - x1), (y2 - y1)); /* free the temporary buffer */ - tile_manager_destroy (buf_tiles); + tile_manager_unref (buf_tiles); gimp_unset_busy (gimage->gimp); } @@ -675,7 +675,7 @@ gradient_precalc_shapeburst (GimpImage *gimage, pixel_region_init (&distR, distR.tiles, 0, 0, PR->w, PR->h, FALSE); } - tile_manager_destroy (tempR.tiles); + tile_manager_unref (tempR.tiles); } diff --git a/app/core/gimpdrawable-bucket-fill.c b/app/core/gimpdrawable-bucket-fill.c index 9420cae4ee..cf8cdb12f6 100644 --- a/app/core/gimpdrawable-bucket-fill.c +++ b/app/core/gimpdrawable-bucket-fill.c @@ -320,7 +320,7 @@ gimp_drawable_bucket_fill_full (GimpDrawable *drawable, TRUE, _("Bucket Fill"), opacity, paint_mode, NULL, x1, y1); - tile_manager_destroy (buf_tiles); + tile_manager_unref (buf_tiles); /* update the image */ gimp_drawable_update (drawable, x1, y1, (x2 - x1), (y2 - y1)); diff --git a/app/core/gimpdrawable-offset.c b/app/core/gimpdrawable-offset.c index c4cc35bc5f..b30077d16a 100644 --- a/app/core/gimpdrawable-offset.c +++ b/app/core/gimpdrawable-offset.c @@ -322,6 +322,7 @@ gimp_drawable_offset (GimpDrawable *drawable, FALSE); /* swap the tiles */ + tile_manager_unref (drawable->tiles); drawable->tiles = new_tiles; /* update the drawable */ diff --git a/app/core/gimpdrawable-transform.c b/app/core/gimpdrawable-transform.c index 32418ff07e..0613c39279 100644 --- a/app/core/gimpdrawable-transform.c +++ b/app/core/gimpdrawable-transform.c @@ -847,11 +847,14 @@ gimp_drawable_transform_affine (GimpDrawable *drawable, NULL, NULL); /* Free the cut/copied buffer */ - tile_manager_destroy (orig_tiles); + tile_manager_unref (orig_tiles); if (new_tiles) - success = gimp_drawable_transform_paste (drawable, new_tiles, - new_layer); + { + success = gimp_drawable_transform_paste (drawable, new_tiles, + new_layer); + tile_manager_unref (new_tiles); + } } /* push the undo group end */ @@ -911,11 +914,14 @@ gimp_drawable_transform_flip (GimpDrawable *drawable, flip_type, axis, FALSE); /* Free the cut/copied buffer */ - tile_manager_destroy (orig_tiles); + tile_manager_unref (orig_tiles); if (new_tiles) - success = gimp_drawable_transform_paste (drawable, new_tiles, - new_layer); + { + success = gimp_drawable_transform_paste (drawable, new_tiles, + new_layer); + tile_manager_unref (new_tiles); + } } /* push the undo group end */ @@ -966,11 +972,14 @@ gimp_drawable_transform_rotate (GimpDrawable *drawable, FALSE); /* Free the cut/copied buffer */ - tile_manager_destroy (orig_tiles); + tile_manager_unref (orig_tiles); if (new_tiles) - success = gimp_drawable_transform_paste (drawable, new_tiles, - new_layer); + { + success = gimp_drawable_transform_paste (drawable, new_tiles, + new_layer); + tile_manager_unref (new_tiles); + } } /* push the undo group end */ @@ -1062,9 +1071,6 @@ gimp_drawable_transform_paste (GimpDrawable *drawable, /* End the group undo */ gimp_image_undo_group_end (gimage); - /* Free the tiles */ - tile_manager_destroy (tiles); - return TRUE; } else @@ -1102,7 +1108,8 @@ gimp_drawable_transform_paste (GimpDrawable *drawable, channel); /* set the current layer's data */ - drawable->tiles = tiles; + tile_manager_unref (drawable->tiles); + drawable->tiles = tile_manager_ref (tiles); /* Fill in the new layer's attributes */ GIMP_ITEM (drawable)->width = tile_manager_width (tiles); diff --git a/app/core/gimpdrawable.c b/app/core/gimpdrawable.c index d692b3cd77..6b24895521 100644 --- a/app/core/gimpdrawable.c +++ b/app/core/gimpdrawable.c @@ -217,7 +217,7 @@ gimp_drawable_finalize (GObject *object) if (drawable->tiles) { - tile_manager_destroy (drawable->tiles); + tile_manager_unref (drawable->tiles); drawable->tiles = NULL; } @@ -365,6 +365,7 @@ gimp_drawable_scale (GimpItem *item, gimp_drawable_is_indexed (drawable) ? GIMP_INTERPOLATION_NONE : interpolation_type); + tile_manager_unref (drawable->tiles); drawable->tiles = new_tiles; GIMP_ITEM_CLASS (parent_class)->scale (item, new_width, new_height, @@ -444,6 +445,7 @@ gimp_drawable_resize (GimpItem *item, copy_region (&srcPR, &destPR); } + tile_manager_unref (drawable->tiles); drawable->tiles = new_tiles; GIMP_ITEM_CLASS (parent_class)->resize (item, new_width, new_height, @@ -481,7 +483,10 @@ gimp_drawable_flip (GimpItem *item, tile_manager_set_offsets (drawable->tiles, old_off_x, old_off_y); if (tiles) - gimp_drawable_transform_paste (drawable, tiles, FALSE); + { + gimp_drawable_transform_paste (drawable, tiles, FALSE); + tile_manager_unref (tiles); + } } static void @@ -511,7 +516,10 @@ gimp_drawable_rotate (GimpItem *item, tile_manager_set_offsets (drawable->tiles, old_off_x, old_off_y); if (tiles) - gimp_drawable_transform_paste (drawable, tiles, FALSE); + { + gimp_drawable_transform_paste (drawable, tiles, FALSE); + tile_manager_unref (tiles); + } } static void @@ -546,7 +554,10 @@ gimp_drawable_transform (GimpItem *item, tile_manager_set_offsets (drawable->tiles, old_off_x, old_off_y); if (tiles) - gimp_drawable_transform_paste (drawable, tiles, FALSE); + { + gimp_drawable_transform_paste (drawable, tiles, FALSE); + tile_manager_unref (tiles); + } } void @@ -570,7 +581,7 @@ gimp_drawable_configure (GimpDrawable *drawable, drawable->has_alpha = GIMP_IMAGE_TYPE_HAS_ALPHA (type); if (drawable->tiles) - tile_manager_destroy (drawable->tiles); + tile_manager_unref (drawable->tiles); drawable->tiles = tile_manager_new (width, height, drawable->bytes); diff --git a/app/core/gimpedit.c b/app/core/gimpedit.c index 6dc17382de..41ce098f44 100644 --- a/app/core/gimpedit.c +++ b/app/core/gimpedit.c @@ -76,7 +76,7 @@ gimp_edit_cut (GimpImage *gimage, if (cropped_cut != cut) { - tile_manager_destroy (cut); + tile_manager_unref (cut); cut = NULL; } } @@ -134,7 +134,7 @@ gimp_edit_copy (GimpImage *gimage, if (cropped_copy != copy) { - tile_manager_destroy (copy); + tile_manager_unref (copy); copy = NULL; } } @@ -323,7 +323,7 @@ gimp_edit_clear (GimpImage *gimage, (x2 - x1), (y2 - y1)); /* free the temporary tiles */ - tile_manager_destroy (buf_tiles); + tile_manager_unref (buf_tiles); return TRUE; } @@ -405,7 +405,7 @@ gimp_edit_fill (GimpImage *gimage, (x2 - x1), (y2 - y1)); /* free the temporary tiles */ - tile_manager_destroy (buf_tiles); + tile_manager_unref (buf_tiles); return TRUE; } diff --git a/app/core/gimpimage-convert.c b/app/core/gimpimage-convert.c index 2be23f5dfa..57786fa319 100644 --- a/app/core/gimpimage-convert.c +++ b/app/core/gimpimage-convert.c @@ -927,6 +927,8 @@ gimp_image_convert (GimpImage *gimage, /* Push the layer onto the undo stack */ gimp_image_undo_push_layer_mod (gimage, NULL, layer); + tile_manager_unref (GIMP_DRAWABLE (layer)->tiles); + GIMP_DRAWABLE (layer)->tiles = new_tiles; GIMP_DRAWABLE (layer)->type = new_layer_type; GIMP_DRAWABLE (layer)->bytes = GIMP_IMAGE_TYPE_BYTES (new_layer_type); diff --git a/app/core/gimpimage-mask.c b/app/core/gimpimage-mask.c index 6d77a56593..d8b0981af3 100644 --- a/app/core/gimpimage-mask.c +++ b/app/core/gimpimage-mask.c @@ -406,7 +406,7 @@ gimp_image_mask_float (GimpImage *gimage, GIMP_ITEM (layer)->offset_y = y1 + off_y; /* Free the temp buffer */ - tile_manager_destroy (tiles); + tile_manager_unref (tiles); /* Add the floating layer to the gimage */ floating_sel_attach (layer, drawable); diff --git a/app/core/gimpimage-projection.c b/app/core/gimpimage-projection.c index 015a89a3d6..df0efb06a4 100644 --- a/app/core/gimpimage-projection.c +++ b/app/core/gimpimage-projection.c @@ -131,7 +131,7 @@ gimp_image_projection_free (GimpImage *gimage) if (gimage->projection) { - tile_manager_destroy (gimage->projection); + tile_manager_unref (gimage->projection); gimage->projection = NULL; } } @@ -141,9 +141,9 @@ gimp_image_projection (GimpImage *gimage) { g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - if ((gimage->projection == NULL) || - (tile_manager_width (gimage->projection) != gimage->width) || - (tile_manager_height (gimage->projection) != gimage->height)) + if (gimage->projection == NULL || + tile_manager_width (gimage->projection) != gimage->width || + tile_manager_height (gimage->projection) != gimage->height) { gimp_image_projection_allocate (gimage); } diff --git a/app/core/gimpimage-undo-push.c b/app/core/gimpimage-undo-push.c index df1df5fab2..ea98de4ed3 100644 --- a/app/core/gimpimage-undo-push.c +++ b/app/core/gimpimage-undo-push.c @@ -187,7 +187,7 @@ gimp_image_undo_push_image_mod (GimpImage *gimage, image_undo = new->data; - image_undo->tiles = tiles; + image_undo->tiles = tile_manager_ref (tiles); image_undo->x1 = x1; image_undo->y1 = y1; image_undo->x2 = x2; @@ -197,8 +197,6 @@ gimp_image_undo_push_image_mod (GimpImage *gimage, return TRUE; } - tile_manager_destroy (tiles); - return FALSE; } @@ -239,9 +237,9 @@ undo_pop_image (GimpUndo *undo, } else { - int i, j; Tile *src_tile; Tile *dest_tile; + gint i, j; w = image_undo->x2 - image_undo->x1; h = image_undo->y2 - image_undo->y1; @@ -251,6 +249,7 @@ undo_pop_image (GimpUndo *undo, for (j = x; j < image_undo->x2; j += (TILE_WIDTH - (j % TILE_WIDTH))) { src_tile = tile_manager_get_tile (tiles, j, i, FALSE, FALSE); + if (tile_is_valid (src_tile) == TRUE) { /* swap tiles, not pixels! */ @@ -289,7 +288,7 @@ undo_free_image (GimpUndo *undo, image_undo = (ImageUndo *) undo->data; - tile_manager_destroy (image_undo->tiles); + tile_manager_unref (image_undo->tiles); g_free (image_undo); } @@ -878,7 +877,7 @@ gimp_image_undo_push_mask (GimpImage *gimage, } if (undo_tiles) - tile_manager_destroy (undo_tiles); + tile_manager_unref (undo_tiles); return FALSE; } @@ -934,7 +933,7 @@ undo_pop_mask (GimpUndo *undo, copy_region (&srcPR, &destPR); - tile_manager_destroy (mu->tiles); + tile_manager_unref (mu->tiles); } if (channel == gimp_image_get_mask (undo->gimage)) @@ -996,7 +995,7 @@ undo_free_mask (GimpUndo *undo, mu = (MaskUndo *) undo->data; if (mu->tiles) - tile_manager_destroy (mu->tiles); + tile_manager_unref (mu->tiles); g_free (mu); } @@ -1567,7 +1566,7 @@ gimp_image_undo_push_layer_mod (GimpImage *gimage, lmu = new->data; - lmu->tiles = tiles; + lmu->tiles = tile_manager_ref (tiles); lmu->type = GIMP_DRAWABLE (layer)->type; lmu->offset_x = GIMP_ITEM (layer)->offset_x; lmu->offset_y = GIMP_ITEM (layer)->offset_y; @@ -1575,8 +1574,6 @@ gimp_image_undo_push_layer_mod (GimpImage *gimage, return TRUE; } - tile_manager_destroy (tiles); - return FALSE; } @@ -1663,7 +1660,7 @@ undo_free_layer_mod (GimpUndo *undo, lmu = (LayerModUndo *) undo->data; - tile_manager_destroy (lmu->tiles); + tile_manager_unref (lmu->tiles); g_free (lmu); } @@ -2204,13 +2201,11 @@ gimp_image_undo_push_channel_mod (GimpImage *gimage, cmu = new->data; - cmu->tiles = tiles; + cmu->tiles = tile_manager_ref (tiles); return TRUE; } - tile_manager_destroy (tiles); - return FALSE; } @@ -2250,7 +2245,7 @@ undo_pop_channel_mod (GimpUndo *undo, GIMP_DRAWABLE (channel)->tiles = tiles; GIMP_ITEM (channel)->width = tile_manager_width (tiles); GIMP_ITEM (channel)->height = tile_manager_height (tiles); - channel->bounds_known = FALSE; + channel->bounds_known = FALSE; if (GIMP_ITEM (channel)->width != tile_manager_width (cmu->tiles) || GIMP_ITEM (channel)->height != tile_manager_height (cmu->tiles)) @@ -2282,7 +2277,7 @@ undo_free_channel_mod (GimpUndo *undo, cmu = (ChannelModUndo *) undo->data; - tile_manager_destroy (cmu->tiles); + tile_manager_unref (cmu->tiles); g_free (cmu); } @@ -2817,7 +2812,7 @@ gimp_image_undo_push_fs_to_layer (GimpImage *gimage, return TRUE; } - tile_manager_destroy (floating_layer->fs.backing_store); + tile_manager_unref (floating_layer->fs.backing_store); floating_layer->fs.backing_store = NULL; return FALSE; @@ -2895,7 +2890,7 @@ undo_free_fs_to_layer (GimpUndo *undo, if (undo_mode == GIMP_UNDO_MODE_UNDO) { - tile_manager_destroy (fsu->floating_layer->fs.backing_store); + tile_manager_unref (fsu->floating_layer->fs.backing_store); fsu->floating_layer->fs.backing_store = NULL; } diff --git a/app/core/gimpimage.c b/app/core/gimpimage.c index 1214e2bf91..9c6fe4cc57 100644 --- a/app/core/gimpimage.c +++ b/app/core/gimpimage.c @@ -1611,7 +1611,7 @@ gimp_image_free_shadow (GimpImage *gimage) if (gimage->shadow) { - tile_manager_destroy (gimage->shadow); + tile_manager_unref (gimage->shadow); gimage->shadow = NULL; } } diff --git a/app/core/gimpimagemap.c b/app/core/gimpimagemap.c index eecac5aa1a..e7a7d2213b 100644 --- a/app/core/gimpimagemap.c +++ b/app/core/gimpimagemap.c @@ -236,9 +236,9 @@ gimp_image_map_apply (GimpImageMap *image_map, if (! image_map->undo_tiles || width != (x2 - x1) || height != (y2 - y1)) { - /* Destroy old tiles--If they exist */ + /* Destroy old tiles */ if (image_map->undo_tiles) - tile_manager_destroy (image_map->undo_tiles); + tile_manager_unref (image_map->undo_tiles); /* Allocate new tiles */ image_map->undo_tiles = @@ -329,6 +329,9 @@ gimp_image_map_commit (GimpImageMap *image_map) image_map->undo_desc, x1, y1, x2, y2, image_map->undo_tiles, FALSE); + + tile_manager_unref (image_map->undo_tiles); + image_map->undo_tiles = NULL; } g_object_unref (image_map); @@ -381,7 +384,7 @@ gimp_image_map_clear (GimpImageMap *image_map) { g_message ("image depth change, unable to restore original image"); - tile_manager_destroy (image_map->undo_tiles); + tile_manager_unref (image_map->undo_tiles); gimp_image_undo_thaw (gimage); #if 0 @@ -401,7 +404,7 @@ gimp_image_map_clear (GimpImageMap *image_map) width, height); /* Free the undo_tiles tile manager */ - tile_manager_destroy (image_map->undo_tiles); + tile_manager_unref (image_map->undo_tiles); image_map->undo_tiles = NULL; } } diff --git a/app/core/gimplayer-floating-sel.c b/app/core/gimplayer-floating-sel.c index 0d34dcd4a4..fdbd1b5d4c 100644 --- a/app/core/gimplayer-floating-sel.c +++ b/app/core/gimplayer-floating-sel.c @@ -262,7 +262,7 @@ floating_sel_store (GimpLayer *layer, gimp_drawable_bytes (layer->fs.drawable))) { /* free the backing store and allocate anew */ - tile_manager_destroy (layer->fs.backing_store); + tile_manager_unref (layer->fs.backing_store); layer->fs.backing_store = tile_manager_new (GIMP_ITEM (layer)->width, diff --git a/app/core/gimplayer.c b/app/core/gimplayer.c index 0b61b9661e..220d4bf37b 100644 --- a/app/core/gimplayer.c +++ b/app/core/gimplayer.c @@ -265,7 +265,7 @@ gimp_layer_finalize (GObject *object) /* free the floating selection if it exists */ if (layer->fs.backing_store) { - tile_manager_destroy (layer->fs.backing_store); + tile_manager_unref (layer->fs.backing_store); layer->fs.backing_store = NULL; } @@ -800,7 +800,7 @@ gimp_layer_new_from_drawable (GimpDrawable *drawable, break; } - tile_manager_destroy (new_drawable->tiles); + tile_manager_unref (new_drawable->tiles); new_drawable->tiles = new_tiles; new_drawable->type = new_type; @@ -1034,7 +1034,7 @@ gimp_layer_create_mask (const GimpLayer *layer, } if (copy_tiles) - tile_manager_destroy (copy_tiles); + tile_manager_unref (copy_tiles); } GIMP_CHANNEL (mask)->bounds_known = FALSE; @@ -1173,6 +1173,8 @@ gimp_layer_add_alpha (GimpLayer *layer) _("Add Alpha Channel"), layer); /* Configure the new layer */ + tile_manager_unref (GIMP_DRAWABLE (layer)->tiles); + GIMP_DRAWABLE (layer)->tiles = new_tiles; GIMP_DRAWABLE (layer)->type = type; GIMP_DRAWABLE (layer)->bytes = GIMP_DRAWABLE (layer)->bytes + 1; diff --git a/app/core/gimpprojection-construct.c b/app/core/gimpprojection-construct.c index 015a89a3d6..df0efb06a4 100644 --- a/app/core/gimpprojection-construct.c +++ b/app/core/gimpprojection-construct.c @@ -131,7 +131,7 @@ gimp_image_projection_free (GimpImage *gimage) if (gimage->projection) { - tile_manager_destroy (gimage->projection); + tile_manager_unref (gimage->projection); gimage->projection = NULL; } } @@ -141,9 +141,9 @@ gimp_image_projection (GimpImage *gimage) { g_return_val_if_fail (GIMP_IS_IMAGE (gimage), NULL); - if ((gimage->projection == NULL) || - (tile_manager_width (gimage->projection) != gimage->width) || - (tile_manager_height (gimage->projection) != gimage->height)) + if (gimage->projection == NULL || + tile_manager_width (gimage->projection) != gimage->width || + tile_manager_height (gimage->projection) != gimage->height) { gimp_image_projection_allocate (gimage); } diff --git a/app/paint/gimpink.c b/app/paint/gimpink.c index cc39802368..6ee07add79 100644 --- a/app/paint/gimpink.c +++ b/app/paint/gimpink.c @@ -676,18 +676,18 @@ ink_init (GimpInkTool *ink_tool, { GimpItem *item = GIMP_ITEM (drawable); - /* free the block structures */ - if (undo_tiles) - tile_manager_destroy (undo_tiles); - if (canvas_tiles) - tile_manager_destroy (canvas_tiles); - /* Allocate the undo structure */ + if (undo_tiles) + tile_manager_unref (undo_tiles); + undo_tiles = tile_manager_new (gimp_item_width (item), gimp_item_height (item), gimp_drawable_bytes (drawable)); /* Allocate the canvas blocks structure */ + if (canvas_tiles) + tile_manager_unref (canvas_tiles); + canvas_tiles = tile_manager_new (gimp_item_width (item), gimp_item_height (item), 1); @@ -704,6 +704,8 @@ ink_finish (GimpInkTool *ink_tool, ink_tool->x1, ink_tool->y1, ink_tool->x2, ink_tool->y2, undo_tiles, TRUE); + + tile_manager_unref (undo_tiles); undo_tiles = NULL; /* invalidate the drawable--have to do it here, because @@ -718,14 +720,14 @@ ink_cleanup (void) /* If the undo tiles exist, nuke them */ if (undo_tiles) { - tile_manager_destroy (undo_tiles); + tile_manager_unref (undo_tiles); undo_tiles = NULL; } /* If the canvas blocks exist, nuke them */ if (canvas_tiles) { - tile_manager_destroy (canvas_tiles); + tile_manager_unref (canvas_tiles); canvas_tiles = NULL; } diff --git a/app/paint/gimppaintcore.c b/app/paint/gimppaintcore.c index 20ee35b2df..279e9ae29f 100644 --- a/app/paint/gimppaintcore.c +++ b/app/paint/gimppaintcore.c @@ -392,7 +392,7 @@ gimp_paint_core_start (GimpPaintCore *core, /* Allocate the undo structure */ if (core->undo_tiles) - tile_manager_destroy (core->undo_tiles); + tile_manager_unref (core->undo_tiles); core->undo_tiles = tile_manager_new (gimp_item_width (item), gimp_item_height (item), @@ -400,7 +400,7 @@ gimp_paint_core_start (GimpPaintCore *core, /* Allocate the canvas blocks structure */ if (core->canvas_tiles) - tile_manager_destroy (core->canvas_tiles); + tile_manager_unref (core->canvas_tiles); core->canvas_tiles = tile_manager_new (gimp_item_width (item), gimp_item_height (item), @@ -453,6 +453,8 @@ gimp_paint_core_finish (GimpPaintCore *core, core->x2, core->y2, core->undo_tiles, TRUE); + + tile_manager_unref (core->undo_tiles); core->undo_tiles = NULL; gimp_image_undo_group_end (gimage); @@ -470,13 +472,13 @@ gimp_paint_core_cleanup (GimpPaintCore *core) if (core->undo_tiles) { - tile_manager_destroy (core->undo_tiles); + tile_manager_unref (core->undo_tiles); core->undo_tiles = NULL; } if (core->canvas_tiles) { - tile_manager_destroy (core->canvas_tiles); + tile_manager_unref (core->canvas_tiles); core->canvas_tiles = NULL; } diff --git a/app/text/gimptextlayer.c b/app/text/gimptextlayer.c index 42893c3385..ef8923f8cf 100644 --- a/app/text/gimptextlayer.c +++ b/app/text/gimptextlayer.c @@ -315,7 +315,7 @@ gimp_text_layer_render (GimpTextLayer *layer) GIMP_ITEM (drawable)->height = height; if (drawable->tiles) - tile_manager_destroy (drawable->tiles); + tile_manager_unref (drawable->tiles); drawable->tiles = tile_manager_new (width, height, drawable->bytes); @@ -363,7 +363,7 @@ gimp_text_layer_render_layout (GimpTextLayer *layer, apply_mask_to_region (&textPR, &maskPR, OPAQUE_OPACITY); - tile_manager_destroy (mask); + tile_manager_unref (mask); gimp_drawable_update (drawable, 0, 0, width, height); } diff --git a/app/tools/gimpinktool.c b/app/tools/gimpinktool.c index cc39802368..6ee07add79 100644 --- a/app/tools/gimpinktool.c +++ b/app/tools/gimpinktool.c @@ -676,18 +676,18 @@ ink_init (GimpInkTool *ink_tool, { GimpItem *item = GIMP_ITEM (drawable); - /* free the block structures */ - if (undo_tiles) - tile_manager_destroy (undo_tiles); - if (canvas_tiles) - tile_manager_destroy (canvas_tiles); - /* Allocate the undo structure */ + if (undo_tiles) + tile_manager_unref (undo_tiles); + undo_tiles = tile_manager_new (gimp_item_width (item), gimp_item_height (item), gimp_drawable_bytes (drawable)); /* Allocate the canvas blocks structure */ + if (canvas_tiles) + tile_manager_unref (canvas_tiles); + canvas_tiles = tile_manager_new (gimp_item_width (item), gimp_item_height (item), 1); @@ -704,6 +704,8 @@ ink_finish (GimpInkTool *ink_tool, ink_tool->x1, ink_tool->y1, ink_tool->x2, ink_tool->y2, undo_tiles, TRUE); + + tile_manager_unref (undo_tiles); undo_tiles = NULL; /* invalidate the drawable--have to do it here, because @@ -718,14 +720,14 @@ ink_cleanup (void) /* If the undo tiles exist, nuke them */ if (undo_tiles) { - tile_manager_destroy (undo_tiles); + tile_manager_unref (undo_tiles); undo_tiles = NULL; } /* If the canvas blocks exist, nuke them */ if (canvas_tiles) { - tile_manager_destroy (canvas_tiles); + tile_manager_unref (canvas_tiles); canvas_tiles = NULL; } diff --git a/app/tools/gimpiscissorstool.c b/app/tools/gimpiscissorstool.c index 1d14b4240a..a10f444079 100644 --- a/app/tools/gimpiscissorstool.c +++ b/app/tools/gimpiscissorstool.c @@ -1067,7 +1067,7 @@ gimp_iscissors_tool_reset (GimpIscissorsTool *iscissors) cur_tile = NULL; } - tile_manager_destroy (iscissors->gradient_map); + tile_manager_unref (iscissors->gradient_map); iscissors->gradient_map = NULL; } diff --git a/app/tools/gimptransformtool-undo.c b/app/tools/gimptransformtool-undo.c index 450beac035..6ce255d468 100644 --- a/app/tools/gimptransformtool-undo.c +++ b/app/tools/gimptransformtool-undo.c @@ -86,7 +86,8 @@ gimp_transform_tool_push_undo (GimpImage *gimage, for (i = 0; i < TRAN_INFO_SIZE; i++) tu->trans_info[i] = trans_info[i]; - tu->original = original; + if (original) + tu->original = tile_manager_ref (original); return TRUE; } @@ -154,7 +155,7 @@ undo_free_transform (GimpUndo *undo, tu = (TransformUndo *) undo->data; if (tu->original) - tile_manager_destroy (tu->original); + tile_manager_unref (tu->original); g_free (tu); } diff --git a/app/tools/gimptransformtool.c b/app/tools/gimptransformtool.c index 55aed6ea3f..9fae6970d2 100644 --- a/app/tools/gimptransformtool.c +++ b/app/tools/gimptransformtool.c @@ -249,7 +249,7 @@ gimp_transform_tool_finalize (GObject *object) if (tr_tool->original) { - tile_manager_destroy (tr_tool->original); + tile_manager_unref (tr_tool->original); tr_tool->original = NULL; } @@ -880,6 +880,7 @@ gimp_transform_tool_doit (GimpTransformTool *tr_tool, gimp_drawable_transform_paste (tool->drawable, new_tiles, new_layer); + tile_manager_unref (new_tiles); /* Make a note of the new current drawable (since we may have * a floating selection, etc now. @@ -959,7 +960,7 @@ gimp_transform_tool_reset (GimpTransformTool *tr_tool) if (tr_tool->original) { - tile_manager_destroy (tr_tool->original); + tile_manager_unref (tr_tool->original); tr_tool->original = NULL; }