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 createThumbnail(qint32 maxw, qint32 maxh, QRect rect, qreal oversample = 1,
567 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags());
568
572 QImage createThumbnail(qint32 maxw, qint32 maxh, qreal oversample = 1,
574 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags());
575
580 QImage createThumbnail(qint32 maxw, qint32 maxh,
581 Qt::AspectRatioMode aspectRatioMode,
582 qreal oversample = 1,
584 KoColorConversionTransformation::ConversionFlags conversionFlags = KoColorConversionTransformation::internalConversionFlags());
585
594 bool pixel(qint32 x, qint32 y, QColor *c) const;
595
605 bool pixel(qint32 x, qint32 y, KoColor * kc) const;
606
611 KoColor pixel(const QPoint &pos) const;
612
627 bool setPixel(qint32 x, qint32 y, const QColor& c);
628
630 bool setPixel(qint32 x, qint32 y, const KoColor& kc);
631
635 const KoColorSpace* colorSpace() const;
636
681 KisPaintDeviceSP createCompositionSourceDevice() const;
682
689 KisPaintDeviceSP createCompositionSourceDevice(KisPaintDeviceSP cloneSource) const;
690
702 KisPaintDeviceSP createCompositionSourceDevice(KisPaintDeviceSP cloneSource, const QRect roughRect) const;
703
709 KisFixedPaintDeviceSP createCompositionSourceDeviceFixed() const;
710
719 virtual const KoColorSpace* compositionSourceColorSpace() const;
720
724 KisDataManagerSP dataManager() const;
725
729 void setDataManager(KisDataManagerSP data, const KoColorSpace * colorSpace = 0);
730
734 quint32 pixelSize() const;
735
739 quint32 channelCount() const;
740
751 KisInterstrokeDataSP interstrokeData() const;
752
761 KUndo2Command* createChangeInterstrokeDataCommand(KisInterstrokeDataSP data);
762
768 KisRasterKeyframeChannel *createKeyframeChannel(const KoID &id);
769
770 KisRasterKeyframeChannel* keyframeChannel() const;
771
775 KisPaintDeviceFramesInterface* framesInterface();
776
792 bool burnKeyframe(int frameID);
793 bool burnKeyframe();
794
795public:
796
801 void setDirty(const QRect & rc);
802
803 void setDirty(const KisRegion &region);
804
809 void setDirty();
810
811 void setDirty(const QVector<QRect> &rects);
812
818 void requestTimeSwitch(int time);
819
825 int sequenceNumber() const;
826
827
828 void estimateMemoryStats(qint64 &imageData, qint64 &temporaryData, qint64 &lodData) const;
829
830public:
831
832 KisHLineIteratorSP createHLineIteratorNG(qint32 x, qint32 y, qint32 w);
833 KisHLineConstIteratorSP createHLineConstIteratorNG(qint32 x, qint32 y, qint32 w) const;
834
835 KisVLineIteratorSP createVLineIteratorNG(qint32 x, qint32 y, qint32 h);
836 KisVLineConstIteratorSP createVLineConstIteratorNG(qint32 x, qint32 y, qint32 h) const;
837
838 KisRandomAccessorSP createRandomAccessorNG();
839 KisRandomConstAccessorSP createRandomConstAccessorNG() const;
840
850 KisRepeatHLineConstIteratorSP createRepeatHLineConstIterator(qint32 x, qint32 y, qint32 w, const QRect& _dataWidth) const;
860 KisRepeatVLineConstIteratorSP createRepeatVLineConstIterator(qint32 x, qint32 y, qint32 h, const QRect& _dataWidth) const;
861
865 KisRandomSubAccessorSP createRandomSubAccessor() const;
866
867
869 void clearSelection(KisSelectionSP selection);
870
888 KUndo2Command* reincarnateWithDetachedHistory(bool copyContent);
889
890Q_SIGNALS:
891
892 void profileChanged(const KoColorProfile * profile);
894
895public:
896 friend class PaintDeviceCache;
897
906 QRect calculateExactBounds(bool nonDefaultOnly) const;
907
908public:
909 struct MemoryReleaseObject : public QObject {
910 ~MemoryReleaseObject() override;
911 };
912
913 static MemoryReleaseObject* createMemoryReleaseObject();
914
915public:
917 virtual ~LodDataStruct();
918 };
919
920 KisRegion regionForLodSyncing() const;
921 LodDataStruct* createLodDataStruct(int lod);
922 void updateLodDataStruct(LodDataStruct *dst, const QRect &srcRect);
923 void uploadLodDataStruct(LodDataStruct *dst);
924
925 void generateLodCloneDevice(KisPaintDeviceSP dst, const QRect &originalRect, int lod);
926
927 void setSupportsWraparoundMode(bool value);
928 bool supportsWraproundMode() const;
929
930 void setProjectionDevice(bool value);
931 void testingFetchLodDevice(KisPaintDeviceSP targetDevice);
932
933private:
935 void init(const KoColorSpace *colorSpace,
936 KisDefaultBoundsBaseSP defaultBounds,
937 KisNodeWSP parent, const QString& name);
938
939 // Only KisPainter is allowed to have access to these low-level methods
940 friend class KisPainter;
941
946 QVector<qint32> channelSizes() const;
947
948 void emitColorSpaceChanged();
949 void emitProfileChanged();
950
951private:
953
954protected:
955 friend class KisSelectionTest;
956 KisNodeWSP parentNode() const;
957
958private:
959 struct Private;
960 Private * const m_d;
961};
962
963#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