Krita Source Code Documentation
Loading...
Searching...
No Matches
KisGradientPainter Class Reference

#include <kis_gradient_painter.h>

+ Inheritance diagram for KisGradientPainter:

Classes

struct  ProcessRegion
 

Public Types

enum  enumGradientRepeat { GradientRepeatNone , GradientRepeatForwards , GradientRepeatAlternate }
 
enum  enumGradientShape {
  GradientShapeLinear , GradientShapeBiLinear , GradientShapeRadial , GradientShapeSquare ,
  GradientShapeConical , GradientShapeConicalSymetric , GradientShapeSpiral , GradientShapeReverseSpiral ,
  GradientShapePolygonal
}
 
- Public Types inherited from KisPainter
enum  FillStyle {
  FillStyleNone , FillStyleForegroundColor , FillStyleBackgroundColor , FillStylePattern ,
  FillStyleGenerator
}
 This enum contains the styles with which we can fill things like polygons and ellipses. More...
 
enum  StrokeStyle { StrokeStyleNone , StrokeStyleBrush }
 The style of the brush stroke around polygons and so. More...
 

Public Member Functions

 KisGradientPainter ()
 
 KisGradientPainter (KisPaintDeviceSP device)
 
 KisGradientPainter (KisPaintDeviceSP device, KisSelectionSP selection)
 
template<class T >
bool paintGradient (const QPointF &gradientVectorStart, const QPointF &gradientVectorEnd, enumGradientRepeat repeat, double antiAliasThreshold, bool reverseGradient, bool useDithering, const QRect &applyRect, T &paintPolicy)
 
bool paintGradient (const QPointF &gradientVectorStart, const QPointF &gradientVectorEnd, enumGradientRepeat repeat, double antiAliasThreshold, bool reverseGradient, const QRect &applyRect, bool useDithering=false)
 
bool paintGradient (const QPointF &gradientVectorStart, const QPointF &gradientVectorEnd, enumGradientRepeat repeat, double antiAliasThreshold, bool reverseGradient, qint32 startx, qint32 starty, qint32 width, qint32 height, bool useDithering=false)
 
void precalculateShape ()
 
void setGradientShape (enumGradientShape shape)
 
 ~KisGradientPainter () override
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 
- Public Member Functions inherited from KisPainter
void addDirtyRect (const QRect &r)
 
void addDirtyRects (const QVector< QRect > &rects)
 
bool antiAliasPolygonFill ()
 Return whether a polygon's filled area should be anti-aliased or not.
 
void applyDevice (const QRect &applyRect, const KisRenderedDab &dab, KisRandomAccessorSP dstIt, const KoColorSpace *srcColorSpace, KoCompositeOp::ParameterInfo &localParamInfo)
 
void applyDeviceWithSelection (const QRect &applyRect, const KisRenderedDab &dab, KisRandomAccessorSP dstIt, KisRandomConstAccessorSP maskIt, const KoColorSpace *srcColorSpace, KoCompositeOp::ParameterInfo &localParamInfo)
 
const KoColorbackgroundColor () const
 Returns the current background color.
 
void begin (KisPaintDeviceSP device)
 
void begin (KisPaintDeviceSP device, KisSelectionSP selection)
 
void beginTransaction (const KUndo2MagicString &transactionName=KUndo2MagicString(), int timedID=-1)
 Begin an undoable paint operation.
 
void bitBlt (const QPoint &pos, const KisPaintDeviceSP srcDev, const QRect &srcRect)
 
void bitBlt (qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
 
void bitBltOldData (const QPoint &pos, const KisPaintDeviceSP srcDev, const QRect &srcRect)
 
void bitBltOldData (qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
 
void bitBltWithFixedSelection (qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, const KisFixedPaintDeviceSP selection, qint32 selX, qint32 selY, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
 
void bitBltWithFixedSelection (qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, const KisFixedPaintDeviceSP selection, qint32 srcWidth, qint32 srcHeight)
 
void bltFixed (const QPoint &pos, const KisFixedPaintDeviceSP srcDev, const QRect &srcRect)
 
void bltFixed (const QRect &rc, const QList< KisRenderedDab > allSrcDevices)
 
void bltFixed (qint32 dstX, qint32 dstY, const KisFixedPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
 
void bltFixedWithFixedSelection (qint32 dstX, qint32 dstY, const KisFixedPaintDeviceSP srcDev, const KisFixedPaintDeviceSP selection, qint32 selX, qint32 selY, qint32 srcX, qint32 srcY, quint32 srcWidth, quint32 srcHeight)
 
void bltFixedWithFixedSelection (qint32 dstX, qint32 dstY, const KisFixedPaintDeviceSP srcDev, const KisFixedPaintDeviceSP selection, quint32 srcWidth, quint32 srcHeight)
 
const QVector< QPair< QPointF, QPointF > > calculateAllMirroredPoints (const QPair< QPointF, QPointF > &pair)
 
const QVector< QPointF > calculateAllMirroredPoints (const QPointF &pos)
 
const QVector< QRect > calculateAllMirroredRects (const QRect &rc)
 
template<class T >
QVector< T > calculateMirroredObjects (const T &object)
 
QBitArray channelFlags ()
 
const KoCompositeOpcompositeOp (const KoColorSpace *srcCS)
 
QString compositeOpId ()
 Returns the current composite op Id.
 
void copyMirrorInformationFrom (const KisPainter *other)
 
void deleteTransaction ()
 
KisPaintDeviceSP device ()
 
const KisPaintDeviceSP device () const
 Returns the current paint device.
 
void drawDDALine (const QPointF &start, const QPointF &end)
 
void drawLine (const QPointF &start, const QPointF &end)
 
void drawLine (const QPointF &start, const QPointF &end, qreal width, bool antialias)
 
void drawPainterPath (const QPainterPath &path, const QPen &pen)
 
void drawPainterPath (const QPainterPath &path, const QPen &pen, const QRect &requestedRect)
 
void drawThickLine (const QPointF &start, const QPointF &end, int startWidth, int endWidth)
 
void drawWobblyLine (const QPointF &start, const QPointF &end)
 
void drawWuLine (const QPointF &start, const QPointF &end)
 
void end ()
 
KUndo2CommandendAndTakeTransaction ()
 
void endTransaction (KisPostExecutionUndoAdapter *undoAdapter)
 
void endTransaction (KisUndoAdapter *undoAdapter)
 Finish the undoable paint operation.
 
void fill (qint32 x, qint32 y, qint32 width, qint32 height, const KoColor &color)
 
void fillPainterPath (const QPainterPath &path)
 
void fillPainterPath (const QPainterPath &path, const QRect &requestedRect)
 
void fillPainterPathImpl (const QPainterPath &path, const QRect &requestedRect)
 
FillStyle fillStyle () const
 Returns the current fill style.
 
qreal flow () const
 
const KisFilterConfigurationSP generator () const
 
void getBezierCurvePoints (const QPointF &pos1, const QPointF &control1, const QPointF &control2, const QPointF &pos2, vQPointF &points) const
 
const KoAbstractGradientSP gradient () const
 
bool hasDirtyRegion () const
 
bool hasHorizontalMirroring () const
 
bool hasMirroring () const
 
bool hasVerticalMirroring () const
 
bool isOpacityUnit () const
 
 KisPainter ()
 Construct painter without a device.
 
 KisPainter (KisPaintDeviceSP device)
 Construct a painter, and begin painting on the device.
 
 KisPainter (KisPaintDeviceSP device, KisSelectionSP selection)
 Construct a painter, and begin painting on the device. All actions will be masked by the given selection.
 
void mirrorDab (Qt::Orientation direction, KisRenderedDab *dab, bool skipMirrorPixels=false) const
 
void mirrorRect (Qt::Orientation direction, QRect *rc) const
 
qreal opacityF () const
 Returns the opacity that is used in painting.
 
void paintAt (const KisPaintInformation &pos, KisDistanceInformation *savedDist)
 
void paintBezierCurve (const KisPaintInformation &pi1, const QPointF &control1, const QPointF &control2, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)
 
const KoColorpaintColor () const
 Returns the color that will be used to paint with.
 
void paintEllipse (const qreal x, const qreal y, const qreal w, const qreal h)
 
void paintEllipse (const QRectF &rect)
 
void paintLine (const KisPaintInformation &pi1, const KisPaintInformation &pi2, KisDistanceInformation *currentDistance)
 
KisPaintOppaintOp () const
 
void paintPainterPath (const QPainterPath &path)
 
void paintPolygon (const vQPointF &points)
 
void paintPolyline (const QVector< QPointF > &points, int index=0, int numPoints=-1)
 
void paintRect (const qreal x, const qreal y, const qreal w, const qreal h)
 
void paintRect (const QRectF &rect)
 
const KoPatternSP pattern () const
 Returns the currently set pattern.
 
QTransform patternTransform ()
 get the current transform on the pattern.
 
KisPaintOpPresetSP preset () const
 Return the paintop preset.
 
 Private (KisPainter *_q)
 
 Private (KisPainter *_q, const KoColorSpace *cs)
 
void putTransaction (KisTransaction *transaction)
 continue a transaction started somewhere else
 
void renderDabWithMirroringNonIncremental (QRect rc, KisPaintDeviceSP dab)
 
void renderMirrorMask (QRect rc, KisFixedPaintDeviceSP dab)
 
void renderMirrorMask (QRect rc, KisFixedPaintDeviceSP dab, KisFixedPaintDeviceSP mask)
 
void renderMirrorMask (QRect rc, KisPaintDeviceSP dab)
 
void renderMirrorMask (QRect rc, KisPaintDeviceSP dab, int sx, int sy, KisFixedPaintDeviceSP mask)
 
void renderMirrorMaskSafe (QRect rc, KisFixedPaintDeviceSP dab, bool preserveDab)
 
void renderMirrorMaskSafe (QRect rc, KisFixedPaintDeviceSP dab, KisFixedPaintDeviceSP mask, bool preserveDab)
 
void renderMirrorMaskSafe (QRect rc, KisPaintDeviceSP dab, int sx, int sy, KisFixedPaintDeviceSP mask, bool preserveMask)
 
void revertTransaction ()
 Cancel all the changes made by the painter.
 
KisRunnableStrokeJobsInterfacerunnableStrokeJobsInterface () const
 
KisSelectionSP selection ()
 
void setAntiAliasPolygonFill (bool antiAliasPolygonFill)
 Set whether a polygon's filled area should be anti-aliased or not. The default is true.
 
void setAverageOpacity (qreal averageOpacity)
 
void setBackgroundColor (const KoColor &color)
 
void setChannelFlags (QBitArray channelFlags)
 
void setColorConversionFlags (KoColorConversionTransformation::ConversionFlags conversionFlags)
 
void setCompositeOpId (const KoCompositeOp *op)
 
void setCompositeOpId (const QString &op)
 Set the composite op for this painter by string.
 
void setFillStyle (FillStyle fillStyle)
 Set the current style with which to fill.
 
void setFlow (qreal flow)
 
void setGenerator (KisFilterConfigurationSP generator)
 Set the current generator (a generator can be used to fill an area.
 
void setGradient (const KoAbstractGradientSP gradient)
 
void setMaskImageSize (qint32 width, qint32 height)
 
void setMirrorInformation (const QPointF &axesCenter, bool mirrorHorizontally, bool mirrorVertically)
 
void setOpacityF (qreal opacity)
 
void setOpacityToUnit ()
 
void setOpacityU8 (quint8 opacity)
 Set the opacity which is used in painting (like filling polygons)
 
void setOpacityUpdateAverage (qreal opacity)
 
void setPaintColor (const KoColor &color)
 
void setPaintOpPreset (KisPaintOpPresetSP preset, KisNodeSP node, KisImageSP image)
 
void setPattern (const KoPatternSP pattern)
 Set the current pattern.
 
void setPatternTransform (QTransform transform)
 Set the transform on the pattern.
 
void setProgress (KoUpdater *progressUpdater)
 
void setRenderingIntent (KoColorConversionTransformation::Intent intent)
 
void setRunnableStrokeJobsInterface (KisRunnableStrokeJobsInterface *interface)
 
void setSelection (KisSelectionSP selection)
 
void setStrokeStyle (StrokeStyle strokeStyle)
 Set the current brush stroke style.
 
StrokeStyle strokeStyle () const
 Returns the current brush stroke style.
 
QVector< QRect > takeDirtyRegion ()
 
KisTransactiontakeTransaction ()
 take transaction out of the reach of KisPainter
 
bool tryReduceSourceRect (const KisPaintDevice *srcDev, QRect *srcRect, qint32 *srcX, qint32 *srcY, qint32 *srcWidth, qint32 *srcHeight, qint32 *dstX, qint32 *dstY)
 
virtual ~KisPainter ()
 

Public Attributes

QVector< ProcessRegionprocessRegions
 
enumGradientShape shape
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 
- Public Attributes inherited from KisPainter
bool antiAliasPolygonFill {true}
 
QPointF axesCenter
 
KoColor backgroundColor
 
const KoCompositeOpcachedCompositeOp {nullptr}
 
const KoColorSpacecachedSourceColorSpace {nullptr}
 
const KoColorSpacecolorSpace {nullptr}
 
QString compositeOpId
 
KoColorConversionTransformation::ConversionFlags conversionFlags {KoColorConversionTransformation::Empty}
 
KoColor customColor
 
KisPaintDeviceSP device
 
QVector< QRect > dirtyRects
 
QPointF duplicateOffset
 
QScopedPointer< KisRunnableStrokeJobsInterfacefakeRunnableStrokeJobsInterface
 
KisFillPainterfillPainter {nullptr}
 
FillStyle fillStyle {FillStyleNone}
 
KisFilterConfigurationSP generator
 
KoAbstractGradientSP gradient
 
bool isOpacityUnit {true}
 
qint32 maskImageHeight {255}
 
qint32 maskImageWidth {255}
 
QPainter * maskPainter {nullptr}
 
bool mirrorHorizontally {false}
 
bool mirrorVertically {false}
 
KoColor paintColor
 
KisPaintOppaintOp {nullptr}
 
KisPaintOpPresetSP paintOpPreset
 
KoCompositeOp::ParameterInfo paramInfo
 
KoPatternSP pattern
 
QTransform patternTransform
 
quint32 pixelSize {0}
 
KisPaintDeviceSP polygon
 
QImage polygonMaskImage
 
KoColorProfileprofile {nullptr}
 
KoUpdaterprogressUpdater {nullptr}
 
KisPainterq {nullptr}
 
KoColorConversionTransformation::Intent renderingIntent {KoColorConversionTransformation::IntentPerceptual}
 
KisRunnableStrokeJobsInterfacerunnableStrokeJobsInterface {nullptr}
 
KisSelectionSP selection
 
KisPaintLayersourceLayer {nullptr}
 
StrokeStyle strokeStyle {StrokeStyleBrush}
 
KisTransactiontransaction {nullptr}
 

Private Attributes

const QScopedPointer< Privatem_d
 

Additional Inherited Members

- Static Public Member Functions inherited from KisPainter
static qreal blendAverageOpacity (qreal opacity, qreal averageOpacity)
 
static bool checkDeviceHasTransparency (KisPaintDeviceSP dev)
 
static KisPaintDeviceSP convertToAlphaAsAlpha (KisPaintDeviceSP src)
 
static KisPaintDeviceSP convertToAlphaAsGray (KisPaintDeviceSP src)
 
static KisPaintDeviceSP convertToAlphaAsPureAlpha (KisPaintDeviceSP src)
 
static void copyAreaOptimized (const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
 
static void copyAreaOptimized (const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect, KisSelectionSP selection)
 
static void copyAreaOptimizedOldData (const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
 
- Protected Member Functions inherited from KisPainter
void fillPolygon (const vQPointF &points, FillStyle fillStyle)
 Fill the polygon defined by points with the fillStyle.
 
void init ()
 Initialize, set everything to '0' or defaults.
 
KoUpdaterprogressUpdater ()
 

Detailed Description

XXX: Docs!

Definition at line 992 of file kis_gradient_painter.cc.

Member Enumeration Documentation

◆ enumGradientRepeat

Enumerator
GradientRepeatNone 
GradientRepeatForwards 
GradientRepeatAlternate 

Definition at line 46 of file kis_gradient_painter.h.

◆ enumGradientShape

Enumerator
GradientShapeLinear 
GradientShapeBiLinear 
GradientShapeRadial 
GradientShapeSquare 
GradientShapeConical 
GradientShapeConicalSymetric 
GradientShapeSpiral 
GradientShapeReverseSpiral 
GradientShapePolygonal 

Definition at line 34 of file kis_gradient_painter.h.

Constructor & Destructor Documentation

◆ KisGradientPainter() [1/3]

KisGradientPainter::KisGradientPainter ( )

Definition at line 1010 of file kis_gradient_painter.cc.

1011 : m_d(new Private())
1012{
1013}
const QScopedPointer< Private > m_d

◆ KisGradientPainter() [2/3]

KisGradientPainter::KisGradientPainter ( KisPaintDeviceSP device)

Definition at line 1015 of file kis_gradient_painter.cc.

1016 : KisPainter(device),
1017 m_d(new Private())
1018{
1019}
KisPainter()
Construct painter without a device.
KisPaintDeviceSP device

◆ KisGradientPainter() [3/3]

KisGradientPainter::KisGradientPainter ( KisPaintDeviceSP device,
KisSelectionSP selection )

Definition at line 1021 of file kis_gradient_painter.cc.

1023 m_d(new Private())
1024{
1025}
KisSelectionSP selection

◆ ~KisGradientPainter()

KisGradientPainter::~KisGradientPainter ( )
override

Definition at line 1027 of file kis_gradient_painter.cc.

1028{
1029}

Member Function Documentation

◆ paintGradient() [1/3]

template<class T >
bool KisGradientPainter::paintGradient ( const QPointF & gradientVectorStart,
const QPointF & gradientVectorEnd,
enumGradientRepeat repeat,
double antiAliasThreshold,
bool reverseGradient,
bool useDithering,
const QRect & applyRect,
T & paintPolicy )

Definition at line 1175 of file kis_gradient_painter.cc.

1183{
1184 if (!gradient()) return false;
1185
1186 QRect requestedRect = applyRect;
1187
1188 //If the device has a selection only iterate over that selection united with our area of interest
1189 if (selection()) {
1190 requestedRect &= selection()->selectedExactRect();
1191 }
1192
1194
1195 switch (m_d->shape) {
1196 case GradientShapeLinear: {
1197 Private::ProcessRegion r(toQShared(new LinearGradientStrategy(gradientVectorStart, gradientVectorEnd)),
1198 requestedRect);
1199 m_d->processRegions.clear();
1200 m_d->processRegions << r;
1201 break;
1202 }
1203 case GradientShapeBiLinear: {
1204 Private::ProcessRegion r(toQShared(new BiLinearGradientStrategy(gradientVectorStart, gradientVectorEnd)),
1205 requestedRect);
1206 m_d->processRegions.clear();
1207 m_d->processRegions << r;
1208 break;
1209 }
1210 case GradientShapeRadial: {
1211 Private::ProcessRegion r(toQShared(new RadialGradientStrategy(gradientVectorStart, gradientVectorEnd)),
1212 requestedRect);
1213 m_d->processRegions.clear();
1214 m_d->processRegions << r;
1215 break;
1216 }
1217 case GradientShapeSquare: {
1218 Private::ProcessRegion r(toQShared(new SquareGradientStrategy(gradientVectorStart, gradientVectorEnd)),
1219 requestedRect);
1220 m_d->processRegions.clear();
1221 m_d->processRegions << r;
1222 break;
1223 }
1224 case GradientShapeConical: {
1225 Private::ProcessRegion r(toQShared(new ConicalGradientStrategy(gradientVectorStart, gradientVectorEnd)),
1226 requestedRect);
1227 m_d->processRegions.clear();
1228 m_d->processRegions << r;
1229 break;
1230 }
1232 Private::ProcessRegion r(toQShared(new ConicalSymetricGradientStrategy(gradientVectorStart, gradientVectorEnd)),
1233 requestedRect);
1234 m_d->processRegions.clear();
1235 m_d->processRegions << r;
1236 break;
1237 }
1238 case GradientShapeSpiral: {
1239 Private::ProcessRegion r(toQShared(new SpiralGradientStrategy(gradientVectorStart, gradientVectorEnd)),
1240 requestedRect);
1241 m_d->processRegions.clear();
1242 m_d->processRegions << r;
1243 break;
1244 }
1246 Private::ProcessRegion r(toQShared(new ReverseSpiralGradientStrategy(gradientVectorStart, gradientVectorEnd)),
1247 requestedRect);
1248 m_d->processRegions.clear();
1249 m_d->processRegions << r;
1250 break;
1251 }
1254 repeat = GradientRepeatNone;
1255 break;
1256 }
1257
1258 GradientRepeatStrategy *repeatStrategy = 0;
1259
1260 switch (repeat) {
1261 case GradientRepeatNone:
1262 repeatStrategy = GradientRepeatNoneStrategy::instance();
1263 break;
1265 repeatStrategy = GradientRepeatForwardsStrategy::instance();
1266 break;
1268 if (m_d->shape == GradientShapeSpiral || m_d->shape == GradientShapeReverseSpiral) {repeatStrategy = GradientRepeatModuloDivisiveContinuousHalfStrategy::instance();}
1269 else {repeatStrategy = GradientRepeatAlternateStrategy::instance();}
1270 break;
1271 }
1272 Q_ASSERT(repeatStrategy != 0);
1273
1274
1276
1277 KoID depthId;
1278 const KoColorSpace *destCs = dev->colorSpace();
1279
1280 if (destCs->colorDepthId() == Integer8BitsColorDepthID) {
1281 depthId = Integer16BitsColorDepthID;
1282 } else {
1283 depthId = destCs->colorDepthId();
1284 }
1285
1286 const KoColorSpace *mixCs = KoColorSpaceRegistry::instance()->colorSpace(destCs->colorModelId().id(), depthId.id(), destCs->profile());
1287 const quint32 mixPixelSize = mixCs->pixelSize();
1288
1290 tmp->setDefaultBounds(dev->defaultBounds());
1291 tmp->clear();
1292
1293 const KisDitherOp* op = mixCs->ditherOp(destCs->colorDepthId().id(), useDithering ? DITHER_BEST : DITHER_NONE);
1294
1295 Q_FOREACH (const Private::ProcessRegion &r, m_d->processRegions) {
1296 QRect processRect = r.processRect;
1297 QSharedPointer<KisGradientShapeStrategy> shapeStrategy = r.precalculatedShapeStrategy;
1298
1299 KoCachedGradient cachedGradient(gradient(), qMax(processRect.width(), processRect.height()), mixCs);
1300
1302
1303 paintPolicy.setup(gradientVectorStart,
1304 gradientVectorEnd,
1305 shapeStrategy,
1306 repeatStrategy,
1307 antiAliasThreshold,
1308 reverseGradient,
1309 &cachedGradient);
1310
1311 while (it.nextPixel()) {
1312 const quint8 *const pixel {paintPolicy.colorAt(it.x(), it.y())};
1313 memcpy(it.rawData(), pixel, mixPixelSize);
1314 }
1315
1317 KisRandomConstAccessorSP srcIt = tmp->createRandomConstAccessorNG();
1318
1319 int rows = 1;
1320 int columns = 1;
1321
1322 for (int y = processRect.y(); y <= processRect.bottom(); y += rows) {
1323 rows = qMin(srcIt->numContiguousRows(y), qMin(dstIt->numContiguousRows(y), processRect.bottom() - y + 1));
1324
1325 for (int x = processRect.x(); x <= processRect.right(); x += columns) {
1326 columns = qMin(srcIt->numContiguousColumns(x), qMin(dstIt->numContiguousColumns(x), processRect.right() - x + 1));
1327
1328 srcIt->moveTo(x, y);
1329 dstIt->moveTo(x, y);
1330
1331 const qint32 srcRowStride = srcIt->rowStride(x, y);
1332 const qint32 dstRowStride = dstIt->rowStride(x, y);
1333 const quint8 *srcPtr = srcIt->rawDataConst();
1334 quint8 *dstPtr = dstIt->rawData();
1335
1336 op->dither(srcPtr, srcRowStride, dstPtr, dstRowStride, x, y, columns, rows);
1337 }
1338 }
1339 }
1340
1341 bitBlt(requestedRect.topLeft(), dev, requestedRect);
1342
1343 return true;
1344}
@ DITHER_NONE
Definition KisDitherOp.h:22
@ DITHER_BEST
Definition KisDitherOp.h:24
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
virtual quint8 * rawData()=0
virtual const quint8 * rawDataConst() const =0
virtual void dither(const quint8 *src, quint8 *dst, int x, int y) const =0
KisPaintDeviceSP createCompositionSourceDevice() const
const KoColorSpace * colorSpace() const
KisDefaultBoundsBaseSP defaultBounds() const
KisRandomAccessorSP createRandomAccessorNG()
KoUpdater * progressUpdater
void bitBlt(qint32 dstX, qint32 dstY, const KisPaintDeviceSP srcDev, qint32 srcX, qint32 srcY, qint32 srcWidth, qint32 srcHeight)
KoAbstractGradientSP gradient
virtual qint32 rowStride(qint32 x, qint32 y) const =0
virtual qint32 numContiguousRows(qint32 y) const =0
virtual void moveTo(qint32 x, qint32 y)=0
virtual qint32 numContiguousColumns(qint32 x) const =0
virtual quint32 pixelSize() const =0
virtual const KisDitherOp * ditherOp(const QString &depth, DitherType type) const
virtual KoID colorModelId() const =0
virtual KoID colorDepthId() const =0
virtual const KoColorProfile * profile() const =0
Definition KoID.h:30
QString id() const
Definition KoID.cpp:63
QSharedPointer< T > toQShared(T *ptr)
QRect selectedExactRect() const
Slow, but exact way of determining the rectangle that encloses the selection.
const KoColorSpace * colorSpace(const QString &colorModelId, const QString &colorDepthId, const KoColorProfile *profile)
static KoColorSpaceRegistry * instance()

References KisPainter::bitBlt(), KoColorSpace::colorDepthId(), KoColorSpace::colorModelId(), KisPaintDevice::colorSpace(), KoColorSpaceRegistry::colorSpace(), KisPaintDevice::createCompositionSourceDevice(), KisPaintDevice::createRandomAccessorNG(), KisPaintDevice::defaultBounds(), KisPainter::device, KisDitherOp::dither(), DITHER_BEST, DITHER_NONE, KoColorSpace::ditherOp(), KisPainter::gradient, GradientRepeatAlternate, GradientRepeatForwards, GradientRepeatNone, GradientShapeBiLinear, GradientShapeConical, GradientShapeConicalSymetric, GradientShapeLinear, GradientShapePolygonal, GradientShapeRadial, GradientShapeReverseSpiral, GradientShapeSpiral, GradientShapeSquare, KoID::id(), KoColorSpaceRegistry::instance(), Integer16BitsColorDepthID, Integer8BitsColorDepthID, m_d, KisRandomConstAccessorNG::moveTo(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::nextPixel(), KisRandomConstAccessorNG::numContiguousColumns(), KisRandomConstAccessorNG::numContiguousRows(), KoColorSpace::pixelSize(), precalculateShape(), KoColorSpace::profile(), KisPainter::progressUpdater, KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::rawData(), KisBaseAccessor::rawData(), KisBaseConstAccessor::rawDataConst(), KisRandomConstAccessorNG::rowStride(), KisSelection::selectedExactRect(), KisPainter::selection, toQShared(), KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::x(), and KisSequentialIteratorBase< IteratorPolicy, SourcePolicy, ProgressPolicy >::y().

◆ paintGradient() [2/3]

bool KisGradientPainter::paintGradient ( const QPointF & gradientVectorStart,
const QPointF & gradientVectorEnd,
enumGradientRepeat repeat,
double antiAliasThreshold,
bool reverseGradient,
const QRect & applyRect,
bool useDithering = false )

Definition at line 1109 of file kis_gradient_painter.cc.

1116{
1117 // The following combinations of options have aliasing artifacts
1118 // where the first color meets the last color of the gradient.
1119 // so antialias threshold is used to compute if the pixel is in
1120 // the smoothing area. Then linear interpolation is used to blend
1121 // between the first and last colors
1122 if (antiAliasThreshold > DBL_EPSILON) {
1123 if ((m_d->shape == GradientShapeLinear || m_d->shape == GradientShapeBiLinear ||
1124 m_d->shape == GradientShapeRadial || m_d->shape == GradientShapeSquare ||
1126 && repeat == GradientRepeatForwards) {
1127 RepeatForwardsPaintPolicy paintPolicy(m_d->shape);
1128 return paintGradient(gradientVectorStart,
1129 gradientVectorEnd,
1130 repeat,
1131 antiAliasThreshold,
1132 reverseGradient,
1133 useDithering,
1134 applyRect,
1135 paintPolicy);
1136
1137 } else if (m_d->shape == GradientShapeConical) {
1138 ConicalGradientPaintPolicy paintPolicy;
1139 return paintGradient(gradientVectorStart,
1140 gradientVectorEnd,
1141 repeat,
1142 antiAliasThreshold,
1143 reverseGradient,
1144 useDithering,
1145 applyRect,
1146 paintPolicy);
1147
1148 } else if ((m_d->shape == GradientShapeSpiral || m_d->shape == GradientShapeReverseSpiral) &&
1149 repeat == GradientRepeatNone) {
1150 SpyralGradientRepeatNonePaintPolicy paintPolicy(m_d->shape == GradientShapeReverseSpiral);
1151 return paintGradient(gradientVectorStart,
1152 gradientVectorEnd,
1153 repeat,
1154 antiAliasThreshold,
1155 reverseGradient,
1156 useDithering,
1157 applyRect,
1158 paintPolicy);
1159 }
1160 }
1161
1162 // Default behavior: no antialiasing required
1163 NoAntialiasPaintPolicy paintPolicy;
1164 return paintGradient(gradientVectorStart,
1165 gradientVectorEnd,
1166 repeat,
1167 antiAliasThreshold,
1168 reverseGradient,
1169 useDithering,
1170 applyRect,
1171 paintPolicy);
1172}
bool paintGradient(const QPointF &gradientVectorStart, const QPointF &gradientVectorEnd, enumGradientRepeat repeat, double antiAliasThreshold, bool reverseGradient, qint32 startx, qint32 starty, qint32 width, qint32 height, bool useDithering=false)

References GradientRepeatForwards, GradientRepeatNone, GradientShapeBiLinear, GradientShapeConical, GradientShapeLinear, GradientShapeRadial, GradientShapeReverseSpiral, GradientShapeSpiral, GradientShapeSquare, m_d, and paintGradient().

◆ paintGradient() [3/3]

bool KisGradientPainter::paintGradient ( const QPointF & gradientVectorStart,
const QPointF & gradientVectorEnd,
enumGradientRepeat repeat,
double antiAliasThreshold,
bool reverseGradient,
qint32 startx,
qint32 starty,
qint32 width,
qint32 height,
bool useDithering = false )

Paint a gradient in the rect between startx, starty, width and height.

Definition at line 1089 of file kis_gradient_painter.cc.

1099{
1100 return paintGradient(gradientVectorStart,
1101 gradientVectorEnd,
1102 repeat,
1103 antiAliasThreshold,
1104 reverseGradient,
1105 QRect(startx, starty, width, height),
1106 useDithering);
1107}

References paintGradient().

◆ precalculateShape()

void KisGradientPainter::precalculateShape ( )

TODO: make this call happen asynchronously when the user does nothing

Definition at line 1055 of file kis_gradient_painter.cc.

1056{
1057 if (!m_d->processRegions.isEmpty()) return;
1058
1059 QPainterPath path;
1060
1061 if (selection()) {
1062 if (!selection()->outlineCacheValid()) {
1064 }
1065
1066 KIS_ASSERT_RECOVER_RETURN(selection()->outlineCacheValid());
1067 KIS_ASSERT_RECOVER_RETURN(!selection()->outlineCache().isEmpty());
1068
1069 path = selection()->outlineCache();
1070 } else {
1071 path.addRect(device()->defaultBounds()->bounds());
1072 }
1073
1075
1076 Q_FOREACH (const QPainterPath &subpath, splitPaths) {
1077 QRect boundingRect = subpath.boundingRect().toAlignedRect();
1078
1079 if (boundingRect.width() < 3 || boundingRect.height() < 3) {
1080 boundingRect = kisGrowRect(boundingRect, 2);
1081 }
1082
1083 Private::ProcessRegion r(toQShared(createPolygonShapeStrategy(subpath, boundingRect)),
1084 boundingRect);
1085 m_d->processRegions << r;
1086 }
1087}
#define KIS_ASSERT_RECOVER_RETURN(cond)
Definition kis_assert.h:75
#define bounds(x, a, b)
T kisGrowRect(const T &rect, U offset)
Definition kis_global.h:186
KisGradientShapeStrategy * createPolygonShapeStrategy(const QPainterPath &path, const QRect &boundingRect)
QList< QPainterPath > splitDisjointPaths(const QPainterPath &path)
void recalculateOutlineCache()
QPainterPath outlineCache() const

References bounds, createPolygonShapeStrategy(), KisPainter::device, KIS_ASSERT_RECOVER_RETURN, kisGrowRect(), m_d, KisSelection::outlineCache(), KisSelection::recalculateOutlineCache(), KisPainter::selection, KritaUtils::splitDisjointPaths(), and toQShared().

◆ setGradientShape()

void KisGradientPainter::setGradientShape ( enumGradientShape shape)

Definition at line 1031 of file kis_gradient_painter.cc.

1032{
1033 m_d->shape = shape;
1034}

References m_d, and shape.

Member Data Documentation

◆ m_d

const QScopedPointer<Private> KisGradientPainter::m_d
private

Definition at line 91 of file kis_gradient_painter.h.

◆ processRegions

QVector<ProcessRegion> KisGradientPainter::processRegions

Definition at line 1007 of file kis_gradient_painter.cc.

◆ shape

enumGradientShape KisGradientPainter::shape

Definition at line 994 of file kis_gradient_painter.cc.


The documentation for this class was generated from the following files: