aboutsummaryrefslogtreecommitdiff
path: root/graphics/gd
diff options
context:
space:
mode:
authorDirk Meyer <dinoex@FreeBSD.org>2018-12-30 14:00:46 +0000
committerDirk Meyer <dinoex@FreeBSD.org>2018-12-30 14:00:46 +0000
commitd21dd5b9fc0d6d748e4b3992c7a58609ee85aa8c (patch)
tree4019eb5659ed1750bc7b4039e67319892786a000 /graphics/gd
parentebf8913e121b7aa12202b60c1d7bb13adae28c65 (diff)
downloadports-d21dd5b9fc0d6d748e4b3992c7a58609ee85aa8c.tar.gz
ports-d21dd5b9fc0d6d748e4b3992c7a58609ee85aa8c.zip
- fix rendering of gif
Notes
Notes: svn path=/head/; revision=488716
Diffstat (limited to 'graphics/gd')
-rw-r--r--graphics/gd/Makefile1
-rw-r--r--graphics/gd/files/patch-gd.c136
2 files changed, 137 insertions, 0 deletions
diff --git a/graphics/gd/Makefile b/graphics/gd/Makefile
index cad4f7b3def3..dbcbd3032463 100644
--- a/graphics/gd/Makefile
+++ b/graphics/gd/Makefile
@@ -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}/
diff --git a/graphics/gd/files/patch-gd.c b/graphics/gd/files/patch-gd.c
new file mode 100644
index 000000000000..a4e142c83b31
--- /dev/null
+++ b/graphics/gd/files/patch-gd.c
@@ -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;