aboutsummaryrefslogtreecommitdiffstats
path: root/src/blind-time-blur.c
diff options
context:
space:
mode:
authorMattias Andrée <maandree@kth.se>2017-05-07 16:11:31 +0200
committerMattias Andrée <maandree@kth.se>2017-05-07 16:11:31 +0200
commit4df594b3f48679f594e6f738981cb3baca8a42d9 (patch)
tree6d25bcd5ce62af2537687eff9cce67fa197ec65d /src/blind-time-blur.c
parentBump version to 1.1 (diff)
downloadblind-4df594b3f48679f594e6f738981cb3baca8a42d9.tar.gz
blind-4df594b3f48679f594e6f738981cb3baca8a42d9.tar.bz2
blind-4df594b3f48679f594e6f738981cb3baca8a42d9.tar.xz
Add support for floats
Signed-off-by: Mattias Andrée <maandree@kth.se>
Diffstat (limited to '')
-rw-r--r--src/blind-time-blur.c64
1 files changed, 39 insertions, 25 deletions
diff --git a/src/blind-time-blur.c b/src/blind-time-blur.c
index c5d9ee5..702b280 100644
--- a/src/blind-time-blur.c
+++ b/src/blind-time-blur.c
@@ -9,36 +9,48 @@ USAGE("alpha-stream")
static int first = 1;
+#define PROCESS(TYPE)\
+ do {\
+ typedef TYPE pixel_t[4];\
+ pixel_t *restrict clr = (pixel_t *)cbuf;\
+ pixel_t *restrict alf = (pixel_t *)abuf;\
+ pixel_t *img = (pixel_t *)output;\
+ size_t i, n = cn / sizeof(pixel_t);\
+ TYPE a1, a2;\
+ \
+ if (first) {\
+ memcpy(output, cbuf, cn);\
+ first = 0;\
+ return;\
+ }\
+ \
+ for (i = 0; i < n; i++, clr++, alf++, img++) {\
+ a1 = (*img)[3];\
+ a2 = (*clr)[3] * (*alf)[1] * (*alf)[3];\
+ a1 *= (1 - a2);\
+ (*img)[0] = (*img)[0] * a1 + (*clr)[0] * a2;\
+ (*img)[1] = (*img)[1] * a1 + (*clr)[1] * a2;\
+ (*img)[2] = (*img)[2] * a1 + (*clr)[2] * a2;\
+ (*img)[3] = a1 + a2;\
+ }\
+ \
+ (void) colour;\
+ (void) alpha;\
+ (void) an;\
+ } while (0)
+
static void
process_xyza(char *output, char *restrict cbuf, char *restrict abuf,
struct stream *colour, struct stream *alpha, size_t cn, size_t an)
{
- typedef double pixel_t[4];
- pixel_t *restrict clr = (pixel_t *)cbuf;
- pixel_t *restrict alf = (pixel_t *)abuf;
- pixel_t *img = (pixel_t *)output;
- size_t i, n = cn / sizeof(pixel_t);
- double a1, a2;
-
- if (first) {
- memcpy(output, cbuf, cn);
- first = 0;
- return;
- }
-
- for (i = 0; i < n; i++, clr++, alf++, img++) {
- a1 = (*img)[3];
- a2 = (*clr)[3] * (*alf)[1] * (*alf)[3];
- a1 *= (1 - a2);
- (*img)[0] = (*img)[0] * a1 + (*clr)[0] * a2;
- (*img)[1] = (*img)[1] * a1 + (*clr)[1] * a2;
- (*img)[2] = (*img)[2] * a1 + (*clr)[2] * a2;
- (*img)[3] = a1 + a2;
- }
+ PROCESS(double);
+}
- (void) colour;
- (void) alpha;
- (void) an;
+static void
+process_xyzaf(char *output, char *restrict cbuf, char *restrict abuf,
+ struct stream *colour, struct stream *alpha, size_t cn, size_t an)
+{
+ PROCESS(float);
}
int
@@ -61,6 +73,8 @@ main(int argc, char *argv[])
if (!strcmp(colour.pixfmt, "xyza"))
process = process_xyza;
+ else if (!strcmp(colour.pixfmt, "xyza f"))
+ process = process_xyzaf;
else
eprintf("pixel format %s is not supported, try xyza\n", colour.pixfmt);