~ubuntu-branches/ubuntu/gutsy/amsn/gutsy

« back to all changes in this revision

Viewing changes to utils/linux/capture/libng/color_packed.c

  • Committer: Bazaar Package Importer
  • Author(s): Theodore Karkoulis
  • Date: 2006-01-04 15:26:02 UTC
  • mfrom: (1.1.2 upstream)
  • Revision ID: james.westby@ubuntu.com-20060104152602-ipe1yg00rl3nlklv
Tags: 0.95-1
New Upstream Release (closes: #345052, #278575).

Show diffs side-by-side

added added

removed removed

Lines of Context:
 
1
/*
 
2
 * colorspace conversion functions
 
3
 *    -- packed pixel formats (rgb/gray right now)
 
4
 *
 
5
 * (c) 1998-2001 Gerd Knorr <kraxel@bytesex.org>
 
6
 *
 
7
 */
 
8
 
 
9
#define NG_PRIVATE
 
10
#include "config.h"
 
11
 
 
12
#include <stdio.h>
 
13
#include <stdlib.h>
 
14
#include <unistd.h>
 
15
#include <pthread.h>
 
16
#include <sys/time.h>
 
17
#include <sys/types.h>
 
18
 
 
19
#include "grab-ng.h"
 
20
 
 
21
/* ------------------------------------------------------------------- */
 
22
/* RGB conversions                                                     */
 
23
 
 
24
static void
 
25
redblue_swap(unsigned char *dest, unsigned char *src, int p)
 
26
{
 
27
    register unsigned char *s = src;
 
28
    register unsigned char *d = dest;
 
29
 
 
30
    while (p--) {
 
31
        *(d++) = s[2];
 
32
        *(d++) = s[1];
 
33
        *(d++) = s[0];
 
34
        s += 3;
 
35
    }
 
36
}
 
37
 
 
38
static void
 
39
bgr24_to_bgr32(unsigned char* restrict dest, unsigned char* restrict src,
 
40
               int p)
 
41
{
 
42
    register unsigned char* restrict s = src;
 
43
    register unsigned char* restrict d = dest;
 
44
 
 
45
    while (p--) {
 
46
        *(d++) = *(s++);
 
47
        *(d++) = *(s++);
 
48
        *(d++) = *(s++);
 
49
        *(d++) = 0;
 
50
    }
 
51
}
 
52
 
 
53
static void
 
54
bgr24_to_rgb32(unsigned char* restrict dest, unsigned char* restrict src,
 
55
               int p)
 
56
{
 
57
    register unsigned char* restrict s = src;
 
58
    register unsigned char* restrict d = dest;
 
59
 
 
60
    while (p--) {
 
61
        *(d++) = 0;
 
62
        *(d++) = s[2];
 
63
        *(d++) = s[1];
 
64
        *(d++) = s[0];
 
65
        s +=3;
 
66
    }
 
67
}
 
68
 
 
69
static void
 
70
rgb32_to_rgb24(unsigned char* restrict dest, unsigned char* restrict src,
 
71
               int p)
 
72
{
 
73
    register unsigned char* restrict s = src;
 
74
    register unsigned char* restrict d = dest;
 
75
 
 
76
    while (p--) {
 
77
        s++;
 
78
        *(d++) = *(s++);
 
79
        *(d++) = *(s++);
 
80
        *(d++) = *(s++);
 
81
    }
 
82
}
 
83
 
 
84
static void
 
85
rgb32_to_bgr24(unsigned char* restrict dest, unsigned char* restrict src,
 
86
               int p)
 
87
{
 
88
    register unsigned char* restrict s = src;
 
89
    register unsigned char* restrict d = dest;
 
90
 
 
91
    while (p--) {
 
92
        s++;
 
93
        d[2] = *(s++);
 
94
        d[1] = *(s++);
 
95
        d[0] = *(s++);
 
96
        d += 3;
 
97
    }
 
98
}
 
99
 
 
100
/* 15+16 bpp LE <=> BE */
 
101
static void
 
102
byteswap_short(unsigned char* restrict dest, unsigned char* restrict src,
 
103
               int p)
 
104
{
 
105
    register unsigned char* restrict s = src;
 
106
    register unsigned char* restrict d = dest;
 
107
 
 
108
    while (--p) {
 
109
        *(d++) = s[1];
 
110
        *(d++) = s[0];
 
111
        s += 2;
 
112
    }
 
113
}
 
114
 
 
115
/* ------------------------------------------------------------------- */
 
116
/* color => grayscale                                                  */
 
117
 
 
118
static void
 
119
rgb15_native_gray(unsigned char* restrict dest, unsigned char *s,
 
120
                  int p)
 
121
{
 
122
    int r,g,b;
 
123
    unsigned short* restrict src = (unsigned short*)s;
 
124
 
 
125
    while (p--) {
 
126
        r = (src[0] & 0x7c00) >> 10;
 
127
        g = (src[0] & 0x03e0) >>  5;
 
128
        b =  src[0] & 0x001f;
 
129
 
 
130
        *(dest++) = ((3*r + 6*g + b)/10) << 3;
 
131
        src++;
 
132
    }
 
133
}
 
134
 
 
135
#if BYTE_ORDER == LITTLE_ENDIAN
 
136
static void
 
137
rgb15_be_gray(unsigned char* restrict dest, unsigned char* restrict src,
 
138
              int p)
 
139
{
 
140
    int r,g,b;
 
141
    register unsigned char* restrict d = dest;
 
142
 
 
143
    while (p--) {
 
144
        r = (src[0] & 0x7c) >> 2;
 
145
        g = (src[0] & 0x03) << 3 | (src[1] & 0xe0) >> 5;
 
146
        b =  src[1] & 0x1f;
 
147
 
 
148
        *(d++) = ((3*r + 6*g + b)/10) << 3;
 
149
        src += 2;
 
150
    }
 
151
}
 
152
#endif
 
153
 
 
154
#if BYTE_ORDER == BIG_ENDIAN
 
155
static void
 
156
rgb15_le_gray(unsigned char* restrict dest, unsigned char* restrict src, int p)
 
157
{
 
158
    int r,g,b;
 
159
    register unsigned char* restrict d = dest;
 
160
 
 
161
    while (p--) {
 
162
        r = (src[1] & 0x7c) >> 2;
 
163
        g = (src[1] & 0x03) << 3 | (src[0] & 0xe0) >> 5;
 
164
        b = src[0] & 0x1f;
 
165
 
 
166
        *(d++) = ((3*r + 6*g + b)/10) << 3;
 
167
        src += 2;
 
168
    }
 
169
}
 
170
#endif
 
171
 
 
172
/* ------------------------------------------------------------------- */
 
173
 
 
174
static struct ng_video_conv conv_list[] = {
 
175
    {
 
176
        /* ----------------------------------- write GRAY -- */ 
 
177
#if BYTE_ORDER == BIG_ENDIAN
 
178
        NG_GENERIC_PACKED,
 
179
        .fmtid_in       = VIDEO_RGB15_BE,
 
180
        .fmtid_out      = VIDEO_GRAY,
 
181
        .priv           = rgb15_native_gray,
 
182
    }, {
 
183
        NG_GENERIC_PACKED,
 
184
        .fmtid_in       = VIDEO_RGB15_LE,
 
185
        .fmtid_out      = VIDEO_GRAY,
 
186
        .priv           = rgb15_le_gray,
 
187
    }, {
 
188
#else
 
189
        NG_GENERIC_PACKED,
 
190
        .fmtid_in       = VIDEO_RGB15_BE,
 
191
        .fmtid_out      = VIDEO_GRAY,
 
192
        .priv           = rgb15_be_gray,
 
193
    }, {
 
194
        NG_GENERIC_PACKED,
 
195
        .fmtid_in       = VIDEO_RGB15_LE,
 
196
        .fmtid_out      = VIDEO_GRAY,
 
197
        .priv           = rgb15_native_gray,
 
198
    }, {
 
199
#endif
 
200
        /* ----------------------------------- write RGB15 -- */ 
 
201
        NG_GENERIC_PACKED,
 
202
        .fmtid_in       = VIDEO_RGB15_LE,
 
203
        .fmtid_out      = VIDEO_RGB15_BE,
 
204
        .priv           = byteswap_short,
 
205
    }, {
 
206
        NG_GENERIC_PACKED,
 
207
        .fmtid_in       = VIDEO_RGB15_BE,
 
208
        .fmtid_out      = VIDEO_RGB15_LE,
 
209
        .priv           = byteswap_short,
 
210
    }, {
 
211
        /* ----------------------------------- write RGB16 -- */
 
212
        NG_GENERIC_PACKED,
 
213
        .fmtid_in       = VIDEO_RGB16_LE,
 
214
        .fmtid_out      = VIDEO_RGB16_BE,
 
215
        .priv           = byteswap_short,
 
216
    }, {
 
217
        NG_GENERIC_PACKED,
 
218
        .fmtid_in       = VIDEO_RGB16_BE,
 
219
        .fmtid_out      = VIDEO_RGB16_LE,
 
220
        .priv           = byteswap_short,
 
221
    }, {
 
222
        /* ----------------------------------- write RGB24 -- */
 
223
        NG_GENERIC_PACKED,
 
224
        .fmtid_in       = VIDEO_BGR24,
 
225
        .fmtid_out      = VIDEO_RGB24,
 
226
        .priv           = redblue_swap,
 
227
    }, {
 
228
        NG_GENERIC_PACKED,
 
229
        .fmtid_in       = VIDEO_RGB24,
 
230
        .fmtid_out      = VIDEO_BGR24,
 
231
        .priv           = redblue_swap,
 
232
    }, {
 
233
        NG_GENERIC_PACKED,
 
234
        .fmtid_in       = VIDEO_RGB32,
 
235
        .fmtid_out      = VIDEO_RGB24,
 
236
        .priv           = rgb32_to_rgb24,
 
237
    }, {
 
238
        NG_GENERIC_PACKED,
 
239
        .fmtid_in       = VIDEO_RGB32,
 
240
        .fmtid_out      = VIDEO_BGR24,
 
241
        .priv           = rgb32_to_bgr24,
 
242
    }, {
 
243
        /* ----------------------------------- write RGB32 -- */
 
244
        NG_GENERIC_PACKED,
 
245
        .fmtid_in       = VIDEO_BGR24,
 
246
        .fmtid_out      = VIDEO_BGR32,
 
247
        .priv           = bgr24_to_bgr32,
 
248
    }, {
 
249
        NG_GENERIC_PACKED,
 
250
        .fmtid_in       = VIDEO_BGR24,
 
251
        .fmtid_out      = VIDEO_RGB32,
 
252
        .priv           = bgr24_to_rgb32,
 
253
    }
 
254
};
 
255
static const int nconv = sizeof(conv_list)/sizeof(struct ng_video_conv);
 
256
 
 
257
/* ------------------------------------------------------------------- */
 
258
 
 
259
void __init packed_init(void)
 
260
{
 
261
    ng_conv_register(NG_PLUGIN_MAGIC,__FILE__,conv_list,nconv);
 
262
}