diff options
| author | Vito Caputo <vcaputo@pengaru.com> | 2025-11-05 21:15:53 -0800 |
|---|---|---|
| committer | Vito Caputo <vcaputo@pengaru.com> | 2025-11-05 23:45:38 -0800 |
| commit | 19bd3dd8a6ce18b54cfcea69a0724fe9da8a7543 (patch) | |
| tree | c1f64a2c0f90e37158cc2a4bede603bcdde63548 | |
| parent | 766710c1d5a8c02ed625b7dc36c6c948eb020fd0 (diff) | |
vcr: add flags for vcr_draw_text()
The current code assumes clipping text to the backend's
bounds.
I'd like to enable sticking text in the graph layers, which
really needs to support wrapping to Just Work, because of how the
graph layers are unwrapped @ present to keep the incremental
rendering of the graphs efficient.
So here let's treat the existing code as the clipped mode.
Future commits will implement the wrapped mode.
| -rw-r--r-- | src/charts.c | 6 | ||||
| -rw-r--r-- | src/vcr.c | 3 | ||||
| -rw-r--r-- | src/vcr.h | 7 |
3 files changed, 11 insertions, 5 deletions
diff --git a/src/charts.c b/src/charts.c index 30eca06..eadfc01 100644 --- a/src/charts.c +++ b/src/charts.c @@ -457,7 +457,7 @@ static void print_argv(const vwm_charts_t *charts, const vwm_chart_t *chart, int assert(chart); proc_argv2strs(proc, strs, NELEMS(strs), &n_strs); - vcr_draw_text(chart->vcr, VCR_LAYER_TEXT, x, row, strs, n_strs, res_width); + vcr_draw_text(chart->vcr, VCR_LAYER_TEXT, VCR_TEXT_FLAGS_CLIPPED, x, row, strs, n_strs, res_width); } @@ -800,7 +800,7 @@ static void draw_row_columns(vwm_charts_t *charts, vwm_chart_t *chart, vwm_row_c int str_width, xpos; /* get the width first, so we can place the text, note the -1 to suppress drawings */ - vcr_draw_text(chart->vcr, VCR_LAYER_TEXT, -1 /* x */, -1 /* row */, strs, 1, &str_width); + vcr_draw_text(chart->vcr, VCR_LAYER_TEXT, VCR_TEXT_FLAGS_CLIPPED, -1 /* x */, -1 /* row */, strs, 1, &str_width); if (uniform && str_width > c->width) { c->width = str_width; chart->redraw_needed++; @@ -838,7 +838,7 @@ static void draw_row_columns(vwm_charts_t *charts, vwm_chart_t *chart, vwm_row_c assert(0); } - vcr_draw_text(chart->vcr, VCR_LAYER_TEXT, xpos, row, strs, 1, NULL); + vcr_draw_text(chart->vcr, VCR_LAYER_TEXT, VCR_TEXT_FLAGS_CLIPPED, xpos, row, strs, 1, NULL); } if (advance) { @@ -944,7 +944,7 @@ int vcr_resize_visible(vcr_t *vcr, int width, int height) * x may be negative or extend outside vcr bounds, clipping will be performed as needed. */ /* XXX: maybe these strs should also include lengths instead of being null-terminated */ -void vcr_draw_text(vcr_t *vcr, vcr_layer_t layer, int x, int row, const vcr_str_t *strs, int n_strs, int *res_width) +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) { assert(vcr); assert(vcr->backend); @@ -952,6 +952,7 @@ void vcr_draw_text(vcr_t *vcr, vcr_layer_t layer, int x, int row, const vcr_str_ assert(row >= 0 || res_width); assert(strs); assert(n_strs > 0); + assert(flags < VCR_TEXT_FLAGS_CNT); /* FIXME: this should really be able to draw text into any valid layer, * it's just the pictures/pixmaps in vcr_t aren't currently organized as an * array easily indexed by the layer enum. TODO @@ -44,6 +44,11 @@ typedef enum vcr_bar_base_t { VCR_BAR_BASE_CNT } vcr_bar_base_t; +typedef enum vcr_text_flags_t { + VCR_TEXT_FLAGS_CLIPPED, + VCR_TEXT_FLAGS_CNT +} vcr_text_flags_t; + typedef struct vcr_backend_t vcr_backend_t; typedef struct vcr_dest_t vcr_dest_t; typedef struct vcr_t vcr_t; @@ -72,7 +77,7 @@ vcr_dest_t * vcr_dest_free(vcr_dest_t *dest); vcr_t * vcr_new(vcr_backend_t *vbe, int *hierarchy_end_ptr, int *snowflakes_cnt_ptr, const unsigned *marker_distance_ptr); vcr_t * vcr_free(vcr_t *vcr); int vcr_resize_visible(vcr_t *vcr, int width, int height); -void vcr_draw_text(vcr_t *vcr, vcr_layer_t layer, int x, int row, const vcr_str_t *strs, int n_strs, int *res_width); +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_draw_bar(vcr_t *vcr, vcr_layer_t layer, vcr_bar_base_t base, int row, int height); |
