~ubuntu-branches/ubuntu/precise/koffice/precise

« back to all changes in this revision

Viewing changes to krita/plugins/paintops/deform/kis_deform_paintop.cpp

  • Committer: Bazaar Package Importer
  • Author(s): Jonathan Riddell
  • Date: 2010-09-21 15:36:35 UTC
  • mfrom: (1.4.1 upstream) (60.2.11 maverick)
  • Revision ID: james.westby@ubuntu.com-20100921153635-6tejqkiro2u21ydi
Tags: 1:2.2.2-0ubuntu3
Add kubuntu_03_fix-crash-on-closing-sqlite-connection-2.2.2.diff and
kubuntu_04_support-large-memo-values-for-msaccess-2.2.2.diff as
recommended by upstream http://kexi-
project.org/wiki/wikiview/index.php@Kexi2.2_Patches.html#sqlite_stab
ility

Show diffs side-by-side

added added

removed removed

Lines of Context:
34
34
#include "kis_selection.h"
35
35
#include "kis_random_accessor.h"
36
36
 
 
37
#include <kis_fixed_paint_device.h>
 
38
 
 
39
#include "kis_deform_option.h"
 
40
#include "kis_brush_size_option.h"
 
41
 
37
42
KisDeformPaintOp::KisDeformPaintOp(const KisDeformPaintOpSettings *settings, KisPainter * painter, KisImageWSP image)
38
43
        : KisPaintOp(painter)
39
44
{
 
45
    Q_UNUSED(image);
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());
50
 
 
51
 
    if (!settings->node()) {
52
 
        m_dev = 0;
53
 
    } else {
54
 
        m_dev = settings->node()->paintDevice();
55
 
    }
56
 
 
57
 
    if ((settings->radius()) > 1) {
58
 
        m_ySpacing = m_xSpacing = settings->radius() * settings->spacing();
 
47
    
 
48
    m_sizeProperties.readOptionSetting(settings);
 
49
 
 
50
    // sensors
 
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();
 
57
 
 
58
    
 
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);
 
64
    
 
65
    m_deformBrush.setProperties( &m_properties );
 
66
    m_deformBrush.setSizeProperties( &m_sizeProperties );
 
67
    m_deformBrush.initDeformAction();
 
68
    
 
69
    m_useMovementPaint = settings->getBool(DEFORM_USE_MOVEMENT_PAINT);
 
70
    m_dev = source();
 
71
    
 
72
    if ((m_sizeProperties.diameter * 0.5) > 1) {
 
73
        m_ySpacing = m_xSpacing = m_sizeProperties.diameter * 0.5 * m_sizeProperties.spacing;
59
74
    } else {
60
75
        m_ySpacing = m_xSpacing = 1.0;
61
76
    }
62
77
    m_spacing = m_xSpacing;
63
 
 
64
78
}
65
79
 
66
80
KisDeformPaintOp::~KisDeformPaintOp()
67
81
{
68
82
}
69
83
 
70
 
double KisDeformPaintOp::spacing(double & xSpacing, double & ySpacing, double pressure1, double pressure2) const
71
 
{
72
 
    Q_UNUSED(pressure1);
73
 
    Q_UNUSED(pressure2);
74
 
    xSpacing = m_xSpacing;
75
 
    ySpacing = m_ySpacing;
 
84
qreal KisDeformPaintOp::paintAt(const KisPaintInformation& info)
 
85
{
 
86
    if (!painter()) return m_spacing;
 
87
    if (!m_dev) return m_spacing;
 
88
 
 
89
#if 1
 
90
        KisFixedPaintDeviceSP dab = cachedDab(painter()->device()->colorSpace());
 
91
 
 
92
        qint32 x;
 
93
        qreal subPixelX;
 
94
        qint32 y;
 
95
        qreal subPixelY;
 
96
        
 
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);
 
101
        }
 
102
 
 
103
        qreal rotation = m_sizeProperties.rotation + m_rotationOption.apply(info);
 
104
        qreal scale = m_sizeProperties.scale * KisPaintOp::scaleForPressure(m_sizeOption.apply(info));
 
105
 
 
106
        QPointF pos = pt - m_deformBrush.hotSpot(scale,rotation);
 
107
            
 
108
        splitCoordinate(pos.x(), &x, &subPixelX);
 
109
        splitCoordinate(pos.y(), &y, &subPixelY);
 
110
        
 
111
        m_deformBrush.paintMask(dab, m_dev, scale,rotation,info.pos(), subPixelX,subPixelY);
 
112
 
 
113
        quint8 origOpacity = m_opacityOption.apply(painter(), info);
 
114
        painter()->bltFixed(QPoint(x, y), dab, dab->bounds());
 
115
        painter()->setOpacity(origOpacity);
 
116
        return m_spacing;
 
117
#else  
 
118
        if (!m_dab) {
 
119
            m_dab = new KisPaintDevice(painter()->device()->colorSpace());
 
120
        } else {
 
121
            m_dab->clear();
 
122
        }
 
123
 
 
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());
 
127
        return m_spacing;
 
128
#endif
 
129
    
 
130
}
 
131
 
 
132
 
 
133
qreal KisDeformPaintOp::spacing(qreal pressure) const
 
134
{
76
135
    return m_spacing;
77
136
}
78
137
 
79
138
 
80
 
void KisDeformPaintOp::paintAt(const KisPaintInformation& info)
81
 
{
82
 
    if (!painter()) return;
83
 
    if (!m_dev) return;
84
 
 
85
 
    if (!m_dab) {
86
 
        m_dab = new KisPaintDevice(painter()->device()->colorSpace());
87
 
    } else {
88
 
        m_dab->clear();
89
 
    }
90
 
 
91
 
    //write device, read device, position
92
 
    m_deformBrush.paint(m_dab, m_dev, info);
93
 
 
94
 
    QRect rc = m_dab->extent();
95
 
    painter()->bitBlt(rc.x(), rc.y(), m_dab, rc.x(), rc.y(), rc.width(), rc.height());
96
 
}
97
 
 
98
139