26#include "beziercurve.h"
27#include "vectorimage.h"
29#include "colormanager.h"
30#include "strokemanager.h"
31#include "layermanager.h"
32#include "viewmanager.h"
33#include "selectionmanager.h"
34#include "scribblearea.h"
35#include "pointerevent.h"
42ToolType BrushTool::type()
47void BrushTool::loadSettings()
49 mPropertyEnabled[WIDTH] =
true;
50 mPropertyEnabled[FEATHER] =
true;
51 mPropertyEnabled[PRESSURE] =
true;
52 mPropertyEnabled[INVISIBILITY] =
true;
53 mPropertyEnabled[STABILIZATION] =
true;
57 properties.width = settings.value(
"brushWidth", 24.0).toDouble();
58 properties.feather = settings.value(
"brushFeather", 48.0).toDouble();
59 properties.pressure = settings.value(
"brushPressure",
true).toBool();
60 properties.invisibility = settings.value(
"brushInvisibility",
false).toBool();
61 properties.preserveAlpha = OFF;
62 properties.stabilizerLevel = settings.value(
"brushLineStabilization", StabilizationLevel::STRONG).toInt();
63 properties.useAA = DISABLED;
65 if (properties.width <= 0) { setWidth(15); }
66 if (std::isnan(properties.feather)) { setFeather(15); }
72void BrushTool::resetToDefault()
76 setStabilizerLevel(StabilizationLevel::STRONG);
79void BrushTool::setWidth(
const qreal width)
82 properties.width = width;
86 settings.setValue(
"brushWidth", width);
90void BrushTool::setFeather(
const qreal feather)
93 properties.feather = feather;
97 settings.setValue(
"brushFeather", feather);
101void BrushTool::setInvisibility(
const bool invisibility)
104 properties.invisibility = invisibility;
107 settings.setValue(
"brushInvisibility", invisibility);
111void BrushTool::setPressure(
const bool pressure)
114 properties.pressure = pressure;
118 settings.setValue(
"brushPressure", pressure);
122void BrushTool::setStabilizerLevel(
const int level)
124 properties.stabilizerLevel = level;
127 settings.setValue(
"brushLineStabilization", level);
133 if (mEditor->preference()->isOn(SETTING::TOOL_CURSOR))
142 mMouseDownPoint = getCurrentPoint();
143 mLastBrushPoint = getCurrentPoint();
145 startStroke(
event->inputType());
152 mCurrentPressure = strokeManager()->getPressure();
154 if (properties.stabilizerLevel != strokeManager()->getStabilizerLevel())
155 strokeManager()->setStabilizerLevel(properties.stabilizerLevel);
161 if (
event->inputType() != mCurrentInputType)
return;
163 Layer* layer = mEditor->layers()->currentLayer();
164 mEditor->backup(typeName());
166 qreal distance =
QLineF(getCurrentPoint(), mMouseDownPoint).
length();
169 paintAt(mMouseDownPoint);
176 if (layer->type() == Layer::BITMAP)
178 else if (layer->type() == Layer::VECTOR)
185void BrushTool::paintAt(
QPointF point)
188 Layer* layer = mEditor->layers()->currentLayer();
189 if (layer->type() == Layer::BITMAP)
191 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
192 qreal opacity = (properties.pressure) ? (mCurrentPressure * 0.5) : 1.0;
193 qreal brushWidth = properties.width * pressure;
194 mCurrentWidth = brushWidth;
195 mScribbleArea->drawBrush(point,
204void BrushTool::drawStroke()
206 StrokeTool::drawStroke();
209 Layer* layer = mEditor->layers()->currentLayer();
211 if (layer->type() == Layer::BITMAP)
213 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
214 qreal opacity = (properties.pressure) ? (mCurrentPressure * 0.5) : 1.0;
215 qreal brushWidth = properties.width * pressure;
216 mCurrentWidth = brushWidth;
218 qreal brushStep = (0.5 * brushWidth);
219 brushStep = qMax(1.0, brushStep);
225 int steps = qRound(distance / brushStep);
227 for (
int i = 0; i < steps; i++)
229 QPointF point = mLastBrushPoint + (i + 1) * brushStep * (getCurrentPoint() - mLastBrushPoint) / distance;
231 mScribbleArea->drawBrush(point,
237 if (i == (steps - 1))
239 mLastBrushPoint = getCurrentPoint();
259 else if (layer->type() == Layer::VECTOR)
261 qreal pressure = (properties.pressure) ? mCurrentPressure : 1;
262 qreal brushWidth = properties.width * pressure;
273 path.cubicTo(p[1], p[2], p[3]);
280void BrushTool::paintBitmapStroke()
282 mScribbleArea->paintBitmapBuffer();
283 mScribbleArea->clearBitmapBuffer();
288void BrushTool::paintVectorStroke()
290 if (mStrokePoints.
empty())
293 Layer* layer = mEditor->layers()->currentLayer();
295 if (layer->type() == Layer::VECTOR && mStrokePoints.
size() > -1)
298 mScribbleArea->clearBitmapBuffer();
299 qreal tol = mScribbleArea->getCurveSmoothing() / mEditor->view()->scaling();
301 BezierCurve curve(mStrokePoints, mStrokePressures, tol);
302 curve.setWidth(properties.width);
303 curve.setFeather(properties.feather);
304 curve.setFilled(
false);
305 curve.setInvisibility(properties.invisibility);
306 curve.setVariableWidth(properties.pressure);
307 curve.setColorNumber(mEditor->color()->frontColorNumber());
309 VectorImage* vectorImage =
static_cast<VectorImage*
>(layer->getLastKeyFrameAtPosition(mEditor->currentFrame()));
310 vectorImage->
addCurve(curve, mEditor->view()->scaling(),
false);
314 mEditor->deselectAll();
319 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
QColor frontColor(bool useIndexedColor=true)
frontColor
void setSelected(int curveNumber, bool YesOrNo)
VectorImage::setSelected.
int getLastCurveNumber()
VectorImage::getLastCurveNumber.
void addCurve(BezierCurve &newCurve, qreal factor, bool interacts=true)
VectorImage::addCurve.
bool isAnyCurveSelected()
VectorImage::isAnyCurveSelected.
QHash::iterator insert(const Key &key, const T &value)
qreal length() const const
virtual bool event(QEvent *e)