Date: Sun, 30 Dec 2018 14:00:46 +0000 (UTC) From: Dirk Meyer <dinoex@FreeBSD.org> To: ports-committers@freebsd.org, svn-ports-all@freebsd.org, svn-ports-head@freebsd.org Subject: svn commit: r488716 - in head/graphics/gd: . files Message-ID: <201812301400.wBUE0kYG089788@repo.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: dinoex Date: Sun Dec 30 14:00:46 2018 New Revision: 488716 URL: https://svnweb.freebsd.org/changeset/ports/488716 Log: - fix rendering of gif PR: 231057 Obtained from: https://github.com/libgd/libgd/issues/473 Added: head/graphics/gd/files/patch-gd.c (contents, props changed) Modified: head/graphics/gd/Makefile Modified: head/graphics/gd/Makefile ============================================================================== --- head/graphics/gd/Makefile Sun Dec 30 13:50:04 2018 (r488715) +++ head/graphics/gd/Makefile Sun Dec 30 14:00:46 2018 (r488716) @@ -3,6 +3,7 @@ PORTNAME= libgd PORTVERSION= 2.2.5 +PORTREVISION= 1 PORTEPOCH= 1 CATEGORIES+= graphics MASTER_SITES= https://github.com/${PORTNAME}/${PORTNAME}/releases/download/gd-${PORTVERSION}/ Added: head/graphics/gd/files/patch-gd.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/graphics/gd/files/patch-gd.c Sun Dec 30 14:00:46 2018 (r488716) @@ -0,0 +1,136 @@ +index d8eaf43..d852068 100644 +--- src/gd.c ++++ src/gd.c +@@ -66,6 +66,9 @@ static const unsigned char gd_toascii[256] = { + }; + #endif /*CHARSET_EBCDIC */ + ++/* 2.0.10: cast instead of floor() yields 35% performance improvement. Thanks to John Buckman. */ ++#define floor_cast(exp) ((long) exp) ++ + extern const int gdCosT[]; + extern const int gdSinT[]; + +@@ -3452,50 +3455,51 @@ BGD_DECLARE(void) gdImageCopyResampled (gdImagePtr dst, + int dstW, int dstH, int srcW, int srcH) + { + int x, y; ++ double sy1, sy2, sx1, sx2; ++ + if (!dst->trueColor) { + gdImageCopyResized (dst, src, dstX, dstY, srcX, srcY, dstW, dstH, srcW, srcH); + return; + } + for (y = dstY; (y < dstY + dstH); y++) { ++ sy1 = ((double) y - (double) dstY) * (double) srcH / (double) dstH; ++ sy2 = ((double) (y + 1) - (double) dstY) * (double) srcH / (double) dstH; + for (x = dstX; (x < dstX + dstW); x++) { +- float sy1, sy2, sx1, sx2; +- float sx, sy; +- float spixels = 0.0; +- float red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; +- float alpha_factor, alpha_sum = 0.0, contrib_sum = 0.0; +- sy1 = ((float)(y - dstY)) * (float)srcH / (float)dstH; +- sy2 = ((float)(y + 1 - dstY)) * (float) srcH / (float) dstH; ++ double sx, sy; ++ double spixels = 0; ++ double red = 0.0, green = 0.0, blue = 0.0, alpha = 0.0; ++ double alpha_factor, alpha_sum = 0.0, contrib_sum = 0.0; ++ sx1 = ((double) x - (double) dstX) * (double) srcW / dstW; ++ sx2 = ((double) (x + 1) - (double) dstX) * (double) srcW / dstW; + sy = sy1; + do { +- float yportion; +- if (floorf(sy) == floorf(sy1)) { +- yportion = 1.0 - (sy - floorf(sy)); ++ double yportion; ++ if (floor_cast(sy) == floor_cast(sy1)) { ++ yportion = 1.0f - (sy - floor_cast(sy)); + if (yportion > sy2 - sy1) { + yportion = sy2 - sy1; + } +- sy = floorf(sy); ++ sy = floor_cast(sy); + } else if (sy == floorf(sy2)) { +- yportion = sy2 - floorf(sy2); ++ yportion = sy2 - floor_cast(sy2); + } else { +- yportion = 1.0; ++ yportion = 1.0f; + } +- sx1 = ((float)(x - dstX)) * (float) srcW / dstW; +- sx2 = ((float)(x + 1 - dstX)) * (float) srcW / dstW; + sx = sx1; + do { +- float xportion; +- float pcontribution; ++ double xportion; ++ double pcontribution; + int p; +- if (floorf(sx) == floorf(sx1)) { +- xportion = 1.0 - (sx - floorf(sx)); ++ if (floorf(sx) == floor_cast(sx1)) { ++ xportion = 1.0f - (sx - floor_cast(sx)); + if (xportion > sx2 - sx1) { + xportion = sx2 - sx1; + } +- sx = floorf(sx); ++ sx = floor_cast(sx); + } else if (sx == floorf(sx2)) { +- xportion = sx2 - floorf(sx2); ++ xportion = sx2 - floor_cast(sx2); + } else { +- xportion = 1.0; ++ xportion = 1.0f; + } + pcontribution = xportion * yportion; + p = gdImageGetTrueColorPixel(src, (int) sx + srcX, (int) sy + srcY); +@@ -3508,21 +3512,24 @@ BGD_DECLARE(void) gdImageCopyResampled (gdImagePtr dst, + alpha_sum += alpha_factor; + contrib_sum += pcontribution; + spixels += xportion * yportion; +- sx += 1.0; ++ sx += 1.0f; + } + while (sx < sx2); ++ + sy += 1.0f; + } ++ + while (sy < sy2); + +- if (spixels != 0.0) { ++ if (spixels != 0.0f) { + red /= spixels; + green /= spixels; + blue /= spixels; + alpha /= spixels; ++ alpha += 0.5; + } +- if ( alpha_sum != 0.0) { +- if( contrib_sum != 0.0) { ++ if ( alpha_sum != 0.0f) { ++ if( contrib_sum != 0.0f) { + alpha_sum /= contrib_sum; + } + red /= alpha_sum; +@@ -3530,14 +3537,14 @@ BGD_DECLARE(void) gdImageCopyResampled (gdImagePtr dst, + blue /= alpha_sum; + } + /* Clamping to allow for rounding errors above */ +- if (red > 255.0) { +- red = 255.0; ++ if (red > 255.0f) { ++ red = 255.0f; + } +- if (green > 255.0) { +- green = 255.0; ++ if (green > 255.0f) { ++ green = 255.0f; + } + if (blue > 255.0f) { +- blue = 255.0; ++ blue = 255.0f; + } + if (alpha > gdAlphaMax) { + alpha = gdAlphaMax;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201812301400.wBUE0kYG089788>