@@ -185,7 +185,7 @@ encode_bc2_block(Imaging im, ImagingCodecState state, UINT8 *dst) {
185185}
186186
187187static void
188- encode_bc3_alpha (Imaging im , ImagingCodecState state , UINT8 * dst ) {
188+ encode_bc3_alpha (Imaging im , ImagingCodecState state , UINT8 * dst , int o ) {
189189 int i , j ;
190190 UINT8 alpha_min = 0 , alpha_max = 0 ;
191191 UINT8 block [16 ], current_alpha ;
@@ -202,7 +202,7 @@ encode_bc3_alpha(Imaging im, ImagingCodecState state, UINT8 *dst) {
202202 continue ;
203203 }
204204
205- current_alpha = (UINT8 )im -> image [y ][x + 3 ];
205+ current_alpha = (UINT8 )im -> image [y ][x + o ];
206206 block [i + j * 4 ] = current_alpha ;
207207
208208 if (first || current_alpha < alpha_min ) {
@@ -226,12 +226,13 @@ encode_bc3_alpha(Imaging im, ImagingCodecState state, UINT8 *dst) {
226226 if (!current_alpha ) {
227227 l |= 6 << (j * 3 );
228228 continue ;
229- } else if (current_alpha == 255 || denom == 0 ) {
229+ } else if (current_alpha == 255 ) {
230230 l |= 7 << (j * 3 );
231231 continue ;
232232 }
233233
234- float distance = abs (current_alpha - alpha_min ) / denom * 10 ;
234+ float distance =
235+ denom == 0 ? 0 : abs (current_alpha - alpha_min ) / denom * 10 ;
235236 if (distance < 3 ) {
236237 l |= 2 << (j * 3 ); // 4/5 * alpha_min + 1/5 * alpha_max
237238 } else if (distance < 5 ) {
@@ -257,21 +258,28 @@ ImagingBcnEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
257258 UINT8 * dst = buf ;
258259
259260 for (;;) {
260- if (n == 2 || n == 3 ) {
261- if (has_alpha_channel ) {
262- if (n == 2 ) {
263- encode_bc2_block (im , state , dst );
261+ if (n == 5 ) {
262+ encode_bc3_alpha (im , state , dst , 0 );
263+ dst += 8 ;
264+
265+ encode_bc3_alpha (im , state , dst , 1 );
266+ } else {
267+ if (n == 2 || n == 3 ) {
268+ if (has_alpha_channel ) {
269+ if (n == 2 ) {
270+ encode_bc2_block (im , state , dst );
271+ } else {
272+ encode_bc3_alpha (im , state , dst , 3 );
273+ }
274+ dst += 8 ;
264275 } else {
265- encode_bc3_alpha (im , state , dst );
266- }
267- dst += 8 ;
268- } else {
269- for (int i = 0 ; i < 8 ; i ++ ) {
270- * dst ++ = 0xff ;
276+ for (int i = 0 ; i < 8 ; i ++ ) {
277+ * dst ++ = 0xff ;
278+ }
271279 }
272280 }
281+ encode_bc1_color (im , state , dst , n == 1 && has_alpha_channel );
273282 }
274- encode_bc1_color (im , state , dst , n == 1 && has_alpha_channel );
275283 dst += 8 ;
276284
277285 state -> x += im -> pixelsize * 4 ;
0 commit comments