77#else
88# include <unistd.h>
99#endif
10+ #include <math.h>
1011#include <stdlib.h>
1112#include <time.h>
1213
2021/* Begin filters function */
2122#define GET_PIXEL_FUNCTION (src )(src->trueColor?gdImageGetTrueColorPixel:gdImageGetPixel)
2223
24+ static int gdClampFloatToByte (float value )
25+ {
26+ if (!isfinite (value )) {
27+ return value > 0.0f ? 255 : 0 ;
28+ }
29+ if (value > 255.0f ) {
30+ return 255 ;
31+ }
32+ if (value < 0.0f ) {
33+ return 0 ;
34+ }
35+ return (int )value ;
36+ }
37+
2338#ifdef _WIN32
2439# define GD_SCATTER_SEED () (unsigned int)(time(0) * GetCurrentProcessId())
2540#else
@@ -417,6 +432,7 @@ int gdImageConvolution(gdImagePtr src, float filter[3][3], float filter_div, flo
417432
418433 for ( y = 0 ; y < src -> sy ; y ++ ) {
419434 for (x = 0 ; x < src -> sx ; x ++ ) {
435+ int new_ri , new_gi , new_bi ;
420436 new_r = new_g = new_b = 0 ;
421437 pxl = f (srcback , x , y );
422438 new_a = gdImageAlpha (srcback , pxl );
@@ -435,13 +451,13 @@ int gdImageConvolution(gdImagePtr src, float filter[3][3], float filter_div, flo
435451 new_g = (new_g /filter_div )+ offset ;
436452 new_b = (new_b /filter_div )+ offset ;
437453
438- new_r = ( new_r > 255.0f )? 255.0f : (( new_r < 0.0f )? 0.0f : new_r );
439- new_g = ( new_g > 255.0f )? 255.0f : (( new_g < 0.0f )? 0.0f : new_g );
440- new_b = ( new_b > 255.0f )? 255.0f : (( new_b < 0.0f )? 0.0f : new_b );
454+ new_ri = gdClampFloatToByte ( new_r );
455+ new_gi = gdClampFloatToByte ( new_g );
456+ new_bi = gdClampFloatToByte ( new_b );
441457
442- new_pxl = gdImageColorAllocateAlpha (src , ( int ) new_r , ( int ) new_g , ( int ) new_b , new_a );
458+ new_pxl = gdImageColorAllocateAlpha (src , new_ri , new_gi , new_bi , new_a );
443459 if (new_pxl == -1 ) {
444- new_pxl = gdImageColorClosestAlpha (src , ( int ) new_r , ( int ) new_g , ( int ) new_b , new_a );
460+ new_pxl = gdImageColorClosestAlpha (src , new_ri , new_gi , new_bi , new_a );
445461 }
446462 gdImageSetPixel (src , x , y , new_pxl );
447463 }
0 commit comments