Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_paintop.cc File Reference
#include "kis_paintop.h"
#include <QtMath>
#include <KoColor.h>
#include <KoColorSpace.h>
#include <KoPointerEvent.h>
#include "kis_painter.h"
#include "kis_layer.h"
#include "kis_image.h"
#include "kis_paint_device.h"
#include "kis_global.h"
#include "kis_datamanager.h"
#include <brushengine/kis_paintop_preset.h>
#include <brushengine/kis_paint_information.h>
#include "kis_vec.h"
#include "kis_perspective_math.h"
#include "kis_fixed_paint_device.h"
#include "kis_paintop_utils.h"
#include <kis_distance_information.h>
#include <qnumeric.h>

Go to the source code of this file.

Classes

class  KisPaintOp
 

Macros

#define BEZIER_FLATNESS_THRESHOLD   0.5
 

Functions

static void paintBezierCurve (KisPaintOp *paintOp, const KisPaintInformation &pi1, const KisVector2D &control1, const KisVector2D &control2, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)
 

Macro Definition Documentation

◆ BEZIER_FLATNESS_THRESHOLD

#define BEZIER_FLATNESS_THRESHOLD   0.5

Definition at line 34 of file kis_paintop.cc.

Function Documentation

◆ paintBezierCurve()

static void paintBezierCurve ( KisPaintOp * paintOp,
const KisPaintInformation & pi1,
const KisVector2D & control1,
const KisVector2D & control2,
const KisPaintInformation & pi2,
KisDistanceInformation * currentDistance )
static

Definition at line 98 of file kis_paintop.cc.

105{
106 LineEquation line = LineEquation::Through(toKisVector2D(pi1.pos()), toKisVector2D(pi2.pos()));
107 qreal d1 = line.absDistance(control1);
108 qreal d2 = line.absDistance(control2);
109
111 || qIsNaN(d1) || qIsNaN(d2)) {
112 paintOp->paintLine(pi1, pi2, currentDistance);
113 } else {
114 // Midpoint subdivision. See Foley & Van Dam Computer Graphics P.508
115 KisVector2D l2 = (toKisVector2D(pi1.pos()) + control1) / 2;
116 KisVector2D h = (control1 + control2) / 2;
117 KisVector2D l3 = (l2 + h) / 2;
118 KisVector2D r3 = (control2 + toKisVector2D(pi2.pos())) / 2;
119 KisVector2D r2 = (h + r3) / 2;
120 KisVector2D l4 = (l3 + r2) / 2;
121
122 KisPaintInformation middlePI = KisPaintInformation::mix(toQPointF(l4), 0.5, pi1, pi2);
123
124 paintBezierCurve(paintOp, pi1, l2, l3, middlePI, currentDistance);
125 paintBezierCurve(paintOp, middlePI, r2, r3, pi2, currentDistance);
126 }
127}
QPointF r2
QPointF r3
const QPointF & pos() const
static KisPaintInformation mix(const QPointF &p, qreal t, const KisPaintInformation &p1, const KisPaintInformation &p2)
static void paintBezierCurve(KisPaintOp *paintOp, const KisPaintInformation &pi1, const KisVector2D &control1, const KisVector2D &control2, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)
#define BEZIER_FLATNESS_THRESHOLD
Eigen::Hyperplane< qreal, 2 > LineEquation
KisVector2D toKisVector2D(const QPointF &p)
Definition kis_vec.h:19
Eigen::Matrix< qreal, 2, 1 > KisVector2D
Definition kis_vec.h:17
QPointF toQPointF(const ExpressionType &expr)
Definition kis_vec.h:29
virtual void paintLine(const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)

References BEZIER_FLATNESS_THRESHOLD, KisPaintInformation::mix(), paintBezierCurve(), KisPaintOp::paintLine(), KisPaintInformation::pos(), r2, r3, toKisVector2D(), and toQPointF().