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
260 ng_color_packed_init(void)
261 {
262 ng_conv_register(NG_PLUGIN_MAGIC,"built-in",conv_list,nconv);
263 }
264
|
This page was automatically generated by the
LXR engine.
|