From 575e3ad31dd8ccf2afdd5c8a8d2dbf8d57241c5d Mon Sep 17 00:00:00 2001 From: Mattias Andrée Date: Sat, 28 Jan 2023 09:19:05 +0100 Subject: Fix warnings, add restrict, and add function attributes MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Signed-off-by: Mattias Andrée --- libglitter.h | 108 ++++++++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 78 insertions(+), 30 deletions(-) (limited to 'libglitter.h') diff --git a/libglitter.h b/libglitter.h index 27dfd0d..d285104 100644 --- a/libglitter.h +++ b/libglitter.h @@ -6,6 +6,25 @@ #include +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic push +# pragma GCC diagnostic ignored "-Wpadded" +#elif defined(__clang__) +# pragma clang diagnostic push +# pragma clang diagnostic ignored "-Wpadded" +# pragma clang diagnostic ignored "-Wdocumentation" +# pragma clang diagnostic ignored "-Wvla" +#endif + + + +#if defined(__GNUC__) && !defined(__clang__) +# define LIBGLITTER_GCC_ATTRS__(...) __attribute__((__VA_ARGS__)) +#else +# define LIBGLITTER_GCC_ATTRS__(...) +#endif + + /** * The application will use `double`-typed rasters */ @@ -146,6 +165,13 @@ enum libglitter_colour { int libglitter_enable_acceleration(uint64_t, int, void (*)(int, int, void *), void *, void *); +/** + * Deallocates a render context (created by `libglitter_create_render_context`) + * + * @param this The render context to deallocate + */ +void libglitter_free_render_context(LIBGLITTER_RENDER_CONTEXT *); + /** * Create a render context for an input raster's specifications * @@ -175,6 +201,7 @@ int libglitter_enable_acceleration(uint64_t, int, void (*)(int, int, void *), vo * * The returned object will contain references to `cellmap` and `ncellvalues` */ +LIBGLITTER_GCC_ATTRS__(nonnull, warn_unused_result, malloc, malloc(libglitter_free_render_context, 1)) LIBGLITTER_RENDER_CONTEXT *libglitter_create_render_context(size_t, size_t, size_t, size_t, const uint8_t *, const uint8_t *); @@ -189,13 +216,6 @@ LIBGLITTER_RENDER_CONTEXT *libglitter_create_render_context(size_t, size_t, size */ void libglitter_update_render_context(LIBGLITTER_RENDER_CONTEXT *, size_t); -/** - * Deallocates a render context (created by `libglitter_create_render_context`) - * - * @param this The render context to deallocate - */ -void libglitter_free_render_context(LIBGLITTER_RENDER_CONTEXT *); - /** * Create one raster per monitor colour from a raster of @@ -221,16 +241,18 @@ void libglitter_free_render_context(LIBGLITTER_RENDER_CONTEXT *); * @param render_ctx Rendering context created for the input raster's * specification */ -void libglitter_compose_double(double **, const double *restrict, size_t, size_t, - size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *); +LIBGLITTER_GCC_ATTRS__(nonnull) +void libglitter_compose_double(double *restrict*, const double *restrict, size_t, size_t, + size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *restrict); /** * This value is identical to `libglitter_compose_double`, * apart from it parameter types, see `libglitter_compose_double` * for details about this function */ -void libglitter_compose_float(float **, const float *restrict, size_t, size_t, - size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *); +LIBGLITTER_GCC_ATTRS__(nonnull) +void libglitter_compose_float(float *restrict*, const float *restrict, size_t, size_t, + size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *restrict); /** * Create one raster per monitor colour from a raster of @@ -256,32 +278,36 @@ void libglitter_compose_float(float **, const float *restrict, size_t, size_t, * @param render_ctx Rendering context created for the input raster's * specification */ -void libglitter_compose_uint64(uint64_t **, const uint64_t *restrict, size_t, size_t, - size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *); +LIBGLITTER_GCC_ATTRS__(nonnull) +void libglitter_compose_uint64(uint64_t *restrict *, const uint64_t *restrict, size_t, size_t, + size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *restrict); /** * This value is identical to `libglitter_compose_uint64`, * apart from it parameter types, see `libglitter_compose_uint64` * for details about this function */ -void libglitter_compose_uint32(uint32_t **, const uint32_t *restrict, size_t, size_t, - size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *); +LIBGLITTER_GCC_ATTRS__(nonnull) +void libglitter_compose_uint32(uint32_t *restrict *, const uint32_t *restrict, size_t, size_t, + size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *restrict); /** * This value is identical to `libglitter_compose_uint64`, * apart from it parameter types, see `libglitter_compose_uint64` * for details about this function */ -void libglitter_compose_uint16(uint16_t **, const uint16_t *restrict, size_t, size_t, - size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *); +LIBGLITTER_GCC_ATTRS__(nonnull) +void libglitter_compose_uint16(uint16_t *restrict *, const uint16_t *restrict, size_t, size_t, + size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *restrict); /** * This value is identical to `libglitter_compose_uint64`, * apart from it parameter types, see `libglitter_compose_uint64` * for details about this function */ -void libglitter_compose_uint8(uint8_t **, const uint8_t *restrict, size_t, size_t, - size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *); +LIBGLITTER_GCC_ATTRS__(nonnull) +void libglitter_compose_uint8(uint8_t *restrict *, const uint8_t *restrict, size_t, size_t, + size_t, size_t, const LIBGLITTER_RENDER_CONTEXT *restrict); /** @@ -305,6 +331,7 @@ void libglitter_compose_uint8(uint8_t **, const uint8_t *restrict, size_t, size_ * * The values `colour1`, `colour2`, `colour3` must be valid but distinct */ +LIBGLITTER_GCC_ATTRS__(nonnull) void libglitter_reorder_rasters(void **, enum libglitter_colour, enum libglitter_colour, enum libglitter_colour); @@ -322,6 +349,7 @@ void libglitter_reorder_rasters(void **, enum libglitter_colour, enum libglitter * @param blue The value `0xFFFF` shifted such that value * expresses pure blue (closest primary colour) */ +LIBGLITTER_GCC_ATTRS__(nonnull(1, 3)) void libglitter_split_uint64_raster(uint16_t *[3], uint16_t **, uint64_t *, uint64_t, uint64_t, uint64_t); /** @@ -338,6 +366,7 @@ void libglitter_split_uint64_raster(uint16_t *[3], uint16_t **, uint64_t *, uint * @param blue The value `0xFF` shifted such that value * expresses pure blue (closest primary colour) */ +LIBGLITTER_GCC_ATTRS__(nonnull(1, 3)) void libglitter_split_uint32_raster(uint8_t *[3], uint8_t **, uint32_t *, uint32_t, uint32_t, uint32_t); @@ -365,14 +394,18 @@ void libglitter_split_uint32_raster(uint8_t *[3], uint8_t **, uint32_t *, uint32 * each subpixel colour; or `NULL` for the sRGB values * (this is only allowed if there are exactly 3 rasters) */ -void libglitter_desaturate_double(double **, size_t, size_t, size_t, size_t, size_t, double, const double *restrict); +LIBGLITTER_GCC_ATTRS__(nonnull(1)) +void libglitter_desaturate_double(double *restrict *, size_t, size_t, size_t, size_t, size_t, + double, const double *restrict); /** * This value is identical to `libglitter_desaturate_double`, * apart from it parameter types, see `libglitter_desaturate_double` * for details about this function */ -void libglitter_desaturate_float(float **, size_t, size_t, size_t, size_t, size_t, float, const float *restrict); +LIBGLITTER_GCC_ATTRS__(nonnull(1)) +void libglitter_desaturate_float(float *restrict *, size_t, size_t, size_t, size_t, size_t, + float, const float *restrict); /** * Transform rasters from fully using subpixel rendering to @@ -398,7 +431,8 @@ void libglitter_desaturate_float(float **, size_t, size_t, size_t, size_t, size_ * each subpixel colour; or `NULL` for the sRGB values * (this is only allowed if there are exactly 3 rasters) */ -void libglitter_per_channel_desaturate_double(double **, size_t, size_t, size_t, size_t, size_t, +LIBGLITTER_GCC_ATTRS__(nonnull(1, 7)) +void libglitter_per_channel_desaturate_double(double *restrict *, size_t, size_t, size_t, size_t, size_t, const double *restrict, const double *restrict); /** @@ -406,7 +440,8 @@ void libglitter_per_channel_desaturate_double(double **, size_t, size_t, size_t, * apart from it parameter types, see `libglitter_per_channel_desaturate_double` * for details about this function */ -void libglitter_per_channel_desaturate_float(float **, size_t, size_t, size_t, size_t, size_t, +LIBGLITTER_GCC_ATTRS__(nonnull(1, 7)) +void libglitter_per_channel_desaturate_float(float *restrict *, size_t, size_t, size_t, size_t, size_t, const float *restrict, const float *restrict); @@ -443,18 +478,20 @@ void libglitter_per_channel_desaturate_float(float **, size_t, size_t, size_t, s * `white_x, white_y, white_Y` (it expands to three arguments) * if the output's whitepoint is the D65 illuminant */ +LIBGLITTER_GCC_ATTRS__(nonnull(1)) void libglitter_get_colour_model_conversion_matrix_double(double[3][3], double, double, double, double, double, double, double, double, double, int, - double *, double *, double *); + double *restrict, double *restrict, double *restrict); /** * This value is identical to `libglitter_get_colour_model_conversion_matrix_double`, * apart from it parameter types, see `libglitter_get_colour_model_conversion_matrix_double` * for details about this function */ +LIBGLITTER_GCC_ATTRS__(nonnull(1)) void libglitter_get_colour_model_conversion_matrix_float(float[3][3], float, float, float, float, float, float, float, float, float, int, - float *, float *, float *); + float *restrict, float *restrict, float *restrict); /** @@ -486,17 +523,28 @@ void libglitter_get_colour_model_conversion_matrix_float(float[3][3], float, flo * @param height The vertical number of pixels in the rasters * @param matrix Colour model conversion matrix, in column-major order */ -void libglitter_colour_model_convert_rasters_double(size_t n, size_t m, double **, const double **, size_t, - size_t, size_t, size_t, size_t, size_t, const double[m][n]); +LIBGLITTER_GCC_ATTRS__(nonnull(3, 4, 11)) +void libglitter_colour_model_convert_rasters_double(size_t, size_t m, double *restrict *restrict, + const double *restrict *restrict, size_t, size_t, + size_t, size_t, size_t, size_t, const double (*)[m]); /** * This value is identical to `libglitter_colour_model_convert_rasters_double`, * apart from it parameter types, see `libglitter_colour_model_convert_rasters_double` * for details about this function */ -void libglitter_colour_model_convert_rasters_float(size_t n, size_t m, float **, const float **, size_t, - size_t, size_t, size_t, size_t, size_t, const float[m][n]); +LIBGLITTER_GCC_ATTRS__(nonnull(3, 4, 11)) +void libglitter_colour_model_convert_rasters_float(size_t, size_t m, float *restrict *restrict, + const float *restrict *restrict, size_t, size_t, + size_t, size_t, size_t, size_t, const float (*)[m]); + +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic pop +#elif defined(__clang__) +# pragma clang diagnostic pop +#endif + +#undef LIBGLITTER_GCC_ATTRS__ #endif -/* TODO add `restrict` where appropriate */ -- cgit v1.2.3-70-g09d2