QImage BlurEffect::processImage(const QImage &image, const KoFilterEffectRenderContext &context) const { if (m_deviation.x() == 0.0 || m_deviation.y() == 0.0) return image; // TODO: take filter region into account // TODO: blur with different kernels in x and y // convert from bounding box coordinates QPointF dev = context.toUserSpace(m_deviation); // transform to view coordinates dev = context.viewConverter()->documentToView(dev); QImage result = image; fastbluralpha(result, dev.x()); return result; }
QImage MorphologyEffect::processImage(const QImage &image, const KoFilterEffectRenderContext &context) const { QImage result = image; QPointF radius = context.toUserSpace(m_radius); const int rx = static_cast<int>(ceil(radius.x())); const int ry = static_cast<int>(ceil(radius.y())); const int w = result.width(); const int h = result.height(); // setup mask const int maskSize = (1+2*rx)*(1+2*ry); int * mask = new int[maskSize]; int index = 0; for (int y = -ry; y <= ry; ++y) { for (int x = -rx; x <= rx; ++x) { mask[index] = y*w+x; index++; } } int dstPixel, srcPixel; uchar s0, s1, s2, s3; #if QT_VERSION >= 0x040700 const uchar * src = image.constBits(); #else const uchar * src = image.bits(); #endif uchar * dst = result.bits(); const QRect roi = context.filterRegion().toRect(); const int minX = qMax(rx, roi.left()); const int maxX = qMin(w-rx, roi.right()); const int minY = qMax(ry, roi.top()); const int maxY = qMin(h-ry, roi.bottom()); const int defValue = m_operator == Erode ? 255 : 0; uchar * d = 0; for (int row = minY; row < maxY; ++row) { for (int col = minX; col < maxX; ++col) { dstPixel = row * w + col; s0 = s1 = s2 = s3 = defValue; for (int i = 0; i < maskSize; ++i) { srcPixel = dstPixel+mask[i]; const uchar *s = &src[4*srcPixel]; if (m_operator == Erode ) { s0 = qMin(s0, s[0]); s1 = qMin(s1, s[1]); s2 = qMin(s2, s[2]); s3 = qMin(s3, s[3]); } else { s0 = qMax(s0, s[0]); s1 = qMax(s1, s[1]); s2 = qMax(s2, s[2]); s3 = qMax(s3, s[3]); } } d = &dst[4*dstPixel]; d[0] = s0; d[1] = s1; d[2] = s2; d[3] = s3; } } delete [] mask; return result; }