34
34
#include "kis_selection.h"
35
35
#include "kis_random_accessor.h"
37
#include <kis_fixed_paint_device.h>
39
#include "kis_deform_option.h"
40
#include "kis_brush_size_option.h"
37
42
KisDeformPaintOp::KisDeformPaintOp(const KisDeformPaintOpSettings *settings, KisPainter * painter, KisImageWSP image)
38
43
: KisPaintOp(painter)
40
46
Q_ASSERT(settings);
41
m_deformBrush.setAction(settings->deformAction());
42
m_deformBrush.setRadius(settings->radius());
43
m_deformBrush.setDeformAmount(settings->deformAmount());
44
m_deformBrush.setInterpolation(settings->bilinear());
45
m_deformBrush.setImage(image);
46
m_deformBrush.setCounter(1);
47
m_useMovementPaint = settings->useMovementPaint();
48
m_deformBrush.setUseCounter(settings->useCounter());
49
m_deformBrush.setUseOldData(settings->useOldData());
51
if (!settings->node()) {
54
m_dev = settings->node()->paintDevice();
57
if ((settings->radius()) > 1) {
58
m_ySpacing = m_xSpacing = settings->radius() * settings->spacing();
48
m_sizeProperties.readOptionSetting(settings);
51
m_sizeOption.readOptionSetting(settings);
52
m_opacityOption.readOptionSetting(settings);
53
m_rotationOption.readOptionSetting(settings);
54
m_sizeOption.sensor()->reset();
55
m_opacityOption.sensor()->reset();
56
m_rotationOption.sensor()->reset();
59
m_properties.action = settings->getInt(DEFORM_ACTION);
60
m_properties.deformAmount = settings->getDouble(DEFORM_AMOUNT);
61
m_properties.useBilinear = settings->getBool(DEFORM_USE_BILINEAR);
62
m_properties.useCounter = settings->getBool(DEFORM_USE_COUNTER);
63
m_properties.useOldData = settings->getBool(DEFORM_USE_OLD_DATA);
65
m_deformBrush.setProperties( &m_properties );
66
m_deformBrush.setSizeProperties( &m_sizeProperties );
67
m_deformBrush.initDeformAction();
69
m_useMovementPaint = settings->getBool(DEFORM_USE_MOVEMENT_PAINT);
72
if ((m_sizeProperties.diameter * 0.5) > 1) {
73
m_ySpacing = m_xSpacing = m_sizeProperties.diameter * 0.5 * m_sizeProperties.spacing;
60
75
m_ySpacing = m_xSpacing = 1.0;
62
77
m_spacing = m_xSpacing;
66
80
KisDeformPaintOp::~KisDeformPaintOp()
70
double KisDeformPaintOp::spacing(double & xSpacing, double & ySpacing, double pressure1, double pressure2) const
74
xSpacing = m_xSpacing;
75
ySpacing = m_ySpacing;
84
qreal KisDeformPaintOp::paintAt(const KisPaintInformation& info)
86
if (!painter()) return m_spacing;
87
if (!m_dev) return m_spacing;
90
KisFixedPaintDeviceSP dab = cachedDab(painter()->device()->colorSpace());
97
QPointF pt = info.pos();
98
if (m_sizeProperties.jitterEnabled){
99
pt.setX(pt.x() + ( ( m_sizeProperties.diameter * drand48() ) - m_sizeProperties.diameter * 0.5) * m_sizeProperties.jitterMovementAmount);
100
pt.setY(pt.y() + ( ( m_sizeProperties.diameter * drand48() ) - m_sizeProperties.diameter * 0.5) * m_sizeProperties.jitterMovementAmount);
103
qreal rotation = m_sizeProperties.rotation + m_rotationOption.apply(info);
104
qreal scale = m_sizeProperties.scale * KisPaintOp::scaleForPressure(m_sizeOption.apply(info));
106
QPointF pos = pt - m_deformBrush.hotSpot(scale,rotation);
108
splitCoordinate(pos.x(), &x, &subPixelX);
109
splitCoordinate(pos.y(), &y, &subPixelY);
111
m_deformBrush.paintMask(dab, m_dev, scale,rotation,info.pos(), subPixelX,subPixelY);
113
quint8 origOpacity = m_opacityOption.apply(painter(), info);
114
painter()->bltFixed(QPoint(x, y), dab, dab->bounds());
115
painter()->setOpacity(origOpacity);
119
m_dab = new KisPaintDevice(painter()->device()->colorSpace());
124
m_deformBrush.oldDeform(m_dab,m_dev,info.pos());
125
QRect rc = m_dab->extent();
126
painter()->bitBlt(rc.x(), rc.y(), m_dab, rc.x(), rc.y(), rc.width(), rc.height());
133
qreal KisDeformPaintOp::spacing(qreal pressure) const
80
void KisDeformPaintOp::paintAt(const KisPaintInformation& info)
82
if (!painter()) return;
86
m_dab = new KisPaintDevice(painter()->device()->colorSpace());
91
//write device, read device, position
92
m_deformBrush.paint(m_dab, m_dev, info);
94
QRect rc = m_dab->extent();
95
painter()->bitBlt(rc.x(), rc.y(), m_dab, rc.x(), rc.y(), rc.width(), rc.height());