/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 | } |