feat: translucent area fill under the in/out plot traces
Draw a translucent area from each level line down to the plot baseline so the input and output traces read more clearly. The gain-reduction trace stays a plain line (it hangs from the 0 dB line, where a fill would read oddly). Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
+18
-4
@@ -167,18 +167,32 @@ pub(super) fn draw(ui: &mut egui::Ui, meters: &Meters, state: &mut PlotState) {
|
|||||||
let c = state.selected.min(NUM_CHANNELS - 1);
|
let c = state.selected.min(NUM_CHANNELS - 1);
|
||||||
let (write, len) = (state.history.write, state.history.len);
|
let (write, len) = (state.history.write, state.history.len);
|
||||||
if len >= 2 {
|
if len >= 2 {
|
||||||
let draw_series = |series: &[f32; PLOT_N], to_db: &dyn Fn(f32) -> f32, color: Color32| {
|
let draw_series = |series: &[f32; PLOT_N], to_db: &dyn Fn(f32) -> f32, color: Color32, fill: bool| {
|
||||||
let mut pts = Vec::with_capacity(len);
|
let mut pts = Vec::with_capacity(len);
|
||||||
for k in 0..len {
|
for k in 0..len {
|
||||||
let idx = (write + PLOT_N - len + k) % PLOT_N;
|
let idx = (write + PLOT_N - len + k) % PLOT_N;
|
||||||
let pos = (PLOT_N - len + k) as f32 / (PLOT_N - 1) as f32; // newest hugs the right
|
let pos = (PLOT_N - len + k) as f32 / (PLOT_N - 1) as f32; // newest hugs the right
|
||||||
pts.push(pos2(left + pos * width, y_for_db(to_db(series[idx]))));
|
pts.push(pos2(left + pos * width, y_for_db(to_db(series[idx]))));
|
||||||
}
|
}
|
||||||
|
if fill {
|
||||||
|
// Translucent area from the line down to the bottom of the plot.
|
||||||
|
let mut area = Vec::with_capacity(pts.len() + 2);
|
||||||
|
area.push(pos2(pts[0].x, bottom));
|
||||||
|
area.extend_from_slice(&pts);
|
||||||
|
area.push(pos2(pts[pts.len() - 1].x, bottom));
|
||||||
|
let fill_col = Color32::from_rgba_unmultiplied(color.r(), color.g(), color.b(), 40);
|
||||||
|
p.add(egui::Shape::Path(egui::epaint::PathShape {
|
||||||
|
points: area,
|
||||||
|
closed: true,
|
||||||
|
fill: fill_col,
|
||||||
|
stroke: egui::epaint::PathStroke::NONE,
|
||||||
|
}));
|
||||||
|
}
|
||||||
p.add(egui::Shape::line(pts, Stroke::new(1.5, color)));
|
p.add(egui::Shape::line(pts, Stroke::new(1.5, color)));
|
||||||
};
|
};
|
||||||
draw_series(&state.history.in_db[c], &|db| db, COLOR_IN);
|
draw_series(&state.history.in_db[c], &|db| db, COLOR_IN, true);
|
||||||
draw_series(&state.history.out_db[c], &|db| db, COLOR_OUT);
|
draw_series(&state.history.out_db[c], &|db| db, COLOR_OUT, true);
|
||||||
// GR hangs from the 0 dB line: a reduction of X dB is drawn at the -X gridline.
|
// GR hangs from the 0 dB line: a reduction of X dB is drawn at the -X gridline.
|
||||||
draw_series(&state.history.gr_db[c], &|gr| -gr, COLOR_GR);
|
draw_series(&state.history.gr_db[c], &|gr| -gr, COLOR_GR, false);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user