X-Git-Url: https://sigrok.org/gitweb/?p=pulseview.git;a=blobdiff_plain;f=pv%2Fdata%2Flogicsegment.cpp;h=b77c102d8ba2266de397f42223ffc9d5b4b0e3a5;hp=32a7adb240fc5535a895c00f5d87abfb97d712b3;hb=65c92359634f672e5f472a5214719dabc7e20883;hpb=b4bc9b55381ff22196785291d3862c8c8c131885 diff --git a/pv/data/logicsegment.cpp b/pv/data/logicsegment.cpp index 32a7adb2..b77c102d 100644 --- a/pv/data/logicsegment.cpp +++ b/pv/data/logicsegment.cpp @@ -184,21 +184,6 @@ void LogicSegment::get_samples(int64_t start_sample, get_raw_samples(start_sample, (end_sample - start_sample), dest); } -SegmentLogicDataIterator* LogicSegment::begin_sample_iteration(uint64_t start) -{ - return (SegmentLogicDataIterator*)begin_raw_sample_iteration(start); -} - -void LogicSegment::continue_sample_iteration(SegmentLogicDataIterator* it, uint64_t increase) -{ - Segment::continue_raw_sample_iteration((SegmentRawDataIterator*)it, increase); -} - -void LogicSegment::end_sample_iteration(SegmentLogicDataIterator* it) -{ - Segment::end_raw_sample_iteration((SegmentRawDataIterator*)it); -} - void LogicSegment::get_subsampled_edges( vector &edges, uint64_t start, uint64_t end, @@ -371,10 +356,14 @@ void LogicSegment::get_subsampled_edges( void LogicSegment::get_surrounding_edges(vector &dest, uint64_t origin_sample, float min_length, int sig_index) { + if (origin_sample >= sample_count_) + return; + // Put the edges vector on the heap, it can become quite big until we can // use a get_subsampled_edges() implementation that searches backwards vector* edges = new vector; + // Get all edges to the left of origin_sample get_subsampled_edges(*edges, 0, origin_sample, min_length, sig_index, false); // If we don't specify "first only", the first and last edge are the states @@ -390,6 +379,7 @@ void LogicSegment::get_surrounding_edges(vector &dest, dest.push_back(edges->back()); edges->clear(); + // Get first edge to the right of origin_sample get_subsampled_edges(*edges, origin_sample, sample_count_, min_length, sig_index, true); // "first only" is specified, so nothing needs to be dismissed @@ -424,7 +414,7 @@ void LogicSegment::append_payload_to_mipmap() MipMapLevel &m0 = mip_map_[0]; uint64_t prev_length; uint8_t *dest_ptr; - SegmentRawDataIterator* it; + SegmentDataIterator* it; uint64_t accumulator; unsigned int diff_counter; @@ -444,23 +434,23 @@ void LogicSegment::append_payload_to_mipmap() const uint64_t start_sample = prev_length * MipMapScaleFactor; const uint64_t end_sample = m0.length * MipMapScaleFactor; - it = begin_raw_sample_iteration(start_sample); + it = begin_sample_iteration(start_sample); for (uint64_t i = start_sample; i < end_sample;) { // Accumulate transitions which have occurred in this sample accumulator = 0; diff_counter = MipMapScaleFactor; while (diff_counter-- > 0) { - const uint64_t sample = unpack_sample(it->value); + const uint64_t sample = unpack_sample(get_iterator_value(it)); accumulator |= last_append_sample_ ^ sample; last_append_sample_ = sample; - continue_raw_sample_iteration(it, 1); + continue_sample_iteration(it, 1); i++; } pack_sample(dest_ptr, accumulator); dest_ptr += unit_size_; } - end_raw_sample_iteration(it); + end_sample_iteration(it); // Compute higher level mipmaps for (unsigned int level = 1; level < ScaleStepCount; level++) {