summaryrefslogtreecommitdiff
path: root/source/fitz/image.c
diff options
context:
space:
mode:
Diffstat (limited to 'source/fitz/image.c')
-rw-r--r--source/fitz/image.c56
1 files changed, 41 insertions, 15 deletions
diff --git a/source/fitz/image.c b/source/fitz/image.c
index e6772783..247cb088 100644
--- a/source/fitz/image.c
+++ b/source/fitz/image.c
@@ -18,18 +18,6 @@ struct fz_pixmap_image_s
fz_pixmap *tile;
};
-fz_image *
-fz_keep_image(fz_context *ctx, fz_image *image)
-{
- return fz_keep_storable(ctx, &image->storable);
-}
-
-void
-fz_drop_image(fz_context *ctx, fz_image *image)
-{
- fz_drop_storable(ctx, &image->storable);
-}
-
typedef struct fz_image_key_s fz_image_key;
struct fz_image_key_s {
@@ -39,6 +27,24 @@ struct fz_image_key_s {
fz_irect rect;
};
+fz_image *
+fz_keep_image(fz_context *ctx, fz_image *image)
+{
+ return fz_keep_key_storable(ctx, &image->key_storable);
+}
+
+fz_image *
+fz_keep_image_store_key(fz_context *ctx, fz_image *image)
+{
+ return fz_keep_key_storable_key(ctx, &image->key_storable);
+}
+
+void
+fz_drop_image_store_key(fz_context *ctx, fz_image *image)
+{
+ fz_drop_key_storable_key(ctx, &image->key_storable);
+}
+
static int
fz_make_hash_image_key(fz_context *ctx, fz_store_hash *hash, void *key_)
{
@@ -62,7 +68,7 @@ fz_drop_image_key(fz_context *ctx, void *key_)
fz_image_key *key = (fz_image_key *)key_;
if (fz_drop_imp(ctx, key, &key->refs))
{
- fz_drop_image(ctx, key->image);
+ fz_drop_image_store_key(ctx, key->image);
fz_free(ctx, key);
}
}
@@ -91,6 +97,26 @@ static fz_store_type fz_image_store_type =
fz_print_image
};
+static int
+drop_matching_images(fz_context *ctx, void *image_, void *key_)
+{
+ fz_image_key *key = (fz_image_key *)key_;
+ fz_image *image = (fz_image *)image_;
+
+ return key->image == image;
+}
+
+void
+fz_drop_image(fz_context *ctx, fz_image *image)
+{
+ if (fz_drop_key_storable(ctx, &image->key_storable))
+ {
+ /* All the image refs left are references from keys in the store. */
+ /* We can never hope to match these keys again, so drop the objects. */
+ fz_filter_store(ctx, drop_matching_images, image, &fz_image_store_type);
+ }
+}
+
static void
fz_mask_color_key(fz_pixmap *pix, int n, const int *colorkey)
{
@@ -671,7 +697,7 @@ fz_get_pixmap_from_image(fz_context *ctx, fz_image *image, const fz_irect *subar
keyp = fz_malloc_struct(ctx, fz_image_key);
keyp->refs = 1;
- keyp->image = fz_keep_image(ctx, image);
+ keyp->image = fz_keep_image_store_key(ctx, image);
keyp->l2factor = l2factor;
keyp->rect = key.rect;
existing_tile = fz_store_item(ctx, keyp, tile, fz_pixmap_size(ctx, tile), &fz_image_store_type);
@@ -754,7 +780,7 @@ fz_new_image(fz_context *ctx, int w, int h, int bpc, fz_colorspace *colorspace,
assert(size >= sizeof(fz_image));
image = Memento_label(fz_calloc(ctx, 1, size), "fz_image");
- FZ_INIT_STORABLE(image, 1, fz_drop_image_imp);
+ FZ_INIT_KEY_STORABLE(image, 1, fz_drop_image_imp);
image->drop_image = drop;
image->get_pixmap = get;
image->get_size = get_size;