Skip to content

Commit

Permalink
Merge branch 'master' into sample-thumbnail-no-garbage
Browse files Browse the repository at this point in the history
  • Loading branch information
khoidauminh committed Feb 9, 2025
2 parents 786088b + e0f35cf commit ca22b7a
Show file tree
Hide file tree
Showing 5 changed files with 25 additions and 20 deletions.
1 change: 1 addition & 0 deletions include/SampleClipView.h
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,7 @@ public slots:
SampleClip * m_clip;
SampleThumbnail m_sampleThumbnail;
QPixmap m_paintPixmap;
long m_paintPixmapXPosition;
bool splitClip( const TimePos pos ) override;
} ;

Expand Down
6 changes: 2 additions & 4 deletions include/SampleThumbnail.h
Original file line number Diff line number Diff line change
Expand Up @@ -54,10 +54,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 @@ -107,14 +107,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 @@ -136,7 +135,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 @@ -145,8 +144,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
24 changes: 15 additions & 9 deletions src/gui/clips/SampleClipView.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,8 @@ namespace lmms::gui
SampleClipView::SampleClipView( SampleClip * _clip, TrackView * _tv ) :
ClipView( _clip, _tv ),
m_clip( _clip ),
m_paintPixmap()
m_paintPixmap(),
m_paintPixmapXPosition(0)
{
// update UI and tooltip
updateSample();
Expand Down Expand Up @@ -210,15 +211,20 @@ void SampleClipView::paintEvent( QPaintEvent * pe )

if( !needsUpdate() )
{
painter.drawPixmap( 0, 0, m_paintPixmap );
painter.drawPixmap(m_paintPixmapXPosition, 0, m_paintPixmap);
return;
}

setNeedsUpdate( false );

if (m_paintPixmap.isNull() || m_paintPixmap.size() != size())
// Use the clip's height to avoid artifacts when rendering while something else is overlaying the clip.
const auto viewPortRect = QRect(0, 0, pe->rect().width(), rect().height());

m_paintPixmapXPosition = pe->rect().x();

if (m_paintPixmap.isNull() || m_paintPixmap.size() != viewPortRect.size())
{
m_paintPixmap = QPixmap(size());
m_paintPixmap = QPixmap(viewPortRect.size());
}

QPainter p( &m_paintPixmap );
Expand Down Expand Up @@ -274,12 +280,12 @@ 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, spacing, sampleLength, height() - spacing),
.drawRect = QRect(0, spacing, width(), height() - spacing),
.viewportRect = pe->rect(),
.sampleRect = QRect(offsetStart - m_paintPixmapXPosition, spacing, sampleLength, height() - spacing),
.viewportRect = viewPortRect,
.amplification = sample.amplification(),
.reversed = sample.reversed()
};
Expand Down Expand Up @@ -331,8 +337,8 @@ void SampleClipView::paintEvent( QPaintEvent * pe )
}*/

p.end();

painter.drawPixmap( 0, 0, m_paintPixmap );
painter.drawPixmap(m_paintPixmapXPosition, 0, m_paintPixmap);
}


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 @@ -1219,6 +1219,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 ca22b7a

Please sign in to comment.