1 /* -*- C++ -*-
2  * File: libraw_c_api.cpp
3  * Copyright 2008-2020 LibRaw LLC (info@libraw.org)
4  * Created: Sat Mar  8 , 2008
5  *
6  * LibRaw C interface
7 
8 
9 LibRaw is free software; you can redistribute it and/or modify
10 it under the terms of the one of two licenses as you choose:
11 
12 1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1
13    (See file LICENSE.LGPL provided in LibRaw distribution archive for details).
14 
15 2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
16    (See file LICENSE.CDDL provided in LibRaw distribution archive for details).
17 
18  */
19 
20 #include <math.h>
21 #include <errno.h>
22 #include "libraw/libraw.h"
23 
24 #ifdef __cplusplus
25 #include <new>
26 extern "C"
27 {
28 #endif
29 
libraw_init(unsigned int flags)30   libraw_data_t *libraw_init(unsigned int flags)
31   {
32     LibRaw *ret;
33     try
34     {
35       ret = new LibRaw(flags);
36     }
37     catch (const std::bad_alloc& )
38     {
39       return NULL;
40     }
41     return &(ret->imgdata);
42   }
43 
libraw_capabilities()44   unsigned libraw_capabilities() { return LibRaw::capabilities(); }
libraw_version()45   const char *libraw_version() { return LibRaw::version(); }
libraw_strprogress(enum LibRaw_progress p)46   const char *libraw_strprogress(enum LibRaw_progress p)
47   {
48     return LibRaw::strprogress(p);
49   }
libraw_versionNumber()50   int libraw_versionNumber() { return LibRaw::versionNumber(); }
libraw_cameraList()51   const char **libraw_cameraList() { return LibRaw::cameraList(); }
libraw_cameraCount()52   int libraw_cameraCount() { return LibRaw::cameraCount(); }
libraw_unpack_function_name(libraw_data_t * lr)53   const char *libraw_unpack_function_name(libraw_data_t *lr)
54   {
55     if (!lr)
56       return "NULL parameter passed";
57     LibRaw *ip = (LibRaw *)lr->parent_class;
58     return ip->unpack_function_name();
59   }
60 
libraw_subtract_black(libraw_data_t * lr)61   void libraw_subtract_black(libraw_data_t *lr)
62   {
63     if (!lr)
64       return;
65     LibRaw *ip = (LibRaw *)lr->parent_class;
66     ip->subtract_black();
67   }
68 
libraw_open_file(libraw_data_t * lr,const char * file)69   int libraw_open_file(libraw_data_t *lr, const char *file)
70   {
71     if (!lr)
72       return EINVAL;
73     LibRaw *ip = (LibRaw *)lr->parent_class;
74     return ip->open_file(file);
75   }
76 
libraw_get_iparams(libraw_data_t * lr)77   libraw_iparams_t *libraw_get_iparams(libraw_data_t *lr)
78   {
79     if (!lr)
80       return NULL;
81     return &(lr->idata);
82   }
83 
libraw_get_lensinfo(libraw_data_t * lr)84   libraw_lensinfo_t *libraw_get_lensinfo(libraw_data_t *lr)
85   {
86     if (!lr)
87       return NULL;
88     return &(lr->lens);
89   }
90 
libraw_get_imgother(libraw_data_t * lr)91   libraw_imgother_t *libraw_get_imgother(libraw_data_t *lr)
92   {
93     if (!lr)
94       return NULL;
95     return &(lr->other);
96   }
97 
libraw_open_file_ex(libraw_data_t * lr,const char * file,INT64 sz)98   int libraw_open_file_ex(libraw_data_t *lr, const char *file, INT64 sz)
99   {
100     if (!lr)
101       return EINVAL;
102     LibRaw *ip = (LibRaw *)lr->parent_class;
103     return ip->open_file(file, sz);
104   }
105 #if defined(_WIN32) && !defined(__MINGW32__) && defined(_MSC_VER) &&           \
106     (_MSC_VER > 1310)
libraw_open_wfile(libraw_data_t * lr,const wchar_t * file)107   int libraw_open_wfile(libraw_data_t *lr, const wchar_t *file)
108   {
109     if (!lr)
110       return EINVAL;
111     LibRaw *ip = (LibRaw *)lr->parent_class;
112     return ip->open_file(file);
113   }
114 
libraw_open_wfile_ex(libraw_data_t * lr,const wchar_t * file,INT64 sz)115   int libraw_open_wfile_ex(libraw_data_t *lr, const wchar_t *file, INT64 sz)
116   {
117     if (!lr)
118       return EINVAL;
119     LibRaw *ip = (LibRaw *)lr->parent_class;
120     return ip->open_file(file, sz);
121   }
122 #endif
libraw_open_buffer(libraw_data_t * lr,void * buffer,size_t size)123   int libraw_open_buffer(libraw_data_t *lr, void *buffer, size_t size)
124   {
125     if (!lr)
126       return EINVAL;
127     LibRaw *ip = (LibRaw *)lr->parent_class;
128     return ip->open_buffer(buffer, size);
129   }
libraw_unpack(libraw_data_t * lr)130   int libraw_unpack(libraw_data_t *lr)
131   {
132     if (!lr)
133       return EINVAL;
134     LibRaw *ip = (LibRaw *)lr->parent_class;
135     return ip->unpack();
136   }
libraw_unpack_thumb(libraw_data_t * lr)137   int libraw_unpack_thumb(libraw_data_t *lr)
138   {
139     if (!lr)
140       return EINVAL;
141     LibRaw *ip = (LibRaw *)lr->parent_class;
142     return ip->unpack_thumb();
143   }
libraw_recycle_datastream(libraw_data_t * lr)144   void libraw_recycle_datastream(libraw_data_t *lr)
145   {
146     if (!lr)
147       return;
148     LibRaw *ip = (LibRaw *)lr->parent_class;
149     ip->recycle_datastream();
150   }
libraw_recycle(libraw_data_t * lr)151   void libraw_recycle(libraw_data_t *lr)
152   {
153     if (!lr)
154       return;
155     LibRaw *ip = (LibRaw *)lr->parent_class;
156     ip->recycle();
157   }
libraw_close(libraw_data_t * lr)158   void libraw_close(libraw_data_t *lr)
159   {
160     if (!lr)
161       return;
162     LibRaw *ip = (LibRaw *)lr->parent_class;
163     delete ip;
164   }
165 
libraw_set_exifparser_handler(libraw_data_t * lr,exif_parser_callback cb,void * data)166   void libraw_set_exifparser_handler(libraw_data_t *lr, exif_parser_callback cb,
167                                      void *data)
168   {
169     if (!lr)
170       return;
171     LibRaw *ip = (LibRaw *)lr->parent_class;
172     ip->set_exifparser_handler(cb, data);
173   }
174 
libraw_set_memerror_handler(libraw_data_t * lr,memory_callback cb,void * data)175   void libraw_set_memerror_handler(libraw_data_t *lr, memory_callback cb,
176                                    void *data)
177   {
178     if (!lr)
179       return;
180     LibRaw *ip = (LibRaw *)lr->parent_class;
181     ip->set_memerror_handler(cb, data);
182   }
libraw_set_dataerror_handler(libraw_data_t * lr,data_callback func,void * data)183   void libraw_set_dataerror_handler(libraw_data_t *lr, data_callback func,
184                                     void *data)
185   {
186     if (!lr)
187       return;
188     LibRaw *ip = (LibRaw *)lr->parent_class;
189     ip->set_dataerror_handler(func, data);
190   }
libraw_set_progress_handler(libraw_data_t * lr,progress_callback cb,void * data)191   void libraw_set_progress_handler(libraw_data_t *lr, progress_callback cb,
192                                    void *data)
193   {
194     if (!lr)
195       return;
196     LibRaw *ip = (LibRaw *)lr->parent_class;
197     ip->set_progress_handler(cb, data);
198   }
199 
200   // DCRAW
libraw_adjust_sizes_info_only(libraw_data_t * lr)201   int libraw_adjust_sizes_info_only(libraw_data_t *lr)
202   {
203     if (!lr)
204       return EINVAL;
205     LibRaw *ip = (LibRaw *)lr->parent_class;
206     return ip->adjust_sizes_info_only();
207   }
libraw_dcraw_ppm_tiff_writer(libraw_data_t * lr,const char * filename)208   int libraw_dcraw_ppm_tiff_writer(libraw_data_t *lr, const char *filename)
209   {
210     if (!lr)
211       return EINVAL;
212     LibRaw *ip = (LibRaw *)lr->parent_class;
213     return ip->dcraw_ppm_tiff_writer(filename);
214   }
libraw_dcraw_thumb_writer(libraw_data_t * lr,const char * fname)215   int libraw_dcraw_thumb_writer(libraw_data_t *lr, const char *fname)
216   {
217     if (!lr)
218       return EINVAL;
219     LibRaw *ip = (LibRaw *)lr->parent_class;
220     return ip->dcraw_thumb_writer(fname);
221   }
libraw_dcraw_process(libraw_data_t * lr)222   int libraw_dcraw_process(libraw_data_t *lr)
223   {
224     if (!lr)
225       return EINVAL;
226     LibRaw *ip = (LibRaw *)lr->parent_class;
227     return ip->dcraw_process();
228   }
libraw_dcraw_make_mem_image(libraw_data_t * lr,int * errc)229   libraw_processed_image_t *libraw_dcraw_make_mem_image(libraw_data_t *lr,
230                                                         int *errc)
231   {
232     if (!lr)
233     {
234       if (errc)
235         *errc = EINVAL;
236       return NULL;
237     }
238     LibRaw *ip = (LibRaw *)lr->parent_class;
239     return ip->dcraw_make_mem_image(errc);
240   }
libraw_dcraw_make_mem_thumb(libraw_data_t * lr,int * errc)241   libraw_processed_image_t *libraw_dcraw_make_mem_thumb(libraw_data_t *lr,
242                                                         int *errc)
243   {
244     if (!lr)
245     {
246       if (errc)
247         *errc = EINVAL;
248       return NULL;
249     }
250     LibRaw *ip = (LibRaw *)lr->parent_class;
251     return ip->dcraw_make_mem_thumb(errc);
252   }
253 
libraw_dcraw_clear_mem(libraw_processed_image_t * p)254   void libraw_dcraw_clear_mem(libraw_processed_image_t *p)
255   {
256     LibRaw::dcraw_clear_mem(p);
257   }
258 
libraw_raw2image(libraw_data_t * lr)259   int libraw_raw2image(libraw_data_t *lr)
260   {
261     if (!lr)
262       return EINVAL;
263     LibRaw *ip = (LibRaw *)lr->parent_class;
264     return ip->raw2image();
265   }
libraw_free_image(libraw_data_t * lr)266   void libraw_free_image(libraw_data_t *lr)
267   {
268     if (!lr)
269       return;
270     LibRaw *ip = (LibRaw *)lr->parent_class;
271     ip->free_image();
272   }
libraw_get_decoder_info(libraw_data_t * lr,libraw_decoder_info_t * d)273   int libraw_get_decoder_info(libraw_data_t *lr, libraw_decoder_info_t *d)
274   {
275     if (!lr || !d)
276       return EINVAL;
277     LibRaw *ip = (LibRaw *)lr->parent_class;
278     return ip->get_decoder_info(d);
279   }
libraw_COLOR(libraw_data_t * lr,int row,int col)280   int libraw_COLOR(libraw_data_t *lr, int row, int col)
281   {
282     if (!lr)
283       return EINVAL;
284     LibRaw *ip = (LibRaw *)lr->parent_class;
285     return ip->COLOR(row, col);
286   }
287 
288   /* getters/setters used by 3DLut Creator */
libraw_set_demosaic(libraw_data_t * lr,int value)289   DllDef void libraw_set_demosaic(libraw_data_t *lr, int value)
290   {
291     if (!lr)
292       return;
293     LibRaw *ip = (LibRaw *)lr->parent_class;
294     ip->imgdata.params.user_qual = value;
295   }
296 
libraw_set_output_color(libraw_data_t * lr,int value)297   DllDef void libraw_set_output_color(libraw_data_t *lr, int value)
298   {
299     if (!lr)
300       return;
301     LibRaw *ip = (LibRaw *)lr->parent_class;
302     ip->imgdata.params.output_color = value;
303   }
304 
libraw_set_output_bps(libraw_data_t * lr,int value)305   DllDef void libraw_set_output_bps(libraw_data_t *lr, int value)
306   {
307     if (!lr)
308       return;
309     LibRaw *ip = (LibRaw *)lr->parent_class;
310     ip->imgdata.params.output_bps = value;
311   }
312 
libraw_set_output_tif(libraw_data_t * lr,int value)313   	DllDef void libraw_set_output_tif(libraw_data_t *lr, int value)
314   {
315     if (!lr)
316       return;
317     LibRaw *ip = (LibRaw *)lr->parent_class;
318     ip->imgdata.params.output_tiff = value;
319   }
320 
321 #define MIN(a, b) ((a) < (b) ? (a) : (b))
322 #define MAX(a, b) ((a) > (b) ? (a) : (b))
323 #define LIM(x, min, max) MAX(min, MIN(x, max))
324 
libraw_set_user_mul(libraw_data_t * lr,int index,float val)325   DllDef void libraw_set_user_mul(libraw_data_t *lr, int index, float val)
326   {
327     if (!lr)
328       return;
329     LibRaw *ip = (LibRaw *)lr->parent_class;
330     ip->imgdata.params.user_mul[LIM(index, 0, 3)] = val;
331   }
332 
libraw_set_gamma(libraw_data_t * lr,int index,float value)333   DllDef void libraw_set_gamma(libraw_data_t *lr, int index, float value)
334   {
335     if (!lr)
336       return;
337     LibRaw *ip = (LibRaw *)lr->parent_class;
338     ip->imgdata.params.gamm[LIM(index, 0, 5)] = value;
339   }
340 
libraw_set_no_auto_bright(libraw_data_t * lr,int value)341   DllDef void libraw_set_no_auto_bright(libraw_data_t *lr, int value)
342   {
343     if (!lr)
344       return;
345     LibRaw *ip = (LibRaw *)lr->parent_class;
346     ip->imgdata.params.no_auto_bright = value;
347   }
348 
libraw_set_bright(libraw_data_t * lr,float value)349   DllDef void libraw_set_bright(libraw_data_t *lr, float value)
350   {
351     if (!lr)
352       return;
353     LibRaw *ip = (LibRaw *)lr->parent_class;
354     ip->imgdata.params.bright = value;
355   }
356 
libraw_set_highlight(libraw_data_t * lr,int value)357   DllDef void libraw_set_highlight(libraw_data_t *lr, int value)
358   {
359     if (!lr)
360       return;
361     LibRaw *ip = (LibRaw *)lr->parent_class;
362     ip->imgdata.params.highlight = value;
363   }
364 
libraw_set_fbdd_noiserd(libraw_data_t * lr,int value)365   DllDef void libraw_set_fbdd_noiserd(libraw_data_t *lr, int value)
366   {
367     if (!lr)
368       return;
369     LibRaw *ip = (LibRaw *)lr->parent_class;
370     ip->imgdata.params.fbdd_noiserd = value;
371   }
372 
libraw_get_raw_height(libraw_data_t * lr)373   DllDef int libraw_get_raw_height(libraw_data_t *lr)
374   {
375     if (!lr)
376       return EINVAL;
377     return lr->sizes.raw_height;
378   }
379 
libraw_get_raw_width(libraw_data_t * lr)380   DllDef int libraw_get_raw_width(libraw_data_t *lr)
381   {
382     if (!lr)
383       return EINVAL;
384     return lr->sizes.raw_width;
385   }
386 
libraw_get_iheight(libraw_data_t * lr)387   DllDef int libraw_get_iheight(libraw_data_t *lr)
388   {
389     if (!lr)
390       return EINVAL;
391     return lr->sizes.iheight;
392   }
393 
libraw_get_iwidth(libraw_data_t * lr)394   DllDef int libraw_get_iwidth(libraw_data_t *lr)
395   {
396     if (!lr)
397       return EINVAL;
398     return lr->sizes.iwidth;
399   }
400 
libraw_get_cam_mul(libraw_data_t * lr,int index)401   DllDef float libraw_get_cam_mul(libraw_data_t *lr, int index)
402   {
403     if (!lr)
404       return EINVAL;
405     return lr->color.cam_mul[LIM(index, 0, 3)];
406   }
407 
libraw_get_pre_mul(libraw_data_t * lr,int index)408   DllDef float libraw_get_pre_mul(libraw_data_t *lr, int index)
409   {
410     if (!lr)
411       return EINVAL;
412     return lr->color.pre_mul[LIM(index, 0, 3)];
413   }
414 
libraw_get_rgb_cam(libraw_data_t * lr,int index1,int index2)415   DllDef float libraw_get_rgb_cam(libraw_data_t *lr, int index1, int index2)
416   {
417     if (!lr)
418       return EINVAL;
419     return lr->color.rgb_cam[LIM(index1, 0, 2)][LIM(index2, 0, 3)];
420   }
421 
libraw_get_color_maximum(libraw_data_t * lr)422   DllDef int libraw_get_color_maximum(libraw_data_t *lr)
423   {
424     if (!lr)
425       return EINVAL;
426     return lr->color.maximum;
427   }
428 
429 #ifdef __cplusplus
430 }
431 #endif
432