17 #include "erasertool.h"
25 #include "scribblearea.h"
26 #include "strokemanager.h"
27 #include "layermanager.h"
28 #include "viewmanager.h"
29 #include "layervector.h"
30 #include "vectorimage.h"
31 #include "pointerevent.h"
38 ToolType EraserTool::type()
43 void EraserTool::loadSettings()
45 mPropertyEnabled[WIDTH] =
true;
46 mPropertyEnabled[USEFEATHER] =
true;
47 mPropertyEnabled[FEATHER] =
true;
48 mPropertyEnabled[USEFEATHER] =
true;
49 mPropertyEnabled[PRESSURE] =
true;
50 mPropertyEnabled[STABILIZATION] =
true;
51 mPropertyEnabled[ANTI_ALIASING] =
true;
55 properties.width = settings.value(
"eraserWidth", 24.0).toDouble();
56 properties.feather = settings.value(
"eraserFeather", 48.0).toDouble();
57 properties.useFeather = settings.value(
"eraserUseFeather",
true).toBool();
58 properties.pressure = settings.value(
"eraserPressure",
true).toBool();
59 properties.invisibility = DISABLED;
60 properties.preserveAlpha = OFF;
61 properties.stabilizerLevel = settings.value(
"stabilizerLevel", StabilizationLevel::NONE).toInt();
62 properties.useAA = settings.value(
"eraserAA", 1).toInt();
64 if (properties.useFeather) { properties.useAA = -1; }
70 void EraserTool::resetToDefault()
77 setStabilizerLevel(StabilizationLevel::NONE);
80 void EraserTool::setWidth(
const qreal width)
83 properties.width = width;
87 settings.setValue(
"eraserWidth", width);
91 void EraserTool::setUseFeather(
const bool usingFeather)
94 properties.useFeather = usingFeather;
98 settings.setValue(
"eraserUseFeather", usingFeather);
102 void EraserTool::setFeather(
const qreal feather)
105 properties.feather = feather;
109 settings.setValue(
"eraserFeather", feather);
113 void EraserTool::setPressure(
const bool pressure)
116 properties.pressure = pressure;
120 settings.setValue(
"eraserPressure", pressure);
124 void EraserTool::setAA(
const int AA)
127 properties.useAA = AA;
131 settings.setValue(
"eraserAA", AA);
135 void EraserTool::setStabilizerLevel(
const int level)
137 properties.stabilizerLevel = level;
140 settings.setValue(
"stabilizerLevel", level);
152 mScribbleArea->setAllDirty();
154 startStroke(event->inputType());
155 mLastBrushPoint = getCurrentPoint();
156 mMouseDownPoint = getCurrentPoint();
163 mCurrentPressure = strokeManager()->getPressure();
165 if (properties.stabilizerLevel != strokeManager()->getStabilizerLevel())
166 strokeManager()->setStabilizerLevel(properties.stabilizerLevel);
170 void EraserTool::pointerReleaseEvent(
PointerEvent *event)
172 if (event->inputType() != mCurrentInputType)
return;
174 mEditor->backup(typeName());
176 qreal distance =
QLineF(getCurrentPoint(), mMouseDownPoint).
length();
179 paintAt(mMouseDownPoint);
190 void EraserTool::paintAt(
QPointF point)
192 Layer* layer = mEditor->layers()->currentLayer();
193 if (layer->type() == Layer::BITMAP)
195 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
196 qreal opacity = (properties.pressure) ? (mCurrentPressure * 0.5) : 1.0;
197 qreal brushWidth = properties.width * pressure;
198 mCurrentWidth = brushWidth;
201 mScribbleArea->drawBrush(point,
204 QColor(255, 255, 255, 255),
206 properties.useFeather,
207 properties.useAA == ON);
209 int rad = qRound(brushWidth / 2 + 2);
212 mScribbleArea->paintBitmapBufferRect(rect);
214 mScribbleArea->refreshBitmap(rect, rad);
218 void EraserTool::drawStroke()
220 StrokeTool::drawStroke();
223 Layer* layer = mEditor->layers()->currentLayer();
225 if (layer->type() == Layer::BITMAP)
227 for (
int i = 0; i < p.
size(); i++)
229 p[i] = mEditor->view()->mapScreenToCanvas(p[i]);
232 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
233 qreal opacity = (properties.pressure) ? (mCurrentPressure * 0.5) : 1.0;
234 qreal brushWidth = properties.width * pressure;
235 mCurrentWidth = brushWidth;
237 qreal brushStep = (0.5 * brushWidth);
238 brushStep = qMax(1.0, brushStep);
246 int steps = qRound(distance / brushStep);
248 for (
int i = 0; i < steps; i++)
250 QPointF point = mLastBrushPoint + (i + 1) * brushStep * (getCurrentPoint() - mLastBrushPoint) / distance;
253 mScribbleArea->drawBrush(point,
258 properties.useFeather,
259 properties.useAA == ON);
260 if (i == (steps - 1))
262 mLastBrushPoint = getCurrentPoint();
266 int rad = qRound(brushWidth / 2 + 2);
268 mScribbleArea->paintBitmapBufferRect(rect);
269 mScribbleArea->refreshBitmap(rect, rad);
271 else if (layer->type() == Layer::VECTOR)
273 mCurrentWidth = properties.width;
274 if (properties.pressure)
276 mCurrentWidth = (mCurrentWidth + (strokeManager()->getPressure() * mCurrentWidth)) * 0.5;
278 qreal brushWidth = mCurrentWidth;
281 int rad = qRound(brushWidth) / 2 + 2;
291 mScribbleArea->refreshVector(path.boundingRect().toRect(), rad);
296 void EraserTool::removeVectorPaint()
298 Layer* layer = mEditor->layers()->currentLayer();
299 if (layer->type() == Layer::BITMAP)
301 mScribbleArea->paintBitmapBuffer();
302 mScribbleArea->setAllDirty();
303 mScribbleArea->clearBitmapBuffer();
305 else if (layer->type() == Layer::VECTOR)
307 mScribbleArea->clearBitmapBuffer();
308 VectorImage* vectorImage =
static_cast<LayerVector*
>(layer)->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
309 if (vectorImage ==
nullptr) {
return; }
315 mScribbleArea->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
316 mScribbleArea->setAllDirty();
320 void EraserTool::updateStrokes()
322 Layer* layer = mEditor->layers()->currentLayer();
323 if (layer->type() == Layer::BITMAP || layer->type() == Layer::VECTOR)
328 if (layer->type() == Layer::VECTOR)
330 qreal radius = properties.width / 2;
332 VectorImage* currKey =
static_cast<VectorImage*
>(layer->getLastKeyFrameAtPosition(mEditor->currentFrame()));
334 for (
auto nearbyVertice : nearbyVertices)
338 mScribbleArea->setAllDirty();
QHash::iterator insert(const Key &key, const T &value)
QList< VertexRef > getVerticesCloseTo(QPointF thisPoint, qreal maxDistance)
VectorImage::getVerticesCloseTo.
qreal length() const const
void deleteSelectedPoints()
VectorImage::deleteSelectedPoints.
Qt::MouseButtons buttons() const
Returns Qt::MouseButtons()
QPoint toPoint() const const
void setSelected(int curveNumber, bool YesOrNo)
VectorImage::setSelected.