21
21
22
22
typedef unsigned char u8 ;
23
23
24
- #ifdef WORDS_BIGENDIAN
25
- #define CA 0
26
- #define CR 1
27
- #define CG 2
28
- #define CB 3
29
- #else
30
- #define CB 0
31
- #define CG 1
32
- #define CR 2
33
- #define CA 3
34
- #endif
35
-
36
24
static void
37
- argb2rgba (u8 * buf , Py_ssize_t len )
25
+ argb2rgba (PY_UINT32_T * buf , Py_ssize_t len )
38
26
{
39
27
Py_ssize_t cur ;
40
28
41
- for (cur = 0 ; cur < len ; cur += 4 ) {
42
- u8 a = buf [cur + CA ];
43
- u8 r = buf [cur + CR ];
44
- u8 g = buf [cur + CG ];
45
- u8 b = buf [cur + CB ];
46
- if (a != 0 && a != 255 ) {
47
- r = r * 255 / a ;
48
- g = g * 255 / a ;
49
- b = b * 255 / a ;
29
+ for (cur = 0 ; cur < len ; cur ++ ) {
30
+ PY_UINT32_T val = buf [cur ];
31
+ u8 a = val >> 24 ;
32
+ switch (a ) {
33
+ case 0 :
34
+ break ;
35
+ case 255 :
36
+ val = (val << 8 ) | a ;
37
+ #ifndef WORDS_BIGENDIAN
38
+ // compiler should optimize this to bswap
39
+ val = (((val & 0x000000ff ) << 24 ) |
40
+ ((val & 0x0000ff00 ) << 8 ) |
41
+ ((val & 0x00ff0000 ) >> 8 ) |
42
+ ((val & 0xff000000 ) >> 24 ));
43
+ #endif
44
+ buf [cur ] = val ;
45
+ break ;
46
+ default :
47
+ ; // label cannot point to a variable declaration
48
+ u8 r = 255 * ((val >> 16 ) & 0xff ) / a ;
49
+ u8 g = 255 * ((val >> 8 ) & 0xff ) / a ;
50
+ u8 b = 255 * ((val >> 0 ) & 0xff ) / a ;
51
+ #ifdef WORDS_BIGENDIAN
52
+ val = r << 24 | g << 16 | b << 8 | a ;
53
+ #else
54
+ val = a << 24 | b << 16 | g << 8 | r ;
55
+ #endif
56
+ buf [cur ] = val ;
57
+ break ;
50
58
}
51
- buf [cur + 0 ] = r ;
52
- buf [cur + 1 ] = g ;
53
- buf [cur + 2 ] = b ;
54
- buf [cur + 3 ] = a ;
55
59
}
56
60
}
57
61
@@ -76,9 +80,13 @@ _convert_argb2rgba(PyObject *self, PyObject *args)
76
80
PyErr_SetString (PyExc_ValueError , "Argument has invalid size" );
77
81
goto DONE ;
78
82
}
83
+ if (view .itemsize != 4 ) {
84
+ PyErr_SetString (PyExc_ValueError , "Argument has invalid item size" );
85
+ goto DONE ;
86
+ }
79
87
80
88
Py_BEGIN_ALLOW_THREADS
81
- argb2rgba (view .buf , view .len );
89
+ argb2rgba (view .buf , view .len / 4 );
82
90
Py_END_ALLOW_THREADS
83
91
84
92
Py_INCREF (Py_None );
0 commit comments