Linux kernel & device driver programming

Cross-Referenced Linux and Device Driver Code

[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ]
Version: [ 2.6.11.8 ] [ 2.6.25 ] [ 2.6.25.8 ] [ 2.6.31.13 ] Architecture: [ i386 ]
  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.