@@ -908,6 +908,13 @@ getstate(Window w)
908
908
return result ;
909
909
}
910
910
911
+ static uint32_t prealpha (uint32_t p ) {
912
+ uint8_t a = p >> 24u ;
913
+ uint32_t rb = (a * (p & 0xFF00FFu )) >> 8u ;
914
+ uint32_t g = (a * (p & 0x00FF00u )) >> 8u ;
915
+ return (rb & 0xFF00FFu ) | (g & 0x00FF00u ) | ((~a ) << 24u );
916
+ }
917
+
911
918
XImage *
912
919
geticonprop (Window win )
913
920
{
@@ -945,7 +952,7 @@ geticonprop(Window win)
945
952
946
953
w = * (bstp - 2 ); h = * (bstp - 1 );
947
954
948
- int icw , ich ;
955
+ int icw , ich , icsz ;
949
956
if (w <= h ) {
950
957
ich = ICONSIZE ; icw = w * ICONSIZE / h ;
951
958
if (icw < 1 ) icw = 1 ;
@@ -954,29 +961,31 @@ geticonprop(Window win)
954
961
icw = ICONSIZE ; ich = h * ICONSIZE / w ;
955
962
if (ich < 1 ) ich = 1 ;
956
963
}
964
+ icsz = icw * ich ;
957
965
958
- unsigned char * icbuf = malloc ( icw * ich << 2 ); if (! icbuf ) { XFree ( p ); return NULL ; }
966
+ int i ;
959
967
#if ULONG_MAX > UINT32_MAX
960
- int i , sz = w * h ;
968
+ int sz = w * h ;
961
969
uint32_t * bstp32 = (uint32_t * )bstp ;
962
970
for (i = 0 ; i < sz ; ++ i ) bstp32 [i ] = bstp [i ];
963
971
#endif
964
- if (w == icw && h == ich ) memcpy (icbuf , bstp , icw * ich << 2 );
972
+ uint32_t * icbuf = malloc (icsz << 2 ); if (!icbuf ) { XFree (p ); return NULL ; }
973
+ if (w == icw && h == ich ) memcpy (icbuf , bstp , icsz << 2 );
965
974
else {
966
975
Imlib_Image origin = imlib_create_image_using_data (w , h , (DATA32 * )bstp );
967
- if (!origin ) { XFree (p ); return NULL ; }
976
+ if (!origin ) { XFree (p ); free ( icbuf ); return NULL ; }
968
977
imlib_context_set_image (origin );
969
978
imlib_image_set_has_alpha (1 );
970
979
Imlib_Image scaled = imlib_create_cropped_scaled_image (0 , 0 , w , h , icw , ich );
971
980
imlib_free_image_and_decache ();
972
- if (!scaled ) { XFree (p ); return NULL ; }
981
+ if (!scaled ) { XFree (p ); free ( icbuf ); return NULL ; }
973
982
imlib_context_set_image (scaled );
974
983
imlib_image_set_has_alpha (1 );
975
- memcpy (icbuf , imlib_image_get_data_for_reading_only (), icw * ich << 2 );
984
+ memcpy (icbuf , imlib_image_get_data_for_reading_only (), icsz << 2 );
976
985
imlib_free_image_and_decache ();
977
986
}
978
987
XFree (p );
979
-
988
+ for ( i = 0 ; i < icsz ; ++ i ) icbuf [ i ] = prealpha ( icbuf [ i ]);
980
989
return XCreateImage (dpy , DefaultVisual (dpy , screen ), DefaultDepth (dpy , screen ), ZPixmap , 0 , (char * )icbuf , icw , ich , 32 , 0 );
981
990
}
982
991
0 commit comments