22#include "vectorimage.h"
23#include "layervector.h"
24#include "colormanager.h"
25#include "layermanager.h"
26#include "viewmanager.h"
27#include "selectionmanager.h"
29#include "scribblearea.h"
31#include "pointerevent.h"
38void PenTool::loadSettings()
42 mPropertyEnabled[WIDTH] =
true;
43 mPropertyEnabled[PRESSURE] =
true;
44 mPropertyEnabled[VECTORMERGE] =
true;
45 mPropertyEnabled[ANTI_ALIASING] =
true;
46 mPropertyEnabled[STABILIZATION] =
true;
50 properties.width = settings.value(
"penWidth", 12.0).toDouble();
51 properties.pressure = settings.value(
"penPressure",
true).toBool();
52 properties.invisibility = OFF;
53 properties.preserveAlpha = OFF;
54 properties.useAA = settings.value(
"penAA",
true).toBool();
55 properties.stabilizerLevel = settings.value(
"penLineStabilization", StabilizationLevel::STRONG).toInt();
60void PenTool::resetToDefault()
65 setStabilizerLevel(StabilizationLevel::STRONG);
69void PenTool::setWidth(
const qreal width)
72 properties.width = width;
76 settings.setValue(
"penWidth", width);
80void PenTool::setPressure(
const bool pressure)
83 properties.pressure = pressure;
87 settings.setValue(
"penPressure", pressure);
91void PenTool::setAA(
const int AA)
94 properties.useAA = AA;
98 settings.setValue(
"penAA", AA);
102void PenTool::setStabilizerLevel(
const int level)
104 properties.stabilizerLevel = level;
107 settings.setValue(
"penLineStabilization", level);
113 if (mEditor->preference()->isOn(SETTING::TOOL_CURSOR))
122 mInterpolator.pointerPressEvent(event);
123 if (handleQuickSizing(event)) {
127 mMouseDownPoint = getCurrentPoint();
128 mLastBrushPoint = getCurrentPoint();
130 startStroke(event->inputType());
132 StrokeTool::pointerPressEvent(event);
137 mInterpolator.pointerMoveEvent(event);
138 if (handleQuickSizing(event)) {
144 mCurrentPressure = mInterpolator.getPressure();
146 if (properties.stabilizerLevel != mInterpolator.getStabilizerLevel())
148 mInterpolator.setStabilizerLevel(properties.stabilizerLevel);
152 StrokeTool::pointerMoveEvent(event);
157 mInterpolator.pointerReleaseEvent(event);
158 if (handleQuickSizing(event)) {
162 if (event->inputType() != mCurrentInputType)
return;
164 mEditor->backup(typeName());
166 Layer* layer = mEditor->layers()->currentLayer();
168 qreal distance =
QLineF(getCurrentPoint(), mMouseDownPoint).
length();
171 paintAt(mMouseDownPoint);
178 if (layer->type() == Layer::VECTOR) {
179 paintVectorStroke(layer);
183 StrokeTool::pointerReleaseEvent(event);
187void PenTool::paintAt(
QPointF point)
189 Layer* layer = mEditor->layers()->currentLayer();
190 if (layer->type() == Layer::BITMAP)
192 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
193 qreal brushWidth = properties.width * pressure;
194 mCurrentWidth = brushWidth;
196 mScribbleArea->drawPen(point,
203void PenTool::drawStroke()
205 StrokeTool::drawStroke();
208 Layer* layer = mEditor->layers()->currentLayer();
210 if (layer->type() == Layer::BITMAP)
212 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
213 qreal brushWidth = properties.width * pressure;
214 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;
230 mScribbleArea->drawPen(point,
235 if (i == (steps - 1))
237 mLastBrushPoint = getCurrentPoint();
241 else if (layer->type() == Layer::VECTOR)
243 qreal pressure = (properties.pressure) ? mCurrentPressure : 1.0;
244 qreal brushWidth = properties.width * pressure;
255 path.cubicTo(p[1], p[2], p[3]);
261void PenTool::paintVectorStroke(
Layer* layer)
263 if (mStrokePoints.
empty())
267 mScribbleArea->clearDrawingBuffer();
268 qreal tol = mScribbleArea->getCurveSmoothing() / mEditor->view()->scaling();
270 BezierCurve curve(mStrokePoints, mStrokePressures, tol);
271 curve.setWidth(properties.width);
272 curve.setFeather(properties.feather);
273 curve.setFilled(
false);
274 curve.setInvisibility(properties.invisibility);
275 curve.setVariableWidth(properties.pressure);
276 curve.setColorNumber(mEditor->color()->frontColorNumber());
278 auto pLayerVector =
static_cast<LayerVector*
>(layer);
279 VectorImage* vectorImage = pLayerVector->getLastVectorImageAtFrame(mEditor->currentFrame(), 0);
280 if (vectorImage ==
nullptr) {
return; }
281 vectorImage->
addCurve(curve, mEditor->view()->scaling(),
false);
285 mEditor->deselectAll();
290 mEditor->setModified(mEditor->layers()->currentLayerIndex(), mEditor->currentFrame());
QColor frontColor(bool useIndexedColor=true)
frontColor
Qt::MouseButtons buttons() const
Returns Qt::MouseButtons()
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