22#include "vectorimage.h"
23#include "layervector.h"
24#include "colormanager.h"
25#include "strokemanager.h"
26#include "layermanager.h"
27#include "viewmanager.h"
28#include "selectionmanager.h"
30#include "scribblearea.h"
32#include "pointerevent.h"
39void PenTool::loadSettings()
41 mPropertyEnabled[WIDTH] =
true;
42 mPropertyEnabled[PRESSURE] =
true;
43 mPropertyEnabled[VECTORMERGE] =
true;
44 mPropertyEnabled[ANTI_ALIASING] =
true;
45 mPropertyEnabled[STABILIZATION] =
true;
49 properties.width = settings.value(
"penWidth", 12.0).toDouble();
50 properties.pressure = settings.value(
"penPressure",
true).toBool();
51 properties.invisibility = OFF;
52 properties.preserveAlpha = OFF;
53 properties.useAA = settings.value(
"penAA",
true).toBool();
54 properties.stabilizerLevel = settings.value(
"penLineStabilization", StabilizationLevel::STRONG).toInt();
59void PenTool::resetToDefault()
64 setStabilizerLevel(StabilizationLevel::STRONG);
68void PenTool::setWidth(
const qreal width)
71 properties.width = width;
75 settings.setValue(
"penWidth", width);
79void PenTool::setPressure(
const bool pressure)
82 properties.pressure = pressure;
86 settings.setValue(
"penPressure", pressure);
90void PenTool::setAA(
const int AA)
93 properties.useAA = AA;
97 settings.setValue(
"penAA", AA);
101void PenTool::setStabilizerLevel(
const int level)
103 properties.stabilizerLevel = level;
106 settings.setValue(
"penLineStabilization", level);
112 if (mEditor->preference()->isOn(SETTING::TOOL_CURSOR))
121 mMouseDownPoint = getCurrentPoint();
122 mLastBrushPoint = getCurrentPoint();
124 startStroke(
event->inputType());
131 mCurrentPressure = strokeManager()->getPressure();
133 if (properties.stabilizerLevel != strokeManager()->getStabilizerLevel())
134 strokeManager()->setStabilizerLevel(properties.stabilizerLevel);
140 if (
event->inputType() != mCurrentInputType)
return;
142 mEditor->backup(typeName());
144 Layer* layer = mEditor->layers()->currentLayer();
146 qreal distance =
QLineF(getCurrentPoint(), mMouseDownPoint).
length();
149 paintAt(mMouseDownPoint);
156 if (layer->type() == Layer::BITMAP)
158 else if (layer->type() == Layer::VECTOR)
159 paintVectorStroke(layer);
164void PenTool::paintAt(
QPointF point)
166 Layer* layer = mEditor->layers()->currentLayer();
167 if (layer->type() == Layer::BITMAP)
169 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
170 qreal brushWidth = properties.width * pressure;
171 mCurrentWidth = brushWidth;
173 mScribbleArea->drawPen(point,
180void PenTool::drawStroke()
182 StrokeTool::drawStroke();
185 Layer* layer = mEditor->layers()->currentLayer();
187 if (layer->type() == Layer::BITMAP)
189 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
190 qreal brushWidth = properties.width * pressure;
191 mCurrentWidth = brushWidth;
195 qreal brushStep = (0.5 * brushWidth);
196 brushStep = qMax(1.0, brushStep);
202 int steps = qRound(distance / brushStep);
204 for (
int i = 0; i < steps; i++)
206 QPointF point = mLastBrushPoint + (i + 1) * brushStep * (getCurrentPoint() - mLastBrushPoint) / distance;
207 mScribbleArea->drawPen(point,
212 if (i == (steps - 1))
214 mLastBrushPoint = getCurrentPoint();
218 else if (layer->type() == Layer::VECTOR)
220 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
221 qreal brushWidth = properties.width * pressure;
232 path.cubicTo(p[1], p[2], p[3]);
238void PenTool::paintBitmapStroke()
240 mScribbleArea->paintBitmapBuffer();
241 mScribbleArea->clearBitmapBuffer();
244void PenTool::paintVectorStroke(
Layer* layer)
246 if (mStrokePoints.
empty())
250 mScribbleArea->clearBitmapBuffer();
251 qreal tol = mScribbleArea->getCurveSmoothing() / mEditor->view()->scaling();
253 BezierCurve curve(mStrokePoints, mStrokePressures, tol);
254 curve.setWidth(properties.width);
255 curve.setFeather(properties.feather);
256 curve.setFilled(
false);
257 curve.setInvisibility(properties.invisibility);
258 curve.setVariableWidth(properties.pressure);
259 curve.setColorNumber(mEditor->color()->frontColorNumber());
261 auto pLayerVector =
static_cast<LayerVector*
>(layer);
262 VectorImage* vectorImage = pLayerVector->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
263 if (vectorImage ==
nullptr) {
return; }
264 vectorImage->
addCurve(curve, mEditor->view()->scaling(),
false);
268 mEditor->deselectAll();
273 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)