Pillow
78 строк · 1.6 Кб
1/*
2* The Python Imaging Library.
3* $Id$
4*
5* decoder for XBM hex image data
6*
7* history:
8* 96-04-13 fl Created
9*
10* Copyright (c) Fredrik Lundh 1996.
11* Copyright (c) Secret Labs AB 1997.
12*
13* See the README file for information on usage and redistribution.
14*/
15
16#include "Imaging.h"17
18#define HEX(v) \19((v >= '0' && v <= '9') ? v - '0' \20: (v >= 'a' && v <= 'f') ? v - 'a' + 10 \21: (v >= 'A' && v <= 'F') ? v - 'A' + 10 \22: 0)23
24int
25ImagingXbmDecode(Imaging im, ImagingCodecState state, UINT8 *buf, Py_ssize_t bytes) {26enum { BYTE = 1, SKIP };27
28UINT8 *ptr;29
30if (!state->state) {31state->state = SKIP;32}33
34ptr = buf;35
36for (;;) {37if (state->state == SKIP) {38/* Skip forward until next 'x' */39
40while (bytes > 0) {41if (*ptr == 'x') {42break;43}44ptr++;45bytes--;46}47
48if (bytes == 0) {49return ptr - buf;50}51
52state->state = BYTE;53}54
55if (bytes < 3) {56return ptr - buf;57}58
59state->buffer[state->x] = (HEX(ptr[1]) << 4) + HEX(ptr[2]);60
61if (++state->x >= state->bytes) {62/* Got a full line, unpack it */63state->shuffle((UINT8 *)im->image[state->y], state->buffer, state->xsize);64
65state->x = 0;66
67if (++state->y >= state->ysize) {68/* End of file (errcode = 0) */69return -1;70}71}72
73ptr += 3;74bytes -= 3;75
76state->state = SKIP;77}78}
79