diff options
Diffstat (limited to '')
-rw-r--r-- | common.h | 25 | ||||
-rw-r--r-- | libglitter.h | 108 | ||||
-rw-r--r-- | libglitter_colour_model_convert_rasters_double.c | 22 | ||||
-rw-r--r-- | libglitter_compose_double.c | 14 | ||||
-rw-r--r-- | libglitter_compose_uint64.c | 10 | ||||
-rw-r--r-- | libglitter_create_render_context.c | 3 | ||||
-rw-r--r-- | libglitter_desaturate_double.c | 23 | ||||
-rw-r--r-- | libglitter_enable_acceleration.c | 18 | ||||
-rw-r--r-- | libglitter_get_colour_model_conversion_matrix_double.c | 19 | ||||
-rw-r--r-- | libglitter_per_channel_desaturate_double.c | 8 | ||||
-rw-r--r-- | libglitter_split_uint64_raster.c | 18 |
11 files changed, 164 insertions, 104 deletions
@@ -12,6 +12,21 @@ #include <string.h> +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic ignored "-Wunsuffixed-float-constants" +# pragma GCC diagnostic ignored "-Wunused-macros" +# pragma GCC diagnostic ignored "-Wpadded" +#elif defined(__clang__) +# pragma clang diagnostic ignored "-Wunused-macros" +# pragma clang diagnostic ignored "-Wkeyword-macro" +# pragma clang diagnostic ignored "-Walloca" +# pragma clang diagnostic ignored "-Wdisabled-macro-expansion" +# pragma clang diagnostic ignored "-Wcomma" +# pragma clang diagnostic ignored "-Wpadded" +# pragma clang diagnostic ignored "-Wvla" +#endif + + #define RENDER_METHOD_VSTRIPS 0 #define RENDER_METHOD_HSTRIPS 1 #define RENDER_METHOD_SIMPLE 2 @@ -34,6 +49,16 @@ struct libglitter_render_context { #ifdef TEST +#if defined(__GNUC__) && !defined(__clang__) +# pragma GCC diagnostic ignored "-Wfloat-equal" +# pragma GCC diagnostic ignored "-Wfloat-conversion" +# pragma GCC diagnostic ignored "-Wdouble-promotion" +#elif defined(__clang__) +# pragma clang diagnostic ignored "-Wfloat-equal" +# pragma clang diagnostic ignored "-Wdouble-promotion" +# pragma clang diagnostic ignored "-Wimplicit-float-conversion" +#endif + # define ASSERT(ASSERTION)\ do {\ if (!(ASSERTION)) {\ diff --git a/libglitter.h b/libglitter.h index 27dfd0d..d285104 100644 --- a/libglitter.h +++ b/libglitter.h @@ -6,6 +6,25 @@ #include <stdint.h> +#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 */ @@ -147,6 +166,13 @@ int libglitter_enable_acceleration(uint64_t, int, void (*)(int, int, void *), vo /** + * 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 * * Render context's are thread-safe @@ -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 */ diff --git a/libglitter_colour_model_convert_rasters_double.c b/libglitter_colour_model_convert_rasters_double.c index 242a738..dcd9f47 100644 --- a/libglitter_colour_model_convert_rasters_double.c +++ b/libglitter_colour_model_convert_rasters_double.c @@ -4,7 +4,8 @@ static void -multiply_33(double **outputs, size_t opos, const double **inputs, size_t ipos, const double matrix[3][3]) +multiply_33(double *restrict *restrict outputs, size_t opos, + const double *restrict *restrict inputs, size_t ipos, const double matrix[3][3]) { double i0 = inputs[0][ipos], i1 = inputs[1][ipos], i2 = inputs[2][ipos]; outputs[0][opos] = i0 * matrix[0][0] + i1 * matrix[0][1] + i2 * matrix[0][2]; @@ -14,8 +15,9 @@ multiply_33(double **outputs, size_t opos, const double **inputs, size_t ipos, c static void -multiply_nn(size_t n, double **outputs, size_t opos, const double **inputs, size_t ipos, - const double matrix[n][n], double buffer[n]) +multiply_nn(size_t n, double *restrict *restrict outputs, size_t opos, + const double *restrict *restrict inputs, size_t ipos, + const double matrix[n][n], double buffer[restrict n]) { size_t i, j; for (j = 0; j < n; j++) @@ -29,8 +31,9 @@ multiply_nn(size_t n, double **outputs, size_t opos, const double **inputs, size static void -multiply_nm(size_t n, size_t m, double **outputs /* m */, size_t opos, const double **inputs /* n */, - size_t ipos, const double matrix[m][n], double buffer[n]) +multiply_nm(size_t n, size_t m, double *restrict *restrict outputs /* m */, size_t opos, + const double *restrict *restrict inputs /* n */, size_t ipos, + const double matrix[m][n], double buffer[restrict n]) { size_t i, j; for (j = 0; j < n; j++) @@ -44,9 +47,10 @@ multiply_nm(size_t n, size_t m, double **outputs /* m */, size_t opos, const dou void -libglitter_colour_model_convert_rasters_double(size_t n, size_t m, double **outputs /* m */, const double **inputs /* n */, - size_t output_rowsize, size_t output_cellsize, size_t input_rowsize, - size_t input_cellsize, size_t width, size_t height, const double matrix[m][n]) +libglitter_colour_model_convert_rasters_double(size_t n, size_t m, double *restrict *restrict outputs /* m */, + const double *restrict *restrict inputs /* n */, size_t output_rowsize, + size_t output_cellsize, size_t input_rowsize, size_t input_cellsize, + size_t width, size_t height, const double (*matrix)[m] /* n */) { size_t y, x, output_i, input_i, output_blanking, input_blanking; double *buffer; @@ -159,7 +163,7 @@ check(int same_rasters) mat[i][j] = matrix[i][j];\ libglitter_colour_model_convert_rasters_double(NINPUTS, NOUTPUTS, outputs, (void *)inputs,\ same_rasters ? 15 : 14, same_rasters ? 3 : 4,\ - 15, 3, 5, 3, mat);\ + 15, 3, 5, 3, (void *)mat);\ inputs[0] = input1;\ inputs[1] = input2;\ inputs[2] = input3;\ diff --git a/libglitter_compose_double.c b/libglitter_compose_double.c index 0419f4a..8c5cfff 100644 --- a/libglitter_compose_double.c +++ b/libglitter_compose_double.c @@ -4,10 +4,10 @@ static void -vstrips(double **outputs_, const double *restrict input, size_t output_rowsize, size_t output_cellsize, +vstrips(double *restrict *outputs_, const double *restrict input, size_t output_rowsize, size_t output_cellsize, size_t input_rowsize, size_t width, size_t height, const uint8_t *restrict cellmap) { - double *outputs[3]; + double *restrict outputs[3]; size_t y, x, output_y, output_i, input_blanking; outputs[0] = outputs_[cellmap[0]]; @@ -31,10 +31,10 @@ vstrips(double **outputs_, const double *restrict input, size_t output_rowsize, static void -hstrips(double **outputs_, const double *restrict input, size_t output_rowsize, size_t output_cellsize, +hstrips(double *restrict *outputs_, const double *restrict input, size_t output_rowsize, size_t output_cellsize, size_t input_rowsize, size_t width, size_t height, const uint8_t *restrict cellmap) { - double *outputs[3]; + double *restrict outputs[3]; size_t y, x, output_y, output_i, input_blanking; outputs[0] = outputs_[cellmap[0]]; @@ -61,7 +61,7 @@ hstrips(double **outputs_, const double *restrict input, size_t output_rowsize, static void -generic(double **outputs, size_t noutputs, const double *restrict input, +generic(double *restrict *outputs, size_t noutputs, const double *restrict input, size_t output_rowsize, size_t output_cellsize, size_t input_rowsize, size_t width, size_t height, size_t widthmul, size_t heightmul, const uint8_t *restrict cellmap, const double *restrict cellweights) @@ -96,8 +96,8 @@ generic(double **outputs, size_t noutputs, const double *restrict input, void -libglitter_compose_double(double **outputs, const double *restrict input, size_t output_rowsize, size_t output_cellsize, - size_t width, size_t height, const LIBGLITTER_RENDER_CONTEXT *render_ctx) +libglitter_compose_double(double *restrict *outputs, const double *restrict input, size_t output_rowsize, size_t output_cellsize, + size_t width, size_t height, const LIBGLITTER_RENDER_CONTEXT *restrict render_ctx) { if (render_ctx->render_method == RENDER_METHOD_VSTRIPS) { vstrips(outputs, input, output_rowsize, output_cellsize, render_ctx->rowsize, width, height, render_ctx->cellmap); diff --git a/libglitter_compose_uint64.c b/libglitter_compose_uint64.c index 323f10b..67ad096 100644 --- a/libglitter_compose_uint64.c +++ b/libglitter_compose_uint64.c @@ -14,8 +14,8 @@ static void -simple(uint64_t **outputs, const uint64_t *restrict input, size_t output_rowsize, size_t output_cellsize, - size_t input_rowsize, size_t width, size_t height, const LIBGLITTER_RENDER_CONTEXT *render_ctx) +simple(uint64_t *restrict *outputs, const uint64_t *restrict input, size_t output_rowsize, size_t output_cellsize, + size_t input_rowsize, size_t width, size_t height, const LIBGLITTER_RENDER_CONTEXT *restrict render_ctx) { size_t y, x, output_y, output_i, input_blanking; size_t cell00 = render_ctx->cells[0][0], cell01 = render_ctx->cells[0][1]; @@ -39,7 +39,7 @@ simple(uint64_t **outputs, const uint64_t *restrict input, size_t output_rowsize static void -generic(uint64_t **outputs, size_t noutputs, const uint64_t *restrict input, +generic(uint64_t *restrict *outputs, size_t noutputs, const uint64_t *restrict input, size_t output_rowsize, size_t output_cellsize, size_t input_rowsize, size_t width, size_t height, size_t widthmul, size_t heightmul, const uint8_t *restrict cellmap, const uint8_t *restrict ncellvalues) @@ -77,8 +77,8 @@ generic(uint64_t **outputs, size_t noutputs, const uint64_t *restrict input, void -libglitter_compose_uint64(uint64_t **outputs, const uint64_t *restrict input, size_t output_rowsize, size_t output_cellsize, - size_t width, size_t height, const LIBGLITTER_RENDER_CONTEXT *render_ctx) +libglitter_compose_uint64(uint64_t *restrict *outputs, const uint64_t *restrict input, size_t output_rowsize, size_t output_cellsize, + size_t width, size_t height, const LIBGLITTER_RENDER_CONTEXT *restrict render_ctx) { if (render_ctx->render_method == RENDER_METHOD_VSTRIPS) { vstrips(outputs, input, output_rowsize, output_cellsize, render_ctx->rowsize, width, height, render_ctx->cellmap); diff --git a/libglitter_create_render_context.c b/libglitter_create_render_context.c index 9dd7871..63ece5a 100644 --- a/libglitter_create_render_context.c +++ b/libglitter_create_render_context.c @@ -43,7 +43,8 @@ libglitter_create_render_context(size_t noutputs, size_t rowsize, size_t widthmu return this; fail: - libglitter_free_render_context(this); + free(this->cellweights_double); + free(this); return NULL; } diff --git a/libglitter_desaturate_double.c b/libglitter_desaturate_double.c index 0797ddc..2b4c892 100644 --- a/libglitter_desaturate_double.c +++ b/libglitter_desaturate_double.c @@ -3,13 +3,8 @@ #ifndef TEST -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic ignored "-Wunsuffixed-float-constants" -#endif - - void -libglitter_desaturate_double(double **rasters, size_t nrasters, size_t rowsize, size_t cellsize, +libglitter_desaturate_double(double *restrict *rasters, size_t nrasters, size_t rowsize, size_t cellsize, size_t width, size_t height, double saturation, const double *restrict primary_ys) { size_t y, x, ch, raster_y, raster_i; @@ -58,6 +53,7 @@ main(void) double rasters1[4 * 10 * 3][4], *rasters1list[4], primary_ys[4], saturation; double rasters2[4 * 10 * 3][4], *rasters2list[4], saturations[4]; size_t i, j; + int randint; void *randptr = malloc(1); srand((unsigned int)(uintptr_t)randptr); @@ -73,24 +69,27 @@ main(void) for (i = 0; i < 4; i++) {\ rasters1list[i] = rasters1[i];\ rasters2list[i] = rasters2[i];\ - primary_ys[i] = rand() / (double)RAND_MAX;\ - for (j = 0; j < 4 * 10 * 3; j++)\ - rasters1[j][i] = rand() / (double)RAND_MAX;\ + randint = rand();\ + primary_ys[i] = (double)randint / (double)RAND_MAX;\ + for (j = 0; j < 4 * 10 * 3; j++) {\ + randint = rand();\ + rasters1[j][i] = (double)randint / (double)RAND_MAX;\ + }\ }\ memcpy(rasters2, rasters1, sizeof(rasters1));\ } while (0) - RANDOMISE(rand() / (double)RAND_MAX); + RANDOMISE((double)(randint = rand(), randint) / (double)RAND_MAX); libglitter_desaturate_double(rasters1list, 4, 10, 3, 7, 4, saturation, primary_ys); libglitter_per_channel_desaturate_double(rasters2list, 4, 10, 3, 7, 4, saturations, primary_ys); ASSERT(!memcmp(rasters1, rasters2, sizeof(rasters1))); - RANDOMISE(rand() / (double)RAND_MAX); + RANDOMISE((double)(randint = rand(), randint) / (double)RAND_MAX); libglitter_desaturate_double(rasters1list, 3, 10, 3, 7, 4, saturation, primary_ys); libglitter_per_channel_desaturate_double(rasters2list, 3, 10, 3, 7, 4, saturations, primary_ys); ASSERT(!memcmp(rasters1, rasters2, sizeof(rasters1))); - RANDOMISE(rand() / (double)RAND_MAX); + RANDOMISE((double)(randint = rand(), randint) / (double)RAND_MAX); libglitter_desaturate_double(rasters1list, 3, 10, 3, 7, 4, saturation, NULL); libglitter_per_channel_desaturate_double(rasters2list, 3, 10, 3, 7, 4, saturations, NULL); ASSERT(!memcmp(rasters1, rasters2, sizeof(rasters1))); diff --git a/libglitter_enable_acceleration.c b/libglitter_enable_acceleration.c index 5539116..bfa7929 100644 --- a/libglitter_enable_acceleration.c +++ b/libglitter_enable_acceleration.c @@ -45,31 +45,33 @@ callback_null(int ret, int err, void *user) int main(void) { +#define ALL (~UINT64_C(0)) + char data = 'u'; ASSERT(!libglitter_enable_acceleration(0, 0, NULL, NULL, NULL)); ASSERT(!libglitter_enable_acceleration(0, 1, NULL, NULL, NULL)); - ASSERT(!libglitter_enable_acceleration(~0, 0, NULL, NULL, NULL)); - ASSERT(!libglitter_enable_acceleration(~0, 1, NULL, NULL, NULL)); + ASSERT(!libglitter_enable_acceleration(ALL, 0, NULL, NULL, NULL)); + ASSERT(!libglitter_enable_acceleration(ALL, 1, NULL, NULL, NULL)); ASSERT(!libglitter_enable_acceleration(0, 0, NULL, &data, NULL)); ASSERT(!libglitter_enable_acceleration(0, 1, NULL, &data, NULL)); - ASSERT(!libglitter_enable_acceleration(~0, 0, NULL, &data, NULL)); - ASSERT(!libglitter_enable_acceleration(~0, 1, NULL, &data, NULL)); + ASSERT(!libglitter_enable_acceleration(ALL, 0, NULL, &data, NULL)); + ASSERT(!libglitter_enable_acceleration(ALL, 1, NULL, &data, NULL)); ASSERT(callback_calls == 0); ASSERT(!libglitter_enable_acceleration(0, 0, callback, &data, NULL)); ASSERT(callback_calls == 1); ASSERT(!libglitter_enable_acceleration(0, 1, callback, &data, NULL)); ASSERT(callback_calls == 2); - ASSERT(!libglitter_enable_acceleration(~0, 0, callback, &data, NULL)); + ASSERT(!libglitter_enable_acceleration(ALL, 0, callback, &data, NULL)); ASSERT(callback_calls == 3); - ASSERT(!libglitter_enable_acceleration(~0, 1, callback, &data, NULL)); + ASSERT(!libglitter_enable_acceleration(ALL, 1, callback, &data, NULL)); ASSERT(callback_calls == 4); ASSERT(!libglitter_enable_acceleration(0, 0, callback_null, NULL, NULL)); ASSERT(callback_calls == 5); ASSERT(!libglitter_enable_acceleration(0, 1, callback_null, NULL, NULL)); ASSERT(callback_calls == 6); - ASSERT(!libglitter_enable_acceleration(~0, 0, callback_null, NULL, NULL)); + ASSERT(!libglitter_enable_acceleration(ALL, 0, callback_null, NULL, NULL)); ASSERT(callback_calls == 7); - ASSERT(!libglitter_enable_acceleration(~0, 1, callback_null, NULL, NULL)); + ASSERT(!libglitter_enable_acceleration(ALL, 1, callback_null, NULL, NULL)); ASSERT(callback_calls == 8); return 0; } diff --git a/libglitter_get_colour_model_conversion_matrix_double.c b/libglitter_get_colour_model_conversion_matrix_double.c index 13ae07b..127ae10 100644 --- a/libglitter_get_colour_model_conversion_matrix_double.c +++ b/libglitter_get_colour_model_conversion_matrix_double.c @@ -3,12 +3,6 @@ #ifndef TEST -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic push -# pragma GCC diagnostic ignored "-Wunsuffixed-float-constants" -#endif - - /** * CIE XYZ-to-sRGB conversion matrix, * in column-major order @@ -19,11 +13,6 @@ static const double srgb[3][3] = { {-0.498530193022728773666329971093, 0.041556042214430065351304932619, 1.057226567722703292062647051353}}; -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic pop -#endif - - static void eliminate(double m[3][4]) /* row-major order */ { @@ -45,10 +34,9 @@ eliminate(double m[3][4]) /* row-major order */ void -libglitter_get_colour_model_conversion_matrix_double(double matrix[3][3], double c1x, double c1y, - double c2x, double c2y, double c3x, double c3y, - double white_x, double white_y, double white_Y, - int xyz, double *c1Yp, double *c2Yp, double *c3Yp) +libglitter_get_colour_model_conversion_matrix_double(double matrix[3][3], double c1x, double c1y, double c2x, double c2y, + double c3x, double c3y, double white_x, double white_y, double white_Y, + int xyz, double *restrict c1Yp, double *restrict c2Yp, double *restrict c3Yp) { double mat[3][4]; double x1, x2, x3; @@ -116,7 +104,6 @@ libglitter_get_colour_model_conversion_matrix_double(double matrix[3][3], double #define TOLERANCE 0.0001 -#define TOL 4 #define RX 0.412457445582367576708548995157 #define GX 0.357575865245515878143578447634 diff --git a/libglitter_per_channel_desaturate_double.c b/libglitter_per_channel_desaturate_double.c index a9bafb9..85282b6 100644 --- a/libglitter_per_channel_desaturate_double.c +++ b/libglitter_per_channel_desaturate_double.c @@ -3,13 +3,8 @@ #ifndef TEST -#if defined(__GNUC__) && !defined(__clang__) -# pragma GCC diagnostic ignored "-Wunsuffixed-float-constants" -#endif - - void -libglitter_per_channel_desaturate_double(double **rasters, size_t nrasters, size_t rowsize, size_t cellsize, +libglitter_per_channel_desaturate_double(double *restrict *rasters, size_t nrasters, size_t rowsize, size_t cellsize, size_t width, size_t height, const double *restrict saturations, const double *restrict primary_ys) { @@ -54,7 +49,6 @@ libglitter_per_channel_desaturate_double(double **rasters, size_t nrasters, size #define TOLERANCE 0.0001 -#define TOL 4 #define RY 0.212673370378408277403536885686 #define GY 0.715151730491031756287156895269 diff --git a/libglitter_split_uint64_raster.c b/libglitter_split_uint64_raster.c index 75ec90b..bdcd427 100644 --- a/libglitter_split_uint64_raster.c +++ b/libglitter_split_uint64_raster.c @@ -38,15 +38,15 @@ libglitter_split_uint64_raster(uint16_t *rasters[3], uint16_t **alphap, uint64_t static void check(int with_alpha, int r, int g, int b, int a) { - int red_shift = r * sizeof(uint16_t) * 8; - int green_shift = g * sizeof(uint16_t) * 8; - int blue_shift = b * sizeof(uint16_t) * 8; - int alpha_shift = a * sizeof(uint16_t) * 8; - uint16_t full = ~(uint16_t)0; - uint16_t red = (uint16_t)~0 / (uint16_t)0xF * (uint16_t)0x5; - uint16_t green = (uint16_t)~0 / (uint16_t)0xF * (uint16_t)0x8; - uint16_t blue = (uint16_t)~0 / (uint16_t)0xF * (uint16_t)0xA; - uint16_t alpha = (uint16_t)~0 / (uint16_t)0xF * (uint16_t)0x9; + int red_shift = r * (int)sizeof(uint16_t) * 8; + int green_shift = g * (int)sizeof(uint16_t) * 8; + int blue_shift = b * (int)sizeof(uint16_t) * 8; + int alpha_shift = a * (int)sizeof(uint16_t) * 8; + uint16_t full = (uint16_t)~0U; + uint16_t red = (uint16_t)~0U / (uint16_t)0xF * (uint16_t)0x5; + uint16_t green = (uint16_t)~0U / (uint16_t)0xF * (uint16_t)0x8; + uint16_t blue = (uint16_t)~0U / (uint16_t)0xF * (uint16_t)0xA; + uint16_t alpha = (uint16_t)~0U / (uint16_t)0xF * (uint16_t)0x9; uint64_t red_mask = (uint64_t)red << red_shift; uint64_t green_mask = (uint64_t)green << green_shift; uint64_t blue_mask = (uint64_t)blue << blue_shift; |