Fix paint float color blending bugs with alpha 1.0 and vivid light.

For some blend modes there would be no effect with factor 1.0, even if factor
0.999 would give a very different image. Now the result should have no
discontinuity.

Differential Revision: https://developer.blender.org/D2925
This commit is contained in:
Brecht Van Lommel 2017-11-29 02:13:37 +01:00
parent 5b5939c6e6
commit 4f7280da40
1 changed files with 20 additions and 20 deletions

View File

@ -439,10 +439,10 @@ MINLINE void blend_color_vividlight_byte(unsigned char dst[4], unsigned const ch
int temp;
if (src2[i] == 255) {
temp = 255;
temp = (src1[i] == 0) ? 127 : 255;
}
else if (src2[i] == 0) {
temp = 0;
temp = (src1[i] == 255) ? 127 : 0;
}
else if (src2[i] > 127) {
temp = min_ii(((src1[i]) * 255) / (2 * (255 - src2[i])), 255);
@ -784,7 +784,7 @@ MINLINE void blend_color_add_alpha_float(float dst[4], const float src1[4], cons
MINLINE void blend_color_overlay_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -810,7 +810,7 @@ MINLINE void blend_color_overlay_float(float dst[4], const float src1[4], const
MINLINE void blend_color_hardlight_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -835,7 +835,7 @@ MINLINE void blend_color_hardlight_float(float dst[4], const float src1[4], cons
MINLINE void blend_color_burn_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -853,7 +853,7 @@ MINLINE void blend_color_burn_float(float dst[4], const float src1[4], const flo
MINLINE void blend_color_linearburn_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -872,7 +872,7 @@ MINLINE void blend_color_linearburn_float(float dst[4], const float src1[4], con
MINLINE void blend_color_dodge_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -890,7 +890,7 @@ MINLINE void blend_color_dodge_float(float dst[4], const float src1[4], const fl
MINLINE void blend_color_screen_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -908,7 +908,7 @@ MINLINE void blend_color_screen_float(float dst[4], const float src1[4], const f
MINLINE void blend_color_softlight_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -933,7 +933,7 @@ MINLINE void blend_color_softlight_float(float dst[4], const float src1[4], cons
MINLINE void blend_color_pinlight_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -959,7 +959,7 @@ MINLINE void blend_color_pinlight_float(float dst[4], const float src1[4], const
MINLINE void blend_color_linearlight_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -985,7 +985,7 @@ MINLINE void blend_color_linearlight_float(float dst[4], const float src1[4], co
MINLINE void blend_color_vividlight_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -993,10 +993,10 @@ MINLINE void blend_color_vividlight_float(float dst[4], const float src1[4], con
float temp;
if (src2[i] == 1.0f) {
temp = 1.0f;
temp = (src1[i] == 0.0f) ? 0.5f : 1.0f;
}
else if (src2[i] == 0.0f) {
temp = 0.0f;
temp = (src1[i] == 1.0f) ? 0.5f : 0.0f;
}
else if (src2[i] > 0.5f) {
temp = min_ff(((src1[i]) * 1.0f) / (2.0f * (1.0f - src2[i])), 1.0f);
@ -1016,7 +1016,7 @@ MINLINE void blend_color_vividlight_float(float dst[4], const float src1[4], con
MINLINE void blend_color_difference_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -1034,7 +1034,7 @@ MINLINE void blend_color_difference_float(float dst[4], const float src1[4], con
MINLINE void blend_color_exclusion_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
int i = 3;
@ -1053,7 +1053,7 @@ MINLINE void blend_color_exclusion_float(float dst[4], const float src1[4], cons
MINLINE void blend_color_color_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
float h1, s1, v1;
float h2, s2, v2;
@ -1081,7 +1081,7 @@ MINLINE void blend_color_color_float(float dst[4], const float src1[4], const fl
MINLINE void blend_color_hue_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
float h1, s1, v1;
float h2, s2, v2;
@ -1107,7 +1107,7 @@ MINLINE void blend_color_hue_float(float dst[4], const float src1[4], const floa
MINLINE void blend_color_saturation_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
float h1, s1, v1;
float h2, s2, v2;
@ -1134,7 +1134,7 @@ MINLINE void blend_color_saturation_float(float dst[4], const float src1[4], con
MINLINE void blend_color_luminosity_float(float dst[4], const float src1[4], const float src2[4])
{
const float fac = src2[3];
if (fac != 0.0f && fac < 1.0f) {
if (fac != 0.0f) {
const float mfac = 1.0f - fac;
float h1, s1, v1;
float h2, s2, v2;