Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenlib/intern/math_color_blend_inline.c
| Show First 20 Lines • Show All 308 Lines • ▼ Show 20 Lines | |||||
| MINLINE void blend_color_dodge_byte(uchar dst[4], const uchar src1[4], const uchar src2[4]) | MINLINE void blend_color_dodge_byte(uchar dst[4], const uchar src1[4], const uchar src2[4]) | ||||
| { | { | ||||
| const int fac = src2[3]; | const int fac = src2[3]; | ||||
| if (fac != 0) { | if (fac != 0) { | ||||
| const int mfac = 255 - fac; | const int mfac = 255 - fac; | ||||
| int i = 3; | int i = 3; | ||||
| while (i--) { | while (i--) { | ||||
| const int temp = (src2[i] == 255) ? 255 : min_ii((src1[i] * 255) / (255 - src2[i]), 255); | dst[i] = (256 * src1[i]) / ((255 - src2[i] * (fac / 255)) + 1); | ||||
| dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255); | dst[i] = max_ii(dst[i], 255); | ||||
| /*const int temp = (src2[i] == 255) ? 255 : min_ii((src1[i] * 255) / (255 - src2[i]), 255); | |||||
| dst[i] = (uchar)((temp * fac + src1[i] * mfac) / 255);*/ | |||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| /* no op */ | /* no op */ | ||||
| copy_v4_v4_uchar(dst, src1); | copy_v4_v4_uchar(dst, src1); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 301 Lines • ▼ Show 20 Lines | else { | ||||
| copy_v4_v4(dst, src1); | copy_v4_v4(dst, src1); | ||||
| } | } | ||||
| } | } | ||||
| MINLINE void blend_color_add_float(float dst[4], const float src1[4], const float src2[4]) | MINLINE void blend_color_add_float(float dst[4], const float src1[4], const float src2[4]) | ||||
| { | { | ||||
| if (src2[3] != 0.0f) { | if (src2[3] != 0.0f) { | ||||
| /* unpremul > add > premul, simplified */ | /* unpremul > add > premul, simplified */ | ||||
| dst[0] = src1[0] + src2[0] * src1[3]; | dst[0] = src1[0] + src2[0] * src1[3] * src2[3]; | ||||
| dst[1] = src1[1] + src2[1] * src1[3]; | dst[1] = src1[1] + src2[1] * src1[3] * src2[3]; | ||||
| dst[2] = src1[2] + src2[2] * src1[3]; | dst[2] = src1[2] + src2[2] * src1[3] * src2[3]; | ||||
| dst[3] = src1[3]; | dst[3] = src1[3]; | ||||
| } | } | ||||
| else { | else { | ||||
| /* no op */ | /* no op */ | ||||
| copy_v4_v4(dst, src1); | copy_v4_v4(dst, src1); | ||||
| } | } | ||||
| } | } | ||||
| MINLINE void blend_color_sub_float(float dst[4], const float src1[4], const float src2[4]) | MINLINE void blend_color_sub_float(float dst[4], const float src1[4], const float src2[4]) | ||||
| { | { | ||||
| if (src2[3] != 0.0f) { | if (src2[3] != 0.0f) { | ||||
| /* unpremul > subtract > premul, simplified */ | /* unpremul > subtract > premul, simplified */ | ||||
| dst[0] = max_ff(src1[0] - src2[0] * src1[3], 0.0f); | dst[0] = max_ff(src1[0] - src2[0] * src1[3] * src2[3], 0.0f); | ||||
| dst[1] = max_ff(src1[1] - src2[1] * src1[3], 0.0f); | dst[1] = max_ff(src1[1] - src2[1] * src1[3] * src2[3], 0.0f); | ||||
| dst[2] = max_ff(src1[2] - src2[2] * src1[3], 0.0f); | dst[2] = max_ff(src1[2] - src2[2] * src1[3] * src2[3], 0.0f); | ||||
| dst[3] = src1[3]; | dst[3] = src1[3]; | ||||
| } | } | ||||
| else { | else { | ||||
| /* no op */ | /* no op */ | ||||
| copy_v4_v4(dst, src1); | copy_v4_v4(dst, src1); | ||||
| } | } | ||||
| } | } | ||||
| MINLINE void blend_color_mul_float(float dst[4], const float src1[4], const float src2[4]) | MINLINE void blend_color_mul_float(float dst[4], const float src1[4], const float src2[4]) | ||||
| { | { | ||||
| if (src2[3] != 0.0f) { | if (src2[3] != 0.0f) { | ||||
| /* unpremul > multiply > premul, simplified */ | /* unpremul > multiply > premul, simplified */ | ||||
| const float t = src2[3]; | const float t = src2[3]; | ||||
| const float mt = 1.0f - t; | const float mt = 1.0f - t; | ||||
| dst[0] = mt * src1[0] + src1[0] * src2[0] * src1[3]; | dst[0] = mt * src1[0] + src1[0] * src2[0] * src1[3] * src2[3]; | ||||
| dst[1] = mt * src1[1] + src1[1] * src2[1] * src1[3]; | dst[1] = mt * src1[1] + src1[1] * src2[1] * src1[3] * src2[3]; | ||||
| dst[2] = mt * src1[2] + src1[2] * src2[2] * src1[3]; | dst[2] = mt * src1[2] + src1[2] * src2[2] * src1[3] * src2[3]; | ||||
| dst[3] = src1[3]; | dst[3] = src1[3]; | ||||
| } | } | ||||
| else { | else { | ||||
| /* no op */ | /* no op */ | ||||
| copy_v4_v4(dst, src1); | copy_v4_v4(dst, src1); | ||||
| } | } | ||||
| } | } | ||||
| MINLINE void blend_color_lighten_float(float dst[4], const float src1[4], const float src2[4]) | MINLINE void blend_color_lighten_float(float dst[4], const float src1[4], const float src2[4]) | ||||
| { | { | ||||
| if (src2[3] != 0.0f) { | if (src2[3] != 0.0f) { | ||||
| /* remap src2 to have same alpha as src1 premultiplied, take maximum of | /* Remap src2 to have same alpha as if it was already blended with src1, take maximum of | ||||
| * src1 and src2, then blend it with src1 */ | * src1 and src2. */ | ||||
| const float t = src2[3]; | |||||
| const float mt = 1.0f - t; | const float map_alpha = src1[3] * src2[3]; | ||||
| const float map_alpha = src1[3] / src2[3]; | |||||
| dst[0] = mt * src1[0] + t * max_ff(src1[0], src2[0] * map_alpha); | dst[0] = max_ff(src1[0] * src1[3], src2[0] * map_alpha); | ||||
| dst[1] = mt * src1[1] + t * max_ff(src1[1], src2[1] * map_alpha); | dst[1] = max_ff(src1[1] * src1[3], src2[1] * map_alpha); | ||||
| dst[2] = mt * src1[2] + t * max_ff(src1[2], src2[2] * map_alpha); | dst[2] = max_ff(src1[2] * src1[3], src2[2] * map_alpha); | ||||
| dst[3] = src1[3]; | dst[3] = src1[3]; | ||||
| } | } | ||||
| else { | else { | ||||
| /* no op */ | /* no op */ | ||||
| copy_v4_v4(dst, src1); | copy_v4_v4(dst, src1); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 155 Lines • ▼ Show 20 Lines | |||||
| MINLINE void blend_color_dodge_float(float dst[4], const float src1[4], const float src2[4]) | MINLINE void blend_color_dodge_float(float dst[4], const float src1[4], const float src2[4]) | ||||
| { | { | ||||
| const float fac = src2[3]; | const float fac = src2[3]; | ||||
| if (fac != 0.0f) { | if (fac != 0.0f) { | ||||
| const float mfac = 1.0f - fac; | const float mfac = 1.0f - fac; | ||||
| int i = 3; | int i = 3; | ||||
| while (i--) { | while (i--) { | ||||
| const float temp = (src2[i] >= 1.0f) ? 1.0f : min_ff(src1[i] / (1.0f - src2[i]), 1.0f); | dst[i] = src1[i] / (1 - (src2[i] * fac)); | ||||
| dst[i] = (temp * fac + src1[i] * mfac); | |||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| /* no op */ | /* no op */ | ||||
| copy_v4_v4(dst, src1); | copy_v4_v4(dst, src1); | ||||
| } | } | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 282 Lines • Show Last 20 Lines | |||||