diff --git a/krita/krita.action b/krita/krita.action
--- a/krita/krita.action
+++ b/krita/krita.action
@@ -1763,6 +1763,18 @@
false
+
+
+ Select Hard Overlay Blending Mode
+
+ Select Hard Overlay Blending Mode
+ Select Hard Overlay Blending Mode
+ 0
+ 0
+ Alt+Shift+P
+ false
+
+
Select Soft Light Blending Mode
diff --git a/libs/pigment/KoCompositeOpRegistry.h b/libs/pigment/KoCompositeOpRegistry.h
--- a/libs/pigment/KoCompositeOpRegistry.h
+++ b/libs/pigment/KoCompositeOpRegistry.h
@@ -63,7 +63,8 @@
const QString COMPOSITE_HARD_MIX = "hard mix";
const QString COMPOSITE_OVERLAY = "overlay";
const QString COMPOSITE_BEHIND = "behind";
-const QString COMPOSITE_GREATER = "greater";
+const QString COMPOSITE_GREATER = "greater";
+const QString COMPOSITE_HARD_OVERLAY = "hard overlay";
const QString COMPOSITE_DARKEN = "darken";
const QString COMPOSITE_BURN = "burn";//this is also known as 'color burn'.
diff --git a/libs/pigment/KoCompositeOpRegistry.cpp b/libs/pigment/KoCompositeOpRegistry.cpp
--- a/libs/pigment/KoCompositeOpRegistry.cpp
+++ b/libs/pigment/KoCompositeOpRegistry.cpp
@@ -90,6 +90,7 @@
m_map.insert(m_categories[4], KoID(COMPOSITE_GEOMETRIC_MEAN , i18n("Geometric Mean")));
m_map.insert(m_categories[4], KoID(COMPOSITE_DESTINATION_ATOP, i18n("Destination Atop")));
m_map.insert(m_categories[4], KoID(COMPOSITE_DESTINATION_IN , i18n("Destination In")));
+ m_map.insert(m_categories[4], KoID(COMPOSITE_HARD_OVERLAY , i18n("Hard Overlay")));
m_map.insert(m_categories[5], KoID(COMPOSITE_BUMPMAP , i18n("Bumpmap")));
m_map.insert(m_categories[5], KoID(COMPOSITE_COMBINE_NORMAL, i18n("Combine Normal Map")));
diff --git a/libs/pigment/compositeops/KoCompositeOpFunctions.h b/libs/pigment/compositeops/KoCompositeOpFunctions.h
--- a/libs/pigment/compositeops/KoCompositeOpFunctions.h
+++ b/libs/pigment/compositeops/KoCompositeOpFunctions.h
@@ -417,6 +417,19 @@
inline T cfMultiply(T src, T dst) { return Arithmetic::mul(src, dst); }
template
+inline T cfHardOverlay(T src, T dst) {
+ using namespace Arithmetic;
+
+ qreal fsrc = scale(src);
+ qreal fdst = scale(dst);
+
+ if(fsrc > 0.5f) {
+ return scale(cfDivide(inv(2.0 * fsrc - 1.0f), fdst));
+ }
+ return scale(mul(2.0 * fsrc, fdst));
+}
+
+template
inline T cfDifference(T src, T dst) { return qMax(src,dst) - qMin(src,dst); }
template
diff --git a/libs/pigment/compositeops/KoCompositeOps.h b/libs/pigment/compositeops/KoCompositeOps.h
--- a/libs/pigment/compositeops/KoCompositeOps.h
+++ b/libs/pigment/compositeops/KoCompositeOps.h
@@ -122,6 +122,7 @@
add<&cfGeometricMean >(cs, COMPOSITE_GEOMETRIC_MEAN, i18n("Geometric Mean"), KoCompositeOp::categoryMix());
add<&cfParallel >(cs, COMPOSITE_PARALLEL , i18n("Parallel") , KoCompositeOp::categoryMix());
add<&cfAllanon >(cs, COMPOSITE_ALLANON , i18n("Allanon") , KoCompositeOp::categoryMix());
+ add<&cfHardOverlay >(cs, COMPOSITE_HARD_OVERLAY , i18n("Hard Overlay") , KoCompositeOp::categoryMix());
add<&cfScreen >(cs, COMPOSITE_SCREEN , i18n("Screen") , KoCompositeOp::categoryLight());
add<&cfColorDodge >(cs, COMPOSITE_DODGE , i18n("Color Dodge") , KoCompositeOp::categoryLight());
diff --git a/libs/ui/widgets/kis_cmb_composite.h b/libs/ui/widgets/kis_cmb_composite.h
--- a/libs/ui/widgets/kis_cmb_composite.h
+++ b/libs/ui/widgets/kis_cmb_composite.h
@@ -78,6 +78,7 @@
void slotColorDodge();
void slotLinearDodge();
void slotOverlay();
+ void slotHardOverlay();
void slotSoftLight();
void slotHardLight();
void slotVividLight();
diff --git a/libs/ui/widgets/kis_cmb_composite.cc b/libs/ui/widgets/kis_cmb_composite.cc
--- a/libs/ui/widgets/kis_cmb_composite.cc
+++ b/libs/ui/widgets/kis_cmb_composite.cc
@@ -182,6 +182,13 @@
connect(action, SIGNAL(triggered()), SLOT(slotOverlay()));
m_actions << action;
+ // Hard Overlay
+ // Shift + Alt + P
+ action = new KisAction(i18n("Select Hard Overlay Blending Mode"), this);
+ action->setDefaultShortcut(QKeySequence(Qt::SHIFT + Qt::ALT + Qt::Key_P));
+ connect(action, SIGNAL(triggered()), SLOT(slotHardOverlay()));
+ m_actions << action;
+
// Soft Light
// Shift + Alt + F
action = new KisAction(i18n("Select Soft Light Blending Mode"), this);
@@ -408,6 +415,11 @@
selectCompositeOp(KoCompositeOpRegistry::instance().getKoID(COMPOSITE_OVERLAY));
}
+void KisCompositeOpComboBox::slotHardOverlay()
+{
+ selectCompositeOp(KoCompositeOpRegistry::instance().getKoID(COMPOSITE_HARD_OVERLAY));
+}
+
void KisCompositeOpComboBox::slotSoftLight()
{
selectCompositeOp(KoCompositeOpRegistry::instance().getKoID(COMPOSITE_SOFT_LIGHT_PHOTOSHOP));