Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_painter.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2002 Patrick Julien <freak@codepimps.org>
3 * SPDX-FileCopyrightText: 2004 Clarence Dang <dang@kde.org>
4 * SPDX-FileCopyrightText: 2008-2010 Lukáš Tvrdý <lukast.dev@gmail.com>
5 * SPDX-FileCopyrightText: 2010 José Luis Vergara Toloza <pentalis@gmail.com>
6 *
7 * SPDX-License-Identifier: GPL-2.0-or-later
8 */
9
10#ifndef KIS_PAINTER_H_
11#define KIS_PAINTER_H_
12
13#include <math.h>
14
15#include <QVector>
16
19#include <KoPattern.h>
20#include <KoAbstractGradient.h>
21
22#include "kundo2magicstring.h"
23#include "kis_types.h"
25#include <kritaimage_export.h>
26
27
28class QPen;
29class KUndo2Command;
30class QRect;
31class QRectF;
32class QBitArray;
33class QPainterPath;
34
35class KoUpdater;
36class KoColor;
37class KoCompositeOp;
38
39class KisUndoAdapter;
41class KisTransaction;
43class KisPaintOp;
45struct KisRenderedDab;
47
65class KRITAIMAGE_EXPORT KisPainter
66{
67
68
69public:
71 KisPainter();
72
75
78 virtual ~KisPainter();
79
80public:
81 static void copyAreaOptimized(const QPoint &dstPt,
84 const QRect &originalSrcRect);
85
86 static void copyAreaOptimizedOldData(const QPoint &dstPt,
89 const QRect &originalSrcRect);
90
91 static void copyAreaOptimized(const QPoint &dstPt,
94 const QRect &originalSrcRect,
95 KisSelectionSP selection);
96
97 static KisPaintDeviceSP convertToAlphaAsAlpha(KisPaintDeviceSP src);
98 static KisPaintDeviceSP convertToAlphaAsGray(KisPaintDeviceSP src);
99
103 static KisPaintDeviceSP convertToAlphaAsPureAlpha(KisPaintDeviceSP src);
104
105 static bool checkDeviceHasTransparency(KisPaintDeviceSP dev);
106
110 void begin(KisPaintDeviceSP device);
111
115 void begin(KisPaintDeviceSP device, KisSelectionSP selection);
116
120 void end();
121
125 void setProgress(KoUpdater * progressUpdater);
126
128 void beginTransaction(const KUndo2MagicString& transactionName = KUndo2MagicString(),int timedID = -1);
129
131 void revertTransaction();
132
134 void endTransaction(KisUndoAdapter *undoAdapter);
135
139 void endTransaction(KisPostExecutionUndoAdapter *undoAdapter);
140
144 KUndo2Command* endAndTakeTransaction();
145
151 void deleteTransaction();
152
154 void putTransaction(KisTransaction* transaction);
155
157 KisTransaction* takeTransaction();
158
162
163
164
181 void bitBlt(qint32 dstX, qint32 dstY,
182 const KisPaintDeviceSP srcDev,
183 qint32 srcX, qint32 srcY,
184 qint32 srcWidth, qint32 srcHeight);
185
195 void bitBlt(const QPoint & pos, const KisPaintDeviceSP srcDev, const QRect & srcRect);
196
208 void bitBltOldData(qint32 dstX, qint32 dstY,
209 const KisPaintDeviceSP srcDev,
210 qint32 srcX, qint32 srcY,
211 qint32 srcWidth, qint32 srcHeight);
212
222 void bitBltOldData(const QPoint & pos, const KisPaintDeviceSP srcDev, const QRect & srcRect);
223
251 void bitBltWithFixedSelection(qint32 dstX, qint32 dstY,
252 const KisPaintDeviceSP srcDev,
253 const KisFixedPaintDeviceSP selection,
254 qint32 selX, qint32 selY,
255 qint32 srcX, qint32 srcY,
256 qint32 srcWidth, qint32 srcHeight);
257
270 void bitBltWithFixedSelection(qint32 dstX, qint32 dstY,
271 const KisPaintDeviceSP srcDev,
272 const KisFixedPaintDeviceSP selection,
273 qint32 srcWidth, qint32 srcHeight);
274
290 void bltFixed(qint32 dstX, qint32 dstY,
291 const KisFixedPaintDeviceSP srcDev,
292 qint32 srcX, qint32 srcY,
293 qint32 srcWidth, qint32 srcHeight);
294
295
301 void bltFixed(const QRect &rc, const QList<KisRenderedDab> allSrcDevices);
302
312 void bltFixed(const QPoint & pos, const KisFixedPaintDeviceSP srcDev, const QRect & srcRect);
313
342 void bltFixedWithFixedSelection(qint32 dstX, qint32 dstY,
343 const KisFixedPaintDeviceSP srcDev,
344 const KisFixedPaintDeviceSP selection,
345 qint32 selX, qint32 selY,
346 qint32 srcX, qint32 srcY,
347 quint32 srcWidth, quint32 srcHeight);
348
361 void bltFixedWithFixedSelection(qint32 dstX, qint32 dstY,
362 const KisFixedPaintDeviceSP srcDev,
363 const KisFixedPaintDeviceSP selection,
364 quint32 srcWidth, quint32 srcHeight);
365
377 void fill(qint32 x, qint32 y, qint32 width, qint32 height, const KoColor& color);
378
387 void renderMirrorMask(QRect rc, KisFixedPaintDeviceSP dab);
388 void renderMirrorMask(QRect rc, KisFixedPaintDeviceSP dab, KisFixedPaintDeviceSP mask);
389 void renderMirrorMask(QRect rc, KisPaintDeviceSP dab);
390 void renderMirrorMask(QRect rc, KisPaintDeviceSP dab, int sx, int sy, KisFixedPaintDeviceSP mask);
391
402 void renderMirrorMaskSafe(QRect rc, KisFixedPaintDeviceSP dab, bool preserveDab);
403 void renderMirrorMaskSafe(QRect rc, KisFixedPaintDeviceSP dab, KisFixedPaintDeviceSP mask, bool preserveDab);
404
417 void renderMirrorMaskSafe(QRect rc, KisPaintDeviceSP dab, int sx, int sy, KisFixedPaintDeviceSP mask, bool preserveMask);
418
428 void renderDabWithMirroringNonIncremental(QRect rc, KisPaintDeviceSP dab);
429
434 bool hasDirtyRegion() const;
435
440 QVector<QRect> takeDirtyRegion();
441
445 void paintPolyline(const QVector <QPointF> &points,
446 int index = 0, int numPoints = -1);
447
455 void paintLine(const KisPaintInformation &pi1,
456 const KisPaintInformation &pi2,
457 KisDistanceInformation *currentDistance);
458
467 const QPointF &control1,
468 const QPointF &control2,
469 const KisPaintInformation &pi2,
470 KisDistanceInformation *currentDistance);
471
476 void getBezierCurvePoints(const QPointF &pos1,
477 const QPointF &control1,
478 const QPointF &control2,
479 const QPointF &pos2,
480 vQPointF& points) const;
481
486 void paintRect(const QRectF &rect);
487
496 void paintRect(const qreal x,
497 const qreal y,
498 const qreal w,
499 const qreal h);
500
506 void paintEllipse(const QRectF &rect);
507
516 void paintEllipse(const qreal x,
517 const qreal y,
518 const qreal w,
519 const qreal h);
520
525 void paintPolygon(const vQPointF& points);
526
528 void paintAt(const KisPaintInformation &pos,
529 KisDistanceInformation *savedDist);
530
534 void paintPainterPath(const QPainterPath& path);
535
540 void fillPainterPath(const QPainterPath& path);
541
548 void fillPainterPath(const QPainterPath& path, const QRect &requestedRect);
549
555 void drawPainterPath(const QPainterPath& path, const QPen& pen, const QRect &requestedRect);
556
557 // convenience overload
558 void drawPainterPath(const QPainterPath& path, const QPen& pen);
559
565 void drawLine(const QPointF & start, const QPointF & end);
566
571 void drawLine(const QPointF &start, const QPointF &end, qreal width, bool antialias);
572
573
579 void drawDDALine(const QPointF & start, const QPointF & end);
580
586 void drawWobblyLine(const QPointF & start, const QPointF & end);
587
592 void drawWuLine(const QPointF & start, const QPointF & end);
593
601 void drawThickLine(const QPointF & start, const QPointF & end, int startWidth, int endWidth);
602
615 void setChannelFlags(QBitArray channelFlags);
616
618 QBitArray channelFlags();
619
626 void setPaintOpPreset(KisPaintOpPresetSP preset, KisNodeSP node, KisImageSP image);
627
629 KisPaintOpPresetSP preset() const;
630
636
637 void setMirrorInformation(const QPointF &axesCenter, bool mirrorHorizontally, bool mirrorVertically);
638
639 void copyMirrorInformationFrom(const KisPainter *other);
640
645 bool hasMirroring() const;
646
650 bool hasHorizontalMirroring() const;
651
655 bool hasVerticalMirroring() const;
656
661 void mirrorRect(Qt::Orientation direction, QRect *rc) const;
662
667 void mirrorDab(Qt::Orientation direction, KisRenderedDab *dab, bool skipMirrorPixels = false) const;
668
673 const QVector<QRect> calculateAllMirroredRects(const QRect &rc);
674
679 const QVector<QPointF> calculateAllMirroredPoints(const QPointF &pos);
680
685 const QVector<QPair<QPointF, QPointF>> calculateAllMirroredPoints(const QPair<QPointF, QPointF> &pair);
686
688 void setPattern(const KoPatternSP pattern);
689
691 const KoPatternSP pattern() const;
692
697 void setPaintColor(const KoColor& color);
698
700 const KoColor &paintColor() const;
701
706 void setBackgroundColor(const KoColor& color);
707
709 const KoColor &backgroundColor() const;
710
712 void setGenerator(KisFilterConfigurationSP generator);
713
716
725
727 void setFillStyle(FillStyle fillStyle);
728
731
733 void setPatternTransform(QTransform transform);
734
736 QTransform patternTransform();
737
739 void setAntiAliasPolygonFill(bool antiAliasPolygonFill);
740
743
747 StrokeStyleBrush
748 };
749
751 void setStrokeStyle(StrokeStyle strokeStyle);
752
755
756 void setFlow(qreal flow);
757
758 qreal flow() const;
759
765 void setOpacityUpdateAverage(qreal opacity);
766
770 void setAverageOpacity(qreal averageOpacity);
771
775 static qreal blendAverageOpacity(qreal opacity, qreal averageOpacity);
776
778 void setOpacityU8(quint8 opacity);
779 void setOpacityF(qreal opacity);
780
782 qreal opacityF() const;
783
784 bool isOpacityUnit() const;
785 void setOpacityToUnit();
786
791 void setCompositeOpId(const KoCompositeOp * op);
792
794 QString compositeOpId();
795
797 void setCompositeOpId(const QString& op);
798
802 void addDirtyRect(const QRect &r);
803
807 void addDirtyRects(const QVector<QRect> &rects);
808
813 void setSelection(KisSelectionSP selection);
814
819
820 void setGradient(const KoAbstractGradientSP gradient);
822
829 void setMaskImageSize(qint32 width, qint32 height);
830
831// /**
832// * If the alpha channel is locked, the alpha values of the paint device we are painting on
833// * will not change.
834// */
835// void setLockAlpha(bool protect);
836// bool alphaLocked() const;
837
841 void setRenderingIntent(KoColorConversionTransformation::Intent intent);
842
846 void setColorConversionFlags(KoColorConversionTransformation::ConversionFlags conversionFlags);
847
855 void setRunnableStrokeJobsInterface(KisRunnableStrokeJobsInterface *interface);
856
861
862protected:
864 void init();
865
867 void fillPolygon(const vQPointF& points, FillStyle fillStyle);
868
869private:
870
873
874 float frac(float value) {
875 float tmp = 0;
876 return modff(value , &tmp);
877 }
878
879 float invertFrac(float value) {
880 float tmp = 0;
881 return 1.0f - modff(value , &tmp);
882 }
883
884protected:
886
887private:
888 template <bool useOldSrcData>
889 void bitBltImpl(qint32 dstX, qint32 dstY,
890 const KisPaintDeviceSP srcDev,
891 qint32 srcX, qint32 srcY,
892 qint32 srcWidth, qint32 srcHeight);
893
894 inline void compositeOnePixel(quint8 *dst, const KoColor &color);
895
896private:
897
898 struct Private;
899 Private* const d;
900};
901
902
903#endif // KIS_PAINTER_H_
904
float value(const T *src, size_t ch)
const QStringList StrokeStyle
const QStringList FillStyle
QTransform patternTransform()
get the current transform on the pattern.
QString compositeOpId()
Returns the current composite op Id.
FillStyle
This enum contains the styles with which we can fill things like polygons and ellipses.
@ FillStyleBackgroundColor
@ FillStyleForegroundColor
Private *const d
KisSelectionSP selection()
KisPaintDeviceSP device()
StrokeStyle strokeStyle() const
Returns the current brush stroke style.
const KoAbstractGradientSP gradient() const
KisPaintOp * paintOp() const
KisPainter & operator=(const KisPainter &)
const KoPatternSP pattern() const
Returns the currently set pattern.
FillStyle fillStyle() const
Returns the current fill style.
const KoColor & backgroundColor() const
Returns the current background color.
float invertFrac(float value)
StrokeStyle
The style of the brush stroke around polygons and so.
KisRunnableStrokeJobsInterface * runnableStrokeJobsInterface() const
bool isOpacityUnit() const
float frac(float value)
KoUpdater * progressUpdater()
const KisPaintDeviceSP device() const
Returns the current paint device.
KisPainter(const KisPainter &)
const KoColor & paintColor() const
Returns the color that will be used to paint with.
bool antiAliasPolygonFill()
Return whether a polygon's filled area should be anti-aliased or not.
const KisFilterConfigurationSP generator() const
static void getBezierCurvePoints(const KisVector2D &pos1, const KisVector2D &control1, const KisVector2D &control2, const KisVector2D &pos2, vQPointF &points)
static void paintBezierCurve(KisPaintOp *paintOp, const KisPaintInformation &pi1, const KisVector2D &control1, const KisVector2D &control2, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)