20 #include "scribblearea.h"
22 #include "layermanager.h"
23 #include "colormanager.h"
24 #include "layerbitmap.h"
25 #include "layervector.h"
26 #include "strokemanager.h"
29 #include "smudgetool.h"
31 SmudgeTool::SmudgeTool(QObject *parent) :
37 ToolType SmudgeTool::type()
42 void SmudgeTool::loadSettings()
44 m_enabledProperties[WIDTH] =
true;
45 m_enabledProperties[FEATHER] =
true;
48 QSettings settings( PENCIL2D, PENCIL2D );
49 properties.width = settings.value(
"smudgeWidth").toDouble();
50 properties.feather = settings.value(
"smudgeFeather").toDouble();
51 properties.pressure = 0;
52 properties.inpolLevel = -1;
55 if (properties.width <= 0)
63 void SmudgeTool::setWidth(
const qreal width)
66 properties.width = width;
69 QSettings settings( PENCIL2D, PENCIL2D );
70 settings.setValue(
"smudgeWidth", width);
74 void SmudgeTool::setFeather(
const qreal feather )
77 properties.feather = feather;
80 QSettings settings( PENCIL2D, PENCIL2D );
81 settings.setValue(
"smudgeFeather", feather);
85 void SmudgeTool::setPressure(
const bool pressure )
88 properties.pressure = pressure;
91 QSettings settings( PENCIL2D, PENCIL2D );
92 settings.setValue(
"smudgePressure", pressure);
96 QCursor SmudgeTool::cursor()
98 qDebug() <<
"smudge tool";
99 if ( toolMode == 0 ) {
100 return QCursor(QPixmap(
":icons/smudge.png"),0 ,16);
102 return QCursor(QPixmap(
":icons/liquify.png"),-4,16);
106 void SmudgeTool::adjustPressureSensitiveProperties(qreal pressure,
bool mouseDevice)
108 mCurrentWidth = properties.width;
109 if (properties.pressure && !mouseDevice)
111 mCurrentPressure = pressure;
115 mCurrentPressure = 1.0;
119 bool SmudgeTool::keyPressEvent(QKeyEvent *event)
121 if (event->key() == Qt::Key_Alt)
124 mScribbleArea->setCursor( cursor() );
130 bool SmudgeTool::keyReleaseEvent(QKeyEvent*)
134 mScribbleArea->setCursor( cursor() );
139 void SmudgeTool::mousePressEvent(QMouseEvent *event)
143 Layer* layer = mEditor->layers()->currentLayer();
144 if (layer == NULL) {
return; }
146 if (event->button() == Qt::LeftButton)
148 if (layer->type() == Layer::BITMAP)
150 mEditor->backup(typeName());
151 mScribbleArea->setAllDirty();
153 mLastBrushPoint = getCurrentPoint();
155 else if (layer->type() == Layer::VECTOR)
157 mScribbleArea->mClosestCurves = ((
LayerVector *)layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0)
158 ->getCurvesCloseTo( getCurrentPoint(), mScribbleArea->tol / mEditor->view()->scaling() );
159 mScribbleArea->mClosestVertices = ((
LayerVector *)layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0)
160 ->getVerticesCloseTo( getCurrentPoint(), mScribbleArea->tol / mEditor->view()->scaling() );
162 if (mScribbleArea->mClosestVertices.size() > 0 || mScribbleArea->mClosestCurves.size() > 0)
165 mEditor->backup(typeName());
168 if (event->modifiers() != Qt::ShiftModifier && !vectorImage->isSelected(mScribbleArea->mClosestVertices))
170 mScribbleArea->paintTransformedSelection();
171 mScribbleArea->deselectAll();
174 vectorImage->setSelected(mScribbleArea->mClosestVertices,
true);
175 mScribbleArea->vectorSelection.add(mScribbleArea->mClosestCurves);
176 mScribbleArea->vectorSelection.add(mScribbleArea->mClosestVertices);
178 mScribbleArea->update();
182 mScribbleArea->deselectAll();
188 void SmudgeTool::mouseReleaseEvent(QMouseEvent *event)
190 Layer* layer = mEditor->layers()->currentLayer();
191 if (layer == NULL) {
return; }
193 if (event->button() == Qt::LeftButton)
195 if (layer->type() == Layer::BITMAP)
198 mScribbleArea->setAllDirty();
201 else if (layer->type() == Layer::VECTOR)
204 vectorImage->applySelectionTransformation();
205 mScribbleArea->selectionTransformation.reset();
206 for (
int k = 0; k < mScribbleArea->vectorSelection.curve.size(); k++)
208 int curveNumber = mScribbleArea->vectorSelection.curve.at(k);
209 vectorImage->m_curves[curveNumber].smoothCurve();
211 mScribbleArea->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
216 void SmudgeTool::mouseMoveEvent(QMouseEvent *event)
218 Layer* layer = mEditor->layers()->currentLayer();
219 if (layer == NULL) {
return; }
221 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
223 if (event->buttons() & Qt::LeftButton)
225 if (layer->type() == Layer::BITMAP)
229 else if (layer->type() == Layer::VECTOR)
231 if (event->modifiers() != Qt::ShiftModifier)
234 mScribbleArea->selectionTransformation = QTransform().translate(mScribbleArea->mOffset.x(), mScribbleArea->mOffset.y());
235 ((
LayerVector *)layer)->getLastVectorImageAtFrame( mEditor->currentFrame(), 0)->setSelectionTransformation(mScribbleArea->selectionTransformation);
241 if (layer->type() == Layer::VECTOR)
243 mScribbleArea->mClosestVertices = ((
LayerVector *)layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0)
244 ->getVerticesCloseTo( getCurrentPoint(), mScribbleArea->tol / mEditor->view()->scaling() );
247 mScribbleArea->update();
248 mScribbleArea->setAllDirty();
252 void SmudgeTool::drawStroke()
254 if ( !mScribbleArea->isLayerPaintable() )
return;
256 Layer* layer = mEditor->layers()->currentLayer();
257 if (layer == NULL) {
return; }
260 StrokeTool::drawStroke();
263 for (
int i = 0; i < p.size(); i++)
265 p[ i ] = mEditor->view()->mapScreenToCanvas( p[ i ] );
269 qreal brushWidth = mCurrentWidth + 0.0 * properties.feather;
270 qreal offset = qMax(0.0, mCurrentWidth - 0.5 * properties.feather) / brushWidth;
275 QPointF a = mLastBrushPoint;
276 QPointF b = getCurrentPoint();
282 qreal distance = QLineF(b, a).length()/2.0;
283 int steps = qRound(distance / brushStep);
284 int rad = qRound(brushWidth / 2.0) + 2;
286 QPointF sourcePoint = mLastBrushPoint;
287 for (
int i = 0; i < steps; i++)
289 QPointF targetPoint = mLastBrushPoint + (i + 1) * (brushStep) * (b - mLastBrushPoint) / distance;
290 rect.extend(targetPoint.toPoint());
291 mScribbleArea->liquifyBrush( targetImage,
298 if (i == (steps - 1))
300 mLastBrushPoint = targetPoint;
302 sourcePoint = targetPoint;
303 mScribbleArea->paintBitmapBufferRect( rect );
304 mScribbleArea->refreshBitmap(rect, rad);
309 qreal brushStep = 2.0;
310 qreal distance = QLineF(b, a).length();
311 int steps = qRound(distance / brushStep);
312 int rad = qRound(brushWidth / 2.0) + 2;
314 QPointF sourcePoint = mLastBrushPoint;
315 for (
int i = 0; i < steps; i++)
317 QPointF targetPoint = mLastBrushPoint + (i + 1) * (brushStep) * (b - mLastBrushPoint) / distance;
318 rect.extend(targetPoint.toPoint());
319 mScribbleArea->blurBrush( targetImage,
326 if (i == (steps - 1))
328 mLastBrushPoint = targetPoint;
330 sourcePoint = targetPoint;
331 mScribbleArea->paintBitmapBufferRect( rect );
332 mScribbleArea->refreshBitmap(rect, rad);