diff options
-rw-r--r-- | src/modules/asc/asc.c | 43 |
1 files changed, 39 insertions, 4 deletions
diff --git a/src/modules/asc/asc.c b/src/modules/asc/asc.c index 2d50021..bdb482e 100644 --- a/src/modules/asc/asc.c +++ b/src/modules/asc/asc.c @@ -7,6 +7,8 @@ #include "til.h" #include "til_fb.h" #include "til_module_context.h" +#include "til_stream.h" +#include "til_tap.h" #include "txt/txt.h" @@ -16,8 +18,6 @@ * replace with something a more visually interesting font/style. * * TODO: - * - Wire up taps for the x/y coordinates, making this a handy taps diagnostic - * * - Maybe add a dynamic justification mode where the h/v alignment offsets are * just the inverse of the normalized x/y coordinates. This requires extending * libs/txt to support precise offsetting when rendering as an alternative to the @@ -45,10 +45,38 @@ typedef struct asc_setup_t { typedef struct asc_context_t { til_module_context_t til_module_context; + struct { + til_tap_t x, y; + } taps; + + struct { + float x, y; + } vars; + + float *x, *y; + txt_t *txt; } asc_context_t; +static void asc_update_taps(asc_context_t *ctxt, til_stream_t *stream) +{ + if (!til_stream_tap_context(stream, &ctxt->til_module_context, NULL, &ctxt->taps.x)) + *ctxt->x = ((asc_setup_t *)ctxt->til_module_context.setup)->x; + else + ctxt->vars.x = *ctxt->x; + + if (!til_stream_tap_context(stream, &ctxt->til_module_context, NULL, &ctxt->taps.y)) + *ctxt->y = ((asc_setup_t *)ctxt->til_module_context.setup)->y; + else + ctxt->vars.y = *ctxt->y; + + /* XXX: maybe clamp to -1.0..+1.0 ? It's not a crash risk since txt_render_fragment() + * clips to the fragment by using ...put_pixel_checked() *shrug* + */ +} + + static til_module_context_t * asc_create_context(const til_module_t *module, til_stream_t *stream, unsigned seed, unsigned ticks, unsigned n_cpus, til_setup_t *setup) { asc_context_t *ctxt; @@ -61,6 +89,11 @@ static til_module_context_t * asc_create_context(const til_module_t *module, til if (!ctxt->txt) return til_module_context_free(&ctxt->til_module_context); + ctxt->taps.x = til_tap_init_float(ctxt, &ctxt->x, 1, &ctxt->vars.x, "x"); + ctxt->taps.y = til_tap_init_float(ctxt, &ctxt->y, 1, &ctxt->vars.y, "y"); + + asc_update_taps(ctxt, stream); + return &ctxt->til_module_context; } @@ -71,11 +104,13 @@ static void asc_render_fragment(til_module_context_t *context, til_stream_t *str asc_setup_t *s = (asc_setup_t *)context->setup; til_fb_fragment_t *fragment = *fragment_ptr; + asc_update_taps(ctxt, stream); + til_fb_fragment_clear(fragment); txt_render_fragment(ctxt->txt, fragment, 0xffffffff, - s->x * ((float)fragment->frame_width) * .5f + .5f * ((float)fragment->frame_width), - s->y * ((float)fragment->frame_height) * .5f + .5f * ((float)fragment->frame_height), + ctxt->vars.x * ((float)fragment->frame_width) * .5f + .5f * ((float)fragment->frame_width), + ctxt->vars.y * ((float)fragment->frame_height) * .5f + .5f * ((float)fragment->frame_height), (txt_align_t){ .horiz = s->halign, .vert = s->valign |