diff --git a/include/SampleThumbnail.h b/include/SampleThumbnail.h index 1f9e10ac318..cc96c970a37 100644 --- a/include/SampleThumbnail.h +++ b/include/SampleThumbnail.h @@ -61,10 +61,8 @@ class LMMS_EXPORT SampleThumbnail { QRect sampleRect; //!< A rectangle that covers the entire range of samples. - QRect drawRect; //!< Specifies the location in `sampleRect` where the waveform will be drawn. Equals - //!< `sampleRect` when null. - - QRect viewportRect; //!< Clips `drawRect`. Equals `drawRect` when null. + QRect viewportRect; //!< Specifies the location in `sampleRect` where the waveform will be drawn. Equals + //!< `sampleRect` when null. float amplification = 1.0f; //!< The amount of amplification to apply to the waveform. diff --git a/src/gui/SampleThumbnail.cpp b/src/gui/SampleThumbnail.cpp index ee48723d7bf..a953e48d0ea 100644 --- a/src/gui/SampleThumbnail.cpp +++ b/src/gui/SampleThumbnail.cpp @@ -102,14 +102,13 @@ SampleThumbnail::SampleThumbnail(const Sample& sample) void SampleThumbnail::visualize(VisualizeParameters parameters, QPainter& painter) const { const auto& sampleRect = parameters.sampleRect; - const auto& drawRect = parameters.drawRect.isNull() ? sampleRect : parameters.drawRect; - const auto& viewportRect = parameters.viewportRect.isNull() ? drawRect : parameters.viewportRect; + const auto& viewportRect = parameters.viewportRect.isNull() ? sampleRect : parameters.viewportRect; - const auto renderRect = sampleRect.intersected(drawRect).intersected(viewportRect); + const auto renderRect = sampleRect.intersected(viewportRect); if (renderRect.isNull()) { return; } const auto sampleRange = parameters.sampleEnd - parameters.sampleStart; - if (sampleRange <= 0 || sampleRange > 1) { return; } + if (sampleRange <= 0.0f || sampleRange > 1.0f) { return; } const auto targetThumbnailWidth = static_cast(static_cast(sampleRect.width()) / sampleRange); const auto finerThumbnail = std::find_if(m_thumbnailCache->rbegin(), m_thumbnailCache->rend(), @@ -131,7 +130,7 @@ void SampleThumbnail::visualize(VisualizeParameters parameters, QPainter& painte const auto advanceThumbnailBy = parameters.reversed ? -1 : 1; const auto finerThumbnailScaleFactor = static_cast(finerThumbnail->width()) / targetThumbnailWidth; - const auto yScale = drawRect.height() / 2 * parameters.amplification; + const auto yScale = renderRect.height() / 2 * parameters.amplification; for (auto x = renderRect.x(), i = thumbnailBegin; x < renderRect.x() + renderRect.width() && i != thumbnailEnd; ++x, i += advanceThumbnailBy) @@ -140,8 +139,8 @@ void SampleThumbnail::visualize(VisualizeParameters parameters, QPainter& painte const auto endAggregationAt = &(*finerThumbnail)[static_cast(std::ceil((i + 1) * finerThumbnailScaleFactor))]; const auto peak = std::accumulate(beginAggregationAt, endAggregationAt, Thumbnail::Peak{}); - const auto yMin = drawRect.center().y() - peak.min * yScale; - const auto yMax = drawRect.center().y() - peak.max * yScale; + const auto yMin = renderRect.center().y() - peak.min * yScale; + const auto yMax = renderRect.center().y() - peak.max * yScale; painter.drawLine(x, yMin, x, yMax); } diff --git a/src/gui/clips/SampleClipView.cpp b/src/gui/clips/SampleClipView.cpp index b6892e6bb90..f46dc9267c6 100644 --- a/src/gui/clips/SampleClipView.cpp +++ b/src/gui/clips/SampleClipView.cpp @@ -275,11 +275,13 @@ void SampleClipView::paintEvent( QPaintEvent * pe ) float sampleLength = m_clip->sampleLength() * ppb / ticksPerBar; const auto& sample = m_clip->m_sample; + if (sample.sampleSize() > 0) { const auto param = SampleThumbnail::VisualizeParameters{ - .sampleRect = QRect(offsetStart-pe->rect().x(), spacing, sampleLength, height() - spacing), - .viewportRect = QRect(0, 0, pe->rect().width(), pe->rect().height()), + .sampleRect = QRect(offsetStart - pe->rect().x(), spacing, sampleLength, height() - spacing), + // Use the clips's height to avoid artifects when rendering while something else is over the clip. + .viewportRect = QRect(0, 0, pe->rect().width(), rect().height()), .amplification = sample.amplification(), .reversed = sample.reversed() }; diff --git a/src/gui/editors/AutomationEditor.cpp b/src/gui/editors/AutomationEditor.cpp index 5514e57395a..4c64bc90b80 100644 --- a/src/gui/editors/AutomationEditor.cpp +++ b/src/gui/editors/AutomationEditor.cpp @@ -1223,6 +1223,7 @@ void AutomationEditor::paintEvent(QPaintEvent * pe ) const auto param = SampleThumbnail::VisualizeParameters{ .sampleRect = QRect(startPos, yOffset, sampleWidth, sampleHeight), + .viewportRect = pe->rect(), .amplification = sample.amplification(), .sampleStart = static_cast(sample.startFrame()) / sample.sampleSize(), .sampleEnd = static_cast(sample.endFrame()) / sample.sampleSize(),