diff --git a/plugins/dockers/artisticcolorselector/artisticcolorselector_dock.cpp b/plugins/dockers/artisticcolorselector/artisticcolorselector_dock.cpp --- a/plugins/dockers/artisticcolorselector/artisticcolorselector_dock.cpp +++ b/plugins/dockers/artisticcolorselector/artisticcolorselector_dock.cpp @@ -455,5 +455,5 @@ void ArtisticColorSelectorDock::slotSelectorSettingsChanged() { - m_selectorUI->colorSelector->update(); + m_selectorUI->colorSelector->setDirty(); } diff --git a/plugins/dockers/artisticcolorselector/kis_color.h b/plugins/dockers/artisticcolorselector/kis_color.h --- a/plugins/dockers/artisticcolorselector/kis_color.h +++ b/plugins/dockers/artisticcolorselector/kis_color.h @@ -47,9 +47,7 @@ qreal lR = DEFAULT_LUMA_R, qreal lG = DEFAULT_LUMA_G, qreal lB = DEFAULT_LUMA_B, qreal lGamma = DEFAULT_LUMA_GAMMA); - KisColor(const KisColor& color); - - KisColor(const KisColor& color, Type type, + KisColor(const KisColor& color, KisDisplayColorConverter *converter, Type type = HSY, qreal lR = DEFAULT_LUMA_R, qreal lG = DEFAULT_LUMA_G, qreal lB = DEFAULT_LUMA_B, qreal lGamma = DEFAULT_LUMA_GAMMA); @@ -81,8 +79,6 @@ m_saturation = s; m_value = x; } - - inline KisDisplayColorConverter* colorConverter() const { return m_colorConverter; } private: void initHSX(Type type, qreal h, qreal s, qreal x); diff --git a/plugins/dockers/artisticcolorselector/kis_color.cpp b/plugins/dockers/artisticcolorselector/kis_color.cpp --- a/plugins/dockers/artisticcolorselector/kis_color.cpp +++ b/plugins/dockers/artisticcolorselector/kis_color.cpp @@ -76,16 +76,6 @@ fromKoColor(koColor); } -KisColor::KisColor(const KisColor& color) -{ - m_colorConverter = color.colorConverter(); - m_lumaR = color.lumaR(); - m_lumaG = color.lumaG(); - m_lumaB = color.lumaB(); - m_lumaGamma = color.lumaGamma(); - initHSX(color.getType(), color.getH(), color.getS(), color.getX()); -} - KisColor::KisColor(const KoColor &color, KisDisplayColorConverter* converter, KisColor::Type type, qreal lR, qreal lG, qreal lB, qreal lGamma) { @@ -98,10 +88,10 @@ fromKoColor(color); } -KisColor::KisColor(const KisColor& color, KisColor::Type type, +KisColor::KisColor(const KisColor& color, KisDisplayColorConverter* converter, KisColor::Type type, qreal lR, qreal lG, qreal lB, qreal lGamma) { - m_colorConverter = color.colorConverter(); + m_colorConverter = converter; m_type = type; m_lumaR = lR; m_lumaG = lG; diff --git a/plugins/dockers/artisticcolorselector/kis_color_selector.h b/plugins/dockers/artisticcolorselector/kis_color_selector.h --- a/plugins/dockers/artisticcolorselector/kis_color_selector.h +++ b/plugins/dockers/artisticcolorselector/kis_color_selector.h @@ -83,13 +83,12 @@ void setShowBgColor(bool value); void setShowValueScaleNumbers(bool value); void setGamutMask(KoGamutMask* gamutMask); + void setDirty(); bool gamutMaskOn(); void setGamutMaskOn(bool gamutMaskOn); void setEnforceGamutMask(bool enforce); KoGamutMask* gamutMask(); - bool saturationIsInvertible(); - void saveSettings(); void loadSettings(); @@ -131,6 +130,7 @@ void drawBlip(QPainter& painter, const QRect& rect); void drawLightStrip(QPainter& painter, const QRect& rect); void drawGamutMaskShape(QPainter& painter, const QRect& rect); + void drawColorPreview(QPainter& painter, const QRect& rect); qint8 getHueIndex(Radian hue) const; qreal getHue(int hueIdx, Radian shift=0.0f) const; @@ -166,6 +166,9 @@ KisColor m_bgColor; QImage m_renderBuffer; QImage m_maskBuffer; + QImage m_lightStripBuffer; + QImage m_colorPreviewBuffer; + QRect m_widgetArea; QRect m_renderArea; QRect m_lightStripArea; bool m_mouseMoved; @@ -189,6 +192,10 @@ KisGamutMaskViewConverter* m_viewConverter; bool m_widgetUpdatesSelf; + bool m_isDirtyWheel; + bool m_isDirtyLightStrip; + bool m_isDirtyGamutMask; + bool m_isDirtyColorPreview; qreal m_lumaR; qreal m_lumaG; diff --git a/plugins/dockers/artisticcolorselector/kis_color_selector.cpp b/plugins/dockers/artisticcolorselector/kis_color_selector.cpp --- a/plugins/dockers/artisticcolorselector/kis_color_selector.cpp +++ b/plugins/dockers/artisticcolorselector/kis_color_selector.cpp @@ -51,6 +51,10 @@ , m_currentGamutMask(nullptr) , m_maskPreviewActive(true) , m_widgetUpdatesSelf(false) + , m_isDirtyWheel(false) + , m_isDirtyLightStrip(false) + , m_isDirtyGamutMask(false) + , m_isDirtyColorPreview(false) { m_viewConverter = new KisGamutMaskViewConverter(); @@ -68,7 +72,10 @@ void KisColorSelector::setColorSpace(KisColor::Type type) { m_colorSpace = type; - m_selectedColor = KisColor(m_selectedColor, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + m_selectedColor = KisColor(m_selectedColor, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + + m_isDirtyLightStrip = true; + m_isDirtyWheel = true; #ifdef DEBUG_ARC_SELECTOR dbgPlugins << "KisColorSelector::setColorSpace: set to:" << m_colorSpace; @@ -80,6 +87,11 @@ void KisColorSelector::setColorConverter(KisDisplayColorConverter *colorConverter) { m_colorConverter = colorConverter; + + m_selectedColor = KisColor(m_selectedColor, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + m_fgColor = KisColor(m_fgColor, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + m_bgColor = KisColor(m_bgColor, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + update(); } @@ -121,7 +133,7 @@ void KisColorSelector::selectColor(const KisColor& color) { - m_selectedColor = KisColor(color, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + m_selectedColor = KisColor(color, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); m_selectedPiece = getHueIndex(m_selectedColor.getH() * PI2); m_selectedRing = getSaturationIndex(m_selectedColor.getS()); m_selectedLightPiece = getLightIndex(m_selectedColor.getX()); @@ -134,6 +146,9 @@ m_fgColor = KisColor(fgColor, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); m_selectedColor = KisColor(fgColor, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + m_isDirtyWheel = true; + m_isDirtyLightStrip = true; + m_isDirtyColorPreview = true; #ifdef DEBUG_ARC_SELECTOR dbgPlugins << "KisColorSelector::setFgColor: m_fgColor set to:" << "H:" << m_fgColor.getH() @@ -153,6 +168,9 @@ { if (!m_widgetUpdatesSelf) { m_bgColor = KisColor(bgColor, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + + m_isDirtyColorPreview = true; + #ifdef DEBUG_ARC_SELECTOR dbgPlugins << "KisColorSelector::setBgColor: m_bgColor set to:" << "H:" << m_bgColor.getH() @@ -167,6 +185,7 @@ { m_selectedColor.setX(qBound(0.0, light, 1.0)); m_selectedLightPiece = getLightIndex(m_selectedColor.getX()); + m_isDirtyLightStrip = true; update(); } @@ -177,7 +196,10 @@ m_lumaB = lB; m_lumaGamma = lGamma; - m_selectedColor = KisColor(m_selectedColor, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + m_selectedColor = KisColor(m_selectedColor, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + + m_isDirtyLightStrip = true; + m_isDirtyWheel = true; #ifdef DEBUG_ARC_SELECTOR dbgPlugins << "KisColorSelector::setLumaCoefficients: " << m_lumaR @@ -206,6 +228,23 @@ m_currentGamutMask = gamutMask; m_viewConverter->setViewSize(m_renderAreaSize); m_viewConverter->setMaskSize(m_currentGamutMask->maskSize()); + + if (m_enforceGamutMask) { + m_isDirtyWheel = true; + } else { + m_isDirtyGamutMask = true; + } + + update(); +} + +void KisColorSelector::setDirty() +{ + m_isDirtyWheel = true; + m_isDirtyLightStrip = true; + m_isDirtyGamutMask = true; + m_isDirtyColorPreview = true; + update(); } @@ -224,13 +263,22 @@ { if (m_currentGamutMask) { m_gamutMaskOn = gamutMaskOn; + + if (m_enforceGamutMask) { + m_isDirtyWheel = true; + } else { + m_isDirtyGamutMask = true; + } + update(); } } void KisColorSelector::setEnforceGamutMask(bool enforce) { m_enforceGamutMask = enforce; + m_isDirtyGamutMask = true; + m_isDirtyWheel = true; update(); } @@ -366,7 +414,6 @@ void KisColorSelector::recalculateAreas(quint8 numLightPieces) { - qreal LIGHT_STRIP_RATIO = 0.075; if (m_showValueScaleNumbers) { LIGHT_STRIP_RATIO = 0.25; @@ -387,12 +434,21 @@ m_renderAreaSize = QSize(size,size); m_viewConverter->setViewSize(m_renderAreaSize); + m_widgetArea = QRect(0, 0, QWidget::width(), QWidget::height()); m_renderArea = QRect(x+stripThick, y, size, size); m_lightStripArea = QRect(0, 0, stripThick, QWidget::height()); m_renderBuffer = QImage(size, size, QImage::Format_ARGB32_Premultiplied); + m_colorPreviewBuffer = QImage(QWidget::width(), QWidget::height(), QImage::Format_ARGB32_Premultiplied); m_maskBuffer = QImage(size, size, QImage::Format_ARGB32_Premultiplied); + m_lightStripBuffer = QImage(stripThick, QWidget::height(), QImage::Format_ARGB32_Premultiplied); + m_numLightPieces = numLightPieces; + + m_isDirtyGamutMask = true; + m_isDirtyLightStrip = true; + m_isDirtyWheel = true; + m_isDirtyColorPreview = true; } void KisColorSelector::recalculateRings(quint8 numRings, quint8 numPieces) @@ -408,6 +464,8 @@ createRing(m_colorRings[i], numPieces, innerRadius, outerRadius+0.001); m_colorRings[i].saturation = m_inverseSaturation ? (1.0 - saturation) : saturation; } + + m_isDirtyWheel = true; } void KisColorSelector::createRing(ColorRing& ring, quint8 numPieces, qreal innerRadius, qreal outerRadius) @@ -465,17 +523,25 @@ << "S:" << color.getS() << "X:" << color.getX(); #endif + m_updateColorCompressor->start(qMakePair(color, role)); } void KisColorSelector::slotUpdateColorAndPreview(QPair color) { const bool selectAsFgColor = color.second == Acs::Foreground; - if (selectAsFgColor) { m_fgColor = color.first; } - else { m_bgColor = color.first; } + if (selectAsFgColor) { + m_fgColor = KisColor(color.first, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + } else { + m_bgColor = KisColor(color.first, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + } + + m_selectedColor = KisColor(color.first, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); - m_selectedColor = color.first; + m_isDirtyLightStrip = true; + m_isDirtyColorPreview = true; + m_isDirtyWheel = true; #ifdef DEBUG_ARC_SELECTOR dbgPlugins << "KisColorSelector::slotUpdateColorAndPreview: m_selectedColor set to:" @@ -558,6 +624,8 @@ void KisColorSelector::drawOutline(QPainter& painter, const QRect& rect) { + painter.save(); + painter.setRenderHint(QPainter::Antialiasing, true); painter.resetTransform(); painter.translate(rect.x() + rect.width()/2, rect.y() + rect.height()/2); @@ -611,20 +679,22 @@ painter.drawLine(QPointF(lineCoords.x()*iRad, lineCoords.y()*iRad), QPointF(lineCoords.x()*oRad, lineCoords.y()*oRad)); } } + + painter.restore(); } void KisColorSelector::drawLightStrip(QPainter& painter, const QRect& rect) { qreal penSize = qreal(qMin(QWidget::width(), QWidget::height())) / 200.0; qreal penSizeSmall = penSize / 1.2; QPen selectedPen; - KisColor valueScaleColor(m_selectedColor, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); + KisColor valueScaleColor(m_selectedColor, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); KisColor grayScaleColor(Qt::gray, m_colorConverter, m_colorSpace, m_lumaR, m_lumaG, m_lumaB, m_lumaGamma); int rectSize = rect.height(); - painter.resetTransform(); painter.save(); + painter.resetTransform(); painter.setRenderHint(QPainter::Antialiasing, true); QTransform matrix; @@ -700,10 +770,12 @@ QFont font = painter.font(); QFontMetrics fm = painter.fontMetrics(); - while (fm.boundingRect("100%").width() > rect.width()*rectColorLeftX) { + int retries = 10; // limit number of font size searches to prevent endless cycles + while ((retries > 0) && (fm.boundingRect("100%").width() > rect.width()*rectColorLeftX)) { font.setPointSize(font.pointSize() - 1); painter.setFont(font); fm = painter.fontMetrics(); + retries--; } for(int i=0; i 0) { + int valueNumber = 0; + if (m_colorSpace == KisColor::HSY) { + valueNumber = 100 - round(pow(pow(grayScaleColor.getX(), m_lumaGamma), 1.0/2.2)*100); + } else { + valueNumber = 100 - grayScaleColor.getX()*100; + } - if (valueNumber < 55) { - painter.setPen(QPen(QBrush(COLOR_DARK), penSize)); - } else { - painter.setPen(QPen(QBrush(COLOR_LIGHT), penSize)); - } + if (valueNumber < 55) { + painter.setPen(QPen(QBrush(COLOR_DARK), penSize)); + } else { + painter.setPen(QPen(QBrush(COLOR_LIGHT), penSize)); + } - painter.drawText(rectValue, Qt::AlignRight|Qt::AlignBottom, QString("%1%").arg(QString::number(valueNumber))); + painter.drawText(rectValue, Qt::AlignRight|Qt::AlignBottom, QString("%1%").arg(QString::number(valueNumber))); + } } } painter.restore(); } void KisColorSelector::drawBlip(QPainter& painter, const QRect& rect) { + painter.save(); + painter.setRenderHint(QPainter::Antialiasing, true); painter.resetTransform(); painter.translate(rect.x() + rect.width()/2, rect.y() + rect.height()/2); @@ -758,8 +836,9 @@ painter.drawEllipse(fgColorPos, 0.05, 0.05); painter.setPen(QPen(QBrush(COLOR_SELECTED_LIGHT), 0.01)); - painter.setBrush(m_fgColor.toQColor()); painter.drawEllipse(fgColorPos, 0.04, 0.04); + + painter.restore(); } void KisColorSelector::drawGamutMaskShape(QPainter &painter, const QRect &rect) @@ -787,66 +866,89 @@ painter.restore(); } -void KisColorSelector::paintEvent(QPaintEvent* /*event*/) +void KisColorSelector::drawColorPreview(QPainter &painter, const QRect &rect) { - // 0 red -> (1,0,0) - // 1 yellow -> (1,1,0) - // 2 green -> (0,1,0) - // 3 cyan -> (0,1,1) - // 4 blue -> (0,0,1) - // 5 maenta -> (1,0,1) - // 6 red -> (1,0,0) - - m_renderBuffer.fill(0); - - QPainter imgPainter(&m_renderBuffer); - QPainter wdgPainter(this); - - // draw the fg and bg color previews - // QPainter settings must be saved and restored afterwards, otherwise the wheel drawing is totally broken - wdgPainter.save(); - wdgPainter.setRenderHint(QPainter::Antialiasing, true); + painter.save(); + painter.setRenderHint(QPainter::Antialiasing, true); - QRect fgRect(0, 0, QWidget::width(), QWidget::height()); - wdgPainter.fillRect(fgRect, m_fgColor.toQColor()); + painter.fillRect(rect, m_fgColor.toQColor()); - int bgSide = qMin(QWidget::width()*0.15,QWidget::height()*0.15); + int bgSide = qMin(rect.width()*0.15,rect.height()*0.15); if (m_showBgColor) { QPointF bgPolyPoints[3] = { - QPointF(QWidget::width(), QWidget::height()), - QPointF(QWidget::width()-bgSide, QWidget::height()), - QPointF(QWidget::width(), QWidget::height()-bgSide) + QPointF(rect.width(), rect.height()), + QPointF(rect.width()-bgSide, rect.height()), + QPointF(rect.width(), rect.height()-bgSide) }; - wdgPainter.setBrush(m_bgColor.toQColor()); - wdgPainter.setPen(m_bgColor.toQColor()); - wdgPainter.drawPolygon(bgPolyPoints, 3); + painter.setBrush(m_bgColor.toQColor()); + painter.setPen(m_bgColor.toQColor()); + painter.drawPolygon(bgPolyPoints, 3); } - wdgPainter.restore(); + painter.restore(); +} - for(int i=0; i