@@ -45,6 +45,8 @@ extern "C" {
4545#define MagickPHI 1.61803398874989484820458683436563811772030917980576
4646#define MagickPI2 1.57079632679489661923132169163975144209858469968755
4747#define MagickPI 3.14159265358979323846264338327950288419716939937510
48+ #define MAGICK_PTRDIFF_MAX (PTRDIFF_MAX)
49+ #define MAGICK_PTRDIFF_MIN (-PTRDIFF_MAX-1)
4850#define MagickSQ1_2 0.70710678118654752440084436210484903928483593768847
4951#define MagickSQ2 1.41421356237309504880168872420969807856967187537695
5052#define MagickSQ2PI 2.50662827463100024161235523934010416269302368164062
@@ -73,45 +75,42 @@ static inline ssize_t CastDoubleToLong(const double x)
7375 errno = ERANGE ;
7476 return (0 );
7577 }
76- if (x < 0.0 )
78+ value = (x < 0.0 ) ? ceil (x ) : floor (x );
79+ if (value < ((double ) MAGICK_SSIZE_MIN ))
7780 {
78- value = ceil (x );
79- if (value < ((double ) MAGICK_SSIZE_MIN ))
80- {
81- errno = ERANGE ;
82- return ((ssize_t ) MAGICK_SSIZE_MIN );
83- }
81+ errno = ERANGE ;
82+ return (MAGICK_SSIZE_MIN );
8483 }
85- else
84+ if ( value > (( double ) MAGICK_SSIZE_MAX ))
8685 {
87- value = floor (x );
88- if (value > ((double ) MAGICK_SSIZE_MAX ))
89- {
90- errno = ERANGE ;
91- return ((ssize_t ) MAGICK_SSIZE_MAX );
92- }
86+ errno = ERANGE ;
87+ return (MAGICK_SSIZE_MAX );
9388 }
9489 return ((ssize_t ) value );
9590}
9691
9792static inline QuantumAny CastDoubleToQuantumAny (const double x )
9893{
94+ double
95+ value ;
96+
9997 if (IsNaN (x ) != 0 )
10098 {
10199 errno = ERANGE ;
102100 return (0 );
103101 }
104- if (x > ((double ) ((QuantumAny ) ~0 )))
102+ value = (x < 0.0 ) ? ceil (x ) : floor (x );
103+ if (value < 0.0 )
105104 {
106105 errno = ERANGE ;
107- return (( QuantumAny ) ~ 0 );
106+ return (0 );
108107 }
109- if (x < 0.0 )
108+ if (value > (( double ) (( QuantumAny ) ~ 0 )) )
110109 {
111110 errno = ERANGE ;
112- return ((QuantumAny ) 0 );
111+ return ((QuantumAny ) ~ 0 );
113112 }
114- return ((QuantumAny ) ( x + 0.5 ) );
113+ return ((QuantumAny ) value );
115114}
116115
117116static inline size_t CastDoubleToUnsigned (const double x )
@@ -124,16 +123,16 @@ static inline size_t CastDoubleToUnsigned(const double x)
124123 errno = ERANGE ;
125124 return (0 );
126125 }
127- value = floor (x );
128- if (value >= (( double ) MAGICK_SIZE_MAX ) )
126+ value = ( x < 0.0 ) ? ceil ( x ) : floor (x );
127+ if (value < 0.0 )
129128 {
130129 errno = ERANGE ;
131- return (( size_t ) MAGICK_SIZE_MAX );
130+ return (0 );
132131 }
133- if (value < 0.0 )
132+ if (value > (( double ) MAGICK_SIZE_MAX ) )
134133 {
135134 errno = ERANGE ;
136- return (0 );
135+ return (MAGICK_SIZE_MAX );
137136 }
138137 return ((size_t ) value );
139138}
0 commit comments