Skip to content

Commit

Permalink
Remove drawRect; Clip rendering to the visible region in Automation E…
Browse files Browse the repository at this point in the history
…ditor
  • Loading branch information
khoidauminh committed Feb 7, 2025
1 parent 2d6cec9 commit 71d83dc
Show file tree
Hide file tree
Showing 4 changed files with 13 additions and 13 deletions.
6 changes: 2 additions & 4 deletions include/SampleThumbnail.h
Original file line number Diff line number Diff line change
Expand Up @@ -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.

Expand Down
13 changes: 6 additions & 7 deletions src/gui/SampleThumbnail.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<int>(static_cast<double>(sampleRect.width()) / sampleRange);
const auto finerThumbnail = std::find_if(m_thumbnailCache->rbegin(), m_thumbnailCache->rend(),
Expand All @@ -131,7 +130,7 @@ void SampleThumbnail::visualize(VisualizeParameters parameters, QPainter& painte
const auto advanceThumbnailBy = parameters.reversed ? -1 : 1;

const auto finerThumbnailScaleFactor = static_cast<double>(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)
Expand All @@ -140,8 +139,8 @@ void SampleThumbnail::visualize(VisualizeParameters parameters, QPainter& painte
const auto endAggregationAt = &(*finerThumbnail)[static_cast<int>(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);
}
Expand Down
6 changes: 4 additions & 2 deletions src/gui/clips/SampleClipView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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()
};
Expand Down
1 change: 1 addition & 0 deletions src/gui/editors/AutomationEditor.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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<float>(sample.startFrame()) / sample.sampleSize(),
.sampleEnd = static_cast<float>(sample.endFrame()) / sample.sampleSize(),
Expand Down

0 comments on commit 71d83dc

Please sign in to comment.