void ui_waveform_render(){ rect_t r; rect_origin(&layout.waveform.rect, &r); SDL_FillRect(waveform_surface, &r, SDL_MapRGB(waveform_surface->format, 30, 30, 30)); #define MAX(a, b) ((a > b) ? a : b) int h; SDL_Color c; if(skip < 1) skip = 1; for(int j = 0; j < N_WF_BINS; j++){ float * history = waveform_bins[j].history; int hptr = waveform_bins[j].hptr; hptr -= hptr % skip; c = waveform_bins[j].color; for(int i = 0; i < layout.waveform.w; i++) { float x = 0.; for(int k = 0; k < skip; k++){ hptr--; if(hptr < 0) hptr = WAVEFORM_HISTORY_SIZE; x = MAX(x, history[hptr]); } h = x * layout.waveform.h; vlineRGBA(waveform_surface, layout.waveform.w - i, (layout.waveform.h + h) / 2, (layout.waveform.h - h) / 2, c.r, c.g, c.b, 255); } } for(int i = 0; i < layout.waveform.w; i++){ char l = 0; for(int k = 0; k < skip; k++){ l = l | beat_lines[i * skip + k]; } if(l & 1) vlineRGBA(waveform_surface, layout.waveform.w - i, layout.waveform.y, layout.waveform.h, 128, 255, 0, 200); if(l & 2) vlineRGBA(waveform_surface, layout.waveform.w - i, layout.waveform.y, layout.waveform.h, 255, 128, 0, 200); if(l & 4) vlineRGBA(waveform_surface, layout.waveform.w - i, layout.waveform.y, layout.waveform.h, 255, 0, 0, 200); } }
// Update the bed shape from the dialog fields. void BedShapePanel::update_shape() { auto page_idx = m_shape_options_book->GetSelection(); if (page_idx == SHAPE_RECTANGULAR) { Vec2d rect_size(Vec2d::Zero()); Vec2d rect_origin(Vec2d::Zero()); try{ rect_size = boost::any_cast<Vec2d>(m_optgroups[SHAPE_RECTANGULAR]->get_value("rect_size")); } catch (const std::exception & /* e */) { return; } try { rect_origin = boost::any_cast<Vec2d>(m_optgroups[SHAPE_RECTANGULAR]->get_value("rect_origin")); } catch (const std::exception & /* e */) { return; } auto x = rect_size(0); auto y = rect_size(1); // empty strings or '-' or other things if (x == 0 || y == 0) return; double x0 = 0.0; double y0 = 0.0; double x1 = x; double y1 = y; auto dx = rect_origin(0); auto dy = rect_origin(1); x0 -= dx; x1 -= dx; y0 -= dy; y1 -= dy; m_canvas->m_bed_shape = { Vec2d(x0, y0), Vec2d(x1, y0), Vec2d(x1, y1), Vec2d(x0, y1)}; } else if(page_idx == SHAPE_CIRCULAR) { double diameter; try{ diameter = boost::any_cast<double>(m_optgroups[SHAPE_CIRCULAR]->get_value("diameter")); } catch (const std::exception & /* e */) { return; } if (diameter == 0.0) return ; auto r = diameter / 2; auto twopi = 2 * PI; auto edges = 60; std::vector<Vec2d> points; for (size_t i = 1; i <= 60; ++i) { auto angle = i * twopi / edges; points.push_back(Vec2d(r*cos(angle), r*sin(angle))); } m_canvas->m_bed_shape = points; } // $self->{on_change}->(); update_preview(); }