18#include "ui_wdg_motion_blur.h"
49 config->setProperty(
"blurAngle", 0);
50 config->setProperty(
"blurLength", 5);
56struct MotionBlurProperties
60 const int blurAngle = config->getInt(
"blurAngle", 0);
61 const int blurLength = config->getInt(
"blurLength", 5);
67 const qreal halfWidth = 0.5 * t.
scale(blurLength) * cos(angleRadians);
68 const qreal halfHeight = 0.5 * t.
scale(blurLength) * sin(angleRadians);
70 kernelHalfSize.rwidth() = ceil(fabs(halfWidth));
71 kernelHalfSize.rheight() = ceil(fabs(halfHeight));
72 kernelSize = kernelHalfSize * 2 + QSize(1, 1);
73 this->blurLength = blurLength;
76 QPointF
p1(0.5 * kernelSize.width(), 0.5 * kernelSize.height());
77 QPointF
p2(halfWidth, halfHeight);
78 motionLine = QLineF(
p1 -
p2,
p1 +
p2);
94 QPoint srcTopLeft =
rect.topLeft();
100 MotionBlurProperties props(config, t);
102 if (props.blurLength == 0) {
106 QBitArray channelFlags;
109 channelFlags = config->channelFlags();
112 if (channelFlags.isEmpty() || !config) {
116 QImage kernelRepresentation(props.kernelSize, QImage::Format_RGB32);
117 kernelRepresentation.fill(0);
119 QPainter imagePainter(&kernelRepresentation);
120 imagePainter.setRenderHint(QPainter::Antialiasing);
121 imagePainter.setPen(QPen(QColor::fromRgb(255, 255, 255), 1.0));
122 imagePainter.drawLine(props.motionLine);
125 Eigen::Matrix<qreal, Eigen::Dynamic, Eigen::Dynamic> motionBlurKernel(props.kernelSize.height(), props.kernelSize.width());
126 for (
int j = 0; j < props.kernelSize.height(); ++j) {
127 for (
int i = 0; i < props.kernelSize.width(); ++i) {
128 motionBlurKernel(j, i) = qRed(kernelRepresentation.pixel(i, j));
144 MotionBlurProperties props(_config, t);
145 return rect.adjusted(-props.kernelHalfSize.width(), -props.kernelHalfSize.height(), props.kernelHalfSize.width(), props.kernelHalfSize.height());
The KisConvolutionPainter class applies a convolution kernel to a paint device.
void applyMatrix(const KisConvolutionKernelSP kernel, const KisPaintDeviceSP src, QPoint srcPos, QPoint dstPos, QSize areaSize, KisConvolutionBorderOp borderOp=BORDER_REPEAT)
void setSupportsLevelOfDetail(bool value)
KisFilterConfigurationSP defaultConfiguration(KisResourcesInterfaceSP resourcesInterface) const override
QRect changedRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
void processImpl(KisPaintDeviceSP src, const QRect &size, const KisFilterConfigurationSP config, KoUpdater *progressUpdater) const override
KisConfigWidget * createConfigurationWidget(QWidget *parent, const KisPaintDeviceSP dev, bool useForMasks) const override
QRect neededRect(const QRect &rect, const KisFilterConfigurationSP _config, int lod) const override
const KoColorSpace * colorSpace() const
void setProgress(KoUpdater *progressUpdater)
void setChannelFlags(QBitArray channelFlags)
virtual quint32 channelCount() const =0
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
const KoID FiltersCategoryBlurId("blur_filters", ki18nc("The category of blur filters, like gaussian blur. Verb.", "Blur"))
T kisDegreesToRadians(T degrees)
virtual KisFilterConfigurationSP factoryConfiguration(KisResourcesInterfaceSP resourcesInterface) const
void setSupportsAdjustmentLayers(bool v)
void setSupportsPainting(bool v)
void setColorSpaceIndependence(ColorSpaceIndependence v)
static KisConvolutionKernelSP fromMatrix(Eigen::Matrix< qreal, Eigen::Dynamic, Eigen::Dynamic > matrix, qreal offset, qreal factor)