Coverage Report

Created: 2026-07-20 07:19

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libraw/src/metadata/tiff.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
int LibRaw::parse_tiff_ifd(INT64 base)
23
246k
{
24
246k
  unsigned entries, tag, type, len, plen = 16, utmp;
25
246k
  INT64 save;
26
246k
  int ifd, use_cm = 0, cfa, i, j, c, ima_len = 0;
27
246k
  char *cbuf, *cp;
28
246k
  uchar cfa_pat[16], cfa_pc[] = {0, 1, 2, 3}, tab[256];
29
246k
  double fm[3][4], cc[4][4], cm[4][3], cam_xyz[4][3], num;
30
246k
  double ab[] = {1, 1, 1, 1}, asn[] = {0, 0, 0, 0}, xyz[] = {1, 1, 1};
31
246k
  unsigned sony_curve[] = {0, 0, 0, 0, 0, 4095};
32
246k
  unsigned *buf, sony_offset = 0, sony_length = 0, sony_key = 0;
33
246k
  struct jhead jh;
34
35
246k
  ushort *rafdata;
36
37
246k
  if (tiff_nifds >= sizeof tiff_ifd / sizeof tiff_ifd[0])
38
72.4k
    return 1;
39
174k
  ifd = tiff_nifds++;
40
870k
  for (j = 0; j < 4; j++)
41
3.48M
    for (i = 0; i < 4; i++)
42
2.78M
      cc[j][i] = i == j;
43
44
174k
  memset(cm,0,sizeof(cm));
45
174k
  memset(fm,0,sizeof(fm));
46
47
174k
  if (libraw_internal_data.unpacker_data.ifd0_offset == -1LL)
48
35.7k
    libraw_internal_data.unpacker_data.ifd0_offset = base;
49
50
174k
  entries = get2();
51
174k
  if (entries > 512)
52
15.3k
    return 1;
53
54
158k
  INT64 fsize = ifp->size();
55
56
21.0M
  while (entries--)
57
20.9M
  {
58
20.9M
    tiff_get(base, &tag, &type, &len, &save);
59
20.9M
    INT64 savepos = ftell(ifp);
60
20.9M
    if (len > 8 && savepos + len > 2 * fsize)
61
16.8M
    {
62
16.8M
      fseek(ifp, save, SEEK_SET); // Recover tiff-read position!!
63
16.8M
      continue;
64
16.8M
    }
65
4.14M
    if (callbacks.exif_cb)
66
0
    {
67
0
      callbacks.exif_cb(callbacks.exifparser_data,
68
0
                        tag | (is_pana_raw ? 0x30000 : ((ifd + 1) << 20)), type,
69
0
                        len, order, ifp, base);
70
0
      fseek(ifp, savepos, SEEK_SET);
71
0
    }
72
4.14M
    if (!is_pana_raw)
73
2.69M
    { /* processing of EXIF tags that collide w/ PanasonicRaw tags */
74
2.69M
      switch (tag)
75
2.69M
      {
76
47.1k
      case 0x0001:
77
47.1k
        if (len == 4)
78
6.19k
          is_pana_raw = get4();
79
47.1k
        break;
80
4.06k
      case 0x000b: /* 11, Std. EXIF Software tag */
81
4.06k
        fgets(software, 64, ifp);
82
4.06k
        if (!strncmp(software, "Adobe", 5) || !strncmp(software, "dcraw", 5) ||
83
3.76k
            !strncmp(software, "UFRaw", 5) || !strncmp(software, "Bibble", 6) ||
84
3.50k
            !strcmp(software, "Digital Photo Professional"))
85
631
          is_raw = 0;
86
4.06k
        break;
87
1.57k
      case 0x001c: /*  28, safeguard, probably not needed */
88
3.02k
      case 0x001d: /*  29, safeguard, probably not needed */
89
3.93k
      case 0x001e: /*  30, safeguard, probably not needed */
90
3.93k
        cblack[tag - 0x001c] = get2();
91
3.93k
        cblack[3] = cblack[1];
92
3.93k
        break;
93
94
19.2k
      case 0x0111: /* 273, StripOffset */
95
19.2k
        if (len > 1 && len < 16384)
96
8.69k
        {
97
8.69k
          INT64 sav = ftell(ifp);
98
8.69k
          tiff_ifd[ifd].strip_offsets = (INT64 *)calloc(len, sizeof(INT64));
99
8.69k
          tiff_ifd[ifd].strip_offsets_count = len;
100
948k
          for (int ii = 0; ii < (int)len; ii++)
101
939k
            tiff_ifd[ifd].strip_offsets[ii] = get4() + base;
102
8.69k
          fseek(ifp, sav, SEEK_SET); // restore position
103
8.69k
        }
104
        /* fallback */
105
22.9k
      case 0x0201: /* 513, JpegIFOffset */
106
23.3k
      case 0xf007: // 61447
107
23.3k
        tiff_ifd[ifd].offset = get4() + base;
108
23.3k
        if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0)
109
17.9k
        {
110
17.9k
          fseek(ifp, tiff_ifd[ifd].offset, SEEK_SET);
111
17.9k
          if (ljpeg_start(&jh, 1))
112
1.16k
          {
113
1.16k
            if (!dng_version && !strcasecmp(make, "SONY") && tiff_ifd[ifd].phint == 32803 &&
114
19
                tiff_ifd[ifd].comp == 7) // Sony/lossless compressed IFD
115
0
            {
116
0
              tiff_ifd[ifd].comp = 6;
117
0
              tiff_ifd[ifd].bps = jh.bits;
118
0
              tiff_ifd[ifd].samples = 1;
119
0
            }
120
1.16k
            else if (!dng_version && !strcasecmp(make, "SONY") && tiff_ifd[ifd].phint == 6 &&
121
98
                tiff_ifd[ifd].comp == 7 && tiff_ifd[ifd].samples == 3) // Sony/lossless YCbCr
122
0
            {
123
0
              tiff_ifd[ifd].comp = 6;
124
0
              tiff_ifd[ifd].bps = jh.bits;
125
              // tiff_ifd[ifd].samples = 3; // no change
126
0
            }
127
1.16k
            else
128
1.16k
            {
129
1.16k
              tiff_ifd[ifd].comp = 6;
130
1.16k
              tiff_ifd[ifd].bps = jh.bits;
131
1.16k
              tiff_ifd[ifd].t_width = jh.wide;
132
1.16k
              tiff_ifd[ifd].t_height = jh.high;
133
1.16k
              tiff_ifd[ifd].samples = jh.clrs;
134
1.16k
              if (!(jh.sraw || (jh.clrs & 1)))
135
222
                tiff_ifd[ifd].t_width *= jh.clrs;
136
1.16k
              if ((tiff_ifd[ifd].t_width > 4 * tiff_ifd[ifd].t_height) & ~jh.clrs)
137
230
              {
138
230
                tiff_ifd[ifd].t_width /= 2;
139
230
                tiff_ifd[ifd].t_height *= 2;
140
230
              }
141
1.16k
              i = order;
142
1.16k
              parse_tiff(tiff_ifd[ifd].offset + 12);
143
1.16k
              order = i;
144
1.16k
            }
145
1.16k
          }
146
17.9k
        }
147
23.3k
        break;
148
2.69M
      }
149
2.69M
    }
150
1.44M
    else
151
1.44M
    { /* processing Panasonic-specific "PanasonicRaw" tags */
152
1.44M
      switch (tag)
153
1.44M
      {
154
8.61k
      case 0x0004: /*   4, SensorTopBorder */
155
8.61k
        imgdata.sizes.raw_inset_crops[0].ctop = get2();
156
8.61k
        break;
157
2.07k
      case 0x000a: /*  10, BitsPerSample */
158
2.07k
        pana_bpp = get2();
159
2.07k
    pana_bpp = LIM(pana_bpp, 8, 16);
160
2.07k
        break;
161
1.71k
      case 0x000b: /*  11, Compression */
162
1.71k
        imPana.Compression = get2();
163
1.71k
        break;
164
1.16k
      case 0x000e: /*  14, LinearityLimitRed */
165
5.78k
      case 0x000f: /*  15, LinearityLimitGreen */
166
13.2k
      case 0x0010: /*  16, LinearityLimitBlue */
167
13.2k
        imgdata.color.linear_max[tag - 14] = get2();
168
13.2k
        if (imgdata.color.linear_max[tag - 14] == 16383)
169
44
            imgdata.color.linear_max[tag - 14] -= 64;
170
13.2k
        if (imgdata.color.linear_max[tag - 14] == 4095)
171
128
          imgdata.color.linear_max[tag - 14] -= 16;
172
13.2k
        if (tag == 0x000f) // 15, LinearityLimitGreen
173
4.61k
          imgdata.color.linear_max[3] = imgdata.color.linear_max[1];
174
13.2k
        break;
175
1.72k
      case 0x0013: /*  19, WBInfo */
176
1.72k
        if ((i = get2()) > 0x100)
177
635
          break;
178
32.2k
        for (c = 0; c < i; c++)
179
31.1k
        {
180
31.1k
          if ((j = get2()) < 0x100)
181
12.0k
          {
182
12.0k
        if (j >= 0) {
183
12.0k
          icWBC[j][0] = get2();
184
12.0k
          icWBC[j][2] = get2();
185
12.0k
          icWBC[j][1] = icWBC[j][3] =
186
12.0k
            0x100;
187
12.0k
        }
188
12.0k
          }
189
19.0k
          else // light source out of EXIF numbers range
190
19.0k
            get4();
191
31.1k
        }
192
1.09k
        break;
193
591
      case 0x0018: /* 24, HighISOMultiplierRed */
194
1.91k
      case 0x0019: /* 25, HighISOMultiplierGreen */
195
3.01k
      case 0x001a: /* 26, HighISOMultiplierBlue */
196
3.01k
        imPana.HighISOMultiplier[tag - 0x0018] = get2();
197
3.01k
        break;
198
1.39k
      case 0x001c: /*  28, BlackLevelRed */
199
1.88k
      case 0x001d: /*  29, BlackLevelGreen */
200
2.56k
      case 0x001e: /*  30, BlackLevelBlue */
201
2.56k
        pana_black[tag - 0x001c] = get2();
202
2.56k
        break;
203
1.51k
      case 0x002d: /*  45, RawFormat */
204
                   /* pana_encoding: tag 0x002d (45dec) not used - DMC-LX1/FZ30/FZ50/L1/LX1/LX2
205
                        2 - RAW DMC-FZ8/FZ18
206
                        3 - RAW DMC-L10
207
                        4 - RW2 for most other models, including G9 in "pixel shift off" mode and YUNEEC CGO4
208
                            (must add 15 to black levels for RawFormat == 4)
209
                        5 - RW2 DC-GH5s; G9 in "pixel shift on" mode
210
                        6 - RW2 DC-S1, DC-S1R in "pixel shift off" mode
211
                        7 - RW2 DC-S1R (probably DC-S1 too) in "pixel shift on" mode
212
                        8 - RW2 DC-GH6, DC-S5M2
213
                   */
214
1.51k
        pana_encoding = get2();
215
1.51k
        break;
216
666
      case 0x002f: /*  47, CropTop */
217
666
        imgdata.sizes.raw_inset_crops[0].ctop = get2();
218
666
        break;
219
1.20k
      case 0x0030: /*  48, CropLeft */
220
1.20k
        imgdata.sizes.raw_inset_crops[0].cleft = get2();
221
1.20k
        break;
222
932
      case 0x0031: /*  49, CropBottom */
223
932
        imgdata.sizes.raw_inset_crops[0].cheight =
224
932
            get2() - imgdata.sizes.raw_inset_crops[0].ctop;
225
932
        break;
226
1.15k
      case 0x0032: /*  50, CropRight */
227
1.15k
        imgdata.sizes.raw_inset_crops[0].cwidth =
228
1.15k
            get2() - imgdata.sizes.raw_inset_crops[0].cleft;
229
1.15k
        break;
230
461
      case 0x0037: /*  55, ISO if  ISO in 0x8827 & ISO in 0x0017 == 65535 */
231
461
        if (iso_speed == 65535)
232
38
          iso_speed = float(get4());
233
461
        break;
234
1.15k
    case 0x0039:
235
1.15k
        if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26)
236
438
        {
237
438
          ushort cnt = get2();
238
438
          if (cnt > 6)
239
86
            cnt = 6;
240
1.00k
          for (i = 0; i < cnt; i++)
241
564
            pana8.tag39[i] = get4();
242
438
        }
243
1.15k
        break;
244
1.91k
      case 0x003A:
245
1.91k
        if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26)
246
256
        {
247
256
          ushort cnt = get2();
248
256
          if (cnt > 6)
249
135
            cnt = 6;
250
1.13k
      for (i = 0; i < cnt; i++)
251
874
      {
252
874
        get2();
253
874
        pana8.tag3A[i] = get2();
254
874
      }
255
256
        }
256
1.91k
        break;
257
961
      case 0x003B:
258
961
        if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1)
259
54
            pana8.tag3B = get2();
260
961
        break;
261
560
      case 0x003C:
262
2.76k
      case 0x003D:
263
3.20k
      case 0x003E:
264
4.01k
      case 0x003F:
265
4.01k
        if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1)
266
429
          pana8.initial[tag - 0x3c] = get2();
267
4.01k
        break;
268
3.56k
      case 0x0040:
269
3.56k
        if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 70)
270
324
        {
271
324
      ushort count = get2();
272
324
      if (count > 17) count = 17;
273
3.68k
      for (i = 0; i < count; i++)
274
3.36k
      {
275
3.36k
        ushort v1 = get2();
276
3.36k
        if (v1 > 16u) v1 = 16u;
277
3.36k
        pana8.tag40a[i] = v1;
278
3.36k
        ushort v2 = get2();
279
3.36k
        if (v2 > 0xfffu)
280
1.77k
          v2 = 0xfffu;
281
3.36k
        pana8.tag40b[i] = v2;
282
3.36k
      }
283
324
        }
284
3.56k
        break;
285
1.43k
      case 0x0041:
286
1.43k
        if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 36)
287
280
        {
288
280
          ushort count = get2();
289
280
          if (count > 17)
290
171
            count = 17;
291
3.29k
          for (i = 0; i < count; i++)
292
3.01k
          {
293
3.01k
            ushort v1 = get2();
294
3.01k
      if (v1 > 0x40u) v1 = 64;
295
3.01k
            pana8.tag41[i] = v1;
296
3.01k
          }
297
280
        }
298
1.43k
        break;
299
803
      case 0x0042:
300
803
        if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1)
301
197
        {
302
197
          ushort val = get2();
303
197
          if (val > 5)
304
137
            val = 5;
305
197
          pana8.stripe_count = val;
306
197
        }
307
803
        break;
308
1.13k
      case 0x0043:
309
1.13k
        if (type == LIBRAW_EXIFTAG_TYPE_SHORT && len == 1)
310
277
        {
311
277
          ushort val = get2();
312
277
          if (val > 5)
313
208
            val = 5;
314
277
          pana8.tag43 = val;
315
277
        }
316
1.13k
        break;
317
608
      case 0x0044:
318
608
        if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 50)
319
122
        {
320
122
          ushort count = get2();
321
122
          if (count > 5)
322
79
            count = 5;
323
561
          for (i = 0; i < count; i++)
324
439
            pana8.stripe_offsets[i] = get4();
325
122
        }
326
608
        break;
327
1.21k
      case 0x0045:
328
1.21k
        if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 50)
329
105
        {
330
105
          ushort count = get2();
331
105
          if (count > 5)
332
79
            count = 5;
333
510
          for (i = 0; i < count; i++)
334
405
            pana8.stripe_left[i] = get4();
335
105
        }
336
1.21k
        break;
337
740
      case 0x0046:
338
740
        if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 50)
339
156
        {
340
156
          ushort count = get2();
341
156
          if (count > 5)
342
86
            count = 5;
343
596
          for (i = 0; i < count; i++)
344
440
            pana8.stripe_compressed_size[i] = get4();
345
156
        }
346
740
        break;
347
2.02k
      case 0x0047:
348
2.02k
        if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26)
349
599
        {
350
599
          ushort count = get2();
351
599
          if (count > 5)
352
452
            count = 5;
353
2.93k
          for (i = 0; i < count; i++)
354
2.33k
            pana8.stripe_width[i] = get2();
355
599
        }
356
2.02k
        break;
357
1.78k
      case 0x0048:
358
1.78k
        if (type == LIBRAW_EXIFTAG_TYPE_UNDEFINED && len == 26)
359
811
        {
360
811
          ushort count = get2();
361
811
          if (count > 5)
362
384
            count = 5;
363
2.82k
          for (i = 0; i < count; i++)
364
2.01k
            pana8.stripe_height[i] = get2();
365
811
        }
366
1.78k
        break;
367
5.05k
    case 0x011c: /* 284, Gamma */
368
5.05k
      {
369
5.05k
        int n = get2();
370
5.05k
        if (n >= 1024)
371
748
          imPana.gamma = (float)n / 1024.0f;
372
4.30k
        else if (n >= 256)
373
958
          imPana.gamma = (float)n / 256.0f;
374
3.34k
        else
375
3.34k
          imPana.gamma = (float)n / 100.0f;
376
5.05k
      }
377
5.05k
      break;
378
11.7k
      case 0x0120: /* 288, CameraIFD, contains tags 0x1xxx, 0x2xxx, 0x3xxx */
379
11.7k
      {
380
11.7k
        unsigned sorder = order;
381
11.7k
        INT64 sbase = base;
382
11.7k
        base = ftell(ifp);
383
11.7k
        order = get2();
384
11.7k
        fseek(ifp, 2, SEEK_CUR);
385
11.7k
        fseek(ifp, INT64(get4()) - 8LL, SEEK_CUR);
386
11.7k
        parse_tiff_ifd(base);
387
11.7k
        base = sbase;
388
11.7k
        order = sorder;
389
11.7k
      }
390
11.7k
      break;
391
413
      case 0x0121: /* 289, Multishot, 0 is Off, 65536 is Pixel Shift */
392
413
        imPana.Multishot = get4();
393
413
        break;
394
1.53k
      case 0x1001:
395
1.53k
        if (imPana.Multishot == 0) {
396
361
          imPana.Multishot = get4();
397
361
          if (imPana.Multishot)
398
154
            imPana.Multishot += 65535;
399
361
        }
400
1.53k
        break;
401
2.12k
      case 0x1100:
402
2.12k
        imPana.FocusStepNear = get2();
403
2.12k
        break;
404
672
      case 0x1101:
405
672
        imPana.FocusStepCount = get2();
406
672
        break;
407
96
      case 0x1105:
408
96
        imPana.ZoomPosition = get4();
409
96
        break;
410
3.10k
      case 0x1201:
411
3.10k
        if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT)) {
412
299
          imPana.LensManufacturer = fgetc(ifp);
413
2.80k
        } else if (type == 258) {
414
1.91k
          imPana.LensManufacturer = get4();
415
1.91k
          if (imPana.LensManufacturer >= 257) {
416
830
            ilm.LensMount = LIBRAW_MOUNT_LPS_L;
417
830
            ilm.LensFormat = LIBRAW_FORMAT_FF;
418
830
          }
419
1.91k
        }
420
3.10k
        break;
421
2.14k
      case 0x1202:
422
2.14k
        if (ilm.LensMount == LIBRAW_MOUNT_LPS_L) {
423
867
          if ((utmp = get2())) ilm.LensID = utmp;
424
1.27k
        } else if ((imPana.LensManufacturer != 0xff) &&
425
1.24k
                   (imPana.LensManufacturer != 0xffffffff)) {
426
770
          if ((utmp = (fgetc(ifp) << 8) | fgetc(ifp)))
427
194
            ilm.LensID = (imPana.LensManufacturer << 16) + utmp;
428
770
        }
429
2.14k
        break;
430
535
      case 0x1203: /* 4611, FocalLengthIn35mmFormat, contained in 0x0120
431
                      CameraIFD */
432
535
        if (imgdata.lens.FocalLengthIn35mmFormat < 0.65f)
433
214
          imgdata.lens.FocalLengthIn35mmFormat = get2();
434
535
        break;
435
323
      case 0x2009: /* 8201, contained in 0x0120 CameraIFD */
436
323
        if ((pana_encoding == 4) || (pana_encoding == 5))
437
173
        {
438
173
          i = MIN(8, len);
439
173
          int permut[8] = {3, 2, 1, 0, 3 + 4, 2 + 4, 1 + 4, 0 + 4};
440
173
          imPana.BlackLevelDim = len;
441
729
          for (j = 0; j < i; j++)
442
556
          {
443
556
            imPana.BlackLevel[permut[j]] =
444
556
                (float)(get2()) / (float)(powf(2.f, 14.f - pana_bpp));
445
556
          }
446
173
        }
447
323
        break;
448
227
      case 0x3420: /* 13344, WB_RedLevelAuto, contained in 0x0120 CameraIFD */
449
227
        icWBC[LIBRAW_WBI_Auto][0] = get2();
450
227
        icWBC[LIBRAW_WBI_Auto][1] = icWBC[LIBRAW_WBI_Auto][3] = 1024;
451
227
        break;
452
125
      case 0x3421: /* 13345, WB_BlueLevelAuto, contained in 0x0120 CameraIFD */
453
125
        icWBC[LIBRAW_WBI_Auto][2] = get2();
454
125
        break;
455
5.61k
      case 0x0002: /*   2, ImageWidth */
456
5.61k
        tiff_ifd[ifd].t_width = getint(type);
457
5.61k
        break;
458
5.85k
      case 0x0003: /*   3, ImageHeight */
459
5.85k
        tiff_ifd[ifd].t_height = getint(type);
460
5.85k
        break;
461
3.82k
      case 0x0005: /*   5, SensorLeftBorder */
462
3.82k
        width = get2();
463
3.82k
        imgdata.sizes.raw_inset_crops[0].cleft = width;
464
3.82k
        break;
465
2.73k
      case 0x0006: /*   6, SensorBottomBorder */
466
2.73k
        height = get2();
467
2.73k
        imgdata.sizes.raw_inset_crops[0].cheight =
468
2.73k
            height - imgdata.sizes.raw_inset_crops[0].ctop;
469
2.73k
        break;
470
2.21k
      case 0x0007: /*   7, SensorRightBorder */
471
2.21k
        i = get2();
472
2.21k
        width += i;
473
2.21k
        imgdata.sizes.raw_inset_crops[0].cwidth =
474
2.21k
            i - imgdata.sizes.raw_inset_crops[0].cleft;
475
2.21k
        break;
476
2.92k
      case 0x0009: /*   9, CFAPattern */
477
2.92k
        if ((i = get2()))
478
1.68k
          filters = i;
479
2.92k
        break;
480
1.33k
      case 0x0011: /*  17, RedBalance */
481
3.57k
      case 0x0012: /*  18, BlueBalance */
482
3.57k
        if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT) && len == 1)
483
237
          cam_mul[(tag - 0x0011) * 2] = get2() / 256.f;
484
3.57k
        break;
485
1.22k
      case 0x0017: /*  23, ISO */
486
1.22k
        if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_SHORT))
487
173
          iso_speed = get2();
488
1.22k
        break;
489
498
      case 0x0024: /*  36, WBRedLevel */
490
868
      case 0x0025: /*  37, WBGreenLevel */
491
1.19k
      case 0x0026: /*  38, WBBlueLevel */
492
1.19k
        cam_mul[tag - 0x0024] = get2();
493
1.19k
        break;
494
3.76k
      case 0x0027: /*  39, WBInfo2 */
495
3.76k
        if ((i = get2()) > 0x100)
496
1.43k
          break;
497
244k
        for (c = 0; c < i; c++)
498
242k
        {
499
242k
          if ((j = get2()) < 0x100)
500
90.3k
          {
501
90.3k
        if (j >= 0) {
502
90.3k
          icWBC[j][0] = get2();
503
90.3k
          icWBC[j][1] = icWBC[j][3] = get2();
504
90.3k
          icWBC[j][2] = get2();
505
90.3k
          if (c == 1 && i > 6 && cam_mul[0] <= 0.001f)
506
1.91k
            for (int q = 0; q < 4; q++)
507
1.53k
              cam_mul[q] = float(icWBC[j][q]);
508
90.3k
        }
509
90.3k
          }
510
151k
          else
511
151k
            fseek(ifp, 6, SEEK_CUR);
512
242k
        }
513
2.33k
        break;
514
1.51k
      case 0x002e: /*  46, JpgFromRaw */
515
1.51k
        if ((type != LIBRAW_EXIFTAG_TYPE_UNDEFINED) || (fgetc(ifp) != 0xff) || (fgetc(ifp) != 0xd8))
516
1.42k
          break;
517
84
        thumb_offset = ftell(ifp) - 2;
518
84
        thumb_length = len;
519
84
        break;
520
521
1.00k
      case 0x0118: /* 280, Panasonic RW2 offset */
522
1.00k
        if (type != LIBRAW_EXIFTAG_TYPE_LONG)
523
505
          break;
524
504
        load_raw = &LibRaw::panasonic_load_raw;
525
504
        load_flags = 0x2008;
526
8.54k
      case 0x0111: /* 273, StripOffset */
527
8.54k
        if (len > 1 && len < 16384)
528
3.93k
        {
529
3.93k
          INT64 sav = ftell(ifp);
530
3.93k
          tiff_ifd[ifd].strip_offsets = (INT64 *)calloc(len, sizeof(INT64));
531
3.93k
          tiff_ifd[ifd].strip_offsets_count = len;
532
5.85M
          for (int ii = 0; ii < (int)len; ii++)
533
5.84M
            tiff_ifd[ifd].strip_offsets[ii] = get4() + base;
534
3.93k
          fseek(ifp, sav, SEEK_SET); // restore position
535
3.93k
        }
536
        /* fallthrough */
537
8.54k
        tiff_ifd[ifd].offset = get4() + base;
538
8.54k
        if (!tiff_ifd[ifd].bps && tiff_ifd[ifd].offset > 0)
539
5.99k
        {
540
5.99k
          fseek(ifp, tiff_ifd[ifd].offset, SEEK_SET);
541
5.99k
          if (ljpeg_start(&jh, 1))
542
225
          {
543
225
            tiff_ifd[ifd].comp = 6;
544
225
            tiff_ifd[ifd].t_width = jh.wide;
545
225
            tiff_ifd[ifd].t_height = jh.high;
546
225
            tiff_ifd[ifd].bps = jh.bits;
547
225
            tiff_ifd[ifd].samples = jh.clrs;
548
225
            if (!(jh.sraw || (jh.clrs & 1)))
549
84
              tiff_ifd[ifd].t_width *= jh.clrs;
550
225
            if ((tiff_ifd[ifd].t_width > 4 * tiff_ifd[ifd].t_height) & ~jh.clrs)
551
74
            {
552
74
              tiff_ifd[ifd].t_width /= 2;
553
74
              tiff_ifd[ifd].t_height *= 2;
554
74
            }
555
225
            i = order;
556
225
            parse_tiff(tiff_ifd[ifd].offset + 12);
557
225
            order = i;
558
225
          }
559
5.99k
        }
560
8.54k
        break;
561
1.44M
      }
562
563
1.44M
    } /* processing of Panasonic-specific tags finished */
564
565
4.13M
    switch (tag)
566
4.13M
    {            /* processing of general EXIF tags */
567
59.3k
    case 0xf000: /* 61440, Fuji HS10 table */
568
59.3k
      fseek(ifp, get4() + base, SEEK_SET);
569
59.3k
      parse_tiff_ifd(base);
570
59.3k
      break;
571
7.17k
    case 0x00fe: /* NewSubfileType */
572
7.17k
      tiff_ifd[ifd].newsubfiletype = int(getreal(type));
573
7.17k
      break;
574
67.8k
    case 0x0100: /* 256, ImageWidth */
575
68.2k
    case 0xf001: /* 61441, Fuji RAF RawImageFullWidth */
576
68.2k
      tiff_ifd[ifd].t_width = getint(type);
577
68.2k
      break;
578
34.9k
    case 0x0101: /* 257, ImageHeight */
579
35.2k
    case 0xf002: /* 61442, Fuji RAF RawImageFullHeight */
580
35.2k
      tiff_ifd[ifd].t_height = getint(type);
581
35.2k
      break;
582
23.4k
    case 0x0102: /* 258, BitsPerSample */
583
24.1k
    case 0xf003: /* 61443, Fuji RAF 0xf003 */
584
24.1k
      if(!tiff_ifd[ifd].samples || tag != 0x0102) // ??? already set by tag 0x115
585
18.1k
        tiff_ifd[ifd].samples = len & 7;
586
24.1k
      tiff_ifd[ifd].bps = getint(type);
587
24.1k
      if (tiff_bps < (unsigned)tiff_ifd[ifd].bps)
588
6.21k
        tiff_bps = tiff_ifd[ifd].bps;
589
24.1k
      break;
590
477
    case 0xf006: /* 61446, Fuji RAF 0xf006 */
591
477
      raw_height = 0;
592
477
      if (tiff_ifd[ifd].bps > 12)
593
146
        break;
594
331
      load_raw = &LibRaw::packed_load_raw;
595
331
      load_flags = get4() ? 24 : 80;
596
331
      break;
597
22.9k
    case 0x0103: /* 259, Compression */
598
                 /*
599
                    262  = Kodak 262
600
                  32767  = Sony ARW Compressed
601
                  32769  = Packed RAW
602
                  32770  = Samsung SRW Compressed
603
                  32772  = Samsung SRW Compressed 2
604
                  32867  = Kodak KDC Compressed
605
                  34713  = Nikon NEF Compressed
606
                  65000  = Kodak DCR Compressed
607
                  65535  = Pentax PEF Compressed
608
                 */
609
22.9k
      tiff_ifd[ifd].comp = getint(type);
610
22.9k
      break;
611
16.2k
    case 0x0106: /* 262, PhotometricInterpretation */
612
16.2k
      tiff_ifd[ifd].phint = get2();
613
16.2k
      break;
614
772
    case 0x010e: /* 270, ImageDescription */
615
772
      fread(desc, 512, 1, ifp);
616
772
      desc[511] = 0;
617
772
      break;
618
149k
    case 0x010f: /* 271, Make */
619
149k
      fgets(make, 64, ifp);
620
149k
      break;
621
13.3k
    case 0x0110: /* 272, Model */
622
13.3k
      if (!strncmp(make, "Hasselblad", 10) && model[0] &&
623
546
          (imHassy.format != LIBRAW_HF_Imacon))
624
518
        break;
625
12.8k
      fgets(model, 64, ifp);
626
12.8k
      break;
627
17.2k
    case 0x0116: // 278
628
17.2k
      tiff_ifd[ifd].rows_per_strip = getint(type);
629
17.2k
      break;
630
16.0k
    case 0x0112: /* 274, Orientation */
631
16.0k
      tiff_ifd[ifd].t_flip = "50132467"[get2() & 7] - '0';
632
16.0k
      break;
633
19.5k
    case 0x0115: /* 277, SamplesPerPixel */
634
19.5k
      tiff_ifd[ifd].samples = getint(type) & 7;
635
19.5k
      break;
636
1.43k
    case 0x0152: /* Extrasamples */
637
1.43k
      tiff_ifd[ifd].extrasamples = (getint(type) & 0xff) + 1024;
638
1.43k
      break;
639
17.5k
    case 0x0117: /* 279, StripByteCounts */
640
17.5k
      if (len > 1 && len < 16384)
641
7.47k
      {
642
7.47k
        INT64 sav = ftell(ifp);
643
7.47k
        tiff_ifd[ifd].strip_byte_counts = (INT64 *)calloc(len, sizeof(INT64));
644
7.47k
        tiff_ifd[ifd].strip_byte_counts_count = len;
645
610k
        for (int ii = 0; ii < (int)len; ii++)
646
603k
          tiff_ifd[ifd].strip_byte_counts[ii] = get4();
647
7.47k
        fseek(ifp, sav, SEEK_SET); // restore position
648
7.47k
      }
649
      /* fallback */
650
21.5k
    case 0x0202: // 514
651
22.2k
    case 0xf008: // 61448
652
22.2k
      tiff_ifd[ifd].bytes = get4();
653
22.2k
      break;
654
480
    case 0xf00e: // 61454, FujiFilm "As Shot"
655
1.44k
      FORC3 cam_mul[GRBG_2_RGBG(c)] = float(getint(type));
656
480
      break;
657
6.21k
    case 0x0131: /* 305, Software */
658
6.21k
      fgets(software, 64, ifp);
659
6.21k
      if (!strncmp(software, "Adobe", 5) || !strncmp(software, "dcraw", 5) ||
660
5.89k
          !strncmp(software, "UFRaw", 5) || !strncmp(software, "Bibble", 6) ||
661
5.68k
          !strcmp(software, "Digital Photo Professional"))
662
619
        is_raw = 0;
663
6.21k
      break;
664
8.29k
    case 0x0132: /* 306, DateTime */
665
8.29k
      get_timestamp(0);
666
8.29k
      break;
667
6.04k
    case 0x013b: /* 315, Artist */
668
6.04k
      fread(artist, 64, 1, ifp);
669
6.04k
      artist[63] = 0;
670
6.04k
      break;
671
8.92k
    case 0x013d: // 317
672
8.92k
      tiff_ifd[ifd].predictor = getint(type);
673
8.92k
      break;
674
2.02k
    case 0x0142: /* 322, TileWidth */
675
2.02k
      tiff_ifd[ifd].t_tile_width = getint(type);
676
2.02k
      break;
677
2.61k
    case 0x0143: /* 323, TileLength */
678
2.61k
      tiff_ifd[ifd].t_tile_length = getint(type);
679
2.61k
      break;
680
3.27k
    case 0x0144: /* 324, TileOffsets */
681
3.27k
      tiff_ifd[ifd].offset = len > 1 ? ftell(ifp) : get4(); // FIXME: get8 for BigTIFF
682
3.27k
      if (len == 1)
683
689
        tiff_ifd[ifd].t_tile_width = tiff_ifd[ifd].t_tile_length = 0;
684
3.27k
      if (len == 4)
685
310
      {
686
310
        load_raw = &LibRaw::sinar_4shot_load_raw;
687
310
        is_raw = 5;
688
310
      }
689
3.27k
      break;
690
1.85k
    case 0x0145: // 325
691
1.85k
      tiff_ifd[ifd].bytes = len > 1 ? ftell(ifp) : get4(); // FIXME: get8 for BigTIFF
692
1.85k
      break;
693
55.1k
    case 0x014a: /* 330, SubIFDs */
694
55.1k
      if (!strcmp(model, "DSLR-A100") && tiff_ifd[ifd].t_width == 3872)
695
0
      {
696
0
        load_raw = &LibRaw::sony_arw_load_raw;
697
0
        data_offset = get4() + base;
698
0
        ifd++;
699
0
        if (ifd >= int(sizeof tiff_ifd / sizeof tiff_ifd[0]))
700
0
          throw LIBRAW_EXCEPTION_IO_CORRUPT;
701
0
        break;
702
0
      }
703
55.1k
      if (!strncmp(make, "Hasselblad", 10) &&
704
1.71k
          libraw_internal_data.unpacker_data.hasselblad_parser_flag)
705
640
      {
706
640
        fseek(ifp, ftell(ifp) + 4, SEEK_SET);
707
640
        fseek(ifp, get4() + base, SEEK_SET);
708
640
        parse_tiff_ifd(base);
709
640
        break;
710
640
      }
711
54.4k
      if (len > 1000)
712
1.38k
        len = 1000; /* 1000 SubIFDs is enough */
713
95.5k
      while (len--)
714
79.7k
      {
715
79.7k
        INT64 ii = ftell(ifp);
716
79.7k
        fseek(ifp, get4() + base, SEEK_SET);
717
79.7k
        if (parse_tiff_ifd(base))
718
38.7k
          break;
719
41.0k
        fseek(ifp, ii + 4LL, SEEK_SET);
720
41.0k
      }
721
54.4k
      break;
722
5.93k
    case 0x0153: // 339
723
5.93k
      tiff_ifd[ifd].sample_format = getint(type);
724
5.93k
      break;
725
411
    case 0x0190: // 400
726
411
      strcpy(make, "Sarnoff");
727
411
      maximum = 0xfff;
728
411
      break;
729
3.77k
    case 0x02bc: // 700
730
3.77k
      if ((tagtypeIs(LIBRAW_EXIFTAG_TYPE_BYTE) ||
731
1.47k
          tagtypeIs(LIBRAW_EXIFTAG_TYPE_ASCII) ||
732
1.26k
          tagtypeIs(LIBRAW_EXIFTAG_TYPE_SBYTE) ||
733
1.00k
          tagtypeIs(LIBRAW_EXIFTOOLTAGTYPE_binary)) &&
734
2.96k
          (len > 1) && (len < 5100000))
735
2.44k
      {
736
2.44k
        xmpdata = (char *)calloc(xmplen = len + 1,1);
737
2.44k
        unsigned br = fread(xmpdata,1, len, ifp);
738
2.44k
        xmpdata[br] = 0;
739
2.44k
      }
740
3.77k
      break;
741
1.20k
    case 0x7000:
742
1.20k
      imSony.SonyRawFileType = get2();
743
1.20k
      break;
744
1.66k
    case 0x7010: // 28688
745
6.64k
      FORC4 sony_curve[c + 1] = get2() >> 2 & 0xfff;
746
9.96k
      for (i = 0; i < 5; i++)
747
9.16M
        for (j = sony_curve[i] + 1; j <= (int)sony_curve[i + 1]; j++)
748
9.15M
          curve[j] = curve[j - 1] + (1 << i);
749
1.66k
      break;
750
461
    case 0x7200: // 29184, Sony SR2Private
751
461
      sony_offset = get4();
752
461
      break;
753
1.07k
    case 0x7201: // 29185, Sony SR2Private
754
1.07k
      sony_length = get4();
755
1.07k
      break;
756
260
    case 0x7221: // 29217, Sony SR2Private
757
260
      sony_key = get4();
758
260
      break;
759
1.66k
    case 0x7250: // 29264, Sony SR2Private
760
1.66k
      parse_minolta(ftell(ifp));
761
1.66k
      raw_width = 0;
762
1.66k
      break;
763
200
    case 0x7303: // 29443, Sony SR2SubIFD
764
800
      FORC4 cam_mul[GRBG_2_RGBG(c)] = get2();
765
200
      break;
766
289
    case 0x7313: // 29459, Sony SR2SubIFD
767
1.15k
      FORC4 cam_mul[RGGB_2_RGBG(c)] = get2();
768
289
      break;
769
345
    case 0x7310: // 29456, Sony SR2SubIFD
770
1.38k
      FORC4 cblack[RGGB_2_RGBG(c)] = get2();
771
345
      i = cblack[3];
772
1.03k
      FORC3 if (i > (int)cblack[c]) i = cblack[c];
773
1.38k
      FORC4 cblack[c] -= i;
774
345
      black = i;
775
345
      break;
776
154
    case 0x827d: /* 33405, Model2 */
777
                 /*
778
                  for Kodak ProBack 645 PB645x-yyyy 'x' is:
779
                  'M' for Mamiya 645
780
                  'C' for Contax 645
781
                  'H' for Hasselblad H-series
782
                 */
783
154
      fgets(model2, 64, ifp);
784
154
      break;
785
1.05k
    case 0x828d: /* 33421, CFARepeatPatternDim */
786
1.05k
      if (get2() == 6 && get2() == 6)
787
285
        tiff_ifd[ifd].t_filters = filters = 9;
788
1.05k
      break;
789
3.75k
    case 0x828e: /* 33422, CFAPattern */
790
3.75k
      if (filters == 9)
791
641
      {
792
23.0k
        FORC(36)((char *)xtrans)[c] = fgetc(ifp) & 3;
793
641
        break;
794
641
      }
795
3.98k
    case 0xfd09: /* 64777, Kodak P-series */
796
3.98k
      if (len == 36)
797
567
      {
798
567
        tiff_ifd[ifd].t_filters = filters = 9;
799
567
        colors = 3;
800
20.4k
        FORC(36)((char *)xtrans)[c] = fgetc(ifp) & 3;
801
567
      }
802
3.41k
      else if (len > 0)
803
3.06k
      {
804
3.06k
        if ((plen = len) > 16)
805
1.38k
          plen = 16;
806
3.06k
        fread(cfa_pat, 1, plen, ifp);
807
34.7k
        for (colors = cfa = i = 0; i < (int)plen && colors < 4; i++)
808
31.7k
        {
809
31.7k
          if (cfa_pat[i] > 31)
810
14.3k
            continue; // Skip wrong data
811
17.4k
          colors += !(cfa & (1 << cfa_pat[i]));
812
17.4k
          cfa |= 1 << cfa_pat[i];
813
17.4k
        }
814
3.06k
        if (cfa == 070)
815
129
          memcpy(cfa_pc, "\003\004\005", 3); /* CMY */
816
3.06k
        if (cfa == 072)
817
169
          memcpy(cfa_pc, "\005\003\004\001", 4); /* GMCY */
818
3.06k
        goto guess_cfa_pc;
819
3.06k
      }
820
916
      break;
821
3.35k
    case 0x8290: // 33424
822
16.5k
    case 0xfe00: // 65024
823
16.5k
      fseek(ifp, get4() + base, SEEK_SET);
824
16.5k
      parse_kodak_ifd(base);
825
16.5k
      break;
826
668
    case 0x829a: /* 33434, ExposureTime */
827
668
      tiff_ifd[ifd].t_shutter = shutter = getrealf(type);
828
668
      break;
829
875
    case 0x829d: /* 33437, FNumber */
830
875
      aperture = getrealf(type);
831
875
      break;
832
1.90k
    case 0x9400:
833
1.90k
      imCommon.exifAmbientTemperature = getrealf(type);
834
1.90k
      if ((imCommon.CameraTemperature > -273.15f) &&
835
741
          ((OlyID == OlyID_TG_5) ||
836
680
           (OlyID == OlyID_TG_6) ||
837
612
           (OlyID == OlyID_TG_7)))
838
213
        imCommon.CameraTemperature +=
839
213
            imCommon.exifAmbientTemperature;
840
1.90k
      break;
841
407
    case 0x9401:
842
407
      imCommon.exifHumidity = getrealf(type);
843
407
      break;
844
1.01k
    case 0x9402:
845
1.01k
      imCommon.exifPressure = getrealf(type);
846
1.01k
      break;
847
701
    case 0x9403:
848
701
      imCommon.exifWaterDepth = getrealf(type);
849
701
      break;
850
296
    case 0x9404:
851
296
      imCommon.exifAcceleration = getrealf(type);
852
296
      break;
853
1.20k
    case 0x9405:
854
1.20k
      imCommon.exifCameraElevationAngle = getrealf(type);
855
1.20k
      break;
856
407
    case 0xa405: // FocalLengthIn35mmFormat
857
407
      imgdata.lens.FocalLengthIn35mmFormat = get2();
858
407
      break;
859
694
    case 0xa431: // BodySerialNumber
860
900
    case 0xc62f:
861
900
      stmread(imgdata.shootinginfo.BodySerial, len, ifp);
862
900
      break;
863
798
    case 0xa432: // LensInfo, 42034dec, Lens Specification per EXIF standard
864
798
      imgdata.lens.MinFocal = getrealf(type);
865
798
      imgdata.lens.MaxFocal = getrealf(type);
866
798
      imgdata.lens.MaxAp4MinFocal = getrealf(type);
867
798
      imgdata.lens.MaxAp4MaxFocal = getrealf(type);
868
798
      break;
869
573
    case 0xa435: // LensSerialNumber
870
573
      stmread(imgdata.lens.LensSerial, len, ifp);
871
573
      break;
872
1.70k
    case 0xc630: // DNG LensInfo, Lens Specification per EXIF standard
873
1.70k
      imgdata.lens.MinFocal = getrealf(type);
874
1.70k
      imgdata.lens.MaxFocal = getrealf(type);
875
1.70k
      imgdata.lens.MaxAp4MinFocal = getrealf(type);
876
1.70k
      imgdata.lens.MaxAp4MaxFocal = getrealf(type);
877
1.70k
      break;
878
427
    case 0xa420: /* 42016, ImageUniqueID */
879
427
      stmread(imgdata.color.ImageUniqueID, len, ifp);
880
427
      break;
881
2.27k
    case 0xc65d: /* 50781, RawDataUniqueID */
882
2.27k
      imgdata.color.RawDataUniqueID[16] = 0;
883
2.27k
      fread(imgdata.color.RawDataUniqueID, 1, 16, ifp);
884
2.27k
      break;
885
1.73k
    case 0xa433: // LensMake
886
1.73k
      stmread(imgdata.lens.LensMake, len, ifp);
887
1.73k
      break;
888
933
    case 0xa434: // LensModel
889
933
      stmread(imgdata.lens.Lens, len, ifp);
890
933
      if (!strncmp(imgdata.lens.Lens, "----", 4))
891
181
        imgdata.lens.Lens[0] = 0;
892
933
      break;
893
1.48k
    case 0x9205:
894
1.48k
      imgdata.lens.EXIF_MaxAp = libraw_powf64l(2.0f, (getrealf(type) / 2.0f));
895
1.48k
      break;
896
490
    case 0x8602: /* 34306, Leaf white balance */
897
490
      FORC4
898
1.96k
      {
899
1.96k
        int q = get2();
900
1.96k
        if (q)
901
937
          cam_mul[GRGB_2_RGBG(c)] = 4096.f / q;
902
1.96k
      }
903
490
      break;
904
1.43k
    case 0x8603: /* 34307, Leaf CatchLight color matrix */
905
1.43k
      fread(software, 1, 7, ifp);
906
1.43k
      if (strncmp(software, "MATRIX", 6))
907
1.11k
        break;
908
323
      colors = 4;
909
1.29k
      for (raw_color = i = 0; i < 3; i++)
910
969
      {
911
3.87k
        FORC4 fscanf(ifp, "%f", &rgb_cam[i][GRGB_2_RGBG(c)]);
912
969
        if (!use_camera_wb)
913
969
          continue;
914
0
        num = 0;
915
0
        FORC4 num += rgb_cam[i][c];
916
0
        FORC4 rgb_cam[i][c] /= float(MAX(1, num));
917
0
      }
918
323
      break;
919
3.10k
    case 0x8606: /* 34310, Leaf metadata */
920
3.10k
  {
921
      // libraw_internal_data.unpacker_data.CR3_Version is not used in MOS parser
922
3.10k
    short crs = libraw_internal_data.unpacker_data.CR3_Version;
923
3.10k
    libraw_internal_data.unpacker_data.CR3_Version = 64;  // typical value is 7, so 64 is enough
924
3.10k
        parse_mos(ftell(ifp));
925
3.10k
        libraw_internal_data.unpacker_data.CR3_Version = crs;
926
3.10k
  }
927
  // fallthrough
928
3.66k
    case 0x85ff: // 34303
929
3.66k
      strcpy(make, "Leaf");
930
3.66k
      break;
931
152k
    case 0x8769: /* 34665, EXIF tag */
932
152k
      fseek(ifp, get4() + base, SEEK_SET);
933
152k
      parse_exif(base);
934
152k
      break;
935
4.97k
    case 0x8825: /* 34853, GPSInfo tag */
936
4.97k
    {
937
4.97k
      INT64 pos;
938
4.97k
      fseek(ifp, pos = (get4() + base), SEEK_SET);
939
4.97k
      parse_gps(base);
940
4.97k
      fseek(ifp, pos, SEEK_SET);
941
4.97k
      parse_gps_libraw(base);
942
4.97k
    }
943
4.97k
    break;
944
363
    case 0x8773: /* 34675, InterColorProfile */
945
615
    case 0xc68f: /* 50831, AsShotICCProfile */
946
615
      profile_offset = ftell(ifp);
947
615
      profile_length = len;
948
615
      break;
949
345
    case 0x9102: /* 37122, CompressedBitsPerPixel */
950
345
      kodak_cbpp = get4();
951
345
      break;
952
1.34k
    case 0x920a: /* 37386, FocalLength */
953
1.34k
      focal_len = getrealf(type);
954
1.34k
      break;
955
575
    case 0x9211: /* 37393, ImageNumber */
956
575
      shot_order = getint(type);
957
575
      break;
958
275
    case 0x9215: /* 37397, ExposureIndex */
959
275
      imCommon.exifExposureIndex = getrealf(type);
960
275
      break;
961
199
    case 0x9218: /* 37400, old Kodak KDC tag */
962
796
      for (raw_color = i = 0; i < 3; i++)
963
597
      {
964
597
        getreal(type);
965
1.79k
        FORC3 rgb_cam[i][c] = getrealf(type);
966
597
      }
967
199
      break;
968
1.29k
    case 0xa010: // 40976
969
1.29k
      strip_offset = get4();
970
1.29k
      switch (tiff_ifd[ifd].comp)
971
1.29k
      {
972
355
      case 0x8002: // 32770
973
355
        load_raw = &LibRaw::samsung_load_raw;
974
355
        break;
975
217
      case 0x8004: // 32772
976
217
        load_raw = &LibRaw::samsung2_load_raw;
977
217
        break;
978
154
      case 0x8005: // 32773
979
154
        load_raw = &LibRaw::samsung3_load_raw;
980
154
        break;
981
1.29k
      }
982
1.29k
      break;
983
1.29k
    case 0xb4c3: /* 46275, Imacon tags */
984
219
      imHassy.format = LIBRAW_HF_Imacon;
985
219
      strcpy(make, "Imacon");
986
219
      data_offset = ftell(ifp);
987
219
      ima_len = len;
988
219
      break;
989
280
    case 0xb4c7: // 46279
990
280
      if (!ima_len)
991
210
        break;
992
70
      fseek(ifp, 38, SEEK_CUR);
993
3.44k
    case 0xb4c2: // 46274
994
3.44k
      fseek(ifp, 40, SEEK_CUR);
995
3.44k
      raw_width = get4();
996
3.44k
      raw_height = get4();
997
3.44k
      left_margin = get4() & 7;
998
3.44k
      width = raw_width - left_margin - (get4() & 7);
999
3.44k
      top_margin = get4() & 7;
1000
3.44k
      height = raw_height - top_margin - (get4() & 7);
1001
3.44k
      if (raw_width == 7262 && ima_len == 234317952)
1002
0
      {
1003
0
        height = 5412;
1004
0
        width = 7216;
1005
0
        left_margin = 7;
1006
0
        filters = 0;
1007
0
      }
1008
3.44k
      else if (raw_width == 7262)
1009
37
      {
1010
37
        height = 5444;
1011
37
        width = 7244;
1012
37
        left_margin = 7;
1013
37
      }
1014
3.44k
      fseek(ifp, 52, SEEK_CUR);
1015
10.3k
      FORC3 cam_mul[c] = getrealf(LIBRAW_EXIFTAG_TYPE_FLOAT);
1016
3.44k
      fseek(ifp, 114, SEEK_CUR);
1017
3.44k
      flip = (get2() >> 7) * 90;
1018
3.44k
      if (width * (height * 6l) == ima_len)
1019
957
      {
1020
957
        if (flip % 180 == 90)
1021
394
          SWAP(width, height);
1022
957
        raw_width = width;
1023
957
        raw_height = height;
1024
957
        left_margin = top_margin = filters = flip = 0;
1025
957
      }
1026
3.44k
      c = unsigned(height) * unsigned(width) / 1000000;
1027
3.44k
      if (c == 32)
1028
195
        c--;
1029
3.44k
      sprintf(model, "Ixpress %d-Mp", c);
1030
3.44k
      load_raw = &LibRaw::imacon_full_load_raw;
1031
3.44k
      if (filters)
1032
1.86k
      {
1033
1.86k
        if (left_margin & 1)
1034
979
          filters = 0x61616161;
1035
1.86k
        load_raw = &LibRaw::unpacked_load_raw;
1036
1.86k
      }
1037
3.44k
      maximum = 0xffff;
1038
3.44k
      break;
1039
306
    case 0xc516: /* 50454, Sinar tag */
1040
649
    case 0xc517: // 50455
1041
649
      if (len < 1 || len > 2560000 || !(cbuf = (char *)malloc(len)))
1042
199
        break;
1043
450
      if (fread(cbuf, 1, len, ifp) != (int)len)
1044
4
        throw LIBRAW_EXCEPTION_IO_CORRUPT; // cbuf to be free'ed in recycle
1045
446
      cbuf[len - 1] = 0;
1046
1.62k
      for (cp = cbuf - 1; cp && cp < cbuf + len; cp = strchr(cp, '\n'))
1047
1.17k
        if (!strncmp(++cp, "Neutral ", 8))
1048
23
          sscanf(cp + 8, "%f %f %f", cam_mul, cam_mul + 1, cam_mul + 2);
1049
446
      free(cbuf);
1050
446
      break;
1051
1.81k
    case 0xc51a: // 50458
1052
1.81k
      if (!make[0])
1053
654
        strcpy(make, "Hasselblad");
1054
1.81k
      break;
1055
71.8k
    case 0xc51b: /* 50459, Hasselblad tag */
1056
71.8k
      if (!libraw_internal_data.unpacker_data.hasselblad_parser_flag)
1057
6.39k
      {
1058
6.39k
        libraw_internal_data.unpacker_data.hasselblad_parser_flag = 1;
1059
6.39k
        i = order;
1060
6.39k
        INT64 jj = ftell(ifp);
1061
6.39k
        c = tiff_nifds;
1062
6.39k
        order = get2();
1063
6.39k
    get2();
1064
6.39k
        fseek(ifp, jj + get4(), SEEK_SET);
1065
6.39k
        parse_tiff_ifd(jj);
1066
6.39k
        maximum = 0xffff;
1067
6.39k
        tiff_nifds = c;
1068
6.39k
        order = i;
1069
6.39k
        break;
1070
6.39k
      }
1071
80.5k
    case 0xc612: /* 50706, DNGVersion */
1072
322k
      FORC4 dng_version = (dng_version << 8) + fgetc(ifp);
1073
80.5k
      if (!make[0])
1074
12.5k
        strcpy(make, "DNG");
1075
80.5k
      is_raw = 1;
1076
80.5k
      break;
1077
9.38k
    case 0xc614: /* 50708, UniqueCameraModel */
1078
9.38k
      stmread(imgdata.color.UniqueCameraModel, len, ifp);
1079
9.38k
      if (model[0])
1080
1.41k
        break;
1081
7.96k
      strncpy(make, imgdata.color.UniqueCameraModel,
1082
7.96k
              MIN(len, sizeof(imgdata.color.UniqueCameraModel)));
1083
7.96k
      if ((cp = strchr(make, ' ')))
1084
306
      {
1085
306
        strcpy(model, cp + 1);
1086
306
        *cp = 0;
1087
306
      }
1088
7.96k
      break;
1089
1.47k
    case 0xc616: /* 50710, CFAPlaneColor */
1090
1.47k
      if (filters == 9)
1091
86
        break;
1092
1.38k
      if (len > 4)
1093
684
        len = 4;
1094
1.38k
      colors = len;
1095
1.38k
      fread(cfa_pc, 1, colors, ifp);
1096
4.45k
    guess_cfa_pc:
1097
11.8k
      FORCC tab[cfa_pc[c]] = c;
1098
4.45k
      cdesc[c] = 0;
1099
75.6k
      for (i = 16; i--;)
1100
71.2k
        filters = filters << 2 | tab[cfa_pat[i % plen]];
1101
4.45k
      filters -= !filters;
1102
4.45k
      tiff_ifd[ifd].t_filters = filters;
1103
4.45k
      break;
1104
841
    case 0xc617: /* 50711, CFALayout */
1105
841
      if (get2() == 2)
1106
182
        tiff_ifd[ifd].t_fuji_width = fuji_width = 1;
1107
841
      break;
1108
950
    case 0x0123: // 291
1109
1.60k
    case 0xc618: /* 50712, LinearizationTable */
1110
1.60k
      tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_LINTABLE;
1111
1.60k
      tiff_ifd[ifd].lineartable_offset = ftell(ifp);
1112
1.60k
      tiff_ifd[ifd].lineartable_len = len;
1113
1.60k
      linear_table(len);
1114
1.60k
      break;
1115
834
    case 0xc619: /* 50713, BlackLevelRepeatDim */
1116
834
      tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK;
1117
      
1118
834
    tiff_ifd[ifd].dng_levels.dng_cblack[4] = cblack[4] = get2();
1119
834
    tiff_ifd[ifd].dng_levels.dng_fcblack[4] = float(cblack[4]);
1120
     
1121
    
1122
834
      tiff_ifd[ifd].dng_levels.dng_cblack[5] = cblack[5] = get2();
1123
834
    tiff_ifd[ifd].dng_levels.dng_fcblack[5] = float(cblack[5]);
1124
1125
834
    if (cblack[4] * cblack[5] >
1126
834
      (LIBRAW_CBLACK_SIZE -
1127
834
        7)) // Use last cblack item as DNG black level count
1128
273
    {
1129
273
      tiff_ifd[ifd].dng_levels.dng_fcblack[4] =
1130
273
        tiff_ifd[ifd].dng_levels.dng_fcblack[5] = 1.f;
1131
273
      tiff_ifd[ifd].dng_levels.dng_cblack[4] = tiff_ifd[ifd].dng_levels.dng_cblack[5] =
1132
273
        cblack[4] = cblack[5] = 1;
1133
273
    }
1134
834
      break;
1135
1136
4.26k
    case 0xf00c:
1137
4.26k
      if (imFuji.RAFDataGeneration != 4096)
1138
4.21k
      {
1139
4.21k
        unsigned fwb[4];
1140
16.8k
        FORC4 fwb[c] = get4();
1141
4.21k
        if (fwb[3] < 0x100)
1142
2.89k
        {
1143
8.68k
          FORC3 icWBC[fwb[3]][GRBG_2_RGBG(c)] = fwb[c];
1144
2.89k
          icWBC[fwb[3]][3] = icWBC[fwb[3]][1];
1145
2.89k
          if ((fwb[3] == 17) &&                                      // Tungsten WB
1146
2.35k
              (libraw_internal_data.unpacker_data.lenRAFData > 3) &&
1147
1.70k
              (libraw_internal_data.unpacker_data.lenRAFData < 10240000))
1148
1.70k
          {
1149
1.70k
            INT64 f_save = ftell(ifp);
1150
1.70k
            rafdata = (ushort *)calloc(
1151
1.70k
                sizeof(ushort) * libraw_internal_data.unpacker_data.lenRAFData+1,1);
1152
1.70k
            fseek(ifp, libraw_internal_data.unpacker_data.posRAFData, SEEK_SET);
1153
1.70k
            fread(rafdata, sizeof(ushort),
1154
1.70k
                  libraw_internal_data.unpacker_data.lenRAFData, ifp);
1155
1.70k
            fseek(ifp, f_save, SEEK_SET);
1156
1157
1.70k
            uchar *PrivateMknBuf = (uchar *)rafdata;
1158
1.70k
            int PrivateMknLength = libraw_internal_data.unpacker_data.lenRAFData
1159
1.70k
                                   << 1;
1160
39.9M
            for (int pos = 0; pos < PrivateMknLength - 16; pos++)
1161
39.8M
            {
1162
39.8M
              if (!memcmp(PrivateMknBuf + pos, "TSNERDTS", 8)) // STDRENST
1163
389
              {
1164
389
                imFuji.isTSNERDTS = 1;
1165
389
                break;
1166
389
              }
1167
39.8M
            }
1168
1.70k
            int fj; // 31? (fj<<1)-0x3c : 34? (fj<<1)-0x4e : undef
1169
1.70k
            int is34 = 0;
1170
1.70k
            if ((imFuji.RAFDataVersion == 0x0260) || // X-Pro3, GFX 100S
1171
1.66k
                (imFuji.RAFDataVersion == 0x0261) || // X100V, GFX 50S II
1172
1.58k
                (imFuji.RAFDataVersion == 0x0262) || // X-T4
1173
1.50k
                (imFuji.RAFDataVersion == 0x0263) || // X-H2S
1174
1.42k
                (imFuji.RAFDataVersion == 0x0264) || // X-S10, X-H2
1175
1.38k
                (imFuji.RAFDataVersion == 0x0265) || // X-E4, X-T5
1176
1.30k
                (imFuji.RAFDataVersion == 0x0266) || // X-T30 II, X-S20
1177
1.22k
                (imFuji.RAFDataVersion == 0x0267) || // GFX 100 II
1178
1.13k
                (imFuji.RAFDataVersion == 0x0368) || // GFX 100S II
1179
1.13k
                (imFuji.RAFDataVersion == 0x0369) || // X100VI
1180
1.13k
                (imFuji.RAFDataVersion == 0x036a) || // X-T50
1181
1.13k
                (imFuji.RAFDataVersion == 0x036b) || // X-M5
1182
1.13k
                !strcmp(model, "X-Pro3")     ||
1183
1.05k
                !strcmp(model, "GFX100S II") || !strcmp(model, "GFX 100S II") ||
1184
1.05k
                !strcmp(model, "GFX100S")    || !strcmp(model, "GFX 100S")    ||
1185
957
                !strcmp(model, "GFX100 II")  || !strcmp(model, "GFX 100 II")  ||
1186
917
                !strcmp(model, "GFX50S II")  || !strcmp(model, "GFX 50S II")  ||
1187
917
                !strcmp(model, "X100VI")     ||
1188
872
                !strcmp(model, "X100V")      ||
1189
833
                !strcmp(model, "X-T4")       ||
1190
743
                !strcmp(model, "X-H2S")      ||
1191
703
                !strcmp(model, "X-H2")       ||
1192
626
                !strcmp(model, "X-E4")       ||
1193
533
                !strcmp(model, "X-T50")      ||
1194
493
                !strcmp(model, "X-T5")       ||
1195
459
                !strcmp(model, "X-M5")       ||
1196
448
                !strcmp(model, "X-T30 II")   ||
1197
428
                !strcmp(model, "X-S10")      ||
1198
346
                !strcmp(model, "X-S20"))
1199
// is34 cameras have 34 CCT values instead of 31, manual still claims 2500 to 10000 K
1200
// aligned 3000 K to Incandescent, as it is usual w/ other Fujifilm cameras
1201
1.43k
              is34 = 1;
1202
1203
1.70k
            for (int fi = 0;
1204
15.5M
                 fi < int(libraw_internal_data.unpacker_data.lenRAFData - 3); fi++) // looking for Tungsten WB
1205
15.5M
            {
1206
15.5M
              if ((fwb[0] == rafdata[fi]) && (fwb[1] == rafdata[fi + 1]) &&
1207
5.06M
                  (fwb[2] == rafdata[fi + 2])) // found Tungsten WB
1208
1.47k
              {
1209
1.47k
                if (fi > 14 && rafdata[fi - 15] !=
1210
1.37k
                    fwb[0]) // 15 is offset of Tungsten WB from the first
1211
                            // preset, Fine Weather WB
1212
876
                  continue;
1213
603
        if (fi >= 15)
1214
498
        {
1215
3.48k
          for (int wb_ind = 0, ofst = fi - 15; wb_ind < (int)Fuji_wb_list1.size();
1216
2.98k
            wb_ind++, ofst += 3)
1217
2.98k
          {
1218
2.98k
            icWBC[Fuji_wb_list1[wb_ind]][1] =
1219
2.98k
              icWBC[Fuji_wb_list1[wb_ind]][3] = rafdata[ofst];
1220
2.98k
            icWBC[Fuji_wb_list1[wb_ind]][0] = rafdata[ofst + 1];
1221
2.98k
            icWBC[Fuji_wb_list1[wb_ind]][2] = rafdata[ofst + 2];
1222
2.98k
          }
1223
498
        }
1224
1225
603
                if (is34)
1226
394
                  fi += 24;
1227
603
                fi += 96;
1228
2.00k
                for (fj = fi; fj < (fi + 15); fj += 3) // looking for the end of the WB table
1229
1.86k
                {
1230
1.86k
          if (fj > libraw_internal_data.unpacker_data.lenRAFData - 3)
1231
0
            break;
1232
1.86k
                  if (rafdata[fj] != rafdata[fi])
1233
470
                  {
1234
470
                    fj -= 93;
1235
470
                    if (is34)
1236
305
                      fj -= 9;
1237
//printf ("wb start in DNG: 0x%04x\n", fj*2-0x4e);
1238
15.0k
                    for (int iCCT = 0, ofst = fj; iCCT < 31 
1239
14.5k
            && ofst < libraw_internal_data.unpacker_data.lenRAFData - 3;
1240
14.5k
                         iCCT++, ofst += 3)
1241
14.5k
                    {
1242
14.5k
                      icWBCCTC[iCCT][0] = float(FujiCCT_K[iCCT]);
1243
14.5k
                      icWBCCTC[iCCT][1] = rafdata[ofst + 1];
1244
14.5k
                      icWBCCTC[iCCT][2] = icWBCCTC[iCCT][4] = rafdata[ofst];
1245
14.5k
                      icWBCCTC[iCCT][3] = rafdata[ofst + 2];
1246
14.5k
                    }
1247
470
                    break;
1248
470
                  }
1249
1.86k
                }
1250
603
                free(rafdata);
1251
603
                break;
1252
1.47k
              }
1253
15.5M
            }
1254
1.70k
          }
1255
2.89k
        }
1256
16.8k
        FORC4 fwb[c] = get4();
1257
4.21k
        if (fwb[3] < 0x100) {
1258
3.33k
          FORC3 icWBC[fwb[3]][GRBG_2_RGBG(c)] = fwb[c];
1259
1.11k
          icWBC[fwb[3]][3] = icWBC[fwb[3]][1];
1260
1.11k
        }
1261
4.21k
      }
1262
4.26k
      break;
1263
354
    case 0xf00d:
1264
354
      if (imFuji.RAFDataGeneration != 4096)
1265
278
      {
1266
834
        FORC3 icWBC[LIBRAW_WBI_Auto][GRBG_2_RGBG(c)] = getint(type);
1267
278
        icWBC[LIBRAW_WBI_Auto][3] = icWBC[LIBRAW_WBI_Auto][1];
1268
278
      }
1269
354
      break;
1270
356
    case 0xc615: /* 50709, LocalizedCameraModel */
1271
356
      stmread(imgdata.color.LocalizedCameraModel, len, ifp);
1272
356
      break;
1273
2.24k
    case 0xf00a: // 61450
1274
2.24k
      cblack[4] = cblack[5] = int(MIN(sqrtf((float)len), 64.f));
1275
3.73k
    case 0xc61a: /* 50714, BlackLevel */
1276
3.73k
      if (tiff_ifd[ifd].samples > 1 &&
1277
1.23k
          tiff_ifd[ifd].samples == (int)len) // LinearDNG, per-channel black
1278
539
      {
1279
539
        tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK;
1280
1.86k
        for (i = 0; i < 4 && i < (int)len; i++)
1281
1.33k
        {
1282
1.33k
          tiff_ifd[ifd].dng_levels.dng_fcblack[i] = getrealf(type);
1283
1.33k
          tiff_ifd[ifd].dng_levels.dng_cblack[i] = cblack[i] =
1284
1.33k
              unsigned(tiff_ifd[ifd].dng_levels.dng_fcblack[i] + 0.5f);
1285
1.33k
        }
1286
        // Record len in last cblack field
1287
539
        tiff_ifd[ifd].dng_levels.dng_cblack[LIBRAW_CBLACK_SIZE - 1] = len;
1288
1289
539
    tiff_ifd[ifd].dng_levels.dng_fblack = 0.f;
1290
539
        tiff_ifd[ifd].dng_levels.dng_black = black = 0;
1291
539
      }
1292
3.20k
      else if (tiff_ifd[ifd].samples > 1 // Linear DNG w repeat dim
1293
696
               && (tiff_ifd[ifd].samples * cblack[4] * cblack[5] == len))
1294
262
      {
1295
262
        tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK;
1296
262
        tiff_ifd[ifd].dng_levels.dng_cblack[LIBRAW_CBLACK_SIZE - 1] =
1297
262
            cblack[LIBRAW_CBLACK_SIZE - 1] = len;
1298
6.23k
        for (i = 0; i < (int)len && i < LIBRAW_CBLACK_SIZE - 7; i++)
1299
5.97k
        {
1300
5.97k
          tiff_ifd[ifd].dng_levels.dng_fcblack[i + 6] = getrealf(type);
1301
5.97k
          tiff_ifd[ifd].dng_levels.dng_cblack[i + 6] = cblack[i + 6] =
1302
5.97k
              unsigned(tiff_ifd[ifd].dng_levels.dng_fcblack[i + 6] + 0.5f);
1303
5.97k
        }
1304
262
      }
1305
2.93k
      else if ((cblack[4] * cblack[5] < 2) && len == 1)
1306
447
      {
1307
447
        tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK;
1308
447
        tiff_ifd[ifd].dng_levels.dng_fblack = getrealf(type);
1309
447
        black = tiff_ifd[ifd].dng_levels.dng_black =
1310
447
            unsigned(tiff_ifd[ifd].dng_levels.dng_fblack);
1311
447
      }
1312
2.49k
      else if (cblack[4] * cblack[5] <= len)
1313
2.29k
      {
1314
2.29k
        FORC(int(cblack[4] * cblack[5]))
1315
643k
        {
1316
643k
          tiff_ifd[ifd].dng_levels.dng_fcblack[6 + c] = getrealf(type);
1317
643k
          cblack[6 + c] = unsigned(tiff_ifd[ifd].dng_levels.dng_fcblack[6 + c]);
1318
643k
        }
1319
2.29k
        black = 0;
1320
2.29k
        FORC4
1321
9.16k
        cblack[c] = 0;
1322
1323
2.29k
        if (tag == 0xc61a)
1324
931
        {
1325
931
          tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK;
1326
931
          FORC(int(cblack[4] * cblack[5]))
1327
2.06k
          tiff_ifd[ifd].dng_levels.dng_cblack[6 + c] = cblack[6 + c];
1328
931
          tiff_ifd[ifd].dng_levels.dng_fblack = 0;
1329
931
          tiff_ifd[ifd].dng_levels.dng_black = 0;
1330
931
      FORC4
1331
3.72k
      {
1332
3.72k
        tiff_ifd[ifd].dng_levels.dng_fcblack[c] = 0.f;
1333
3.72k
        tiff_ifd[ifd].dng_levels.dng_cblack[c] = 0;
1334
3.72k
      }
1335
931
        }
1336
2.29k
      }
1337
3.73k
      break;
1338
341
    case 0xc61b: /* 50715, BlackLevelDeltaH */
1339
1.17k
    case 0xc61c: /* 50716, BlackLevelDeltaV */
1340
139k
      for (num = i = 0; i < (int)len && i < 65536; i++)
1341
138k
        num += getreal(type);
1342
1.17k
      if (len > 0)
1343
954
      {
1344
954
        black += unsigned(num / len + 0.5);
1345
954
        tiff_ifd[ifd].dng_levels.dng_fblack += float(num / len);
1346
954
        tiff_ifd[ifd].dng_levels.dng_black += unsigned(num / len + 0.5);
1347
954
        tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BLACK;
1348
954
      }
1349
1.17k
      break;
1350
1.28k
    case 0xc61d: /* 50717, WhiteLevel */
1351
1.28k
      tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_WHITE;
1352
1.28k
      tiff_ifd[ifd].dng_levels.dng_whitelevel[0] = maximum = getint(type);
1353
1.28k
      if (tiff_ifd[ifd].samples > 1) // Linear DNG case
1354
2.92k
        for (i = 1; i < 4 && i < (int)len; i++)
1355
2.05k
          tiff_ifd[ifd].dng_levels.dng_whitelevel[i] = getint(type);
1356
1.28k
      break;
1357
1.87k
    case 0xc61e: /* DefaultScale */
1358
1.87k
    {
1359
1.87k
      float q1 = getrealf(type);
1360
1.87k
      float q2 = getrealf(type);
1361
1.87k
      if (q1 > 0.00001f && q2 > 0.00001f)
1362
1.50k
      {
1363
1.50k
        pixel_aspect = q1 / q2;
1364
1.50k
        if (pixel_aspect > 0.995 && pixel_aspect < 1.005)
1365
385
          pixel_aspect = 1.0;
1366
1.50k
      }
1367
1.87k
    }
1368
1.87k
    break;
1369
866
    case 0xc61f: /* 50719, DefaultCropOrigin */
1370
866
      if (len == 2)
1371
546
      {
1372
546
        tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_CROPORIGIN;
1373
546
        tiff_ifd[ifd].dng_levels.default_crop[0] = ushort(getreal(type));
1374
546
        tiff_ifd[ifd].dng_levels.default_crop[1] = ushort(getreal(type));
1375
546
        if (!strncasecmp(make, "SONY", 4))
1376
132
        {
1377
132
          imgdata.sizes.raw_inset_crops[0].cleft =
1378
132
              tiff_ifd[ifd].dng_levels.default_crop[0];
1379
132
          imgdata.sizes.raw_inset_crops[0].ctop =
1380
132
              tiff_ifd[ifd].dng_levels.default_crop[1];
1381
132
        }
1382
546
      }
1383
866
      break;
1384
1385
691
    case 0xc620: /* 50720, DefaultCropSize */
1386
691
      if (len == 2)
1387
388
      {
1388
388
        tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_CROPSIZE;
1389
388
        tiff_ifd[ifd].dng_levels.default_crop[2] = ushort(getreal(type));
1390
388
        tiff_ifd[ifd].dng_levels.default_crop[3] = ushort(getreal(type));
1391
388
        if (!strncasecmp(make, "SONY", 4))
1392
121
        {
1393
121
          imgdata.sizes.raw_inset_crops[0].cwidth =
1394
121
              tiff_ifd[ifd].dng_levels.default_crop[2];
1395
121
          imgdata.sizes.raw_inset_crops[0].cheight =
1396
121
              tiff_ifd[ifd].dng_levels.default_crop[3];
1397
121
        }
1398
388
      }
1399
691
      break;
1400
1401
2.71k
    case 0xc7b5: /* 51125 DefaultUserCrop */
1402
2.71k
      if (len == 4)
1403
2.44k
      {
1404
2.44k
          int cnt = 0;
1405
2.44k
          FORC4
1406
9.77k
          {
1407
9.77k
              float v = getrealf(type);
1408
9.77k
              if (v >= 0.f && v <= 1.f)
1409
5.92k
              {
1410
5.92k
                  tiff_ifd[ifd].dng_levels.user_crop[c] = v;
1411
5.92k
                  cnt++;
1412
5.92k
              }
1413
9.77k
          }
1414
2.44k
          if(cnt == 4 // valid values
1415
1.20k
              && tiff_ifd[ifd].dng_levels.user_crop[0] < tiff_ifd[ifd].dng_levels.user_crop[2] // top < bottom
1416
972
              && tiff_ifd[ifd].dng_levels.user_crop[1] < tiff_ifd[ifd].dng_levels.user_crop[3] // left < right
1417
2.44k
              )
1418
80
            tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_USERCROP;
1419
2.44k
      }
1420
2.71k
      break;
1421
547
    case 0x74c7:
1422
547
      if ((len == 2) && !strncasecmp(make, "SONY", 4))
1423
73
      {
1424
73
        imgdata.sizes.raw_inset_crops[0].cleft = get4();
1425
73
        imgdata.sizes.raw_inset_crops[0].ctop = get4();
1426
73
      }
1427
547
      break;
1428
1429
509
    case 0x74c8:
1430
509
      if ((len == 2) && !strncasecmp(make, "SONY", 4))
1431
50
      {
1432
50
        imgdata.sizes.raw_inset_crops[0].cwidth = get4();
1433
50
        imgdata.sizes.raw_inset_crops[0].cheight = get4();
1434
50
      }
1435
509
      break;
1436
1437
3.25k
    case 0xc65a: // 50778
1438
3.25k
      tiff_ifd[ifd].dng_color[0].illuminant = get2();
1439
3.25k
      tiff_ifd[ifd].dng_color[0].parsedfields |= LIBRAW_DNGFM_ILLUMINANT;
1440
3.25k
      break;
1441
706
    case 0xc65b: // 50779
1442
706
      tiff_ifd[ifd].dng_color[1].illuminant = get2();
1443
706
      tiff_ifd[ifd].dng_color[1].parsedfields |= LIBRAW_DNGFM_ILLUMINANT;
1444
706
      break;
1445
1446
4.66k
    case 0xc621: /* 50721, ColorMatrix1 */
1447
9.44k
    case 0xc622: /* 50722, ColorMatrix2 */
1448
9.44k
    {
1449
9.44k
      int chan = (len == 9) ? 3 : (len == 12 ? 4 : 0);
1450
9.44k
      i = tag == 0xc621 ? 0 : 1;
1451
9.44k
      if (chan)
1452
5.35k
      {
1453
5.35k
        tiff_ifd[ifd].dng_color[i].parsedfields |= LIBRAW_DNGFM_COLORMATRIX;
1454
5.35k
        imHassy.nIFD_CM[i] = ifd;
1455
5.35k
      }
1456
64.6k
      FORC(chan) for (j = 0; j < 3; j++)
1457
48.5k
      {
1458
48.5k
      cm[c][j] = getreal(type);
1459
48.5k
      tiff_ifd[ifd].dng_color[i].colormatrix[c][j] = float(cm[c][j]);
1460
48.5k
      }
1461
9.44k
      use_cm = 1;
1462
9.44k
    }
1463
9.44k
    break;
1464
1465
821
    case 0xc714: /* ForwardMatrix1 */
1466
1.02k
    case 0xc715: /* ForwardMatrix2 */
1467
1.02k
    {
1468
1.02k
      int chan = (len == 9) ? 3 : (len == 12 ? 4 : 0);
1469
1.02k
      i = tag == 0xc714 ? 0 : 1;
1470
1.02k
      if (chan)
1471
165
        tiff_ifd[ifd].dng_color[i].parsedfields |= LIBRAW_DNGFM_FORWARDMATRIX;
1472
4.08k
      for (j = 0; j < 3; j++)
1473
3.06k
        FORC(chan)
1474
1.62k
        {
1475
1.62k
          fm[j][c] = getreal(type);
1476
1.62k
      tiff_ifd[ifd].dng_color[i].forwardmatrix[j][c] = float(fm[j][c]);
1477
1.62k
        }
1478
1.02k
    }
1479
1.02k
    break;
1480
1481
698
    case 0xc623: /* 50723, CameraCalibration1 */
1482
1.03k
    case 0xc624: /* 50724, CameraCalibration2 */
1483
1.03k
    {
1484
1.03k
      int chan = (len == 9) ? 3 : (len == 16 ? 4 : 0);
1485
1.03k
      j = tag == 0xc623 ? 0 : 1;
1486
1.03k
      if (chan)
1487
506
        tiff_ifd[ifd].dng_color[j].parsedfields |= LIBRAW_DNGFM_CALIBRATION;
1488
2.60k
      for (i = 0; i < chan; i++)
1489
1.57k
        FORC(chan)
1490
4.92k
        {         
1491
4.92k
      cc[i][c] = getreal(type);
1492
4.92k
          tiff_ifd[ifd].dng_color[j].calibration[i][c] = float(cc[i][c]);
1493
4.92k
        }
1494
1.03k
    }
1495
1.03k
    break;
1496
5.33k
    case 0xc627: /* 50727, AnalogBalance */
1497
5.33k
      if (len >= 3)
1498
4.96k
        tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_ANALOGBALANCE;
1499
21.0k
      for (c = 0; c < (int)len && c < 4; c++)
1500
15.6k
      {
1501
15.6k
        ab[c] = getreal(type);
1502
15.6k
        tiff_ifd[ifd].dng_levels.analogbalance[c] = float(ab[c]);
1503
15.6k
      }
1504
5.33k
      break;
1505
3.72k
    case 0xc628: /* 50728, AsShotNeutral */
1506
3.72k
      if (len >= 3)
1507
3.12k
        tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_ASSHOTNEUTRAL;
1508
13.9k
    for (c = 0; c < (int)len && c < 4; c++)
1509
10.2k
    {
1510
10.2k
      asn[c] = getreal(type);
1511
10.2k
      tiff_ifd[ifd].dng_levels.asshotneutral[c] = float(asn[c]);
1512
10.2k
    }
1513
3.72k
      break;
1514
1.50k
    case 0xc629: /* 50729, AsShotWhiteXY */
1515
1.50k
      xyz[0] = getreal(type);
1516
1.50k
      xyz[1] = getreal(type);
1517
1.50k
      xyz[2] = 1 - xyz[0] - xyz[1];
1518
4.51k
      FORC3 xyz[c] /= LibRaw_constants::d65_white[c];
1519
1.50k
      break;
1520
4.78k
    case 0xc62a: /* DNG: 50730 BaselineExposure */
1521
4.78k
      tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_BASELINEEXPOSURE;
1522
4.78k
      tiff_ifd[ifd].dng_levels.baseline_exposure = getrealf(type);
1523
4.78k
      break;
1524
3.43k
    case 0xc62e: /* DNG: 50734 LinearResponseLimit */
1525
3.43k
      tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_LINEARRESPONSELIMIT;
1526
3.43k
      tiff_ifd[ifd].dng_levels.LinearResponseLimit = getrealf(type);
1527
3.43k
      break;
1528
1529
46.4k
    case 0xc634: /* 50740 : DNG Adobe, DNG Pentax, Sony SR2, DNG Private */
1530
46.4k
      {
1531
46.4k
        char mbuf[64];
1532
46.4k
        INT64 curr_pos, start_pos = ftell(ifp);
1533
46.4k
        unsigned MakN_order, m_sorder = order;
1534
46.4k
        unsigned MakN_length;
1535
46.4k
        unsigned pos_in_original_raw;
1536
46.4k
    memset(mbuf, 0, sizeof(mbuf));
1537
46.4k
        fread(mbuf, 1, 6, ifp);
1538
1539
46.4k
        if (!strcmp(mbuf, "Adobe"))
1540
21.3k
        {
1541
21.3k
          order = 0x4d4d; // Adobe header is always in "MM" / big endian
1542
21.3k
          curr_pos = start_pos + 6;
1543
432k
          while (curr_pos + 8 - start_pos <= len)
1544
429k
          {
1545
429k
            fread(mbuf, 1, 4, ifp);
1546
429k
            curr_pos += 8;
1547
1548
429k
            if (!strncmp(mbuf, "Pano", 4))
1549
5.91k
            { // PanasonicRaw, yes, they use "Pano" as signature
1550
5.91k
              parseAdobePanoMakernote();
1551
5.91k
            }
1552
1553
429k
            if (!strncmp(mbuf, "MakN", 4))
1554
18.6k
            {
1555
18.6k
              MakN_length = get4();
1556
18.6k
              MakN_order = get2();
1557
18.6k
              pos_in_original_raw = get4();
1558
18.6k
              order = MakN_order;
1559
1560
18.6k
              INT64 save_pos = ifp->tell();
1561
18.6k
              parse_makernote_0xc634(curr_pos + 6 - pos_in_original_raw, 0,
1562
18.6k
                                     AdobeDNG);
1563
1564
18.6k
              curr_pos = save_pos + MakN_length - 6;
1565
18.6k
              fseek(ifp, curr_pos, SEEK_SET);
1566
1567
18.6k
              fread(mbuf, 1, 4, ifp);
1568
18.6k
              curr_pos += 8;
1569
1570
18.6k
              if (!strncmp(mbuf, "Pano ", 4))
1571
78
              {
1572
78
                parseAdobePanoMakernote();
1573
78
              }
1574
1575
18.6k
              if (!strncmp(mbuf, "RAF ", 4))
1576
14.8k
              { // Fujifilm Raw, AdobeRAF
1577
14.8k
          try {
1578
14.8k
                    parseAdobeRAFMakernote(); // May raise exception for out-of buffer reads
1579
14.8k
          }
1580
14.8k
          catch (...)
1581
14.8k
          {
1582
            // just ignore it
1583
3.52k
          }
1584
14.8k
              }
1585
1586
18.6k
              if (!strncmp(mbuf, "SR2 ", 4))
1587
636
              {
1588
636
                order = 0x4d4d;
1589
636
                MakN_length = get4();
1590
636
                MakN_order = get2();
1591
636
                pos_in_original_raw = get4();
1592
636
                order = MakN_order;
1593
1594
636
                unsigned *buf_SR2;
1595
636
                unsigned SR2SubIFDOffset = 0;
1596
636
                unsigned SR2SubIFDLength = 0;
1597
636
                unsigned SR2SubIFDKey = 0;
1598
636
                {
1599
636
                  INT64 _base = curr_pos + 6 - pos_in_original_raw;
1600
636
                  unsigned _entries, _tag, _type, _len;
1601
636
          INT64 _save;
1602
636
          _entries = get2();
1603
32.8k
                  while (_entries--)
1604
32.2k
                  {
1605
32.2k
                    tiff_get(_base, &_tag, &_type, &_len, &_save);
1606
32.2k
                    if (callbacks.exif_cb)
1607
0
                    {
1608
0
                      INT64 _savepos = ftell(ifp);
1609
0
                      callbacks.exif_cb(callbacks.exifparser_data, tag | 0x60000,
1610
0
                                        _type, _len, order, ifp, base);
1611
0
                      fseek(ifp, _savepos, SEEK_SET);
1612
0
                    }
1613
1614
32.2k
                    if (_tag == 0x7200)
1615
263
                    {
1616
263
                      SR2SubIFDOffset = get4();
1617
263
                    }
1618
31.9k
                    else if (_tag == 0x7201)
1619
924
                    {
1620
924
                      SR2SubIFDLength = get4();
1621
924
                    }
1622
31.0k
                    else if (_tag == 0x7221)
1623
54
                    {
1624
54
                      SR2SubIFDKey = get4();
1625
54
                    }
1626
32.2k
                    fseek(ifp, _save, SEEK_SET);
1627
32.2k
                  }
1628
636
                }
1629
1630
636
                if (SR2SubIFDLength && (SR2SubIFDLength < 10240000) &&
1631
318
                    (buf_SR2 = (unsigned *)calloc(SR2SubIFDLength + 1024,1)))
1632
318
                { // 1024b for safety
1633
318
                  fseek(ifp, SR2SubIFDOffset + base, SEEK_SET);
1634
318
                  int items = fread(buf_SR2, 1, SR2SubIFDLength, ifp);
1635
318
          if (items == SR2SubIFDLength)
1636
96
          {
1637
96
            sony_decrypt(buf_SR2, SR2SubIFDLength / 4, 1, SR2SubIFDKey);
1638
96
            parseSonySR2((uchar *)buf_SR2, SR2SubIFDOffset,
1639
96
              SR2SubIFDLength, AdobeDNG);
1640
96
          }
1641
318
                  free(buf_SR2);
1642
318
                }
1643
1644
636
              } /* SR2 processed */
1645
18.6k
              break;
1646
18.6k
            }
1647
429k
          }
1648
21.3k
        }
1649
25.1k
        else
1650
25.1k
        {
1651
25.1k
          fread(mbuf + 6, 1, 2, ifp);
1652
25.1k
          if (!strcmp(mbuf, "RICOH") && ((sget2((uchar *)mbuf + 6) == 0x4949) ||
1653
265
                                         (sget2((uchar *)mbuf + 6) == 0x4d4d)))
1654
6.28k
          {
1655
6.28k
            is_PentaxRicohMakernotes = 1;
1656
6.28k
          }
1657
25.1k
          if (!strcmp(mbuf, "PENTAX ") || !strcmp(mbuf, "SAMSUNG") ||
1658
13.4k
              is_PentaxRicohMakernotes)
1659
19.4k
          {
1660
19.4k
            fseek(ifp, start_pos, SEEK_SET);
1661
19.4k
            parse_makernote_0xc634(base, 0, CameraDNG);
1662
19.4k
          }
1663
25.1k
        }
1664
46.4k
        fseek(ifp, start_pos, SEEK_SET);
1665
46.4k
        order = m_sorder;
1666
46.4k
      }
1667
46.4k
      if (dng_version)
1668
26.0k
      {
1669
26.0k
        break;
1670
26.0k
      }
1671
1672
20.4k
    {
1673
20.4k
      INT64 jj = get4() + base;
1674
20.4k
      parse_minolta(jj);
1675
20.4k
      fseek(ifp, jj, SEEK_SET);
1676
20.4k
    }
1677
20.4k
      parse_tiff_ifd(base);
1678
20.4k
      break;
1679
270
    case 0xc640: // 50752
1680
270
      read_shorts(cr2_slice, 3);
1681
270
      break;
1682
377
    case 0xc68b: /* 50827, OriginalRawFileName */
1683
377
      stmread(imgdata.color.OriginalRawFileName, len, ifp);
1684
377
      break;
1685
342
    case 0xc68d: /* 50829 ActiveArea */
1686
342
      tiff_ifd[ifd].t_tm = top_margin = getint(type);
1687
342
      tiff_ifd[ifd].t_lm = left_margin = getint(type);
1688
342
      tiff_ifd[ifd].t_vheight = height = getint(type) - top_margin;
1689
342
      tiff_ifd[ifd].t_vwidth = width = getint(type) - left_margin;
1690
342
      break;
1691
1.08k
    case 0xc68e: /* 50830 MaskedAreas */
1692
11.9k
      for (i = 0; i < (int)len && i < 32; i++)
1693
10.8k
        ((int *)mask)[i] = getint(type);
1694
1.08k
      black = 0;
1695
1.08k
      break;
1696
2.03k
    case 0xc71a: /* 50970, PreviewColorSpace */
1697
2.03k
      tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_PREVIEWCS;
1698
2.03k
      tiff_ifd[ifd].dng_levels.preview_colorspace = getint(type);
1699
2.03k
      break;
1700
531
    case 0xc740: /* 51008, OpcodeList1 */
1701
531
      tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_OPCODE1;
1702
531
    if (len < 4 * 1024 * 1024) // 4M per opcode list limit
1703
531
    {
1704
531
      tiff_ifd[ifd].dng_levels.rawopcodes[0].len = len;
1705
531
      tiff_ifd[ifd].dng_levels.rawopcodes[0].data = calloc(len,1);
1706
531
      fread(tiff_ifd[ifd].dng_levels.rawopcodes[0].data, 1, len, ifp);
1707
531
    }
1708
531
      break;
1709
367
    case 0xc741: /* 51009, OpcodeList2 */
1710
367
      tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_OPCODE2;
1711
367
      tiff_ifd[ifd].opcode2_offset = meta_offset = ftell(ifp);
1712
367
      if (len < 4 * 1024 * 1024) // 4M per opcode list limit
1713
367
      {
1714
367
        tiff_ifd[ifd].dng_levels.rawopcodes[1].len = len;
1715
367
        tiff_ifd[ifd].dng_levels.rawopcodes[1].data = calloc(len,1);
1716
367
        fread(tiff_ifd[ifd].dng_levels.rawopcodes[1].data, 1, len, ifp);
1717
367
      }
1718
367
      break;
1719
112
    case 0xc74e: /* 51022, OpcodeList3 */
1720
112
      tiff_ifd[ifd].dng_levels.parsedfields |= LIBRAW_DNGFM_OPCODE3;
1721
112
      if (len < 4 * 1024 * 1024) // 4M per opcode list limit
1722
112
      {
1723
112
        tiff_ifd[ifd].dng_levels.rawopcodes[2].len = len;
1724
112
        tiff_ifd[ifd].dng_levels.rawopcodes[2].data = calloc(len,1);
1725
112
        fread(tiff_ifd[ifd].dng_levels.rawopcodes[2].data, 1, len, ifp);
1726
112
      }
1727
112
      break;
1728
334
    case 0xfd04: /* 64772, Kodak P-series */
1729
334
      if (len < 13)
1730
152
        break;
1731
182
      fseek(ifp, 16, SEEK_CUR);
1732
182
      data_offset = get4();
1733
182
      fseek(ifp, 28, SEEK_CUR);
1734
182
      data_offset += get4();
1735
182
      load_raw = &LibRaw::packed_load_raw;
1736
182
      break;
1737
917
    case 0xfe02: // 65026
1738
917
      if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_ASCII))
1739
257
        fgets(model2, 64, ifp);
1740
4.13M
    }
1741
4.10M
    fseek(ifp, save, SEEK_SET);
1742
4.10M
  }
1743
118k
  if (sony_length && sony_length < 10240000 &&
1744
557
      (buf = (unsigned *)calloc(sony_length, 1)))
1745
557
  {
1746
557
    fseek(ifp, sony_offset, SEEK_SET);
1747
557
    int items = fread(buf, 1, sony_length, ifp);
1748
557
  if (items == sony_length)
1749
422
  {
1750
422
    sony_decrypt(buf, sony_length / 4, 1, sony_key);
1751
422
    parseSonySR2((uchar *)buf, sony_offset, sony_length, nonDNG);
1752
422
  }
1753
557
    free(buf);
1754
557
  }
1755
474k
  for (i = 0; i < colors && i < 4; i++)
1756
1.07M
    FORCC cc[i][c] *= ab[i];
1757
118k
  if (use_cm)
1758
6.61k
  {
1759
248k
    FORCC for (i = 0; i < 3; i++) for (cam_xyz[c][i] = j = 0; j < colors; j++)
1760
188k
        cam_xyz[c][i] += cc[c][j] * cm[j][i] * xyz[i];
1761
6.61k
    cam_xyz_coeff(cmatrix, cam_xyz);
1762
6.61k
  }
1763
118k
  if (asn[0])
1764
2.48k
  {
1765
2.48k
    cam_mul[3] = 0;
1766
2.48k
    FORCC
1767
7.44k
    if (fabs(asn[c]) > 0.0001)
1768
5.85k
      cam_mul[c] = float(1. / asn[c]);
1769
2.48k
  }
1770
118k
  if (!use_cm)
1771
335k
    FORCC if (fabs(cc[c][c]) > 0.0001) pre_mul[c] /= float(cc[c][c]);
1772
118k
  return 0;
1773
158k
}
1774
1775
int LibRaw::parse_tiff(INT64 _base)
1776
62.5k
{
1777
62.5k
  INT64 base = _base;
1778
62.5k
  int doff;
1779
62.5k
  fseek(ifp, base, SEEK_SET);
1780
62.5k
  order = get2();
1781
62.5k
  if (order != 0x4949 && order != 0x4d4d)
1782
15.4k
    return 0;
1783
47.0k
  get2();
1784
106k
  while ((doff = get4()))
1785
88.1k
  {
1786
88.1k
  INT64 doff64 = doff;
1787
88.1k
  if (doff64 + base > ifp->size()) break;
1788
68.8k
    fseek(ifp, doff64 + base, SEEK_SET);
1789
68.8k
    if (parse_tiff_ifd(_base))
1790
9.29k
      break;
1791
68.8k
  }
1792
47.0k
  return 1;
1793
62.5k
}
1794
1795
struct ifd_size_t
1796
{
1797
  int ifdi;
1798
  INT64 databits;
1799
};
1800
1801
int ifd_size_t_cmp(const void *a, const void *b)
1802
0
{
1803
0
  if (!a || !b)
1804
0
    return 0;
1805
0
  const ifd_size_t *ai = (ifd_size_t *)a;
1806
0
  const ifd_size_t *bi = (ifd_size_t *)b;
1807
0
  return bi->databits > ai->databits ? 1
1808
0
                                     : (bi->databits < ai->databits ? -1 : 0);
1809
0
}
1810
1811
static LibRaw_internal_thumbnail_formats tiff2thumbformat(int _comp, int _phint, int _bps, const char *_make, bool isDNG);
1812
1813
void LibRaw::apply_tiff()
1814
30.1k
{
1815
30.1k
  int max_samp = 0, ties = 0, raw = -1, thm = -1, i;
1816
30.1k
  unsigned long long ns, os;
1817
30.1k
  struct jhead jh;
1818
1819
30.1k
  thumb_misc = 16;
1820
30.1k
  if (thumb_offset)
1821
3.52k
  {
1822
3.52k
    fseek(ifp, thumb_offset, SEEK_SET);
1823
3.52k
    if (ljpeg_start(&jh, 1))
1824
376
    {
1825
376
      if ((unsigned)jh.bits < 17 && (unsigned)jh.wide < 0x10000 &&
1826
348
          (unsigned)jh.high < 0x10000)
1827
348
      {
1828
348
        thumb_misc = jh.bits;
1829
348
        thumb_width = jh.wide;
1830
348
        thumb_height = jh.high;
1831
348
      }
1832
376
    }
1833
3.52k
  }
1834
188k
  for (i = tiff_nifds; i--;)
1835
158k
  {
1836
158k
    if (tiff_ifd[i].t_shutter)
1837
527
      shutter = tiff_ifd[i].t_shutter;
1838
158k
    tiff_ifd[i].t_shutter = shutter;
1839
158k
  }
1840
1841
30.1k
  if (dng_version)
1842
9.28k
  {
1843
9.28k
    int ifdc = 0;
1844
69.2k
    for (i = 0; i < (int)tiff_nifds; i++)
1845
59.9k
    {
1846
59.9k
      if (tiff_ifd[i].t_width < 1 || tiff_ifd[i].t_width > 65535 ||
1847
16.4k
          tiff_ifd[i].t_height < 1 || tiff_ifd[i].t_height > 65535)
1848
47.2k
        continue; /* wrong image dimensions */
1849
1850
12.6k
      int samp = tiff_ifd[i].samples;
1851
12.6k
      if (samp == 2)
1852
604
        samp = 1; // Fuji 2-frame
1853
12.6k
      max_samp = LIM(MAX(max_samp, samp), 1,
1854
12.6k
                     3); // max_samp is needed for thumbnail selection below
1855
1856
12.6k
     if ( // Check phint only for RAW subfiletype
1857
12.6k
         (tiff_ifd[i].newsubfiletype == 16
1858
12.6k
             || tiff_ifd[i].newsubfiletype == 0
1859
3.00k
             || (tiff_ifd[i].newsubfiletype & 0xffff) == 1)
1860
10.8k
         &&
1861
10.8k
          (tiff_ifd[i].phint != 32803 && tiff_ifd[i].phint != 34892)
1862
12.6k
         )
1863
5.45k
              continue;
1864
1865
7.24k
      if ((tiff_ifd[i].newsubfiletype == 0) // main image
1866
                                            // Enhanced demosaiced:
1867
2.12k
          || (tiff_ifd[i].newsubfiletype == 16 &&
1868
36
              (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_ENHANCED))
1869
          // Preview: 0x1 or 0x10001
1870
2.12k
          || ((tiff_ifd[i].newsubfiletype & 0xffff) == 1 &&
1871
260
              (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_PREVIEWS))
1872
        // Transparency mask: 0x4
1873
2.12k
          || ((tiff_ifd[i].newsubfiletype & 0xffff) == 4 &&
1874
1.39k
          (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_ADD_MASKS)))
1875
5.12k
      {
1876
        // Add this IFD to dng_frames
1877
5.12k
        libraw_internal_data.unpacker_data.dng_frames[ifdc] =
1878
5.12k
            ((tiff_ifd[i].newsubfiletype & 0xffff) << 16) | ((i << 8) & 0xff00);
1879
5.12k
        ifdc++;
1880
        // Fuji SuperCCD: second frame:
1881
5.12k
        if ((tiff_ifd[i].newsubfiletype == 0) && tiff_ifd[i].samples == 2)
1882
256
        {
1883
256
          libraw_internal_data.unpacker_data.dng_frames[ifdc] =
1884
256
              ((tiff_ifd[i].newsubfiletype & 0xffff) << 16) |
1885
256
              ((i << 8) & 0xff00) | 1;
1886
256
          ifdc++;
1887
256
        }
1888
5.12k
      }
1889
7.24k
    }
1890
9.28k
    if (ifdc)
1891
2.52k
    {
1892
2.52k
      if (ifdc > 1 && (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_DNG_PREFER_LARGEST_IMAGE))
1893
0
      {
1894
0
        ifd_size_t arr[LIBRAW_IFD_MAXCOUNT * 2];
1895
0
        memset(arr, 0, sizeof(arr));
1896
0
        for (int q = 0; q < ifdc && q < LIBRAW_IFD_MAXCOUNT * 2; q++)
1897
0
        {
1898
0
          int ifdidx =
1899
0
              (libraw_internal_data.unpacker_data.dng_frames[q] >> 8) & 0xff;
1900
0
          arr[q].ifdi = libraw_internal_data.unpacker_data.dng_frames[q];
1901
0
          arr[q].databits =
1902
0
              INT64(tiff_ifd[ifdidx].t_width) * INT64(tiff_ifd[ifdidx].t_height) *
1903
0
                  INT64(tiff_ifd[ifdidx].samples) * INT64(tiff_ifd[ifdidx].bps) +
1904
0
              INT64(0x100 -
1905
0
               (arr[q].ifdi & 0xff)); // add inverted frame # to ensure same
1906
                                      // sort order for similar sized frames.
1907
0
          if (tiff_ifd[ifdidx].phint == 4)
1908
0
              arr[q].databits /= 4; // Force lower bit count for Transp. mask images
1909
0
        }
1910
0
        qsort(arr, MIN(ifdc, LIBRAW_IFD_MAXCOUNT * 2), sizeof(arr[0]),
1911
0
              ifd_size_t_cmp);
1912
0
        for (int q = 0; q < ifdc && q < LIBRAW_IFD_MAXCOUNT * 2; q++)
1913
0
          libraw_internal_data.unpacker_data.dng_frames[q] = arr[q].ifdi;
1914
0
      }
1915
1916
2.52k
      int idx = LIM((int)shot_select, 0, ifdc - 1);
1917
2.52k
      i = (libraw_internal_data.unpacker_data.dng_frames[idx] >> 8) &
1918
2.52k
          0xff; // extract frame# back
1919
1920
2.52k
      raw_width = tiff_ifd[i].t_width;
1921
2.52k
      raw_height = tiff_ifd[i].t_height;
1922
2.52k
      tiff_bps = tiff_ifd[i].bps;
1923
2.52k
      tiff_compress = tiff_ifd[i].comp;
1924
2.52k
      tiff_sampleformat = tiff_ifd[i].sample_format;
1925
2.52k
      data_offset = tiff_ifd[i].offset;
1926
2.52k
      data_size = tiff_ifd[i].bytes;
1927
2.52k
      tiff_flip = tiff_ifd[i].t_flip;
1928
2.52k
      tiff_samples = tiff_ifd[i].samples;
1929
2.52k
      tile_width = tiff_ifd[i].t_tile_width;
1930
2.52k
      tile_length = tiff_ifd[i].t_tile_length;
1931
2.52k
      fuji_width = tiff_ifd[i].t_fuji_width;
1932
2.52k
      if (tiff_samples != 2) /* special case: Fuji SuperCCD */
1933
2.41k
      {
1934
2.41k
        if (tiff_ifd[i].phint == 34892)
1935
545
          filters = 0;
1936
1.87k
        else if (i > 0 && tiff_ifd[i].phint == 32803 &&
1937
1.02k
                 tiff_ifd[0].phint == 32803 && !tiff_ifd[i].t_filters &&
1938
652
                 tiff_ifd[0].t_filters)
1939
10
          filters = tiff_ifd[0].t_filters;
1940
1.86k
        else
1941
1.86k
          filters = tiff_ifd[i].t_filters;
1942
2.41k
        width = tiff_ifd[i].t_vwidth;
1943
2.41k
        height = tiff_ifd[i].t_vheight;
1944
2.41k
        top_margin = tiff_ifd[i].t_tm;
1945
2.41k
        left_margin = tiff_ifd[i].t_lm;
1946
2.41k
        shutter = tiff_ifd[i].t_shutter;
1947
2.41k
        if (tiff_ifd[i].dng_levels.dng_whitelevel[0])
1948
52
          maximum = tiff_ifd[i].dng_levels.dng_whitelevel[0];
1949
2.36k
        else if (tiff_ifd[i].sample_format <= 2 && tiff_bps > 0 &&
1950
1.03k
                 tiff_bps < 32) // SampleFormat: 0-default(1), 1 - Uint, 2 - Int
1951
761
          maximum = (1 << tiff_bps) - 1;
1952
1.60k
        else if (tiff_ifd[i].sample_format == 3)
1953
536
          maximum = 1; // Defaults for FP
1954
2.41k
      }
1955
2.52k
      raw = i;
1956
2.52k
      is_raw = ifdc;
1957
2.52k
    }
1958
6.75k
    else
1959
6.75k
      is_raw = 0;
1960
9.28k
  }
1961
20.9k
  else
1962
20.9k
  {
1963
    // Fix for broken Sony bps tag
1964
20.9k
    if (!strncasecmp(make, "Sony", 4))
1965
2.26k
    {
1966
17.1k
        for (i = 0; i < (int)tiff_nifds; i++)
1967
14.9k
        {
1968
14.9k
            if (tiff_ifd[i].bps > 33 && tiff_ifd[i].samples == 1)
1969
180
            {
1970
180
                int bps = 14; // default
1971
180
                if (tiff_ifd[i].dng_levels.dng_whitelevel[0] > 0)
1972
92
                {
1973
916
                    for(int c = 0,j=1; c < 16; c++, j<<=1)
1974
884
                        if (j > (int)tiff_ifd[i].dng_levels.dng_whitelevel[0])
1975
60
                        {
1976
60
                            bps = c; break;
1977
60
                        }
1978
92
                }
1979
180
                tiff_ifd[i].bps = bps;
1980
180
            }
1981
14.9k
        }
1982
2.26k
    }
1983
1984
119k
    for (i = 0; i < (int)tiff_nifds; i++)
1985
98.5k
    {
1986
98.5k
      if (tiff_ifd[i].t_width < 1 || tiff_ifd[i].t_width > 65535 ||
1987
27.4k
          tiff_ifd[i].t_height < 1 || tiff_ifd[i].t_height > 65535)
1988
75.6k
        continue; /* wrong image dimensions */
1989
22.9k
      if (max_samp < tiff_ifd[i].samples)
1990
5.67k
        max_samp = tiff_ifd[i].samples;
1991
22.9k
      if (max_samp > 3)
1992
751
        max_samp = 3;
1993
1994
22.9k
      os = unsigned(raw_width) * unsigned(raw_height);
1995
22.9k
      ns = unsigned(tiff_ifd[i].t_width) * unsigned(tiff_ifd[i].t_height);
1996
22.9k
      if (tiff_bps)
1997
12.1k
      {
1998
12.1k
        os *= tiff_bps;
1999
12.1k
        ns *= tiff_ifd[i].bps;
2000
12.1k
      }
2001
      /* too complex if below, so separate if to skip RGB+Alpha TIFFs*/
2002
22.9k
      if (tiff_ifd[i].phint == 2 && tiff_ifd[i].extrasamples > 0 && tiff_ifd[i].samples > 3)
2003
112
          continue; // SKIP RGB+Alpha IFDs
2004
2005
22.7k
    if (!strncasecmp(make, "Sony", 4) && tiff_ifd[i].bps == 8 && tiff_ifd[i].phint == 6 && tiff_ifd[i].comp == 7 &&
2006
730
          tiff_ifd[i].samples == 3 && tiff_ifd[i].newsubfiletype == 1)
2007
683
        continue; // Sony RGB preview
2008
2009
22.1k
      if ((tiff_ifd[i].comp != 6 || tiff_ifd[i].samples != 3 ||
2010
726
      (tiff_ifd[i].comp == 6 && tiff_ifd[i].samples == 3 && !strncasecmp(make, "Sony", 4) && tiff_ifd[i].bps >=12)
2011
22.1k
      ) &&
2012
21.4k
            unsigned(tiff_ifd[i].t_width | tiff_ifd[i].t_height) < 0x10000 &&
2013
21.4k
            (unsigned)tiff_ifd[i].bps < 33 &&
2014
19.9k
            (unsigned)tiff_ifd[i].samples < 13 && ns &&
2015
19.3k
            ((ns > os && (ties = 1)) || (ns == os && (int)shot_select == ties++)))
2016
8.12k
      {
2017
8.12k
        raw_width = tiff_ifd[i].t_width;
2018
8.12k
        raw_height = tiff_ifd[i].t_height;
2019
8.12k
        tiff_bps = tiff_ifd[i].bps;
2020
8.12k
        tiff_compress = tiff_ifd[i].comp;
2021
8.12k
        tiff_sampleformat = tiff_ifd[i].sample_format;
2022
8.12k
        data_offset = tiff_ifd[i].offset;
2023
8.12k
        data_size = tiff_ifd[i].bytes;
2024
8.12k
        tiff_flip = tiff_ifd[i].t_flip;
2025
8.12k
        tiff_samples = tiff_ifd[i].samples;
2026
8.12k
        tile_width = tiff_ifd[i].t_tile_width;
2027
8.12k
        tile_length = tiff_ifd[i].t_tile_length;
2028
8.12k
        shutter = tiff_ifd[i].t_shutter;
2029
8.12k
        raw = i;
2030
8.12k
      }
2031
22.1k
    }
2032
20.9k
    if (is_raw == 1 && ties)
2033
5.17k
      is_raw = ties;
2034
20.9k
  }
2035
30.1k
  if (is_NikonTransfer && raw >= 0)
2036
97
  {
2037
97
    if (tiff_ifd[raw].bps == 16)
2038
18
    {
2039
18
      if (tiff_compress == 1)
2040
10
      {
2041
10
        if ((INT64(raw_width) * INT64(raw_height) * 3LL) == (tiff_ifd[raw].bytes << 1))
2042
0
        {
2043
0
          tiff_bps = tiff_ifd[raw].bps = 12;
2044
0
        }
2045
10
        else
2046
10
        {
2047
10
          tiff_bps = tiff_ifd[raw].bps = 14;
2048
10
        }
2049
10
      }
2050
18
    }
2051
79
    else if (tiff_ifd[raw].bps == 8)
2052
32
    {
2053
32
      if (tiff_compress == 1)
2054
12
      {
2055
12
        is_NikonTransfer = 2; // 8-bit debayered TIFF, like CoolScan NEFs
2056
12
        imgdata.rawparams.coolscan_nef_gamma = 2.2f;
2057
12
      }
2058
32
    }
2059
97
  }
2060
2061
30.1k
  if (!tile_width)
2062
24.1k
    tile_width = INT_MAX;
2063
30.1k
  if (!tile_length)
2064
24.5k
    tile_length = INT_MAX;
2065
188k
  for (i = tiff_nifds; i--;)
2066
158k
    if (tiff_ifd[i].t_flip)
2067
1.91k
      tiff_flip = tiff_ifd[i].t_flip;
2068
2069
#if 0
2070
  if (raw < 0 && is_raw)
2071
      is_raw = 0;
2072
#endif
2073
2074
30.1k
  if (raw >= 0 && !load_raw)
2075
8.46k
    switch (tiff_compress)
2076
8.46k
    {
2077
0
    case 32766:
2078
0
      if (!dng_version && !strncasecmp(make, "Sony", 4) &&
2079
0
          tiff_ifd[raw].phint == 32803 && tiff_ifd[raw].samples == 1 &&
2080
0
          (tiff_bps == 12 || tiff_bps == 14) && raw_width > 0 &&
2081
0
          raw_height > 0)
2082
0
      {
2083
0
        load_raw = &LibRaw::sony_arw6_load_raw;
2084
0
        tiff_bps = 14;
2085
0
        break;
2086
0
      }
2087
0
      break;
2088
615
    case 32767:
2089
615
      if (!dng_version &&
2090
503
          tiff_ifd[raw].bytes == INT64(raw_width) * INT64(raw_height))
2091
34
      {
2092
34
        tiff_bps = 14;
2093
34
        load_raw = &LibRaw::sony_arw2_load_raw;
2094
34
        break;
2095
34
      }
2096
581
      if (!dng_version && !strncasecmp(make, "Sony", 4) &&
2097
18
          tiff_ifd[raw].bytes == INT64(raw_width) * INT64(raw_height) * 2LL)
2098
1
      {
2099
1
        tiff_bps = 14;
2100
1
        load_raw = &LibRaw::unpacked_load_raw;
2101
1
        break;
2102
1
      }
2103
580
      if (tiff_ifd[raw].bytes * 8LL !=
2104
580
          INT64(raw_width) * INT64(raw_height) * INT64(tiff_bps))
2105
339
      {
2106
339
        raw_height += 8;
2107
339
        load_raw = &LibRaw::sony_arw_load_raw;
2108
339
        break;
2109
339
      }
2110
241
      load_flags = 79;
2111
304
    case 32769:
2112
304
      load_flags++;
2113
315
    case 32770:
2114
562
    case 32773:
2115
562
      goto slr;
2116
3.63k
    case 0:
2117
4.00k
    case 1:
2118
4.00k
        if (dng_version && tiff_sampleformat == 3 &&
2119
499
          (tiff_bps > 8 && (tiff_bps % 8 == 0) && (tiff_bps <= 32))) // only 16,24, and 32 are allowed
2120
383
        {
2121
383
            load_raw = &LibRaw::uncompressed_fp_dng_load_raw;
2122
383
            break;
2123
383
        }
2124
      // Sony 14-bit uncompressed
2125
3.61k
        if (!dng_version && !strncasecmp(make, "Sony", 4) &&
2126
184
            tiff_ifd[raw].bytes == INT64(raw_width) * INT64(raw_height) * 2LL)
2127
0
      {
2128
0
        tiff_bps = 14;
2129
0
        load_raw = &LibRaw::unpacked_load_raw;
2130
0
        break;
2131
0
      }
2132
3.61k
      if (!dng_version && !strncasecmp(make, "Sony", 4) && tiff_ifd[raw].samples == 4 &&
2133
75
          tiff_ifd[raw].bytes == INT64(raw_width) * INT64(raw_height) * 8LL) // Sony ARQ
2134
0
      {
2135
        // maybe to detect ARQ with the following:
2136
        // if (tiff_ifd[raw].phint == 32892)
2137
0
        tiff_bps = 14;
2138
0
        tiff_samples = 4;
2139
0
        load_raw = &LibRaw::sony_arq_load_raw;
2140
0
        filters = 0;
2141
0
        strcpy(cdesc, "RGBG");
2142
0
        break;
2143
0
      }
2144
3.61k
      if (!strncasecmp(make, "Nikon", 5) &&
2145
167
          (!strncmp(software, "Nikon Scan", 10) || (is_NikonTransfer == 2) ||
2146
156
           strcasestr(model, "COOLSCAN")))
2147
49
      {
2148
49
        load_raw = &LibRaw::nikon_coolscan_load_raw;
2149
49
        raw_color = 1;
2150
49
        colors = (tiff_samples == 3) ? 3 : 1;
2151
49
        filters = 0;
2152
49
        break;
2153
49
      }
2154
3.56k
      if ((!strncmp(make, "OLYMPUS", 7) || !strncmp(make, "OM Digi", 7) ||
2155
3.25k
           (!strncasecmp(make, "CLAUSS", 6) && !strncasecmp(model, "piX 5oo", 7))) && // 0x5330303539 works here
2156
344
          (tiff_ifd[raw].bytes * 2LL == INT64(raw_width) * INT64(raw_height) * 3LL))
2157
3
        load_flags = 24;
2158
3.56k
      if (!dng_version && tiff_ifd[raw].bytes * 5LL == INT64(raw_width) * INT64(raw_height) * 8LL)
2159
7
      {
2160
7
        load_flags = 81;
2161
7
        tiff_bps = 12;
2162
7
      }
2163
4.13k
    slr:
2164
4.13k
      switch (tiff_bps)
2165
4.13k
      {
2166
37
      case 8:
2167
37
        load_raw = &LibRaw::eight_bit_load_raw;
2168
37
        break;
2169
76
      case 12:
2170
76
        if (tiff_ifd[raw].phint == 2)
2171
10
          load_flags = 6;
2172
76
        if (!strncasecmp(make, "NIKON", 5) &&
2173
2
            !strncasecmp(model, "COOLPIX A1000", 13) &&
2174
0
            data_size == raw_width * raw_height * 2u)
2175
0
          load_raw = &LibRaw::unpacked_load_raw;
2176
76
        else
2177
76
          load_raw = &LibRaw::packed_load_raw;
2178
76
        break;
2179
49
      case 14:
2180
49
        load_flags = 0;
2181
191
      case 16:
2182
191
        load_raw = &LibRaw::unpacked_load_raw;
2183
191
    if ((!strncmp(make, "OLYMPUS", 7) || !strncmp(make, "OM Digi", 7) ||
2184
188
      (!strncasecmp(make, "CLAUSS", 6) && !strncasecmp(model, "piX 5oo", 7))) && // 0x5330303539 works here
2185
3
      (tiff_ifd[raw].bytes * 7LL > INT64(raw_width) * INT64(raw_height)))
2186
2
    {
2187
2
        load_raw = &LibRaw::olympus_load_raw;
2188
2
    }
2189
4.13k
      }
2190
4.13k
      break;
2191
4.13k
    case 6:
2192
709
    case 7:
2193
711
    case 99:
2194
711
    if (!dng_version && tiff_compress == 6 && !strcasecmp(make, "SONY"))
2195
22
    {
2196
22
      if (tiff_ifd[raw].phint == 6 && tiff_ifd[raw].bps >= 12 && tiff_ifd[raw].samples == 3)
2197
7
      {
2198
7
        load_raw = &LibRaw::sony_ycbcr_load_raw;
2199
7
        filters = 0;
2200
7
        colors = 3;
2201
7
      }
2202
15
      else
2203
15
        load_raw = &LibRaw::sony_ljpeg_load_raw;
2204
22
      }
2205
    // Allow A1/Compression=7
2206
689
    else if(!dng_version && tiff_compress == 7 && !strcasecmp(make, "SONY") &&
2207
3
      (!strcasecmp(model,"ILCE-1") || !strncasecmp(model, "ILCE-7",6)
2208
3
        || !strncasecmp(model, "ILCE-9", 6) // Most likely ILCE-9 will use tiff_compr=7 this w/ updated FW
2209
3
        ) &&
2210
0
      tiff_bps == 14 && tiff_samples == 1)
2211
0
          load_raw = &LibRaw::sony_ljpeg_load_raw;
2212
689
        else
2213
689
        load_raw = &LibRaw::lossless_jpeg_load_raw;
2214
711
      break;
2215
524
    case 262:
2216
524
      load_raw = &LibRaw::kodak_262_load_raw;
2217
524
      break;
2218
217
    case 34713:
2219
217
      if ((INT64(raw_width) + 9LL) / 10LL * 16LL * INT64(raw_height) == tiff_ifd[raw].bytes)
2220
2
      {
2221
2
        load_raw = &LibRaw::packed_load_raw;
2222
2
        load_flags = 1;
2223
2
      }
2224
215
      else if (INT64(raw_width) * INT64(raw_height) * 3LL == tiff_ifd[raw].bytes * 2LL)
2225
2
      {
2226
2
        load_raw = &LibRaw::packed_load_raw;
2227
2
        if (model[0] == 'N')
2228
1
          load_flags = 80;
2229
2
      }
2230
213
      else if (INT64(raw_width) * INT64(raw_height) * 3LL == tiff_ifd[raw].bytes)
2231
54
      {
2232
54
        load_raw = &LibRaw::nikon_yuv_load_raw;
2233
54
        gamma_curve(1 / 2.4, 12.92, 1, 4095);
2234
54
        memset(cblack, 0, sizeof cblack);
2235
54
        filters = 0;
2236
54
      }
2237
159
      else if (INT64(raw_width) * INT64(raw_height) * 2LL == tiff_ifd[raw].bytes)
2238
1
      {
2239
1
        load_raw = &LibRaw::unpacked_load_raw;
2240
1
        load_flags = 4;
2241
1
        order = 0x4d4d;
2242
1
      }
2243
#if 0 /* Never used because of same condition above, but need to recheck */
2244
      else if (INT64(raw_width) * INT64(raw_height) * 3LL ==
2245
               INT64(tiff_ifd[raw].bytes) * 2LL)
2246
      {
2247
        load_raw = &LibRaw::packed_load_raw;
2248
        load_flags = 80;
2249
      }
2250
#endif
2251
158
      else if (tiff_ifd[raw].rows_per_strip &&
2252
15
               tiff_ifd[raw].strip_offsets_count &&
2253
11
               tiff_ifd[raw].strip_offsets_count ==
2254
11
                   tiff_ifd[raw].strip_byte_counts_count)
2255
7
      {
2256
7
        int fit = 1;
2257
7
        for (int q = 0; q < tiff_ifd[raw].strip_byte_counts_count - 1;
2258
7
             q++) // all but last
2259
7
          if (INT64(tiff_ifd[raw].strip_byte_counts[q]) * 2LL !=
2260
7
              INT64(tiff_ifd[raw].rows_per_strip) * INT64(raw_width) * 3LL)
2261
7
          {
2262
7
            fit = 0;
2263
7
            break;
2264
7
          }
2265
7
        if (fit)
2266
0
          load_raw = &LibRaw::nikon_load_striped_packed_raw;
2267
7
        else
2268
7
          load_raw = &LibRaw::nikon_load_raw; // fallback
2269
7
      }
2270
151
      else if ((((INT64(raw_width) * 3LL / 2LL) + 15LL) / 16LL) * 16LL * INT64(raw_height) == tiff_ifd[raw].bytes)
2271
1
      {
2272
1
        load_raw = &LibRaw::nikon_load_padded_packed_raw;
2273
1
      }
2274
150
      else if ((!strncmp(model, "NIKON Z 9", 9) || !strncmp(model, "NIKON Z 8", 9) || !strcmp(model, "NIKON Z f")
2275
150
      || !strcmp(model, "NIKON Z6_3")) &&
2276
0
               tiff_ifd[raw].offset)
2277
0
      {
2278
0
          INT64 pos = ftell(ifp);
2279
0
          unsigned char cmp[] = {0xff, 0x10, 0xff, 0x50 }; // JpegXS SOC + Cap
2280
0
          unsigned char buf[4];
2281
0
          fseek(ifp, INT64(tiff_ifd[raw].offset), SEEK_SET);
2282
0
          fread(buf, 1, 4, ifp);
2283
0
          fseek(ifp, pos, SEEK_SET);
2284
0
          if(!memcmp(buf,cmp,4))
2285
0
            load_raw = &LibRaw::nikon_he_load_raw;
2286
0
          else
2287
0
            load_raw = &LibRaw::nikon_load_raw;
2288
0
      }
2289
150
      else
2290
150
        load_raw = &LibRaw::nikon_load_raw;
2291
217
      break;
2292
593
    case 65535:
2293
593
      load_raw = &LibRaw::pentax_load_raw;
2294
593
      break;
2295
322
    case 65000:
2296
322
      switch (tiff_ifd[raw].phint)
2297
322
      {
2298
61
      case 2:
2299
61
        load_raw = &LibRaw::kodak_rgb_load_raw;
2300
61
        filters = 0;
2301
61
        break;
2302
45
      case 6:
2303
45
        load_raw = &LibRaw::kodak_ycbcr_load_raw;
2304
45
        filters = 0;
2305
45
        break;
2306
74
      case 32803:
2307
74
        load_raw = &LibRaw::kodak_65000_load_raw;
2308
322
      }
2309
341
    case 32867:
2310
538
    case 34892:
2311
538
      break;
2312
326
    case 8:
2313
326
      break;
2314
1
    case 52546:
2315
1
      if (dng_version) /* DNG 1.7 JPEG XL: if not compiled w/ DNG SDK decoder will return NOT SUPPORTED*/
2316
0
        break;
2317
    // else: fallthrough
2318
62
    case 9:
2319
62
      if (dng_version)
2320
41
        break; /* Compression=9 supported for dng if we compiled with GPR SDK; if NO SDK: decoder will return NOT Supported */
2321
    // else: fallthrough
2322
577
    default:
2323
577
      is_raw = 0;
2324
8.46k
    }
2325
30.1k
  if (!dng_version)
2326
20.9k
  {
2327
20.9k
      if (((tiff_samples == 3 && tiff_ifd[raw].bytes &&
2328
1.25k
          !(tiff_bps == 16 &&
2329
354
              !strncmp(make, "Leaf", 4)) && // Allow Leaf/16bit/3color files
2330
1.23k
      !(tiff_ifd[raw].comp == 6 && tiff_ifd[raw].phint == 6 && tiff_bps >= 12 && !strncasecmp(make,"Sony",4)) && // Sony YCbCr
2331
1.23k
          tiff_bps != 14 &&
2332
1.03k
          (tiff_compress & -16) != 32768) ||
2333
20.0k
          (tiff_bps == 8 && strncmp(make, "Phase", 5) &&
2334
797
              strncmp(make, "Leaf", 4) && !strcasestr(make, "Kodak") &&
2335
700
              !strstr(model2, "DEBUG RAW"))) &&
2336
1.54k
          !strcasestr(model, "COOLSCAN") && strncmp(software, "Nikon Scan", 10) &&
2337
1.47k
          is_NikonTransfer != 2)
2338
1.46k
          is_raw = 0;
2339
2340
20.9k
      if (is_raw && raw >= 0 && tiff_ifd[raw].phint == 2 && tiff_ifd[raw].extrasamples > 0 && tiff_ifd[raw].samples > 3)
2341
0
          is_raw = 0; // SKIP RGB+Alpha IFDs
2342
20.9k
  }
2343
2344
30.1k
  INT64 fsizecheck = 0ULL;
2345
2346
30.1k
  if (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_ALL_VENDORS)
2347
0
      fsizecheck = ifp->size();
2348
30.1k
  else if ((imgdata.rawparams.options & LIBRAW_RAWOPTIONS_CHECK_THUMBNAILS_KNOWN_VENDORS) &&
2349
0
           (!strncasecmp(make, "Ricoh", 5) || (dng_version && !strncasecmp(make, "Samsung", 7))))
2350
0
      fsizecheck = ifp->size();
2351
2352
188k
  for (i = 0; i < (int)tiff_nifds; i++)
2353
158k
    if (i != raw &&
2354
147k
        (tiff_ifd[i].samples == max_samp ||
2355
40.7k
         (tiff_ifd[i].comp == 7 &&
2356
980
          tiff_ifd[i].samples == 1)) /* Allow 1-bps JPEGs */
2357
107k
        && tiff_ifd[i].bps > 0 && tiff_ifd[i].bps < 33 &&
2358
14.3k
        tiff_ifd[i].phint != 32803 && tiff_ifd[i].phint != 34892 &&
2359
12.8k
    (tiff_ifd[i].comp != 52546 || (imgdata.rawparams.options & LIBRAW_RAWOPTIONS_ALLOW_JPEGXL_PREVIEWS)) &&
2360
12.8k
        unsigned(tiff_ifd[i].t_width | tiff_ifd[i].t_height) < 0x10000 &&
2361
12.1k
        tiff_ifd[i].comp != 34892)
2362
12.0k
    {
2363
12.0k
        if (fsizecheck > 0LL)
2364
0
        {
2365
0
            bool ok = true;
2366
0
            if (tiff_ifd[i].strip_byte_counts_count && tiff_ifd[i].strip_offsets_count)
2367
0
                for (int s = 0; s < MIN(tiff_ifd[i].strip_byte_counts_count, tiff_ifd[i].strip_offsets_count); s++)
2368
0
                {
2369
0
                    if (tiff_ifd[i].strip_offsets[s] + tiff_ifd[i].strip_byte_counts[s] > fsizecheck)
2370
0
                    {
2371
0
                        ok = false;
2372
0
                        break;
2373
0
                    }
2374
0
                }
2375
0
            else if (tiff_ifd[i].bytes > 0)
2376
0
                if (tiff_ifd[i].offset + tiff_ifd[i].bytes > fsizecheck)
2377
0
                    ok = false;
2378
2379
0
            if(!ok)
2380
0
                continue;
2381
0
        }
2382
12.0k
    if ( (INT64(tiff_ifd[i].t_width) * INT64(tiff_ifd[i].t_height) / INT64(SQR(tiff_ifd[i].bps) + 1)) >
2383
12.0k
       (INT64(thumb_width) * INT64(thumb_height) / INT64(SQR(thumb_misc) + 1)) ) 
2384
2.15k
    {
2385
2386
2.15k
      thumb_width = tiff_ifd[i].t_width;
2387
2.15k
      thumb_height = tiff_ifd[i].t_height;
2388
2.15k
      thumb_offset = tiff_ifd[i].offset;
2389
2.15k
      thumb_length = unsigned(tiff_ifd[i].bytes); // do we expect >4GB thumbnail?
2390
2.15k
      thumb_misc = tiff_ifd[i].bps;
2391
2.15k
      thm = i;
2392
2.15k
    }
2393
12.0k
    if (imgdata.thumbs_list.thumbcount < LIBRAW_THUMBNAIL_MAXCOUNT && tiff_ifd[i].bytes > 0)
2394
4.96k
    {
2395
4.96k
      bool already = false;
2396
5.43k
      for(int idx = 0; idx < imgdata.thumbs_list.thumbcount ; idx++)
2397
4.59k
        if (imgdata.thumbs_list.thumblist[idx].toffset == tiff_ifd[i].offset)
2398
4.12k
        {
2399
4.12k
          already = true;
2400
4.12k
          break;
2401
4.12k
        }
2402
4.96k
      if (!already)
2403
837
      {
2404
837
        int idx = imgdata.thumbs_list.thumbcount;
2405
837
        imgdata.thumbs_list.thumblist[idx].tformat = tiff2thumbformat(tiff_ifd[i].comp, tiff_ifd[i].phint,
2406
837
          tiff_ifd[i].bps, make, dng_version);
2407
837
        imgdata.thumbs_list.thumblist[idx].twidth = tiff_ifd[i].t_width;
2408
837
        imgdata.thumbs_list.thumblist[idx].theight = tiff_ifd[i].t_height;
2409
837
        imgdata.thumbs_list.thumblist[idx].tflip = tiff_ifd[i].t_flip;
2410
837
        imgdata.thumbs_list.thumblist[idx].tlength = unsigned(tiff_ifd[i].bytes);
2411
837
        imgdata.thumbs_list.thumblist[idx].tmisc = tiff_ifd[i].bps | (tiff_ifd[i].samples << 5);
2412
837
        imgdata.thumbs_list.thumblist[idx].toffset = tiff_ifd[i].offset;
2413
837
        imgdata.thumbs_list.thumbcount++;
2414
837
      }
2415
4.96k
    }
2416
12.0k
    }
2417
30.1k
  if (thm >= 0)
2418
2.13k
  {
2419
2.13k
    thumb_misc |= tiff_ifd[thm].samples << 5;
2420
2.13k
  thumb_format = tiff2thumbformat(tiff_ifd[thm].comp, tiff_ifd[thm].phint, tiff_ifd[thm].bps, make, dng_version);
2421
2.13k
  }
2422
30.1k
}
2423
2424
static LibRaw_internal_thumbnail_formats tiff2thumbformat(int _comp, int _phint, int _bps, const char *_make, bool isDNG)
2425
2.97k
{
2426
2.97k
  switch (_comp)
2427
2.97k
  {
2428
742
  case 0:
2429
742
    return LIBRAW_INTERNAL_THUMBNAIL_LAYER;
2430
525
  case 1:
2431
525
    if (_bps <= 8)
2432
211
      return LIBRAW_INTERNAL_THUMBNAIL_PPM;
2433
314
    else if (!strncmp(_make, "Imacon", 6))
2434
9
      return LIBRAW_INTERNAL_THUMBNAIL_PPM16;
2435
305
    else if (isDNG &&  _phint == 6 && _bps == 12)
2436
12
      return LIBRAW_INTERNAL_THUMBNAIL_DNG_YCBCR;
2437
293
    else
2438
293
      return LIBRAW_INTERNAL_THUMBNAIL_KODAK_THUMB;
2439
0
  case 52546:
2440
0
    return LIBRAW_INTERNAL_THUMBNAIL_JPEGXL;
2441
108
  case 65000:
2442
108
    return _phint == 6 ? LIBRAW_INTERNAL_THUMBNAIL_KODAK_YCBCR : LIBRAW_INTERNAL_THUMBNAIL_KODAK_RGB;
2443
2.97k
  }
2444
1.60k
  return LIBRAW_INTERNAL_THUMBNAIL_JPEG; // default
2445
2.97k
}