diff options
author | JosepMaJAZ <josepma@gmail.com> | 2020-04-18 16:15:56 +0200 |
---|---|---|
committer | JosepMaJAZ <josepma@gmail.com> | 2020-04-18 16:15:56 +0200 |
commit | b96b4247ca80a86b99a5497f20bb31189596b61a (patch) | |
tree | 4f47332bde311584484204a408f30dfe8a935c33 /src/waveform | |
parent | 82f3e4f6b436c1f93396e614a0eb592de03367eb (diff) | |
parent | 9adf8a97abb12673b85dbd3338cc215e65c06549 (diff) |
Merge branch 'master' into GL_Qt514_windows-fix
Diffstat (limited to 'src/waveform')
-rw-r--r-- | src/waveform/renderers/waveformrendermark.cpp | 301 | ||||
-rw-r--r-- | src/waveform/renderers/waveformsignalcolors.cpp | 8 | ||||
-rw-r--r-- | src/waveform/renderers/waveformsignalcolors.h | 2 |
3 files changed, 125 insertions, 186 deletions
diff --git a/src/waveform/renderers/waveformrendermark.cpp b/src/waveform/renderers/waveformrendermark.cpp index 61aa4f1b1f..2a51726d4c 100644 --- a/src/waveform/renderers/waveformrendermark.cpp +++ b/src/waveform/renderers/waveformrendermark.cpp @@ -150,219 +150,148 @@ void WaveformRenderMark::generateMarkImage(WaveformMarkPointer pMark) { QPainter painter; - // If no text is provided, leave m_markImage as a null image - if (!pMark->m_text.isNull()) { - // Determine mark text. - QString label = pMark->m_text; - if (pMark->getHotCue() >= 0) { - if (!label.isEmpty()) { - label.prepend(": "); - } - label.prepend(QString::number(pMark->getHotCue() + 1)); - if (label.size() > kMaxCueLabelLength) { - label = label.left(kMaxCueLabelLength - 3) + "..."; - } + // Determine mark text. + QString label = pMark->m_text; + if (pMark->getHotCue() >= 0) { + if (!label.isEmpty()) { + label.prepend(": "); } - - //QFont font("Bitstream Vera Sans"); - //QFont font("Helvetica"); - QFont font; // Uses the application default - font.setPointSizeF(10 * scaleFactor()); - font.setStretch(100); - font.setWeight(75); - - QFontMetrics metrics(font); - - //fixed margin ... - QRect wordRect = metrics.tightBoundingRect(label); - const int marginX = 1; - const int marginY = 1; - wordRect.moveTop(marginX + 1); - wordRect.moveLeft(marginY + 1); - wordRect.setHeight(wordRect.height() + (wordRect.height()%2)); - wordRect.setWidth(wordRect.width() + (wordRect.width())%2); - //even wordrect to have an even Image >> draw the line in the middle ! - - int labelRectWidth = wordRect.width() + 2 * marginX + 4; - int labelRectHeight = wordRect.height() + 2 * marginY + 4 ; - - QRectF labelRect(0, 0, - (float)labelRectWidth, (float)labelRectHeight); - - int width; - int height; - - if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { - width = 2 * labelRectWidth + 1; - height = m_waveformRenderer->getHeight(); - } else { - width = m_waveformRenderer->getWidth(); - height = 2 * labelRectHeight + 1; + label.prepend(QString::number(pMark->getHotCue() + 1)); + if (label.size() > kMaxCueLabelLength) { + label = label.left(kMaxCueLabelLength - 3) + "..."; } + } - pMark->m_image = QImage(width * m_waveformRenderer->getDevicePixelRatio(), - height * m_waveformRenderer->getDevicePixelRatio(), - QImage::Format_ARGB32_Premultiplied); - pMark->m_image.setDevicePixelRatio(m_waveformRenderer->getDevicePixelRatio()); - - Qt::Alignment markAlignH = pMark->m_align & Qt::AlignHorizontal_Mask; - Qt::Alignment markAlignV = pMark->m_align & Qt::AlignVertical_Mask; - - if (markAlignH == Qt::AlignHCenter) { - labelRect.moveLeft((width - labelRectWidth) / 2); - } else if (markAlignH == Qt::AlignRight) { - labelRect.moveRight(width - 1); - } + //QFont font("Bitstream Vera Sans"); + //QFont font("Helvetica"); + QFont font; // Uses the application default + font.setPointSizeF(10 * scaleFactor()); + font.setStretch(100); + font.setWeight(75); + + QFontMetrics metrics(font); + + //fixed margin ... + QRect wordRect = metrics.tightBoundingRect(label); + const int marginX = 1; + const int marginY = 1; + wordRect.moveTop(marginX + 1); + wordRect.moveLeft(marginY + 1); + wordRect.setHeight(wordRect.height() + (wordRect.height() % 2)); + wordRect.setWidth(wordRect.width() + (wordRect.width()) % 2); + //even wordrect to have an even Image >> draw the line in the middle ! + + int labelRectWidth = wordRect.width() + 2 * marginX + 4; + int labelRectHeight = wordRect.height() + 2 * marginY + 4; + + QRectF labelRect(0, 0, (float)labelRectWidth, (float)labelRectHeight); + + int width; + int height; + + if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { + width = 2 * labelRectWidth + 1; + height = m_waveformRenderer->getHeight(); + } else { + width = m_waveformRenderer->getWidth(); + height = 2 * labelRectHeight + 1; + } - if (markAlignV == Qt::AlignVCenter) { - labelRect.moveTop((height - labelRectHeight) / 2); - } else if (markAlignV == Qt::AlignBottom) { - labelRect.moveBottom(height - 1); - } + pMark->m_image = QImage(width * m_waveformRenderer->getDevicePixelRatio(), + height * m_waveformRenderer->getDevicePixelRatio(), + QImage::Format_ARGB32_Premultiplied); + pMark->m_image.setDevicePixelRatio(m_waveformRenderer->getDevicePixelRatio()); - // Fill with transparent pixels - pMark->m_image.fill(QColor(0,0,0,0).rgba()); + Qt::Alignment markAlignH = pMark->m_align & Qt::AlignHorizontal_Mask; + Qt::Alignment markAlignV = pMark->m_align & Qt::AlignVertical_Mask; - painter.begin(&pMark->m_image); - painter.setRenderHint(QPainter::TextAntialiasing); + if (markAlignH == Qt::AlignHCenter) { + labelRect.moveLeft((width - labelRectWidth) / 2); + } else if (markAlignH == Qt::AlignRight) { + labelRect.moveRight(width - 1); + } - painter.setWorldMatrixEnabled(false); + if (markAlignV == Qt::AlignVCenter) { + labelRect.moveTop((height - labelRectHeight) / 2); + } else if (markAlignV == Qt::AlignBottom) { + labelRect.moveBottom(height - 1); + } - // Draw marker lines - if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { - int middle = width / 2; - if (markAlignH == Qt::AlignHCenter) { - if (labelRect.top() > 0) { - painter.setPen(pMark->fillColor()); - painter.drawLine(middle, 0, middle, labelRect.top()); + // Fill with transparent pixels + pMark->m_image.fill(QColor(0, 0, 0, 0).rgba()); - painter.setPen(pMark->borderColor()); - painter.drawLine(middle - 1, 0, middle - 1, labelRect.top()); - painter.drawLine(middle + 1, 0, middle + 1, labelRect.top()); - } + painter.begin(&pMark->m_image); + painter.setRenderHint(QPainter::TextAntialiasing); - if (labelRect.bottom() < height) { - painter.setPen(pMark->fillColor()); - painter.drawLine(middle, labelRect.bottom(), middle, height); + painter.setWorldMatrixEnabled(false); - painter.setPen(pMark->borderColor()); - painter.drawLine(middle - 1, labelRect.bottom(), middle - 1, height); - painter.drawLine(middle + 1, labelRect.bottom(), middle + 1, height); - } - } else { // AlignLeft || AlignRight + // Draw marker lines + if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { + int middle = width / 2; + if (markAlignH == Qt::AlignHCenter) { + if (labelRect.top() > 0) { painter.setPen(pMark->fillColor()); - painter.drawLine(middle, 0, middle, height); + painter.drawLine(middle, 0, middle, labelRect.top()); painter.setPen(pMark->borderColor()); - painter.drawLine(middle - 1, 0, middle - 1, height); - painter.drawLine(middle + 1, 0, middle + 1, height); + painter.drawLine(middle - 1, 0, middle - 1, labelRect.top()); + painter.drawLine(middle + 1, 0, middle + 1, labelRect.top()); } - } else { // Vertical - int middle = height / 2; - if (markAlignV == Qt::AlignVCenter) { - if (labelRect.left() > 0) { - painter.setPen(pMark->fillColor()); - painter.drawLine(0, middle, labelRect.left(), middle); - - painter.setPen(pMark->borderColor()); - painter.drawLine(0, middle - 1, labelRect.left(), middle - 1); - painter.drawLine(0, middle + 1, labelRect.left(), middle + 1); - } - - if (labelRect.right() < width) { - painter.setPen(pMark->fillColor()); - painter.drawLine(labelRect.right(), middle, width, middle); - painter.setPen(pMark->borderColor()); - painter.drawLine(labelRect.right(), middle - 1, width, middle - 1); - painter.drawLine(labelRect.right(), middle + 1, width, middle + 1); - } - } else { // AlignTop || AlignBottom + if (labelRect.bottom() < height) { painter.setPen(pMark->fillColor()); - painter.drawLine(0, middle, width, middle); + painter.drawLine(middle, labelRect.bottom(), middle, height); painter.setPen(pMark->borderColor()); - painter.drawLine(0, middle - 1, width, middle - 1); - painter.drawLine(0, middle + 1, width, middle + 1); + painter.drawLine(middle - 1, labelRect.bottom(), middle - 1, height); + painter.drawLine(middle + 1, labelRect.bottom(), middle + 1, height); } - } + } else { // AlignLeft || AlignRight + painter.setPen(pMark->fillColor()); + painter.drawLine(middle, 0, middle, height); - // Draw the label rect - painter.setPen(pMark->borderColor()); - painter.setBrush(QBrush(pMark->fillColor())); - painter.drawRoundedRect(labelRect, 2.0, 2.0); - - // Draw text - painter.setBrush(QBrush(QColor(0,0,0,0))); - painter.setFont(font); - painter.setPen(pMark->labelColor()); - painter.drawText(labelRect, Qt::AlignCenter, label); - } - else //no text draw triangle - { - float triangleSize = 9.0; - float markLength = triangleSize + 1.0; - float markBreadth = m_waveformRenderer->getBreadth(); - - int width, height; - - if (m_waveformRenderer->getOrientation() == Qt::Horizontal) { - width = markLength; - height = markBreadth; - } else { - width = markBreadth; - height = markLength; + painter.setPen(pMark->borderColor()); + painter.drawLine(middle - 1, 0, middle - 1, height); + painter.drawLine(middle + 1, 0, middle + 1, height); } + } else { // Vertical + int middle = height / 2; + if (markAlignV == Qt::AlignVCenter) { + if (labelRect.left() > 0) { + painter.setPen(pMark->fillColor()); + painter.drawLine(0, middle, labelRect.left(), middle); - pMark->m_image = QImage(width, height, QImage::Format_ARGB32_Premultiplied); - pMark->m_image.fill(QColor(0,0,0,0).rgba()); + painter.setPen(pMark->borderColor()); + painter.drawLine(0, middle - 1, labelRect.left(), middle - 1); + painter.drawLine(0, middle + 1, labelRect.left(), middle + 1); + } - painter.begin(&pMark->m_image); - painter.setRenderHint(QPainter::TextAntialiasing); + if (labelRect.right() < width) { + painter.setPen(pMark->fillColor()); + painter.drawLine(labelRect.right(), middle, width, middle); - painter.setWorldMatrixEnabled(false); + painter.setPen(pMark->borderColor()); + painter.drawLine(labelRect.right(), middle - 1, width, middle - 1); + painter.drawLine(labelRect.right(), middle + 1, width, middle + 1); + } + } else { // AlignTop || AlignBottom + painter.setPen(pMark->fillColor()); + painter.drawLine(0, middle, width, middle); - // Rotate if drawing vertical waveforms - if (m_waveformRenderer->getOrientation() == Qt::Vertical) { - painter.setTransform(QTransform(0, 1, 1, 0, 0, 0)); + painter.setPen(pMark->borderColor()); + painter.drawLine(0, middle - 1, width, middle - 1); + painter.drawLine(0, middle + 1, width, middle + 1); } + } - QColor triangleColor = pMark->fillColor(); - painter.setPen(QColor(0,0,0,0)); - painter.setBrush(QBrush(triangleColor)); - - //vRince: again don't ask about the +-0.1 0.5 ... - // just to make it nice in Qt ... - - QPolygonF triangle; - triangle.append(QPointF(0.5,0)); - triangle.append(QPointF(triangleSize+0.5,0)); - triangle.append(QPointF(triangleSize*0.5 + 0.1, triangleSize*0.5)); - - painter.drawPolygon(triangle); - - triangle.clear(); - triangle.append(QPointF(0.0,markBreadth)); - triangle.append(QPointF(triangleSize+0.5,markBreadth)); - triangle.append(QPointF(triangleSize*0.5 + 0.1, markBreadth - triangleSize*0.5 - 2.1)); - - painter.drawPolygon(triangle); - - //TODO vRince duplicated code make a method - //draw line - QColor lineColor = pMark->fillColor(); - painter.setPen(lineColor); - - float middle = markLength / 2.0; - - float lineTop = triangleSize * 0.5 + 1; - float lineBottom = markBreadth - triangleSize * 0.5 - 1; - - painter.drawLine(middle, lineTop, middle, lineBottom); + // Draw the label rect + painter.setPen(pMark->borderColor()); + painter.setBrush(QBrush(pMark->fillColor())); + painter.drawRoundedRect(labelRect, 2.0, 2.0); - //other lines to increase contrast - painter.setPen(QColor(0,0,0,100)); - painter.drawLine(middle - 1, lineTop, middle - 1, lineBottom); - painter.drawLine(middle + 1, lineTop, middle + 1, lineBottom); - } + // Draw text + painter.setBrush(QBrush(QColor(0, 0, 0, 0))); + painter.setFont(font); + painter.setPen(pMark->labelColor()); + painter.drawText(labelRect, Qt::AlignCenter, label); } diff --git a/src/waveform/renderers/waveformsignalcolors.cpp b/src/waveform/renderers/waveformsignalcolors.cpp index ea800a7ee9..41bbf22b6a 100644 --- a/src/waveform/renderers/waveformsignalcolors.cpp +++ b/src/waveform/renderers/waveformsignalcolors.cpp @@ -62,6 +62,14 @@ bool WaveformSignalColors::setup(const QDomNode &node, const SkinContext& contex m_playedOverlayColor = Qt::transparent; } + // This color is used to draw an overlay over the entire overview-waveforms + // if vinyl passthrough is enabled + m_passthroughOverlayColor = context.selectColor(node, "PassthroughOverlayColor"); + m_passthroughOverlayColor = WSkinColor::getCorrectColor(m_passthroughOverlayColor).toRgb(); + if (!m_passthroughOverlayColor.isValid()) { + m_passthroughOverlayColor = WSkinColor::getCorrectColor(QColor(187, 0, 0, 0)).toRgb(); + } + m_bgColor = context.selectColor(node, "BgColor"); if (!m_bgColor.isValid()) { m_bgColor = Qt::transparent; diff --git a/src/waveform/renderers/waveformsignalcolors.h b/src/waveform/renderers/waveformsignalcolors.h index 825323c195..0e789ed1c3 100644 --- a/src/waveform/renderers/waveformsignalcolors.h +++ b/src/waveform/renderers/waveformsignalcolors.h @@ -23,6 +23,7 @@ class WaveformSignalColors { inline const QColor& getAxesColor() const { return m_axesColor; } inline const QColor& getPlayPosColor() const { return m_playPosColor; } inline const QColor& getPlayedOverlayColor() const { return m_playedOverlayColor; } + inline const QColor& getPassthroughOverlayColor() const { return m_passthroughOverlayColor; } inline const QColor& getBgColor() const { return m_bgColor; } protected: @@ -42,6 +43,7 @@ class WaveformSignalColors { QColor m_axesColor; QColor m_playPosColor; QColor m_playedOverlayColor; + QColor m_passthroughOverlayColor; QColor m_bgColor; }; |