2
* colorspace conversion functions
3
* -- packed pixel formats (rgb/gray right now)
5
* (c) 1998-2001 Gerd Knorr <kraxel@bytesex.org>
17
#include <sys/types.h>
21
/* ------------------------------------------------------------------- */
25
redblue_swap(unsigned char *dest, unsigned char *src, int p)
27
register unsigned char *s = src;
28
register unsigned char *d = dest;
39
bgr24_to_bgr32(unsigned char* restrict dest, unsigned char* restrict src,
42
register unsigned char* restrict s = src;
43
register unsigned char* restrict d = dest;
54
bgr24_to_rgb32(unsigned char* restrict dest, unsigned char* restrict src,
57
register unsigned char* restrict s = src;
58
register unsigned char* restrict d = dest;
70
rgb32_to_rgb24(unsigned char* restrict dest, unsigned char* restrict src,
73
register unsigned char* restrict s = src;
74
register unsigned char* restrict d = dest;
85
rgb32_to_bgr24(unsigned char* restrict dest, unsigned char* restrict src,
88
register unsigned char* restrict s = src;
89
register unsigned char* restrict d = dest;
100
/* 15+16 bpp LE <=> BE */
102
byteswap_short(unsigned char* restrict dest, unsigned char* restrict src,
105
register unsigned char* restrict s = src;
106
register unsigned char* restrict d = dest;
115
/* ------------------------------------------------------------------- */
116
/* color => grayscale */
119
rgb15_native_gray(unsigned char* restrict dest, unsigned char *s,
123
unsigned short* restrict src = (unsigned short*)s;
126
r = (src[0] & 0x7c00) >> 10;
127
g = (src[0] & 0x03e0) >> 5;
130
*(dest++) = ((3*r + 6*g + b)/10) << 3;
135
#if BYTE_ORDER == LITTLE_ENDIAN
137
rgb15_be_gray(unsigned char* restrict dest, unsigned char* restrict src,
141
register unsigned char* restrict d = dest;
144
r = (src[0] & 0x7c) >> 2;
145
g = (src[0] & 0x03) << 3 | (src[1] & 0xe0) >> 5;
148
*(d++) = ((3*r + 6*g + b)/10) << 3;
154
#if BYTE_ORDER == BIG_ENDIAN
156
rgb15_le_gray(unsigned char* restrict dest, unsigned char* restrict src, int p)
159
register unsigned char* restrict d = dest;
162
r = (src[1] & 0x7c) >> 2;
163
g = (src[1] & 0x03) << 3 | (src[0] & 0xe0) >> 5;
166
*(d++) = ((3*r + 6*g + b)/10) << 3;
172
/* ------------------------------------------------------------------- */
174
static struct ng_video_conv conv_list[] = {
176
/* ----------------------------------- write GRAY -- */
177
#if BYTE_ORDER == BIG_ENDIAN
179
.fmtid_in = VIDEO_RGB15_BE,
180
.fmtid_out = VIDEO_GRAY,
181
.priv = rgb15_native_gray,
184
.fmtid_in = VIDEO_RGB15_LE,
185
.fmtid_out = VIDEO_GRAY,
186
.priv = rgb15_le_gray,
190
.fmtid_in = VIDEO_RGB15_BE,
191
.fmtid_out = VIDEO_GRAY,
192
.priv = rgb15_be_gray,
195
.fmtid_in = VIDEO_RGB15_LE,
196
.fmtid_out = VIDEO_GRAY,
197
.priv = rgb15_native_gray,
200
/* ----------------------------------- write RGB15 -- */
202
.fmtid_in = VIDEO_RGB15_LE,
203
.fmtid_out = VIDEO_RGB15_BE,
204
.priv = byteswap_short,
207
.fmtid_in = VIDEO_RGB15_BE,
208
.fmtid_out = VIDEO_RGB15_LE,
209
.priv = byteswap_short,
211
/* ----------------------------------- write RGB16 -- */
213
.fmtid_in = VIDEO_RGB16_LE,
214
.fmtid_out = VIDEO_RGB16_BE,
215
.priv = byteswap_short,
218
.fmtid_in = VIDEO_RGB16_BE,
219
.fmtid_out = VIDEO_RGB16_LE,
220
.priv = byteswap_short,
222
/* ----------------------------------- write RGB24 -- */
224
.fmtid_in = VIDEO_BGR24,
225
.fmtid_out = VIDEO_RGB24,
226
.priv = redblue_swap,
229
.fmtid_in = VIDEO_RGB24,
230
.fmtid_out = VIDEO_BGR24,
231
.priv = redblue_swap,
234
.fmtid_in = VIDEO_RGB32,
235
.fmtid_out = VIDEO_RGB24,
236
.priv = rgb32_to_rgb24,
239
.fmtid_in = VIDEO_RGB32,
240
.fmtid_out = VIDEO_BGR24,
241
.priv = rgb32_to_bgr24,
243
/* ----------------------------------- write RGB32 -- */
245
.fmtid_in = VIDEO_BGR24,
246
.fmtid_out = VIDEO_BGR32,
247
.priv = bgr24_to_bgr32,
250
.fmtid_in = VIDEO_BGR24,
251
.fmtid_out = VIDEO_RGB32,
252
.priv = bgr24_to_rgb32,
255
static const int nconv = sizeof(conv_list)/sizeof(struct ng_video_conv);
257
/* ------------------------------------------------------------------- */
259
void __init packed_init(void)
261
ng_conv_register(NG_PLUGIN_MAGIC,__FILE__,conv_list,nconv);