Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_paint_device.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2002 patrick julien <freak@codepimps.org>
3 * SPDX-FileCopyrightText: 2006 Boudewijn Rempt <boud@valdyas.org>
4 * SPDX-FileCopyrightText: 2021 L. E. Segovia <amy@amyspark.me>
5 *
6 * SPDX-License-Identifier: GPL-2.0-or-later
7 */
8#ifndef KIS_PAINT_DEVICE_IMPL_H_
9#define KIS_PAINT_DEVICE_IMPL_H_
10
11#include <QObject>
12#include <QRect>
13#include <QVector>
14
15#include "kis_debug.h"
16
18
19#include "kis_types.h"
20#include "kis_shared.h"
22
23#include <kritaimage_export.h>
24
25class KUndo2Command;
26class QRect;
27class QImage;
28class QPoint;
29class QString;
30class QColor;
31class QIODevice;
32
33class KoColor;
34class KoColorSpace;
35class KoColorProfile;
36
37class KisRegion;
38class KisDataManager;
40class KisKeyframe;
42
44
47
49
50namespace KritaUtils {
55}
56
57
65class KRITAIMAGE_EXPORT KisPaintDevice
66 : public QObject
67 , public KisShared
68{
69
70 Q_OBJECT
71
72public:
73
80 explicit KisPaintDevice(const KoColorSpace * colorSpace, const QString& name = QString());
81
91 KisPaintDevice(KisNodeWSP parent, const KoColorSpace * colorSpace, KisDefaultBoundsBaseSP defaultBounds = KisDefaultBoundsBaseSP(), const QString& name = QString());
92
102 ~KisPaintDevice() override;
103
104 void makeFullCopyFrom(const KisPaintDevice& rhs, KritaUtils::DeviceCopyMode copyMode = KritaUtils::CopySnapshot, KisNode *newParentNode = 0);
105
106protected:
115 KisPaintDevice(KisDataManagerSP explicitDataManager,
116 KisPaintDeviceSP src, const QString& name = QString());
117
118public:
119
123 bool write(KisPaintDeviceWriter &store);
124
128 bool read(QIODevice *stream);
129
130public:
131
135 void setParentNode(KisNodeWSP parent);
136
141 void setDefaultBounds(KisDefaultBoundsBaseSP bounds);
142
146 KisDefaultBoundsBaseSP defaultBounds() const;
147
151 void moveTo(qint32 x, qint32 y);
152
156 virtual void moveTo(const QPoint& pt);
157
161 QPoint offset() const;
162
166 qint32 x() const;
167
171 qint32 y() const;
172
176 void setX(qint32 x);
177
181 void setY(qint32 y);
182
193 QRect extent() const;
194
196 void extent(qint32 &x, qint32 &y, qint32 &w, qint32 &h) const;
197
215 QRect exactBounds() const;
216
224 QRect exactBoundsAmortized() const;
225
242 QRect nonDefaultPixelArea() const;
243
244
250 KisRegion region() const;
251
256 KisRegion regionExact() const;
257
262 void crop(qint32 x, qint32 y, qint32 w, qint32 h);
263
265 void crop(const QRect & r);
266
271 virtual void clear();
272
277 void clear(const QRect & rc);
278
284 void purgeDefaultPixels();
285
291 void setDefaultPixel(const KoColor &defPixel);
292
298 KoColor defaultPixel() const;
299
304 void fill(const QRect & rc, const KoColor &color);
305
310 void fill(qint32 x, qint32 y, qint32 w, qint32 h, const quint8 *fillPixel);
311
312public:
313
320 void prepareClone(KisPaintDeviceSP src);
321
334 void makeCloneFrom(KisPaintDeviceSP src, const QRect &rect);
335
350 void makeCloneFromRough(KisPaintDeviceSP src, const QRect &minimalRect);
351
352
353protected:
354 friend class KisPaintDeviceTest;
355 friend class DataReaderThread;
356
369 bool fastBitBltPossible(KisPaintDeviceSP src);
370
380 void fastBitBlt(KisPaintDeviceSP src, const QRect &rect);
381
385 void fastBitBltOldData(KisPaintDeviceSP src, const QRect &rect);
386
397 void fastBitBltRough(KisPaintDeviceSP src, const QRect &rect);
398
402 void fastBitBltRoughOldData(KisPaintDeviceSP src, const QRect &rect);
403
404public:
415 void readBytes(quint8 * data, qint32 x, qint32 y, qint32 w, qint32 h) const;
416
429 void readBytes(quint8 * data, const QRect &rect) const;
430
439 void writeBytes(const quint8 * data, qint32 x, qint32 y, qint32 w, qint32 h);
440
451 void writeBytes(const quint8 * data, const QRect &rect);
452
459 QVector<quint8*> readPlanarBytes(qint32 x, qint32 y, qint32 w, qint32 h) const;
460
474 void writePlanarBytes(QVector<quint8*> planes, qint32 x, qint32 y, qint32 w, qint32 h);
475
479 void convertTo(const KoColorSpace *dstColorSpace,
481 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags(),
482 KUndo2Command *parentCommand = nullptr,
483 KoUpdater *progressUpdater = nullptr);
484
489 bool setProfile(const KoColorProfile * profile, KUndo2Command *parentCommand);
490
498 void convertFromQImage(const QImage& image, const KoColorProfile *profile, qint32 offsetX = 0, qint32 offsetY = 0);
499
513 QImage convertToQImage(const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h,
515 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags()) const;
516
520 QImage convertToQImage(const KoColorProfile *dstProfile,
521 const QRect &rc,
523 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags()) const;
524
535 QImage convertToQImage(const KoColorProfile * dstProfile,
537 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags()) const;
538
550 KisPaintDeviceSP createThumbnailDevice(qint32 w, qint32 h, QRect rect = QRect(), QRect outputRect = QRect()) const;
551 KisPaintDeviceSP createThumbnailDeviceOversampled(qint32 w, qint32 h, qreal oversample, QRect rect = QRect(), QRect outputRect = QRect()) const;
552
565 QImage createThumbnailUncached(qint32 maxw, qint32 maxh, QRect rect, qreal oversample = 1,
567 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags());
568
572 QImage createThumbnail(qint32 maxw, qint32 maxh,
574 qreal oversample = 1,
576 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags());
577
582 QImage createThumbnail(qint32 maxw, qint32 maxh,
583 Qt::AspectRatioMode aspectRatioMode,
585 qreal oversample = 1,
587 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags());
588
597 bool pixel(qint32 x, qint32 y, QColor *c) const;
598
608 bool pixel(qint32 x, qint32 y, KoColor * kc) const;
609
614 KoColor pixel(const QPoint &pos) const;
615
630 bool setPixel(qint32 x, qint32 y, const QColor& c);
631
633 bool setPixel(qint32 x, qint32 y, const KoColor& kc);
634
638 const KoColorSpace* colorSpace() const;
639
684 KisPaintDeviceSP createCompositionSourceDevice() const;
685
692 KisPaintDeviceSP createCompositionSourceDevice(KisPaintDeviceSP cloneSource) const;
693
705 KisPaintDeviceSP createCompositionSourceDevice(KisPaintDeviceSP cloneSource, const QRect roughRect) const;
706
712 KisFixedPaintDeviceSP createCompositionSourceDeviceFixed() const;
713
722 virtual const KoColorSpace* compositionSourceColorSpace() const;
723
727 KisDataManagerSP dataManager() const;
728
732 void setDataManager(KisDataManagerSP data, const KoColorSpace * colorSpace = 0);
733
737 quint32 pixelSize() const;
738
742 quint32 channelCount() const;
743
754 KisInterstrokeDataSP interstrokeData() const;
755
764 KUndo2Command* createChangeInterstrokeDataCommand(KisInterstrokeDataSP data);
765
771 KisRasterKeyframeChannel *createKeyframeChannel(const KoID &id);
772
773 KisRasterKeyframeChannel* keyframeChannel() const;
774
778 KisPaintDeviceFramesInterface* framesInterface();
779
795 bool burnKeyframe(int frameID);
796 bool burnKeyframe();
797
798public:
799
804 void setDirty(const QRect & rc);
805
806 void setDirty(const KisRegion &region);
807
812 void setDirty();
813
814 void setDirty(const QVector<QRect> &rects);
815
821 void requestTimeSwitch(int time);
822
828 int sequenceNumber() const;
829
830
831 void estimateMemoryStats(qint64 &imageData, qint64 &temporaryData, qint64 &lodData) const;
832
833public:
834
835 KisHLineIteratorSP createHLineIteratorNG(qint32 x, qint32 y, qint32 w);
836 KisHLineConstIteratorSP createHLineConstIteratorNG(qint32 x, qint32 y, qint32 w) const;
837
838 KisVLineIteratorSP createVLineIteratorNG(qint32 x, qint32 y, qint32 h);
839 KisVLineConstIteratorSP createVLineConstIteratorNG(qint32 x, qint32 y, qint32 h) const;
840
841 KisRandomAccessorSP createRandomAccessorNG();
842 KisRandomConstAccessorSP createRandomConstAccessorNG() const;
843
853 KisRepeatHLineConstIteratorSP createRepeatHLineConstIterator(qint32 x, qint32 y, qint32 w, const QRect& _dataWidth) const;
863 KisRepeatVLineConstIteratorSP createRepeatVLineConstIterator(qint32 x, qint32 y, qint32 h, const QRect& _dataWidth) const;
864
868 KisRandomSubAccessorSP createRandomSubAccessor() const;
869
870
872 void clearSelection(KisSelectionSP selection);
873
891 KUndo2Command* reincarnateWithDetachedHistory(bool copyContent);
892
893Q_SIGNALS:
894
895 void profileChanged(const KoColorProfile * profile);
897
898public:
899 friend class PaintDeviceCache;
900
909 QRect calculateExactBounds(bool nonDefaultOnly) const;
910
911public:
912 struct MemoryReleaseObject : public QObject {
913 ~MemoryReleaseObject() override;
914 };
915
916 static MemoryReleaseObject* createMemoryReleaseObject();
917
918public:
920 virtual ~LodDataStruct();
921 };
922
923 KisRegion regionForLodSyncing() const;
924 LodDataStruct* createLodDataStruct(int lod);
925 void updateLodDataStruct(LodDataStruct *dst, const QRect &srcRect);
926 void uploadLodDataStruct(LodDataStruct *dst);
927
928 void generateLodCloneDevice(KisPaintDeviceSP dst, const QRect &originalRect, int lod);
929
930 void setSupportsWraparoundMode(bool value);
931 bool supportsWraproundMode() const;
932
933 void setProjectionDevice(bool value);
934 void testingFetchLodDevice(KisPaintDeviceSP targetDevice);
935
936private:
938 void init(const KoColorSpace *colorSpace,
939 KisDefaultBoundsBaseSP defaultBounds,
940 KisNodeWSP parent, const QString& name);
941
942 // Only KisPainter is allowed to have access to these low-level methods
943 friend class KisPainter;
944
949 QVector<qint32> channelSizes() const;
950
951 void emitColorSpaceChanged();
952 void emitProfileChanged();
953
954private:
956
957protected:
958 friend class KisSelectionTest;
959 KisNodeWSP parentNode() const;
960
961private:
962 struct Private;
963 Private * const m_d;
964};
965
966#endif // KIS_PAINT_DEVICE_IMPL_H_
float value(const T *src, size_t ch)
const qreal oversample
Krita's base keyframe class. Mainly contained by KisKeyframeChannels. A core part of Krita's animatio...
Private *const m_d
void profileChanged(const KoColorProfile *profile)
void setDataManager(KisDataManagerSP data, const KoColorSpace *colorSpace=0)
KisPaintDevice(KisDataManagerSP explicitDataManager, KisPaintDeviceSP src, const QString &name=QString())
void colorSpaceChanged(const KoColorSpace *colorspace)
KisPaintDevice & operator=(const KisPaintDevice &)
The KisRasterKeyframeChannel is a concrete KisKeyframeChannel subclass that stores and manages KisRas...
Definition KoID.h:30
static QImage convertToQImage(char *buffer, qint32 width, qint32 height)
save the QImages as png files to directory image_tests
#define bounds(x, a, b)
KisSharedPtr< KisDefaultBoundsBase > KisDefaultBoundsBaseSP
KisSharedPtr< KisDataManager > KisDataManagerSP
KisThumbnailBoundsMode
Definition kis_types.h:336