- // Paint the edges
- const unsigned int edge_count = edges.size() - 2;
- QLineF *const edge_lines = new QLineF[edge_count];
- line = edge_lines;
-
- for (auto i = edges.cbegin() + 1; i != edges.cend() - 1; i++) {
- const float x = ((*i).first / samples_per_pixel -
- pixels_offset) + pp.left();
- *line++ = QLineF(x, high_offset, x, low_offset);
-
- if (show_sampling_points)
- while (sampling_point_sample < (*i).first) {
- const float y = (*i).second ? low_offset : high_offset;
- sampling_points.emplace_back(
- QRectF(sampling_point_x - (w / 2), y - (w / 2), w, w));
- sampling_point_sample++;
- sampling_point_x += pixels_per_sample;
- };
- }
-
- // Calculate the sample points from the last edge to the end of the trace
- if (show_sampling_points)
- while ((uint64_t)sampling_point_sample <= end_sample) {
- // Signal changed after the last edge, so the level is inverted
- const float y = (edges.cend() - 1)->second ? high_offset : low_offset;
- sampling_points.emplace_back(
- QRectF(sampling_point_x - (w / 2), y - (w / 2), w, w));
- sampling_point_sample++;
- sampling_point_x += pixels_per_sample;
- };
-
- p.setPen(LogicSignal::EdgeColour);
- p.drawLines(edge_lines, edge_count);
- delete[] edge_lines;
-
- // Paint the caps
- const unsigned int max_cap_line_count = edges.size();
- QLineF *const cap_lines = new QLineF[max_cap_line_count];
-
- p.setPen(LogicSignal::HighColour);
- paint_logic_caps(p, cap_lines, edges, true, samples_per_pixel,
- pixels_offset, pp.left(), high_offset);
- p.setPen(LogicSignal::LowColour);
- paint_logic_caps(p, cap_lines, edges, false, samples_per_pixel,
- pixels_offset, pp.left(), low_offset);
-
- delete[] cap_lines;
-
- // Paint the sampling points
- if (show_sampling_points) {
- p.setPen(SamplingPointColour);
- p.drawRects(sampling_points.data(), sampling_points.size());
- }
-}