/* * 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; }