2 * This file convert raw CCD bitmaps to BMP. Used for thumbnails.
3 * Code probably grafted from Largan Lmini SDK.
11 static void fetchstr(int, int, int);
12 static void dhuf(int);
13 static void YCbCr2RGB(int *YY, int Cb, int Cr, int w, int h);
15 static int _nCcdFactor = 1;
19 static long out_index;
23 static unsigned char BUFF11[14400];
25 static unsigned long in_string;
26 static int pre_y, pre_cb, pre_cr;
30 static const int y_max[10]= {
32 0xe, 0x1e, 0x3e, 0x7e,
36 static const int y_min[10]= {
38 0xe, 0x1e, 0x3e, 0x7e,
42 static const int uv_max[12]= {
44 0xe, 0x1e, 0x3e, 0x7e,
45 0xfe, 0x1fe, 0x3fe, 0x7fe
48 static const int uv_min[12]= {
50 0xe, 0x1e, 0x3e, 0x7e,
51 0xfe, 0x1fe, 0x3fe, 0x7fe
55 /* --------------------------------------------------------------------------- */
56 void largan_ccd2dib(char *pData, char *pDib, long dwDibRowBytes, int nCcdFactor)
61 _nCcdFactor = nCcdFactor;
65 /************************************************/
74 in_string = (*data << 8) | *(data + 1);
79 /******************************************************/
81 for (j = 0; j < 1200; j++)
83 for (i = 0; i < 4; i++)
90 /* printf("Now process the DC term to R G B transfer !\n"); */
92 for (h = 0; h < 30; h++) /* mini size height = 30 x 2 */
94 for (w = 0; w < 40; w++)
96 for (i = 0; i < 6; i++)
98 int k = i + w * 6 + h * 240;
101 YY[i] = y[k] * _nCcdFactor;
103 Cb = y[k] * _nCcdFactor;
105 Cr = y[k] * _nCcdFactor;
108 YCbCr2RGB(YY, Cb, Cr, w, h);
112 for (i = 0, j = 0; i < 60; i++, j += 240)
114 memcpy (pDib, &BUFF11[j], 240);
115 pDib -= dwDibRowBytes;
119 /* --------------------------------------------------------------------------- */
120 static void YCbCr2RGB(int *YY, int Cb, int Cr, int w, int h)
124 double c2 = 1.7753, c3 = -0.0015;
125 double c5 = -0.3443, c6 = -0.7137;
126 double c8 = -0.0009, c9 = 1.4017;
128 for (i = 0; i < 2; i++)
130 int k = 3 * i + w * 6 + h * 480;
132 B = ((double) YY[i] + 128.0 + c2 * Cb + c3 * Cr) + 0.5;
137 BUFF11[k] = (unsigned char) B;
139 G = ((double) YY[i] + 128.0 + c5 * Cb + c6 * Cr) + 0.5;
144 BUFF11[k + 1] = (unsigned char) G;
146 R = ((double) YY[i] + 128.0 + c8 * Cb + c9 * Cr) + 0.5;
151 BUFF11[k + 2] = (unsigned char) R;
154 for (i = 0; i < 2; i++)
156 int k = 3 * i + w * 6 + h * 480 + 240;
158 B = ((double) YY[i + 2] + 128.0 + c2 * Cb + c3 * Cr) + 0.5;
163 BUFF11[k] = (unsigned char) B;
165 G = ((double) YY[i + 2] + 128.0 + c5 * Cb + c6 * Cr) + 0.5;
170 BUFF11[k + 1] = (unsigned char) G;
172 R = ((double) YY[i + 2] + 128.0 + c8 * Cb + c9 * Cr) + 0.5;
177 BUFF11[k + 2] = (unsigned char) R;
181 /* --------------------------------------------------------------------------- */
182 static void dhuf(int flag)
184 int code_leng, val_leng;
191 temp_s = (int) in_string;
196 while (((int)temp_s > y_max[code_leng]) || ((int)temp_s < y_min[code_leng]))
199 temp_s = (int) in_string;
200 temp_s >>= (16 - code_leng);
205 while (((int)temp_s > uv_max[code_leng]) || ((int)temp_s < uv_min[code_leng]))
208 temp_s = (int) in_string;
209 temp_s >>= (16 - code_leng);
213 temp = (int) in_string;
214 temp >>= (16 - code_leng);
217 fetchstr(code_leng, 0, flag);
225 case 2 : val_leng = 1; break;
226 case 3 : val_leng = 2; break;
227 case 4 : val_leng = 3; break;
228 case 5 : val_leng = 4; break;
229 case 6 : val_leng = 5; break;
233 else if (code_leng == 2)
236 val_leng = code_leng + 2;
244 case 0 : val_leng = 0; break;
245 case 1 : val_leng = 1; break;
246 case 2 : val_leng = 2; break;
251 val_leng = code_leng;
254 fetchstr(val_leng, 1, flag);
258 /* --------------------------------------------------------------------------- */
259 static void fetchstr(int shift_bit, int val_flag, int flag)
265 temp_val = (int) in_string;
266 temp_val >>= (16 - shift_bit);
267 in_string <<= shift_bit;
270 if ((val_flag == 1) && (shift_bit == 0))
283 if ((val_flag == 1) && (shift_bit != 0))
285 value1 = (int) temp_val;
287 value2 &= (1 << (shift_bit - 1));
315 value1 &= ((1 << shift_bit) - 1);
341 in_string = in_string | (*(data + count) << (8 - in_bit));