Coverage Report

Created: 2026-10-28 07:09

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