From bd5594f75773e542015b9457c3a2999f2e6b6525 Mon Sep 17 00:00:00 2001 From: Daniel Martinez Date: Fri, 26 Jan 2024 09:34:16 -0500 Subject: [PATCH] Create C API --- src/CMakeLists.txt | 3 +- src/c_api/librtprocess_c_api.cc | 102 ++++++++++++++++++++++++++++++++ src/include/librtprocess.h | 37 +++++++++++- 3 files changed, 139 insertions(+), 3 deletions(-) create mode 100644 src/c_api/librtprocess_c_api.cc diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index be49283..9ea885c 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -18,7 +18,8 @@ set(rtprocess_SRCS demosaic/vng4.cc demosaic/xtransfast.cc preprocess/CA_correct.cc - postprocess/hilite_recon.cc) + postprocess/hilite_recon.cc + c_api/librtprocess_c_api.cc) add_library(rtprocess ${rtprocess_SRCS}) target_include_directories(rtprocess diff --git a/src/c_api/librtprocess_c_api.cc b/src/c_api/librtprocess_c_api.cc new file mode 100644 index 0000000..2271330 --- /dev/null +++ b/src/c_api/librtprocess_c_api.cc @@ -0,0 +1,102 @@ +/* + * This file is part of librtprocess. + * + * Copyright (c) 2018 Carlo Vaccari + * + * librtprocess is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the license, or + * (at your option) any later version. + * + * librtprocess is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with librtprocess. If not, see . + */ + +// C API Wrapper for librtprocess + +#include "librtprocess.h" + +extern "C" +{ + +rpError rt_process_bayerborder_demosaic(int winw, int winh, int lborders, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2]) +{ + return bayerborder_demosaic(winw, winh, lborders, rawData, red, green, blue, cfarray); +} + +void rt_process_xtransborder_demosaic(int winw, int winh, int border, const float * const *rawData, float **red, float **green, float **blue, const unsigned xtrans[6][6]) +{ + return xtransborder_demosaic(winw, winh, border, rawData, red, green, blue, xtrans); +} + +rpError rt_process_ahd_demosaic(int width, int height, const float* const* rawData, float** red, float** green, float** blue, const unsigned cfarray[2][2], const float rgb_cam[3][4], bool(* setProgCancel)(double)) +{ + return ahd_demosaic(width, height, rawData, red, green, blue, cfarray, rgb_cam, setProgCancel); +} + +rpError rt_process_amaze_demosaic(int raw_width, int raw_height, int winx, int winy, int winw, int winh, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), double initGain, int border, float inputScale, float outputScale, size_t chunkSize, bool measure) +{ + return amaze_demosaic(raw_width, raw_height, winx, winy, winw, winh, rawData, red, green, blue, cfarray, setProgCancel, initGain, border, inputScale, outputScale, chunkSize ? chunkSize : 2, measure); +} + +rpError rt_process_bayerfast_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), double initGain) +{ + return bayerfast_demosaic(width, height, rawData, red, green, blue, cfarray, setProgCancel, initGain); +} + +rpError rt_process_dcb_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), int iterations, bool dcb_enhance) +{ + return dcb_demosaic(width, height, rawData, red, green, blue, cfarray, setProgCancel, iterations, dcb_enhance); +} + +rpError rt_process_hphd_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double)) +{ + return hphd_demosaic(width, height, rawData, red, green, blue, cfarray, setProgCancel); +} + +rpError rt_process_rcd_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), size_t chunkSize, bool measure, bool multiThread) +{ + return rcd_demosaic(width, height, rawData, red, green, blue, cfarray, setProgCancel, chunkSize ? chunkSize : 2, measure, multiThread); +} + +rpError rt_process_markesteijn_demosaic(int width, int height, const float * const *rawdata, float **red, float **green, float **blue, const unsigned xtrans[6][6], const float rgb_cam[3][4], bool(* setProgCancel)(double), const int passes, const bool useCieLab, size_t chunkSize, bool measure) +{ + return markesteijn_demosaic(width, height, rawdata, red, green, blue, xtrans, rgb_cam, setProgCancel, passes, useCieLab, chunkSize ? chunkSize: 2, measure); +} + +rpError rt_process_xtransfast_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned xtrans[6][6], bool(* setProgCancel)(double)) +{ + return xtransfast_demosaic(width, height, rawData, red, green, blue, xtrans, setProgCancel); +} + +rpError rt_process_vng4_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double)) +{ + return vng4_demosaic(width, height, rawData, red, green, blue, cfarray, setProgCancel); +} + +rpError rt_process_igv_demosaic(int winw, int winh, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double)) +{ + return igv_demosaic(winw, winh, rawData, red, green, blue, cfarray, setProgCancel); +} + +rpError rt_process_lmmse_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), int iterations) +{ + return lmmse_demosaic(width, height, rawData, red, green, blue, cfarray, setProgCancel, iterations); +} + +rpError rt_process_CA_correct(int winx, int winy, int winw, int winh, const bool autoCA, size_t autoIterations, const double cared, const double cablue, bool avoidColourshift, const float * const *rawDataIn, float **rawDataOut, const unsigned cfarray[2][2], bool(* setProgCancel)(double), double fitParams[2][2][16], bool fitParamsIn, float inputScale, float outputScale, size_t chunkSize, bool measure) +{ + return CA_correct(winx, winy, winw, winh, autoCA, autoIterations, cared, cablue, avoidColourshift, rawDataIn, rawDataOut, cfarray, setProgCancel, fitParams, fitParamsIn, inputScale != 0 ? inputScale : (float)65535, outputScale != 0 ? outputScale : (float)65535, chunkSize ? chunkSize: 2, measure); +} + +rpError rt_process_HLRecovery_inpaint(const int width, const int height, float **red, float **green, float **blue, const float chmax[3], const float clmax[3], bool(* setProgCancel)(double)) +{ + return HLRecovery_inpaint(width, height, red, green, blue, chmax, clmax, setProgCancel); +} + +} // extern "C" diff --git a/src/include/librtprocess.h b/src/include/librtprocess.h index db62e74..70b441b 100644 --- a/src/include/librtprocess.h +++ b/src/include/librtprocess.h @@ -22,8 +22,11 @@ #include -#include -#include +#ifndef __cplusplus +#include +#endif + + #ifndef LIBRTPROCESS_STATIC // DLL interface export/import macros are only available for MSVC for now, @@ -44,6 +47,12 @@ #endif enum rpError {RP_NO_ERROR, RP_MEMORY_ERROR, RP_WRONG_CFA, RP_CACORRECT_ERROR}; + +#ifdef __cplusplus + +#include +#include + RTPROCESS_API rpError bayerborder_demosaic(int winw, int winh, int lborders, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2]); RTPROCESS_API void xtransborder_demosaic(int winw, int winh, int border, const float * const *rawData, float **red, float **green, float **blue, const unsigned xtrans[6][6]); RTPROCESS_API rpError ahd_demosaic (int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], const float rgb_cam[3][4], const std::function &setProgCancel); @@ -61,4 +70,28 @@ RTPROCESS_API rpError lmmse_demosaic(int width, int height, const float * const RTPROCESS_API rpError CA_correct(int winx, int winy, int winw, int winh, const bool autoCA, std::size_t autoIterations, const double cared, const double cablue, bool avoidColourshift, const float * const *rawDataIn, float **rawDataOut, const unsigned cfarray[2][2], const std::function &setProgCancel, double fitParams[2][2][16], bool fitParamsIn, float inputScale = 65535.f, float outputScale = 65535.f, size_t chunkSize = 2, bool measure = false); RTPROCESS_API rpError HLRecovery_inpaint(const int width, const int height, float **red, float **green, float **blue, const float chmax[3], const float clmax[3], const std::function &setProgCancel); +extern "C" { + +#endif + +RTPROCESS_API enum rpError rt_process_bayerborder_demosaic(int winw, int winh, int lborders, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2]); +RTPROCESS_API void rt_process_xtransborder_demosaic(int winw, int winh, int border, const float * const *rawData, float **red, float **green, float **blue, const unsigned xtrans[6][6]); +RTPROCESS_API enum rpError rt_process_ahd_demosaic(int width, int height, const float* const* rawData, float** red, float** green, float** blue, const unsigned cfarray[2][2], const float rgb_cam[3][4], bool(* setProgCancel)(double)); +RTPROCESS_API enum rpError rt_process_amaze_demosaic(int raw_width, int raw_height, int winx, int winy, int winw, int winh, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), double initGain, int border, float inputScale, float outputScale, size_t chunkSize, bool measure); +RTPROCESS_API enum rpError rt_process_bayerfast_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), double initGain); +RTPROCESS_API enum rpError rt_process_dcb_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), int iterations, bool dcb_enhance); +RTPROCESS_API enum rpError rt_process_hphd_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double)); +RTPROCESS_API enum rpError rt_process_rcd_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), size_t chunkSize, bool measure, bool multiThread); +RTPROCESS_API enum rpError rt_process_markesteijn_demosaic(int width, int height, const float * const *rawdata, float **red, float **green, float **blue, const unsigned xtrans[6][6], const float rgb_cam[3][4], bool(* setProgCancel)(double), const int passes, const bool useCieLab, size_t chunkSize, bool measure); +RTPROCESS_API enum rpError rt_process_xtransfast_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned xtrans[6][6], bool(* setProgCancel)(double)); +RTPROCESS_API enum rpError rt_process_vng4_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double)); +RTPROCESS_API enum rpError rt_process_igv_demosaic(int winw, int winh, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double)); +RTPROCESS_API enum rpError rt_process_lmmse_demosaic(int width, int height, const float * const *rawData, float **red, float **green, float **blue, const unsigned cfarray[2][2], bool(* setProgCancel)(double), int iterations); +RTPROCESS_API enum rpError rt_process_CA_correct(int winx, int winy, int winw, int winh, const bool autoCA, size_t autoIterations, const double cared, const double cablue, bool avoidColourshift, const float * const *rawDataIn, float **rawDataOut, const unsigned cfarray[2][2], bool(* setProgCancel)(double), double fitParams[2][2][16], bool fitParamsIn, float inputScale, float outputScale, size_t chunkSize, bool measure); +RTPROCESS_API enum rpError rt_process_HLRecovery_inpaint(const int width, const int height, float **red, float **green, float **blue, const float chmax[3], const float clmax[3], bool(* setProgCancel)(double)); + +#ifdef __cplusplus +} +#endif + #endif