diff options
m--------- | release/datafiles/locale | 0 | ||||
m--------- | release/scripts/addons | 0 | ||||
m--------- | release/scripts/addons_contrib | 0 | ||||
-rw-r--r-- | source/blender/blenkernel/BKE_image.h | 2 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/image_gpu.c | 27 | ||||
-rw-r--r-- | source/blender/draw/engines/image/image_engine.c | 2 | ||||
m--------- | source/tools | 0 |
7 files changed, 21 insertions, 10 deletions
diff --git a/release/datafiles/locale b/release/datafiles/locale -Subproject 2b3c19f5f61fc72dba56a7edfdc4e55e2327dc1 +Subproject 07106b588381ef26604934482a6151d9bc26437 diff --git a/release/scripts/addons b/release/scripts/addons -Subproject 1f043682f9568fed02e3b877b31e8244b1b7a5c +Subproject 1be0b3210d8a3a30e99a853b50703a7ca7e8ac1 diff --git a/release/scripts/addons_contrib b/release/scripts/addons_contrib -Subproject a52733b58d95ce60ecde95a9eca242e7319c285 +Subproject f2f4a8b3bfa36ee49f7bdb3a1acb40ef4b39ee3 diff --git a/source/blender/blenkernel/BKE_image.h b/source/blender/blenkernel/BKE_image.h index 725f19b1ce2..369ddc444b6 100644 --- a/source/blender/blenkernel/BKE_image.h +++ b/source/blender/blenkernel/BKE_image.h @@ -382,7 +382,7 @@ struct GPUTexture *BKE_image_get_gpu_tiles(struct Image *image, struct GPUTexture *BKE_image_get_gpu_tilemap(struct Image *image, struct ImageUser *iuser, struct ImBuf *ibuf); - +bool BKE_image_has_gpu_texture_premultiplied_alpha(struct Image *image, struct ImBuf *ibuf); void BKE_image_update_gputexture( struct Image *ima, struct ImageUser *iuser, int x, int y, int w, int h); void BKE_image_paint_set_mipmap(struct Main *bmain, bool mipmap); diff --git a/source/blender/blenkernel/intern/image_gpu.c b/source/blender/blenkernel/intern/image_gpu.c index 57e7e9446d2..4d4013e5d1d 100644 --- a/source/blender/blenkernel/intern/image_gpu.c +++ b/source/blender/blenkernel/intern/image_gpu.c @@ -49,6 +49,21 @@ static void gpu_free_unused_buffers(void); static void image_free_gpu(Image *ima, const bool immediate); +/* Is the alpha of the `GPUTexture` for a given image/ibuf premultiplied. */ +bool BKE_image_has_gpu_texture_premultiplied_alpha(Image *image, ImBuf *ibuf) +{ + const bool type_is_premultiplied = (image == NULL) || ELEM(image->type, + IMA_TYPE_R_RESULT, + IMA_TYPE_COMPOSITE, + IMA_TYPE_UV_TEST); + const bool store_premultiplied = + type_is_premultiplied || + ((ibuf != NULL) && + (ibuf->rect_float ? (image ? (image->alpha_mode != IMA_ALPHA_STRAIGHT) : false) : + (image ? (image->alpha_mode == IMA_ALPHA_PREMUL) : true))); + return store_premultiplied; +} + /* -------------------------------------------------------------------- */ /** \name UDIM gpu texture * \{ */ @@ -198,8 +213,7 @@ static GPUTexture *gpu_texture_create_tile_array(Image *ima, ImBuf *main_ibuf) ImBuf *ibuf = BKE_image_acquire_ibuf(ima, &iuser, NULL); if (ibuf) { - const bool store_premultiplied = ibuf->rect_float ? (ima->alpha_mode != IMA_ALPHA_STRAIGHT) : - (ima->alpha_mode == IMA_ALPHA_PREMUL); + const bool store_premultiplied = BKE_image_has_gpu_texture_premultiplied_alpha(ima, ibuf); IMB_update_gpu_texture_sub(tex, ibuf, UNPACK2(tileoffset), @@ -330,9 +344,8 @@ static GPUTexture *image_get_gpu_texture(Image *ima, } else { const bool use_high_bitdepth = (ima->flag & IMA_HIGH_BITDEPTH); - const bool store_premultiplied = ibuf_intern->rect_float ? - (ima ? (ima->alpha_mode != IMA_ALPHA_STRAIGHT) : false) : - (ima ? (ima->alpha_mode == IMA_ALPHA_PREMUL) : true); + const bool store_premultiplied = BKE_image_has_gpu_texture_premultiplied_alpha(ima, + ibuf_intern); *tex = IMB_create_gpu_texture( ima->id.name + 2, ibuf_intern, use_high_bitdepth, store_premultiplied); @@ -642,6 +655,7 @@ static void gpu_texture_update_from_ibuf( int tex_stride = ibuf->x; int tex_offset = ibuf->channels * (y * ibuf->x + x); + const bool store_premultiplied = BKE_image_has_gpu_texture_premultiplied_alpha(ima, ibuf); if (rect_float == NULL) { /* Byte pixels. */ if (!IMB_colormanagement_space_is_data(ibuf->rect_colorspace)) { @@ -658,15 +672,12 @@ static void gpu_texture_update_from_ibuf( /* Convert to scene linear with sRGB compression, and premultiplied for * correct texture interpolation. */ - const bool store_premultiplied = (ima->alpha_mode == IMA_ALPHA_PREMUL); IMB_colormanagement_imbuf_to_byte_texture( rect, x, y, w, h, ibuf, compress_as_srgb, store_premultiplied); } } else { /* Float pixels. */ - const bool store_premultiplied = (ima->alpha_mode != IMA_ALPHA_STRAIGHT); - if (ibuf->channels != 4 || scaled || !store_premultiplied) { rect_float = (float *)MEM_mallocN(sizeof(float[4]) * w * h, __func__); if (rect_float == NULL) { diff --git a/source/blender/draw/engines/image/image_engine.c b/source/blender/draw/engines/image/image_engine.c index 2f380619c2c..3d767f911fa 100644 --- a/source/blender/draw/engines/image/image_engine.c +++ b/source/blender/draw/engines/image/image_engine.c @@ -138,7 +138,7 @@ static void image_cache_image(IMAGE_Data *vedata, Image *image, ImageUser *iuser far_near[0] = ((Camera *)scene->camera->data)->clip_end; } - const bool use_premul_alpha = image->alpha_mode == IMA_ALPHA_PREMUL; + const bool use_premul_alpha = BKE_image_has_gpu_texture_premultiplied_alpha(image, ibuf); const bool is_tiled_texture = tex_tile_data != NULL; const bool do_repeat = (!is_tiled_texture) && ((sima->flag & SI_DRAW_TILE) != 0); diff --git a/source/tools b/source/tools -Subproject 4b309364f65fee1ffafc5a4062125b8b728837a +Subproject ff9928bc44e80ec30c78369bf1518599254a003 |