Pillow

Форк
0
/
XbmEncode.c 
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

18
int
19
ImagingXbmEncode(Imaging im, ImagingCodecState state, UINT8 *buf, int bytes) {
20
    const char *hex = "0123456789abcdef";
21

22
    UINT8 *ptr = buf;
23
    int i, n;
24

25
    if (!state->state) {
26
        /* 8 pixels are stored in no more than 6 bytes */
27
        state->bytes = 6 * (state->xsize + 7) / 8;
28

29
        state->state = 1;
30
    }
31

32
    if (bytes < state->bytes) {
33
        state->errcode = IMAGING_CODEC_MEMORY;
34
        return 0;
35
    }
36

37
    ptr = buf;
38

39
    while (bytes >= state->bytes) {
40
        state->shuffle(
41
            state->buffer,
42
            (UINT8 *)im->image[state->y + state->yoff] + state->xoff * im->pixelsize,
43
            state->xsize
44
        );
45

46
        if (state->y < state->ysize - 1) {
47
            /* any line but the last */
48
            for (n = 0; n < state->xsize; n += 8) {
49
                i = state->buffer[n / 8];
50

51
                *ptr++ = '0';
52
                *ptr++ = 'x';
53
                *ptr++ = hex[(i >> 4) & 15];
54
                *ptr++ = hex[i & 15];
55
                *ptr++ = ',';
56
                bytes -= 5;
57

58
                if (++state->count >= 79 / 5) {
59
                    *ptr++ = '\n';
60
                    bytes--;
61
                    state->count = 0;
62
                }
63
            }
64

65
            state->y++;
66

67
        } else {
68
            /* last line */
69
            for (n = 0; n < state->xsize; n += 8) {
70
                i = state->buffer[n / 8];
71

72
                *ptr++ = '0';
73
                *ptr++ = 'x';
74
                *ptr++ = hex[(i >> 4) & 15];
75
                *ptr++ = hex[i & 15];
76

77
                if (n < state->xsize - 8) {
78
                    *ptr++ = ',';
79
                    if (++state->count >= 79 / 5) {
80
                        *ptr++ = '\n';
81
                        bytes--;
82
                        state->count = 0;
83
                    }
84
                } else {
85
                    *ptr++ = '\n';
86
                }
87

88
                bytes -= 5;
89
            }
90

91
            state->errcode = IMAGING_CODEC_END;
92
            break;
93
        }
94
    }
95

96
    return ptr - buf;
97
}
98

Использование cookies

Мы используем файлы cookie в соответствии с Политикой конфиденциальности и Политикой использования cookies.

Нажимая кнопку «Принимаю», Вы даете АО «СберТех» согласие на обработку Ваших персональных данных в целях совершенствования нашего веб-сайта и Сервиса GitVerse, а также повышения удобства их использования.

Запретить использование cookies Вы можете самостоятельно в настройках Вашего браузера.