1
0
mirror of https://git.FreeBSD.org/ports.git synced 2024-11-24 00:45:52 +00:00

- fix rendering of gif

PR:		231057
Obtained from:	https://github.com/libgd/libgd/issues/473
This commit is contained in:
Dirk Meyer 2018-12-30 14:00:46 +00:00
parent ebf8913e12
commit d21dd5b9fc
Notes: svn2git 2021-03-31 03:12:20 +00:00
svn path=/head/; revision=488716
2 changed files with 137 additions and 0 deletions

View File

@ -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}/

View File

@ -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;