Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Imaging/libImaging/Offset.c
diff options
context:
space:
mode:
Diffstat (limited to 'Imaging/libImaging/Offset.c')
-rw-r--r--Imaging/libImaging/Offset.c61
1 files changed, 61 insertions, 0 deletions
diff --git a/Imaging/libImaging/Offset.c b/Imaging/libImaging/Offset.c
new file mode 100644
index 0000000..7e5ac14
--- /dev/null
+++ b/Imaging/libImaging/Offset.c
@@ -0,0 +1,61 @@
+/*
+ * The Python Imaging Library
+ * $Id: Offset.c 2134 2004-10-06 08:55:20Z fredrik $
+ *
+ * offset an image in x and y directions
+ *
+ * history:
+ * 96-07-22 fl: Created
+ * 98-11-01 cgw@pgt.com: Fixed negative-array index bug
+ *
+ * Copyright (c) Fredrik Lundh 1996.
+ * Copyright (c) Secret Labs AB 1997.
+ *
+ * See the README file for information on usage and redistribution.
+ */
+
+
+#include "Imaging.h"
+
+
+Imaging
+ImagingOffset(Imaging im, int xoffset, int yoffset)
+{
+ int x, y;
+ Imaging imOut;
+
+ if (!im)
+ return (Imaging) ImagingError_ModeError();
+
+ imOut = ImagingNew(im->mode, im->xsize, im->ysize);
+ if (!imOut)
+ return NULL;
+
+ ImagingCopyInfo(imOut, im);
+
+ /* make offsets positive to avoid negative coordinates */
+ xoffset %= im->xsize;
+ xoffset = im->xsize - xoffset;
+ if (xoffset < 0)
+ xoffset += im->xsize;
+
+ yoffset %= im->ysize;
+ yoffset = im->ysize - yoffset;
+ if (yoffset < 0)
+ yoffset += im->ysize;
+
+#define OFFSET(image)\
+ for (y = 0; y < im->ysize; y++)\
+ for (x = 0; x < im->xsize; x++) {\
+ int yi = (y + yoffset) % im->ysize;\
+ int xi = (x + xoffset) % im->xsize;\
+ imOut->image[y][x] = im->image[yi][xi];\
+ }
+
+ if (im->image8)
+ OFFSET(image8)
+ else
+ OFFSET(image32)
+
+ return imOut;
+}