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
path: root/source
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2013-01-05 00:34:06 +0400
committerSergey Sharybin <sergey.vfx@gmail.com>2013-01-05 00:34:06 +0400
commit52a81c8364c1da5d7607b6964d5e64d1cd00703a (patch)
tree4456291c2cf4d6766fd898a67d527ce2dda03e82 /source
parent0e676bf50bd961c86b48af2c0baf10136cdb60a9 (diff)
There was a typo in previous commit
Additional changes: - Made mipmapping operate with unsigned short instead of char which allowed to eliminate extra division by 255, so prevision should be a bit better now. - Actually, this is not real unsigned short range, but it's a range of 255*255 which is more convenient for mipmapping, so made conversion functions private for scaling.c Not sure it worth making this functions operate in 65535 range, for now current behavior seems to be just fine.
Diffstat (limited to 'source')
-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;