Coverage Report

Created: 2026-06-10 06:54

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/libraw/src/utils/init_close_utils.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
16
#include "../../internal/libraw_cxx_defs.h"
17
#ifdef USE_RAWSPEED3
18
#include "rawspeed3_capi.h"
19
#endif
20
21
static void cleargps(libraw_gps_info_t *q)
22
332k
{
23
1.33M
  for (int i = 0; i < 3; i++)
24
998k
    q->latitude[i] = q->longitude[i] = q->gpstimestamp[i] = 0.f;
25
332k
  q->altitude = 0.f;
26
332k
  q->altref = q->latref = q->longref = q->gpsstatus = q->gpsparsed = 0;
27
332k
}
28
29
96.7k
LibRaw::LibRaw(unsigned int flags) : memmgr(1024)
30
96.7k
{
31
96.7k
  double aber[4] = {1, 1, 1, 1};
32
96.7k
  double gamm[6] = {0.45, 4.5, 0, 0, 0, 0};
33
96.7k
  unsigned greybox[4] = {0, 0, UINT_MAX, UINT_MAX};
34
96.7k
  unsigned cropbox[4] = {0, 0, UINT_MAX, UINT_MAX};
35
96.7k
  ZERO(imgdata);
36
37
96.7k
  cleargps(&imgdata.other.parsed_gps);
38
96.7k
  ZERO(libraw_internal_data);
39
96.7k
  ZERO(callbacks);
40
41
96.7k
  _rawspeed_camerameta = _rawspeed_decoder = NULL;
42
96.7k
  _rawspeed3_handle = NULL;
43
96.7k
  dnghost = NULL;
44
96.7k
  dngnegative = NULL;
45
96.7k
  dngimage = NULL;
46
96.7k
  _x3f_data = NULL;
47
48
#ifdef USE_RAWSPEED
49
  _rawspeed_camerameta = make_camera_metadata();
50
#endif
51
96.7k
  callbacks.data_cb = (flags & LIBRAW_OPTIONS_NO_DATAERR_CALLBACK)
52
96.7k
                          ? NULL
53
96.7k
                          : &default_data_callback;
54
96.7k
  callbacks.exif_cb = NULL; // no default callback
55
96.7k
  callbacks.makernotes_cb = NULL;
56
96.7k
  callbacks.pre_identify_cb = NULL;
57
96.7k
  callbacks.post_identify_cb = NULL;
58
96.7k
  callbacks.pre_subtractblack_cb = callbacks.pre_scalecolors_cb =
59
96.7k
      callbacks.pre_preinterpolate_cb = callbacks.pre_interpolate_cb =
60
96.7k
          callbacks.interpolate_bayer_cb = callbacks.interpolate_xtrans_cb =
61
96.7k
              callbacks.post_interpolate_cb = callbacks.pre_converttorgb_cb =
62
96.7k
                  callbacks.post_converttorgb_cb = NULL;
63
64
96.7k
  memmove(&imgdata.params.aber, &aber, sizeof(aber));
65
96.7k
  memmove(&imgdata.params.gamm, &gamm, sizeof(gamm));
66
96.7k
  memmove(&imgdata.params.greybox, &greybox, sizeof(greybox));
67
96.7k
  memmove(&imgdata.params.cropbox, &cropbox, sizeof(cropbox));
68
69
96.7k
  imgdata.params.bright = 1;
70
96.7k
  imgdata.params.use_camera_matrix = 1;
71
96.7k
  imgdata.params.user_flip = -1;
72
96.7k
  imgdata.params.user_black = -1;
73
96.7k
  imgdata.params.user_cblack[0] = imgdata.params.user_cblack[1] =
74
96.7k
      imgdata.params.user_cblack[2] = imgdata.params.user_cblack[3] = -1000001;
75
96.7k
  imgdata.params.user_sat = -1;
76
96.7k
  imgdata.params.user_qual = -1;
77
96.7k
  imgdata.params.output_color = 1;
78
96.7k
  imgdata.params.output_bps = 8;
79
96.7k
  imgdata.params.use_fuji_rotate = 1;
80
96.7k
  imgdata.params.use_p1_correction = 1;
81
96.7k
  imgdata.params.exp_shift = 1.0;
82
96.7k
  imgdata.params.auto_bright_thr = LIBRAW_DEFAULT_AUTO_BRIGHTNESS_THRESHOLD;
83
96.7k
  imgdata.params.adjust_maximum_thr = LIBRAW_DEFAULT_ADJUST_MAXIMUM_THRESHOLD;
84
96.7k
  imgdata.rawparams.use_rawspeed = 1;
85
96.7k
  imgdata.rawparams.use_dngsdk = LIBRAW_DNG_DEFAULT;
86
96.7k
  imgdata.params.no_auto_scale = 0;
87
96.7k
  imgdata.params.no_interpolation = 0;
88
96.7k
  imgdata.rawparams.specials = 0; /* was inverted : LIBRAW_PROCESSING_DP2Q_INTERPOLATERG |      LIBRAW_PROCESSING_DP2Q_INTERPOLATEAF; */
89
96.7k
  imgdata.rawparams.options = LIBRAW_RAWOPTIONS_CONVERTFLOAT_TO_INT;
90
96.7k
  imgdata.rawparams.sony_arw2_posterization_thr = 0;
91
96.7k
  imgdata.rawparams.max_raw_memory_mb = LIBRAW_MAX_ALLOC_MB_DEFAULT;
92
96.7k
  imgdata.params.green_matching = 0;
93
96.7k
  imgdata.rawparams.custom_camera_strings = 0;
94
96.7k
  imgdata.rawparams.coolscan_nef_gamma = 1.0f;
95
96.7k
  imgdata.parent_class = this;
96
96.7k
  imgdata.progress_flags = 0;
97
96.7k
  imgdata.color.dng_levels.baseline_exposure = -999.f;
98
96.7k
  imgdata.color.dng_levels.LinearResponseLimit = 1.0f;
99
96.7k
  MN.hasselblad.nIFD_CM[0] =
100
96.7k
    MN.hasselblad.nIFD_CM[1] = -1;
101
96.7k
  MN.kodak.ISOCalibrationGain = 1.0f;
102
96.7k
  _exitflag = 0;
103
96.7k
  tls = new LibRaw_TLS;
104
96.7k
  tls->init();
105
96.7k
}
106
107
LibRaw::~LibRaw()
108
96.7k
{
109
96.7k
  recycle();
110
96.7k
  delete tls;
111
#ifdef USE_RAWSPEED3
112
  if (_rawspeed3_handle)
113
      rawspeed3_close(_rawspeed3_handle);
114
  _rawspeed3_handle = NULL;
115
#endif
116
117
#ifdef USE_RAWSPEED
118
  if (_rawspeed_camerameta)
119
  {
120
    clear_camera_metadata(_rawspeed_camerameta);
121
    _rawspeed_camerameta = NULL;
122
  }
123
#endif
124
96.7k
}
125
126
void x3f_clear(void *);
127
128
void LibRaw::recycle()
129
235k
{
130
235k
  recycle_datastream();
131
235k
#define FREE(a)                                                                \
132
3.30M
  do                                                                           \
133
3.30M
  {                                                                            \
134
3.30M
    if (a)                                                                     \
135
3.30M
    {                                                                          \
136
65.0k
      free(a);                                                                 \
137
65.0k
      a = NULL;                                                                \
138
65.0k
    }                                                                          \
139
3.30M
  } while (0)
140
141
235k
  FREE(imgdata.image);
142
143
  // explicit cleanup of afdata allocations; entire array is zeroed below
144
1.17M
  for (int i = 0; i < LIBRAW_AFDATA_MAXCOUNT; i++)
145
943k
      FREE(MN.common.afdata[i].AFInfoData);
146
147
235k
  FREE(imgdata.thumbnail.thumb);
148
235k
  FREE(libraw_internal_data.internal_data.meta_data);
149
235k
  FREE(libraw_internal_data.output_data.histogram);
150
235k
  FREE(libraw_internal_data.output_data.oprof);
151
235k
  FREE(imgdata.color.profile);
152
235k
  FREE(imgdata.rawdata.ph1_cblack);
153
235k
  FREE(imgdata.rawdata.ph1_rblack);
154
235k
  FREE(imgdata.rawdata.raw_alloc);
155
235k
  FREE(imgdata.idata.xmpdata);
156
157
235k
  parseCR3_Free();
158
159
235k
#undef FREE
160
161
235k
  ZERO(imgdata.sizes);
162
235k
  imgdata.sizes.raw_inset_crops[0].cleft = imgdata.sizes.raw_inset_crops[1].cleft = 0xffff;
163
235k
  imgdata.sizes.raw_inset_crops[0].ctop  = imgdata.sizes.raw_inset_crops[1].ctop = 0xffff;
164
165
235k
  ZERO(imgdata.idata);
166
235k
  ZERO(imgdata.color);
167
235k
  ZERO(imgdata.lens);
168
235k
  ZERO(imgdata.other);
169
235k
  ZERO(imgdata.rawdata);
170
235k
  ZERO(imgdata.shootinginfo);
171
235k
  ZERO(imgdata.thumbnail);
172
235k
  ZERO(imgdata.thumbs_list);
173
235k
  ZERO(MN);
174
235k
  cleargps(&imgdata.other.parsed_gps);
175
235k
  ZERO(libraw_internal_data);
176
177
235k
  imgdata.lens.makernotes.FocalUnits = 1;
178
235k
  imgdata.lens.makernotes.LensID = LIBRAW_LENS_NOT_SET;
179
235k
  imgdata.shootinginfo.DriveMode = -1;
180
235k
  imgdata.shootinginfo.FocusMode = -1;
181
235k
  imgdata.shootinginfo.MeteringMode = -1;
182
235k
  imgdata.shootinginfo.AFPoint = -1;
183
235k
  imgdata.shootinginfo.ExposureMode = -1;
184
235k
  imgdata.shootinginfo.ExposureProgram = -1;
185
235k
  imgdata.shootinginfo.ImageStabilization = -1;
186
187
235k
  imgdata.color.dng_levels.baseline_exposure = -999.f;
188
235k
  imgdata.color.dng_levels.LinearResponseLimit = 1.f;
189
235k
  imgdata.color.dng_color[0].illuminant =
190
235k
      imgdata.color.dng_color[1].illuminant = LIBRAW_WBI_None;
191
1.17M
  for (int i = 0; i < 4; i++) imgdata.color.dng_levels.analogbalance[i] = 1.0f;
192
193
235k
  MN.canon.DefaultCropAbsolute.l = -1;
194
235k
  MN.canon.DefaultCropAbsolute.t = -1;
195
235k
  MN.canon.AutoLightingOptimizer =  3; // 'off' value
196
197
235k
  MN.fuji.WB_Preset = 0xffff;
198
235k
  MN.fuji.ExpoMidPointShift = -999.f;
199
235k
  MN.fuji.DynamicRange = 0xffff;
200
235k
  MN.fuji.FilmMode = 0xffff;
201
235k
  MN.fuji.DynamicRangeSetting = 0xffff;
202
235k
  MN.fuji.DevelopmentDynamicRange = 0xffff;
203
235k
  MN.fuji.AutoDynamicRange = 0xffff;
204
235k
  MN.fuji.DRangePriority = 0xffff;
205
235k
  MN.fuji.FocusMode = 0xffff;
206
235k
  MN.fuji.AFMode = 0xffff;
207
235k
  MN.fuji.FocusPixel[0] = MN.fuji.FocusPixel[1] = 0xffff;
208
235k
  MN.fuji.FocusSettings = 0xffffffff;
209
235k
  MN.fuji.AF_C_Settings = 0xffffffff;
210
235k
  MN.fuji.FocusWarning = 0xffff;
211
943k
  for (int i = 0; i < 3; i++) MN.fuji.ImageStabilization[i] = 0xffff;
212
235k
  MN.fuji.DriveMode = -1;
213
235k
  MN.fuji.ImageCount = -1;
214
235k
  MN.fuji.AutoBracketing = -1;
215
235k
  MN.fuji.SequenceNumber = -1;
216
235k
  MN.fuji.SeriesLength = -1;
217
235k
  MN.fuji.PixelShiftOffset[0] = MN.fuji.PixelShiftOffset[1] = -999.f;
218
219
235k
  MN.hasselblad.nIFD_CM[0] = MN.hasselblad.nIFD_CM[1] = -1;
220
221
235k
  MN.kodak.BlackLevelTop = 0xffff;
222
235k
  MN.kodak.BlackLevelBottom = 0xffff;
223
235k
  MN.kodak.ISOCalibrationGain = 1.0f;
224
225
235k
  MN.nikon.SensorHighSpeedCrop.cleft = 0xffff;
226
235k
  MN.nikon.SensorHighSpeedCrop.ctop = 0xffff;
227
228
235k
  MN.olympus.FocusMode[0] = 0xffff;
229
235k
  MN.olympus.AutoFocus    = 0xffff;
230
235k
  MN.olympus.AFPoint      = 0xffff;
231
235k
  MN.olympus.AFResult     = 0xffff;
232
235k
  MN.olympus.AFFineTune   = 0xff;
233
943k
  for (int i = 0; i < 3; i++) {
234
707k
    MN.olympus.AFFineTuneAdj[i] = -32768;
235
707k
    MN.olympus.SpecialMode[i] = 0xffffffff;
236
707k
  }
237
235k
  MN.olympus.ZoomStepCount = 0xffff;
238
235k
  MN.olympus.FocusStepCount = 0xffff;
239
235k
  MN.olympus.FocusStepInfinity = 0xffff;
240
235k
  MN.olympus.FocusStepNear = 0xffff;
241
235k
  MN.olympus.FocusDistance = -999.0;
242
1.17M
  for (int i = 0; i < 4; i++) MN.olympus.AspectFrame[i] = 0xffff;
243
235k
  MN.olympus.StackedImage[0] = 0xffffffff;
244
245
235k
  MN.panasonic.LensManufacturer = 0xffffffff;
246
247
235k
  MN.pentax.FocusMode[0] =
248
235k
    MN.pentax.FocusMode[1] = 0xffff;
249
235k
  MN.pentax.AFPointSelected[1] = 0xffff;
250
235k
  MN.pentax.AFPointSelected_Area = 0xffff;
251
235k
  MN.pentax.AFPointsInFocus = 0xffffffff;
252
235k
  MN.pentax.AFPointMode = 0xff;
253
254
235k
  MN.ricoh.AFStatus = 0xffff;
255
235k
  MN.ricoh.AFAreaMode = 0xffff;
256
235k
  MN.ricoh.WideAdapter = 0xffff;
257
235k
  MN.ricoh.CropMode = 0xffff;
258
235k
  MN.ricoh.NDFilter = 0xffff;
259
235k
  MN.ricoh.AutoBracketing = 0xffff;
260
235k
  MN.ricoh.MacroMode = 0xffff;
261
235k
  MN.ricoh.FlashMode = 0xffff;
262
235k
  MN.ricoh.FlashExposureComp = -999.0;
263
235k
  MN.ricoh.ManualFlashOutput = -999.0;
264
265
235k
  MN.samsung.ColorSpace[0] = MN.samsung.ColorSpace[1] = -1;
266
267
235k
  MN.sony.CameraType = LIBRAW_SONY_CameraType_UNKNOWN;
268
235k
  MN.sony.group2010 = 0;
269
235k
  MN.sony.real_iso_offset = 0xffff;
270
235k
  MN.sony.ImageCount3_offset = 0xffff;
271
235k
  MN.sony.MeteringMode_offset = 0xffff;
272
235k
  MN.sony.ExposureProgram_offset = 0xffff;
273
235k
  MN.sony.ReleaseMode2_offset = 0xffff;
274
235k
  MN.sony.ElectronicFrontCurtainShutter = 0xffffffff;
275
235k
  MN.sony.MinoltaCamID = 0xffffffff;
276
235k
  MN.sony.RAWFileType = 0xffff;
277
235k
  MN.sony.AFAreaModeSetting = 0xff;
278
235k
  MN.sony.AFAreaMode = 0xffff;
279
235k
  MN.sony.FlexibleSpotPosition[0] =
280
235k
      MN.sony.FlexibleSpotPosition[1] = 0xffff;
281
235k
  MN.sony.AFPointSelected = MN.sony.AFPointSelected_0x201e = 0xff;
282
235k
  MN.sony.AFTracking = 0xff;
283
235k
  MN.sony.FocusPosition = 0xffff;
284
235k
  MN.sony.LongExposureNoiseReduction = 0xffffffff;
285
235k
  MN.sony.Quality = 0xffffffff;
286
235k
  MN.sony.HighISONoiseReduction = 0xffff;
287
235k
  MN.sony.SonyRawFileType = 0xffff;
288
235k
  MN.sony.RawSizeType = 0xffff;
289
235k
  MN.sony.AFMicroAdjValue = 0x7f;
290
235k
  MN.sony.AFMicroAdjOn = -1;
291
235k
  MN.sony.AFMicroAdjRegisteredLenses = 0xff;
292
235k
  MN.sony.AspectRatio = -999.f;
293
294
235k
  _exitflag = 0;
295
#ifdef USE_RAWSPEED
296
  if (_rawspeed_decoder)
297
  {
298
    clear_rawspeed_decoder(_rawspeed_decoder);
299
  }
300
  _rawspeed_decoder = 0;
301
#endif
302
#ifdef USE_RAWSPEED3
303
  if (_rawspeed3_handle)
304
      rawspeed3_release(_rawspeed3_handle);
305
#endif
306
#ifdef USE_DNGSDK
307
  if (dngnegative)
308
  {
309
  clear_dng_negative(dngnegative);
310
  dngnegative = 0;
311
  }
312
  if(dngimage)
313
  {
314
  clear_dng_image(dngimage);
315
    dngimage = 0;
316
  }
317
#endif
318
#ifdef USE_X3FTOOLS
319
  if (_x3f_data)
320
  {
321
    x3f_clear(_x3f_data);
322
    _x3f_data = 0;
323
  }
324
#endif
325
326
235k
  memmgr.cleanup();
327
328
235k
  imgdata.thumbnail.tformat = LIBRAW_THUMBNAIL_UNKNOWN;
329
235k
  libraw_internal_data.unpacker_data.thumb_format = LIBRAW_INTERNAL_THUMBNAIL_UNKNOWN;
330
235k
  imgdata.progress_flags = 0;
331
332
235k
  load_raw =  0;
333
334
235k
  tls->init();
335
235k
}