summaryrefslogtreecommitdiff
path: root/Build/source/libs/gd/libgd-src/tests/gdinterpolatedscale/gdTrivialResize.c
diff options
context:
space:
mode:
Diffstat (limited to 'Build/source/libs/gd/libgd-src/tests/gdinterpolatedscale/gdTrivialResize.c')
-rw-r--r--Build/source/libs/gd/libgd-src/tests/gdinterpolatedscale/gdTrivialResize.c94
1 files changed, 94 insertions, 0 deletions
diff --git a/Build/source/libs/gd/libgd-src/tests/gdinterpolatedscale/gdTrivialResize.c b/Build/source/libs/gd/libgd-src/tests/gdinterpolatedscale/gdTrivialResize.c
new file mode 100644
index 00000000000..f11b5059fbf
--- /dev/null
+++ b/Build/source/libs/gd/libgd-src/tests/gdinterpolatedscale/gdTrivialResize.c
@@ -0,0 +1,94 @@
+#include <stdio.h>
+
+#include "gd.h"
+#include "gdtest.h"
+
+/* Test gdImageScale() with bicubic interpolation on a simple
+ * all-white image. */
+
+gdImagePtr mkwhite(int x, int y)
+{
+ gdImagePtr im;
+
+ im = gdImageCreateTrueColor(x, y);
+ gdImageFilledRectangle(im, 0, 0, x-1, y-1,
+ gdImageColorExactAlpha(im, 255, 255, 255, 0));
+
+ gdTestAssert(im != NULL);
+
+ gdImageSetInterpolationMethod(im, GD_BICUBIC); // FP interp'n
+
+ return im;
+}/* mkwhite*/
+
+
+/* Fill with almost-black. */
+void mkblack(gdImagePtr ptr)
+{
+ gdImageFilledRectangle(ptr, 0, 0, ptr->sx - 1, ptr->sy - 1,
+ gdImageColorExactAlpha(ptr, 2, 2, 2, 0));
+}/* mkblack*/
+
+
+#define CLOSE_ENOUGH 15
+
+void scaletest(int x, int y, int nx, int ny)
+{
+ gdImagePtr im, imref, tmp, same;
+
+ imref = mkwhite(x, y);
+ im = mkwhite(x, y);
+ tmp = gdImageScale(im, nx, ny);
+ same = gdImageScale(tmp, x, y);
+
+ /* Test the result to insure that it's close enough to the
+ * original. */
+ gdTestAssert(gdMaxPixelDiff(im, same) < CLOSE_ENOUGH);
+
+ /* Modify the original and test for a change again. (I.e. test
+ * for accidentally shared memory.) */
+ mkblack(tmp);
+ gdTestAssert(gdMaxPixelDiff(imref, same) < CLOSE_ENOUGH);
+
+ gdImageDestroy(im);
+ gdImageDestroy(tmp);
+ gdImageDestroy(same);
+}/* scaletest*/
+
+void do_test(int x, int y, int nx, int ny)
+{
+ gdImagePtr im, imref, tmp;
+ gdImagePtr same, same2;
+
+ im = mkwhite(x, y);
+ imref = mkwhite(x, y);
+
+ same = gdImageScale(im, x, y);
+
+ /* Trivial resize should be a straight copy. */
+ gdTestAssert(im != same);
+ gdTestAssert(gdMaxPixelDiff(im, same) == 0);
+ gdTestAssert(gdMaxPixelDiff(imref, same) == 0);
+
+ /* Ensure that modifying im doesn't modify same (i.e. see if we
+ * can catch them accidentally sharing the same pixel buffer.) */
+ mkblack(im);
+ gdTestAssert(gdMaxPixelDiff(imref, same) == 0);
+
+ gdImageDestroy(same);
+ gdImageDestroy(im);
+
+ /* Scale horizontally, vertically and both. */
+ scaletest(x, y, nx, y);
+ scaletest(x, y, x, ny);
+ scaletest(x, y, nx, ny);
+}
+
+int main(int argc, char **argv)
+{
+
+ do_test(300, 300, 600, 600);
+ do_test(3200, 2133, 640, 427);
+
+ return gdNumFailures();
+}