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