13#define MAXPATHLEN PATH_MAX
14#elif defined(MAX_PATH)
15#define MAXPATHLEN MAX_PATH
18#define MAXPATHLEN 4096
28#if defined(HAVE_INTTYPES_H)
31#include "msinttypes/inttypes.h"
36#define ssize_t SSIZE_T
37#define MAXSIZE_T ((SIZE_T) ~((SIZE_T)0))
38#define MAXSSIZE_T ((SSIZE_T)(MAXSIZE_T >> 1))
39#define MINSSIZE_T ((SSIZE_T)~MAXSSIZE_T)
40#define SSIZE_MAX MAXSSIZE_T
43#define UNUSED_PARAM(x) x
44#elif defined(__GNUC__) || defined(__clang__)
45#define UNUSED_PARAM(x) x __attribute__((unused))
47#define UNUSED_PARAM(x) x
50#define MIN(a, b) ((a) < (b) ? (a) : (b))
52#define MIN3(a, b, c) ((a) < (b) ? (MIN(a, c)) : (MIN(b, c)))
54#define MAX(a, b) ((a) < (b) ? (b) : (a))
56#define MAX3(a, b, c) ((a) < (b) ? (MAX(b, c)) : (MAX(a, c)))
57#define CLAMP(x, low, high) (((x) > (high)) ? (high) : (((x) < (low)) ? (low) : (x)))
59#define gdImageBoundsSafeMacro(im, x, y) \
60 (!((((y) < (im)->cy1) || ((y) > (im)->cy2)) || (((x) < (im)->cx1) || ((x) > (im)->cx2))))
63#define gd_strcasecmp _stricmp
65#define gd_strcasecmp strcasecmp
77static inline unsigned char uchar_clamp(
double clr,
unsigned char max)
79 unsigned short result;
91 result = (
unsigned short)(
short)(clr + 0.5);
93 result = (clr < 0) ? 0 : max;
102static inline int gdMetadataGetExifTiff(
const unsigned char *data,
size_t size,
103 const unsigned char **tiff,
size_t *tiff_size)
105 static const unsigned char exif_signature[] = {
'E',
'x',
'i',
'f',
'\0',
'\0'};
107 if (tiff == NULL || tiff_size == NULL || (data == NULL && size != 0)) {
108 return GD_META_ERR_INVALID;
110 if (size >=
sizeof(exif_signature) &&
111 memcmp(data, exif_signature,
sizeof(exif_signature)) == 0) {
112 data +=
sizeof(exif_signature);
113 size -=
sizeof(exif_signature);
115 if (size < 8 || data == NULL ||
116 !((data[0] ==
'I' && data[1] ==
'I' && data[2] == 42 && data[3] == 0) ||
117 (data[0] ==
'M' && data[1] ==
'M' && data[2] == 0 && data[3] == 42))) {
118 return GD_META_ERR_PARSE;
128gdImagePtr gdImageRotate90(gdImagePtr src,
int ignoretransparent);
129gdImagePtr gdImageRotate180(gdImagePtr src,
int ignoretransparent);
130gdImagePtr gdImageRotate270(gdImagePtr src,
int ignoretransparent);
138static inline int gdImageClipCopy(gdImagePtr dst,
int *dstX,
int *dstY,
int *srcX,
int *srcY,
148 if (*w <= 0 || *h <= 0) {
153 if (*dstX > 0 && *w > INT_MAX - *dstX) {
158 if (*dstY > 0 && *h > INT_MAX - *dstY) {
165 if (x1 >= gdImageSX(dst) || y1 >= gdImageSY(dst) || x2 <= 0 || y2 <= 0) {
184 if (*dstX + *w > gdImageSX(dst)) {
185 *w = gdImageSX(dst) - *dstX;
189 if (*dstY + *h > gdImageSY(dst)) {
190 *h = gdImageSY(dst) - *dstY;
194 if (*w <= 0 || *h <= 0) {
200static inline int gdImageClipCopyResized(gdImagePtr dst,
int *dstX,
int *dstY,
int *dstW,
int *dstH,
201 int *srcX,
int *srcY,
int *srcW,
int *srcH)
203 int orig_dstW = *dstW;
204 int orig_dstH = *dstH;
206 if (*dstW <= 0 || *dstH <= 0 || *srcW <= 0 || *srcH <= 0) {
209 if (*dstX >= gdImageSX(dst) || *dstY >= gdImageSY(dst) || *dstX + *dstW <= 0 ||
210 *dstY + *dstH <= 0) {
216 *srcX += (-*dstX) * *srcW / orig_dstW;
217 *srcW -= (-*dstX) * *srcW / orig_dstW;
223 *srcY += (-*dstY) * *srcH / orig_dstH;
224 *srcH -= (-*dstY) * *srcH / orig_dstH;
229 if (*dstX + *dstW > gdImageSX(dst)) {
230 int clip = *dstX + *dstW - gdImageSX(dst);
231 *srcW -= clip * *srcW / orig_dstW;
232 *dstW = gdImageSX(dst) - *dstX;
235 if (*dstY + *dstH > gdImageSY(dst)) {
236 int clip = *dstY + *dstH - gdImageSY(dst);
237 *srcH -= clip * *srcH / orig_dstH;
238 *dstH = gdImageSY(dst) - *dstY;
241 if (*dstW <= 0 || *dstH <= 0)