diff options
| author | Vito Caputo <vcaputo@pengaru.com> | 2025-11-10 23:51:36 -0800 |
|---|---|---|
| committer | Vito Caputo <vcaputo@pengaru.com> | 2025-11-10 23:51:36 -0800 |
| commit | 04c62d3a534a36271cd3e4339b1ddd37e6ea72ff (patch) | |
| tree | 68bcd0b73acead0c7779575563d9e6d5fe8e205f /src | |
| parent | d852e4ff2b16aae4b900074c1117789e350a512e (diff) | |
vcr: method for marking global boundary at phase
This draws a vertical dashed line at the current phase across the
entire height into the specified layer
Diffstat (limited to 'src')
| -rw-r--r-- | src/vcr.c | 61 | ||||
| -rw-r--r-- | src/vcr.h | 1 |
2 files changed, 61 insertions, 1 deletions
@@ -102,7 +102,8 @@ typedef struct vcr_backend_t { snowflakes_text_fill, grapha_fill, graphb_fill, - finish_fill; + finish_fill, + boundary_fill; } xlib; #endif /* USE_XLIB */ struct { @@ -347,6 +348,9 @@ static vcr_backend_t * vcr_backend_xlib_setup(vcr_backend_t *vbe, vwm_xserver_t vbe->xlib.finish_fill = create_picture(xserver, 1, 2, 32, CPRepeat, &pa_repeat, NULL); XRenderFillRectangle(xserver->display, PictOpSrc, vbe->xlib.finish_fill, &chart_visible_color, 0, 0, 1, 1); XRenderFillRectangle(xserver->display, PictOpSrc, vbe->xlib.finish_fill, &chart_trans_color, 0, 1, 1, 1); + vbe->xlib.boundary_fill = create_picture(xserver, 1, 8, 32, CPRepeat, &pa_repeat, NULL); + XRenderFillRectangle(xserver->display, PictOpSrc, vbe->xlib.boundary_fill, &chart_visible_color, 0, 0, 1, 4); + XRenderFillRectangle(xserver->display, PictOpSrc, vbe->xlib.boundary_fill, &chart_trans_color, 0, 4, 1, 4); return vbe; @@ -523,6 +527,7 @@ vcr_backend_t * vcr_backend_free(vcr_backend_t *vbe) XRenderFreePicture(vbe->xlib.xserver->display, vbe->xlib.grapha_fill); XRenderFreePicture(vbe->xlib.xserver->display, vbe->xlib.graphb_fill); XRenderFreePicture(vbe->xlib.xserver->display, vbe->xlib.finish_fill); + XRenderFreePicture(vbe->xlib.xserver->display, vbe->xlib.boundary_fill); XFreeFont(vbe->xlib.xserver->display, vbe->xlib.chart_font); XFreeGC(vbe->xlib.xserver->display, vbe->xlib.text_gc); @@ -1295,6 +1300,60 @@ void vcr_mark_finish_line(vcr_t *vcr, vcr_layer_t layer, int row) } +/* marks a boundary in layer for all rows @ current phase */ +void vcr_mark_boundary(vcr_t *vcr, vcr_layer_t layer) +{ + assert(vcr); + assert(vcr->backend); + /* FIXME: the layers in backend/vcr etc should be in a layer-indexable array */ + assert(layer == VCR_LAYER_GRAPHA || layer == VCR_LAYER_GRAPHB); + + switch (vcr->backend->type) { +#ifdef USE_XLIB + case VCR_BACKEND_TYPE_XLIB: { + vwm_xserver_t *xserver = vcr->backend->xlib.xserver; + Picture dest; + + switch (layer) { + case VCR_LAYER_GRAPHA: + dest = vcr->xlib.grapha_picture; + break; + case VCR_LAYER_GRAPHB: + dest = vcr->xlib.graphb_picture; + break; + default: + assert(0); + } + + assert(xserver); + + XRenderComposite(xserver->display, PictOpSrc, vcr->backend->xlib.boundary_fill, None, dest, + 0, 0, /* src x, y */ + 0, 0, /* mask x, y */ + vcr->phase, 0, /* dst x, y */ + 1, vcr->height); + + break; + } +#endif /* USE_XLIB */ + + case VCR_BACKEND_TYPE_MEM: { + uint8_t mask = (0x1 << layer) << ((vcr->phase & 0x1) << 2); + uint8_t *p; + + p = &vcr->mem.bits[(vcr->phase >> 1)]; + for (int i = 0; i < vcr->height; i++, p += vcr->mem.pitch) + *p = ((*p & ~mask) | (mask * ((i >> 2) & 0x1))); + + break; + } + + default: + assert(0); + } +} + + /* draw a bar at the current phase into the specified layer of height pixels * * the only layers supported right now are grapha/graphb @@ -81,6 +81,7 @@ int vcr_resize_visible(vcr_t *vcr, int width, int height); void vcr_draw_text(vcr_t *vcr, vcr_layer_t layer, vcr_text_flags_t flags, int x, int row, const vcr_str_t *strs, int n_strs, int *res_width); void vcr_draw_ortho_line(vcr_t *vcr, vcr_layer_t layer, int x1, int y1, int x2, int y2); void vcr_mark_finish_line(vcr_t *vcr, vcr_layer_t layer, int row); +void vcr_mark_boundary(vcr_t *vcr, vcr_layer_t layer); void vcr_draw_bar(vcr_t *vcr, vcr_layer_t layer, vcr_bar_base_t base, int row, int height); void vcr_clear_row(vcr_t *vcr, vcr_layer_t layer, int row, int x, int width); void vcr_shift_below_row_up_one(vcr_t *vcr, int row); |
