diff options
-rw-r--r-- | README | 4 | ||||
-rw-r--r-- | en_masse-template.c | 32 | ||||
-rw-r--r-- | libcolour.7.in | 4 | ||||
-rw-r--r-- | libcolour_convert.3 | 9 | ||||
-rw-r--r-- | libcolour_convert_en_masse.3 | 147 |
5 files changed, 181 insertions, 15 deletions
@@ -224,6 +224,10 @@ FUNCTIONS libcolour_convert(3) Colour space and colour model conversion. + libcolour_convert_en_masse(3) + Colour space and colour model conversion for many + colours. + libcolour_srgb_encode(3) Apply the sRGB transfer function. diff --git a/en_masse-template.c b/en_masse-template.c index 127d766..7869d23 100644 --- a/en_masse-template.c +++ b/en_masse-template.c @@ -26,9 +26,9 @@ libcolour_convert_en_masse(const libcolour_colour_t *from, const libcolour_colou int on_cpu = mode & LIBCOLOUR_CONVERT_EN_MASSE_ON_CPU; int no_override = mode & LIBCOLOUR_CONVERT_EN_MASSE_NO_OVERRIDE; va_list args; - TYPE *in1, *in2, *in3; - TYPE *out1, *out2, *out3; - size_t width; + TYPE *in1, *in2, *in3, *in_alpha = NULL; + TYPE *out1, *out2, *out3, *out_alpha = NULL; + size_t width, i; if ((unsigned int)mode > 15U) { errno = EINVAL; @@ -47,15 +47,16 @@ libcolour_convert_en_masse(const libcolour_colour_t *from, const libcolour_colou in3 = in1 + 2; width = 3; } else if (alpha_mode == LIBCOLOUR_CONVERT_EN_MASSE_ALPHA_FIRST) { - in1 = va_arg(args, TYPE *); - in2 = in1 + 2; - in3 = in1 + 3; - in1 = in1 + 1; + in_alpha = va_arg(args, TYPE *); + in1 = in_alpha + 1; + in2 = in_alpha + 2; + in3 = in_alpha + 3; width = 4; } else if (alpha_mode == LIBCOLOUR_CONVERT_EN_MASSE_ALPHA_LAST) { in1 = va_arg(args, TYPE *); in2 = in1 + 1; in3 = in1 + 2; + in_alpha = in1 + 3; width = 4; } else { in1 = va_arg(args, TYPE *); @@ -73,14 +74,15 @@ libcolour_convert_en_masse(const libcolour_colour_t *from, const libcolour_colou out2 = out1 + 1; out3 = out1 + 2; } else if (alpha_mode == LIBCOLOUR_CONVERT_EN_MASSE_ALPHA_FIRST) { - out1 = va_arg(args, TYPE *); - out2 = out1 + 2; - out3 = out1 + 3; - out1 = out1 + 1; + out_alpha = va_arg(args, TYPE *); + out1 = out_alpha + 1; + out2 = out_alpha + 2; + out3 = out_alpha + 3; } else if (alpha_mode == LIBCOLOUR_CONVERT_EN_MASSE_ALPHA_LAST) { out1 = va_arg(args, TYPE *); out2 = out1 + 1; out3 = out1 + 2; + out_alpha = out1 + 3; } else { out1 = va_arg(args, TYPE *); out2 = va_arg(args, TYPE *); @@ -107,6 +109,14 @@ libcolour_convert_en_masse(const libcolour_colour_t *from, const libcolour_colou return -1; } + if (in_alpha != out_alpha) { + for (i = 0; i < n; i++) { + *out_alpha = *in_alpha; + in_alpha += width; + out_alpha += width; + } + } + while (n--) { tfrom.rgb.R = *in1; tfrom.rgb.G = *in2; diff --git a/libcolour.7.in b/libcolour.7.in index 2e0d385..57e2b40 100644 --- a/libcolour.7.in +++ b/libcolour.7.in @@ -366,6 +366,10 @@ Philips TL83, Ultralume 30. .BR libcolour_convert (3) Colour space and colour model conversion. .TP +.BR libcolour_convert_en_masse (3) +Colour space and colour model conversion +for many colours. +.TP .BR libcolour_srgb_encode (3) Apply the sRGB transfer function. .TP diff --git a/libcolour_convert.3 b/libcolour_convert.3 index 1dccc0a..ca9d598 100644 --- a/libcolour_convert.3 +++ b/libcolour_convert.3 @@ -14,9 +14,9 @@ int \fBlibcolour_convert_llf\fP(const libcolour_colour_llf_t *restrict \fIfrom\f #define \fBlibcolour_convert\fP(\fIfrom\fP, \fIto\fP)\\ (_Generic((\fIfrom\fP),\\ - libcolour_colour_f_t *: \fBlibcolour_convert_f\fP(\fIcolour\fP),\\ - libcolour_colour_lf_t *: \fBlibcolour_convert_lf\fP(\fIcolour\fP),\\ - libcolour_colour_llf_t *: \fBlibcolour_convert_llf\fP(\fIcolour\fP))) + libcolour_colour_f_t *: \fBlibcolour_convert_f\fP(\fIfrom\fP, \fIto\fP),\\ + libcolour_colour_lf_t *: \fBlibcolour_convert_lf\fP(\fIfrom\fP, \fIto\fP),\\ + libcolour_colour_llf_t *: \fBlibcolour_convert_llf\fP(\fIfrom\fP, \fIto\fP))) /* list is incomplete */ .fi .SH DESCRIPTION @@ -57,7 +57,8 @@ and .I to most use the same floating-point type. .SH SEE ALSO -.BR libcolour (7) +.BR libcolour (7), +.BR libcolour_convert_en_masse (3) .SH AUTHORS Mattias Andrée .RI < maandree@kth.se > diff --git a/libcolour_convert_en_masse.3 b/libcolour_convert_en_masse.3 new file mode 100644 index 0000000..011013a --- /dev/null +++ b/libcolour_convert_en_masse.3 @@ -0,0 +1,147 @@ +.TH LIBCOLOUR_CONVERT_EN_MASSE 3 libcolour +.SH NAME +libcolour_convert_en_masse - Colour space and colour model conversion for many colours +.SH SYNOPSIS +.nf +#include <libcolour.h> + +int \fBlibcolour_convert_en_masse_f\fP(const libcolour_colour_f_t *restrict \fIfrom\fP, + const libcolour_colour_f_t *restrict \fIto\fP, + libcolour_convert_en_masse_mode_t \fImode\fP, + size_t \fIn\fP, ...); +int \fBlibcolour_convert_en_masse_lf\fP(const libcolour_colour_lf_t *restrict \fIfrom\fP, + const libcolour_colour_lf_t *restrict \fIto\fP, + libcolour_convert_en_masse_mode_t \fImode\fP, + size_t \fIn\fP, ...); +int \fBlibcolour_convert_en_masse_llf\fP(const libcolour_colour_llf_t *restrict \fIfrom\fP, + const libcolour_colour_llf_t *restrict \fIto\fP, + libcolour_convert_en_masse_mode_t \fImode\fP, + size_t \fIn\fP, ...); + +#define \fBlibcolour_convert_en_masse\fP(\fIfrom\fP, \fIto\fP, \fImode\fP, \fIn\fP, ...)\\ + (_Generic((\fIfrom\fP),\\ + const libcolour_colour_f_t *:\\ + \fBlibcolour_convert_en_masse_f\fP(\fIfrom\fP, \fIto\fP, \fImode\fP, \fIn\fP, __VA_ARGS__),\\ + const libcolour_colour_lf_t *:\\ + \fBlibcolour_convert_en_masse_lf\fP(\fIfrom\fP, \fIto\fP, \fImode\fP, \fIn\fP, __VA_ARGS__),\\ + const libcolour_colour_llf_t *:\\ + \fBlibcolour_convert_en_masse_llf\fP(\fIfrom\fP, \fIto\fP, \fImode\fP, \fIn\fP, __VA_ARGS__))) + /* list is incomplete */ +.fi +.SH DESCRIPTION +.B libcolour_convert_en_masse +and its non-generic functions converts +.I n +colours from the colour space and transfer function +specified in +.I from +to the colour space and transfer function specified in +.IR to . +.I mode +specifies the behaviour of the functions. It shall +be the +.B OR +the any, or none, of the following values: +.TP +.B LIBCOLOUR_CONVERT_EN_MASSE_ON_CPU +Perform convertion on CPU rather than on GPU. +.TP +.B LIBCOLOUR_CONVERT_EN_MASSE_NO_OVERRIDE +Output parameters are listed after input parameters, +rather than using the input parametrs as the +output parameters. These will have the same type +as the input parameters. +.P +and one of the following values: +.TP +.B LIBCOLOUR_CONVERT_EN_MASSE_NO_ALPHA +The parameter after +.I n +is +.BR float\ * , +.BR double\ * , +or +.BR long\ double\ * , +depending of the which function is called. +The argument shall be the values of the colour, +without any alpha channel, repeated +.I n +times (once per colour). +For example, if +.BI ( from->model ==LIBCOLOUR_RGB) +and if +.BI ( n ==2) +the values in the pointer shall be +.BI { colour[0].red , +.IB colour[0].green , +.IB colour[0].blue , +.IB colour[1].red , +.IB colour[1].green , +.IB colour[1].blue } +for an imaginary +.BR libcolour_rgb_f_t \ \fIcolour[2]\fP, +.BR libcolour_rgb_lf_t \ \fIcolour[2]\fP, +or +.BR libcolour_rgb_llf_t \ \fIcolour[2]\fP, +depending on which function is called. +.TP +.B LIBCOLOUR_CONVERT_EN_MASSE_ALPHA_FIRST +Same as +.BR LIBCOLOUR_CONVERT_EN_MASSE_NO_ALPHA , +except before each red channel value (in the +case of RGB that is, the first channel value in +general) there is an alpha channel value that +will not be modified. +.TP +.B LIBCOLOUR_CONVERT_EN_MASSE_ALPHA_LAST +Same as +.BR LIBCOLOUR_CONVERT_EN_MASSE_NO_ALPHA , +except after each blue channel value (in the +case of RGB that is, the last cannel value in +general) there is an alpha channel value that +will not be modified. +.TP +.B LIBCOLOUR_CONVERT_EN_MASSE_SEPARATED +After the parameter +.I n +there is one parameter per channel, these +parameters are of the type +.BR float\ * , +.BR double\ * , +or +.BR long\ double\ * , +depending of the which function is called. +Each parameter shall be a pointer with +.I n +elements, one per colour to convert. +.SH RETURN VALUES +Upon successful completion, the functions returns 0. +Otherwise the function return -1 with +.I errno +set to indicate the error. +.SH ERRORS +.TP +.B EINVAL +.I from->model +or +.I to->model +does not refer to a recognised colour model. +.SH NOTES +.B libcolour_convert_en_masse +cannot convert between +.BR float , +.BR double , +and +.BR long\ double , +.I from +and +.I to +most use the same floating-point type. +.P +GPU acceleration is currently not implemented. +.SH SEE ALSO +.BR libcolour (7), +.BR libcolour_convert (3) +.SH AUTHORS +Mattias Andrée +.RI < maandree@kth.se > |