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