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:
authorBrecht Van Lommel <brechtvanlommel@pandora.be>2013-04-25 18:16:22 +0400
committerBrecht Van Lommel <brechtvanlommel@pandora.be>2013-04-25 18:16:22 +0400
commitc2d5c72245cfebb612ccb11c60777262c9c5994a (patch)
treeb5636494f274c84d9e47d61c32866f222a34c455 /source/blender/imbuf/intern/rectop.c
parent631f2b94efe9d438a6a8027279d9e665f31653b6 (diff)
Fix part of #34640: colors darkening when using the vertex paint blur tool.
The problem was that vertex colors only have 8 bits of precision, and integer division always rounds down, so after some color blending iterations everything gets darker. Instead use integer division that behaves like round() instead of floor() for blending operations.
Diffstat (limited to 'source/blender/imbuf/intern/rectop.c')
-rw-r--r--source/blender/imbuf/intern/rectop.c33
1 files changed, 17 insertions, 16 deletions
diff --git a/source/blender/imbuf/intern/rectop.c b/source/blender/imbuf/intern/rectop.c
index 79bf9eba1cc..d9375e3919b 100644
--- a/source/blender/imbuf/intern/rectop.c
+++ b/source/blender/imbuf/intern/rectop.c
@@ -34,6 +34,7 @@
#include <stdlib.h>
#include "BLI_utildefines.h"
+#include "BLI_math_base.h"
#include "BLI_math_color.h"
#include "BLI_math_vector.h"
@@ -54,20 +55,20 @@ static void blend_color_mix(char cp[3], const char cp1[3], const char cp2[3], co
* errors that can turn colors black fast after repeated blending */
const int mfac = 255 - fac;
- cp[0] = (mfac * cp1[0] + fac * cp2[0]) / 255;
- cp[1] = (mfac * cp1[1] + fac * cp2[1]) / 255;
- cp[2] = (mfac * cp1[2] + fac * cp2[2]) / 255;
+ cp[0] = divide_round_i((mfac * cp1[0] + fac * cp2[0]), 255);
+ cp[1] = divide_round_i((mfac * cp1[1] + fac * cp2[1]), 255);
+ cp[2] = divide_round_i((mfac * cp1[2] + fac * cp2[2]), 255);
}
static void blend_color_add(char cp[3], const char cp1[3], const char cp2[3], const int fac)
{
int temp;
- temp = cp1[0] + ((fac * cp2[0]) / 255);
+ temp = cp1[0] + divide_round_i(fac * cp2[0], 255);
if (temp > 254) cp[0] = 255; else cp[0] = temp;
- temp = cp1[1] + ((fac * cp2[1]) / 255);
+ temp = cp1[1] + divide_round_i(fac * cp2[1] , 255);
if (temp > 254) cp[1] = 255; else cp[1] = temp;
- temp = cp1[2] + ((fac * cp2[2]) / 255);
+ temp = cp1[2] + divide_round_i(fac * cp2[2] , 255);
if (temp > 254) cp[2] = 255; else cp[2] = temp;
}
@@ -75,11 +76,11 @@ static void blend_color_sub(char cp[3], const char cp1[3], const char cp2[3], co
{
int temp;
- temp = cp1[0] - ((fac * cp2[0]) / 255);
+ temp = cp1[0] - divide_round_i(fac * cp2[0], 255);
if (temp < 0) cp[0] = 0; else cp[0] = temp;
- temp = cp1[1] - ((fac * cp2[1]) / 255);
+ temp = cp1[1] - divide_round_i(fac * cp2[1], 255);
if (temp < 0) cp[1] = 0; else cp[1] = temp;
- temp = cp1[2] - ((fac * cp2[2]) / 255);
+ temp = cp1[2] - divide_round_i(fac * cp2[2], 255);
if (temp < 0) cp[2] = 0; else cp[2] = temp;
}
@@ -88,9 +89,9 @@ static void blend_color_mul(char cp[3], const char cp1[3], const char cp2[3], co
int mfac = 255 - fac;
/* first mul, then blend the fac */
- cp[0] = (mfac * cp1[0] + fac * ((cp1[0] * cp2[0]) / 255)) / 255;
- cp[1] = (mfac * cp1[1] + fac * ((cp1[1] * cp2[1]) / 255)) / 255;
- cp[2] = (mfac * cp1[2] + fac * ((cp1[2] * cp2[2]) / 255)) / 255;
+ cp[0] = divide_round_i((mfac * cp1[0] * 255) + (fac * cp1[0] * cp2[0]), 255*255);
+ cp[1] = divide_round_i((mfac * cp1[1] * 255) + (fac * cp1[1] * cp2[1]), 255*255);
+ cp[2] = divide_round_i((mfac * cp1[2] * 255) + (fac * cp1[2] * cp2[2]), 255*255);
}
static void blend_color_lighten(char cp[3], const char cp1[3], const char cp2[3], const int fac)
@@ -123,7 +124,7 @@ static void blend_color_darken(char cp[3], const char cp1[3], const char cp2[3],
static void blend_color_erase_alpha(char cp[4], const char cp1[4], const char cp2[4], const int fac)
{
- int temp = (cp1[3] - fac * cp2[3] / 255);
+ int temp = divide_round_i(cp1[3] - fac * cp2[3], 255);
cp[0] = cp1[0];
cp[1] = cp1[1];
@@ -133,7 +134,7 @@ static void blend_color_erase_alpha(char cp[4], const char cp1[4], const char cp
static void blend_color_add_alpha(char cp[4], const char cp1[4], const char cp2[4], const int fac)
{
- int temp = (cp1[3] + fac * cp2[3] / 255);
+ int temp = divide_round_i(cp1[3] + fac * cp2[3], 255);
cp[0] = cp1[0];
cp[1] = cp1[1];
@@ -175,11 +176,11 @@ unsigned int IMB_blend_color(unsigned int src1, unsigned int src2, int fac, IMB_
}
if (mode == IMB_BLEND_ERASE_ALPHA) {
- temp = (cp1[3] - fac * cp2[3] / 255);
+ temp = divide_round_i(cp1[3] - fac * cp2[3], 255);
cp[3] = (temp < 0) ? 0 : temp;
}
else { /* this does ADD_ALPHA also */
- temp = (cp1[3] + fac * cp2[3] / 255);
+ temp = divide_round_i(cp1[3] + fac * cp2[3], 255);
cp[3] = (temp > 255) ? 255 : temp;
}