Pillow
97 строк · 2.3 Кб
1/*
2* The Python Imaging Library.
3* $Id$
4*
5* encoder for Xbm data
6*
7* history:
8* 96-11-01 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
18int
19ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {20const char *hex = "0123456789abcdef";21
22UINT8 *ptr = buf;23int i, n;24
25if (!state->state) {26/* 8 pixels are stored in no more than 6 bytes */27state->bytes = 6 * (state->xsize + 7) / 8;28
29state->state = 1;30}31
32if (bytes < state->bytes) {33state->errcode = IMAGING_CODEC_MEMORY;34return 0;35}36
37ptr = buf;38
39while (bytes >= state->bytes) {40state->shuffle(41state->buffer,42(UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize,43state->xsize44);45
46if (state->y < state->ysize - 1) {47/* any line but the last */48for (n = 0; n < state->xsize; n += 8) {49i = state->buffer[n / 8];50
51*ptr++ = '0';52*ptr++ = 'x';53*ptr++ = hex[(i >> 4) & 15];54*ptr++ = hex[i & 15];55*ptr++ = ',';56bytes -= 5;57
58if (++state->count >= 79 / 5) {59*ptr++ = '\n';60bytes--;61state->count = 0;62}63}64
65state->y++;66
67} else {68/* last line */69for (n = 0; n < state->xsize; n += 8) {70i = state->buffer[n / 8];71
72*ptr++ = '0';73*ptr++ = 'x';74*ptr++ = hex[(i >> 4) & 15];75*ptr++ = hex[i & 15];76
77if (n < state->xsize - 8) {78*ptr++ = ',';79if (++state->count >= 79 / 5) {80*ptr++ = '\n';81bytes--;82state->count = 0;83}84} else {85*ptr++ = '\n';86}87
88bytes -= 5;89}90
91state->errcode = IMAGING_CODEC_END;92break;93}94}95
96return ptr - buf;97}
98