From b309f645f9e7c2f1f50691dead6a85a56da8333f Mon Sep 17 00:00:00 2001 From: "Christoph M. Becker" Date: Fri, 2 Feb 2018 17:39:23 +0100 Subject: [PATCH] Sync gdImageCrop() with upstream Besides that we still hope to sync the complete bundled libgd sometime, the upstream implementation of `gdImageCrop()` is much simpler than the current one, and thus better readable and less error prone. --- ext/gd/libgd/gd_crop.c | 50 ++++++------------------------------------ 1 file changed, 7 insertions(+), 43 deletions(-) diff --git a/ext/gd/libgd/gd_crop.c b/ext/gd/libgd/gd_crop.c index 58b630317d..74d86669f5 100644 --- a/ext/gd/libgd/gd_crop.c +++ b/ext/gd/libgd/gd_crop.c @@ -43,55 +43,19 @@ static int gdColorMatch(gdImagePtr im, int col1, int col2, float threshold); gdImagePtr gdImageCrop(gdImagePtr src, const gdRectPtr crop) { gdImagePtr dst; - int y; + int alphaBlendingFlag; - /* allocate the requested size (could be only partially filled) */ - if (src->trueColor) { + if (gdImageTrueColor(src)) { dst = gdImageCreateTrueColor(crop->width, crop->height); - if (dst == NULL) { - return NULL; - } - gdImageSaveAlpha(dst, 1); } else { dst = gdImageCreate(crop->width, crop->height); - if (dst == NULL) { - return NULL; - } - gdImagePaletteCopy(dst, src); - } - dst->transparent = src->transparent; - - /* check position in the src image */ - if (crop->x < 0 || crop->x>=src->sx || crop->y<0 || crop->y>=src->sy) { - return dst; - } - - /* reduce size if needed */ - if ((src->sx - crop->width) < crop->x) { - crop->width = src->sx - crop->x; - } - if ((src->sy - crop->height) < crop->y) { - crop->height = src->sy - crop->y; } + if (!dst) return NULL; + alphaBlendingFlag = dst->alphaBlendingFlag; + gdImageAlphaBlending(dst, gdEffectReplace); + gdImageCopy(dst, src, 0, 0, crop->x, crop->y, crop->width, crop->height); + gdImageAlphaBlending(dst, alphaBlendingFlag); -#if 0 -printf("rect->x: %i\nrect->y: %i\nrect->width: %i\nrect->height: %i\n", crop->x, crop->y, crop->width, crop->height); -#endif - y = crop->y; - if (src->trueColor) { - unsigned int dst_y = 0; - while (y < (crop->y + crop->height)) { - /* TODO: replace 4 w/byte per channel||pitch once available */ - memcpy(dst->tpixels[dst_y++], src->tpixels[y++] + crop->x, crop->width * 4); - } - } else { - int x; - for (y = crop->y; y < (crop->y + crop->height); y++) { - for (x = crop->x; x < (crop->x + crop->width); x++) { - dst->pixels[y - crop->y][x - crop->x] = src->pixels[y][x]; - } - } - } return dst; } -- 2.50.1