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