diff --git a/kleidicv/include/kleidicv/kleidicv.h b/kleidicv/include/kleidicv/kleidicv.h index 54d8cc4bcd4c31cb925fd93bd7964c4e7874e247..03836ff2e9132cd193a9a63abd0e19bb6f836cf6 100644 --- a/kleidicv/include/kleidicv/kleidicv.h +++ b/kleidicv/include/kleidicv/kleidicv.h @@ -1116,9 +1116,9 @@ KLEIDICV_API_DECLARATION(kleidicv_resize_linear_f32, const float *src, /// @param channels Number of channels in the data. Must be not more than /// @ref KLEIDICV_MAXIMUM_CHANNEL_COUNT. /// -KLEIDICV_API_DECLARATION(kleidicv_sobel_3x3_vertical_s16_u8, const uint8_t *src, - size_t src_stride, int16_t *dst, size_t dst_stride, - size_t width, size_t height, size_t channels); +kleidicv_error_t kleidicv_sobel_3x3_vertical_s16_u8( + const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels); /// Calculates horizontal derivative approximation with Sobel filter. /// @@ -1154,10 +1154,9 @@ KLEIDICV_API_DECLARATION(kleidicv_sobel_3x3_vertical_s16_u8, const uint8_t *src, /// @param channels Number of channels in the data. Must be not more than /// @ref KLEIDICV_MAXIMUM_CHANNEL_COUNT. /// -KLEIDICV_API_DECLARATION(kleidicv_sobel_3x3_horizontal_s16_u8, - const uint8_t *src, size_t src_stride, int16_t *dst, - size_t dst_stride, size_t width, size_t height, - size_t channels); +kleidicv_error_t kleidicv_sobel_3x3_horizontal_s16_u8( + const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels); #if KLEIDICV_EXPERIMENTAL_FEATURE_CANNY /// Canny edge detector for uint8_t grayscale input. Output is also a uint8_t @@ -1267,13 +1266,11 @@ kleidicv_error_t kleidicv_filter_context_release( /// @param border_type Way of handling the border. /// @param context Pointer to filter context. /// -KLEIDICV_API_DECLARATION(kleidicv_separable_filter_2d_u8, const uint8_t *src, - size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height, size_t channels, - const uint8_t *kernel_x, size_t kernel_width, - const uint8_t *kernel_y, size_t kernel_height, - kleidicv_border_type_t border_type, - kleidicv_filter_context_t *context); +kleidicv_error_t kleidicv_separable_filter_2d_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, const uint8_t *kernel_x, + size_t kernel_width, const uint8_t *kernel_y, size_t kernel_height, + kleidicv_border_type_t border_type, kleidicv_filter_context_t *context); /// Applies Gaussian blur to the source image using the specified parameters. /// In-place filtering is not supported. @@ -1324,13 +1321,11 @@ KLEIDICV_API_DECLARATION(kleidicv_separable_filter_2d_u8, const uint8_t *src, /// @param border_type Way of handling the border. /// @param context Pointer to filter context. /// -KLEIDICV_API_DECLARATION(kleidicv_gaussian_blur_u8, const uint8_t *src, - size_t src_stride, uint8_t *dst, size_t dst_stride, - size_t width, size_t height, size_t channels, - size_t kernel_width, size_t kernel_height, - float sigma_x, float sigma_y, - kleidicv_border_type_t border_type, - kleidicv_filter_context_t *context); +kleidicv_error_t kleidicv_gaussian_blur_u8( + const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, + size_t width, size_t height, size_t channels, size_t kernel_width, + size_t kernel_height, float sigma_x, float sigma_y, + kleidicv_border_type_t border_type, kleidicv_filter_context_t *context); /// Splits a multi channel source stream into separate 1-channel streams. Width /// and height are the same for the source stream and for all the destination diff --git a/kleidicv/src/filters/gaussian_blur_api.cpp b/kleidicv/src/filters/gaussian_blur_api.cpp index 67d47d4fad5b873e88e4633052fe414be2366f50..bb21315ed6c061f50ff4a45273ad403873ed1dfe 100644 --- a/kleidicv/src/filters/gaussian_blur_api.cpp +++ b/kleidicv/src/filters/gaussian_blur_api.cpp @@ -11,8 +11,9 @@ KLEIDICV_MULTIVERSION_C_API( KLEIDICV_SVE2_IMPL_IF(kleidicv::sve2::gaussian_blur_stripe_u8), &kleidicv::sme2::gaussian_blur_stripe_u8); -namespace kleidicv { -static kleidicv_error_t gaussian_blur_u8( +extern "C" { + +kleidicv_error_t kleidicv_gaussian_blur_u8( const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels, size_t kernel_width, size_t kernel_height, float sigma_x, float sigma_y, @@ -21,7 +22,5 @@ static kleidicv_error_t gaussian_blur_u8( src, src_stride, dst, dst_stride, width, height, 0, height, channels, kernel_width, kernel_height, sigma_x, sigma_y, border_type, context); } -} // namespace kleidicv -KLEIDICV_MULTIVERSION_C_API(kleidicv_gaussian_blur_u8, - &kleidicv::gaussian_blur_u8, nullptr, nullptr); +} // extern "C" diff --git a/kleidicv/src/filters/separable_filter_2d_api.cpp b/kleidicv/src/filters/separable_filter_2d_api.cpp index 028a66f01f9ee27e8ef228fe8c9e7c9bf23bc020..555b722af0761fe81d1556ff711489b3dd0cdd38 100644 --- a/kleidicv/src/filters/separable_filter_2d_api.cpp +++ b/kleidicv/src/filters/separable_filter_2d_api.cpp @@ -7,6 +7,12 @@ #include "kleidicv/kleidicv.h" #include "kleidicv/workspace/separable.h" +KLEIDICV_MULTIVERSION_C_API( + kleidicv_separable_filter_2d_stripe_u8, + &kleidicv::neon::separable_filter_2d_stripe_u8, + KLEIDICV_SVE2_IMPL_IF(kleidicv::sve2::separable_filter_2d_stripe_u8), + &kleidicv::sme2::separable_filter_2d_stripe_u8); + extern "C" { using KLEIDICV_TARGET_NAMESPACE::Rectangle; @@ -56,16 +62,7 @@ kleidicv_error_t kleidicv_filter_context_release( return KLEIDICV_OK; } -} // extern "C" - -KLEIDICV_MULTIVERSION_C_API( - kleidicv_separable_filter_2d_stripe_u8, - &kleidicv::neon::separable_filter_2d_stripe_u8, - KLEIDICV_SVE2_IMPL_IF(kleidicv::sve2::separable_filter_2d_stripe_u8), - &kleidicv::sme2::separable_filter_2d_stripe_u8); - -namespace kleidicv { -static kleidicv_error_t separable_filter_2d_u8( +kleidicv_error_t kleidicv_separable_filter_2d_u8( const uint8_t *src, size_t src_stride, uint8_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels, const uint8_t *kernel_x, size_t kernel_width, const uint8_t *kernel_y, size_t kernel_height, @@ -74,8 +71,5 @@ static kleidicv_error_t separable_filter_2d_u8( src, src_stride, dst, dst_stride, width, height, 0, height, channels, kernel_x, kernel_width, kernel_y, kernel_height, border_type, context); } -} // namespace kleidicv -KLEIDICV_MULTIVERSION_C_API(kleidicv_separable_filter_2d_u8, - &kleidicv::separable_filter_2d_u8, nullptr, - nullptr); +} // extern "C" diff --git a/kleidicv/src/filters/sobel_api.cpp b/kleidicv/src/filters/sobel_api.cpp index 02f4724b01b56519ed0a92bb229345a4007b841c..ca0218e470b66c2a2c2fc4a51744f756ad9f90fa 100644 --- a/kleidicv/src/filters/sobel_api.cpp +++ b/kleidicv/src/filters/sobel_api.cpp @@ -17,24 +17,19 @@ KLEIDICV_DEFINE_C_API(kleidicv_sobel_3x3_horizontal_stripe_s16_u8, KLEIDICV_DEFINE_C_API(kleidicv_sobel_3x3_vertical_stripe_s16_u8, sobel_3x3_vertical_stripe_s16_u8); -namespace kleidicv { -static kleidicv_error_t sobel_3x3_horizontal_s16_u8( +extern "C" { + +kleidicv_error_t kleidicv_sobel_3x3_horizontal_s16_u8( const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels) { return kleidicv_sobel_3x3_horizontal_stripe_s16_u8( src, src_stride, dst, dst_stride, width, height, 0, height, channels); } -static kleidicv_error_t sobel_3x3_vertical_s16_u8( +kleidicv_error_t kleidicv_sobel_3x3_vertical_s16_u8( const uint8_t *src, size_t src_stride, int16_t *dst, size_t dst_stride, size_t width, size_t height, size_t channels) { return kleidicv_sobel_3x3_vertical_stripe_s16_u8( src, src_stride, dst, dst_stride, width, height, 0, height, channels); } -} // namespace kleidicv -KLEIDICV_MULTIVERSION_C_API(kleidicv_sobel_3x3_horizontal_s16_u8, - &kleidicv::sobel_3x3_horizontal_s16_u8, nullptr, - nullptr); -KLEIDICV_MULTIVERSION_C_API(kleidicv_sobel_3x3_vertical_s16_u8, - &kleidicv::sobel_3x3_vertical_s16_u8, nullptr, - nullptr); +} // extern "C"