Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
m---------release/datafiles/locale0
m---------release/scripts/addons0
m---------release/scripts/addons_contrib0
-rw-r--r--source/blender/blenkernel/BKE_image.h2
-rw-r--r--source/blender/blenkernel/intern/image_gpu.c27
-rw-r--r--source/blender/draw/engines/image/image_engine.c2
m---------source/tools0
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