Coverage Report

Created: 2026-04-01 07:24

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