void KisBidirectionalMixingOption::apply(KisPaintDeviceSP dab, KisPaintDeviceSP device, KisPainter* painter, qint32 sx, qint32 sy, qint32 sw, qint32 sh, quint8 pressure, const QRect& dstRect) { if (!isChecked()) return; KoColorSpace *cs = dab->colorSpace(); KisPaintDeviceSP canvas = new KisPaintDevice(cs); KisPainter p(canvas); p.setCompositeOp(COMPOSITE_COPY); p.bitBlt(sx, sy, device, dstRect.x(), dstRect.y(), sw, sh); int count = cs->channelCount(); KisRectIterator cit = canvas->createRectIterator(sx, sy, sw, sh); KisRectIterator dit = dab->createRectIterator(sx, sy, sw, sh); QVector<float> cc(count), dc(count); while (!cit.isDone()) { if (cs->alpha(dit.rawData()) > 10 && cs->alpha(cit.rawData()) > 10) { cs->normalisedChannelsValue(cit.rawData(), cc); cs->normalisedChannelsValue(dit.rawData(), dc); for (int i = 0; i < count; i++) dc[i] = (1.0 - 0.4 * pressure) * cc[i] + 0.4 * pressure * dc[i]; cs->fromNormalisedChannelsValue(dit.rawData(), dc); if (dit.x() == (int)(sw / 2) && dit.y() == (int)(sh / 2)) painter->setPaintColor(KoColor(dit.rawData(), cs)); } ++cit; ++dit; } }