Index: source/blender/blenkernel/intern/mask_rasterize.c =================================================================== --- source/blender/blenkernel/intern/mask_rasterize.c (revision 49270) +++ source/blender/blenkernel/intern/mask_rasterize.c (working copy) @@ -1272,6 +1272,8 @@ case MASK_BLEND_DIFFERENCE: value = fabsf(value - value_layer); break; + case MASK_BLEND_MERGE: + value += value_layer * (1.0f - value); default: /* same as add */ BLI_assert(0); value += value_layer; Index: source/blender/blenkernel/intern/mask.c =================================================================== --- source/blender/blenkernel/intern/mask.c (revision 49270) +++ source/blender/blenkernel/intern/mask.c (working copy) @@ -2613,6 +2613,16 @@ } break; } + case MASK_BLEND_MERGE: + { + if (alpha == 1.0f) { + merge_vn_vn(buffer, buffer_tmp, buffer_size); + } + else { + mmerge_vn_vn(buffer, buffer_tmp, alpha, buffer_size); + } + break; + } case MASK_BLEND_ADD: default: { Index: source/blender/makesdna/DNA_mask_types.h =================================================================== --- source/blender/makesdna/DNA_mask_types.h (revision 49270) +++ source/blender/makesdna/DNA_mask_types.h (working copy) @@ -173,7 +173,8 @@ MASK_BLEND_DARKEN = 3, MASK_BLEND_MUL = 4, MASK_BLEND_REPLACE = 5, - MASK_BLEND_DIFFERENCE = 6 + MASK_BLEND_DIFFERENCE = 6, + MASK_BLEND_MERGE = 7 }; /* masklay->blend_flag */ Index: source/blender/makesrna/intern/rna_mask.c =================================================================== --- source/blender/makesrna/intern/rna_mask.c (revision 49270) +++ source/blender/makesrna/intern/rna_mask.c (working copy) @@ -580,6 +580,7 @@ {MASK_BLEND_MUL, "MUL", 0, "Multiply", ""}, {MASK_BLEND_REPLACE, "REPLACE", 0, "Replace", ""}, {MASK_BLEND_DIFFERENCE, "DIFFERENCE", 0, "Difference", ""}, + {MASK_BLEND_MERGE, "MERGE", 0, "Merge", ""}, {0, NULL, 0, NULL, NULL} }; Index: source/blender/blenlib/BLI_math_vector.h =================================================================== --- source/blender/blenlib/BLI_math_vector.h (revision 49270) +++ source/blender/blenlib/BLI_math_vector.h (working copy) @@ -235,6 +235,8 @@ void add_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size); void madd_vn_vn(float *array_tar, const float *array_src, const float f, const int size); void madd_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const float f, const int size); +void merge_vn_vn(float *array_tar, const float *array_src, const int size); +void mmerge_vn_vn(float *array_tar, const float *array_src, const float f, const int size); void sub_vn_vn(float *array_tar, const float *array_src, const int size); void sub_vn_vnvn(float *array_tar, const float *array_src_a, const float *array_src_b, const int size); void msub_vn_vn(float *array_tar, const float *array_src, const float f, const int size); Index: source/blender/blenlib/intern/math_vector.c =================================================================== --- source/blender/blenlib/intern/math_vector.c (revision 49270) +++ source/blender/blenlib/intern/math_vector.c (working copy) @@ -584,6 +584,26 @@ } } +void merge_vn_vn(float *array_tar, const float *array_src, const int size) +{ + float *tar = array_tar + (size - 1); + const float *src = array_src + (size - 1); + int i = size; + while (i--) { + *(tar--) += *(src--) * (1.0f - *(tar--)); + } +} + +void mmerge_vn_vn(float *array_tar, const float *array_src, const float f, const int size) +{ + float *tar = array_tar + (size - 1); + const float *src = array_src + (size - 1); + int i = size; + while (i--) { + *(tar--) += *(src--) * (1.0f - *(tar--)) * f; + } +} + void sub_vn_vn(float *array_tar, const float *array_src, const int size) { float *tar = array_tar + (size - 1);