Browse Source

fix graph curve drawing

master
Alexandros Theodotou 3 years ago
parent
commit
20229c3e26
Signed by: alex
GPG Key ID: 022EAE42313D70F3
  1. 257
      src/zlfo_ui.c

257
src/zlfo_ui.c

@ -1012,108 +1012,14 @@ add_bot_buttons ( @@ -1012,108 +1012,14 @@ add_bot_buttons (
self->app, (ZtkWidget *) control, 2);
}
/**
* Draws the graphs in curve mode.
*/
static void
mid_region_bg_draw_cb (
ZtkWidget * widget,
cairo_t * cr,
ZLfoUi * self)
draw_graph_curves (
ZLfoUi * self,
cairo_t * cr)
{
/* set background */
zlfo_ui_theme_set_cr_color (cr, selected_bg);
cairo_rectangle (
cr, widget->rect.x, widget->rect.y,
widget->rect.width, widget->rect.height);
cairo_fill (cr);
/* draw grid */
for (int i = 0; i < 9; i++)
{
if ((i % 4) == 0)
{
zlfo_ui_theme_set_cr_color (
cr, grid_strong);
}
else
{
zlfo_ui_theme_set_cr_color (
cr, grid);
}
cairo_move_to (
cr,
widget->rect.x + GRID_HPADDING +
i * GRID_SPACE,
widget->rect.y + GRID_YSTART_OFFSET);
cairo_line_to (
cr,
widget->rect.x + GRID_HPADDING +
i * GRID_SPACE,
widget->rect.y + GRID_YEND_OFFSET);
cairo_stroke (cr);
}
zlfo_ui_theme_set_cr_color (
cr, grid_strong);
cairo_move_to (
cr,
GRID_XSTART_GLOBAL,
widget->rect.y + 105);
cairo_line_to (
cr,
GRID_XEND_GLOBAL,
widget->rect.y + 105);
cairo_stroke (cr);
/*#if 0*/
/* draw current position */
double total_space = GRID_WIDTH;
double current_offset =
(double) self->common.current_sample /
(double) self->common.period_size;
#if 0
ztk_message (
"current_sample %ld, period size %ld",
self->current_sample, self->period_size);
#endif
cairo_move_to (
cr,
widget->rect.x + GRID_HPADDING +
current_offset * total_space,
widget->rect.y + 46);
cairo_line_to (
cr,
widget->rect.x + GRID_HPADDING +
current_offset * total_space,
widget->rect.y + 164);
cairo_stroke (cr);
/*#endif*/
float sync_rate_float =
sync_rate_to_float (
self->sync_rate,
self->sync_rate_type);
/**
* Effective frequency.
*
* This is either the free-running frequency,
* or the frequency corresponding to the current
* sync rate.
*/
float effective_freq =
get_effective_freq (
self->freerun, self->freq,
&self->common.host_pos, sync_rate_float);
recalc_vars (
self->freerun,
&self->common.sine_multiplier,
&self->common.saw_multiplier,
&self->common.period_size,
&self->common.current_sample,
&self->common.host_pos, effective_freq,
sync_rate_float,
(float) self->common.samplerate);
/* draw other visible waves in the back */
double max_range =
MAX (self->range_max, self->range_min);
double min_range =
@ -1123,8 +1029,12 @@ mid_region_bg_draw_cb ( @@ -1123,8 +1029,12 @@ mid_region_bg_draw_cb (
cairo_set_source_rgba (
cr, zlfo_ui_theme.line.red,
zlfo_ui_theme.line.green,
zlfo_ui_theme.line.blue, 0.3);
cairo_set_line_width (cr, 3);
zlfo_ui_theme.line.blue, 1);
cairo_set_line_cap (cr, CAIRO_LINE_CAP_ROUND);
cairo_set_line_width (cr, 6);
double prev_draw_sine,
prev_draw_triangle,
prev_draw_saw, prev_draw_square;
for (int i = 0; i < GRID_WIDTH; i++)
{
/* from 0 to GRID_WIDTH */
@ -1191,18 +1101,22 @@ mid_region_bg_draw_cb ( @@ -1191,18 +1101,22 @@ mid_region_bg_draw_cb (
* in cairo */ \
draw_val = GRID_HEIGHT - draw_val; \
\
/* draw line */ \
cairo_move_to ( \
cr, \
widget->rect.x + GRID_HPADDING + i, \
widget->rect.y + GRID_YSTART_OFFSET + \
draw_val); \
cairo_line_to ( \
cr, \
widget->rect.x + GRID_HPADDING + i + 1, \
widget->rect.y + GRID_YSTART_OFFSET + \
draw_val + 1); \
cairo_stroke (cr)
if (i != 0) \
{ \
/* draw line */ \
cairo_move_to ( \
cr, \
GRID_XSTART_GLOBAL + i - 1, \
GRID_YSTART_GLOBAL + \
prev_draw_##val); \
cairo_line_to ( \
cr, \
GRID_XSTART_GLOBAL + i, \
GRID_YSTART_GLOBAL + \
draw_val); \
cairo_stroke (cr); \
} \
prev_draw_##val = draw_val
/* calculate sine */
double sine =
@ -1274,6 +1188,117 @@ mid_region_bg_draw_cb ( @@ -1274,6 +1188,117 @@ mid_region_bg_draw_cb (
}
}
static void
mid_region_bg_draw_cb (
ZtkWidget * widget,
cairo_t * cr,
ZLfoUi * self)
{
/* set background */
zlfo_ui_theme_set_cr_color (cr, selected_bg);
cairo_rectangle (
cr, widget->rect.x, widget->rect.y,
widget->rect.width, widget->rect.height);
cairo_fill (cr);
/* draw grid */
for (int i = 0; i < 9; i++)
{
if ((i % 4) == 0)
{
zlfo_ui_theme_set_cr_color (
cr, grid_strong);
}
else
{
zlfo_ui_theme_set_cr_color (
cr, grid);
}
cairo_move_to (
cr,
widget->rect.x + GRID_HPADDING +
i * GRID_SPACE,
widget->rect.y + GRID_YSTART_OFFSET);
cairo_line_to (
cr,
widget->rect.x + GRID_HPADDING +
i * GRID_SPACE,
widget->rect.y + GRID_YEND_OFFSET);
cairo_stroke (cr);
}
zlfo_ui_theme_set_cr_color (
cr, grid_strong);
cairo_move_to (
cr,
GRID_XSTART_GLOBAL,
widget->rect.y + 105);
cairo_line_to (
cr,
GRID_XEND_GLOBAL,
widget->rect.y + 105);
cairo_stroke (cr);
/*#if 0*/
/* draw current position */
double total_space = GRID_WIDTH;
double current_offset =
(double) self->common.current_sample /
(double) self->common.period_size;
#if 0
ztk_message (
"current_sample %ld, period size %ld",
self->current_sample, self->period_size);
#endif
cairo_move_to (
cr,
widget->rect.x + GRID_HPADDING +
current_offset * total_space,
widget->rect.y + 46);
cairo_line_to (
cr,
widget->rect.x + GRID_HPADDING +
current_offset * total_space,
widget->rect.y + 164);
cairo_stroke (cr);
/*#endif*/
float sync_rate_float =
sync_rate_to_float (
self->sync_rate,
self->sync_rate_type);
/**
* Effective frequency.
*
* This is either the free-running frequency,
* or the frequency corresponding to the current
* sync rate.
*/
float effective_freq =
get_effective_freq (
self->freerun, self->freq,
&self->common.host_pos, sync_rate_float);
recalc_vars (
self->freerun,
&self->common.sine_multiplier,
&self->common.saw_multiplier,
&self->common.period_size,
&self->common.current_sample,
&self->common.host_pos, effective_freq,
sync_rate_float,
(float) self->common.samplerate);
/* draw other visible waves in the back */
if (self->step_mode)
{
}
else
{
draw_graph_curves (self, cr);
}
}
static void
mid_region_bg_update_cb (
ZtkWidget * w,
@ -1875,13 +1900,13 @@ add_grid_controls ( @@ -1875,13 +1900,13 @@ add_grid_controls (
case GRID_BTN_HMIRROR:
rect.x =
start + padding + width + padding +
68;
69;
rect.width = 40;
break;
case GRID_BTN_VMIRROR:
rect.x =
start + padding + width + padding +
110;
111;
rect.width = 40;
break;
default:

Loading…
Cancel
Save