aboutsummaryrefslogtreecommitdiffstats
path: root/libglitter_compose_uint64.c
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--libglitter_compose_uint64.c65
1 files changed, 23 insertions, 42 deletions
diff --git a/libglitter_compose_uint64.c b/libglitter_compose_uint64.c
index fdb9b62..91d6b88 100644
--- a/libglitter_compose_uint64.c
+++ b/libglitter_compose_uint64.c
@@ -1,9 +1,8 @@
/* See LICENSE file for copyright and license details. */
-#include "libglitter.h"
+#include "common.h"
#define ONLY_INT_COMPATIBLE
#define double uint64_t
#include "libglitter_compose_double.c"
-#include <alloca.h>
#ifdef greater_t
# define MIX(A, B) (((greater_t)(A) + (greater_t)(B)) >> 1)
#else
@@ -13,40 +12,24 @@
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, size_t widthmul, size_t heightmul,
- const uint8_t *restrict cellmap)
+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)
{
size_t y, x, output_y, output_i, input_blanking;
- uint8_t channel;
- size_t cells[3][2];
- size_t cellsi[3] = {0, 0, 0};
+ size_t cell00 = render_ctx->cells[0][0], cell01 = render_ctx->cells[0][1];
+ size_t cell10 = render_ctx->cells[1][0], cell11 = render_ctx->cells[1][1];
+ size_t cell20 = render_ctx->cells[2][0], cell21 = render_ctx->cells[2][1];
output_rowsize *= output_cellsize;
- input_blanking = input_rowsize * heightmul - width * widthmul;
-
- for (y = 0; y < heightmul; y++) {
- for (x = 0; x < widthmul; x++) {
- channel = cellmap[y * widthmul + x];
- cells[channel][cellsi[channel]] = y * input_rowsize + x;
- cellsi[channel] += 1;
- }
- }
- if (cellsi[0] == 1)
- cells[0][1] = cells[0][0];
- if (cellsi[1] == 1)
- cells[1][1] = cells[1][0];
- if (cellsi[2] == 1)
- cells[2][1] = cells[2][0];
+ input_blanking = input_rowsize * render_ctx->heightmul - width * render_ctx->widthmul;
for (y = 0, output_y = 0; y < height; y++, output_y += output_rowsize) {
for (x = 0, output_i = output_y; x < width; x++, output_i += output_cellsize) {
- outputs[0][output_i] = (uint64_t)MIX(input[cells[0][0]], input[cells[0][1]]);
- outputs[1][output_i] = (uint64_t)MIX(input[cells[0][0]], input[cells[0][1]]);
- outputs[2][output_i] = (uint64_t)MIX(input[cells[0][0]], input[cells[0][1]]);
- input = &input[widthmul];
+ outputs[0][output_i] = (uint64_t)MIX(input[cell00], input[cell01]);
+ outputs[1][output_i] = (uint64_t)MIX(input[cell10], input[cell11]);
+ outputs[2][output_i] = (uint64_t)MIX(input[cell20], input[cell21]);
+ input = &input[render_ctx->widthmul];
}
input = &input[input_blanking];
}
@@ -82,7 +65,7 @@ generic(uint64_t **outputs, size_t noutputs, const uint64_t *restrict input,
}
for (i = 0; i < noutputs; i++)
- outputs[i][output_i] = (uint64_t)(pixel[channel] / (greater_t)ncellvalues[i]);
+ outputs[i][output_i] = (uint64_t)(pixel[i] / (greater_t)ncellvalues[i]);
input = &input[widthmul];
}
@@ -92,20 +75,18 @@ generic(uint64_t **outputs, size_t noutputs, const uint64_t *restrict input,
void
-libglitter_compose_uint64(uint64_t **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)
+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)
{
- if (noutputs == 3 && widthmul == 3 && heightmul == 1) {
- vstrips(outputs, input, output_rowsize, output_cellsize, input_rowsize, width, height, cellmap);
- } else if (noutputs == 3 && widthmul == 1 && heightmul == 3) {
- hstrips(outputs, input, output_rowsize, output_cellsize, input_rowsize, width, height, cellmap);
- } else if (noutputs == 3 && ncellvalues[0] <= 2 && ncellvalues[1] <= 2 && ncellvalues[2] <= 2) {
- simple(outputs, input, output_rowsize, output_cellsize, input_rowsize,
- width, height, widthmul, heightmul, cellmap);
+ if (render_ctx->render_method == RENDER_METHOD_VSTRIPS) {
+ vstrips(outputs, input, output_rowsize, output_cellsize, render_ctx->rowsize, width, height, render_ctx->cellmap);
+ } else if (render_ctx->render_method == RENDER_METHOD_HSTRIPS) {
+ hstrips(outputs, input, output_rowsize, output_cellsize, render_ctx->rowsize, width, height, render_ctx->cellmap);
+ } else if (render_ctx->render_method == RENDER_METHOD_SIMPLE) {
+ simple(outputs, input, output_rowsize, output_cellsize, render_ctx->rowsize, width, height, render_ctx);
} else {
- generic(outputs, noutputs, input, output_rowsize, output_cellsize,
- input_rowsize, width, height, widthmul, heightmul, cellmap, ncellvalues);
+ generic(outputs, render_ctx->noutputs, input, output_rowsize, output_cellsize,
+ render_ctx->rowsize, width, height, render_ctx->widthmul, render_ctx->heightmul,
+ render_ctx->cellmap, render_ctx->ncellvalues);
}
}