Krita Source Code Documentation
Loading...
Searching...
No Matches
MyPaintPaintOp.cpp
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2020 Ashwin Dhakaita <ashwingpdhakaita@gmail.com>
3 *
4 * SPDX-License-Identifier: LGPL-2.0-or-later
5 */
6
7#include "MyPaintPaintOp.h"
8
11#include <KoToolManager.h>
12#include <QDebug>
13#include <QtMath>
15#include <kis_image.h>
16#include <kis_node.h>
18#include <kis_painter.h>
19#include <kis_paintop.h>
23#include <libmypaint/mypaint-brush.h>
24
26 : KisPaintOp (painter) {
27
28 m_image = image;
29
31 m_surface.reset(new KisMyPaintSurface(this->painter(), nullptr, m_image));
32
33 m_brush->apply(settings);
34
35 if (settings->getBool("EraserMode")) {
36
38 mypaint_brush_set_base_value(m_brush->brush(), MYPAINT_BRUSH_SETTING_ERASER, false);
39 }
40
41 m_brush->setColor(this->painter()->paintColor(), painter->device()->colorSpace());
42
43 if (KoToolManager::instance()->activeToolId() != "KritaShape/KisToolBrush") {
44 mypaint_brush_set_base_value(m_brush->brush(), MYPAINT_BRUSH_SETTING_SLOW_TRACKING, 0.0);
45 }
46
47 m_settings = settings;
49
50 m_dtime = -1;
51 m_isStrokeStarted = false;
52 m_radius = exp(mypaint_brush_get_base_value(m_brush->brush(), MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC));
53}
54
57
59
60 if (!painter()) {
61 return KisSpacingInformation(1.0);
62 }
63
64 const qreal lodScale = KisLodTransform::lodToScale(painter()->device());
65
66 qreal radius = m_radius;
67 radius *= lodScale;
68 mypaint_brush_set_base_value(m_brush->brush(), MYPAINT_BRUSH_SETTING_RADIUS_LOGARITHMIC, log(radius));
69
70 m_isStrokeStarted = mypaint_brush_get_state(m_brush->brush(), MYPAINT_BRUSH_STATE_STROKE_STARTED);
71 if (!m_isStrokeStarted) {
72
73 mypaint_brush_stroke_to(m_brush->brush(), m_surface->surface(), info.pos().x(), info.pos().y(), info.pressure(),
74 info.xTilt(), info.yTilt(), 1.0f);
75
76 m_dtime = 0.015;
77 }
78 else {
79 m_dtime = abs(info.currentTime() - m_previousTime)*0.001;
80 }
81
82 mypaint_brush_stroke_to(m_brush->brush(), m_surface->surface(), info.pos().x(), info.pos().y(), info.pressure(),
83 info.xTilt(), info.yTilt(), m_dtime);
84
86
87 return computeSpacing(info, lodScale);
88}
89
95
100
102
104 false, 0.0, false, m_radius*2,
105 true, 1, lodScale, &m_airBrushData, nullptr, info);
106}
const QString COMPOSITE_ERASE
static qreal lodToScale(int levelOfDetail)
~KisMyPaintPaintOp() override
QScopedPointer< KisMyPaintSurface > m_surface
KisSpacingInformation paintAt(const KisPaintInformation &info) override
KisMyPaintPaintOp(const KisPaintOpSettingsSP settings, KisPainter *painter, KisNodeSP node, KisImageSP image)
KisPaintOpSettingsSP m_settings
KisTimingInformation updateTimingImpl(const KisPaintInformation &info) const override
QScopedPointer< KisMyPaintPaintOpPreset > m_brush
KisSpacingInformation updateSpacingImpl(const KisPaintInformation &info) const override
KisImageWSP m_image
KisAirbrushOptionData m_airBrushData
KisSpacingInformation computeSpacing(const KisPaintInformation &info, qreal lodScale) const
const KoColorSpace * colorSpace() const
const QPointF & pos() const
qreal xTilt() const
The tilt of the pen on the horizontal axis (from 0.0 to 1.0)
qreal currentTime() const
Number of ms since the beginning of the stroke.
qreal yTilt() const
The tilt of the pen on the vertical axis (from 0.0 to 1.0)
qreal pressure() const
The pressure of the value (from 0.0 to 1.0)
KisPaintDeviceSP device
void setCompositeOpId(const KoCompositeOp *op)
static KoToolManager * instance()
Return the toolmanager singleton.
KisSpacingInformation effectiveSpacing(qreal dabWidth, qreal dabHeight, bool isotropicSpacing, qreal rotation, bool axesFlipped, qreal spacingVal, bool autoSpacingActive, qreal autoSpacingCoeff, qreal lodScale, const KisAirbrushOptionData *airbrushOption, const KisSpacingOption *spacingOption, const KisPaintInformation &pi)
KisTimingInformation effectiveTiming(const KisAirbrushOptionData *airbrushOption, const KisRateOption *rateOption, const KisPaintInformation &pi)
bool read(const KisPropertiesConfiguration *setting)
KisPainter * painter