/src/libraw/src/decoders/decoders_dcraw.cpp
Line | Count | Source |
1 | | /* -*- C++ -*- |
2 | | * Copyright 2019-2025 LibRaw LLC (info@libraw.org) |
3 | | * |
4 | | LibRaw uses code from dcraw.c -- Dave Coffin's raw photo decoder, |
5 | | dcraw.c is copyright 1997-2018 by Dave Coffin, dcoffin a cybercom o net. |
6 | | LibRaw do not use RESTRICTED code from dcraw.c |
7 | | |
8 | | LibRaw is free software; you can redistribute it and/or modify |
9 | | it under the terms of the one of two licenses as you choose: |
10 | | |
11 | | 1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1 |
12 | | (See file LICENSE.LGPL provided in LibRaw distribution archive for details). |
13 | | |
14 | | 2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0 |
15 | | (See file LICENSE.CDDL provided in LibRaw distribution archive for details). |
16 | | |
17 | | */ |
18 | | |
19 | | #include "../../internal/dcraw_defs.h" |
20 | | #include "../../internal/libraw_cameraids.h" |
21 | | |
22 | | unsigned LibRaw::getbithuff(int nbits, ushort *huff) |
23 | 298M | { |
24 | | #ifdef LIBRAW_NOTHREADS |
25 | | static unsigned bitbuf = 0; |
26 | | static int vbits = 0, reset = 0; |
27 | | #else |
28 | 298M | #define bitbuf tls->getbits.bitbuf |
29 | 298M | #define vbits tls->getbits.vbits |
30 | 298M | #define reset tls->getbits.reset |
31 | 298M | #endif |
32 | 298M | unsigned c; |
33 | | |
34 | 298M | if (nbits > 25) |
35 | 42.8k | return 0; |
36 | 298M | if (nbits < 0) |
37 | 19.4k | return bitbuf = vbits = reset = 0; |
38 | 298M | if (nbits == 0 || vbits < 0) |
39 | 293M | return 0; |
40 | 6.00M | while (!reset && vbits < nbits && (c = fgetc(ifp)) != (unsigned)EOF && |
41 | 970k | !(reset = zero_after_ff && c == 0xff && fgetc(ifp))) |
42 | 970k | { |
43 | 970k | bitbuf = (bitbuf << 8) + (uchar)c; |
44 | 970k | vbits += 8; |
45 | 970k | } |
46 | 5.03M | c = vbits == 0 ? 0 : bitbuf << (32 - vbits) >> (32 - nbits); |
47 | 5.03M | if (huff) |
48 | 3.91M | { |
49 | 3.91M | vbits -= huff[c] >> 8; |
50 | 3.91M | c = (uchar)huff[c]; |
51 | 3.91M | } |
52 | 1.11M | else |
53 | 1.11M | vbits -= nbits; |
54 | 5.03M | if (vbits < 0) |
55 | 4.75k | derror(); |
56 | 5.03M | return c; |
57 | 298M | #ifndef LIBRAW_NOTHREADS |
58 | 298M | #undef bitbuf |
59 | 298M | #undef vbits |
60 | 298M | #undef reset |
61 | 298M | #endif |
62 | 298M | } |
63 | | |
64 | | /* |
65 | | Construct a decode tree according the specification in *source. |
66 | | The first 16 bytes specify how many codes should be 1-bit, 2-bit |
67 | | 3-bit, etc. Bytes after that are the leaf values. |
68 | | |
69 | | For example, if the source is |
70 | | |
71 | | { 0,1,4,2,3,1,2,0,0,0,0,0,0,0,0,0, |
72 | | 0x04,0x03,0x05,0x06,0x02,0x07,0x01,0x08,0x09,0x00,0x0a,0x0b,0xff }, |
73 | | |
74 | | then the code is |
75 | | |
76 | | 00 0x04 |
77 | | 010 0x03 |
78 | | 011 0x05 |
79 | | 100 0x06 |
80 | | 101 0x02 |
81 | | 1100 0x07 |
82 | | 1101 0x01 |
83 | | 11100 0x08 |
84 | | 11101 0x09 |
85 | | 11110 0x00 |
86 | | 111110 0x0a |
87 | | 1111110 0x0b |
88 | | 1111111 0xff |
89 | | */ |
90 | | ushort *LibRaw::make_decoder_ref(const uchar **source) |
91 | 610 | { |
92 | 610 | int max, len, h, i, j; |
93 | 610 | const uchar *count; |
94 | 610 | ushort *huff; |
95 | | |
96 | 610 | count = (*source += 16) - 17; |
97 | 5.30k | for (max = 16; max && !count[max]; max--) |
98 | 4.69k | ; |
99 | 610 | huff = (ushort *)calloc(1 + (1 << max), sizeof *huff); |
100 | 610 | huff[0] = max; |
101 | 5.67k | for (h = len = 1; len <= max; len++) |
102 | 21.0k | for (i = 0; i < count[len]; i++, ++*source) |
103 | 4.23M | for (j = 0; j < 1 << (max - len); j++) |
104 | 4.21M | if (h <= 1 << max) |
105 | 4.21M | huff[h++] = len << 8 | **source; |
106 | 610 | return huff; |
107 | 610 | } |
108 | | |
109 | | ushort *LibRaw::make_decoder(const uchar *source) |
110 | 610 | { |
111 | 610 | return make_decoder_ref(&source); |
112 | 610 | } |
113 | | |
114 | | void LibRaw::crw_init_tables(unsigned table, ushort *huff[2]) |
115 | 62 | { |
116 | 62 | static const uchar first_tree[3][29] = { |
117 | 62 | {0, 1, 4, 2, 3, 1, 2, 0, 0, 0, |
118 | 62 | 0, 0, 0, 0, 0, 0, 0x04, 0x03, 0x05, 0x06, |
119 | 62 | 0x02, 0x07, 0x01, 0x08, 0x09, 0x00, 0x0a, 0x0b, 0xff}, |
120 | 62 | {0, 2, 2, 3, 1, 1, 1, 1, 2, 0, |
121 | 62 | 0, 0, 0, 0, 0, 0, 0x03, 0x02, 0x04, 0x01, |
122 | 62 | 0x05, 0x00, 0x06, 0x07, 0x09, 0x08, 0x0a, 0x0b, 0xff}, |
123 | 62 | {0, 0, 6, 3, 1, 1, 2, 0, 0, 0, |
124 | 62 | 0, 0, 0, 0, 0, 0, 0x06, 0x05, 0x07, 0x04, |
125 | 62 | 0x08, 0x03, 0x09, 0x02, 0x00, 0x0a, 0x01, 0x0b, 0xff}, |
126 | 62 | }; |
127 | 62 | static const uchar second_tree[3][180] = { |
128 | 62 | {0, 2, 2, 2, 1, 4, 2, 1, 2, 5, 1, 1, |
129 | 62 | 0, 0, 0, 139, 0x03, 0x04, 0x02, 0x05, 0x01, 0x06, 0x07, 0x08, |
130 | 62 | 0x12, 0x13, 0x11, 0x14, 0x09, 0x15, 0x22, 0x00, 0x21, 0x16, 0x0a, 0xf0, |
131 | 62 | 0x23, 0x17, 0x24, 0x31, 0x32, 0x18, 0x19, 0x33, 0x25, 0x41, 0x34, 0x42, |
132 | 62 | 0x35, 0x51, 0x36, 0x37, 0x38, 0x29, 0x79, 0x26, 0x1a, 0x39, 0x56, 0x57, |
133 | 62 | 0x28, 0x27, 0x52, 0x55, 0x58, 0x43, 0x76, 0x59, 0x77, 0x54, 0x61, 0xf9, |
134 | 62 | 0x71, 0x78, 0x75, 0x96, 0x97, 0x49, 0xb7, 0x53, 0xd7, 0x74, 0xb6, 0x98, |
135 | 62 | 0x47, 0x48, 0x95, 0x69, 0x99, 0x91, 0xfa, 0xb8, 0x68, 0xb5, 0xb9, 0xd6, |
136 | 62 | 0xf7, 0xd8, 0x67, 0x46, 0x45, 0x94, 0x89, 0xf8, 0x81, 0xd5, 0xf6, 0xb4, |
137 | 62 | 0x88, 0xb1, 0x2a, 0x44, 0x72, 0xd9, 0x87, 0x66, 0xd4, 0xf5, 0x3a, 0xa7, |
138 | 62 | 0x73, 0xa9, 0xa8, 0x86, 0x62, 0xc7, 0x65, 0xc8, 0xc9, 0xa1, 0xf4, 0xd1, |
139 | 62 | 0xe9, 0x5a, 0x92, 0x85, 0xa6, 0xe7, 0x93, 0xe8, 0xc1, 0xc6, 0x7a, 0x64, |
140 | 62 | 0xe1, 0x4a, 0x6a, 0xe6, 0xb3, 0xf1, 0xd3, 0xa5, 0x8a, 0xb2, 0x9a, 0xba, |
141 | 62 | 0x84, 0xa4, 0x63, 0xe5, 0xc5, 0xf3, 0xd2, 0xc4, 0x82, 0xaa, 0xda, 0xe4, |
142 | 62 | 0xf2, 0xca, 0x83, 0xa3, 0xa2, 0xc3, 0xea, 0xc2, 0xe2, 0xe3, 0xff, 0xff}, |
143 | 62 | {0, 2, 2, 1, 4, 1, 4, 1, 3, 3, 1, 0, |
144 | 62 | 0, 0, 0, 140, 0x02, 0x03, 0x01, 0x04, 0x05, 0x12, 0x11, 0x06, |
145 | 62 | 0x13, 0x07, 0x08, 0x14, 0x22, 0x09, 0x21, 0x00, 0x23, 0x15, 0x31, 0x32, |
146 | 62 | 0x0a, 0x16, 0xf0, 0x24, 0x33, 0x41, 0x42, 0x19, 0x17, 0x25, 0x18, 0x51, |
147 | 62 | 0x34, 0x43, 0x52, 0x29, 0x35, 0x61, 0x39, 0x71, 0x62, 0x36, 0x53, 0x26, |
148 | 62 | 0x38, 0x1a, 0x37, 0x81, 0x27, 0x91, 0x79, 0x55, 0x45, 0x28, 0x72, 0x59, |
149 | 62 | 0xa1, 0xb1, 0x44, 0x69, 0x54, 0x58, 0xd1, 0xfa, 0x57, 0xe1, 0xf1, 0xb9, |
150 | 62 | 0x49, 0x47, 0x63, 0x6a, 0xf9, 0x56, 0x46, 0xa8, 0x2a, 0x4a, 0x78, 0x99, |
151 | 62 | 0x3a, 0x75, 0x74, 0x86, 0x65, 0xc1, 0x76, 0xb6, 0x96, 0xd6, 0x89, 0x85, |
152 | 62 | 0xc9, 0xf5, 0x95, 0xb4, 0xc7, 0xf7, 0x8a, 0x97, 0xb8, 0x73, 0xb7, 0xd8, |
153 | 62 | 0xd9, 0x87, 0xa7, 0x7a, 0x48, 0x82, 0x84, 0xea, 0xf4, 0xa6, 0xc5, 0x5a, |
154 | 62 | 0x94, 0xa4, 0xc6, 0x92, 0xc3, 0x68, 0xb5, 0xc8, 0xe4, 0xe5, 0xe6, 0xe9, |
155 | 62 | 0xa2, 0xa3, 0xe3, 0xc2, 0x66, 0x67, 0x93, 0xaa, 0xd4, 0xd5, 0xe7, 0xf8, |
156 | 62 | 0x88, 0x9a, 0xd7, 0x77, 0xc4, 0x64, 0xe2, 0x98, 0xa5, 0xca, 0xda, 0xe8, |
157 | 62 | 0xf3, 0xf6, 0xa9, 0xb2, 0xb3, 0xf2, 0xd2, 0x83, 0xba, 0xd3, 0xff, 0xff}, |
158 | 62 | {0, 0, 6, 2, 1, 3, 3, 2, 5, 1, 2, 2, |
159 | 62 | 8, 10, 0, 117, 0x04, 0x05, 0x03, 0x06, 0x02, 0x07, 0x01, 0x08, |
160 | 62 | 0x09, 0x12, 0x13, 0x14, 0x11, 0x15, 0x0a, 0x16, 0x17, 0xf0, 0x00, 0x22, |
161 | 62 | 0x21, 0x18, 0x23, 0x19, 0x24, 0x32, 0x31, 0x25, 0x33, 0x38, 0x37, 0x34, |
162 | 62 | 0x35, 0x36, 0x39, 0x79, 0x57, 0x58, 0x59, 0x28, 0x56, 0x78, 0x27, 0x41, |
163 | 62 | 0x29, 0x77, 0x26, 0x42, 0x76, 0x99, 0x1a, 0x55, 0x98, 0x97, 0xf9, 0x48, |
164 | 62 | 0x54, 0x96, 0x89, 0x47, 0xb7, 0x49, 0xfa, 0x75, 0x68, 0xb6, 0x67, 0x69, |
165 | 62 | 0xb9, 0xb8, 0xd8, 0x52, 0xd7, 0x88, 0xb5, 0x74, 0x51, 0x46, 0xd9, 0xf8, |
166 | 62 | 0x3a, 0xd6, 0x87, 0x45, 0x7a, 0x95, 0xd5, 0xf6, 0x86, 0xb4, 0xa9, 0x94, |
167 | 62 | 0x53, 0x2a, 0xa8, 0x43, 0xf5, 0xf7, 0xd4, 0x66, 0xa7, 0x5a, 0x44, 0x8a, |
168 | 62 | 0xc9, 0xe8, 0xc8, 0xe7, 0x9a, 0x6a, 0x73, 0x4a, 0x61, 0xc7, 0xf4, 0xc6, |
169 | 62 | 0x65, 0xe9, 0x72, 0xe6, 0x71, 0x91, 0x93, 0xa6, 0xda, 0x92, 0x85, 0x62, |
170 | 62 | 0xf3, 0xc5, 0xb2, 0xa4, 0x84, 0xba, 0x64, 0xa5, 0xb3, 0xd2, 0x81, 0xe5, |
171 | 62 | 0xd3, 0xaa, 0xc4, 0xca, 0xf2, 0xb1, 0xe4, 0xd1, 0x83, 0x63, 0xea, 0xc3, |
172 | 62 | 0xe2, 0x82, 0xf1, 0xa3, 0xc2, 0xa1, 0xc1, 0xe3, 0xa2, 0xe1, 0xff, 0xff}}; |
173 | 62 | if (table > 2) |
174 | 0 | table = 2; |
175 | 62 | huff[0] = make_decoder(first_tree[table]); |
176 | 62 | huff[1] = make_decoder(second_tree[table]); |
177 | 62 | } |
178 | | |
179 | | /* |
180 | | Return 0 if the image starts with compressed data, |
181 | | 1 if it starts with uncompressed low-order bits. |
182 | | |
183 | | In Canon compressed data, 0xff is always followed by 0x00. |
184 | | */ |
185 | | int LibRaw::canon_has_lowbits() |
186 | 62 | { |
187 | 62 | uchar test[0x4000]; |
188 | 62 | int ret = 1, i; |
189 | | |
190 | 62 | fseek(ifp, 0, SEEK_SET); |
191 | 62 | fread(test, 1, sizeof test, ifp); |
192 | 88.0k | for (i = 540; i < int(sizeof test - 1); i++) |
193 | 88.0k | if (test[i] == 0xff) |
194 | 569 | { |
195 | 569 | if (test[i + 1]) |
196 | 62 | return 1; |
197 | 507 | ret = 0; |
198 | 507 | } |
199 | 0 | return ret; |
200 | 62 | } |
201 | | |
202 | | void LibRaw::canon_load_raw() |
203 | 62 | { |
204 | 62 | ushort *pixel, *prow, *huff[2]; |
205 | 62 | int nblocks, lowbits, i, c, row, r, val; |
206 | 62 | INT64 save; |
207 | 62 | int block, diffbuf[64], leaf, len, diff, carry = 0, pnum = 0, base[2]; |
208 | | |
209 | 62 | crw_init_tables(tiff_compress, huff); |
210 | 62 | lowbits = canon_has_lowbits(); |
211 | 62 | if (!lowbits) |
212 | 0 | maximum = 0x3ff; |
213 | 62 | fseek(ifp, 540 + lowbits * raw_height * raw_width / 4, SEEK_SET); |
214 | 62 | zero_after_ff = 1; |
215 | 62 | getbits(-1); |
216 | 62 | try |
217 | 62 | { |
218 | 266 | for (row = 0; row < raw_height; row += 8) |
219 | 204 | { |
220 | 204 | checkCancel(); |
221 | 204 | pixel = raw_image + row * raw_width; |
222 | 204 | nblocks = MIN(8, raw_height - row) * raw_width >> 6; |
223 | 634 | for (block = 0; block < nblocks; block++) |
224 | 430 | { |
225 | 430 | memset(diffbuf, 0, sizeof diffbuf); |
226 | 3.39k | for (i = 0; i < 64; i++) |
227 | 3.31k | { |
228 | 3.31k | leaf = gethuff(huff[i > 0]); |
229 | 3.31k | if (leaf == 0 && i) |
230 | 358 | break; |
231 | 2.96k | if (leaf == 0xff) |
232 | 0 | continue; |
233 | 2.96k | i += leaf >> 4; |
234 | 2.96k | len = leaf & 15; |
235 | 2.96k | if (len == 0) |
236 | 341 | continue; |
237 | 2.62k | diff = getbits(len); |
238 | 2.62k | if ((diff & (1 << (len - 1))) == 0) |
239 | 1.59k | diff -= (1 << len) - 1; |
240 | 2.62k | if (i < 64) |
241 | 2.57k | diffbuf[i] = diff; |
242 | 2.62k | } |
243 | 430 | diffbuf[0] += carry; |
244 | 430 | carry = diffbuf[0]; |
245 | 25.5k | for (i = 0; i < 64; i++) |
246 | 25.1k | { |
247 | 25.1k | if (pnum++ % raw_width == 0) |
248 | 926 | base[0] = base[1] = 512; |
249 | 25.1k | if ((pixel[(block << 6) + i] = base[i & 1] += diffbuf[i]) >> 10) |
250 | 988 | derror(); |
251 | 25.1k | } |
252 | 430 | } |
253 | 204 | if (lowbits) |
254 | 166 | { |
255 | 166 | save = ftell(ifp); |
256 | 166 | fseek(ifp, 26 + row * raw_width / 4, SEEK_SET); |
257 | 9.01k | for (prow = pixel, i = 0; i < raw_width * 2; i++) |
258 | 8.84k | { |
259 | 8.84k | c = fgetc(ifp); |
260 | 44.2k | for (r = 0; r < 8; r += 2, prow++) |
261 | 35.3k | { |
262 | 35.3k | val = (*prow << 2) + ((c >> r) & 3); |
263 | 35.3k | if (raw_width == 2672 && val < 512) |
264 | 0 | val += 2; |
265 | 35.3k | *prow = val; |
266 | 35.3k | } |
267 | 8.84k | } |
268 | 166 | fseek(ifp, save, SEEK_SET); |
269 | 166 | } |
270 | 204 | } |
271 | 62 | } |
272 | 62 | catch (...) |
273 | 62 | { |
274 | 76 | FORC(2) free(huff[c]); |
275 | 38 | throw; |
276 | 38 | } |
277 | 48 | FORC(2) free(huff[c]); |
278 | 24 | } |
279 | | |
280 | | int LibRaw::ljpeg_start(struct jhead *jh, int info_only) |
281 | 15.8k | { |
282 | 15.8k | ushort c, tag, len; |
283 | 15.8k | int cnt = 0; |
284 | 15.8k | std::vector<uchar> data_buffer(0x10000); |
285 | 15.8k | uchar* data = &data_buffer[0]; |
286 | 15.8k | const uchar *dp; |
287 | | |
288 | 15.8k | memset(jh, 0, sizeof *jh); |
289 | 15.8k | jh->restart = INT_MAX; |
290 | 15.8k | if (fread(data, 2, 1, ifp) != 1 || data[1] != 0xd8) |
291 | 9.90k | return 0; |
292 | 5.94k | do |
293 | 12.2k | { |
294 | 12.2k | if (feof(ifp)) |
295 | 17 | return 0; |
296 | 12.2k | if (cnt++ > 1024) |
297 | 0 | return 0; // 1024 tags limit |
298 | 12.2k | if (fread(data, 2, 2, ifp) != 2) |
299 | 12 | return 0; |
300 | 12.2k | tag = data[0] << 8 | data[1]; |
301 | 12.2k | len = (data[2] << 8 | data[3]) - 2; |
302 | 12.2k | if (tag <= 0xff00) |
303 | 901 | return 0; |
304 | 11.3k | if (fread(data, 1, len, ifp) != len) |
305 | 286 | return 0; |
306 | 11.0k | switch (tag) |
307 | 11.0k | { |
308 | 911 | case 0xffc3: // start of frame; lossless, Huffman |
309 | 911 | jh->sraw = ((data[7] >> 4) * (data[7] & 15) - 1) & 3; |
310 | 1.49k | case 0xffc1: |
311 | 4.98k | case 0xffc0: |
312 | 4.98k | jh->algo = tag & 0xff; |
313 | 4.98k | jh->bits = data[0]; |
314 | 4.98k | jh->high = data[1] << 8 | data[2]; |
315 | 4.98k | jh->wide = data[3] << 8 | data[4]; |
316 | 4.98k | jh->clrs = data[5] + jh->sraw; |
317 | 4.98k | if (len == 9 && !dng_version) |
318 | 3.25k | getc(ifp); |
319 | 4.98k | break; |
320 | 89 | case 0xffc4: // define Huffman tables |
321 | 89 | if (info_only) |
322 | 89 | break; |
323 | 0 | for (dp = data; dp < data + len && !((c = *dp++) & -20);) |
324 | 0 | jh->free[c] = jh->huff[c] = make_decoder_ref(&dp); |
325 | 0 | break; |
326 | 4.73k | case 0xffda: // start of scan |
327 | 4.73k | jh->psv = data[1 + data[0] * 2]; |
328 | 4.73k | jh->bits -= data[3 + data[0] * 2] & 15; |
329 | 4.73k | break; |
330 | 235 | case 0xffdb: |
331 | 15.0k | FORC(64) jh->quant[c] = data[c * 2 + 1] << 8 | data[c * 2 + 2]; |
332 | 235 | break; |
333 | 571 | case 0xffdd: |
334 | 571 | jh->restart = data[0] << 8 | data[1]; |
335 | 11.0k | } |
336 | 11.0k | } while (tag != 0xffda); |
337 | 4.73k | if (jh->bits > 16 || jh->clrs > 6 || !jh->bits || !jh->high || !jh->wide || |
338 | 3.86k | !jh->clrs) |
339 | 949 | return 0; |
340 | 3.78k | if (info_only) |
341 | 3.77k | return 1; |
342 | 7 | if (!jh->huff[0]) |
343 | 7 | return 0; |
344 | 0 | FORC(19) if (!jh->huff[c + 1]) jh->huff[c + 1] = jh->huff[c]; |
345 | 0 | if (jh->sraw) |
346 | 0 | { |
347 | 0 | FORC(4) jh->huff[2 + c] = jh->huff[1]; |
348 | 0 | FORC(jh->sraw) jh->huff[1 + c] = jh->huff[0]; |
349 | 0 | } |
350 | 0 | jh->row = (ushort *)calloc(jh->wide * jh->clrs, 16); |
351 | 0 | return zero_after_ff = 1; |
352 | 7 | } |
353 | | |
354 | | void LibRaw::ljpeg_end(struct jhead *jh) |
355 | 0 | { |
356 | 0 | int c; |
357 | 0 | FORC4 if (jh->free[c]) free(jh->free[c]); |
358 | 0 | free(jh->row); |
359 | 0 | } |
360 | | |
361 | | int LibRaw::ljpeg_diff(ushort *huff) |
362 | 145M | { |
363 | 145M | int len, diff; |
364 | 145M | if (!huff) |
365 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
366 | | |
367 | 145M | len = gethuff(huff); |
368 | 145M | if (len == 16 && (!dng_version || dng_version >= 0x1010000)) |
369 | 298 | return -32768; |
370 | 145M | diff = getbits(len); |
371 | | |
372 | | |
373 | 145M | if ((diff & (1 << (len - 1))) == 0) |
374 | 144M | diff -= (1 << len) - 1; |
375 | 145M | return diff; |
376 | 145M | } |
377 | | |
378 | | ushort *LibRaw::ljpeg_row(int jrow, struct jhead *jh) |
379 | 0 | { |
380 | 0 | int col, c, diff, pred, spred = 0; |
381 | 0 | ushort mark = 0, *row[3]; |
382 | | |
383 | | // Use the optimized, unrolled version if possible. |
384 | 0 | if (!jh->sraw) |
385 | 0 | return ljpeg_row_unrolled(jrow, jh); |
386 | | |
387 | 0 | if (jh->restart != 0 && jrow * jh->wide % jh->restart == 0) |
388 | 0 | { |
389 | 0 | FORC(6) jh->vpred[c] = 1 << (jh->bits - 1); |
390 | 0 | if (jrow) |
391 | 0 | { |
392 | 0 | fseek(ifp, -2, SEEK_CUR); |
393 | 0 | do |
394 | 0 | mark = (mark << 8) + (c = fgetc(ifp)); |
395 | 0 | while (c != EOF && mark >> 4 != 0xffd); |
396 | 0 | } |
397 | 0 | getbits(-1); |
398 | 0 | } |
399 | 0 | FORC3 row[c] = jh->row + jh->wide * jh->clrs * ((jrow + c) & 1); |
400 | 0 | for (col = 0; col < jh->wide; col++) |
401 | 0 | FORC(jh->clrs) |
402 | 0 | { |
403 | 0 | diff = ljpeg_diff(jh->huff[c]); |
404 | 0 | if (jh->sraw && c <= jh->sraw && (col | c)) |
405 | 0 | pred = spred; |
406 | 0 | else if (col) |
407 | 0 | pred = row[0][-jh->clrs]; |
408 | 0 | else |
409 | 0 | pred = (jh->vpred[c] += diff) - diff; |
410 | 0 | if (jrow && col) |
411 | 0 | switch (jh->psv) |
412 | 0 | { |
413 | 0 | case 1: |
414 | 0 | break; |
415 | 0 | case 2: |
416 | 0 | pred = row[1][0]; |
417 | 0 | break; |
418 | 0 | case 3: |
419 | 0 | pred = row[1][-jh->clrs]; |
420 | 0 | break; |
421 | 0 | case 4: |
422 | 0 | pred = pred + row[1][0] - row[1][-jh->clrs]; |
423 | 0 | break; |
424 | 0 | case 5: |
425 | 0 | pred = pred + ((row[1][0] - row[1][-jh->clrs]) >> 1); |
426 | 0 | break; |
427 | 0 | case 6: |
428 | 0 | pred = row[1][0] + ((pred - row[1][-jh->clrs]) >> 1); |
429 | 0 | break; |
430 | 0 | case 7: |
431 | 0 | pred = (pred + row[1][0]) >> 1; |
432 | 0 | break; |
433 | 0 | default: |
434 | 0 | pred = 0; |
435 | 0 | } |
436 | 0 | if ((**row = pred + diff) >> jh->bits) |
437 | 0 | if(!(load_flags & 512)) |
438 | 0 | derror(); |
439 | 0 | if (c <= jh->sraw) |
440 | 0 | spred = **row; |
441 | 0 | row[0]++; |
442 | 0 | row[1]++; |
443 | 0 | } |
444 | 0 | return row[2]; |
445 | 0 | } |
446 | | |
447 | | ushort *LibRaw::ljpeg_row_unrolled(int jrow, struct jhead *jh) |
448 | 0 | { |
449 | 0 | int col, c, diff, pred; |
450 | 0 | ushort mark = 0, *row[3]; |
451 | |
|
452 | 0 | if (jh->restart != 0 && jrow * jh->wide % jh->restart == 0) |
453 | 0 | { |
454 | 0 | FORC(6) jh->vpred[c] = 1 << (jh->bits - 1); |
455 | 0 | if (jrow) |
456 | 0 | { |
457 | 0 | fseek(ifp, -2, SEEK_CUR); |
458 | 0 | do |
459 | 0 | mark = (mark << 8) + (c = fgetc(ifp)); |
460 | 0 | while (c != EOF && mark >> 4 != 0xffd); |
461 | 0 | } |
462 | 0 | getbits(-1); |
463 | 0 | } |
464 | 0 | FORC3 row[c] = jh->row + jh->wide * jh->clrs * ((jrow + c) & 1); |
465 | | |
466 | | // The first column uses one particular predictor. |
467 | 0 | FORC(jh->clrs) |
468 | 0 | { |
469 | 0 | diff = ljpeg_diff(jh->huff[c]); |
470 | 0 | pred = (jh->vpred[c] += diff) - diff; |
471 | 0 | if ((**row = pred + diff) >> jh->bits) |
472 | 0 | derror(); |
473 | 0 | row[0]++; |
474 | 0 | row[1]++; |
475 | 0 | } |
476 | |
|
477 | 0 | if (!jrow) |
478 | 0 | { |
479 | 0 | for (col = 1; col < jh->wide; col++) |
480 | 0 | FORC(jh->clrs) |
481 | 0 | { |
482 | 0 | diff = ljpeg_diff(jh->huff[c]); |
483 | 0 | pred = row[0][-jh->clrs]; |
484 | 0 | if ((**row = pred + diff) >> jh->bits) |
485 | 0 | derror(); |
486 | 0 | row[0]++; |
487 | 0 | row[1]++; |
488 | 0 | } |
489 | 0 | } |
490 | 0 | else if (jh->psv == 1) |
491 | 0 | { |
492 | 0 | for (col = 1; col < jh->wide; col++) |
493 | 0 | FORC(jh->clrs) |
494 | 0 | { |
495 | 0 | diff = ljpeg_diff(jh->huff[c]); |
496 | 0 | pred = row[0][-jh->clrs]; |
497 | 0 | if ((**row = pred + diff) >> jh->bits) |
498 | 0 | derror(); |
499 | 0 | row[0]++; |
500 | 0 | } |
501 | 0 | } |
502 | 0 | else |
503 | 0 | { |
504 | 0 | for (col = 1; col < jh->wide; col++) |
505 | 0 | FORC(jh->clrs) |
506 | 0 | { |
507 | 0 | diff = ljpeg_diff(jh->huff[c]); |
508 | 0 | pred = row[0][-jh->clrs]; |
509 | 0 | switch (jh->psv) |
510 | 0 | { |
511 | 0 | case 1: |
512 | 0 | break; |
513 | 0 | case 2: |
514 | 0 | pred = row[1][0]; |
515 | 0 | break; |
516 | 0 | case 3: |
517 | 0 | pred = row[1][-jh->clrs]; |
518 | 0 | break; |
519 | 0 | case 4: |
520 | 0 | pred = pred + row[1][0] - row[1][-jh->clrs]; |
521 | 0 | break; |
522 | 0 | case 5: |
523 | 0 | pred = pred + ((row[1][0] - row[1][-jh->clrs]) >> 1); |
524 | 0 | break; |
525 | 0 | case 6: |
526 | 0 | pred = row[1][0] + ((pred - row[1][-jh->clrs]) >> 1); |
527 | 0 | break; |
528 | 0 | case 7: |
529 | 0 | pred = (pred + row[1][0]) >> 1; |
530 | 0 | break; |
531 | 0 | default: |
532 | 0 | pred = 0; |
533 | 0 | } |
534 | 0 | if ((**row = pred + diff) >> jh->bits) |
535 | 0 | derror(); |
536 | 0 | row[0]++; |
537 | 0 | row[1]++; |
538 | 0 | } |
539 | 0 | } |
540 | 0 | return row[2]; |
541 | 0 | } |
542 | | |
543 | | void LibRaw::lossless_jpeg_load_raw() |
544 | 12 | { |
545 | 12 | int jwide, jhigh, jrow, jcol, val, jidx, i, j, row = 0, col = 0; |
546 | 12 | struct jhead jh; |
547 | 12 | ushort *rp; |
548 | | |
549 | 12 | if (!ljpeg_start(&jh, 0)) |
550 | 12 | return; |
551 | | |
552 | 0 | if (jh.wide < 1 || jh.high < 1 || jh.clrs < 1 || jh.bits < 1) |
553 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
554 | | |
555 | 0 | if(cr2_slice[0] && !cr2_slice[1]) |
556 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
557 | | |
558 | 0 | jwide = jh.wide * jh.clrs; |
559 | 0 | jhigh = jh.high; |
560 | 0 | if (jh.clrs == 4 && jwide >= raw_width * 2) |
561 | 0 | jhigh *= 2; |
562 | |
|
563 | 0 | try |
564 | 0 | { |
565 | 0 | for (jrow = 0; jrow < jh.high; jrow++) |
566 | 0 | { |
567 | 0 | checkCancel(); |
568 | 0 | rp = ljpeg_row(jrow, &jh); |
569 | 0 | if (load_flags & 1) |
570 | 0 | row = jrow & 1 ? height - 1 - jrow / 2 : jrow / 2; |
571 | 0 | for (jcol = 0; jcol < jwide; jcol++) |
572 | 0 | { |
573 | 0 | val = curve[*rp++]; |
574 | 0 | if (cr2_slice[0]) |
575 | 0 | { |
576 | 0 | jidx = jrow * jwide + jcol; |
577 | 0 | i = jidx / (cr2_slice[1] * raw_height); |
578 | 0 | if ((j = i >= cr2_slice[0])) |
579 | 0 | i = cr2_slice[0]; |
580 | 0 | if(!cr2_slice[1+j]) |
581 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
582 | | |
583 | 0 | jidx -= i * (cr2_slice[1] * raw_height); |
584 | 0 | row = jidx / cr2_slice[1 + j]; |
585 | 0 | col = jidx % cr2_slice[1 + j] + i * cr2_slice[1]; |
586 | 0 | } |
587 | 0 | if (raw_width == 3984 && (col -= 2) < 0) |
588 | 0 | col += (row--, raw_width); |
589 | 0 | if (row > raw_height) |
590 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
591 | 0 | if ((unsigned)row < raw_height) |
592 | 0 | RAW(row, col) = val; |
593 | 0 | if (++col >= raw_width) |
594 | 0 | col = (row++, 0); |
595 | 0 | } |
596 | 0 | } |
597 | 0 | } |
598 | 0 | catch (...) |
599 | 0 | { |
600 | 0 | ljpeg_end(&jh); |
601 | 0 | throw; |
602 | 0 | } |
603 | 0 | ljpeg_end(&jh); |
604 | 0 | } |
605 | | |
606 | | void LibRaw::canon_sraw_load_raw() |
607 | 11 | { |
608 | 11 | struct jhead jh; |
609 | 11 | short *rp = 0, (*ip)[4]; |
610 | 11 | int jwide, slice, scol, ecol, row, col, jrow = 0, jcol = 0, pix[3], c; |
611 | 11 | int v[3] = {0, 0, 0}, ver, hue; |
612 | 11 | int saved_w = width, saved_h = height; |
613 | 11 | char *cp; |
614 | | |
615 | 11 | if(!image) |
616 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
617 | | |
618 | 11 | if (!ljpeg_start(&jh, 0) || jh.clrs < 4) |
619 | 11 | return; |
620 | 0 | jwide = (jh.wide >>= 1) * jh.clrs; |
621 | |
|
622 | 0 | if (jwide < 32 || jwide > 65535) |
623 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
624 | | |
625 | 0 | if (load_flags & 256) |
626 | 0 | { |
627 | 0 | width = raw_width; |
628 | 0 | height = raw_height; |
629 | 0 | } |
630 | |
|
631 | 0 | try |
632 | 0 | { |
633 | 0 | for (ecol = slice = 0; slice <= cr2_slice[0]; slice++) |
634 | 0 | { |
635 | 0 | scol = ecol; |
636 | 0 | ecol += cr2_slice[1] * 2 / jh.clrs; |
637 | 0 | if (!cr2_slice[0] || ecol > raw_width - 1) |
638 | 0 | ecol = raw_width & -2; |
639 | 0 | for (row = 0; row < height; row += (jh.clrs >> 1) - 1) |
640 | 0 | { |
641 | 0 | checkCancel(); |
642 | 0 | ip = (short(*)[4])image + row * width; |
643 | 0 | for (col = scol; col < ecol; col += 2, jcol += jh.clrs) |
644 | 0 | { |
645 | 0 | if ((jcol %= jwide) == 0) |
646 | 0 | rp = (short *)ljpeg_row(jrow++, &jh); |
647 | 0 | if (col >= width) |
648 | 0 | continue; |
649 | 0 | if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE) |
650 | 0 | { |
651 | 0 | FORC(jh.clrs - 2) |
652 | 0 | { |
653 | 0 | ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c]; |
654 | 0 | ip[col + (c >> 1) * width + (c & 1)][1] = |
655 | 0 | ip[col + (c >> 1) * width + (c & 1)][2] = 8192; |
656 | 0 | } |
657 | 0 | ip[col][1] = rp[jcol + jh.clrs - 2] - 8192; |
658 | 0 | ip[col][2] = rp[jcol + jh.clrs - 1] - 8192; |
659 | 0 | } |
660 | 0 | else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_RGB) |
661 | 0 | { |
662 | 0 | FORC(jh.clrs - 2) |
663 | 0 | ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c]; |
664 | 0 | ip[col][1] = rp[jcol + jh.clrs - 2] - 8192; |
665 | 0 | ip[col][2] = rp[jcol + jh.clrs - 1] - 8192; |
666 | 0 | } |
667 | 0 | else |
668 | 0 | { |
669 | 0 | FORC(jh.clrs - 2) |
670 | 0 | ip[col + (c >> 1) * width + (c & 1)][0] = rp[jcol + c]; |
671 | 0 | ip[col][1] = rp[jcol + jh.clrs - 2] - 16384; |
672 | 0 | ip[col][2] = rp[jcol + jh.clrs - 1] - 16384; |
673 | 0 | } |
674 | 0 | } |
675 | 0 | } |
676 | 0 | } |
677 | 0 | } |
678 | 0 | catch (...) |
679 | 0 | { |
680 | 0 | ljpeg_end(&jh); |
681 | 0 | throw; |
682 | 0 | } |
683 | | |
684 | 0 | if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_INTERPOLATE) |
685 | 0 | { |
686 | 0 | ljpeg_end(&jh); |
687 | 0 | maximum = 0x3fff; |
688 | 0 | height = saved_h; |
689 | 0 | width = saved_w; |
690 | 0 | return; |
691 | 0 | } |
692 | | |
693 | 0 | try |
694 | 0 | { |
695 | 0 | for (cp = model2; *cp && !isdigit(*cp); cp++) |
696 | 0 | ; |
697 | 0 | sscanf(cp, "%d.%d.%d", v, v + 1, v + 2); |
698 | 0 | ver = (v[0] * 1000 + v[1]) * 1000 + v[2]; |
699 | 0 | hue = (jh.sraw + 1) << 2; |
700 | 0 | if (unique_id >= 0x80000281ULL || |
701 | 0 | (unique_id == 0x80000218ULL && ver > 1000006)) |
702 | 0 | hue = jh.sraw << 1; |
703 | 0 | ip = (short(*)[4])image; |
704 | 0 | rp = ip[0]; |
705 | 0 | for (row = 0; row < height; row++, ip += width) |
706 | 0 | { |
707 | 0 | checkCancel(); |
708 | 0 | if (row & (jh.sraw >> 1)) |
709 | 0 | { |
710 | 0 | for (col = 0; col < width; col += 2) |
711 | 0 | for (c = 1; c < 3; c++) |
712 | 0 | if (row == height - 1) |
713 | 0 | { |
714 | 0 | ip[col][c] = ip[col - width][c]; |
715 | 0 | } |
716 | 0 | else |
717 | 0 | { |
718 | 0 | ip[col][c] = (ip[col - width][c] + ip[col + width][c] + 1) >> 1; |
719 | 0 | } |
720 | 0 | } |
721 | 0 | for (col = 1; col < width; col += 2) |
722 | 0 | for (c = 1; c < 3; c++) |
723 | 0 | if (col == width - 1) |
724 | 0 | ip[col][c] = ip[col - 1][c]; |
725 | 0 | else |
726 | 0 | ip[col][c] = (ip[col - 1][c] + ip[col + 1][c] + 1) >> 1; |
727 | 0 | } |
728 | 0 | if (!(imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SRAW_NO_RGB)) |
729 | 0 | for (; rp < ip[0]; rp += 4) |
730 | 0 | { |
731 | 0 | checkCancel(); |
732 | 0 | if ((unique_id == CanonID_EOS_5D_Mark_II) || |
733 | 0 | (unique_id == CanonID_EOS_7D) || |
734 | 0 | (unique_id == CanonID_EOS_50D) || |
735 | 0 | (unique_id == CanonID_EOS_1D_Mark_IV) || |
736 | 0 | (unique_id == CanonID_EOS_60D)) |
737 | 0 | { |
738 | 0 | rp[1] = (rp[1] << 2) + hue; |
739 | 0 | rp[2] = (rp[2] << 2) + hue; |
740 | 0 | pix[0] = rp[0] + ((50 * rp[1] + 22929 * rp[2]) >> 14); |
741 | 0 | pix[1] = rp[0] + ((-5640 * rp[1] - 11751 * rp[2]) >> 14); |
742 | 0 | pix[2] = rp[0] + ((29040 * rp[1] - 101 * rp[2]) >> 14); |
743 | 0 | } |
744 | 0 | else |
745 | 0 | { |
746 | 0 | if (unique_id < CanonID_EOS_5D_Mark_II) |
747 | 0 | rp[0] -= 512; |
748 | 0 | pix[0] = rp[0] + rp[2]; |
749 | 0 | pix[2] = rp[0] + rp[1]; |
750 | 0 | pix[1] = rp[0] + ((-778 * rp[1] - (rp[2] << 11)) >> 12); |
751 | 0 | } |
752 | 0 | FORC3 rp[c] = CLIP15(pix[c] * sraw_mul[c] >> 10); |
753 | 0 | } |
754 | 0 | } |
755 | 0 | catch (...) |
756 | 0 | { |
757 | 0 | ljpeg_end(&jh); |
758 | 0 | throw; |
759 | 0 | } |
760 | 0 | height = saved_h; |
761 | 0 | width = saved_w; |
762 | 0 | ljpeg_end(&jh); |
763 | 0 | maximum = 0x3fff; |
764 | 0 | } |
765 | | |
766 | | void LibRaw::ljpeg_idct(struct jhead *jh) |
767 | 0 | { |
768 | 0 | int c, i, j, len, skip, coef; |
769 | 0 | float work[3][8][8]; |
770 | 0 | static float cs[106] = {0}; |
771 | 0 | static const uchar zigzag[80] = { |
772 | 0 | 0, 1, 8, 16, 9, 2, 3, 10, 17, 24, 32, 25, 18, 11, 4, 5, |
773 | 0 | 12, 19, 26, 33, 40, 48, 41, 34, 27, 20, 13, 6, 7, 14, 21, 28, |
774 | 0 | 35, 42, 49, 56, 57, 50, 43, 36, 29, 22, 15, 23, 30, 37, 44, 51, |
775 | 0 | 58, 59, 52, 45, 38, 31, 39, 46, 53, 60, 61, 54, 47, 55, 62, 63, |
776 | 0 | 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63}; |
777 | |
|
778 | 0 | if (!cs[0]) |
779 | 0 | FORC(106) cs[c] = float(cos((c & 31) * M_PI / 16) / 2); |
780 | 0 | memset(work, 0, sizeof work); |
781 | 0 | work[0][0][0] = float(jh->vpred[0] += ljpeg_diff(jh->huff[0]) * jh->quant[0]); |
782 | 0 | for (i = 1; i < 64; i++) |
783 | 0 | { |
784 | 0 | len = gethuff(jh->huff[16]); |
785 | 0 | i += skip = len >> 4; |
786 | 0 | if (!(len &= 15) && skip < 15) |
787 | 0 | break; |
788 | 0 | coef = getbits(len); |
789 | 0 | if ((coef & (1 << (len - 1))) == 0) |
790 | 0 | coef -= (1 << len) - 1; |
791 | 0 | ((float *)work)[zigzag[i]] = float(coef * jh->quant[i]); |
792 | 0 | } |
793 | 0 | FORC(8) work[0][0][c] *= float(M_SQRT1_2); |
794 | 0 | FORC(8) work[0][c][0] *= float(M_SQRT1_2); |
795 | 0 | for (i = 0; i < 8; i++) |
796 | 0 | for (j = 0; j < 8; j++) |
797 | 0 | FORC(8) work[1][i][j] += work[0][i][c] * cs[(j * 2 + 1) * c]; |
798 | 0 | for (i = 0; i < 8; i++) |
799 | 0 | for (j = 0; j < 8; j++) |
800 | 0 | FORC(8) work[2][i][j] += work[1][c][j] * cs[(i * 2 + 1) * c]; |
801 | |
|
802 | 0 | FORC(64) jh->idct[c] = CLIP(((float *)work[2])[c] + 0.5); |
803 | 0 | } |
804 | | |
805 | | void LibRaw::pentax_load_raw() |
806 | 245 | { |
807 | 245 | ushort bit[2][15], huff[4097]; |
808 | 245 | int dep, row, col, diff, c, i; |
809 | 245 | ushort vpred[2][2] = {{0, 0}, {0, 0}}, hpred[2]; |
810 | | |
811 | 245 | fseek(ifp, meta_offset, SEEK_SET); |
812 | 245 | dep = (get2() + 12) & 15; |
813 | 245 | fseek(ifp, 12, SEEK_CUR); |
814 | 1.24k | FORC(dep) bit[0][c] = get2(); |
815 | 1.24k | FORC(dep) bit[1][c] = fgetc(ifp); |
816 | 245 | FORC(dep) |
817 | 1.33M | for (i = bit[0][c]; i <= ((bit[0][c] + (4096 >> bit[1][c]) - 1) & 4095);) |
818 | 1.33M | huff[++i] = bit[1][c] << 8 | c; |
819 | 245 | huff[0] = 12; |
820 | 245 | fseek(ifp, data_offset, SEEK_SET); |
821 | 245 | getbits(-1); |
822 | 156k | for (row = 0; row < raw_height; row++) |
823 | 155k | { |
824 | 155k | checkCancel(); |
825 | 33.4M | for (col = 0; col < raw_width; col++) |
826 | 33.3M | { |
827 | 33.3M | diff = ljpeg_diff(huff); |
828 | 33.3M | if (col < 2) |
829 | 311k | hpred[col] = vpred[row & 1][col] += diff; |
830 | 33.0M | else |
831 | 33.0M | hpred[col & 1] += diff; |
832 | 33.3M | RAW(row, col) = hpred[col & 1]; |
833 | 33.3M | if (hpred[col & 1] >> tiff_bps) |
834 | 10.2M | derror(); |
835 | 33.3M | } |
836 | 155k | } |
837 | 245 | } |
838 | | void LibRaw::nikon_read_curve() |
839 | 109 | { |
840 | 109 | ushort ver0, ver1, vpred[2][2], csize; |
841 | 109 | int i, step, max; |
842 | | |
843 | 109 | fseek(ifp, meta_offset, SEEK_SET); |
844 | 109 | ver0 = fgetc(ifp); |
845 | 109 | ver1 = fgetc(ifp); |
846 | 109 | if (ver0 == 0x49 || ver1 == 0x58) |
847 | 41 | fseek(ifp, 2110, SEEK_CUR); |
848 | 109 | read_shorts(vpred[0], 4); |
849 | 109 | step = max = 1 << tiff_bps & 0x7fff; |
850 | 109 | if ((csize = get2()) > 1) |
851 | 62 | step = max / (csize - 1); |
852 | 109 | if (ver0 == 0x44 && (ver1 == 0x20 || (ver1 == 0x40 && step > 3)) && step > 0) |
853 | 35 | { |
854 | 35 | if (ver1 == 0x40) |
855 | 35 | { |
856 | 35 | step /= 4; |
857 | 35 | max /= 4; |
858 | 35 | } |
859 | 4.98k | for (i = 0; i < csize; i++) |
860 | 4.94k | curve[i * step] = get2(); |
861 | 34.9k | for (i = 0; i < max; i++) |
862 | 34.8k | curve[i] = (curve[i - i % step] * (step - i % step) + |
863 | 34.8k | curve[i - i % step + step] * (i % step)) / |
864 | 34.8k | step; |
865 | 35 | } |
866 | 74 | else if (ver0 != 0x46 && csize <= 0x4001) |
867 | 14 | read_shorts(curve, max = csize); |
868 | 109 | } |
869 | | |
870 | | void LibRaw::nikon_load_raw() |
871 | 78 | { |
872 | 78 | static const uchar nikon_tree[][32] = { |
873 | 78 | {0, 1, 5, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, /* 12-bit lossy */ |
874 | 78 | 5, 4, 3, 6, 2, 7, 1, 0, 8, 9, 11, 10, 12}, |
875 | 78 | {0, 1, 5, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, |
876 | 78 | 0, 0, /* 12-bit lossy after split */ |
877 | 78 | 0x39, 0x5a, 0x38, 0x27, 0x16, 5, 4, 3, 2, 1, 0, 11, 12, 12}, |
878 | | |
879 | 78 | {0, 1, 4, 2, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, /* 12-bit lossless */ |
880 | 78 | 5, 4, 6, 3, 7, 2, 8, 1, 9, 0, 10, 11, 12}, |
881 | 78 | {0, 1, 4, 3, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0, 0, /* 14-bit lossy */ |
882 | 78 | 5, 6, 4, 7, 8, 3, 9, 2, 1, 0, 10, 11, 12, 13, 14}, |
883 | 78 | {0, 1, 5, 1, 1, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, |
884 | 78 | 0, /* 14-bit lossy after split */ |
885 | 78 | 8, 0x5c, 0x4b, 0x3a, 0x29, 7, 6, 5, 4, 3, 2, 1, 0, 13, 14}, |
886 | 78 | {0, 1, 4, 2, 2, 3, 1, 2, 0, 0, 0, 0, 0, 0, 0, 0, /* 14-bit lossless */ |
887 | 78 | 7, 6, 8, 5, 9, 4, 10, 3, 11, 12, 2, 0, 1, 13, 14}}; |
888 | 78 | ushort *huff, ver0, ver1, vpred[2][2], hpred[2]; |
889 | 78 | int i, min, max, tree = 0, split = 0, row, col, len, shl, diff; |
890 | | |
891 | 78 | fseek(ifp, meta_offset, SEEK_SET); |
892 | 78 | ver0 = fgetc(ifp); |
893 | 78 | ver1 = fgetc(ifp); |
894 | 78 | if (ver0 == 0x49 || ver1 == 0x58) |
895 | 15 | fseek(ifp, 2110, SEEK_CUR); |
896 | 78 | if (ver0 == 0x46) |
897 | 1 | tree = 2; |
898 | 78 | if (tiff_bps == 14) |
899 | 1 | tree += 3; |
900 | 78 | read_shorts(vpred[0], 4); |
901 | 78 | max = 1 << tiff_bps & 0x7fff; |
902 | 78 | if (ver0 == 0x44 && (ver1 == 0x20 || ver1 == 0x40)) |
903 | 47 | { |
904 | 47 | if (ver1 == 0x40) |
905 | 46 | max /= 4; |
906 | 47 | fseek(ifp, meta_offset + 562, SEEK_SET); |
907 | 47 | split = get2(); |
908 | 47 | } |
909 | | |
910 | 9.19k | while (max > 2 && (curve[max - 2] == curve[max - 1])) |
911 | 9.12k | max--; |
912 | 78 | huff = make_decoder(nikon_tree[tree]); |
913 | 78 | fseek(ifp, data_offset, SEEK_SET); |
914 | 78 | getbits(-1); |
915 | 78 | try |
916 | 78 | { |
917 | 17.2k | for (min = row = 0; row < height; row++) |
918 | 17.1k | { |
919 | 17.1k | checkCancel(); |
920 | 17.1k | if (split && row == split) |
921 | 2 | { |
922 | 2 | free(huff); |
923 | 2 | huff = make_decoder(nikon_tree[tree + 1]); |
924 | 2 | max += (min = 16) << 1; |
925 | 2 | } |
926 | 3.51M | for (col = 0; col < raw_width; col++) |
927 | 3.50M | { |
928 | 3.50M | i = gethuff(huff); |
929 | 3.50M | len = i & 15; |
930 | 3.50M | shl = i >> 4; |
931 | 3.50M | diff = ((getbits(len - shl) << 1) + 1) << shl >> 1; |
932 | 3.50M | if (len > 0 && (diff & (1 << (len - 1))) == 0) |
933 | 52.0k | diff -= (1 << len) - !shl; |
934 | 3.50M | if (col < 2) |
935 | 34.3k | hpred[col] = vpred[row & 1][col] += diff; |
936 | 3.46M | else |
937 | 3.46M | hpred[col & 1] += diff; |
938 | 3.50M | if ((ushort)(hpred[col & 1] + min) >= max) |
939 | 2.22M | derror(); |
940 | 3.50M | RAW(row, col) = curve[LIM((short)hpred[col & 1], 0, 0x3fff)]; |
941 | 3.50M | } |
942 | 17.1k | } |
943 | 78 | } |
944 | 78 | catch (...) |
945 | 78 | { |
946 | 2 | free(huff); |
947 | 2 | throw; |
948 | 2 | } |
949 | 76 | free(huff); |
950 | 76 | } |
951 | | |
952 | | void LibRaw::nikon_yuv_load_raw() |
953 | 0 | { |
954 | 0 | if (!image) |
955 | 0 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
956 | 0 | int row, col, yuv[4]={0,0,0,0}, rgb[3], b, c; |
957 | 0 | UINT64 bitbuf = 0; |
958 | 0 | float cmul[4]; |
959 | 0 | FORC4 { cmul[c] = cam_mul[c] > 0.001f ? cam_mul[c] : 1.f; } |
960 | 0 | for (row = 0; row < raw_height; row++) |
961 | 0 | { |
962 | 0 | checkCancel(); |
963 | |
|
964 | 0 | for (col = 0; col < raw_width; col++) |
965 | 0 | { |
966 | 0 | if (!(b = col & 1)) |
967 | 0 | { |
968 | 0 | bitbuf = 0; |
969 | 0 | FORC(6) bitbuf |= (UINT64)fgetc(ifp) << c * 8; |
970 | 0 | FORC(4) yuv[c] = (bitbuf >> c * 12 & 0xfff) - (c >> 1 << 11); |
971 | 0 | } |
972 | 0 | rgb[0] = int(yuv[b] + 1.370705f * yuv[3]); |
973 | 0 | rgb[1] = int(yuv[b] - 0.337633f * yuv[2] - 0.698001f * yuv[3]); |
974 | 0 | rgb[2] = int(yuv[b] + 1.732446f * yuv[2]); |
975 | 0 | FORC3 image[row * width + col][c] = |
976 | 0 | ushort( |
977 | 0 | curve[LIM(rgb[c], 0, 0xfff)] / cmul[c]); |
978 | 0 | } |
979 | 0 | } |
980 | 0 | } |
981 | | |
982 | | void LibRaw::rollei_load_raw() |
983 | 25 | { |
984 | 25 | uchar pixel[10]; |
985 | 25 | unsigned iten = 0, isix, i, buffer = 0, todo[16]; |
986 | 25 | if (raw_width > 16383 || raw_height > 16383) |
987 | 0 | throw LIBRAW_EXCEPTION_IO_BADFILE; |
988 | 25 | unsigned maxpixel = raw_width * (raw_height + 7); |
989 | | |
990 | 25 | isix = raw_width * raw_height * 5 / 8; |
991 | 3.88k | while (fread(pixel, 1, 10, ifp) == 10) |
992 | 3.86k | { |
993 | 3.86k | checkCancel(); |
994 | 23.1k | for (i = 0; i < 10; i += 2) |
995 | 19.3k | { |
996 | 19.3k | todo[i] = iten++; |
997 | 19.3k | todo[i + 1] = pixel[i] << 8 | pixel[i + 1]; |
998 | 19.3k | buffer = pixel[i] >> 2 | buffer << 6; |
999 | 19.3k | } |
1000 | 15.4k | for (; i < 16; i += 2) |
1001 | 11.5k | { |
1002 | 11.5k | todo[i] = isix++; |
1003 | 11.5k | todo[i + 1] = buffer >> (14 - i) * 5; |
1004 | 11.5k | } |
1005 | 34.7k | for (i = 0; i < 16; i += 2) |
1006 | 30.8k | if (todo[i] < maxpixel) |
1007 | 28.9k | raw_image[todo[i]] = (todo[i + 1] & 0x3ff); |
1008 | 1.98k | else |
1009 | 1.98k | derror(); |
1010 | 3.86k | } |
1011 | 25 | maximum = 0x3ff; |
1012 | 25 | } |
1013 | | |
1014 | | void LibRaw::nokia_load_raw() |
1015 | 180 | { |
1016 | 180 | uchar *dp; |
1017 | 180 | int rev, dwide, row, col, c; |
1018 | 180 | double sum[] = {0, 0}; |
1019 | | |
1020 | 180 | rev = 3 * (order == 0x4949); |
1021 | 180 | dwide = (raw_width * 5 + 1) / 4; |
1022 | | #ifdef USE_6BY9RPI |
1023 | | if (raw_stride) |
1024 | | dwide = raw_stride; |
1025 | | #endif |
1026 | 180 | std::vector<uchar> data(dwide * 2 + 4,0); |
1027 | 3.24k | for (row = 0; row < raw_height; row++) |
1028 | 3.06k | { |
1029 | 3.06k | checkCancel(); |
1030 | 3.06k | if (fread(data.data() + dwide, 1, dwide, ifp) < dwide) |
1031 | 70 | derror(); |
1032 | 98.7k | FORC(dwide) data[c] = data[dwide + (c ^ rev)]; |
1033 | 23.5k | for (dp = data.data(), col = 0; col < raw_width; dp += 5, col += 4) |
1034 | 81.9k | FORC4 RAW(row, col + c) = (dp[c] << 2) | (dp[4] >> (c << 1) & 3); |
1035 | 3.06k | } |
1036 | 180 | maximum = 0x3ff; |
1037 | | #ifdef USE_6BY9RPI |
1038 | | if (!strcmp(make, "OmniVision") || |
1039 | | !strcmp(make, "Sony") || |
1040 | | !strcmp(make, "RaspberryPi")) return; |
1041 | | #else |
1042 | 180 | if (strncmp(make, "OmniVision", 10)) |
1043 | 110 | return; |
1044 | 70 | #endif |
1045 | 70 | row = raw_height / 2; |
1046 | 70 | FORC(width - 1) |
1047 | 0 | { |
1048 | 0 | sum[c & 1] += SQR(RAW(row, c) - RAW(row + 1, c + 1)); |
1049 | 0 | sum[~c & 1] += SQR(RAW(row + 1, c) - RAW(row, c + 1)); |
1050 | 0 | } |
1051 | 70 | if (sum[1] > sum[0]) |
1052 | 0 | filters = 0x4b4b4b4b; |
1053 | 70 | } |
1054 | | |
1055 | | unsigned LibRaw::pana_data(int nb, unsigned *bytes) |
1056 | 88.5M | { |
1057 | 88.5M | #ifndef LIBRAW_NOTHREADS |
1058 | 444M | #define vpos tls->pana_data.vpos |
1059 | 177M | #define buf tls->pana_data.buf |
1060 | | #else |
1061 | | static uchar buf[0x4002]; |
1062 | | static int vpos; |
1063 | | #endif |
1064 | 88.5M | int byte; |
1065 | | |
1066 | 88.5M | if (!nb && !bytes) |
1067 | 77 | { |
1068 | 77 | memset(buf, 0, sizeof(buf)); |
1069 | 77 | return vpos = 0; |
1070 | 77 | } |
1071 | 88.5M | if (load_flags > 0x4000) |
1072 | 0 | throw LIBRAW_EXCEPTION_IO_BADFILE; |
1073 | | |
1074 | 88.5M | if (!vpos) |
1075 | 1.67k | { |
1076 | 1.67k | if(load_flags < 0x4000) |
1077 | 1.67k | fread(buf + load_flags, 1, 0x4000 - load_flags, ifp); |
1078 | 1.67k | fread(buf, 1, load_flags, ifp); |
1079 | 1.67k | } |
1080 | | |
1081 | 88.5M | if (pana_encoding == 5) |
1082 | 56.0k | { |
1083 | 952k | for (byte = 0; byte < 16; byte++) |
1084 | 896k | { |
1085 | 896k | bytes[byte] = buf[vpos++]; |
1086 | 896k | vpos &= 0x3FFF; |
1087 | 896k | } |
1088 | 56.0k | } |
1089 | 88.5M | else |
1090 | 88.5M | { |
1091 | 88.5M | vpos = (vpos - nb) & 0x1ffff; |
1092 | 88.5M | byte = vpos >> 3 ^ 0x3ff0; |
1093 | 88.5M | return (buf[byte] | buf[byte + 1] << 8) >> (vpos & 7) & ~((~0u) << nb); |
1094 | 88.5M | } |
1095 | 56.0k | return 0; |
1096 | 88.5M | #ifndef LIBRAW_NOTHREADS |
1097 | 88.5M | #undef vpos |
1098 | 88.5M | #undef buf |
1099 | 88.5M | #endif |
1100 | 88.5M | } |
1101 | | |
1102 | | void LibRaw::panasonic_load_raw() |
1103 | 77 | { |
1104 | 77 | int row, col, i, j, sh = 0, pred[2], nonz[2]; |
1105 | 77 | unsigned bytes[16]; |
1106 | 77 | memset(bytes,0,sizeof(bytes)); // make gcc11 happy |
1107 | 77 | ushort *raw_block_data; |
1108 | | |
1109 | 77 | pana_data(0, 0); |
1110 | | |
1111 | 77 | int enc_blck_size = pana_bpp == 12 ? 10 : 9; |
1112 | 77 | if (pana_encoding == 5) |
1113 | 20 | { |
1114 | 7.15k | for (row = 0; row < raw_height; row++) |
1115 | 7.13k | { |
1116 | 7.13k | raw_block_data = raw_image + row * raw_width; |
1117 | 7.13k | checkCancel(); |
1118 | 63.1k | for (col = 0; col < raw_width; col += enc_blck_size) |
1119 | 56.0k | { |
1120 | 56.0k | pana_data(0, bytes); |
1121 | | |
1122 | 56.0k | if (pana_bpp == 12) |
1123 | 8.02k | { |
1124 | 8.02k | raw_block_data[col] = ((bytes[1] & 0xF) << 8) + bytes[0]; |
1125 | 8.02k | raw_block_data[col + 1] = 16 * bytes[2] + (bytes[1] >> 4); |
1126 | 8.02k | raw_block_data[col + 2] = ((bytes[4] & 0xF) << 8) + bytes[3]; |
1127 | 8.02k | raw_block_data[col + 3] = 16 * bytes[5] + (bytes[4] >> 4); |
1128 | 8.02k | raw_block_data[col + 4] = ((bytes[7] & 0xF) << 8) + bytes[6]; |
1129 | 8.02k | raw_block_data[col + 5] = 16 * bytes[8] + (bytes[7] >> 4); |
1130 | 8.02k | raw_block_data[col + 6] = ((bytes[10] & 0xF) << 8) + bytes[9]; |
1131 | 8.02k | raw_block_data[col + 7] = 16 * bytes[11] + (bytes[10] >> 4); |
1132 | 8.02k | raw_block_data[col + 8] = ((bytes[13] & 0xF) << 8) + bytes[12]; |
1133 | 8.02k | raw_block_data[col + 9] = 16 * bytes[14] + (bytes[13] >> 4); |
1134 | 8.02k | } |
1135 | 47.9k | else if (pana_bpp == 14) |
1136 | 38.6k | { |
1137 | 38.6k | raw_block_data[col] = bytes[0] + ((bytes[1] & 0x3F) << 8); |
1138 | 38.6k | raw_block_data[col + 1] = |
1139 | 38.6k | (bytes[1] >> 6) + 4 * (bytes[2]) + ((bytes[3] & 0xF) << 10); |
1140 | 38.6k | raw_block_data[col + 2] = |
1141 | 38.6k | (bytes[3] >> 4) + 16 * (bytes[4]) + ((bytes[5] & 3) << 12); |
1142 | 38.6k | raw_block_data[col + 3] = ((bytes[5] & 0xFC) >> 2) + (bytes[6] << 6); |
1143 | 38.6k | raw_block_data[col + 4] = bytes[7] + ((bytes[8] & 0x3F) << 8); |
1144 | 38.6k | raw_block_data[col + 5] = |
1145 | 38.6k | (bytes[8] >> 6) + 4 * bytes[9] + ((bytes[10] & 0xF) << 10); |
1146 | 38.6k | raw_block_data[col + 6] = |
1147 | 38.6k | (bytes[10] >> 4) + 16 * bytes[11] + ((bytes[12] & 3) << 12); |
1148 | 38.6k | raw_block_data[col + 7] = |
1149 | 38.6k | ((bytes[12] & 0xFC) >> 2) + (bytes[13] << 6); |
1150 | 38.6k | raw_block_data[col + 8] = bytes[14] + ((bytes[15] & 0x3F) << 8); |
1151 | 38.6k | } |
1152 | 56.0k | } |
1153 | 7.13k | } |
1154 | 20 | } |
1155 | 57 | else |
1156 | 57 | { |
1157 | 57 | if (load_flags >= 0x4000) |
1158 | 1 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
1159 | 248k | for (row = 0; row < raw_height; row++) |
1160 | 248k | { |
1161 | 248k | checkCancel(); |
1162 | 62.3M | for (col = 0; col < raw_width; col++) |
1163 | 62.1M | { |
1164 | 62.1M | if ((i = col % 14) == 0) |
1165 | 4.54M | pred[0] = pred[1] = nonz[0] = nonz[1] = 0; |
1166 | 62.1M | if (i % 3 == 2) |
1167 | 17.7M | sh = 4 >> (3 - pana_data(2, 0)); |
1168 | 62.1M | if (nonz[i & 1]) |
1169 | 1.47M | { |
1170 | 1.47M | if ((j = pana_data(8, 0))) |
1171 | 909k | { |
1172 | 909k | if ((pred[i & 1] -= 0x80 << sh) < 0 || sh == 4) |
1173 | 297k | pred[i & 1] &= ~((~0u) << sh); |
1174 | 909k | pred[i & 1] += j << sh; |
1175 | 909k | } |
1176 | 1.47M | } |
1177 | 60.6M | else if ((nonz[i & 1] = pana_data(8, 0)) || i > 11) |
1178 | 8.60M | pred[i & 1] = nonz[i & 1] << 4 | pana_data(4, 0); |
1179 | 62.1M | if ((RAW(row, col) = pred[col & 1]) > 4098 && col < width && |
1180 | 23.2k | row < height) |
1181 | 19 | derror(); |
1182 | 62.1M | } |
1183 | 248k | } |
1184 | 56 | } |
1185 | 77 | } |
1186 | | |
1187 | | |
1188 | | void LibRaw::minolta_rd175_load_raw() |
1189 | 0 | { |
1190 | 0 | uchar pixel[768]; |
1191 | 0 | unsigned irow, box, row, col; |
1192 | |
|
1193 | 0 | for (irow = 0; irow < 1481; irow++) |
1194 | 0 | { |
1195 | 0 | checkCancel(); |
1196 | 0 | if (fread(pixel, 1, 768, ifp) < 768) |
1197 | 0 | derror(); |
1198 | 0 | box = irow / 82; |
1199 | 0 | row = irow % 82 * 12 + ((box < 12) ? box | 1 : (box - 12) * 2); |
1200 | 0 | switch (irow) |
1201 | 0 | { |
1202 | 0 | case 1477: |
1203 | 0 | case 1479: |
1204 | 0 | continue; |
1205 | 0 | case 1476: |
1206 | 0 | row = 984; |
1207 | 0 | break; |
1208 | 0 | case 1480: |
1209 | 0 | row = 985; |
1210 | 0 | break; |
1211 | 0 | case 1478: |
1212 | 0 | row = 985; |
1213 | 0 | box = 1; |
1214 | 0 | } |
1215 | 0 | if ((box < 12) && (box & 1)) |
1216 | 0 | { |
1217 | 0 | for (col = 0; col < 1533; col++, row ^= 1) |
1218 | 0 | if (col != 1) |
1219 | 0 | RAW(row, col) = (col + 1) & 2 |
1220 | 0 | ? pixel[col / 2 - 1] + pixel[col / 2 + 1] |
1221 | 0 | : pixel[col / 2] << 1; |
1222 | 0 | RAW(row, 1) = pixel[1] << 1; |
1223 | 0 | RAW(row, 1533) = pixel[765] << 1; |
1224 | 0 | } |
1225 | 0 | else |
1226 | 0 | for (col = row & 1; col < 1534; col += 2) |
1227 | 0 | RAW(row, col) = pixel[col / 2] << 1; |
1228 | 0 | } |
1229 | 0 | maximum = 0xff << 1; |
1230 | 0 | } |
1231 | | |
1232 | | void LibRaw::quicktake_100_load_raw() |
1233 | 106 | { |
1234 | 106 | std::vector<uchar> pixel_buffer(484 * 644, 0x80); |
1235 | 106 | uchar* pixel = &pixel_buffer[0]; |
1236 | 106 | static const short gstep[16] = {-89, -60, -44, -32, -22, -15, -8, -2, |
1237 | 106 | 2, 8, 15, 22, 32, 44, 60, 89}; |
1238 | 106 | static const short rstep[6][4] = {{-3, -1, 1, 3}, {-5, -1, 1, 5}, |
1239 | 106 | {-8, -2, 2, 8}, {-13, -3, 3, 13}, |
1240 | 106 | {-19, -4, 4, 19}, {-28, -6, 6, 28}}; |
1241 | 106 | static const short t_curve[256] = { |
1242 | 106 | 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 11, 12, 13, 14, |
1243 | 106 | 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, |
1244 | 106 | 29, 30, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, |
1245 | 106 | 44, 45, 46, 47, 48, 49, 50, 51, 53, 54, 55, 56, 57, 58, |
1246 | 106 | 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, |
1247 | 106 | 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 86, 88, 90, |
1248 | 106 | 92, 94, 97, 99, 101, 103, 105, 107, 110, 112, 114, 116, 118, 120, |
1249 | 106 | 123, 125, 127, 129, 131, 134, 136, 138, 140, 142, 144, 147, 149, 151, |
1250 | 106 | 153, 155, 158, 160, 162, 164, 166, 168, 171, 173, 175, 177, 179, 181, |
1251 | 106 | 184, 186, 188, 190, 192, 195, 197, 199, 201, 203, 205, 208, 210, 212, |
1252 | 106 | 214, 216, 218, 221, 223, 226, 230, 235, 239, 244, 248, 252, 257, 261, |
1253 | 106 | 265, 270, 274, 278, 283, 287, 291, 296, 300, 305, 309, 313, 318, 322, |
1254 | 106 | 326, 331, 335, 339, 344, 348, 352, 357, 361, 365, 370, 374, 379, 383, |
1255 | 106 | 387, 392, 396, 400, 405, 409, 413, 418, 422, 426, 431, 435, 440, 444, |
1256 | 106 | 448, 453, 457, 461, 466, 470, 474, 479, 483, 487, 492, 496, 500, 508, |
1257 | 106 | 519, 531, 542, 553, 564, 575, 587, 598, 609, 620, 631, 643, 654, 665, |
1258 | 106 | 676, 687, 698, 710, 721, 732, 743, 754, 766, 777, 788, 799, 810, 822, |
1259 | 106 | 833, 844, 855, 866, 878, 889, 900, 911, 922, 933, 945, 956, 967, 978, |
1260 | 106 | 989, 1001, 1012, 1023}; |
1261 | 106 | int rb, row, col, sharp, val = 0; |
1262 | | |
1263 | 106 | if (width > 640 || height > 480) |
1264 | 1 | throw LIBRAW_EXCEPTION_IO_CORRUPT; |
1265 | | |
1266 | 105 | getbits(-1); |
1267 | 1.82k | for (row = 2; row < height + 2; row++) |
1268 | 1.71k | { |
1269 | 1.71k | checkCancel(); |
1270 | 46.4k | for (col = 2 + (row & 1); col < width + 2; col += 2) |
1271 | 44.7k | { |
1272 | 44.7k | val = ((pixel[(row - 1) * 644 + col - 1] + 2 * pixel[(row - 1) * 644 + col + 1] + pixel[row * 644 + col - 2]) >> 2) + gstep[getbits(4)]; |
1273 | 44.7k | pixel[row * 644 + col] = val = LIM(val, 0, 255); |
1274 | 44.7k | if (col < 4) |
1275 | 1.71k | pixel[row * 644 + col - 2] = pixel[(row + 1) * 644 + (~row & 1)] = val; |
1276 | 44.7k | if (row == 2) |
1277 | 3.57k | pixel[(row - 1) * 644 + col + 1] = pixel[(row - 1) * 644 + col + 3] = val; |
1278 | 44.7k | } |
1279 | 1.71k | pixel[row * 644 + col] = val; |
1280 | 1.71k | } |
1281 | 208 | for (rb = 0; rb < 2; rb++) |
1282 | 1.00k | for (row = 2 + rb; row < height + 2; row += 2) |
1283 | 897 | { |
1284 | 897 | checkCancel(); |
1285 | 25.0k | for (col = 3 - (row & 1); col < width + 2; col += 2) |
1286 | 24.1k | { |
1287 | 24.1k | if (row < 4 || col < 4) |
1288 | 3.63k | sharp = 2; |
1289 | 20.5k | else |
1290 | 20.5k | { |
1291 | 20.5k | val = ABS(pixel[(row - 2) * 644 + col] - pixel[row * 644 + col - 2]) + ABS(pixel[(row - 2) * 644 + col] - pixel[(row - 2) * 644 + col - 2]) + |
1292 | 20.5k | ABS(pixel[row * 644 + col - 2] - pixel[(row - 2) * 644 + col - 2]); |
1293 | 20.5k | sharp = val < 4 |
1294 | 20.5k | ? 0 |
1295 | 20.5k | : val < 8 |
1296 | 15.1k | ? 1 |
1297 | 15.1k | : val < 16 ? 2 : val < 32 ? 3 : val < 48 ? 4 : 5; |
1298 | 20.5k | } |
1299 | 24.1k | val = ((pixel[(row - 2) * 644 + col] + pixel[row * 644 + col - 2]) >> 1) + rstep[sharp][getbits(2)]; |
1300 | 24.1k | pixel[row * 644 + col] = val = LIM(val, 0, 255); |
1301 | 24.1k | if (row < 4) |
1302 | 2.83k | pixel[(row - 2) * 644 + col + 2] = val; |
1303 | 24.1k | if (col < 4) |
1304 | 892 | pixel[(row + 2) * 644 + col - 2] = val; |
1305 | 24.1k | } |
1306 | 897 | } |
1307 | 625 | for (row = 2; row < height + 2; row++) |
1308 | 520 | { |
1309 | 520 | checkCancel(); |
1310 | 13.3k | for (col = 3 - (row & 1); col < width + 2; col += 2) |
1311 | 12.8k | { |
1312 | 12.8k | val = ((pixel[row * 644 + col - 1] + (pixel[row * 644 + col] << 2) + pixel[row * 644 + col + 1]) >> 1) - 0x100; |
1313 | 12.8k | pixel[row * 644 + col] = LIM(val, 0, 255); |
1314 | 12.8k | } |
1315 | 520 | } |
1316 | 625 | for (row = 0; row < height; row++) |
1317 | 520 | { |
1318 | 520 | checkCancel(); |
1319 | 26.2k | for (col = 0; col < width; col++) |
1320 | 25.7k | RAW(row, col) = t_curve[pixel[(row + 2) * 644 + col + 2]]; |
1321 | 520 | } |
1322 | 105 | maximum = 0x3ff; |
1323 | 105 | } |
1324 | | |
1325 | | void LibRaw::sony_load_raw() |
1326 | 0 | { |
1327 | 0 | uchar head[40]; |
1328 | 0 | ushort *pixel; |
1329 | 0 | unsigned i, key, row, col; |
1330 | |
|
1331 | 0 | fseek(ifp, 200896, SEEK_SET); |
1332 | 0 | fseek(ifp, (unsigned)fgetc(ifp) * 4 - 1, SEEK_CUR); |
1333 | 0 | order = 0x4d4d; |
1334 | 0 | key = get4(); |
1335 | |
|
1336 | 0 | fseek(ifp, 164600, SEEK_SET); |
1337 | 0 | fread(head, 1, 40, ifp); |
1338 | 0 | sony_decrypt((unsigned *)head, 10, 1, key); |
1339 | 0 | for (i = 26; i-- > 22;) |
1340 | 0 | key = key << 8 | head[i]; |
1341 | |
|
1342 | 0 | fseek(ifp, data_offset, SEEK_SET); |
1343 | 0 | for (row = 0; row < raw_height; row++) |
1344 | 0 | { |
1345 | 0 | checkCancel(); |
1346 | 0 | pixel = raw_image + row * raw_width; |
1347 | 0 | if (fread(pixel, 2, raw_width, ifp) < raw_width) |
1348 | 0 | derror(); |
1349 | 0 | sony_decrypt((unsigned *)pixel, raw_width / 2, !row, key); |
1350 | 0 | for (col = 0; col < raw_width; col++) |
1351 | 0 | if ((pixel[col] = ntohs(pixel[col])) >> 14) |
1352 | 0 | derror(); |
1353 | 0 | } |
1354 | 0 | maximum = 0x3ff0; |
1355 | 0 | } |
1356 | | |
1357 | | void LibRaw::sony_arw_load_raw() |
1358 | 93 | { |
1359 | 93 | std::vector<ushort> huff_buffer(32770,0); |
1360 | 93 | ushort* huff = &huff_buffer[0]; |
1361 | 93 | static const ushort tab[18] = {0xf11, 0xf10, 0xe0f, 0xd0e, 0xc0d, 0xb0c, |
1362 | 93 | 0xa0b, 0x90a, 0x809, 0x708, 0x607, 0x506, |
1363 | 93 | 0x405, 0x304, 0x303, 0x300, 0x202, 0x201}; |
1364 | 93 | int i, c, n, col, row, sum = 0; |
1365 | | |
1366 | 93 | huff[0] = 15; |
1367 | 1.76k | for (n = i = 0; i < 18; i++) |
1368 | 3.04M | FORC(32768 >> (tab[i] >> 8)) huff[++n] = tab[i]; |
1369 | 93 | getbits(-1); |
1370 | 39.2k | for (col = raw_width; col--;) |
1371 | 39.1k | { |
1372 | 39.1k | checkCancel(); |
1373 | 13.1M | for (row = 0; row < raw_height + 1; row += 2) |
1374 | 13.1M | { |
1375 | 13.1M | if (row == raw_height) |
1376 | 21.9k | row = 1; |
1377 | 13.1M | if ((sum += ljpeg_diff(huff)) >> 12) |
1378 | 12.7M | derror(); |
1379 | 13.1M | if (row < height) |
1380 | 13.1M | RAW(row, col) = sum; |
1381 | 13.1M | } |
1382 | 39.1k | } |
1383 | 93 | } |
1384 | | |
1385 | | void LibRaw::sony_arw2_load_raw() |
1386 | 28 | { |
1387 | 28 | uchar *data, *dp; |
1388 | 28 | ushort pix[16]; |
1389 | 28 | int row, col, val, max, min, imax, imin, sh, bit, i; |
1390 | | |
1391 | 28 | data = (uchar *)calloc(raw_width + 1,1); |
1392 | 28 | try |
1393 | 28 | { |
1394 | 2.33k | for (row = 0; row < height; row++) |
1395 | 2.30k | { |
1396 | 2.30k | checkCancel(); |
1397 | 2.30k | fread(data, 1, raw_width, ifp); |
1398 | 6.90k | for (dp = data, col = 0; col < raw_width - 30; dp += 16) |
1399 | 4.60k | { |
1400 | 4.60k | max = 0x7ff & (val = sget4(dp)); |
1401 | 4.60k | min = 0x7ff & val >> 11; |
1402 | 4.60k | imax = 0x0f & val >> 22; |
1403 | 4.60k | imin = 0x0f & val >> 26; |
1404 | 11.5k | for (sh = 0; sh < 4 && 0x80 << sh <= max - min; sh++) |
1405 | 6.98k | ; |
1406 | | /* flag checks if outside of loop */ |
1407 | 4.60k | if (!(imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_ALLFLAGS) // no flag set |
1408 | 0 | || (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE)) |
1409 | 4.60k | { |
1410 | 78.2k | for (bit = 30, i = 0; i < 16; i++) |
1411 | 73.6k | if (i == imax) |
1412 | 4.60k | pix[i] = max; |
1413 | 69.0k | else if (i == imin) |
1414 | 3.50k | pix[i] = min; |
1415 | 65.5k | else |
1416 | 65.5k | { |
1417 | 65.5k | pix[i] = |
1418 | 65.5k | ((sget2(dp + (bit >> 3)) >> (bit & 7) & 0x7f) << sh) + min; |
1419 | 65.5k | if (pix[i] > 0x7ff) |
1420 | 10.0k | pix[i] = 0x7ff; |
1421 | 65.5k | bit += 7; |
1422 | 65.5k | } |
1423 | 4.60k | } |
1424 | 0 | else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_BASEONLY) |
1425 | 0 | { |
1426 | 0 | for (bit = 30, i = 0; i < 16; i++) |
1427 | 0 | if (i == imax) |
1428 | 0 | pix[i] = max; |
1429 | 0 | else if (i == imin) |
1430 | 0 | pix[i] = min; |
1431 | 0 | else |
1432 | 0 | pix[i] = 0; |
1433 | 0 | } |
1434 | 0 | else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTAONLY) |
1435 | 0 | { |
1436 | 0 | for (bit = 30, i = 0; i < 16; i++) |
1437 | 0 | if (i == imax) |
1438 | 0 | pix[i] = 0; |
1439 | 0 | else if (i == imin) |
1440 | 0 | pix[i] = 0; |
1441 | 0 | else |
1442 | 0 | { |
1443 | 0 | pix[i] = |
1444 | 0 | ((sget2(dp + (bit >> 3)) >> (bit & 7) & 0x7f) << sh) + min; |
1445 | 0 | if (pix[i] > 0x7ff) |
1446 | 0 | pix[i] = 0x7ff; |
1447 | 0 | bit += 7; |
1448 | 0 | } |
1449 | 0 | } |
1450 | 0 | else if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTAZEROBASE) |
1451 | 0 | { |
1452 | 0 | for (bit = 30, i = 0; i < 16; i++) |
1453 | 0 | if (i == imax) |
1454 | 0 | pix[i] = 0; |
1455 | 0 | else if (i == imin) |
1456 | 0 | pix[i] = 0; |
1457 | 0 | else |
1458 | 0 | { |
1459 | 0 | pix[i] = ((sget2(dp + (bit >> 3)) >> (bit & 7) & 0x7f) << sh); |
1460 | 0 | if (pix[i] > 0x7ff) |
1461 | 0 | pix[i] = 0x7ff; |
1462 | 0 | bit += 7; |
1463 | 0 | } |
1464 | 0 | } |
1465 | | |
1466 | 4.60k | if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE) |
1467 | 0 | { |
1468 | 0 | for (i = 0; i < 16; i++, col += 2) |
1469 | 0 | { |
1470 | 0 | unsigned slope = |
1471 | 0 | pix[i] < 1001 ? 2 |
1472 | 0 | : curve[pix[i] << 1] - curve[(pix[i] << 1) - 2]; |
1473 | 0 | unsigned step = 1 << sh; |
1474 | 0 | RAW(row, col) = |
1475 | 0 | curve[pix[i] << 1] > |
1476 | 0 | black + imgdata.rawparams.sony_arw2_posterization_thr |
1477 | 0 | ? LIM(((slope * step * 1000) / |
1478 | 0 | (curve[pix[i] << 1] - black)), |
1479 | 0 | 0, 10000) |
1480 | 0 | : 0; |
1481 | 0 | } |
1482 | 0 | } |
1483 | 4.60k | else |
1484 | 78.2k | for (i = 0; i < 16; i++, col += 2) |
1485 | 73.6k | RAW(row, col) = curve[pix[i] << 1]; |
1486 | 4.60k | col -= col & 1 ? 1 : 31; |
1487 | 4.60k | } |
1488 | 2.30k | } |
1489 | 28 | } |
1490 | 28 | catch (...) |
1491 | 28 | { |
1492 | 0 | free(data); |
1493 | 0 | throw; |
1494 | 0 | } |
1495 | 28 | if (imgdata.rawparams.specials & LIBRAW_RAWSPECIAL_SONYARW2_DELTATOVALUE) |
1496 | 0 | maximum = 10000; |
1497 | 28 | free(data); |
1498 | 28 | } |
1499 | | |
1500 | | void LibRaw::samsung_load_raw() |
1501 | 106 | { |
1502 | 106 | int row, col, c, i, dir, op[4], len[4]; |
1503 | 106 | if (raw_width > 32768 || |
1504 | 106 | raw_height > 32768) // definitely too much for old samsung |
1505 | 0 | throw LIBRAW_EXCEPTION_IO_BADFILE; |
1506 | 106 | unsigned maxpixels = raw_width * (raw_height + 7); |
1507 | | |
1508 | 106 | order = 0x4949; |
1509 | 23.3k | for (row = 0; row < raw_height; row++) |
1510 | 23.2k | { |
1511 | 23.2k | checkCancel(); |
1512 | 23.2k | fseek(ifp, strip_offset + row * 4, SEEK_SET); |
1513 | 23.2k | fseek(ifp, data_offset + get4(), SEEK_SET); |
1514 | 23.2k | ph1_bits(-1); |
1515 | 92.9k | FORC4 len[c] = row < 2 ? 7 : 4; |
1516 | 1.06M | for (col = 0; col < raw_width; col += 16) |
1517 | 1.04M | { |
1518 | 1.04M | dir = ph1_bits(1); |
1519 | 4.17M | FORC4 op[c] = ph1_bits(2); |
1520 | 4.17M | FORC4 switch (op[c]) |
1521 | 4.17M | { |
1522 | 4.04M | case 3: |
1523 | 4.04M | len[c] = ph1_bits(4); |
1524 | 4.04M | break; |
1525 | 18.9k | case 2: |
1526 | 18.9k | len[c]--; |
1527 | 18.9k | break; |
1528 | 19.0k | case 1: |
1529 | 19.0k | len[c]++; |
1530 | 4.17M | } |
1531 | 17.7M | for (c = 0; c < 16; c += 2) |
1532 | 16.7M | { |
1533 | 16.7M | i = len[((c & 1) << 1) | (c >> 3)]; |
1534 | 16.7M | unsigned idest = RAWINDEX(row, col + c); |
1535 | 16.7M | unsigned isrc = (dir ? RAWINDEX(row + (~c | -2), col + c) |
1536 | 16.7M | : col ? RAWINDEX(row, col + (c | -2)) : 0); |
1537 | 16.7M | if (idest < maxpixels && |
1538 | 16.7M | isrc < |
1539 | 16.7M | maxpixels) // less than zero is handled by unsigned conversion |
1540 | 16.7M | RAW(row, col + c) = (i > 0 ? ((signed)ph1_bits(i) << (32 - i) >> (32 - i)) : 0) + |
1541 | 16.6M | (dir ? RAW(row + (~c | -2), col + c) : col ? RAW(row, col + (c | -2)) : 128); |
1542 | 79.0k | else |
1543 | 79.0k | derror(); |
1544 | 16.7M | if (c == 14) |
1545 | 1.04M | c = -1; |
1546 | 16.7M | } |
1547 | 1.04M | } |
1548 | 23.2k | } |
1549 | 11.6k | for (row = 0; row < raw_height - 1; row += 2) |
1550 | 4.13M | for (col = 0; col < raw_width - 1; col += 2) |
1551 | 4.12M | SWAP(RAW(row, col + 1), RAW(row + 1, col)); |
1552 | 106 | } |
1553 | | |
1554 | | void LibRaw::samsung2_load_raw() |
1555 | 63 | { |
1556 | 63 | static const ushort tab[14] = {0x304, 0x307, 0x206, 0x205, 0x403, |
1557 | 63 | 0x600, 0x709, 0x80a, 0x90b, 0xa0c, |
1558 | 63 | 0xa0d, 0x501, 0x408, 0x402}; |
1559 | 63 | ushort huff[1026], vpred[2][2] = {{0, 0}, {0, 0}}, hpred[2]; |
1560 | 63 | int i, c, n, row, col, diff; |
1561 | | |
1562 | 63 | huff[0] = 10; |
1563 | 945 | for (n = i = 0; i < 14; i++) |
1564 | 64.5k | FORC(1024 >> (tab[i] >> 8)) huff[++n] = tab[i]; |
1565 | 63 | getbits(-1); |
1566 | 9.01k | for (row = 0; row < raw_height; row++) |
1567 | 8.94k | { |
1568 | 8.94k | checkCancel(); |
1569 | 5.44M | for (col = 0; col < raw_width; col++) |
1570 | 5.44M | { |
1571 | 5.44M | diff = ljpeg_diff(huff); |
1572 | 5.44M | if (col < 2) |
1573 | 17.8k | hpred[col] = vpred[row & 1][col] += diff; |
1574 | 5.42M | else |
1575 | 5.42M | hpred[col & 1] += diff; |
1576 | 5.44M | RAW(row, col) = hpred[col & 1]; |
1577 | 5.44M | if (hpred[col & 1] >> tiff_bps) |
1578 | 3.06M | derror(); |
1579 | 5.44M | } |
1580 | 8.94k | } |
1581 | 63 | } |
1582 | | |