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