static bool expose_event(RobWidget* handle, cairo_t* cr, cairo_rectangle_t *ev) { SFSUI* ui = (SFSUI*)GET_HANDLE(handle); if (ui->update_grid) { update_grid(ui); ui->update_grid = false; } if (ui->clear_persistence) { cairo_t* crx; crx = cairo_create (ui->sf_dat); rounded_rectangle (crx, SS_BORDER, SS_BORDER, SS_SIZE, SS_SIZE, SS_BORDER); cairo_set_source_rgba(crx, 0, 0, 0, 1.0); cairo_fill(crx); cairo_destroy(crx); ui->clear_persistence = false; } if (pthread_mutex_trylock (&ui->fft_lock) == 0 ) { if (robtk_cbtn_get_active(ui->btn_oct)) { plot_data_oct(ui); } else { plot_data_fft(ui); } pthread_mutex_unlock (&ui->fft_lock); } cairo_rectangle (cr, ev->x, ev->y, ev->width, ev->height); cairo_clip (cr); cairo_set_source_surface(cr, ui->sf_ann, 0, 0); cairo_paint (cr); cairo_set_operator (cr, CAIRO_OPERATOR_ADD); cairo_set_source_surface(cr, ui->sf_dat, 0, 0); cairo_paint (cr); return TRUE; }
/* main drawing callback */ static bool expose_event(RobWidget* handle, cairo_t* cr, cairo_rectangle_t *ev) { MF2UI* ui = (MF2UI*)GET_HANDLE(handle); if (ui->update_grid) { ui->width = floor(ui->scale * 2 * (PH_RAD + XOFF)); ui->height = floor(ui->scale * 2 * (PH_RAD + YOFF)); m0_create_surfaces(ui); update_grid(ui); ui->update_grid = false; } cairo_translate(cr, rint((ui->m0_width - ui->width) * .5), rint((ui->m0_height - ui->height) * .5)); if (pthread_mutex_trylock (&ui->fft_lock) == 0 ) { if (robtk_cbtn_get_active(ui->btn_oct)) { plot_data_oct(ui); } else { plot_data_fft(ui); } pthread_mutex_unlock (&ui->fft_lock); } cairo_rectangle (cr, ev->x, ev->y, ev->width, ev->height); cairo_clip (cr); cairo_set_source_surface(cr, ui->sf_ann, 0, 0); cairo_paint (cr); cairo_set_operator (cr, CAIRO_OPERATOR_ADD); cairo_set_source_surface(cr, ui->sf_dat, 0, 0); cairo_paint (cr); return TRUE; }