7
7
* - max_alpha defaults to 65535 for RGB16/GREY16
8
8
* 24/11/17 lovell
9
9
* - match normalised alpha to output type
10
+ * 27/2/21 jjonesrs
11
+ * - revise range clipping and 1/x, again
10
12
*/
11
13
12
14
/*
@@ -70,26 +72,20 @@ typedef VipsConversionClass VipsUnpremultiplyClass;
70
72
71
73
G_DEFINE_TYPE ( VipsUnpremultiply , vips_unpremultiply , VIPS_TYPE_CONVERSION );
72
74
73
- /* Unpremultiply an N-band image.
75
+ /* Unpremultiply an N-band image. Don't use clip_alpha to calculate factor: we
76
+ * want over and undershoots on alpha and RGB to cancel.
74
77
*/
75
78
#define UNPRE_MANY ( IN , OUT ) { \
76
79
IN * restrict p = (IN *) in; \
77
80
OUT * restrict q = (OUT *) out; \
78
81
\
79
82
for( x = 0; x < width; x++ ) { \
80
83
IN alpha = p[alpha_band]; \
84
+ OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
81
85
\
82
- if( alpha != 0 ) { \
83
- OUT factor = max_alpha / alpha; \
84
- \
85
- for( i = 0; i < alpha_band; i++ ) \
86
- q[i] = factor * p[i]; \
87
- q[alpha_band] = alpha; \
88
- } \
89
- else \
90
- for( i = 0; i < alpha_band + 1; i++ ) \
91
- q[i] = 0; \
92
- \
86
+ for( i = 0; i < alpha_band; i++ ) \
87
+ q[i] = factor * p[i]; \
88
+ q[alpha_band] = VIPS_CLIP( 0, alpha, max_alpha ); \
93
89
for( i = alpha_band + 1; i < bands; i++ ) \
94
90
q[i] = p[i]; \
95
91
\
@@ -106,21 +102,12 @@ G_DEFINE_TYPE( VipsUnpremultiply, vips_unpremultiply, VIPS_TYPE_CONVERSION );
106
102
\
107
103
for( x = 0; x < width; x++ ) { \
108
104
IN alpha = p[3]; \
105
+ OUT factor = alpha == 0 ? 0 : max_alpha / alpha; \
109
106
\
110
- if( alpha != 0 ) { \
111
- OUT factor = max_alpha / alpha; \
112
- \
113
- q[0] = factor * p[0]; \
114
- q[1] = factor * p[1]; \
115
- q[2] = factor * p[2]; \
116
- q[3] = alpha; \
117
- } \
118
- else { \
119
- q[0] = 0; \
120
- q[1] = 0; \
121
- q[2] = 0; \
122
- q[3] = 0; \
123
- } \
107
+ q[0] = factor * p[0]; \
108
+ q[1] = factor * p[1]; \
109
+ q[2] = factor * p[2]; \
110
+ q[3] = VIPS_CLIP( 0, alpha, max_alpha ); \
124
111
\
125
112
p += 4; \
126
113
q += 4; \
0 commit comments