Krita Source Code Documentation
Loading...
Searching...
No Matches
krita_utils.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2011 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6
7#ifndef __KRITA_UTILS_H
8#define __KRITA_UTILS_H
9
10class QRect;
11class QRectF;
12class QSize;
13class QPen;
14class QPointF;
15class QPainterPath;
16class QBitArray;
17class QPainter;
18struct KisRenderedDab;
19class KisRegion;
20
21#include <QVector>
22#include "kritaimage_export.h"
23#include "kis_types.h"
25#include <functional>
26
27
28namespace KritaUtils
29{
30 QSize KRITAIMAGE_EXPORT optimalPatchSize();
31
32 QVector<QRect> KRITAIMAGE_EXPORT splitRectIntoPatches(const QRect &rc, const QSize &patchSize);
33 QVector<QRect> KRITAIMAGE_EXPORT splitRectIntoPatchesTight(const QRect &rc, const QSize &patchSize);
34 QVector<QRect> KRITAIMAGE_EXPORT splitRegionIntoPatches(const QRegion &region, const QSize &patchSize);
35 QVector<QRect> KRITAIMAGE_EXPORT splitRegionIntoPatches(const KisRegion &region, const QSize &patchSize);
36
37 KRITAIMAGE_EXPORT KisRegion splitTriangles(const QPointF &center,
38 const QVector<QPointF> &points);
39 KRITAIMAGE_EXPORT KisRegion splitPath(const QPainterPath &path);
40
41 QString KRITAIMAGE_EXPORT prettyFormatReal(qreal value);
42
43 qreal KRITAIMAGE_EXPORT maxDimensionPortion(const QRectF &bounds, qreal portion, qreal minValue);
44 QPainterPath KRITAIMAGE_EXPORT trySimplifyPath(const QPainterPath &path, qreal lengthThreshold);
45
56 QList<QPainterPath> KRITAIMAGE_EXPORT splitDisjointPaths(const QPainterPath &path);
57
58
59 quint8 KRITAIMAGE_EXPORT mergeOpacityU8(quint8 opacity, quint8 parentOpacity);
60 qreal KRITAIMAGE_EXPORT mergeOpacityF(qreal opacity, qreal parentOpacity);
61 QBitArray KRITAIMAGE_EXPORT mergeChannelFlags(const QBitArray &flags, const QBitArray &parentFlags);
62
63 bool KRITAIMAGE_EXPORT compareChannelFlags(QBitArray f1, QBitArray f2);
64 QString KRITAIMAGE_EXPORT toLocalizedOnOff(bool value);
65
66 KisNodeSP KRITAIMAGE_EXPORT nearestNodeAfterRemoval(KisNodeSP node);
67
78 void KRITAIMAGE_EXPORT renderExactRect(QPainter *p, const QRect &rc);
79
83 void KRITAIMAGE_EXPORT renderExactRect(QPainter *p, const QRect &rc, const QPen &pen);
84
85 QImage KRITAIMAGE_EXPORT convertQImageToGrayA(const QImage &image);
86
87 void KRITAIMAGE_EXPORT applyToAlpha8Device(KisPaintDeviceSP dev, const QRect &rc, std::function<void(quint8)> func);
88 void KRITAIMAGE_EXPORT filterAlpha8Device(KisPaintDeviceSP dev, const QRect &rc, std::function<quint8(quint8)> func);
89
90 qreal KRITAIMAGE_EXPORT estimatePortionOfTransparentPixels(KisPaintDeviceSP dev, const QRect &rect, qreal samplePortion);
91
92 void KRITAIMAGE_EXPORT mirrorDab(Qt::Orientation dir, const QPoint &center, KisRenderedDab *dab, bool skipMirrorPixels = false);
93 void KRITAIMAGE_EXPORT mirrorDab(Qt::Orientation dir, const QPointF &center, KisRenderedDab *dab, bool skipMirrorPixels = false);
94
95 void KRITAIMAGE_EXPORT mirrorRect(Qt::Orientation dir, const QPoint &center, QRect *rc);
96 void KRITAIMAGE_EXPORT mirrorRect(Qt::Orientation dir, const QPointF &center, QRect *rc);
97 void KRITAIMAGE_EXPORT mirrorPoint(Qt::Orientation dir, const QPoint &center, QPointF *pt);
98 void KRITAIMAGE_EXPORT mirrorPoint(Qt::Orientation dir, const QPointF &center, QPointF *pt);
99
100
115 QTransform KRITAIMAGE_EXPORT pathShapeBooleanSpaceWorkaround(KisImageSP image);
116
129 QPainterPath KRITAIMAGE_EXPORT tryCloseTornSubpathsAfterIntersection(QPainterPath path);
130
137
138 void thresholdOpacity(KisPaintDeviceSP device, const QRect &rect, ThresholdMode mode);
139 void thresholdOpacityAlpha8(KisPaintDeviceSP device, const QRect &rect, ThresholdMode mode);
140
141 template <typename Visitor>
142 void rasterizeHLine(const QPoint &startPoint, const QPoint &endPoint, Visitor visitor)
143 {
144 QVector<QPoint> points;
145 int startX, endX;
146 if (startPoint.x() < endPoint.x()) {
147 startX = startPoint.x();
148 endX = endPoint.x();
149 } else {
150 startX = endPoint.x();
151 endX = startPoint.x();
152 }
153 for (int x = startX; x <= endX; ++x) {
154 visitor(QPoint(x, startPoint.y()));
155 }
156 }
157
158 template <typename Visitor>
159 void rasterizeVLine(const QPoint &startPoint, const QPoint &endPoint, Visitor visitor)
160 {
161 QVector<QPoint> points;
162 int startY, endY;
163 if (startPoint.y() < endPoint.y()) {
164 startY = startPoint.y();
165 endY = endPoint.y();
166 } else {
167 startY = endPoint.y();
168 endY = startPoint.y();
169 }
170 for (int y = startY; y <= endY; ++y) {
171 visitor(QPoint(startPoint.x(), y));
172 }
173 }
174
175 template <typename Visitor>
176 void rasterizeLineDDA(const QPoint &startPoint, const QPoint &endPoint, Visitor visitor)
177 {
178 QVector<QPoint> points;
179
180 if (startPoint == endPoint) {
181 visitor(startPoint);
182 return;
183 }
184 if (startPoint.y() == endPoint.y()) {
185 rasterizeHLine(startPoint, endPoint, visitor);
186 return;
187 }
188 if (startPoint.x() == endPoint.x()) {
189 rasterizeVLine(startPoint, endPoint, visitor);
190 return;
191 }
192
193 const QPoint delta = endPoint - startPoint;
194 QPoint currentPosition = startPoint;
195 QPointF currentPositionF = startPoint;
196 qreal m = static_cast<qreal>(delta.y()) / static_cast<qreal>(delta.x());
197 int increment;
198
199 if (std::abs(m) > 1.0) {
200 if (delta.y() > 0) {
201 m = 1.0 / m;
202 increment = 1;
203 } else {
204 m = -1.0 / m;
205 increment = -1;
206 }
207 while (currentPosition.y() != endPoint.y()) {
208 currentPositionF.setX(currentPositionF.x() + m);
209 currentPosition = QPoint(static_cast<int>(qRound(currentPositionF.x())),
210 currentPosition.y() + increment);
211 visitor(currentPosition);
212 }
213 } else {
214 if (delta.x() > 0) {
215 increment = 1;
216 } else {
217 increment = -1;
218 m = -m;
219 }
220 while (currentPosition.x() != endPoint.x()) {
221 currentPositionF.setY(currentPositionF.y() + m);
222 currentPosition = QPoint(currentPosition.x() + increment,
223 static_cast<int>(qRound(currentPositionF.y())));
224 visitor(currentPosition);
225 }
226 }
227 }
228
229 template <typename Visitor>
230 void rasterizePolylineDDA(const QVector<QPoint> &polylinePoints, Visitor visitor)
231 {
232 if (polylinePoints.size() == 0) {
233 return;
234 }
235 if (polylinePoints.size() == 1) {
236 visitor(polylinePoints.first());
237 return;
238 }
239
240 // copy all points from the first segment
241 rasterizeLineDDA(polylinePoints[0], polylinePoints[1], visitor);
242 // for the rest of the segments, copy all points except the first one
243 // (it is the same as the last point in the previous segment)
244 for (int i = 1; i < polylinePoints.size() - 1; ++i) {
245 int pointIndex = 0;
247 polylinePoints[i], polylinePoints[i + 1],
248 [&pointIndex, &visitor](const QPoint &point) -> void
249 {
250 if (pointIndex > 0) {
251 visitor(point);
252 }
253 ++pointIndex;
254 }
255 );
256 }
257 }
258
259 template <typename Visitor>
260 void rasterizePolygonDDA(const QVector<QPoint> &polygonPoints, Visitor visitor)
261 {
262 // this is a line
263 if (polygonPoints.size() < 3) {
264 rasterizeLineDDA(polygonPoints.first(), polygonPoints.last(), visitor);
265 return;
266 }
267 // rasterize all segments except the last one
268 QPoint lastSegmentStart;
269 if (polygonPoints.first() == polygonPoints.last()) {
270 rasterizePolylineDDA(polygonPoints.mid(0, polygonPoints.size() - 1), visitor);
271 lastSegmentStart = polygonPoints[polygonPoints.size() - 2];
272 } else {
273 rasterizePolylineDDA(polygonPoints, visitor);
274 lastSegmentStart = polygonPoints[polygonPoints.size() - 1];
275 }
276 // close the polygon
277 {
278 QVector<QPoint> points;
279 auto addPoint = [&points](const QPoint &point) -> void { points.append(point); };
280 rasterizeLineDDA(lastSegmentStart, polygonPoints.first(), addPoint);
281 for (int i = 1; i < points.size() - 1; ++i) {
282 visitor(points[i]);
283 }
284 }
285 }
286
287 // Convenience functions
288 QVector<QPoint> KRITAIMAGE_EXPORT rasterizeHLine(const QPoint &startPoint, const QPoint &endPoint);
289 QVector<QPoint> KRITAIMAGE_EXPORT rasterizeVLine(const QPoint &startPoint, const QPoint &endPoint);
290 QVector<QPoint> KRITAIMAGE_EXPORT rasterizeLineDDA(const QPoint &startPoint, const QPoint &endPoint);
291 QVector<QPoint> KRITAIMAGE_EXPORT rasterizePolylineDDA(const QVector<QPoint> &polylinePoints);
292 QVector<QPoint> KRITAIMAGE_EXPORT rasterizePolygonDDA(const QVector<QPoint> &polygonPoints);
293}
294
295#endif /* __KRITA_UTILS_H */
float value(const T *src, size_t ch)
const Params2D p
#define bounds(x, a, b)
qreal KRITAIMAGE_EXPORT maxDimensionPortion(const QRectF &bounds, qreal portion, qreal minValue)
QVector< QRect > splitRectIntoPatches(const QRect &rc, const QSize &patchSize)
quint8 mergeOpacityU8(quint8 opacity, quint8 parentOpacity)
void filterAlpha8Device(KisPaintDeviceSP dev, const QRect &rc, std::function< quint8(quint8)> func)
QPainterPath trySimplifyPath(const QPainterPath &path, qreal lengthThreshold)
bool compareChannelFlags(QBitArray f1, QBitArray f2)
QString KRITAIMAGE_EXPORT toLocalizedOnOff(bool value)
void thresholdOpacity(KisPaintDeviceSP device, const QRect &rect, ThresholdMode mode)
QVector< QPoint > rasterizeLineDDA(const QPoint &startPoint, const QPoint &endPoint)
QString KRITAIMAGE_EXPORT prettyFormatReal(qreal value)
KisRegion splitPath(const QPainterPath &path)
QVector< QPoint > rasterizePolygonDDA(const QVector< QPoint > &polygonPoints)
QTransform pathShapeBooleanSpaceWorkaround(KisImageSP image)
KisNodeSP nearestNodeAfterRemoval(KisNodeSP node)
qreal mergeOpacityF(qreal opacity, qreal parentOpacity)
QImage convertQImageToGrayA(const QImage &image)
QPainterPath tryCloseTornSubpathsAfterIntersection(QPainterPath path)
QVector< QRect > splitRegionIntoPatches(const KisRegion &region, const QSize &patchSize)
qreal estimatePortionOfTransparentPixels(KisPaintDeviceSP dev, const QRect &rect, qreal samplePortion)
void mirrorDab(Qt::Orientation dir, const QPoint &center, KisRenderedDab *dab, bool skipMirrorPixels)
QList< QPainterPath > splitDisjointPaths(const QPainterPath &path)
void applyToAlpha8Device(KisPaintDeviceSP dev, const QRect &rc, std::function< void(quint8)> func)
QBitArray mergeChannelFlags(const QBitArray &childFlags, const QBitArray &parentFlags)
QVector< QPoint > rasterizeVLine(const QPoint &startPoint, const QPoint &endPoint)
KisRegion splitTriangles(const QPointF &center, const QVector< QPointF > &points)
QVector< QRect > splitRectIntoPatchesTight(const QRect &rc, const QSize &patchSize)
void thresholdOpacityAlpha8(KisPaintDeviceSP device, const QRect &rect, ThresholdMode mode)
void mirrorPoint(Qt::Orientation dir, const QPoint &center, QPointF *pt)
QSize optimalPatchSize()
void mirrorRect(Qt::Orientation dir, const QPoint &center, QRect *rc)
void renderExactRect(QPainter *p, const QRect &rc)
QVector< QPoint > rasterizeHLine(const QPoint &startPoint, const QPoint &endPoint)
QVector< QPoint > rasterizePolylineDDA(const QVector< QPoint > &polylinePoints)