22#include "kritaimage_export.h"
44 QPainterPath KRITAIMAGE_EXPORT
trySimplifyPath(
const QPainterPath &path, qreal lengthThreshold);
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);
83 void KRITAIMAGE_EXPORT
renderExactRect(QPainter *
p,
const QRect &rc,
const QPen &pen);
92 void KRITAIMAGE_EXPORT
mirrorDab(Qt::Orientation dir,
const QPoint ¢er,
KisRenderedDab *dab,
bool skipMirrorPixels =
false);
93 void KRITAIMAGE_EXPORT
mirrorDab(Qt::Orientation dir,
const QPointF ¢er,
KisRenderedDab *dab,
bool skipMirrorPixels =
false);
95 void KRITAIMAGE_EXPORT
mirrorRect(Qt::Orientation dir,
const QPoint ¢er, QRect *rc);
96 void KRITAIMAGE_EXPORT
mirrorRect(Qt::Orientation dir,
const QPointF ¢er, QRect *rc);
97 void KRITAIMAGE_EXPORT
mirrorPoint(Qt::Orientation dir,
const QPoint ¢er, QPointF *pt);
98 void KRITAIMAGE_EXPORT
mirrorPoint(Qt::Orientation dir,
const QPointF ¢er, QPointF *pt);
141 template <
typename Visitor>
142 void rasterizeHLine(
const QPoint &startPoint,
const QPoint &endPoint, Visitor visitor)
146 if (startPoint.x() < endPoint.x()) {
147 startX = startPoint.x();
150 startX = endPoint.x();
151 endX = startPoint.x();
153 for (
int x = startX; x <= endX; ++x) {
154 visitor(QPoint(x, startPoint.y()));
158 template <
typename Visitor>
159 void rasterizeVLine(
const QPoint &startPoint,
const QPoint &endPoint, Visitor visitor)
163 if (startPoint.y() < endPoint.y()) {
164 startY = startPoint.y();
167 startY = endPoint.y();
168 endY = startPoint.y();
170 for (
int y = startY; y <= endY; ++y) {
171 visitor(QPoint(startPoint.x(), y));
175 template <
typename Visitor>
180 if (startPoint == endPoint) {
184 if (startPoint.y() == endPoint.y()) {
188 if (startPoint.x() == endPoint.x()) {
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());
199 if (std::abs(m) > 1.0) {
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);
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);
229 template <
typename Visitor>
232 if (polylinePoints.size() == 0) {
235 if (polylinePoints.size() == 1) {
236 visitor(polylinePoints.first());
244 for (
int i = 1; i < polylinePoints.size() - 1; ++i) {
247 polylinePoints[i], polylinePoints[i + 1],
248 [&pointIndex, &visitor](
const QPoint &point) ->
void
250 if (pointIndex > 0) {
259 template <
typename Visitor>
263 if (polygonPoints.size() < 3) {
268 QPoint lastSegmentStart;
269 if (polygonPoints.first() == polygonPoints.last()) {
271 lastSegmentStart = polygonPoints[polygonPoints.size() - 2];
274 lastSegmentStart = polygonPoints[polygonPoints.size() - 1];
279 auto addPoint = [&points](
const QPoint &point) ->
void { points.append(point); };
281 for (
int i = 1; i < points.size() - 1; ++i) {
float value(const T *src, size_t ch)
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 ®ion, const QSize &patchSize)
qreal estimatePortionOfTransparentPixels(KisPaintDeviceSP dev, const QRect &rect, qreal samplePortion)
void mirrorDab(Qt::Orientation dir, const QPoint ¢er, 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 ¢er, 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 ¢er, QPointF *pt)
void mirrorRect(Qt::Orientation dir, const QPoint ¢er, 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)