Coverage Report

Created: 2026-10-27 06:57

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/LibRaw/src/decoders/kodak_decoders.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
21
1.07M
#define radc_token(tree) ((signed char)getbithuff(8, huff + (tree) * 256))
22
23
#define FORYX                                                                  \
24
1.58M
  for (y = 1; y < 3; y++)                                                      \
25
3.17M
    for (x = col + 1; x >= col; x--)
26
27
#define PREDICTOR                                                              \
28
1.65M
  (c ? (buf[c][y - 1][x] + buf[c][y][x + 1]) / 2                               \
29
1.65M
     : (buf[c][y - 1][x + 1] + 2 * buf[c][y - 1][x] + buf[c][y][x + 1]) / 4)
30
31
#ifdef __GNUC__
32
#if __GNUC__ > 4 || (__GNUC__ == 4 && __GNUC_MINOR__ >= 8)
33
#pragma GCC optimize("no-aggressive-loop-optimizations")
34
#endif
35
#endif
36
37
void LibRaw::kodak_radc_load_raw()
38
149
{
39
  // All kodak radc images are 768x512
40
149
  if (width > 768 || raw_width > 768 || height > 512 || raw_height > 512)
41
4
    throw LIBRAW_EXCEPTION_IO_CORRUPT;
42
145
  static const signed char src[] = {
43
145
      1, 1,   2, 3,   3, 4,   4, 2,   5, 7,   6, 5,   7, 6,   7, 8,   1, 0,
44
145
      2, 1,   3, 3,   4, 4,   5, 2,   6, 7,   7, 6,   8, 5,   8, 8,   2, 1,
45
145
      2, 3,   3, 0,   3, 2,   3, 4,   4, 6,   5, 5,   6, 7,   6, 8,   2, 0,
46
145
      2, 1,   2, 3,   3, 2,   4, 4,   5, 6,   6, 7,   7, 5,   7, 8,   2, 1,
47
145
      2, 4,   3, 0,   3, 2,   3, 3,   4, 7,   5, 5,   6, 6,   6, 8,   2, 3,
48
145
      3, 1,   3, 2,   3, 4,   3, 5,   3, 6,   4, 7,   5, 0,   5, 8,   2, 3,
49
145
      2, 6,   3, 0,   3, 1,   4, 4,   4, 5,   4, 7,   5, 2,   5, 8,   2, 4,
50
145
      2, 7,   3, 3,   3, 6,   4, 1,   4, 2,   4, 5,   5, 0,   5, 8,   2, 6,
51
145
      3, 1,   3, 3,   3, 5,   3, 7,   3, 8,   4, 0,   5, 2,   5, 4,   2, 0,
52
145
      2, 1,   3, 2,   3, 3,   4, 4,   4, 5,   5, 6,   5, 7,   4, 8,   1, 0,
53
145
      2, 2,   2, -2,  1, -3,  1, 3,   2, -17, 2, -5,  2, 5,   2, 17,  2, -7,
54
145
      2, 2,   2, 9,   2, 18,  2, -18, 2, -9,  2, -2,  2, 7,   2, -28, 2, 28,
55
145
      3, -49, 3, -9,  3, 9,   4, 49,  5, -79, 5, 79,  2, -1,  2, 13,  2, 26,
56
145
      3, 39,  4, -16, 5, 55,  6, -37, 6, 76,  2, -26, 2, -13, 2, 1,   3, -39,
57
145
      4, 16,  5, -55, 6, -76, 6, 37};
58
145
  std::vector<ushort> huff_buffer(19 * 256,0);
59
145
  ushort* huff = &huff_buffer[0];
60
145
  int row, col, tree, nreps, rep, step, i, c, s, r, x, y, val;
61
145
  short last[3] = {16, 16, 16}, mul[3], buf[3][3][386];
62
145
  static const ushort pt[] = {0,    0,    1280, 1344,  2320,  3616,
63
145
                              3328, 8000, 4095, 16383, 65535, 16383};
64
65
870
  for (i = 2; i < 12; i += 2)
66
9.50M
    for (c = pt[i - 2]; c <= pt[i]; c++)
67
9.50M
      curve[c] = ushort((float)(c - pt[i - 2]) / (pt[i] - pt[i - 2]) *
68
9.50M
                     (pt[i + 1] - pt[i - 1]) +
69
9.50M
                 pt[i - 1] + 0.5f);
70
18.9k
  for (s = i = 0; i < int(sizeof src); i += 2)
71
18.8k
    FORC(256 >> src[i])
72
668k
  ((ushort *)huff)[s++] = src[i] << 8 | (uchar)src[i + 1];
73
145
  s = kodak_cbpp == 243 ? 2 : 3;
74
37.1k
  FORC(256) huff[18 * 256 + c] = (8 - s) << 8 | c >> s << s | 1 << (s - 1);
75
145
  getbits(-1);
76
503k
  for (i = 0; i < int(sizeof(buf) / sizeof(short)); i++)
77
503k
    ((short *)buf)[i] = 2048;
78
1.13k
  for (row = 0; row < height; row += 4)
79
1.00k
  {
80
1.00k
    checkCancel();
81
2.99k
    FORC3 mul[c] = getbits(6);
82
1.00k
    if (!mul[0] || !mul[1] || !mul[2])
83
14
      throw LIBRAW_EXCEPTION_IO_CORRUPT;
84
987
    FORC3
85
2.76k
    {
86
2.76k
      val = ((0x1000000 / last[c] + 0x7ff) >> 12) * mul[c];
87
2.76k
      s = val > 65564 ? 10 : 12;
88
2.76k
      x = ~((~0u) << (s - 1));
89
2.76k
      val <<= 12 - s;
90
3.20M
      for (i = 0; i < int(sizeof(buf[0]) / sizeof(short)); i++)
91
3.19M
        ((short *)buf[c])[i] =
92
3.19M
            short((MIN(0x7FFFFFFF, (((short *)buf[c])[i] * static_cast<long long>(val) + x)) >> s) & 0xffff);
93
2.76k
      last[c] = mul[c];
94
6.45k
      for (r = 0; r <= int(!c); r++)
95
3.69k
      {
96
3.69k
        buf[c][1][width / 2] = buf[c][2][width / 2] = mul[c] << 7;
97
237k
        for (tree = 1, col = width / 2; col > 0;)
98
233k
        {
99
233k
          if ((tree = radc_token(tree)))
100
165k
          {
101
165k
            col -= 2;
102
165k
            if (col >= 0)
103
165k
            {
104
165k
              if (tree == 8)
105
14.0k
                FORYX buf[c][y][x] = (uchar)radc_token(18) * mul[c];
106
161k
              else
107
646k
                FORYX buf[c][y][x] = radc_token(tree + 10) * 16 + PREDICTOR;
108
165k
            }
109
165k
          }
110
68.1k
          else
111
68.1k
            do
112
72.3k
            {
113
72.3k
              nreps = (col > 2) ? radc_token(9) + 1 : 1;
114
326k
              for (rep = 0; rep < 8 && rep < nreps && col > 0; rep++)
115
253k
              {
116
253k
                col -= 2;
117
253k
                if (col >= 0)
118
1.01M
                  FORYX buf[c][y][x] = PREDICTOR;
119
253k
                if (rep & 1)
120
110k
                {
121
110k
                  step = radc_token(10) << 4;
122
441k
                  FORYX buf[c][y][x] += step;
123
110k
                }
124
253k
              }
125
72.3k
            } while (nreps == 9);
126
233k
        }
127
10.8k
        for (y = 0; y < 2; y++)
128
1.65M
          for (x = 0; x < width / 2; x++)
129
1.65M
          {
130
1.65M
            val = (buf[c][y + 1][x] << 4) / mul[c];
131
1.65M
            if (val < 0)
132
163k
              val = 0;
133
1.65M
            if (c)
134
1.65M
              RAW(row + y * 2 + c - 1, x * 2 + 2 - c) = val;
135
854k
            else
136
1.65M
              RAW(row + r * 2 + y, x * 2 + y) = val;
137
1.65M
          }
138
3.69k
        memcpy(buf[c][0] + !c, buf[c][2], sizeof buf[c][0] - 2 * !c);
139
3.69k
      }
140
2.76k
    }
141
4.43k
    for (y = row; y < row + 4; y++)
142
1.57M
      for (x = 0; x < width; x++)
143
1.57M
        if ((x + y) & 1)
144
785k
        {
145
785k
          r = x ? x - 1 : x + 1;
146
785k
          s = x + 1 < width ? x + 1 : x - 1;
147
785k
          val = (RAW(y, x) - 2048) * 2 + (RAW(y, r) + RAW(y, s)) / 2;
148
785k
          if (val < 0)
149
148k
            val = 0;
150
785k
          RAW(y, x) = val;
151
785k
        }
152
987
  }
153
531k
  for (i = 0; i < height * width; i++)
154
531k
    raw_image[i] = curve[raw_image[i]];
155
131
  maximum = 0x3fff;
156
131
}
157
158
#undef FORYX
159
#undef PREDICTOR
160
161
#ifdef NO_JPEG
162
void LibRaw::kodak_jpeg_load_raw() {}
163
#else
164
static void jpegErrorExit_k(j_common_ptr /*cinfo*/)
165
0
{
166
0
  throw LIBRAW_EXCEPTION_DECODE_JPEG;
167
0
}
168
169
// LibRaw's Kodak_jpeg_load_raw
170
void LibRaw::kodak_jpeg_load_raw()
171
0
{
172
0
  if (data_size < 1)
173
0
    throw LIBRAW_EXCEPTION_DECODE_JPEG;
174
175
0
  int row, col;
176
0
  struct jpeg_decompress_struct cinfo;
177
0
  struct jpeg_error_mgr pub;
178
0
  cinfo.err = jpeg_std_error(&pub);
179
0
  pub.error_exit = jpegErrorExit_k;
180
181
0
  if (INT64(data_size) >
182
0
          INT64(imgdata.rawparams.max_raw_memory_mb) * INT64(1024 * 1024))
183
0
    throw LIBRAW_EXCEPTION_TOOBIG;
184
185
0
  unsigned char *jpg_buf = (unsigned char *)calloc(data_size,1);
186
0
  std::vector<uchar> pixel_buf(width * 3, 0);
187
0
  jpeg_create_decompress(&cinfo);
188
189
0
  fread(jpg_buf, data_size, 1, ifp);
190
0
  libraw_swab(jpg_buf, int(data_size));
191
0
  try
192
0
  {
193
0
    jpeg_mem_src(&cinfo, jpg_buf, (unsigned long)data_size);
194
0
    int rc = jpeg_read_header(&cinfo, TRUE);
195
0
    if (rc != 1)
196
0
      throw LIBRAW_EXCEPTION_DECODE_JPEG;
197
198
0
    jpeg_start_decompress(&cinfo);
199
0
    if ((cinfo.output_width != width) || (cinfo.output_height * 2 != height) ||
200
0
        (cinfo.output_components != 3))
201
0
    {
202
0
      throw LIBRAW_EXCEPTION_DECODE_JPEG;
203
0
    }
204
205
0
    unsigned char *buf[1];
206
0
    buf[0] = pixel_buf.data();
207
208
0
    while (cinfo.output_scanline < cinfo.output_height)
209
0
    {
210
0
      checkCancel();
211
0
      row = cinfo.output_scanline * 2;
212
0
      jpeg_read_scanlines(&cinfo, buf, 1);
213
0
      unsigned char(*pixel)[3] = (unsigned char(*)[3])buf[0];
214
0
      for (col = 0; col < width; col += 2)
215
0
      {
216
0
        RAW(row + 0, col + 0) = pixel[col + 0][1] << 1;
217
0
        RAW(row + 1, col + 1) = pixel[col + 1][1] << 1;
218
0
        RAW(row + 0, col + 1) = pixel[col][0] + pixel[col + 1][0];
219
0
        RAW(row + 1, col + 0) = pixel[col][2] + pixel[col + 1][2];
220
0
      }
221
0
    }
222
0
  }
223
0
  catch (...)
224
0
  {
225
0
    jpeg_finish_decompress(&cinfo);
226
0
    jpeg_destroy_decompress(&cinfo);
227
0
    free(jpg_buf);
228
0
    throw;
229
0
  }
230
0
  jpeg_finish_decompress(&cinfo);
231
0
  jpeg_destroy_decompress(&cinfo);
232
0
  free(jpg_buf);
233
0
  maximum = 0xff << 1;
234
0
}
235
#endif
236
237
void LibRaw::kodak_dc120_load_raw()
238
14
{
239
14
  static const int mul[4] = {162, 192, 187, 92};
240
14
  static const int add[4] = {0, 636, 424, 212};
241
14
  uchar pixel[848];
242
14
  int row, shift, col;
243
244
1.30k
  for (row = 0; row < height; row++)
245
1.29k
  {
246
1.29k
    checkCancel();
247
1.29k
    if (fread(pixel, 1, 848, ifp) < 848)
248
13
      derror();
249
1.29k
    shift = row * mul[row & 3] + add[row & 3];
250
1.08M
    for (col = 0; col < width; col++)
251
1.08M
      RAW(row, col) = (ushort)pixel[(col + shift) % 848];
252
1.29k
  }
253
14
  maximum = 0xff;
254
14
}
255
void LibRaw::kodak_c330_load_raw()
256
51
{
257
51
  if (!image)
258
1
    throw LIBRAW_EXCEPTION_IO_CORRUPT;
259
50
  int row, col, y, cb, cr, rgb[3], c;
260
261
50
  std::vector<uchar> pixel(raw_width*2 + 4);
262
263
10.1k
  for (row = 0; row < height; row++)
264
10.1k
  {
265
10.1k
      checkCancel();
266
10.1k
      if (fread(pixel.data(), raw_width, 2, ifp) < 2)
267
49
          derror();
268
10.1k
      if (load_flags && (row & 31) == 31)
269
288
          fseek(ifp, raw_width * 32, SEEK_CUR);
270
312k
      for (col = 0; col < width; col++)
271
302k
      {
272
302k
          y = pixel[col * 2];
273
302k
          cb = pixel[(col * 2 & -4) | 1] - 128;
274
302k
          cr = pixel[(col * 2 & -4) | 3] - 128;
275
302k
          rgb[1] = y - ((cb + cr + 2) >> 2);
276
302k
          rgb[2] = rgb[1] + cb;
277
302k
          rgb[0] = rgb[1] + cr;
278
907k
          FORC3 image[row * width + col][c] = curve[LIM(rgb[c], 0, 255)];
279
302k
      }
280
10.1k
  }
281
50
  maximum = curve[0xff];
282
50
}
283
284
void LibRaw::kodak_c603_load_raw()
285
42
{
286
42
  if (!image)
287
0
    throw LIBRAW_EXCEPTION_IO_CORRUPT;
288
42
  int row, col, y, cb, cr, rgb[3], c;
289
290
42
  std::vector<uchar> pixel(raw_width * 3);
291
1.78k
  for (row = 0; row < height; row++)
292
1.74k
  {
293
1.74k
      checkCancel();
294
1.74k
      if (~row & 1)
295
893
          if (fread(pixel.data(), raw_width, 3, ifp) < 3)
296
40
              derror();
297
337k
      for (col = 0; col < width; col++)
298
335k
      {
299
335k
          y = pixel[width * 2 * (row & 1) + col];
300
335k
          cb = pixel[width + (col & -2)] - 128;
301
335k
          cr = pixel[width + (col & -2) + 1] - 128;
302
335k
          rgb[1] = y - ((cb + cr + 2) >> 2);
303
335k
          rgb[2] = rgb[1] + cb;
304
335k
          rgb[0] = rgb[1] + cr;
305
1.00M
          FORC3 image[row * width + col][c] = curve[LIM(rgb[c], 0, 255)];
306
335k
      }
307
1.74k
  }
308
42
  maximum = curve[0xff];
309
42
}
310
311
void LibRaw::kodak_262_load_raw()
312
410
{
313
410
  static const uchar kodak_tree[2][26] = {
314
410
      {0, 1, 5, 1, 1, 2, 0, 0, 0, 0, 0, 0, 0,
315
410
       0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9},
316
410
      {0, 3, 1, 1, 1, 1, 1, 2, 0, 0, 0, 0, 0,
317
410
       0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9}};
318
410
  ushort *huff[2];
319
410
  int *strip, ns, c, row, col, chess, pi = 0, pi1, pi2, pred, val;
320
321
820
  FORC(2) huff[c] = make_decoder(kodak_tree[c]);
322
410
  ns = (raw_height + 63) >> 5;
323
410
  std::vector<uchar> pixel(raw_width * 32 + ns * 4);
324
410
  strip = (int *)(pixel.data() + raw_width * 32);
325
410
  order = 0x4d4d;
326
5.90k
  FORC(ns) strip[c] = get4();
327
410
  try
328
410
  {
329
133k
    for (row = 0; row < raw_height; row++)
330
133k
    {
331
133k
      checkCancel();
332
133k
      if ((row & 31) == 0)
333
4.38k
      {
334
4.38k
        fseek(ifp, strip[row >> 5], SEEK_SET);
335
4.38k
        getbits(-1);
336
4.38k
        pi = 0;
337
4.38k
      }
338
75.3M
      for (col = 0; col < raw_width; col++)
339
75.2M
      {
340
75.2M
        chess = (row + col) & 1;
341
75.2M
        pi1 = chess ? pi - 2 : pi - raw_width - 1;
342
75.2M
        pi2 = chess ? pi - 2 * raw_width : pi - raw_width + 1;
343
75.2M
        if (col <= chess)
344
200k
          pi1 = -1;
345
75.2M
        if (pi1 < 0)
346
1.52M
          pi1 = pi2;
347
75.2M
        if (pi2 < 0)
348
3.96M
          pi2 = pi1;
349
75.2M
        if (pi1 < 0 && col > 1)
350
1.31M
          pi1 = pi2 = pi - 2;
351
75.2M
        pred = (pi1 < 0) ? 0 : (pixel[pi1] + pixel[pi2]) >> 1;
352
75.2M
        pixel[pi] = val = pred + ljpeg_diff(huff[chess]);
353
75.2M
        if (val >> 8)
354
44.4k
          derror();
355
75.2M
        val = curve[pixel[pi++]];
356
75.2M
        RAW(row, col) = val;
357
75.2M
      }
358
133k
    }
359
410
  }
360
410
  catch (...)
361
410
  {
362
26
      FORC(2) free(huff[c]);
363
13
      throw;
364
13
  }
365
794
  FORC(2) free(huff[c]);
366
397
}
367
368
int LibRaw::kodak_65000_decode(short *out, int bsize)
369
478k
{
370
478k
  uchar c, blen[768];
371
478k
  ushort raw[6];
372
478k
  INT64 bitbuf = 0;
373
478k
  int bits = 0, i, j, len, diff;
374
478k
  INT64 save;
375
376
478k
  save = ftell(ifp);
377
478k
  bsize = (bsize + 3) & -4;
378
548k
  for (i = 0; i < bsize; i += 2)
379
547k
  {
380
547k
    c = fgetc(ifp);
381
547k
    if ((blen[i] = c & 15) > 12 || (blen[i + 1] = c >> 4) > 12)
382
477k
    {
383
477k
      fseek(ifp, save, SEEK_SET);
384
14.4M
      for (i = 0; i < bsize; i += 8)
385
13.9M
      {
386
13.9M
        read_shorts(raw, 6);
387
13.9M
        out[i] = raw[0] >> 12 << 8 | raw[2] >> 12 << 4 | raw[4] >> 12;
388
13.9M
        out[i + 1] = raw[1] >> 12 << 8 | raw[3] >> 12 << 4 | raw[5] >> 12;
389
97.8M
        for (j = 0; j < 6; j++)
390
83.8M
          out[i + 2 + j] = raw[j] & 0xfff;
391
13.9M
      }
392
477k
      return 1;
393
477k
    }
394
547k
  }
395
1.12k
  if ((bsize & 7) == 4)
396
578
  {
397
578
    bitbuf = fgetc(ifp) << 8;
398
578
    bitbuf += fgetc(ifp);
399
578
    bits = 16;
400
578
  }
401
96.3k
  for (i = 0; i < bsize; i++)
402
95.2k
  {
403
95.2k
    len = blen[i];
404
95.2k
    if (bits < len)
405
3.38k
    {
406
16.9k
      for (j = 0; j < 32; j += 8)
407
13.5k
        bitbuf += (INT64)fgetc(ifp) << (bits + (j ^ 8));
408
3.38k
      bits += 32;
409
3.38k
    }
410
95.2k
    diff = bitbuf & (0xffff >> (16 - len));
411
95.2k
    bitbuf >>= len;
412
95.2k
    bits -= len;
413
95.2k
    if (len > 0 && (diff & (1 << (len - 1))) == 0)
414
18.4k
      diff -= (1 << len) - 1;
415
95.2k
    out[i] = diff;
416
95.2k
  }
417
1.12k
  return 0;
418
478k
}
419
420
void LibRaw::kodak_65000_load_raw()
421
40
{
422
40
  short buf[272]; /* 264 looks enough */
423
40
  int row, col, len, pred[2], ret, i;
424
425
38.8k
  for (row = 0; row < height; row++)
426
38.8k
  {
427
38.8k
    checkCancel();
428
115k
    for (col = 0; col < width; col += 256)
429
76.8k
    {
430
76.8k
      pred[0] = pred[1] = 0;
431
76.8k
      len = MIN(256, width - col);
432
76.8k
      ret = kodak_65000_decode(buf, len);
433
10.9M
      for (i = 0; i < len; i++)
434
10.8M
      {
435
10.8M
        int idx = ret ? buf[i] : (pred[i & 1] += buf[i]);
436
10.8M
        if (idx >= 0 && idx < 0xffff)
437
10.8M
        {
438
10.8M
          if ((RAW(row, col + i) = curve[idx]) >> 12)
439
791k
            derror();
440
10.8M
        }
441
4.32k
        else
442
4.32k
          derror();
443
10.8M
      }
444
76.8k
    }
445
38.8k
  }
446
40
}
447
448
void LibRaw::kodak_ycbcr_load_raw()
449
81
{
450
81
  if (!image)
451
1
    throw LIBRAW_EXCEPTION_IO_CORRUPT;
452
80
  short buf[384], *bp;
453
80
  int row, col, len, c, i, j, k, y[2][2], cb, cr, rgb[3];
454
80
  ushort *ip;
455
456
80
  unsigned int bits =
457
80
      (load_flags && load_flags > 9 && load_flags < 17) ? load_flags : 10;
458
80
  const int pixels = int(width)*int(height);
459
115k
  for (row = 0; row < height; row += 2)
460
115k
  {
461
115k
    checkCancel();
462
339k
    for (col = 0; col < width; col += 128)
463
224k
    {
464
224k
      len = MIN(128, width - col);
465
224k
      kodak_65000_decode(buf, len * 3);
466
224k
      y[0][1] = y[1][1] = cb = cr = 0;
467
8.23M
      for (bp = buf, i = 0; i < len; i += 2, bp += 2)
468
8.01M
      {
469
8.01M
        cb += bp[4];
470
8.01M
        cr += bp[5];
471
8.01M
        rgb[1] = -((cb + cr + 2) >> 2);
472
8.01M
        rgb[2] = rgb[1] + cb;
473
8.01M
        rgb[0] = rgb[1] + cr;
474
24.0M
        for (j = 0; j < 2; j++)
475
48.0M
          for (k = 0; k < 2; k++)
476
32.0M
          {
477
32.0M
            if ((y[j][k] = y[j][k ^ 1] + *bp++) >> bits)
478
30.3M
              derror();
479
32.0M
            int indx = (row + j) * width + col + i + k;
480
32.0M
            if(indx>=0 && indx < pixels)
481
32.0M
            {
482
32.0M
                ip = image[indx];
483
96.1M
                FORC3 ip[c] = curve[LIM(y[j][k] + rgb[c], 0, 0xfff)];
484
32.0M
            }
485
32.0M
          }
486
8.01M
      }
487
224k
    }
488
115k
  }
489
80
}
490
491
void LibRaw::kodak_rgb_load_raw()
492
67
{
493
67
  if (!image)
494
1
    throw LIBRAW_EXCEPTION_IO_CORRUPT;
495
66
  short buf[768], *bp;
496
66
  int row, col, len, c, i, rgb[3], ret;
497
66
  ushort *ip = image[0];
498
499
119k
  for (row = 0; row < height; row++)
500
119k
  {
501
119k
    checkCancel();
502
296k
    for (col = 0; col < width; col += 256)
503
177k
    {
504
177k
      len = MIN(256, width - col);
505
177k
      ret = kodak_65000_decode(buf, len * 3);
506
177k
      memset(rgb, 0, sizeof rgb);
507
17.4M
      for (bp = buf, i = 0; i < len; i++, ip += 4)
508
17.2M
        if (load_flags == 12)
509
0
          FORC3 ip[c] = ret ? (*bp++) : (rgb[c] += *bp++);
510
17.2M
        else
511
51.8M
          FORC3 if ((ip[c] = ret ? (*bp++) : (rgb[c] += *bp++)) >> 12) derror();
512
177k
    }
513
119k
  }
514
66
}
515
516
void LibRaw::kodak_thumb_load_raw()
517
0
{
518
0
  if (!image)
519
0
    throw LIBRAW_EXCEPTION_IO_CORRUPT;
520
0
  int row, col;
521
0
  colors = thumb_misc >> 5;
522
0
  for (row = 0; row < height; row++)
523
0
    for (col = 0; col < width; col++)
524
0
      read_shorts(image[row * width + col], colors);
525
0
  maximum = (1 << (thumb_misc & 31)) - 1;
526
0
}