Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_painter.cc File Reference
#include "kis_painter.h"
#include <stdlib.h>
#include <string.h>
#include <cfloat>
#include <cmath>
#include <climits>
#include <strings.h>
#include <QImage>
#include <QRect>
#include <QString>
#include <kundo2command.h>
#include <kis_debug.h>
#include <klocalizedstring.h>
#include "kis_image.h"
#include "filter/kis_filter.h"
#include "kis_layer.h"
#include "kis_paint_device.h"
#include "kis_fixed_paint_device.h"
#include "kis_transaction.h"
#include "kis_vec.h"
#include "kis_iterator_ng.h"
#include "kis_random_accessor_ng.h"
#include "filter/kis_filter_configuration.h"
#include "kis_pixel_selection.h"
#include <brushengine/kis_paint_information.h>
#include "kis_paintop_registry.h"
#include "kis_perspective_math.h"
#include "tiles3/kis_random_accessor.h"
#include <kis_distance_information.h>
#include <KoColorSpaceMaths.h>
#include "kis_lod_transform.h"
#include "kis_algebra_2d.h"
#include "krita_utils.h"
#include "kis_painter_p.h"

Go to the source code of this file.

Macros

#define BEZIER_FLATNESS_THRESHOLD   0.5
 

Functions

template<bool useOldData>
void copyAreaOptimizedImpl (const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &srcRect)
 
static void getBezierCurvePoints (const KisVector2D &pos1, const KisVector2D &control1, const KisVector2D &control2, const KisVector2D &pos2, vQPointF &points)
 

Macro Definition Documentation

◆ BEZIER_FLATNESS_THRESHOLD

#define BEZIER_FLATNESS_THRESHOLD   0.5

Definition at line 57 of file kis_painter.cc.

Function Documentation

◆ copyAreaOptimizedImpl()

template<bool useOldData>
void copyAreaOptimizedImpl ( const QPoint & dstPt,
KisPaintDeviceSP src,
KisPaintDeviceSP dst,
const QRect & srcRect )

Definition at line 105 of file kis_painter.cc.

109{
110 const QRect dstRect(dstPt, srcRect.size());
111
112 const QRect srcExtent = src->extent();
113 const QRect dstExtent = dst->extent();
114
115 const QRect srcSampleRect = srcExtent & srcRect;
116 const QRect dstSampleRect = dstExtent & dstRect;
117
118 const bool srcEmpty = srcSampleRect.isEmpty();
119 const bool dstEmpty = dstSampleRect.isEmpty();
120
121 if (!srcEmpty || !dstEmpty) {
122 if (srcEmpty) {
123 dst->clear(dstRect);
124 } else {
125 QRect srcCopyRect = srcRect;
126 QRect dstCopyRect = dstRect;
127
128 if (!srcExtent.contains(srcRect)) {
129 if (src->defaultPixel() == dst->defaultPixel()) {
130 const QRect dstSampleInSrcCoords = dstSampleRect.translated(srcRect.topLeft() - dstPt);
131
132 if (dstSampleInSrcCoords.isEmpty() || srcSampleRect.contains(dstSampleInSrcCoords)) {
133 srcCopyRect = srcSampleRect;
134 } else {
135 srcCopyRect = srcSampleRect | dstSampleInSrcCoords;
136 }
137 dstCopyRect = QRect(dstPt + srcCopyRect.topLeft() - srcRect.topLeft(), srcCopyRect.size());
138 }
139 }
140
141 KisPainter gc(dst);
142 gc.setCompositeOpId(COMPOSITE_COPY);
143
144 if (useOldData) {
145 gc.bitBltOldData(dstCopyRect.topLeft(), src, srcCopyRect);
146 } else {
147 gc.bitBlt(dstCopyRect.topLeft(), src, srcCopyRect);
148 }
149 }
150 }
151}
const QString COMPOSITE_COPY
virtual void clear()
QRect extent() const
KoColor defaultPixel() const

References KisPainter::bitBlt(), KisPainter::bitBltOldData(), KisPaintDevice::clear(), COMPOSITE_COPY, KisPaintDevice::defaultPixel(), KisPaintDevice::extent(), and KisPainter::setCompositeOpId().

◆ getBezierCurvePoints()

static void getBezierCurvePoints ( const KisVector2D & pos1,
const KisVector2D & control1,
const KisVector2D & control2,
const KisVector2D & pos2,
vQPointF & points )
static

Definition at line 1199 of file kis_painter.cc.

1204{
1205 LineEquation line = LineEquation::Through(pos1, pos2);
1206 qreal d1 = line.absDistance(control1);
1207 qreal d2 = line.absDistance(control2);
1208
1210 points.push_back(toQPointF(pos1));
1211 } else {
1212 // Midpoint subdivision. See Foley & Van Dam Computer Graphics P.508
1213
1214 KisVector2D l2 = (pos1 + control1) / 2;
1215 KisVector2D h = (control1 + control2) / 2;
1216 KisVector2D l3 = (l2 + h) / 2;
1217 KisVector2D r3 = (control2 + pos2) / 2;
1218 KisVector2D r2 = (h + r3) / 2;
1219 KisVector2D l4 = (l3 + r2) / 2;
1220
1221 getBezierCurvePoints(pos1, l2, l3, l4, points);
1222 getBezierCurvePoints(l4, r2, r3, pos2, points);
1223 }
1224}
QPointF r2
QPointF r3
static void getBezierCurvePoints(const KisVector2D &pos1, const KisVector2D &control1, const KisVector2D &control2, const KisVector2D &pos2, vQPointF &points)
#define BEZIER_FLATNESS_THRESHOLD
Eigen::Hyperplane< qreal, 2 > LineEquation
Eigen::Matrix< qreal, 2, 1 > KisVector2D
Definition kis_vec.h:17
QPointF toQPointF(const ExpressionType &expr)
Definition kis_vec.h:29

References BEZIER_FLATNESS_THRESHOLD, getBezierCurvePoints(), r2, r3, and toQPointF().