Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1485,7 +1485,7 @@ else()
src/shaders/textureshader.cpp
src/shaders/unicolorshader.cpp
src/shaders/vinylqualityshader.cpp
src/util/texture.cpp
src/util/opengltexture2d.cpp
src/waveform/renderers/allshader/matrixforwidgetgeometry.cpp
src/waveform/renderers/allshader/waveformrenderbackground.cpp
src/waveform/renderers/allshader/waveformrenderbeat.cpp
Expand Down
33 changes: 33 additions & 0 deletions src/util/opengltexture2d.cpp
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
#include "util/opengltexture2d.h"

#include <QPixmap>

#include "widget/paintable.h"

OpenGLTexture2D::OpenGLTexture2D()
: QOpenGLTexture(QOpenGLTexture::Target2D){};

void OpenGLTexture2D::setData(const QImage& image) {
destroy();
if (!image.isNull()) {
QOpenGLTexture::setData(image);
setMinMagFilters(QOpenGLTexture::Linear, QOpenGLTexture::Linear);
setWrapMode(QOpenGLTexture::ClampToEdge);
}
};

void OpenGLTexture2D::setData(const QPixmap& pixmap) {
setData(pixmap.toImage());
};

void OpenGLTexture2D::setData(const QSharedPointer<Paintable>& pPaintable) {
if (pPaintable) {
setData(pPaintable->toImage());
}
};

void OpenGLTexture2D::setData(const std::shared_ptr<QImage>& pImage) {
if (pImage) {
setData(*pImage);
}
};
18 changes: 18 additions & 0 deletions src/util/opengltexture2d.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
#pragma once

#include <QOpenGLTexture>
#include <QSharedPointer>

class Paintable;

@m0dB m0dB Apr 4, 2024

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

maybe add a comment that explains that this is an extension of QOpenGLTexture, with additional methods to set the texture data, and default settings for filter and wrap mode.

/// This is an QOpenGLTexture, with additional methods to set the texture data,
/// and default settings for 2D painting with lienar filtering and wrap mode.
class OpenGLTexture2D : public QOpenGLTexture {
public:
OpenGLTexture2D();

void setData(const QImage& image);
void setData(const QPixmap& pixmap);
void setData(const QSharedPointer<Paintable>& pPaintable);
void setData(const std::shared_ptr<QImage>& pImage);
};
37 changes: 0 additions & 37 deletions src/util/texture.cpp

This file was deleted.

12 changes: 0 additions & 12 deletions src/util/texture.h

This file was deleted.

15 changes: 7 additions & 8 deletions src/waveform/renderers/allshader/waveformrendererpreroll.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,12 @@
#include <array>

#include "skin/legacy/skincontext.h"
#include "util/texture.h"
#include "waveform/renderers/allshader/matrixforwidgetgeometry.h"
#include "waveform/renderers/waveformwidgetrenderer.h"
#include "widget/wskincolor.h"

namespace {
std::unique_ptr<QOpenGLTexture> generateTexture(float markerLength,
QImage drawPrerollImage(float markerLength,
float markerBreadth,
float devicePixelRatio,
QColor color) {
Expand Down Expand Up @@ -54,7 +53,7 @@ std::unique_ptr<QOpenGLTexture> generateTexture(float markerLength,
painter.drawPath(path);
painter.end();

return createTexture(image);
return image;
}
} // anonymous namespace

Expand Down Expand Up @@ -120,13 +119,13 @@ void WaveformRendererPreroll::paintGL() {
// has changed size last time.
m_markerLength = markerLength;
m_markerBreadth = markerBreadth;
m_pTexture = generateTexture(m_markerLength,
m_texture.setData(drawPrerollImage(m_markerLength,
m_markerBreadth,
m_waveformRenderer->getDevicePixelRatio(),
m_color);
m_color));
}

if (!m_pTexture) {
if (!m_texture.isStorageAllocated()) {
return;
}

Expand All @@ -146,7 +145,7 @@ void WaveformRendererPreroll::paintGL() {
m_shader.setUniformValue(matrixLocation, matrix);
m_shader.setUniformValue(textureLocation, 0);

m_pTexture->bind();
m_texture.bind();

const float end = m_waveformRenderer->getLength();

Expand Down Expand Up @@ -191,7 +190,7 @@ void WaveformRendererPreroll::paintGL() {
(end - x) / markerLength);
}

m_pTexture->release();
m_texture.release();

m_shader.disableAttributeArray(positionLocation);
m_shader.disableAttributeArray(texcoordLocation);
Expand Down
3 changes: 2 additions & 1 deletion src/waveform/renderers/allshader/waveformrendererpreroll.h
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@

#include "shaders/patternshader.h"
#include "util/class.h"
#include "util/opengltexture2d.h"
#include "waveform/renderers/allshader/vertexdata.h"
#include "waveform/renderers/allshader/waveformrenderer.h"

Expand Down Expand Up @@ -33,7 +34,7 @@ class allshader::WaveformRendererPreroll final : public allshader::WaveformRende
QColor m_color;
float m_markerBreadth{};
float m_markerLength{};
std::unique_ptr<QOpenGLTexture> m_pTexture;
OpenGLTexture2D m_texture;

DISALLOW_COPY_AND_ASSIGN(WaveformRendererPreroll);
};
26 changes: 14 additions & 12 deletions src/waveform/renderers/allshader/waveformrendermark.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@
#include <QPainterPath>

#include "util/colorcomponents.h"
#include "util/texture.h"
#include "waveform/renderers/allshader/matrixforwidgetgeometry.h"
#include "waveform/renderers/allshader/rgbadata.h"
#include "waveform/renderers/allshader/vertexdata.h"
Expand All @@ -20,15 +19,16 @@
// then used as textures to be drawn with a GLSL shader.

class TextureGraphics : public WaveformMark::Graphics {
std::unique_ptr<QOpenGLTexture> m_pTexture;

public:
TextureGraphics(std::unique_ptr<QOpenGLTexture>&& pTexture)
: m_pTexture{std::move(pTexture)} {
TextureGraphics(const QImage& image) {
m_texture.setData(image);
}
QOpenGLTexture* texture() const {
return m_pTexture.get();
QOpenGLTexture* texture() {
return &m_texture;
}

private:
OpenGLTexture2D m_texture;
};

// Both allshader::WaveformRenderMark and the non-GL ::WaveformRenderMark derive
Expand Down Expand Up @@ -226,10 +226,12 @@ void allshader::WaveformRenderMark::paintGL() {
static_cast<float>(m_waveformRenderer->getPlayMarkerPosition() *
m_waveformRenderer->getLength()));

const float markHalfWidth = m_pPlayPosMarkTexture->width() / devicePixelRatio / 2.f;
const float drawOffset = currentMarkPoint - markHalfWidth;
if (m_playPosMarkTexture.isStorageAllocated()) {
const float markHalfWidth = m_playPosMarkTexture.width() / devicePixelRatio / 2.f;
const float drawOffset = currentMarkPoint - markHalfWidth;

drawTexture(drawOffset, 0.f, m_pPlayPosMarkTexture.get());
drawTexture(drawOffset, 0.f, &m_playPosMarkTexture);
}
}

// Generate the texture used to draw the play position marker.
Expand Down Expand Up @@ -296,7 +298,7 @@ void allshader::WaveformRenderMark::updatePlayPosMarkTexture() {
}
painter.end();

m_pPlayPosMarkTexture = createTexture(image);
m_playPosMarkTexture.setData(image);
}

void allshader::WaveformRenderMark::drawTriangle(QPainter* painter,
Expand All @@ -321,5 +323,5 @@ void allshader::WaveformRenderMark::resizeGL(int, int) {

void allshader::WaveformRenderMark::updateMarkImage(WaveformMarkPointer pMark) {
pMark->m_pGraphics = std::make_unique<TextureGraphics>(
createTexture(pMark->generateImage(m_waveformRenderer->getDevicePixelRatio())));
pMark->generateImage(m_waveformRenderer->getDevicePixelRatio()));
}
9 changes: 5 additions & 4 deletions src/waveform/renderers/allshader/waveformrendermark.h
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

#include "shaders/rgbashader.h"
#include "shaders/textureshader.h"
#include "util/opengltexture2d.h"
#include "waveform/renderers/allshader/waveformrendererabstract.h"
#include "waveform/renderers/waveformrendermarkbase.h"

Expand Down Expand Up @@ -44,12 +45,12 @@ class allshader::WaveformRenderMark : public ::WaveformRenderMarkBase,
QPointF p2,
QPointF p3);

mixxx::RGBAShader m_rgbaShader;
mixxx::TextureShader m_textureShader;
std::unique_ptr<QOpenGLTexture> m_pPlayPosMarkTexture;

void drawMark(const QRectF& rect, QColor color);
void drawTexture(float x, float y, QOpenGLTexture* texture);

mixxx::RGBAShader m_rgbaShader;
mixxx::TextureShader m_textureShader;
OpenGLTexture2D m_playPosMarkTexture;

DISALLOW_COPY_AND_ASSIGN(WaveformRenderMark);
};
5 changes: 5 additions & 0 deletions src/widget/paintable.cpp
Original file line number Diff line number Diff line change
@@ -1,6 +1,11 @@
#include "widget/paintable.h"

#include <QFile>
#include <QFileInfo>
#include <QPainter>
#include <QPixmap>
#include <QString>
#include <QSvgRenderer>
#include <QtDebug>

#include "util/math.h"
Expand Down
9 changes: 4 additions & 5 deletions src/widget/paintable.h
Original file line number Diff line number Diff line change
@@ -1,18 +1,17 @@
#pragma once

#include <QPixmap>
#include <QHash>
#include <QSharedPointer>
#include <QSvgRenderer>
#include <QImage>
#include <QScopedPointer>
#include <QPainter>
#include <QRectF>
#include <QString>

#include "skin/legacy/imgsource.h"
#include "skin/legacy/pixmapsource.h"

class QPainter;
class QPixmap;
class QSvgRenderer;

// Wrapper around QImage and QSvgRenderer to support rendering SVG images in
// high fidelity.
class Paintable {
Expand Down
Loading