475 lines
12 KiB
C++
475 lines
12 KiB
C++
/* -*- C++ -*-
|
|
* File: libraw_c_api.cpp
|
|
* Copyright 2008-2024 LibRaw LLC (info@libraw.org)
|
|
* Created: Sat Mar 8 , 2008
|
|
*
|
|
* LibRaw C interface
|
|
|
|
|
|
LibRaw is free software; you can redistribute it and/or modify
|
|
it under the terms of the one of two licenses as you choose:
|
|
|
|
1. GNU LESSER GENERAL PUBLIC LICENSE version 2.1
|
|
(See file LICENSE.LGPL provided in LibRaw distribution archive for details).
|
|
|
|
2. COMMON DEVELOPMENT AND DISTRIBUTION LICENSE (CDDL) Version 1.0
|
|
(See file LICENSE.CDDL provided in LibRaw distribution archive for details).
|
|
|
|
*/
|
|
|
|
#include <math.h>
|
|
#include <errno.h>
|
|
#include "libraw/libraw.h"
|
|
|
|
#ifdef __cplusplus
|
|
#include <new>
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
libraw_data_t *libraw_init(unsigned int flags)
|
|
{
|
|
LibRaw *ret;
|
|
try
|
|
{
|
|
ret = new LibRaw(flags);
|
|
}
|
|
catch (const std::bad_alloc& )
|
|
{
|
|
return NULL;
|
|
}
|
|
return &(ret->imgdata);
|
|
}
|
|
|
|
unsigned libraw_capabilities() { return LibRaw::capabilities(); }
|
|
const char *libraw_version() { return LibRaw::version(); }
|
|
const char *libraw_strprogress(enum LibRaw_progress p)
|
|
{
|
|
return LibRaw::strprogress(p);
|
|
}
|
|
int libraw_versionNumber() { return LibRaw::versionNumber(); }
|
|
const char **libraw_cameraList() { return LibRaw::cameraList(); }
|
|
int libraw_cameraCount() { return LibRaw::cameraCount(); }
|
|
const char *libraw_unpack_function_name(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return "NULL parameter passed";
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->unpack_function_name();
|
|
}
|
|
|
|
void libraw_subtract_black(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->subtract_black();
|
|
}
|
|
|
|
int libraw_open_file(libraw_data_t *lr, const char *file)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->open_file(file);
|
|
}
|
|
|
|
libraw_iparams_t *libraw_get_iparams(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return NULL;
|
|
return &(lr->idata);
|
|
}
|
|
|
|
libraw_lensinfo_t *libraw_get_lensinfo(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return NULL;
|
|
return &(lr->lens);
|
|
}
|
|
|
|
libraw_imgother_t *libraw_get_imgother(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return NULL;
|
|
return &(lr->other);
|
|
}
|
|
|
|
#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM
|
|
int libraw_open_file_ex(libraw_data_t *lr, const char *file, INT64 sz)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->open_file(file, sz);
|
|
}
|
|
#endif
|
|
|
|
#ifdef LIBRAW_WIN32_UNICODEPATHS
|
|
int libraw_open_wfile(libraw_data_t *lr, const wchar_t *file)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->open_file(file);
|
|
}
|
|
|
|
#ifndef LIBRAW_NO_IOSTREAMS_DATASTREAM
|
|
int libraw_open_wfile_ex(libraw_data_t *lr, const wchar_t *file, INT64 sz)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->open_file(file, sz);
|
|
}
|
|
#endif
|
|
#endif
|
|
int libraw_open_buffer(libraw_data_t *lr, const void *buffer, size_t size)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->open_buffer(buffer, size);
|
|
}
|
|
int libraw_open_bayer(libraw_data_t *lr, unsigned char *data,
|
|
unsigned datalen, ushort _raw_width, ushort _raw_height,
|
|
ushort _left_margin, ushort _top_margin,
|
|
ushort _right_margin, ushort _bottom_margin,
|
|
unsigned char procflags, unsigned char bayer_pattern,
|
|
unsigned unused_bits, unsigned otherflags,
|
|
unsigned black_level)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->open_bayer(data, datalen, _raw_width, _raw_height, _left_margin,
|
|
_top_margin, _right_margin, _bottom_margin, procflags,
|
|
bayer_pattern, unused_bits, otherflags, black_level);
|
|
}
|
|
int libraw_unpack(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->unpack();
|
|
}
|
|
int libraw_unpack_thumb(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->unpack_thumb();
|
|
}
|
|
int libraw_unpack_thumb_ex(libraw_data_t *lr, int i)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->unpack_thumb_ex(i);
|
|
}
|
|
void libraw_recycle_datastream(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->recycle_datastream();
|
|
}
|
|
void libraw_recycle(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->recycle();
|
|
}
|
|
void libraw_close(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
delete ip;
|
|
}
|
|
|
|
void libraw_set_exifparser_handler(libraw_data_t *lr, exif_parser_callback cb,
|
|
void *data)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->set_exifparser_handler(cb, data);
|
|
}
|
|
|
|
void libraw_set_makernotes_handler(libraw_data_t *lr, exif_parser_callback cb,
|
|
void *data)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->set_makernotes_handler(cb, data);
|
|
}
|
|
|
|
void libraw_set_dataerror_handler(libraw_data_t *lr, data_callback func,
|
|
void *data)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->set_dataerror_handler(func, data);
|
|
}
|
|
void libraw_set_progress_handler(libraw_data_t *lr, progress_callback cb,
|
|
void *data)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->set_progress_handler(cb, data);
|
|
}
|
|
|
|
int libraw_adjust_to_raw_inset_crop(libraw_data_t *lr, unsigned mask, float maxcrop)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->adjust_to_raw_inset_crop(mask,maxcrop);
|
|
}
|
|
|
|
// DCRAW
|
|
int libraw_adjust_sizes_info_only(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->adjust_sizes_info_only();
|
|
}
|
|
int libraw_dcraw_ppm_tiff_writer(libraw_data_t *lr, const char *filename)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->dcraw_ppm_tiff_writer(filename);
|
|
}
|
|
int libraw_dcraw_thumb_writer(libraw_data_t *lr, const char *fname)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->dcraw_thumb_writer(fname);
|
|
}
|
|
int libraw_dcraw_process(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->dcraw_process();
|
|
}
|
|
libraw_processed_image_t *libraw_dcraw_make_mem_image(libraw_data_t *lr,
|
|
int *errc)
|
|
{
|
|
if (!lr)
|
|
{
|
|
if (errc)
|
|
*errc = EINVAL;
|
|
return NULL;
|
|
}
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->dcraw_make_mem_image(errc);
|
|
}
|
|
libraw_processed_image_t *libraw_dcraw_make_mem_thumb(libraw_data_t *lr,
|
|
int *errc)
|
|
{
|
|
if (!lr)
|
|
{
|
|
if (errc)
|
|
*errc = EINVAL;
|
|
return NULL;
|
|
}
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->dcraw_make_mem_thumb(errc);
|
|
}
|
|
|
|
void libraw_dcraw_clear_mem(libraw_processed_image_t *p)
|
|
{
|
|
LibRaw::dcraw_clear_mem(p);
|
|
}
|
|
|
|
int libraw_raw2image(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->raw2image();
|
|
}
|
|
void libraw_free_image(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->free_image();
|
|
}
|
|
int libraw_get_decoder_info(libraw_data_t *lr, libraw_decoder_info_t *d)
|
|
{
|
|
if (!lr || !d)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->get_decoder_info(d);
|
|
}
|
|
int libraw_COLOR(libraw_data_t *lr, int row, int col)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
return ip->COLOR(row, col);
|
|
}
|
|
|
|
/* getters/setters used by 3DLut Creator */
|
|
DllDef void libraw_set_demosaic(libraw_data_t *lr, int value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.user_qual = value;
|
|
}
|
|
|
|
DllDef void libraw_set_output_color(libraw_data_t *lr, int value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.output_color = value;
|
|
}
|
|
|
|
DllDef void libraw_set_adjust_maximum_thr(libraw_data_t *lr, float value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.adjust_maximum_thr = value;
|
|
}
|
|
|
|
DllDef void libraw_set_output_bps(libraw_data_t *lr, int value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.output_bps = value;
|
|
}
|
|
|
|
DllDef void libraw_set_output_tif(libraw_data_t *lr, int value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.output_tiff = value;
|
|
}
|
|
|
|
#define MIN(a, b) ((a) < (b) ? (a) : (b))
|
|
#define MAX(a, b) ((a) > (b) ? (a) : (b))
|
|
#define LIM(x, min, max) MAX(min, MIN(x, max))
|
|
|
|
DllDef void libraw_set_user_mul(libraw_data_t *lr, int index, float val)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.user_mul[LIM(index, 0, 3)] = val;
|
|
}
|
|
|
|
DllDef void libraw_set_gamma(libraw_data_t *lr, int index, float value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.gamm[LIM(index, 0, 5)] = value;
|
|
}
|
|
|
|
DllDef void libraw_set_no_auto_bright(libraw_data_t *lr, int value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.no_auto_bright = value;
|
|
}
|
|
|
|
DllDef void libraw_set_bright(libraw_data_t *lr, float value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.bright = value;
|
|
}
|
|
|
|
DllDef void libraw_set_highlight(libraw_data_t *lr, int value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.highlight = value;
|
|
}
|
|
|
|
DllDef void libraw_set_fbdd_noiserd(libraw_data_t *lr, int value)
|
|
{
|
|
if (!lr)
|
|
return;
|
|
LibRaw *ip = (LibRaw *)lr->parent_class;
|
|
ip->imgdata.params.fbdd_noiserd = value;
|
|
}
|
|
|
|
DllDef int libraw_get_raw_height(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
return lr->sizes.raw_height;
|
|
}
|
|
|
|
DllDef int libraw_get_raw_width(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
return lr->sizes.raw_width;
|
|
}
|
|
|
|
DllDef int libraw_get_iheight(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
return lr->sizes.iheight;
|
|
}
|
|
|
|
DllDef int libraw_get_iwidth(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
return lr->sizes.iwidth;
|
|
}
|
|
|
|
DllDef float libraw_get_cam_mul(libraw_data_t *lr, int index)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
return lr->color.cam_mul[LIM(index, 0, 3)];
|
|
}
|
|
|
|
DllDef float libraw_get_pre_mul(libraw_data_t *lr, int index)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
return lr->color.pre_mul[LIM(index, 0, 3)];
|
|
}
|
|
|
|
DllDef float libraw_get_rgb_cam(libraw_data_t *lr, int index1, int index2)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
return lr->color.rgb_cam[LIM(index1, 0, 2)][LIM(index2, 0, 3)];
|
|
}
|
|
|
|
DllDef int libraw_get_color_maximum(libraw_data_t *lr)
|
|
{
|
|
if (!lr)
|
|
return EINVAL;
|
|
return lr->color.maximum;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|