mirror of
https://github.com/python-pillow/Pillow.git
synced 2024-12-28 02:46:18 +03:00
97 lines
2.2 KiB
C
97 lines
2.2 KiB
C
/*
|
|
* The Python Imaging Library.
|
|
* $Id$
|
|
*
|
|
* encoder for Xbm data
|
|
*
|
|
* history:
|
|
* 96-11-01 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"
|
|
|
|
int
|
|
ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
|
|
const char *hex = "0123456789abcdef";
|
|
|
|
UINT8 *ptr = buf;
|
|
int i, n;
|
|
|
|
if (!state->state) {
|
|
/* 8 pixels are stored in no more than 6 bytes */
|
|
state->bytes = 6 * (state->xsize + 7) / 8;
|
|
|
|
state->state = 1;
|
|
}
|
|
|
|
if (bytes < state->bytes) {
|
|
state->errcode = IMAGING_CODEC_MEMORY;
|
|
return 0;
|
|
}
|
|
|
|
ptr = buf;
|
|
|
|
while (bytes >= state->bytes) {
|
|
state->shuffle(
|
|
state->buffer,
|
|
(UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize,
|
|
state->xsize);
|
|
|
|
if (state->y < state->ysize - 1) {
|
|
/* any line but the last */
|
|
for (n = 0; n < state->xsize; n += 8) {
|
|
i = state->buffer[n / 8];
|
|
|
|
*ptr++ = '0';
|
|
*ptr++ = 'x';
|
|
*ptr++ = hex[(i >> 4) & 15];
|
|
*ptr++ = hex[i & 15];
|
|
*ptr++ = ',';
|
|
bytes -= 5;
|
|
|
|
if (++state->count >= 79 / 5) {
|
|
*ptr++ = '\n';
|
|
bytes--;
|
|
state->count = 0;
|
|
}
|
|
}
|
|
|
|
state->y++;
|
|
|
|
} else {
|
|
/* last line */
|
|
for (n = 0; n < state->xsize; n += 8) {
|
|
i = state->buffer[n / 8];
|
|
|
|
*ptr++ = '0';
|
|
*ptr++ = 'x';
|
|
*ptr++ = hex[(i >> 4) & 15];
|
|
*ptr++ = hex[i & 15];
|
|
|
|
if (n < state->xsize - 8) {
|
|
*ptr++ = ',';
|
|
if (++state->count >= 79 / 5) {
|
|
*ptr++ = '\n';
|
|
bytes--;
|
|
state->count = 0;
|
|
}
|
|
} else {
|
|
*ptr++ = '\n';
|
|
}
|
|
|
|
bytes -= 5;
|
|
}
|
|
|
|
state->errcode = IMAGING_CODEC_END;
|
|
break;
|
|
}
|
|
}
|
|
|
|
return ptr - buf;
|
|
}
|