Coverage Report

Created: 2026-06-30 07:03

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