22#include "vectorimage.h"
23#include "layervector.h"
24#include "colormanager.h"
25#include "layermanager.h"
26#include "viewmanager.h"
27#include "undoredomanager.h"
28#include "selectionmanager.h"
30#include "scribblearea.h"
32#include "pointerevent.h"
39void PenTool::loadSettings()
43 mPropertyEnabled[WIDTH] =
true;
44 mPropertyEnabled[PRESSURE] =
true;
45 mPropertyEnabled[VECTORMERGE] =
true;
46 mPropertyEnabled[ANTI_ALIASING] =
true;
47 mPropertyEnabled[STABILIZATION] =
true;
51 properties.width = settings.value(
"penWidth", 12.0).toDouble();
52 properties.pressure = settings.value(
"penPressure",
true).toBool();
53 properties.invisibility = OFF;
54 properties.preserveAlpha = OFF;
55 properties.useAA = settings.value(
"penAA",
true).toBool();
56 properties.stabilizerLevel = settings.value(
"penLineStabilization", StabilizationLevel::STRONG).toInt();
57 properties.useFeather =
false;
62void PenTool::saveSettings()
66 settings.setValue(
"penWidth", properties.width);
67 settings.setValue(
"penPressure", properties.pressure);
68 settings.setValue(
"penAA", properties.useAA);
69 settings.setValue(
"penLineStabilization", properties.stabilizerLevel);
74void PenTool::resetToDefault()
79 setStabilizerLevel(StabilizationLevel::STRONG);
83void PenTool::setWidth(
const qreal width)
86 properties.width = width;
89void PenTool::setPressure(
const bool pressure)
92 properties.pressure = pressure;
95void PenTool::setAA(
const int AA)
98 properties.useAA = AA;
102void PenTool::setStabilizerLevel(
const int level)
104 properties.stabilizerLevel = level;
109 if (mEditor->preference()->isOn(SETTING::TOOL_CURSOR))
118 mInterpolator.pointerPressEvent(
event);
119 if (handleQuickSizing(
event)) {
123 mMouseDownPoint = getCurrentPoint();
124 mLastBrushPoint = getCurrentPoint();
126 startStroke(
event->inputType());
128 StrokeTool::pointerPressEvent(
event);
133 mInterpolator.pointerMoveEvent(
event);
134 if (handleQuickSizing(
event)) {
140 mCurrentPressure = mInterpolator.getPressure();
142 if (properties.stabilizerLevel != mInterpolator.getStabilizerLevel())
144 mInterpolator.setStabilizerLevel(properties.stabilizerLevel);
148 StrokeTool::pointerMoveEvent(
event);
153 mInterpolator.pointerReleaseEvent(
event);
154 if (handleQuickSizing(
event)) {
158 if (
event->inputType() != mCurrentInputType)
return;
160 mEditor->backup(typeName());
162 Layer* layer = mEditor->layers()->currentLayer();
164 qreal distance =
QLineF(getCurrentPoint(), mMouseDownPoint).
length();
167 paintAt(mMouseDownPoint);
174 if (layer->type() == Layer::VECTOR) {
175 paintVectorStroke(layer);
179 StrokeTool::pointerReleaseEvent(
event);
183void PenTool::paintAt(
QPointF point)
185 Layer* layer = mEditor->layers()->currentLayer();
186 if (layer->type() == Layer::BITMAP)
188 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
189 qreal brushWidth = properties.width * pressure;
190 mCurrentWidth = brushWidth;
192 mScribbleArea->drawPen(point,
199void PenTool::drawStroke()
201 StrokeTool::drawStroke();
204 Layer* layer = mEditor->layers()->currentLayer();
206 if (layer->type() == Layer::BITMAP)
208 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
209 qreal brushWidth = properties.width * pressure;
210 mCurrentWidth = brushWidth;
214 qreal brushStep = (0.5 * brushWidth);
215 brushStep = qMax(1.0, brushStep);
221 int steps = qRound(distance / brushStep);
223 for (
int i = 0; i < steps; i++)
225 QPointF point = mLastBrushPoint + (i + 1) * brushStep * (getCurrentPoint() - mLastBrushPoint) / distance;
226 mScribbleArea->drawPen(point,
231 if (i == (steps - 1))
233 mLastBrushPoint = getCurrentPoint();
237 else if (layer->type() == Layer::VECTOR)
239 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
240 qreal brushWidth = properties.width * pressure;
251 path.cubicTo(p[1], p[2], p[3]);
257void PenTool::paintVectorStroke(
Layer* layer)
259 if (mStrokePoints.
empty())
263 mScribbleArea->clearDrawingBuffer();
264 qreal tol = mScribbleArea->getCurveSmoothing() / mEditor->view()->scaling();
266 BezierCurve curve(mStrokePoints, mStrokePressures, tol);
267 curve.setWidth(properties.width);
268 curve.setFeather(properties.feather);
269 curve.setFilled(
false);
270 curve.setInvisibility(properties.invisibility);
271 curve.setVariableWidth(properties.pressure);
272 curve.setColorNumber(mEditor->color()->frontColorNumber());
274 auto pLayerVector =
static_cast<LayerVector*
>(layer);
275 VectorImage* vectorImage = pLayerVector->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
276 if (vectorImage ==
nullptr) {
return; }
277 vectorImage->
addCurve(curve, mEditor->view()->scaling(),
false);
281 mEditor->deselectAll();
286 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)