+ assert(data_);
+ assert(owner_);
+
+ const int y = get_visual_y();
+
+ const View *const view = owner_->view();
+ assert(view);
+
+ const double scale = view->scale();
+ assert(scale > 0);
+
+ const double offset = view->offset();
+
+ if (!channel_->enabled())
+ return;
+
+ const deque< shared_ptr<pv::data::AnalogSnapshot> > &snapshots =
+ data_->get_snapshots();
+ if (snapshots.empty())
+ return;
+
+ const shared_ptr<pv::data::AnalogSnapshot> &snapshot =
+ snapshots.front();
+
+ const double pixels_offset = offset / scale;
+ const double samplerate = data_->samplerate();
+ const double start_time = data_->get_start_time();
+ const int64_t last_sample = snapshot->get_sample_count() - 1;
+ const double samples_per_pixel = samplerate * scale;
+ const double start = samplerate * (offset - start_time);
+ const double end = start + samples_per_pixel * pp.width();
+
+ const int64_t start_sample = min(max((int64_t)floor(start),
+ (int64_t)0), last_sample);
+ const int64_t end_sample = min(max((int64_t)ceil(end) + 1,
+ (int64_t)0), last_sample);
+
+ if (samples_per_pixel < EnvelopeThreshold)
+ paint_trace(p, snapshot, y, pp.left(),
+ start_sample, end_sample,
+ pixels_offset, samples_per_pixel);
+ else
+ paint_envelope(p, snapshot, y, pp.left(),
+ start_sample, end_sample,
+ pixels_offset, samples_per_pixel);