]> sigrok.org Git - pulseview.git/blobdiff - pv/views/decoder_output/QHexView.cpp
DecodeOutputView: Use delayed view updater and cache current chunk
[pulseview.git] / pv / views / decoder_output / QHexView.cpp
index 051e0b1f350f1044649aee98fff0bd11e9413fd6..ef57fd4c700a31974734568779baadda279bf1b5 100644 (file)
@@ -122,6 +122,7 @@ void QHexView::initialize_byte_iterator(size_t offset)
 {
        current_chunk_id_ = 0;
        current_chunk_offset_ = 0;
+       current_offset_ = offset;
 
        for (const DecodeBinaryDataChunk& chunk : data_->chunks)
                if (offset >= chunk.data.size()) {
@@ -132,7 +133,7 @@ void QHexView::initialize_byte_iterator(size_t offset)
                        break;
                }
 
-       current_chunk_ = &(data_->chunks[current_chunk_id_]);
+       current_chunk_ = data_->chunks[current_chunk_id_];
 }
 
 uint8_t QHexView::get_next_byte(bool* is_next_chunk)
@@ -140,13 +141,15 @@ uint8_t QHexView::get_next_byte(bool* is_next_chunk)
        if (is_next_chunk != nullptr)
                *is_next_chunk = (current_chunk_offset_ == 0);
 
-       uint8_t v = current_chunk_->data[current_chunk_offset_];
+       uint8_t v = current_chunk_.data[current_chunk_offset_];
 
+       current_offset_++;
        current_chunk_offset_++;
-       if (current_chunk_offset_ == current_chunk_->data.size()) {
+
+       if (current_chunk_offset_ == current_chunk_.data.size()) {
                current_chunk_id_++;
                current_chunk_offset_ = 0;
-               current_chunk_ = &(data_->chunks[current_chunk_id_]);
+               current_chunk_ = data_->chunks[current_chunk_id_];
        }
 
        return v;
@@ -237,7 +240,7 @@ void QHexView::paintEvent(QPaintEvent *event)
        for (size_t lineIdx = firstLineIdx, y = yStart; lineIdx < lastLineIdx; lineIdx++) {
 
                int x = posHex_;
-               for (size_t i = 0; i < BYTES_PER_LINE && ((lineIdx - firstLineIdx) * BYTES_PER_LINE + i) < data_size_; i++) {
+               for (size_t i = 0; (i < BYTES_PER_LINE) && (current_offset_ < data_size_); i++) {
                        size_t pos = (lineIdx * BYTES_PER_LINE + i) * 2;
 
                        // Fetch byte
@@ -283,7 +286,7 @@ void QHexView::paintEvent(QPaintEvent *event)
        for (size_t lineIdx = firstLineIdx, y = yStart; lineIdx < lastLineIdx; lineIdx++) {
 
                int x = posAscii_;
-               for (size_t i = 0; ((lineIdx - firstLineIdx) * BYTES_PER_LINE + i) < data_size_ && (i < BYTES_PER_LINE); i++) {
+               for (size_t i = 0; (i < BYTES_PER_LINE) && (current_offset_ < data_size_); i++) {
                        // Fetch byte
                        uint8_t ch = get_next_byte();