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