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();
61void PenTool::saveSettings()
65 settings.setValue(
"penWidth", properties.width);
66 settings.setValue(
"penPressure", properties.pressure);
67 settings.setValue(
"penAA", properties.useAA);
68 settings.setValue(
"penLineStabilization", properties.stabilizerLevel);
73void PenTool::resetToDefault()
78 setStabilizerLevel(StabilizationLevel::STRONG);
82void PenTool::setWidth(
const qreal width)
85 properties.width = width;
88void PenTool::setPressure(
const bool pressure)
91 properties.pressure = pressure;
94void PenTool::setAA(
const int AA)
97 properties.useAA = AA;
101void PenTool::setStabilizerLevel(
const int level)
103 properties.stabilizerLevel = level;
108 if (mEditor->preference()->isOn(SETTING::TOOL_CURSOR))
117 mInterpolator.pointerPressEvent(
event);
118 if (handleQuickSizing(
event)) {
122 mMouseDownPoint = getCurrentPoint();
123 mLastBrushPoint = getCurrentPoint();
125 startStroke(
event->inputType());
127 StrokeTool::pointerPressEvent(
event);
132 mInterpolator.pointerMoveEvent(
event);
133 if (handleQuickSizing(
event)) {
139 mCurrentPressure = mInterpolator.getPressure();
141 if (properties.stabilizerLevel != mInterpolator.getStabilizerLevel())
143 mInterpolator.setStabilizerLevel(properties.stabilizerLevel);
147 StrokeTool::pointerMoveEvent(
event);
152 mInterpolator.pointerReleaseEvent(
event);
153 if (handleQuickSizing(
event)) {
157 if (
event->inputType() != mCurrentInputType)
return;
159 mEditor->backup(typeName());
161 Layer* layer = mEditor->layers()->currentLayer();
163 qreal distance =
QLineF(getCurrentPoint(), mMouseDownPoint).
length();
166 paintAt(mMouseDownPoint);
173 if (layer->type() == Layer::VECTOR) {
174 paintVectorStroke(layer);
178 StrokeTool::pointerReleaseEvent(
event);
182void PenTool::paintAt(
QPointF point)
184 Layer* layer = mEditor->layers()->currentLayer();
185 if (layer->type() == Layer::BITMAP)
187 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
188 qreal brushWidth = properties.width * pressure;
189 mCurrentWidth = brushWidth;
191 mScribbleArea->drawPen(point,
198void PenTool::drawStroke()
200 StrokeTool::drawStroke();
203 Layer* layer = mEditor->layers()->currentLayer();
205 if (layer->type() == Layer::BITMAP)
207 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
208 qreal brushWidth = properties.width * pressure;
209 mCurrentWidth = brushWidth;
213 qreal brushStep = (0.5 * brushWidth);
214 brushStep = qMax(1.0, brushStep);
220 int steps = qRound(distance / brushStep);
222 for (
int i = 0; i < steps; i++)
224 QPointF point = mLastBrushPoint + (i + 1) * brushStep * (getCurrentPoint() - mLastBrushPoint) / distance;
225 mScribbleArea->drawPen(point,
230 if (i == (steps - 1))
232 mLastBrushPoint = getCurrentPoint();
236 else if (layer->type() == Layer::VECTOR)
238 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
239 qreal brushWidth = properties.width * pressure;
250 path.cubicTo(p[1], p[2], p[3]);
256void PenTool::paintVectorStroke(
Layer* layer)
258 if (mStrokePoints.
empty())
262 mScribbleArea->clearDrawingBuffer();
263 qreal tol = mScribbleArea->getCurveSmoothing() / mEditor->view()->scaling();
265 BezierCurve curve(mStrokePoints, mStrokePressures, tol);
266 curve.setWidth(properties.width);
267 curve.setFeather(properties.feather);
268 curve.setFilled(
false);
269 curve.setInvisibility(properties.invisibility);
270 curve.setVariableWidth(properties.pressure);
271 curve.setColorNumber(mEditor->color()->frontColorNumber());
273 auto pLayerVector =
static_cast<LayerVector*
>(layer);
274 VectorImage* vectorImage = pLayerVector->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
275 if (vectorImage ==
nullptr) {
return; }
276 vectorImage->
addCurve(curve, mEditor->view()->scaling(),
false);
280 mEditor->deselectAll();
285 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)