diff options
Diffstat (limited to 'source/blender/blenkernel/intern/image.c')
-rw-r--r-- | source/blender/blenkernel/intern/image.c | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/source/blender/blenkernel/intern/image.c b/source/blender/blenkernel/intern/image.c index 5c673eeef3f..36cd7e69601 100644 --- a/source/blender/blenkernel/intern/image.c +++ b/source/blender/blenkernel/intern/image.c @@ -249,7 +249,7 @@ void BKE_image_de_interlace(Image *ima, int odd) /* ***************** ALLOC & FREE, DATA MANAGING *************** */ -static void image_free_cahced_frames(Image *image) +static void image_free_cached_frames(Image *image) { if (image->cache) { IMB_moviecache_free(image->cache); @@ -263,7 +263,7 @@ static void image_free_cahced_frames(Image *image) */ void BKE_image_free_buffers(Image *ima) { - image_free_cahced_frames(ima); + image_free_cached_frames(ima); if (ima->anim) IMB_free_anim(ima->anim); ima->anim = NULL; @@ -273,7 +273,13 @@ void BKE_image_free_buffers(Image *ima) ima->rr = NULL; } - GPU_free_image(ima); + if (!G.background) { + /* Background mode doesn't use opnegl, + * so we can avoid freeing GPU images and save some + * time by skipping mutex lock. + */ + GPU_free_image(ima); + } ima->ok = IMA_OK; } @@ -661,7 +667,7 @@ Image *BKE_image_load(Main *bmain, const char *filepath) /* otherwise creates new. */ /* does not load ibuf itself */ /* pass on optional frame for #name images */ -Image *BKE_image_load_exists(const char *filepath) +Image *BKE_image_load_exists_ex(const char *filepath, bool *r_exists) { Image *ima; char str[FILE_MAX], strtest[FILE_MAX]; @@ -681,16 +687,24 @@ Image *BKE_image_load_exists(const char *filepath) ima->id.us++; /* officially should not, it doesn't link here! */ if (ima->ok == 0) ima->ok = IMA_OK; - /* RETURN! */ + if (r_exists) + *r_exists = true; return ima; } } } } + if (r_exists) + *r_exists = false; return BKE_image_load(G.main, filepath); } +Image *BKE_image_load_exists(const char *filepath) +{ + return BKE_image_load_exists_ex(filepath, NULL); +} + static ImBuf *add_ibuf_size(unsigned int width, unsigned int height, const char *name, int depth, int floatbuf, short gen_type, const float color[4], ColorManagedColorspaceSettings *colorspace_settings) { @@ -2529,7 +2543,7 @@ static ImBuf *image_load_sequence_multilayer(Image *ima, ImageUser *iuser, int f * need to ensure there's no image buffers are hanging around * with dead links after freeing the render result. */ - image_free_cahced_frames(ima); + image_free_cached_frames(ima); RE_FreeRenderResult(ima->rr); ima->rr = NULL; } @@ -3393,9 +3407,9 @@ bool BKE_image_has_alpha(struct Image *image) BKE_image_release_ibuf(image, ibuf, lock); if (planes == 32) - return 1; + return true; else - return 0; + return false; } void BKE_image_get_size(Image *image, ImageUser *iuser, int *width, int *height) |