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