]> granicus.if.org Git - php/commitdiff
- add image flip API support
authorPierre Joye <pierre.php@gmail.com>
Wed, 27 Feb 2013 09:37:48 +0000 (10:37 +0100)
committerPierre Joye <pierre.php@gmail.com>
Wed, 27 Feb 2013 09:37:48 +0000 (10:37 +0100)
ext/gd/libgd/gd_transform.c [new file with mode: 0644]

diff --git a/ext/gd/libgd/gd_transform.c b/ext/gd/libgd/gd_transform.c
new file mode 100644 (file)
index 0000000..9051525
--- /dev/null
@@ -0,0 +1,73 @@
+#include "gd.h"
+
+void gdImageFlipVertical(gdImagePtr im)
+{
+       register int x, y;
+
+       if (im->trueColor) {
+               for (y = 0; y < im->sy / 2; y++) {
+                       int *row_dst = im->tpixels[y];
+                       int *row_src = im->tpixels[im->sy - 1 - y];
+                       for (x = 0; x < im->sx; x++) {
+                               register int p;
+                               p = row_dst[x];
+                               row_dst[x] = im->tpixels[im->sy - 1 - y][x];
+                               row_src[x] = p;
+                       }
+               }
+       } else {
+               unsigned char p;
+               for (y = 0; y < im->sy / 2; y++) {
+                       for (x = 0; x < im->sx; x++) {
+                               p = im->pixels[y][x];
+                               im->pixels[y][x] =      im->pixels[im->sy - 1 - y][x];
+                               im->pixels[im->sy - 1 - y][x] = p;
+                       }
+               }
+       }
+       return;
+}
+
+void gdImageFlipHorizontal(gdImagePtr im)
+{
+
+       int x, y;
+
+       if (im->trueColor) {
+               int *px1, *px2, tmp;
+
+               for (y = 0; y < im->sy; y++) {
+                       px1 = im->tpixels[y];
+                       px2 = im->tpixels[y] + im->sx - 1;
+                       for (x = 0; x < (im->sx >> 1); x++) {
+                               tmp = *px1;
+                               *px1 = *px2;
+                               *px2 = tmp;
+                               px1++;
+                               px2--;
+                       }
+               }
+       } else {
+               unsigned char *px1, *px2, tmp;
+
+               for (y = 0; y < im->sy; y++) {
+                       px1 = im->pixels[y];
+                       px2 = im->pixels[y] + im->sx - 1;
+                       for (x = 0; x < (im->sx >> 1); x++) {
+                               tmp = *px1;
+                               *px1 = *px2;
+                               *px2 = tmp;
+                               px1++;
+                               px2--;
+                       }
+               }
+       }
+}
+
+void gdImageFlipBoth(gdImagePtr im)
+{
+       gdImageFlipVertical(im);
+       gdImageFlipHorizontal(im);
+}
+
+