123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778 |
- /*
- * The Python Imaging Library.
- * $Id$
- *
- * 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, Py_ssize_t 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;
- }
- }
|