Web   ·   Wiki   ·   Activities   ·   Blog   ·   Lists   ·   Chat   ·   Meeting   ·   Bugs   ·   Git   ·   Translate   ·   Archive   ·   People   ·   Donate
summaryrefslogtreecommitdiffstats
path: root/Imaging/libImaging/XbmDecode.c
diff options
context:
space:
mode:
Diffstat (limited to 'Imaging/libImaging/XbmDecode.c')
-rw-r--r--Imaging/libImaging/XbmDecode.c81
1 files changed, 81 insertions, 0 deletions
diff --git a/Imaging/libImaging/XbmDecode.c b/Imaging/libImaging/XbmDecode.c
new file mode 100644
index 0000000..4819889
--- /dev/null
+++ b/Imaging/libImaging/XbmDecode.c
@@ -0,0 +1,81 @@
+/*
+ * The Python Imaging Library.
+ * $Id: XbmDecode.c 2134 2004-10-06 08:55:20Z fredrik $
+ *
+ * decoder for XBM hex image data
+ *
+ * history:
+ * 96-04-13 fl Created
+ *
+ * Copyright (c) Fredrik Lundh 1996.
+ * Copyright (c) Secret Labs AB 1997.
+ *
+ * See the README file for information on usage and redistribution.
+ */
+
+
+#include "Imaging.h"
+
+#define HEX(v) ((v >= '0' && v <= '9') ? v - '0' :\
+ (v >= 'a' && v <= 'f') ? v - 'a' + 10 :\
+ (v >= 'A' && v <= 'F') ? v - 'A' + 10 : 0)
+
+int
+ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8* buf, int bytes)
+{
+ enum { BYTE = 1, SKIP };
+
+ UINT8* ptr;
+
+ if (!state->state)
+ state->state = SKIP;
+
+ ptr = buf;
+
+ for (;;) {
+
+ if (state->state == SKIP) {
+
+ /* Skip forward until next 'x' */
+
+ while (bytes > 0) {
+ if (*ptr == 'x')
+ break;
+ ptr++;
+ bytes--;
+ }
+
+ if (bytes == 0)
+ return ptr - buf;
+
+ state->state = BYTE;
+
+ }
+
+ if (bytes < 3)
+ return ptr - buf;
+
+ state->buffer[state->x] = (HEX(ptr[1])<<4) + HEX(ptr[2]);
+
+ if (++state->x >= state->bytes) {
+
+ /* Got a full line, unpack it */
+ state->shuffle((UINT8*) im->image[state->y], state->buffer,
+ state->xsize);
+
+ state->x = 0;
+
+ if (++state->y >= state->ysize) {
+ /* End of file (errcode = 0) */
+ return -1;
+ }
+ }
+
+ ptr += 3;
+ bytes -= 3;
+
+ state->state = SKIP;
+
+ }
+
+}