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:
-rw-r--r--source/blender/blenlib/BLI_math_color.h2
-rw-r--r--source/blender/blenlib/intern/math_color_inline.c28
-rw-r--r--source/blender/imbuf/intern/scaling.c51
3 files changed, 41 insertions, 40 deletions
diff --git a/source/blender/blenlib/BLI_math_color.h b/source/blender/blenlib/BLI_math_color.h
index 1af6985deaa..3831ec3cbb4 100644
--- a/source/blender/blenlib/BLI_math_color.h
+++ b/source/blender/blenlib/BLI_math_color.h
@@ -106,8 +106,6 @@ MINLINE void premul_to_straight_v4(float straight[4], const float premul[4]);
MINLINE void straight_to_premul_v4(float straight[4], const float premul[4]);
MINLINE void straight_uchar_to_premul_float(float result[4], const unsigned char color[4]);
MINLINE void premul_float_to_straight_uchar(unsigned char *result, const float color[4]);
-MINLINE void straight_uchar_to_premul_int(int result[4], const unsigned char color[4]);
-MINLINE void premul_int_to_straight_uchar(unsigned char *result, const int color[4]);
/************************** Other *************************/
diff --git a/source/blender/blenlib/intern/math_color_inline.c b/source/blender/blenlib/intern/math_color_inline.c
index f8bb6b81a1d..b8eeca50db6 100644
--- a/source/blender/blenlib/intern/math_color_inline.c
+++ b/source/blender/blenlib/intern/math_color_inline.c
@@ -326,32 +326,4 @@ MINLINE void premul_float_to_straight_uchar(unsigned char *result, const float c
}
}
-MINLINE void straight_uchar_to_premul_int(int result[4], const unsigned char color[4])
-{
- int alpha = color[3];
-
- result[0] = (color[0] * alpha) / 255;
- result[1] = (color[1] * alpha) / 255;
- result[2] = (color[2] * alpha) / 255;
- result[3] = alpha;
-}
-
-MINLINE void premul_int_to_straight_uchar(unsigned char *result, const int color[4])
-{
- if (color[3] == 0 || color[3] == 255) {
- result[0] = color[0];
- result[1] = color[1];
- result[2] = color[2];
- result[3] = color[3];
- }
- else {
- int alpha = color[3];
-
- result[0] = color[0] * 255 / alpha;
- result[0] = color[1] * 255 / alpha;
- result[0] = color[2] * 255 / alpha;
- result[3] = alpha;
- }
-}
-
#endif /* __MATH_COLOR_INLINE_C__ */
diff --git a/source/blender/imbuf/intern/scaling.c b/source/blender/imbuf/intern/scaling.c
index 8d3cd648fc1..1050d3f8715 100644
--- a/source/blender/imbuf/intern/scaling.c
+++ b/source/blender/imbuf/intern/scaling.c
@@ -292,6 +292,37 @@ struct ImBuf *IMB_double_y(struct ImBuf *ibuf1)
return (ibuf2);
}
+/* pretty much specific functions which converts uchar <-> ushort but assumes
+ * ushort range of 255*255 which is more convenient here
+ */
+MINLINE void straight_uchar_to_premul_ushort(unsigned short result[4], const unsigned char color[4])
+{
+ unsigned short alpha = color[3];
+
+ result[0] = color[0] * alpha;
+ result[1] = color[1] * alpha;
+ result[2] = color[2] * alpha;
+ result[3] = alpha * 255;
+}
+
+MINLINE void premul_ushort_to_straight_uchar(unsigned char *result, const unsigned short color[4])
+{
+ if (color[3] <= 255) {
+ result[0] = color[0] / 255;
+ result[1] = color[1] / 255;
+ result[2] = color[2] / 255;
+ result[3] = color[3] / 255;
+ }
+ else {
+ unsigned short alpha = color[3] / 255;
+
+ result[0] = color[0] / alpha;
+ result[1] = color[1] / alpha;
+ result[2] = color[2] / alpha;
+ result[3] = alpha;
+ }
+}
+
/* result in ibuf2, scaling should be done correctly */
void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1)
{
@@ -311,19 +342,19 @@ void imb_onehalf_no_alloc(struct ImBuf *ibuf2, struct ImBuf *ibuf1)
for (y = ibuf2->y; y > 0; y--) {
cp2 = cp1 + (ibuf1->x << 2);
for (x = ibuf2->x; x > 0; x--) {
- int p1i[8], p2i[8], desti[4];
+ unsigned short p1i[8], p2i[8], desti[4];
- straight_uchar_to_premul_int(p1i, cp1);
- straight_uchar_to_premul_int(p2i, cp2);
- straight_uchar_to_premul_int(p1i + 4, cp1 + 4);
- straight_uchar_to_premul_int(p2i + 4, cp2 + 4);
+ straight_uchar_to_premul_ushort(p1i, cp1);
+ straight_uchar_to_premul_ushort(p2i, cp2);
+ straight_uchar_to_premul_ushort(p1i + 4, cp1 + 4);
+ straight_uchar_to_premul_ushort(p2i + 4, cp2 + 4);
- desti[0] = (p1i[0] + p2i[0] + p1i[4] + p2i[4]) >> 2;
- desti[1] = (p1i[1] + p2i[1] + p1i[5] + p2i[5]) >> 2;
- desti[2] = (p1i[2] + p2i[2] + p1i[6] + p2i[6]) >> 2;
- desti[3] = (p1i[3] + p2i[3] + p1i[7] + p2i[7]) >> 2;
+ desti[0] = ((unsigned int) p1i[0] + p2i[0] + p1i[4] + p2i[4]) >> 2;
+ desti[1] = ((unsigned int) p1i[1] + p2i[1] + p1i[5] + p2i[5]) >> 2;
+ desti[2] = ((unsigned int) p1i[2] + p2i[2] + p1i[6] + p2i[6]) >> 2;
+ desti[3] = ((unsigned int) p1i[3] + p2i[3] + p1i[7] + p2i[7]) >> 2;
- premul_int_to_straight_uchar(dest, desti);
+ premul_ushort_to_straight_uchar(dest, desti);
cp1 += 8;
cp2 += 8;