Coverage Report

Created: 2026-02-14 07:11

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
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