Coverage Report

Created: 2025-08-26 07:07

/src/libraw/src/metadata/canon.cpp
Line
Count
Source (jump to first uncovered line)
1
/* -*- C++ -*-
2
 * Copyright 2019-2024 LibRaw LLC (info@libraw.org)
3
 *
4
5
 LibRaw is free software; you can redistribute it and/or modify
6
 it under the terms of the one of two licenses as you choose:
7
8
1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1
9
   (See file LICENSE.LGPL provided in LibRaw distribution archive for details).
10
11
2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
12
   (See file LICENSE.CDDL provided in LibRaw distribution archive for details).
13
14
 */
15
#include "../../internal/dcraw_defs.h"
16
#include "../../internal/libraw_cameraids.h"
17
18
7.90k
libraw_area_t LibRaw::get_CanonArea() {
19
7.90k
  libraw_area_t la = {};
20
7.90k
  la.l = get2();
21
7.90k
  la.t = get2();
22
7.90k
  la.r = get2();
23
7.90k
  la.b = get2();
24
7.90k
  return la;
25
7.90k
}
26
27
float LibRaw::_CanonConvertAperture(ushort in)
28
221k
{
29
221k
  if ((in == (ushort)0xffe0) || (in == (ushort)0x7fff))
30
5.53k
    return 0.0f;
31
216k
  return LibRaw::libraw_powf64l(2.f, float(in) / 64.f);
32
221k
}
33
34
static float _CanonConvertEV(short in)
35
38.6k
{
36
38.6k
  short EV, Sign, Frac;
37
38.6k
  float Frac_f;
38
38.6k
  EV = in;
39
38.6k
  if (EV < 0)
40
23.0k
  {
41
23.0k
    EV = -EV;
42
23.0k
    Sign = -1;
43
23.0k
  }
44
15.5k
  else
45
15.5k
  {
46
15.5k
    Sign = 1;
47
15.5k
  }
48
38.6k
  Frac = EV & 0x1f;
49
38.6k
  EV -= Frac; // remove fraction
50
51
38.6k
  if (Frac == 0x0c)
52
1.92k
  { // convert 1/3 and 2/3 codes
53
1.92k
    Frac_f = 32.0f / 3.0f;
54
1.92k
  }
55
36.6k
  else if (Frac == 0x14)
56
862
  {
57
862
    Frac_f = 64.0f / 3.0f;
58
862
  }
59
35.8k
  else
60
35.8k
    Frac_f = (float)Frac;
61
62
38.6k
  return ((float)Sign * ((float)EV + Frac_f)) / 32.0f;
63
38.6k
}
64
65
void LibRaw::setCanonBodyFeatures(unsigned long long id)
66
41.9k
{
67
68
41.9k
  ilm.CamID = id;
69
41.9k
  if ((id == CanonID_EOS_1D)           ||
70
41.9k
      (id == CanonID_EOS_1D_Mark_II)   ||
71
41.9k
      (id == CanonID_EOS_1D_Mark_II_N) ||
72
41.9k
      (id == CanonID_EOS_1D_Mark_III)  ||
73
41.9k
      (id == CanonID_EOS_1D_Mark_IV))
74
3.19k
  {
75
3.19k
    ilm.CameraFormat = LIBRAW_FORMAT_APSH;
76
3.19k
    ilm.CameraMount = LIBRAW_MOUNT_Canon_EF;
77
3.19k
  }
78
38.7k
  else if ((id == CanonID_EOS_1Ds)           ||
79
38.7k
           (id == CanonID_EOS_1Ds_Mark_II)   ||
80
38.7k
           (id == CanonID_EOS_1Ds_Mark_III)  ||
81
38.7k
           (id == CanonID_EOS_1D_X)          ||
82
38.7k
           (id == CanonID_EOS_1D_X_Mark_II)  ||
83
38.7k
           (id == CanonID_EOS_1D_X_Mark_III) ||
84
38.7k
           (id == CanonID_EOS_1D_C)          ||
85
38.7k
           (id == CanonID_EOS_5D)            ||
86
38.7k
           (id == CanonID_EOS_5D_Mark_II)    ||
87
38.7k
           (id == CanonID_EOS_5D_Mark_III)   ||
88
38.7k
           (id == CanonID_EOS_5D_Mark_IV)    ||
89
38.7k
           (id == CanonID_EOS_5DS)           ||
90
38.7k
           (id == CanonID_EOS_5DS_R)         ||
91
38.7k
           (id == CanonID_EOS_6D)            ||
92
38.7k
           (id == CanonID_EOS_6D_Mark_II))
93
9.60k
  {
94
9.60k
    ilm.CameraFormat = LIBRAW_FORMAT_FF;
95
9.60k
    ilm.CameraMount = LIBRAW_MOUNT_Canon_EF;
96
9.60k
  }
97
29.1k
  else if ((id == CanonID_EOS_M)             ||
98
29.1k
           (id == CanonID_EOS_M2)            ||
99
29.1k
           (id == CanonID_EOS_M3)            ||
100
29.1k
           (id == CanonID_EOS_M5)            ||
101
29.1k
           (id == CanonID_EOS_M10)           ||
102
29.1k
           (id == CanonID_EOS_M50)           ||
103
29.1k
           (id == CanonID_EOS_M50_Mark_II)   ||
104
29.1k
           (id == CanonID_EOS_M6)            ||
105
29.1k
           (id == CanonID_EOS_M6_Mark_II)    ||
106
29.1k
           (id == CanonID_EOS_M100))
107
2.89k
  {
108
2.89k
    ilm.CameraFormat = LIBRAW_FORMAT_APSC;
109
2.89k
    ilm.CameraMount = LIBRAW_MOUNT_Canon_EF_M;
110
2.89k
  }
111
26.2k
  else if (
112
26.2k
              (id == CanonID_EOS_R)
113
26.2k
           || (id == CanonID_EOS_RP)
114
26.2k
           || (id == CanonID_EOS_R3)
115
26.2k
           || (id == CanonID_EOS_R5)
116
26.2k
           || (id == CanonID_EOS_R5_C)
117
26.2k
           || (id == CanonID_EOS_R6)
118
26.2k
           || (id == CanonID_EOS_R6m2)
119
26.2k
           || (id == CanonID_EOS_R8)
120
26.2k
          )
121
1.68k
  {
122
1.68k
    ilm.CameraFormat = LIBRAW_FORMAT_FF;
123
1.68k
    ilm.CameraMount = LIBRAW_MOUNT_Canon_RF;
124
1.68k
    ilm.LensFormat = LIBRAW_FORMAT_FF;
125
1.68k
    ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
126
1.68k
  }
127
128
24.6k
  else if (
129
24.6k
              (id == CanonID_EOS_R7)
130
24.6k
           || (id == CanonID_EOS_R10)
131
24.6k
           || (id == CanonID_EOS_R50)
132
24.6k
           || (id == CanonID_EOS_R100)
133
24.6k
          )
134
1.51k
  {
135
1.51k
    ilm.CameraFormat = LIBRAW_FORMAT_APSC;
136
1.51k
    ilm.CameraMount = LIBRAW_MOUNT_Canon_RF;
137
1.51k
    ilm.LensFormat = LIBRAW_FORMAT_APSC;
138
1.51k
    ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
139
1.51k
  }
140
141
23.0k
  else if ((id == CanonID_EOS_D30) ||
142
23.0k
           (id == CanonID_EOS_D60) ||
143
23.0k
           (id > 0x80000000ULL))
144
14.5k
  {
145
14.5k
    ilm.CameraFormat = LIBRAW_FORMAT_APSC;
146
14.5k
    ilm.CameraMount = LIBRAW_MOUNT_Canon_EF;
147
14.5k
  }
148
41.9k
}
149
150
14.4k
int CanonCameraInfo_checkFirmwareRecordLocation (uchar *offset) {
151
// firmware record location allows
152
// to determine the subversion of the CameraInfo table
153
// and to adjust offsets accordingly
154
14.4k
  if (
155
14.4k
        isdigit(*offset)     &&
156
14.4k
        isdigit(*(offset+2)) &&
157
14.4k
        isdigit(*(offset+4)) &&
158
14.4k
        (*(offset+1) == '.') &&
159
14.4k
        (*(offset+3) == '.') &&
160
14.4k
        ((*(offset+5) == 0) || isspace(*(offset+5)))
161
14.4k
      ) return 1;
162
12.1k
  else return 0; // error
163
14.4k
}
164
165
void LibRaw::processCanonCameraInfo(unsigned long long id, uchar *CameraInfo,
166
                                    unsigned maxlen, unsigned type, unsigned dng_writer)
167
19.5k
{
168
19.5k
  ushort iCanonLensID = 0, iCanonMaxFocal = 0, iCanonMinFocal = 0,
169
19.5k
         iCanonLens = 0, iCanonCurFocal = 0, iCanonFocalType = 0,
170
19.5k
         iMakernotesFlip = 0,
171
19.5k
         iHTP = 0, iALO = 0;
172
19.5k
  short SubVersion_offset = 0;
173
19.5k
  ushort SubVersion = 0, mgck = 0;
174
175
19.5k
  if (maxlen < 16)
176
282
    return; // too short
177
178
19.2k
  mgck = sget2(CameraInfo);
179
19.2k
  CameraInfo[0] = 0;
180
19.2k
  CameraInfo[1] = 0;
181
19.2k
  if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_LONG)) {
182
7.45k
    if ((maxlen == 94)  || (maxlen == 138) || (maxlen == 148) ||
183
7.45k
        (maxlen == 156) || (maxlen == 162) || (maxlen == 167) ||
184
7.45k
        (maxlen == 171) || (maxlen == 264) || (maxlen > 400))
185
4.89k
      imCommon.CameraTemperature = float(sget4(CameraInfo + ((maxlen - 3) << 2)));
186
2.56k
    else if (maxlen == 72)
187
91
      imCommon.CameraTemperature = float(sget4(CameraInfo + ((maxlen - 1) << 2)));
188
2.47k
    else if ((maxlen == 85) || (maxlen == 93))
189
421
      imCommon.CameraTemperature = float(sget4(CameraInfo + ((maxlen - 2) << 2)));
190
2.05k
    else if ((maxlen == 96) || (maxlen == 104))
191
748
      imCommon.CameraTemperature = float(sget4(CameraInfo + ((maxlen - 4) << 2)));
192
7.45k
  }
193
194
19.2k
  switch (id)
195
19.2k
  {
196
664
  case CanonID_EOS_1D:
197
1.23k
  case CanonID_EOS_1Ds:
198
1.23k
    iCanonCurFocal  =  0x0a;
199
1.23k
    iCanonLensID    =  0x0d;
200
1.23k
    iCanonMinFocal  =  0x0e;
201
1.23k
    iCanonMaxFocal  =  0x10;
202
1.23k
    if (!ilm.CurFocal)
203
435
      ilm.CurFocal = sget2(CameraInfo + iCanonCurFocal);
204
1.23k
    if (!ilm.MinFocal)
205
968
      ilm.MinFocal = sget2(CameraInfo + iCanonMinFocal);
206
1.23k
    if (!ilm.MaxFocal)
207
948
      ilm.MaxFocal = sget2(CameraInfo + iCanonMaxFocal);
208
1.23k
    imCommon.CameraTemperature = 0.0f;
209
1.23k
    break;
210
211
503
  case CanonID_EOS_1D_Mark_II:
212
878
  case CanonID_EOS_1Ds_Mark_II:
213
878
    iCanonCurFocal  =  0x09;
214
878
    iCanonLensID    =  0x0c;
215
878
    iCanonMinFocal  =  0x11;
216
878
    iCanonMaxFocal  =  0x13;
217
878
    iCanonFocalType =  0x2d;
218
878
    break;
219
220
253
  case CanonID_EOS_1D_Mark_II_N:
221
253
    iCanonCurFocal  =  0x09;
222
253
    iCanonLensID    =  0x0c;
223
253
    iCanonMinFocal  =  0x11;
224
253
    iCanonMaxFocal  =  0x13;
225
253
    break;
226
227
432
  case CanonID_EOS_1D_Mark_III:
228
672
  case CanonID_EOS_1Ds_Mark_III:
229
672
    iCanonCurFocal  =  0x1d;
230
672
    iMakernotesFlip =  0x30;
231
672
    iCanonLensID    = 0x111;
232
672
    iCanonMinFocal  = 0x113;
233
672
    iCanonMaxFocal  = 0x115;
234
672
    break;
235
236
955
  case CanonID_EOS_1D_Mark_IV:
237
955
    if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x1e8))
238
327
      SubVersion = 1;
239
628
    else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x1ed))
240
107
      SubVersion = 2;
241
// printf ("==>> CanonID_EOS_1D_Mark_IV, SubVersion: %d\n", SubVersion);
242
955
    iHTP            =  0x07;
243
955
    iCanonCurFocal  =  0x1e;
244
955
    iMakernotesFlip =  0x35;
245
246
955
    if (!SubVersion)
247
521
      break;
248
434
    else if (SubVersion < 2)
249
327
      SubVersion_offset += -1;
250
251
434
    iCanonLensID    = 0x14f+SubVersion_offset;
252
434
    iCanonMinFocal  = 0x151+SubVersion_offset;
253
434
    iCanonMaxFocal  = 0x153+SubVersion_offset;
254
434
    break;
255
256
1.40k
  case CanonID_EOS_1D_X:
257
1.40k
    if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x271))
258
78
      SubVersion = 1;
259
1.33k
    else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x279))
260
222
      SubVersion = 2;
261
1.10k
    else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x280))
262
225
      SubVersion = 3;
263
884
    else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x285))
264
287
      SubVersion = 4;
265
// printf ("==>> CanonID_EOS_1D_X, SubVersion: %d\n", SubVersion);
266
267
1.40k
    if (SubVersion < 3)
268
897
      SubVersion_offset += -3;
269
270
1.40k
    iCanonCurFocal  =  0x23+SubVersion_offset;
271
1.40k
    iMakernotesFlip =  0x7d+SubVersion_offset;
272
273
1.40k
    if (SubVersion < 3)
274
897
      SubVersion_offset += -4;
275
512
    else if (SubVersion == 4)
276
287
      SubVersion_offset += 5;
277
278
1.40k
    iCanonLensID    = 0x1a7+SubVersion_offset;
279
1.40k
    iCanonMinFocal  = 0x1a9+SubVersion_offset;
280
1.40k
    iCanonMaxFocal  = 0x1ab+SubVersion_offset;
281
1.40k
    break;
282
283
594
  case CanonID_EOS_5D:
284
594
    iMakernotesFlip =  0x27;
285
594
    iCanonCurFocal  =  0x28;
286
594
    iCanonLensID    =  0x0c;
287
594
    if (!sget2Rev(CameraInfo + iCanonLensID))
288
254
      iCanonLensID  =  0x97;
289
594
    iCanonMinFocal  =  0x93;
290
594
    iCanonMaxFocal  =  0x95;
291
594
    break;
292
293
1.05k
  case CanonID_EOS_5D_Mark_II:
294
1.05k
    iHTP            =  0x07;
295
1.05k
    iCanonCurFocal  =  0x1e;
296
1.05k
    iMakernotesFlip =  0x31;
297
1.05k
    iALO            =  0xbf;
298
1.05k
    iCanonLensID    =  0xe6;
299
1.05k
    iCanonMinFocal  =  0xe8;
300
1.05k
    iCanonMaxFocal  =  0xea;
301
1.05k
    break;
302
303
1.60k
  case CanonID_EOS_5D_Mark_III:
304
1.60k
    if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x22c))
305
76
      SubVersion = 1;
306
1.52k
    else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x22d))
307
520
      SubVersion = 2;
308
1.00k
    else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x23c))
309
78
      SubVersion = 3;
310
929
    else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x242))
311
79
      SubVersion = 4;
312
850
    else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x247))
313
85
      SubVersion = 5;
314
// printf ("==>> CanonID_EOS_5D_Mark_III, SubVersion: %d\n", SubVersion);
315
316
1.60k
    if (!SubVersion)
317
765
      break;
318
838
    else if (SubVersion < 3)
319
596
      SubVersion_offset += -1;
320
321
838
    iCanonCurFocal  =  0x23+SubVersion_offset;
322
323
838
    if (SubVersion == 1)
324
76
      SubVersion_offset += -3;
325
762
    else if (SubVersion == 2)
326
520
      SubVersion_offset += -2;
327
242
    else if (SubVersion >= 4)
328
164
      SubVersion_offset += 6;
329
330
838
    iMakernotesFlip =  0x7d+SubVersion_offset;
331
332
838
    if (SubVersion < 3)
333
596
      SubVersion_offset += -4;
334
242
    else if (SubVersion > 4)
335
85
      SubVersion_offset += 5;
336
337
838
    iCanonLensID    = 0x153+SubVersion_offset;
338
838
    iCanonMinFocal  = 0x155+SubVersion_offset;
339
838
    iCanonMaxFocal  = 0x157+SubVersion_offset;
340
838
    break;
341
342
1.01k
  case CanonID_EOS_6D:
343
1.01k
    iCanonCurFocal  =  0x23;
344
1.01k
    iMakernotesFlip =  0x83;
345
1.01k
    iCanonLensID    = 0x161;
346
1.01k
    iCanonMinFocal  = 0x163;
347
1.01k
    iCanonMaxFocal  = 0x165;
348
1.01k
    break;
349
350
1.14k
  case CanonID_EOS_7D:
351
1.14k
    if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x1a8))
352
80
      SubVersion = 1;
353
1.06k
    else if (CanonCameraInfo_checkFirmwareRecordLocation(CameraInfo + 0x1ac))
354
80
      SubVersion = 2;
355
// printf ("==>> CanonID_EOS_7D, SubVersion: %d\n", SubVersion);
356
1.14k
    iHTP            =  0x07;
357
1.14k
    iCanonCurFocal  =  0x1e;
358
359
1.14k
    if (!SubVersion)
360
981
      break;
361
160
    else if (SubVersion < 2)
362
80
      SubVersion_offset += -4;
363
364
160
    iMakernotesFlip =  0x35+SubVersion_offset;
365
160
    iCanonLensID    = 0x112+SubVersion_offset;
366
160
    iCanonMinFocal  = 0x114+SubVersion_offset;
367
160
    iCanonMaxFocal  = 0x116+SubVersion_offset;
368
160
    break;
369
370
314
  case CanonID_EOS_40D:
371
314
    iCanonCurFocal  =  0x1d;
372
314
    iMakernotesFlip =  0x30;
373
314
    iCanonLensID    =  0xd6;
374
314
    iCanonMinFocal  =  0xd8;
375
314
    iCanonMaxFocal  =  0xda;
376
314
    iCanonLens      = 0x92b;
377
314
    break;
378
379
298
  case CanonID_EOS_50D:
380
298
    iHTP            =  0x07;
381
298
    iCanonCurFocal  =  0x1e;
382
298
    iMakernotesFlip =  0x31;
383
298
    iALO            =  0xbf;
384
298
    iCanonLensID    =  0xea;
385
298
    iCanonMinFocal  =  0xec;
386
298
    iCanonMaxFocal  =  0xee;
387
298
    break;
388
389
246
  case CanonID_EOS_60D:
390
566
  case CanonID_EOS_1200D:
391
566
    iCanonCurFocal  =  0x1e;
392
566
    if (id == CanonID_EOS_60D)
393
246
      iMakernotesFlip =  0x36;
394
320
    else
395
320
      iMakernotesFlip =  0x3a;
396
566
    iCanonLensID    =  0xe8;
397
566
    iCanonMinFocal  =  0xea;
398
566
    iCanonMaxFocal  =  0xec;
399
566
    break;
400
401
280
  case CanonID_EOS_70D:
402
280
    iCanonCurFocal  =  0x23;
403
280
    iMakernotesFlip =  0x84;
404
280
    iCanonLensID    = 0x166;
405
280
    iCanonMinFocal  = 0x168;
406
280
    iCanonMaxFocal  = 0x16a;
407
280
    break;
408
409
235
  case CanonID_EOS_80D:
410
235
    iCanonCurFocal  =  0x23;
411
235
    iMakernotesFlip =  0x96;
412
235
    iCanonLensID    = 0x189;
413
235
    iCanonMinFocal  = 0x18b;
414
235
    iCanonMaxFocal  = 0x18d;
415
235
    break;
416
417
172
  case CanonID_EOS_450D:
418
172
    iCanonCurFocal  =  0x1d;
419
172
    iMakernotesFlip =  0x30;
420
172
    iCanonLensID    =  0xde;
421
172
    iCanonLens      = 0x933;
422
172
    break;
423
424
437
  case CanonID_EOS_500D:
425
437
    iHTP            =  0x07;
426
437
    iCanonCurFocal  =  0x1e;
427
437
    iMakernotesFlip =  0x31;
428
437
    iALO            =  0xbe;
429
437
    iCanonLensID    =  0xf6;
430
437
    iCanonMinFocal  =  0xf8;
431
437
    iCanonMaxFocal  =  0xfa;
432
437
    break;
433
434
236
  case CanonID_EOS_550D:
435
236
    iHTP            =  0x07;
436
236
    iCanonCurFocal  =  0x1e;
437
236
    iMakernotesFlip =  0x35;
438
236
    iCanonLensID    =  0xff;
439
236
    iCanonMinFocal  = 0x101;
440
236
    iCanonMaxFocal  = 0x103;
441
236
    break;
442
443
279
  case CanonID_EOS_600D:
444
796
  case CanonID_EOS_1100D:
445
796
    iHTP            =  0x07;
446
796
    iCanonCurFocal  =  0x1e;
447
796
    iMakernotesFlip =  0x38;
448
796
    iCanonLensID    =  0xea;
449
796
    iCanonMinFocal  =  0xec;
450
796
    iCanonMaxFocal  =  0xee;
451
796
    break;
452
453
638
  case CanonID_EOS_650D:
454
879
  case CanonID_EOS_700D:
455
879
    iCanonCurFocal  =  0x23;
456
879
    iMakernotesFlip =  0x7d;
457
879
    iCanonLensID    = 0x127;
458
879
    iCanonMinFocal  = 0x129;
459
879
    iCanonMaxFocal  = 0x12b;
460
879
    break;
461
462
77
  case CanonID_EOS_750D:
463
451
  case CanonID_EOS_760D:
464
451
    iCanonCurFocal  =  0x23;
465
451
    iMakernotesFlip =  0x96;
466
451
    iCanonLensID    = 0x184;
467
451
    iCanonMinFocal  = 0x186;
468
451
    iCanonMaxFocal  = 0x188;
469
451
    break;
470
471
384
  case CanonID_EOS_1000D:
472
384
    iCanonCurFocal  =  0x1d;
473
384
    iMakernotesFlip =  0x30;
474
384
    iCanonLensID    =  0xe2;
475
384
    iCanonMinFocal  =  0xe4;
476
384
    iCanonMaxFocal  =  0xe6;
477
384
    iCanonLens      = 0x937;
478
384
    break;
479
19.2k
  }
480
481
19.2k
  if (iMakernotesFlip && (CameraInfo[iMakernotesFlip] < 3)) {
482
6.74k
    imCanon.MakernotesFlip = "065"[CameraInfo[iMakernotesFlip]] - '0';
483
// printf ("==>> iMakernotesFlip: 0x%x, flip: %d\n", iMakernotesFlip, imCanon.MakernotesFlip);
484
12.4k
  } else if (tagtypeIs(LIBRAW_EXIFTAG_TYPE_UNDEFINED) &&
485
12.4k
     (mgck == 0xaaaa) && (dng_writer == nonDNG)) { // CameraOrientation
486
414
    int c, i;
487
383k
    for (i = 2; (sget2(CameraInfo+i) != 0xbbbb) && i < (int)maxlen; i++);
488
414
    i+=2;
489
80.3k
    while (i < int(maxlen - 5))
490
80.0k
      if ((sget4(CameraInfo+i) == 257) && ((c = CameraInfo[i+8]) < 3)) {
491
42
        imCanon.MakernotesFlip = "065"[c] - '0';
492
// printf ("==>> MakernotesFlip offset: 0x%x, flip: %d\n", i+8, imCanon.MakernotesFlip);
493
42
        break;
494
79.9k
      } else i+=4;
495
414
  }
496
497
19.2k
  if (iHTP)
498
4.91k
  {
499
4.91k
    imCanon.HighlightTonePriority = CameraInfo[iHTP];
500
4.91k
    if ((imCanon.HighlightTonePriority > 5) ||
501
4.91k
        (imCanon.HighlightTonePriority < 0))
502
1.56k
      imCanon.HighlightTonePriority = 0;
503
4.91k
    if (imCanon.HighlightTonePriority) {
504
949
      imCommon.ExposureCalibrationShift -= float(imCanon.HighlightTonePriority);
505
949
    }
506
4.91k
  }
507
19.2k
  if (iALO)
508
1.78k
  {
509
1.78k
    imCanon.AutoLightingOptimizer = CameraInfo[iALO];
510
1.78k
    if ((imCanon.AutoLightingOptimizer > 3) ||
511
1.78k
        (imCanon.AutoLightingOptimizer < 0))
512
444
      imCanon.AutoLightingOptimizer = 3;
513
1.78k
  }
514
19.2k
  if (iCanonFocalType)
515
878
  {
516
878
    if (iCanonFocalType >= maxlen)
517
140
      return; // broken;
518
738
    ilm.FocalType = CameraInfo[iCanonFocalType];
519
738
    if (!ilm.FocalType) // zero means 'prime' here, replacing with standard '1'
520
494
      ilm.FocalType = LIBRAW_FT_PRIME_LENS;
521
738
  }
522
19.0k
  if (!ilm.CurFocal && iCanonCurFocal)
523
4.61k
  {
524
4.61k
    if (iCanonCurFocal >= maxlen)
525
560
      return; // broken;
526
4.05k
    ilm.CurFocal = sget2Rev(CameraInfo + iCanonCurFocal);
527
4.05k
  }
528
18.5k
  if (!ilm.LensID && iCanonLensID)
529
1.65k
  {
530
1.65k
    if (iCanonLensID >= maxlen)
531
342
      return; // broken;
532
1.31k
    ilm.LensID = sget2Rev(CameraInfo + iCanonLensID);
533
1.31k
  }
534
18.1k
  if (!ilm.MinFocal && iCanonMinFocal)
535
4.19k
  {
536
4.19k
    if (iCanonMinFocal >= maxlen)
537
1.39k
      return; // broken;
538
2.80k
    ilm.MinFocal = sget2Rev(CameraInfo + iCanonMinFocal);
539
2.80k
  }
540
16.8k
  if (!ilm.MaxFocal && iCanonMaxFocal)
541
3.52k
  {
542
3.52k
    if (iCanonMaxFocal >= maxlen)
543
456
      return; // broken;
544
3.07k
    ilm.MaxFocal = sget2Rev(CameraInfo + iCanonMaxFocal);
545
3.07k
  }
546
16.3k
  if (!ilm.Lens[0] && iCanonLens)
547
454
  {
548
454
    if (iCanonLens + 64 >= (int)maxlen) // broken;
549
88
      return;
550
551
366
    char *pl = (char *)CameraInfo + iCanonLens;
552
366
    if (!strncmp(pl, "EF-S", 4))
553
1
    {
554
1
      memcpy(ilm.Lens, pl, 4);
555
1
      ilm.Lens[4] = ' ';
556
1
      memcpy(ilm.LensFeatures_pre, pl, 4);
557
1
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF_S;
558
1
      ilm.LensFormat = LIBRAW_FORMAT_APSC;
559
1
      memcpy(ilm.Lens + 5, pl + 4, 60);
560
1
    }
561
365
    else if (!strncmp(pl, "EF-M", 4))
562
0
    {
563
0
      memcpy(ilm.Lens, pl, 4);
564
0
      ilm.Lens[4] = ' ';
565
0
      memcpy(ilm.LensFeatures_pre, pl, 4);
566
0
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF_M;
567
0
      ilm.LensFormat = LIBRAW_FORMAT_APSC;
568
0
      memcpy(ilm.Lens + 5, pl + 4, 60);
569
0
    }
570
365
    else if (!strncmp(pl, "EF", 2))
571
1
    {
572
1
      memcpy(ilm.Lens, pl, 2);
573
1
      ilm.Lens[2] = ' ';
574
1
      memcpy(ilm.LensFeatures_pre, pl, 2);
575
1
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
576
1
      ilm.LensFormat = LIBRAW_FORMAT_FF;
577
1
      memcpy(ilm.Lens + 3, pl + 2, 62);
578
1
    }
579
364
    else if (!strncmp(ilm.Lens, "CN-E", 4))
580
0
    {
581
0
      memmove(ilm.Lens + 5, ilm.Lens + 4, 60);
582
0
      ilm.Lens[4] = ' ';
583
0
      memcpy(ilm.LensFeatures_pre, ilm.Lens, 4);
584
0
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
585
0
      ilm.LensFormat = LIBRAW_FORMAT_FF;
586
0
    }
587
364
    else if (!strncmp(pl, "TS-E", 4))
588
1
    {
589
1
      memcpy(ilm.Lens, pl, 4);
590
1
      ilm.Lens[4] = ' ';
591
1
      memcpy(ilm.LensFeatures_pre, pl, 4);
592
1
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
593
1
      ilm.LensFormat = LIBRAW_FORMAT_FF;
594
1
      memcpy(ilm.Lens + 5, pl + 4, 60);
595
1
    }
596
363
    else if (!strncmp(pl, "MP-E", 4))
597
0
    {
598
0
      memcpy(ilm.Lens, pl, 4);
599
0
      ilm.Lens[4] = ' ';
600
0
      memcpy(ilm.LensFeatures_pre, pl, 4);
601
0
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
602
0
      ilm.LensFormat = LIBRAW_FORMAT_FF;
603
0
      memcpy(ilm.Lens + 5, pl + 4, 60);
604
0
    }
605
363
    else // non-Canon lens
606
363
      memcpy(ilm.Lens, pl, 64);
607
366
  }
608
16.2k
  return;
609
16.3k
}
610
611
void LibRaw::Canon_CameraSettings(unsigned len)
612
73.2k
{
613
73.2k
  fseek(ifp, 6, SEEK_CUR);
614
73.2k
  imCanon.Quality = get2();   // 3
615
73.2k
  get2();
616
73.2k
  imgdata.shootinginfo.DriveMode = get2(); // 5
617
73.2k
  get2();
618
73.2k
  imgdata.shootinginfo.FocusMode = get2(); // 7
619
73.2k
  imCanon.RecordMode = (get2(), get2());   // 9, format
620
73.2k
  fseek(ifp, 14, SEEK_CUR);
621
73.2k
  imgdata.shootinginfo.MeteringMode = get2(); // 17
622
73.2k
  get2();
623
73.2k
  imgdata.shootinginfo.AFPoint = get2();      // 19
624
73.2k
  imgdata.shootinginfo.ExposureMode = get2(); // 20
625
73.2k
  get2();
626
73.2k
  ilm.LensID = get2();          // 22
627
73.2k
  ilm.MaxFocal = get2();        // 23
628
73.2k
  ilm.MinFocal = get2();        // 24
629
73.2k
  ilm.FocalUnits = get2();      // 25
630
73.2k
  if (ilm.FocalUnits > 1)
631
64.6k
  {
632
64.6k
    ilm.MaxFocal /= (float)ilm.FocalUnits;
633
64.6k
    ilm.MinFocal /= (float)ilm.FocalUnits;
634
64.6k
  }
635
73.2k
  ilm.MaxAp = _CanonConvertAperture(get2()); // 26
636
73.2k
  ilm.MinAp = _CanonConvertAperture(get2()); // 27
637
73.2k
  if (len >= 36)
638
32.6k
  {
639
32.6k
    fseek(ifp, 12, SEEK_CUR);
640
32.6k
    imgdata.shootinginfo.ImageStabilization = get2(); // 34
641
32.6k
  }
642
40.6k
  else
643
40.6k
    return;
644
32.6k
  if (len >= 48)
645
31.5k
  {
646
31.5k
    fseek(ifp, 22, SEEK_CUR);
647
31.5k
    imCanon.SRAWQuality = get2(); // 46
648
31.5k
  }
649
32.6k
}
650
651
void LibRaw::Canon_WBpresets(int skip1, int skip2)
652
26.2k
{
653
26.2k
  int c;
654
104k
  FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Daylight][RGGB_2_RGBG(c)] = get2();
655
656
26.2k
  if (skip1)
657
17.7k
    fseek(ifp, skip1, SEEK_CUR);
658
104k
  FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Shade][RGGB_2_RGBG(c)] = get2();
659
660
26.2k
  if (skip1)
661
17.7k
    fseek(ifp, skip1, SEEK_CUR);
662
104k
  FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Cloudy][RGGB_2_RGBG(c)] = get2();
663
664
26.2k
  if (skip1)
665
17.7k
    fseek(ifp, skip1, SEEK_CUR);
666
104k
  FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Tungsten][RGGB_2_RGBG(c)] = get2();
667
668
26.2k
  if (skip1)
669
17.7k
    fseek(ifp, skip1, SEEK_CUR);
670
104k
  FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_FL_W][RGGB_2_RGBG(c)] = get2();
671
672
26.2k
  if (skip2)
673
17.7k
    fseek(ifp, skip2, SEEK_CUR);
674
104k
  FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Flash][RGGB_2_RGBG(c)] = get2();
675
676
26.2k
  return;
677
26.2k
}
678
679
void LibRaw::Canon_WBCTpresets(short WBCTversion)
680
17.7k
{
681
682
17.7k
  int i;
683
17.7k
  float norm;
684
685
17.7k
  if (WBCTversion == 0)
686
15.5k
  { // tint, as shot R, as shot B, CСT
687
249k
    for (i = 0; i < 15; i++)
688
233k
    {
689
233k
      icWBCCTC[i][2] = icWBCCTC[i][4] = 1.0f;
690
233k
      fseek(ifp, 2, SEEK_CUR);
691
233k
      icWBCCTC[i][1] = 1024.0f / fMAX(get2(), 1.f);
692
233k
      icWBCCTC[i][3] = 1024.0f / fMAX(get2(), 1.f);
693
233k
      icWBCCTC[i][0] = get2();
694
233k
    }
695
15.5k
  }
696
2.20k
  else if (WBCTversion == 1)
697
1.81k
  { // as shot R, as shot B, tint, CСT
698
29.0k
    for (i = 0; i < 15; i++)
699
27.2k
    {
700
27.2k
      icWBCCTC[i][2] = icWBCCTC[i][4] = 1.0f;
701
27.2k
      icWBCCTC[i][1] = 1024.0f / fMAX(get2(), 1.f);
702
27.2k
      icWBCCTC[i][3] = 1024.0f / fMAX(get2(), 1.f);
703
27.2k
      fseek(ifp, 2, SEEK_CUR);
704
27.2k
      icWBCCTC[i][0] = get2();
705
27.2k
    }
706
1.81k
  }
707
390
  else if (WBCTversion == 2)
708
390
  { // tint, offset, as shot R, as shot B, CСT
709
390
    if ((unique_id == CanonID_EOS_M3)  ||
710
390
        (unique_id == CanonID_EOS_M10) ||
711
390
        (imCanon.ColorDataSubVer == 0xfffc))
712
273
    {
713
4.36k
      for (i = 0; i < 15; i++)
714
4.09k
      {
715
4.09k
        fseek(ifp, 4, SEEK_CUR);
716
4.09k
        icWBCCTC[i][2] = icWBCCTC[i][4] =
717
4.09k
            1.0f;
718
4.09k
        icWBCCTC[i][1] = 1024.0f / fMAX(1.f, get2());
719
4.09k
        icWBCCTC[i][3] = 1024.0f / fMAX(1.f, get2());
720
4.09k
        icWBCCTC[i][0] = get2();
721
4.09k
      }
722
273
    }
723
117
    else if (imCanon.ColorDataSubVer == 0xfffd)
724
117
    {
725
1.87k
      for (i = 0; i < 15; i++)
726
1.75k
      {
727
1.75k
        fseek(ifp, 2, SEEK_CUR);
728
1.75k
        norm = (signed short)get2();
729
1.75k
        norm = 512.0f + norm / 8.0f;
730
1.75k
        icWBCCTC[i][2] = icWBCCTC[i][4] =
731
1.75k
            1.0f;
732
1.75k
        icWBCCTC[i][1] = (float)get2();
733
1.75k
        if (norm > 0.001f)
734
1.40k
          icWBCCTC[i][1] /= norm;
735
1.75k
        icWBCCTC[i][3] = (float)get2();
736
1.75k
        if (norm > 0.001f)
737
1.40k
          icWBCCTC[i][3] /= norm;
738
1.75k
        icWBCCTC[i][0] = get2();
739
1.75k
      }
740
117
    }
741
390
  }
742
17.7k
  return;
743
17.7k
}
744
745
void LibRaw::parseCanonMakernotes(unsigned tag, unsigned /*type*/, unsigned len, unsigned dng_writer)
746
2.98M
{
747
748
2.98M
#define AsShot_Auto_MeasuredWB(offset)                       \
749
2.98M
  imCanon.ColorDataSubVer = get2();                          \
750
15.5k
  fseek(ifp, save1 + (offset << 1), SEEK_SET);               \
751
62.3k
  FORC4 cam_mul[RGGB_2_RGBG(c)] = (float)get2();             \
752
15.5k
  get2();                                                    \
753
62.3k
  FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2();     \
754
15.5k
  get2();                                                    \
755
62.3k
  FORC4 icWBC[LIBRAW_WBI_Measured][RGGB_2_RGBG(c)] = get2();
756
757
2.98M
#define sRAW_WB(offset)                                      \
758
2.98M
  fseek(ifp, save1 + (offset << 1), SEEK_SET);               \
759
42.9k
  FORC4 {                                                    \
760
42.9k
    sraw_mul[RGGB_2_RGBG(c)] = get2();                       \
761
42.9k
    if ((float)sraw_mul[RGGB_2_RGBG(c)] > sraw_mul_max) {    \
762
16.9k
      sraw_mul_max = (float)sraw_mul[RGGB_2_RGBG(c)];        \
763
16.9k
    }                                                        \
764
42.9k
  }                                                          \
765
10.7k
  sraw_mul_max /= 1024.f;                                    \
766
42.9k
  FORC4 sraw_mul[c] = (ushort)((float)sraw_mul[c] * sraw_mul_max);
767
768
2.98M
#define CR3_ColorData(offset)                                \
769
2.98M
  fseek(ifp, save1 + ((offset+0x0041) << 1), SEEK_SET);      \
770
4.40k
  Canon_WBpresets(2, 12);                                    \
771
4.40k
  fseek(ifp, save1 + ((offset+0x00c3) << 1), SEEK_SET);      \
772
4.40k
  Canon_WBCTpresets(0);                                      \
773
4.40k
  offsetChannelBlackLevel2 = save1 + ((offset+0x0102) << 1); \
774
4.40k
  offsetChannelBlackLevel  = save1 + ((offset+0x02d1) << 1); \
775
4.40k
  offsetWhiteLevels        = save1 + ((offset+0x02d5) << 1);
776
777
2.98M
  int c;
778
2.98M
  unsigned i;
779
780
2.98M
  if (tag == 0x0001) {
781
71.2k
    Canon_CameraSettings(len);
782
783
2.91M
  } else if (tag == 0x0002) { // focal length
784
12.3k
    ilm.FocalType = get2();
785
12.3k
    ilm.CurFocal = get2();
786
12.3k
    if (ilm.FocalUnits > 1) {
787
8.56k
      ilm.CurFocal /= (float)ilm.FocalUnits;
788
8.56k
    }
789
790
2.90M
  } else if (tag == 0x0004) { // subdir, ShotInfo
791
38.6k
    short tempAp;
792
38.6k
    if (dng_writer == nonDNG) {
793
38.1k
      get2();
794
38.1k
      imCanon.ISOgain[0] = get2();
795
38.1k
      imCanon.ISOgain[1] = get2();
796
38.1k
      if (imCanon.ISOgain[1] != 0x7fff) {
797
37.8k
        imCommon.real_ISO = floorf(100.f * libraw_powf64l(2.f, float(imCanon.ISOgain[0]+imCanon.ISOgain[1]) / 32.f - 5.f));
798
37.8k
        if (!iso_speed || (iso_speed == 65535))
799
11.7k
          iso_speed = imCommon.real_ISO;
800
37.8k
      }
801
38.1k
      get4();
802
38.1k
      if (((i = get2()) != 0xffff) && !shutter) {
803
6.51k
        shutter = libraw_powf64l(2.f, float((short)i) / -32.0f);
804
6.51k
      }
805
38.1k
      imCanon.wbi = (get2(), get2());
806
38.1k
      shot_order = (get2(), get2());
807
38.1k
      fseek(ifp, 4, SEEK_CUR);
808
38.1k
    } else
809
434
      fseek(ifp, 24, SEEK_CUR);
810
38.6k
    tempAp = get2();
811
38.6k
    if (tempAp != 0)
812
31.8k
      imCommon.CameraTemperature = (float)(tempAp - 128);
813
38.6k
    tempAp = get2();
814
38.6k
    if (tempAp != -1)
815
23.2k
      imCommon.FlashGN = ((float)tempAp) / 32;
816
38.6k
    get2();
817
818
38.6k
    imCommon.FlashEC = _CanonConvertEV((signed short)get2());
819
38.6k
    fseek(ifp, 8 - 32, SEEK_CUR);
820
38.6k
    if ((tempAp = get2()) != 0x7fff)
821
38.3k
      ilm.CurAp = _CanonConvertAperture(tempAp);
822
38.6k
    if (ilm.CurAp < 0.7f) {
823
20.0k
      fseek(ifp, 32, SEEK_CUR);
824
20.0k
      ilm.CurAp = _CanonConvertAperture(get2());
825
20.0k
    }
826
38.6k
    if (!aperture)
827
5.06k
      aperture = ilm.CurAp;
828
829
2.86M
  } else if ((tag == 0x0007) && (dng_writer == nonDNG)) {
830
5.42k
    fgets(model2, 64, ifp);
831
832
2.85M
  } else if ((tag == 0x0008) && (dng_writer == nonDNG)) {
833
12.2k
    shot_order = get4();
834
835
2.84M
  } else if ((tag == 0x0009)  && (dng_writer == nonDNG)) {
836
5.91k
    fread(artist, 64, 1, ifp);
837
838
2.83M
  } else if (tag == 0x000c) {
839
6.54k
    unsigned tS = get4();
840
6.54k
    sprintf(imgdata.shootinginfo.BodySerial, "%d", tS);
841
842
2.83M
  } else if ((tag == 0x0012) ||
843
2.83M
             (tag == 0x0026) ||
844
2.83M
             (tag == 0x003c)) {
845
8.78k
    if (!imCommon.afcount) {
846
339
      imCommon.afdata[imCommon.afcount].AFInfoData_tag = tag;
847
339
      imCommon.afdata[imCommon.afcount].AFInfoData_order = order;
848
339
      imCommon.afdata[imCommon.afcount].AFInfoData_length = len;
849
339
      imCommon.afdata[imCommon.afcount].AFInfoData = (uchar *)calloc(imCommon.afdata[imCommon.afcount].AFInfoData_length,1);
850
339
      fread(imCommon.afdata[imCommon.afcount].AFInfoData, imCommon.afdata[imCommon.afcount].AFInfoData_length, 1, ifp);
851
339
      imCommon.afcount = 1;
852
339
    }
853
854
2.82M
  } else if ((tag == 0x0029) && (dng_writer == nonDNG)) { // PowerShot G9
855
20.4k
    int Got_AsShotWB = 0;
856
20.4k
    fseek(ifp, 8, SEEK_CUR);
857
225k
    for (unsigned linenum = 0; linenum < Canon_G9_linenums_2_StdWBi.size(); linenum++) {
858
204k
      if (Canon_G9_linenums_2_StdWBi[linenum] != LIBRAW_WBI_Unknown ) {
859
818k
        FORC4 icWBC[Canon_G9_linenums_2_StdWBi[linenum]][GRBG_2_RGBG(c)] = get4();
860
204k
        if (Canon_wbi2std[imCanon.wbi] == Canon_G9_linenums_2_StdWBi[linenum]) {
861
81.2k
          FORC4 cam_mul[c] = float(icWBC[Canon_G9_linenums_2_StdWBi[linenum]][c]);
862
20.3k
          Got_AsShotWB = 1;
863
20.3k
        }
864
204k
      }
865
204k
      fseek(ifp, 16, SEEK_CUR);
866
204k
    }
867
20.4k
    if (!Got_AsShotWB)
868
644
      FORC4 cam_mul[c] = float(icWBC[LIBRAW_WBI_Auto][c]);
869
870
2.80M
  } else if ((tag == 0x0081) && (dng_writer == nonDNG)) { // -1D, -1Ds
871
2.22k
    data_offset = get4();
872
2.22k
    fseek(ifp, data_offset + 41, SEEK_SET);
873
2.22k
    raw_height = get2() * 2;
874
2.22k
    raw_width = get2();
875
2.22k
    filters = 0x61616161;
876
877
2.80M
  } else if (tag == 0x0093) {
878
4.84k
    if (!imCanon.RF_lensID) {
879
750
      fseek(ifp, 0x03d<<1, SEEK_CUR);
880
750
      imCanon.RF_lensID = get2();
881
750
    }
882
883
2.79M
  } else if (tag == 0x0095 && !ilm.Lens[0])
884
1.25k
  { // lens model tag
885
1.25k
    fread(ilm.Lens, 64, 1, ifp);
886
1.25k
    if (!strncmp(ilm.Lens, "EF-S", 4))
887
1
    {
888
1
      memmove(ilm.Lens + 5, ilm.Lens + 4, 60);
889
1
      ilm.Lens[4] = ' ';
890
1
      memcpy(ilm.LensFeatures_pre, ilm.Lens, 4);
891
1
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF_S;
892
1
      ilm.LensFormat = LIBRAW_FORMAT_APSC;
893
1
    }
894
1.25k
    else if (!strncmp(ilm.Lens, "EF-M", 4))
895
1
    {
896
1
      memmove(ilm.Lens + 5, ilm.Lens + 4, 60);
897
1
      ilm.Lens[4] = ' ';
898
1
      memcpy(ilm.LensFeatures_pre, ilm.Lens, 4);
899
1
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF_M;
900
1
      ilm.LensFormat = LIBRAW_FORMAT_APSC;
901
1
    }
902
1.25k
    else if (!strncmp(ilm.Lens, "EF", 2))
903
2
    {
904
2
      memmove(ilm.Lens + 3, ilm.Lens + 2, 62);
905
2
      ilm.Lens[2] = ' ';
906
2
      memcpy(ilm.LensFeatures_pre, ilm.Lens, 2);
907
2
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
908
2
      ilm.LensFormat = LIBRAW_FORMAT_FF;
909
2
    }
910
1.25k
    else if (!strncmp(ilm.Lens, "CN-E", 4))
911
1
    {
912
1
      memmove(ilm.Lens + 5, ilm.Lens + 4, 60);
913
1
      ilm.Lens[4] = ' ';
914
1
      memcpy(ilm.LensFeatures_pre, ilm.Lens, 4);
915
1
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
916
1
      ilm.LensFormat = LIBRAW_FORMAT_FF;
917
1
    }
918
1.25k
    else if (!strncmp(ilm.Lens, "TS-E", 4))
919
5
    {
920
5
      memmove(ilm.Lens + 5, ilm.Lens + 4, 60);
921
5
      ilm.Lens[4] = ' ';
922
5
      memcpy(ilm.LensFeatures_pre, ilm.Lens, 4);
923
5
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
924
5
      ilm.LensFormat = LIBRAW_FORMAT_FF;
925
5
    }
926
1.24k
    else if (!strncmp(ilm.Lens, "MP-E", 4))
927
0
    {
928
0
      memmove(ilm.Lens + 5, ilm.Lens + 4, 60);
929
0
      ilm.Lens[4] = ' ';
930
0
      memcpy(ilm.LensFeatures_pre, ilm.Lens, 4);
931
0
      ilm.LensMount = LIBRAW_MOUNT_Canon_EF;
932
0
      ilm.LensFormat = LIBRAW_FORMAT_FF;
933
0
    }
934
935
1.24k
    else if (!strncmp(ilm.Lens, "RF-S", 4))
936
1
    {
937
1
      memmove(ilm.Lens + 5, ilm.Lens + 4, 62);
938
1
      ilm.Lens[4] = ' ';
939
1
      memcpy(ilm.LensFeatures_pre, ilm.Lens, 4);
940
1
      ilm.LensMount = LIBRAW_MOUNT_Canon_RF;
941
1
      ilm.LensFormat = LIBRAW_FORMAT_APSC;
942
1
    }
943
944
1.24k
    else if (!strncmp(ilm.Lens, "RF", 2))
945
2
    {
946
2
      memmove(ilm.Lens + 3, ilm.Lens + 2, 62);
947
2
      ilm.Lens[2] = ' ';
948
2
      memcpy(ilm.LensFeatures_pre, ilm.Lens, 2);
949
2
      ilm.LensMount = LIBRAW_MOUNT_Canon_RF;
950
2
      ilm.LensFormat = LIBRAW_FORMAT_FF;
951
2
    }
952
1.25k
  }
953
2.79M
  else if (tag == 0x009a)
954
4.18k
  { // AspectInfo
955
4.18k
    i = get4();
956
4.18k
    switch (i)
957
4.18k
    {
958
400
    case 0:
959
923
    case 12: /* APS-H crop */
960
1.16k
    case 13: /* APS-C crop */
961
1.16k
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_3to2;
962
1.16k
      break;
963
317
    case 1:
964
317
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_1to1;
965
317
      break;
966
307
    case 2:
967
589
    case 0x102:
968
589
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_4to3;
969
589
      break;
970
424
    case 7:
971
424
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_16to9;
972
424
      break;
973
686
    case 8:
974
686
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_5to4;
975
686
      break;
976
1.00k
    default:
977
1.00k
      imgdata.sizes.raw_aspect = LIBRAW_IMAGE_ASPECT_OTHER;
978
1.00k
      break;
979
4.18k
    }
980
4.18k
    imgdata.sizes.raw_inset_crops[0].cwidth = get4();
981
4.18k
    imgdata.sizes.raw_inset_crops[0].cheight = get4();
982
4.18k
    imgdata.sizes.raw_inset_crops[0].cleft = get4();
983
4.18k
    imgdata.sizes.raw_inset_crops[0].ctop = get4();
984
985
2.79M
  } else if ((tag == 0x00a4) && (dng_writer == nonDNG)) { // -1D, -1Ds
986
554
    fseek(ifp, imCanon.wbi * 48, SEEK_CUR);
987
1.66k
    FORC3 cam_mul[c] = get2();
988
989
2.78M
  } else if (tag == 0x00a9) {
990
1.67k
    INT64 save1 = ftell(ifp);
991
1.67k
    fseek(ifp, (0x1 << 1), SEEK_CUR);
992
6.70k
    FORC4 imgdata.color.WB_Coeffs[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2();
993
1.67k
    Canon_WBpresets(0, 0);
994
1.67k
    fseek(ifp, save1, SEEK_SET);
995
1.67k
  }
996
2.78M
  else if (tag == 0x00b4)
997
2.68k
  {
998
2.68k
    switch (get2()) {
999
141
    case 1:
1000
141
      imCommon.ColorSpace = LIBRAW_COLORSPACE_sRGB;
1001
141
      break;
1002
463
    case 2:
1003
463
      imCommon.ColorSpace = LIBRAW_COLORSPACE_AdobeRGB;
1004
463
      break;
1005
2.07k
    default:
1006
2.07k
      imCommon.ColorSpace = LIBRAW_COLORSPACE_Unknown;
1007
2.07k
      break;
1008
2.68k
    }
1009
2.68k
  }
1010
2.78M
  else if (tag == 0x00e0) // SensorInfo
1011
2.28k
  {
1012
2.28k
    imCanon.SensorWidth  = (get2(), get2());
1013
2.28k
    imCanon.SensorHeight = get2();
1014
2.28k
    fseek(ifp, 4, SEEK_CUR);
1015
2.28k
    imCanon.DefaultCropAbsolute = get_CanonArea();
1016
2.28k
    imCanon.LeftOpticalBlack    = get_CanonArea();
1017
2.28k
  }
1018
2.78M
  else if (tag == 0x4001 && len > 500)
1019
19.7k
  {
1020
19.7k
    float sraw_mul_max = 0.f;
1021
19.7k
    int bls = 0;
1022
19.7k
    INT64 offsetChannelBlackLevel = 0L;
1023
19.7k
    INT64 offsetChannelBlackLevel2 = 0L;
1024
19.7k
    INT64 offsetWhiteLevels = 0L;
1025
19.7k
    INT64 save1 = ftell(ifp);
1026
1027
19.7k
    switch (len)
1028
19.7k
    {
1029
1030
1.32k
    case 582:
1031
1.32k
      imCanon.ColorDataVer = 1; // 20D, 350D
1032
1033
1.32k
      fseek(ifp, save1 + (0x0019 << 1), SEEK_SET);
1034
5.28k
      FORC4 cam_mul[RGGB_2_RGBG(c)] = (float)get2();
1035
1.32k
      fseek(ifp, save1 + (0x001e << 1), SEEK_SET);
1036
5.28k
      FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2();
1037
1.32k
      fseek(ifp, save1 + (0x0041 << 1), SEEK_SET);
1038
5.28k
      FORC4 icWBC[LIBRAW_WBI_Custom1][RGGB_2_RGBG(c)] = get2();
1039
1.32k
      fseek(ifp, save1 + (0x0046 << 1), SEEK_SET);
1040
5.28k
      FORC4 icWBC[LIBRAW_WBI_Custom2][RGGB_2_RGBG(c)] = get2();
1041
1042
1.32k
      fseek(ifp, save1 + (0x0023 << 1), SEEK_SET);
1043
1.32k
      Canon_WBpresets(2, 2);
1044
1.32k
      fseek(ifp, save1 + (0x004b << 1), SEEK_SET);
1045
1.32k
      Canon_WBCTpresets(1); // ABCT
1046
1.32k
      offsetChannelBlackLevel = save1 + (0x00a6 << 1);
1047
1.32k
      break;
1048
1049
494
    case 653:
1050
494
      imCanon.ColorDataVer = 2; // -1D Mark II, -1Ds Mark II
1051
1052
494
      fseek(ifp, save1 + (0x0018 << 1), SEEK_SET);
1053
1.97k
      FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2();
1054
494
      fseek(ifp, save1 + (0x0022 << 1), SEEK_SET);
1055
1.97k
      FORC4 cam_mul[RGGB_2_RGBG(c)] = (float)get2();
1056
494
      fseek(ifp, save1 + (0x0090 << 1), SEEK_SET);
1057
1.97k
      FORC4 icWBC[LIBRAW_WBI_Custom1][RGGB_2_RGBG(c)] = get2();
1058
494
      fseek(ifp, save1 + (0x0095 << 1), SEEK_SET);
1059
1.97k
      FORC4 icWBC[LIBRAW_WBI_Custom2][RGGB_2_RGBG(c)] = get2();
1060
494
      fseek(ifp, save1 + (0x009a << 1), SEEK_SET);
1061
1.97k
      FORC4 icWBC[LIBRAW_WBI_Custom3][RGGB_2_RGBG(c)] = get2();
1062
1063
494
      fseek(ifp, save1 + (0x0027 << 1), SEEK_SET);
1064
494
      Canon_WBpresets(2, 12);
1065
494
      fseek(ifp, save1 + (0x00a4 << 1), SEEK_SET);
1066
494
      Canon_WBCTpresets(1); // ABCT
1067
494
      offsetChannelBlackLevel = save1 + (0x011e << 1);
1068
494
      break;
1069
1070
332
    case 796:
1071
332
      imCanon.ColorDataVer = 3; // -1D Mark II N, 5D, 30D, 400D; ColorDataSubVer: 1
1072
332
      AsShot_Auto_MeasuredWB(0x003f);
1073
1074
332
      fseek(ifp, save1 + (0x0071 << 1), SEEK_SET);
1075
1.32k
      FORC4 icWBC[LIBRAW_WBI_Custom1][RGGB_2_RGBG(c)] = get2();
1076
332
      fseek(ifp, save1 + (0x0076 << 1), SEEK_SET);
1077
1.32k
      FORC4 icWBC[LIBRAW_WBI_Custom2][RGGB_2_RGBG(c)] = get2();
1078
332
      fseek(ifp, save1 + (0x007b << 1), SEEK_SET);
1079
1.32k
      FORC4 icWBC[LIBRAW_WBI_Custom3][RGGB_2_RGBG(c)] = get2();
1080
332
      fseek(ifp, save1 + (0x0080 << 1), SEEK_SET);
1081
1.32k
      FORC4 icWBC[LIBRAW_WBI_Custom][RGGB_2_RGBG(c)] = get2();
1082
1083
332
      fseek(ifp, save1 + (0x004e << 1), SEEK_SET);
1084
332
      Canon_WBpresets(2, 12);
1085
332
      fseek(ifp, save1 + (0x0085 << 1), SEEK_SET);
1086
332
      Canon_WBCTpresets(0); // BCAT
1087
332
      offsetChannelBlackLevel = save1 + (0x00c4 << 1);
1088
332
      break;
1089
1090
714
    case 674:  // -1D Mark III; ColorDataSubVer: 2
1091
1.03k
    case 692:  // 40D; ColorDataSubVer: 3
1092
1.33k
    case 702:  // -1Ds Mark III; ColorDataSubVer: 4
1093
1.68k
    case 1227: // 450D, 1000D; ColorDataSubVer: 5
1094
3.51k
    case 1250: // 5D Mark II, 50D; ColorDataSubVer: 6
1095
3.83k
    case 1251: // 500D; ColorDataSubVer: 7
1096
4.12k
    case 1337: // -1D Mark IV, 7D; ColorDataSubVer: 7
1097
4.61k
    case 1338: // 550D; ColorDataSubVer: 7
1098
5.09k
    case 1346: // 1100D, 60D; ColorDataSubVer: 9
1099
5.09k
      imCanon.ColorDataVer = 4;
1100
5.09k
      AsShot_Auto_MeasuredWB(0x003f);
1101
5.09k
      sRAW_WB(0x004e);
1102
5.09k
      fseek(ifp, save1 + (0x0053 << 1), SEEK_SET);
1103
5.09k
      Canon_WBpresets(2, 12);
1104
5.09k
      fseek(ifp, save1 + (0x00a8 << 1), SEEK_SET);
1105
5.09k
      Canon_WBCTpresets(0); // BCAT
1106
1107
5.09k
      if ((imCanon.ColorDataSubVer == 4) ||
1108
5.09k
          (imCanon.ColorDataSubVer == 5))
1109
364
      {
1110
364
        offsetChannelBlackLevel = save1 + (0x02b4 << 1);
1111
364
        offsetWhiteLevels = save1 + (0x02b8 << 1);
1112
364
      }
1113
4.73k
      else if ((imCanon.ColorDataSubVer == 6) ||
1114
4.73k
               (imCanon.ColorDataSubVer == 7))
1115
192
      {
1116
192
        offsetChannelBlackLevel = save1 + (0x02cb << 1);
1117
192
        offsetWhiteLevels = save1 + (0x02cf << 1);
1118
192
      }
1119
4.53k
      else if (imCanon.ColorDataSubVer == 9)
1120
131
      {
1121
131
        offsetChannelBlackLevel = save1 + (0x02cf << 1);
1122
131
        offsetWhiteLevels = save1 + (0x02d3 << 1);
1123
131
      }
1124
4.40k
      else
1125
4.40k
        offsetChannelBlackLevel = save1 + (0x00e7 << 1);
1126
5.09k
      break;
1127
1128
941
    case 5120: // G10, G11, G12, G15, G16
1129
               // G1 X, G1 X Mark II, G1 X Mark III
1130
               // G3 X, G5 X
1131
               // G7 X, G7 X Mark II
1132
               // G9 X, G9 X Mark II
1133
               // S90, S95, S100, S100V, S110, S120
1134
               // SX1 IS, SX50 HS, SX60 HS
1135
               // M3, M5, M6, M10, M100
1136
941
      imCanon.ColorDataVer = 5;
1137
941
      imCanon.ColorDataSubVer = get2();
1138
1139
941
      fseek(ifp, save1 + (0x0047 << 1), SEEK_SET);
1140
3.76k
      FORC4 cam_mul[RGGB_2_RGBG(c)] = (float)get2();
1141
1142
941
      if (imCanon.ColorDataSubVer == 0xfffc) // ColorDataSubVer: 65532 (-4)
1143
                                             // G7 X Mark II, G9 X Mark II, G1 X Mark III
1144
                                             // M5, M100, M6
1145
273
      {
1146
273
        fseek(ifp, save1 + (0x004f << 1), SEEK_SET);
1147
1.09k
        FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2();
1148
273
        fseek(ifp, 8, SEEK_CUR);
1149
1.09k
        FORC4 icWBC[LIBRAW_WBI_Measured][RGGB_2_RGBG(c)] =
1150
1.09k
            get2();
1151
273
        fseek(ifp, 8, SEEK_CUR);
1152
1.09k
        FORC4 icWBC[LIBRAW_WBI_Other][RGGB_2_RGBG(c)] = get2();
1153
273
        fseek(ifp, 8, SEEK_CUR);
1154
273
        Canon_WBpresets(8, 24);
1155
273
        fseek(ifp, 168, SEEK_CUR);
1156
1.09k
        FORC4 icWBC[LIBRAW_WBI_FL_WW][RGGB_2_RGBG(c)] = get2();
1157
273
        fseek(ifp, 24, SEEK_CUR);
1158
273
        Canon_WBCTpresets(2); // BCADT
1159
273
        offsetChannelBlackLevel = save1 + (0x014d << 1);
1160
273
        offsetWhiteLevels = save1 + (0x0569 << 1);
1161
273
      }
1162
668
      else if (imCanon.ColorDataSubVer == 0xfffd) // ColorDataSubVer: 65533 (-3)
1163
                                                  // M10, M3
1164
                                                  // G1 X, G1 X Mark II
1165
                                                  // G3 X, G5 X, G7 X, G9 X
1166
                                                  // G10, G11, G12, G15, G16
1167
                                                  // S90, S95, S100, S100V, S110, S120
1168
                                                  // SX1 IS, SX50 HS, SX60 HS
1169
117
      {
1170
117
        fseek(ifp, save1 + (0x004c << 1), SEEK_SET);
1171
468
        FORC4 icWBC[LIBRAW_WBI_Auto][RGGB_2_RGBG(c)] = get2();
1172
117
        get2();
1173
468
        FORC4 icWBC[LIBRAW_WBI_Measured][RGGB_2_RGBG(c)] =
1174
468
            get2();
1175
117
        get2();
1176
468
        FORC4 icWBC[LIBRAW_WBI_Other][RGGB_2_RGBG(c)] = get2();
1177
117
        get2();
1178
117
        Canon_WBpresets(2, 12);
1179
117
        fseek(ifp, save1 + (0x00ba << 1), SEEK_SET);
1180
117
        Canon_WBCTpresets(2); // BCADT
1181
117
        offsetChannelBlackLevel = save1 + (0x0108 << 1);
1182
117
      }
1183
941
      break;
1184
1185
154
    case 1273: // 600D; ColorDataSubVer: 10
1186
1.28k
    case 1275: // 1200D; ColorDataSubVer: 10
1187
1.28k
      imCanon.ColorDataVer = 6;
1188
1.28k
      AsShot_Auto_MeasuredWB(0x003f);
1189
1.28k
      sRAW_WB(0x0062);
1190
1.28k
      fseek(ifp, save1 + (0x0067 << 1), SEEK_SET);
1191
1.28k
      Canon_WBpresets(2, 12);
1192
1.28k
      fseek(ifp, save1 + (0x00bc << 1), SEEK_SET);
1193
1.28k
      Canon_WBCTpresets(0); // BCAT
1194
1.28k
      offsetChannelBlackLevel = save1 + (0x01df << 1);
1195
1.28k
      offsetWhiteLevels = save1 + (0x01e3 << 1);
1196
1.28k
      break;
1197
1198
647
    case 1312: // 5D Mark III, 650D, 700D, M; ColorDataSubVer: 10
1199
926
    case 1313: // 100D, 6D, 70D, EOS M2; ColorDataSubVer: 10
1200
2.62k
    case 1316: // -1D C, -1D X; ColorDataSubVer: 10
1201
3.42k
    case 1506: // 750D, 760D, 7D Mark II; ColorDataSubVer: 11
1202
3.42k
      imCanon.ColorDataVer = 7;
1203
3.42k
      AsShot_Auto_MeasuredWB(0x003f);
1204
3.42k
      sRAW_WB(0x007b);
1205
3.42k
      fseek(ifp, save1 + (0x0080 << 1), SEEK_SET);
1206
3.42k
      Canon_WBpresets(2, 12);
1207
3.42k
      fseek(ifp, save1 + (0x00d5 << 1), SEEK_SET);
1208
3.42k
      Canon_WBCTpresets(0); // BCAT
1209
1210
3.42k
      if (imCanon.ColorDataSubVer == 10)
1211
269
      {
1212
269
        offsetChannelBlackLevel = save1 + (0x01f8 << 1);
1213
269
        offsetWhiteLevels = save1 + (0x01fc << 1);
1214
269
      }
1215
3.15k
      else if (imCanon.ColorDataSubVer == 11)
1216
244
      {
1217
244
        offsetChannelBlackLevel = save1 + (0x02d8 << 1);
1218
244
        offsetWhiteLevels = save1 + (0x02dc << 1);
1219
244
      }
1220
3.42k
      break;
1221
1222
76
    case 1560: // 5DS, 5DS R; ColorDataSubVer: 12
1223
233
    case 1592: // 5D Mark IV, 80D, -1D X Mark II; ColorDataSubVer: 13
1224
654
    case 1353: // 1300D, 1500D, 3000D; ColorDataSubVer: 14
1225
941
    case 1602: // 200D, 6D Mark II, 77D, 800D; ColorDataSubVer: 15
1226
941
      imCanon.ColorDataVer = 8;
1227
941
      AsShot_Auto_MeasuredWB(0x003f);
1228
941
      sRAW_WB(0x0080);
1229
941
      fseek(ifp, save1 + (0x0085 << 1), SEEK_SET);
1230
941
      Canon_WBpresets(2, 12);
1231
941
      fseek(ifp, save1 + (0x0107 << 1), SEEK_SET);
1232
941
      Canon_WBCTpresets(0); // BCAT
1233
1234
941
      if (imCanon.ColorDataSubVer == 14) // 1300D, 1500D, 3000D
1235
83
      {
1236
83
        offsetChannelBlackLevel = save1 + (0x022c << 1);
1237
83
        offsetWhiteLevels = save1 + (0x0230 << 1);
1238
83
      }
1239
858
      else
1240
858
      {
1241
858
        offsetChannelBlackLevel = save1 + (0x030a << 1);
1242
858
        offsetWhiteLevels = save1 + (0x030e << 1);
1243
858
      }
1244
941
      break;
1245
1246
884
    case 1820: // M50; ColorDataSubVer: 16
1247
1.36k
    case 1824: // R, Ra; ColorDataSubVer: 17
1248
2.89k
    case 1816: // RP, 250D, SX70 HS; ColorDataSubVer: 18
1249
               // R100, M6 Mark II, M200, 90D, G5 X Mark II, G7 X Mark III, 850D; ColorDataSubVer: 19
1250
2.89k
      imCanon.ColorDataVer = 9;
1251
2.89k
      AsShot_Auto_MeasuredWB(0x0047);
1252
2.89k
      CR3_ColorData(0x0047);
1253
2.89k
      break;
1254
1255
1.27k
    case 1770: // R5 CRM
1256
1.51k
    case 2024: // -1D X Mark III; ColorDataSubVer: 32
1257
1.51k
    case 3656: // R5, R6; ColorDataSubVer: 33
1258
1.51k
      imCanon.ColorDataVer = 10;
1259
1.51k
      AsShot_Auto_MeasuredWB(0x0055);
1260
1.51k
      CR3_ColorData(0x0055);
1261
1.51k
      break;
1262
1263
107
    case 3973: // R3; ColorDataSubVer: 34
1264
107
    case 3778: // R6 Mark II, R7, R8, R10, R50; ColorDataSubVer: 48
1265
107
      imCanon.ColorDataVer = 11;
1266
107
      AsShot_Auto_MeasuredWB(0x0069);
1267
1268
107
      fseek(ifp, save1 + ((0x0069+0x0064) << 1), SEEK_SET);
1269
107
      Canon_WBpresets(2, 12);
1270
107
      fseek(ifp, save1 + ((0x0069+0x00c3) << 1), SEEK_SET);
1271
107
      Canon_WBCTpresets(0);
1272
107
      offsetChannelBlackLevel2 = save1 + ((0x0069+0x0102) << 1);
1273
107
      offsetChannelBlackLevel  = save1 + ((0x0069+0x0213) << 1);
1274
107
      offsetWhiteLevels        = save1 + ((0x0069+0x0217) << 1);
1275
107
      break;
1276
1277
1.45k
   default:
1278
1.45k
      imCanon.ColorDataSubVer = get2();
1279
1.45k
      break;
1280
19.7k
    }
1281
1282
19.7k
    if (offsetChannelBlackLevel)
1283
14.8k
    {
1284
14.8k
      fseek(ifp, offsetChannelBlackLevel, SEEK_SET);
1285
14.8k
      FORC4
1286
59.5k
        bls += (imCanon.ChannelBlackLevel[RGGB_2_RGBG(c)] = get2());
1287
14.8k
      imCanon.AverageBlackLevel = bls / 4;
1288
14.8k
    }
1289
19.7k
    if (offsetWhiteLevels)
1290
8.21k
    {
1291
8.21k
      if ((offsetWhiteLevels - offsetChannelBlackLevel) != 8L)
1292
273
        fseek(ifp, offsetWhiteLevels, SEEK_SET);
1293
8.21k
      imCanon.NormalWhiteLevel = get2();
1294
8.21k
      imCanon.SpecularWhiteLevel = get2();
1295
8.21k
      FORC4
1296
32.8k
        imgdata.color.linear_max[c] = imCanon.SpecularWhiteLevel;
1297
8.21k
    }
1298
1299
19.7k
    if(!imCanon.AverageBlackLevel && offsetChannelBlackLevel2)
1300
362
    {
1301
362
        fseek(ifp, offsetChannelBlackLevel2, SEEK_SET);
1302
362
        FORC4
1303
1.44k
            bls += (imCanon.ChannelBlackLevel[RGGB_2_RGBG(c)] = get2());
1304
362
        imCanon.AverageBlackLevel = bls / 4;
1305
362
    }
1306
19.7k
    fseek(ifp, save1, SEEK_SET);
1307
1308
2.76M
  } else if (tag == 0x4013) {
1309
1.40k
    get4();
1310
1.40k
    imCanon.AFMicroAdjMode = get4();
1311
1.40k
    float a = float(get4());
1312
1.40k
    float b = float(get4());
1313
1.40k
    if (fabsf(b) > 0.001f)
1314
876
      imCanon.AFMicroAdjValue = a / b;
1315
1316
2.76M
  } else if (tag == 0x4018) {
1317
1.59k
    fseek(ifp, 8, SEEK_CUR);
1318
1.59k
    imCanon.AutoLightingOptimizer = get4();
1319
1.59k
    if ((imCanon.AutoLightingOptimizer > 3) ||
1320
1.59k
        (imCanon.AutoLightingOptimizer < 0))
1321
1.31k
      imCanon.AutoLightingOptimizer = 3;
1322
1.59k
    imCanon.HighlightTonePriority = get4();
1323
1.59k
    if ((imCanon.HighlightTonePriority > 5) ||
1324
1.59k
        (imCanon.HighlightTonePriority < 0))
1325
909
      imCanon.HighlightTonePriority = 0;
1326
1.59k
    if (imCanon.HighlightTonePriority) {
1327
251
      imCommon.ExposureCalibrationShift -= float(imCanon.HighlightTonePriority);
1328
251
    }
1329
1330
2.76M
  } else if ((tag == 0x4021) && (dng_writer == nonDNG) &&
1331
2.76M
             (imCanon.multishot[0] = get4()) &&
1332
2.76M
             (imCanon.multishot[1] = get4())) {
1333
2.20k
    if (len >= 4) {
1334
1.26k
      imCanon.multishot[2] = get4();
1335
1.26k
      imCanon.multishot[3] = get4();
1336
1.26k
    }
1337
8.80k
    FORC4 cam_mul[c] = 1024;
1338
2.75M
  } else if (tag == 0x4026) {
1339
1.06k
    fseek(ifp, 44, SEEK_CUR);
1340
1.06k
    imCanon.CanonLog = get4();
1341
1.06k
  }
1342
2.98M
#undef CR3_ColorData
1343
2.98M
#undef sRAW_WB
1344
2.98M
#undef AsShot_Auto_MeasuredWB
1345
2.98M
}