aboutsummaryrefslogtreecommitdiffstats
path: root/en_masse-template.c
diff options
context:
space:
mode:
Diffstat (limited to 'en_masse-template.c')
-rw-r--r--en_masse-template.c32
1 files changed, 21 insertions, 11 deletions
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;