Skip site navigation (1)Skip section navigation (2)
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>