16#include <QMutexLocker>
21#include <klocalizedstring.h>
64 qRegisterMetaType<KisPaintDeviceSP>(
"KisPaintDeviceSP");
103 KoColorConversionTransformation::ConversionFlags conversionFlags,
120 inline qint32
x()
const
124 inline qint32
y()
const
180 FramesHash::const_iterator it = rhs->
m_frames.constBegin();
181 FramesHash::const_iterator end = rhs->
m_frames.constEnd();
183 for (; it != end; ++it) {
220 return data->dataManager();
226 return data->cache()->invalidate();
287 bool initialFrame =
false;
296 m_data->dataManager()->clear();
297 m_data->cache()->invalidate();
308 if (!initialFrame && !copy) {
351 QRect
extent = data->dataManager()->extent();
352 extent.translate(data->x(), data->y());
354 quint8 defaultOpacity = data->colorSpace()->opacityU8(data->dataManager()->defaultPixel());
366 return QPoint(data->x(), data->y());
374 data->cache()->invalidate();
386 retval = data->dataManager()->read(stream);
387 data->cache()->invalidate();
394 return data->dataManager()->write(store);
402 data->dataManager()->setDefaultPixel(color.
data());
403 data->cache()->invalidate();
409 return KoColor(data->dataManager()->defaultPixel(),
418 struct LodDataStructImpl;
425 KisDataManager *dstDataManager,
const QPoint &srcOffset,
const QPoint &dstOffset,
426 const QRect &originalRect,
int lod);
472 if (vFramesCount >= 1) {
474 if (!keyframe || keyframe->frameID() < 0) {
478 const int frameID = keyframe->frameID();
564 return x() == srcData->
x() &&
y() == srcData->
y() &&
573 dataObjects <<
m_data.data();
579 dataObjects <<
value.data();
611 isProjectionDevice(false),
612 supportsWrapAroundMode(false),
613 m_data(new
Data(paintDevice)),
620 contentChannel.reset();
627 return basicStrategy.data();
632 if (!wrappedStrategy || wrappedStrategy->wrapRect() != wrapRect) {
633 QMutexLocker locker(&m_wrappedStrategyMutex);
635 if (!wrappedStrategy) {
637 }
else if (wrappedStrategy->wrapRect() != wrapRect) {
638 wrappedStrategy->setWrapRect(wrapRect);
642 return wrappedStrategy.data();
684 Data *srcData = currentNonLodData();
692 Data *srcData = currentNonLodData();
694 Data *lodData =
new Data(q, srcData,
false);
706 lodData->
x() != expectedX ||
707 lodData->
y() != expectedY) {
713 lodData->
setX(expectedX);
714 lodData->
setY(expectedY);
726 const QPoint &srcOffset,
727 const QPoint &dstOffset,
728 const QRect &originalRect,
731 if (originalRect.isEmpty())
return;
733 const int srcStepSize = 1 << lod;
739 if (!srcRect.isValid() || !dstRect.isValid())
return;
745 int rowsAccumulated = 0;
746 int columnsAccumulated = 0;
750 QScopedArrayPointer<quint8> blendData(
new quint8[srcStepSize * srcRect.width() *
pixelSize]);
751 quint8 *blendDataPtr = blendData.data();
752 int blendDataOffset = 0;
754 const int srcCellSize = srcStepSize * srcStepSize;
755 const int srcCellStride = srcCellSize *
pixelSize;
756 const int srcStepStride = srcStepSize *
pixelSize;
757 const int srcColumnStride = (srcStepSize - 1) * srcStepStride;
762 int rowsRemaining = srcRect.height();
763 while (rowsRemaining > 0) {
765 int colsRemaining = srcRect.width();
766 while (colsRemaining > 0 && srcIntIt.
nextPixel()) {
770 columnsAccumulated++;
772 if (columnsAccumulated >= srcStepSize) {
773 blendDataPtr += srcColumnStride;
774 columnsAccumulated = 0;
782 if (rowsAccumulated >= srcStepSize) {
785 blendDataPtr = blendData.data();
787 int colsRemaining = dstRect.width();
788 while (colsRemaining > 0 && dstIntIt.
nextPixel()) {
790 blendDataPtr += srcCellStride;
797 blendDataPtr = blendData.data();
800 blendDataOffset += srcStepStride;
801 blendDataPtr = blendData.data() + blendDataOffset;
814 Data *srcData = currentNonLodData();
819 QPoint(srcData->
x(), srcData->
y()),
820 QPoint(lodData->
x(), lodData->
y()),
828 Data *srcData = currentNonLodData();
830 QPoint(srcData->
x(), srcData->
y()),
831 QPoint(dst->
x(), dst->
y()),
843 ensureLodDataPresent();
845 m_lodData->prepareClone(dst->
lodData.data());
846 m_lodData->dataManager()->bitBltRough(dst->
lodData->dataManager(), dst->
lodData->dataManager()->extent());
852 extent.translate(data->
x(), data->
y());
860 DataSP data = m_frames[frameId];
861 transferFromData(data.data(), targetDevice);
866 DataSP dstData = m_frames[dstFrameId];
872 uploadFrameData(srcData, dstData);
877 DataSP dstData = m_frames[dstFrameId];
883 uploadFrameData(srcData, dstData);
888 if (srcData->colorSpace() != dstData->colorSpace() &&
889 *srcData->colorSpace() != *dstData->colorSpace()) {
894 srcData->convertDataColorSpace(dstData->colorSpace(),
904 const int defaultPixelcmp =
905 memcmp(srcData->dataManager()->defaultPixel(),
906 dstData->dataManager()->defaultPixel(),
907 dstData->dataManager()->pixelSize());
908 if (defaultPixelcmp != 0) {
909 dstData->dataManager()->setDefaultPixel(srcData->dataManager()->defaultPixel());
912 dstData->dataManager()->clear();
913 dstData->cache()->invalidate();
915 const QRect
rect = srcData->dataManager()->extent();
916 dstData->dataManager()->bitBltRough(srcData->dataManager(),
rect);
917 dstData->setX(srcData->x());
918 dstData->setY(srcData->y());
923 Data *data = m_lodData.data();
926 transferFromData(data, targetDevice);
983 KoColorConversionTransformation::ConversionFlags conversionFlags,
988 if (dataObjects.isEmpty())
return;
993 Q_FOREACH (
Data *data, dataObjects) {
996 data->
convertDataColorSpace(dstColorSpace, renderingIntent, conversionFlags, mainCommand, progressUpdater);
1004 if (!profile)
return false;
1008 if (!dstColorSpace)
return false;
1015 Q_FOREACH (
Data *data, dataObjects) {
1016 if (!data)
continue;
1028 currentData()->reincarnateWithDetachedHistory(copyContent, mainCommand);
1035 Q_FOREACH (
Data *data, dataObjects) {
1036 if (!data)
continue;
1062 setObjectName(name);
1133 const QRect optimizedRect =
rect & src->extent();
1144 const QRect optimizedRect = minimalRect & src->extent();
1225 return QPoint(
x(),
y());
1322template <
class ComparePixelOp>
1325 if (startRect == endRect)
return startRect;
1329 if (!startRect.isValid())
return QRect();
1333 int boundLeft, boundTop, boundRight, boundBottom;
1334 int endDirN, endDirE, endDirS, endDirW;
1336 startRect.getRect(&x, &y, &w, &h);
1338 if (endRect.isEmpty()) {
1339 endDirS = startRect.bottom();
1340 endDirN = startRect.top();
1341 endDirE = startRect.right();
1342 endDirW = startRect.left();
1343 startRect.getCoords(&boundLeft, &boundTop, &boundRight, &boundBottom);
1345 endDirS = endRect.top() - 1;
1346 endDirN = endRect.bottom() + 1;
1347 endDirE = endRect.left() - 1;
1348 endDirW = endRect.right() + 1;
1349 endRect.getCoords(&boundLeft, &boundTop, &boundRight, &boundBottom);
1359 for (qint32 y2 = y; y2 <= endDirS; ++y2) {
1360 for (qint32 x2 = x; x2 < x + w || found; ++ x2) {
1361 accessor->
moveTo(x2, y2);
1362 if (!compareOp.isPixelEmpty(accessor->
rawDataConst())) {
1377 if (!found && endRect.isEmpty()) {
1383 for (qint32 y2 = y + h - 1; y2 >= endDirN ; --y2) {
1384 for (qint32 x2 = x + w - 1; x2 >= x || found; --x2) {
1385 accessor->
moveTo(x2, y2);
1386 if (!compareOp.isPixelEmpty(accessor->
rawDataConst())) {
1397 for (qint32 x2 = x; x2 <= endDirE ; ++x2) {
1398 for (qint32 y2 = y; y2 < y + h || found; ++y2) {
1399 accessor->
moveTo(x2, y2);
1400 if (!compareOp.isPixelEmpty(accessor->
rawDataConst())) {
1415 for (qint32 x2 = x + w - 1; x2 >= endDirW; --x2) {
1416 for (qint32 y2 = y + h - 1; y2 >= y || found; --y2) {
1417 accessor->
moveTo(x2, y2);
1418 if (!compareOp.isPixelEmpty(accessor->
rawDataConst())) {
1428 return QRect(boundLeft, boundTop,
1429 boundRight - boundLeft + 1,
1430 boundBottom - boundTop + 1);
1437 QRect startRect =
extent();
1442 if (!nonDefaultOnly) {
1449 nonDefaultOnly =
true;
1456 if (nonDefaultOnly) {
1476 Q_FOREACH (
const QRect &rc1, sourceRects) {
1477 const int patchSize = 64;
1479 Q_FOREACH (
const QRect &rc2, smallerRects) {
1481 const QRect result =
1484 if (!result.isEmpty()) {
1485 resultRects << result;
1489 return KisRegion(std::move(resultRects));
1573 KoColorConversionTransformation::ConversionFlags conversionFlags,
1577 m_d->
convertColorSpace(dstColorSpace, renderingIntent, conversionFlags, parentCommand, progressUpdater);
1596 qint32 offsetX, qint32 offsetY)
1598 QImage image = _image;
1600 if (image.format() != QImage::Format_ARGB32) {
1601 image.convertTo(QImage::Format_ARGB32);
1604 if (!profile &&
colorSpace()->
id() ==
"RGBA") {
1605 writeBytes(image.constBits(), offsetX, offsetY, image.width(), image.height());
1608 quint8 * dstData =
new quint8[image.width() * image.height() *
pixelSize()];
1615 writeBytes(dstData, offsetX, offsetY, image.width(), image.height());
1617 }
catch (
const std::bad_alloc&) {
1618 warnKrita <<
"KisPaintDevice::convertFromQImage: Could not allocate" << image.width() * image.height() *
pixelSize() <<
"bytes";
1638 return convertToQImage(dstProfile, x1, y1, w, h, renderingIntent, conversionFlags);
1644 KoColorConversionTransformation::ConversionFlags conversionFlags)
const
1647 rc.x(), rc.y(), rc.width(), rc.height(),
1648 renderingIntent, conversionFlags);
1662 data =
new quint8 [w * h *
pixelSize()];
1663 }
catch (
const std::bad_alloc&) {
1664 warnKrita <<
"KisPaintDevice::convertToQImage std::bad_alloc for " << w <<
" * " << h <<
" * " <<
pixelSize();
1682 while (pos < numPixels) {
1699 for (qint32 y = outputRect.y(); y < outputRect.y() + outputRect.height(); ++y) {
1700 qint32 iY = srcY0 + (y * srcHeight) / h;
1701 for (qint32 x = outputRect.x(); x < outputRect.x() + outputRect.width(); ++x) {
1702 qint32 iX = srcX0 + (x * srcWidth) / w;
1713 if (!size.width() && size.height()) {
1717 if (size.width() && !size.height()) {
1726 QSize thumbnailSize(w, h);
1730 if ((thumbnailSize.width() > imageRect.width()) || (thumbnailSize.height() > imageRect.height())) {
1731 thumbnailSize.scale(imageRect.size(), Qt::KeepAspectRatio);
1737 if (imageRect.isEmpty() || thumbnailSize.isEmpty()) {
1741 int srcWidth, srcHeight;
1743 imageRect.getRect(&srcX0, &srcY0, &srcWidth, &srcHeight);
1745 if (!outputRect.isValid()) {
1746 outputRect = QRect(0, 0, w, h);
1750 thumbnailSize.width(), thumbnailSize.height(), outputRect);
1757 QSize thumbnailSize(w, h);
1758 qreal oversampleAdjusted = qMax(
oversample, 1.);
1759 QSize thumbnailOversampledSize = oversampleAdjusted * thumbnailSize;
1764 qint32 hstart = thumbnailOversampledSize.height();
1766 if ((thumbnailOversampledSize.width() > imageRect.width()) || (thumbnailOversampledSize.height() > imageRect.height())) {
1767 thumbnailOversampledSize.scale(imageRect.size(), Qt::KeepAspectRatio);
1773 if (imageRect.isEmpty() || thumbnailSize.isEmpty() || thumbnailOversampledSize.isEmpty()) {
1777 oversampleAdjusted *= (hstart > 0) ? ((qreal)thumbnailOversampledSize.height() / hstart) : 1.;
1779 outputRect = QRect(0, 0, thumbnailOversampledSize.width(), thumbnailOversampledSize.height());
1781 if (outputTileRect.isValid()) {
1783 outputTileRect = QRect(oversampleAdjusted * outputTileRect.topLeft(), oversampleAdjusted * outputTileRect.bottomRight());
1784 outputRect = outputRect.intersected(outputTileRect);
1788 thumbnailOversampledSize.width(), thumbnailOversampledSize.height(), outputRect);
1790 if (
oversample != 1. && oversampleAdjusted != 1.) {
1792 KisTransformWorker worker(thumbnail, 1 / oversampleAdjusted, 1 / oversampleAdjusted, 0.0, 0.0, 0.0, 0.0, 0.0,
1816 Qt::AspectRatioMode aspectRatioMode,
1818 KoColorConversionTransformation::ConversionFlags conversionFlags)
1821 const QSize thumbnailSize = deviceExtent.size().scaled(maxw, maxh, aspectRatioMode);
1823 oversample, renderingIntent, conversionFlags);
1888 for (qint32
y = 0;
y < r.height();
y++) {
1896 }
while (devIt->nextPixel() && selectionIt->
nextPixel());
1915 if (!pix)
return false;
1929 if (!pix)
return false;
2026 Q_ASSERT(_pixelSize > 0);
2033 Q_ASSERT(_channelCount > 0);
2034 return _channelCount;
2126 std::sort(channels.begin(), channels.end());
2129 sizes.append(channelInfo->
size());
2198 Q_FOREACH(
const int& time, times ) {
2333 FramesHash::const_iterator it =
q->
m_d->
m_frames.constBegin();
2334 FramesHash::const_iterator end =
q->
m_d->
m_frames.constEnd();
2336 for (; it != end; ++it) {
2337 objects.
m_frames.insert(it.key(), it.value().data());
float value(const T *src, size_t ch)
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
const quint8 OPACITY_TRANSPARENT_U8
virtual quint8 * rawData()=0
virtual const quint8 * rawDataConst() const =0
virtual bool nextPixel()=0
void clear(qint32 x, qint32 y, qint32 w, qint32 h, quint8 def)
void purge(const QRect &area)
void setDefaultPixel(const quint8 *defPixel)
bool write(KisPaintDeviceWriter &writer)
void extent(qint32 &x, qint32 &y, qint32 &w, qint32 &h) const
quint32 pixelSize() const
static void releaseInternalPools()
const quint8 * defaultPixel() const
virtual bool externalFrameActive() const =0
virtual int currentLevelOfDetail() const =0
virtual bool wrapAroundMode() const =0
virtual QRect imageBorderRect() const
virtual int currentTime() const =0
virtual QRect bounds() const =0
static KisFilterStrategyRegistry * instance()
int sequenceNumber() const
QRect exactBoundsAmortized()
QImage createThumbnail(qint32 w, qint32 h, qreal oversample, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
QRect nonDefaultPixelArea()
ALWAYS_INLINE KisInterstrokeDataSP interstrokeData() const
ALWAYS_INLINE qint32 levelOfDetail() const
ALWAYS_INLINE qint32 y() const
ALWAYS_INLINE KisDataManagerSP dataManager() const
void assignColorSpace(const KoColorSpace *dstColorSpace, KUndo2Command *parentCommand)
void convertDataColorSpace(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags, KUndo2Command *parentCommand, KoUpdater *updater=nullptr)
ALWAYS_INLINE KisIteratorCompleteListener * cacheInvalidator()
ALWAYS_INLINE qint32 x() const
ALWAYS_INLINE KisPaintDeviceCache * cache()
void prepareClone(const KisPaintDeviceData *srcData, bool copyContent=false)
ALWAYS_INLINE void setX(qint32 value)
ALWAYS_INLINE void setY(qint32 value)
void init(const KoColorSpace *cs, KisDataManagerSP dataManager)
ALWAYS_INLINE const KoColorSpace * colorSpace() const
ALWAYS_INLINE KUndo2Command * createChangeInterstrokeDataCommand(KisInterstrokeDataSP value)
ALWAYS_INLINE void setLevelOfDetail(qint32 value)
void setFrameOffset(int frameId, const QPoint &offset)
int currentFrameId() const
void writeFrameToDevice(int frameId, KisPaintDeviceSP targetDevice)
void setFrameDefaultPixel(const KoColor &defPixel, int frameId)
QPoint frameOffset(int frameId) const
KoColor frameDefaultPixel(int frameId) const
int createFrame(bool copy, int copySrc, const QPoint &offset, KUndo2Command *parentCommand)
void uploadFrame(int srcFrameId, int dstFrameId, KisPaintDeviceSP srcDevice)
QList< KisPaintDeviceData * > testingGetDataObjectsList() const
QRect frameBounds(int frameId)
void deleteFrame(int frame, KUndo2Command *parentCommand)
bool readFrame(QIODevice *stream, int frameId)
TestingDataObjects testingGetDataObjects() const
void invalidateFrameCache(int frameId)
KisDataManagerSP frameDataManager(int frameId) const
bool writeFrame(KisPaintDeviceWriter &store, int frameId)
KisPaintDeviceFramesInterface(KisPaintDevice *parentDevice)
DeviceChangeColorSpaceCommand(KisPaintDeviceSP device, KUndo2Command *parent=0)
void emitNotifications() override
virtual void emitNotifications()
KisPaintDeviceSP m_device
DeviceChangeProfileCommand(KisPaintDeviceSP device, KUndo2Command *parent=0)
FrameInsertionCommand(FramesHash *hash, DataSP data, int frameId, bool insert, KUndo2Command *parentCommand)
virtual KisRegion region() const
virtual KisRandomConstAccessorSP createRandomConstAccessorNG() const
virtual KisHLineConstIteratorSP createHLineConstIteratorNG(KisDataManager *dataManager, qint32 x, qint32 y, qint32 w, qint32 offsetX, qint32 offsetY) const
virtual KisVLineConstIteratorSP createVLineConstIteratorNG(qint32 x, qint32 y, qint32 w) const
virtual QVector< quint8 * > readPlanarBytes(qint32 x, qint32 y, qint32 w, qint32 h) const
virtual QRect extent() const
virtual void move(const QPoint &pt)
virtual void writeBytes(const quint8 *data, const QRect &rect)
virtual void fastBitBltRoughOldData(KisPaintDeviceSP src, const QRect &rect)
virtual void writePlanarBytes(QVector< quint8 * > planes, qint32 x, qint32 y, qint32 w, qint32 h)
virtual void fastBitBlt(KisPaintDeviceSP src, const QRect &rect)
virtual void fill(const QRect &rc, const quint8 *fillPixel)
virtual void fastBitBltRough(KisPaintDeviceSP src, const QRect &rect)
virtual KisRandomAccessorSP createRandomAccessorNG()
virtual void readBytes(quint8 *data, const QRect &rect) const
virtual KisHLineIteratorSP createHLineIteratorNG(KisDataManager *dataManager, qint32 x, qint32 y, qint32 w, qint32 offsetX, qint32 offsetY)
virtual void crop(const QRect &rect)
virtual KisVLineIteratorSP createVLineIteratorNG(qint32 x, qint32 y, qint32 w)
virtual void clear(const QRect &rc)
virtual void fastBitBltOldData(KisPaintDeviceSP src, const QRect &rect)
quint32 pixelSize() const
void crop(qint32 x, qint32 y, qint32 w, qint32 h)
bool read(QIODevice *stream)
KUndo2Command * createChangeInterstrokeDataCommand(KisInterstrokeDataSP data)
set interstroke data to the device
QVector< quint8 * > readPlanarBytes(qint32 x, qint32 y, qint32 w, qint32 h) const
KisRasterKeyframeChannel * keyframeChannel() const
bool write(KisPaintDeviceWriter &store)
void profileChanged(const KoColorProfile *profile)
void uploadLodDataStruct(LodDataStruct *dst)
void fastBitBltRoughOldData(KisPaintDeviceSP src, const QRect &rect)
KisVLineConstIteratorSP createVLineConstIteratorNG(qint32 x, qint32 y, qint32 h) const
bool setPixel(qint32 x, qint32 y, const QColor &c)
void testingFetchLodDevice(KisPaintDeviceSP targetDevice)
bool supportsWraproundMode() const
void requestTimeSwitch(int time)
void setDefaultPixel(const KoColor &defPixel)
void makeCloneFromRough(KisPaintDeviceSP src, const QRect &minimalRect)
KisRegion regionForLodSyncing() const
int sequenceNumber() const
QRect nonDefaultPixelArea() const
void setDefaultBounds(KisDefaultBoundsBaseSP bounds)
LodDataStruct * createLodDataStruct(int lod)
void updateLodDataStruct(LodDataStruct *dst, const QRect &srcRect)
bool fastBitBltPossible(KisPaintDeviceSP src)
KisPaintDeviceSP createCompositionSourceDevice() const
KisPaintDevice(const KoColorSpace *colorSpace, const QString &name=QString())
KisPaintDeviceSP createThumbnailDevice(qint32 w, qint32 h, QRect rect=QRect(), QRect outputRect=QRect()) const
virtual const KoColorSpace * compositionSourceColorSpace() const
void writePlanarBytes(QVector< quint8 * > planes, qint32 x, qint32 y, qint32 w, qint32 h)
void emitProfileChanged()
KisInterstrokeDataSP interstrokeData() const
QImage createThumbnail(qint32 maxw, qint32 maxh, QRect rect, qreal oversample=1, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags())
void init(const KoColorSpace *colorSpace, KisDefaultBoundsBaseSP defaultBounds, KisNodeWSP parent, const QString &name)
KisRandomConstAccessorSP createRandomConstAccessorNG() const
KUndo2Command * reincarnateWithDetachedHistory(bool copyContent)
KisPaintDeviceFramesInterface * framesInterface()
quint32 channelCount() const
static MemoryReleaseObject * createMemoryReleaseObject()
QRect exactBounds() const
void purgeDefaultPixels()
KisHLineIteratorSP createHLineIteratorNG(qint32 x, qint32 y, qint32 w)
KisRegion regionExact() const
void fill(const QRect &rc, const KoColor &color)
KisRepeatVLineConstIteratorSP createRepeatVLineConstIterator(qint32 x, qint32 y, qint32 h, const QRect &_dataWidth) const
void setProjectionDevice(bool value)
void generateLodCloneDevice(KisPaintDeviceSP dst, const QRect &originalRect, int lod)
friend class KisPaintDeviceFramesInterface
KisFixedPaintDeviceSP createCompositionSourceDeviceFixed() const
const KoColorSpace * colorSpace() const
QVector< qint32 > channelSizes() const
KisDataManagerSP dataManager() const
KisPaintDeviceSP createThumbnailDeviceOversampled(qint32 w, qint32 h, qreal oversample, QRect rect=QRect(), QRect outputRect=QRect()) const
QRect exactBoundsAmortized() const
KisRasterKeyframeChannel * createKeyframeChannel(const KoID &id)
void clearSelection(KisSelectionSP selection)
void setSupportsWraparoundMode(bool value)
KoColor defaultPixel() const
QImage convertToQImage(const KoColorProfile *dstProfile, qint32 x, qint32 y, qint32 w, qint32 h, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags()) const
void estimateMemoryStats(qint64 &imageData, qint64 &temporaryData, qint64 &lodData) const
bool pixel(qint32 x, qint32 y, QColor *c) const
KisNodeWSP parentNode() const
KisDefaultBoundsBaseSP defaultBounds() const
KisVLineIteratorSP createVLineIteratorNG(qint32 x, qint32 y, qint32 h)
void emitColorSpaceChanged()
void convertFromQImage(const QImage &image, const KoColorProfile *profile, qint32 offsetX=0, qint32 offsetY=0)
void fastBitBltRough(KisPaintDeviceSP src, const QRect &rect)
void setParentNode(KisNodeWSP parent)
bool setProfile(const KoColorProfile *profile, KUndo2Command *parentCommand)
void fastBitBltOldData(KisPaintDeviceSP src, const QRect &rect)
void moveTo(qint32 x, qint32 y)
void prepareClone(KisPaintDeviceSP src)
void fastBitBlt(KisPaintDeviceSP src, const QRect &rect)
void makeFullCopyFrom(const KisPaintDevice &rhs, KritaUtils::DeviceCopyMode copyMode=KritaUtils::CopySnapshot, KisNode *newParentNode=0)
void colorSpaceChanged(const KoColorSpace *colorspace)
void convertTo(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent=KoColorConversionTransformation::internalRenderingIntent(), KoColorConversionTransformation::ConversionFlags conversionFlags=KoColorConversionTransformation::internalConversionFlags(), KUndo2Command *parentCommand=nullptr, KoUpdater *progressUpdater=nullptr)
void readBytes(quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h) const
KisRandomSubAccessorSP createRandomSubAccessor() const
KisHLineConstIteratorSP createHLineConstIteratorNG(qint32 x, qint32 y, qint32 w) const
QRect calculateExactBounds(bool nonDefaultOnly) const
void makeCloneFrom(KisPaintDeviceSP src, const QRect &rect)
KisRepeatHLineConstIteratorSP createRepeatHLineConstIterator(qint32 x, qint32 y, qint32 w, const QRect &_dataWidth) const
void writeBytes(const quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h)
~KisPaintDevice() override
KisRandomAccessorSP createRandomAccessorNG()
virtual void moveTo(qint32 x, qint32 y)=0
The KisRasterKeyframeChannel is a concrete KisKeyframeChannel subclass that stores and manages KisRas...
The KisRasterKeyframe class is a concrete subclass of KisKeyframe that wraps a physical raster image ...
KisRegion translated(int x, int y) const
QRect boundingRect() const
QVector< QRect > rects() const
bool nextPixels(int numPixels)
ALWAYS_INLINE quint8 * rawData()
int nConseqPixels() const
ALWAYS_INLINE const quint8 * rawDataConst() const
virtual quint32 pixelSize() const =0
virtual QImage convertToQImage(const quint8 *data, qint32 width, qint32 height, const KoColorProfile *dstProfile, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
virtual void toQColor(const quint8 *src, QColor *c) const =0
virtual void applyInverseAlphaU8Mask(quint8 *pixels, const quint8 *alpha, qint32 nPixels) const =0
QList< KoChannelInfo * > channels
virtual void fromQColor(const QColor &color, quint8 *dst) const =0
virtual quint32 channelCount() const =0
virtual quint8 opacityU8(const quint8 *pixel) const =0
virtual bool convertPixelsTo(const quint8 *src, quint8 *dst, const KoColorSpace *dstColorSpace, quint32 numPixels, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
KoMixColorsOp * mixColorsOp
virtual const KoColorProfile * profile() const =0
void convertTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
void setColor(const quint8 *data, const KoColorSpace *colorSpace=0)
static KoColor createTransparent(const KoColorSpace *cs)
const KoColorSpace * colorSpace() const
return the current colorSpace
A holder for an updater that does nothing.
const T value(const QString &id) const
virtual void mixColors(const quint8 *const *colors, const qint16 *weights, int nColors, quint8 *dst, int weightSum=255) const =0
#define KIS_ASSERT_RECOVER_RETURN_VALUE(cond, val)
#define KIS_ASSERT_RECOVER(cond)
#define KIS_SAFE_ASSERT_RECOVER_RETURN(cond)
#define KIS_ASSERT_RECOVER_RETURN(cond)
#define KIS_ASSERT_RECOVER_NOOP(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
static KisPaintDeviceSP createThumbnailDeviceInternal(const KisPaintDevice *srcDev, qint32 srcX0, qint32 srcY0, qint32 srcWidth, qint32 srcHeight, qint32 w, qint32 h, QRect outputRect)
QSize fixThumbnailSize(QSize size)
bool moveBy(KisSequentialConstIterator &iter, int numPixels)
KIS_DECLARE_STATIC_INITIALIZER
QSharedPointer< T > toQShared(T *ptr)
KisRepeatHLineIteratorPixelBase< KisHLineIterator2 > KisRepeatHLineConstIteratorNG
KisRepeatVLineIteratorPixelBase< KisVLineIterator2 > KisRepeatVLineConstIteratorNG
QRect calculateExactBoundsImpl(const KisPaintDevice *device, const QRect &startRect, const QRect &endRect, ComparePixelOp compareOp)
QVector< QRect > splitRectIntoPatches(const QRect &rc, const QSize &patchSize)
CheckFullyTransparent(const KoColorSpace *colorSpace)
bool isPixelEmpty(const quint8 *pixelData)
const KoColorSpace * m_colorSpace
CheckNonDefault(int pixelSize, const quint8 *defaultPixel)
const quint8 * m_defaultPixel
bool isPixelEmpty(const quint8 *pixelData)
The KisIteratorCompleteListener struct is a special interface for notifying the paint device that an ...
void requestTimeSwitch(int time)
Data * m_externalFrameData
~MemoryReleaseObject() override
QScopedPointer< Data > lodData
LodDataStructImpl(Data *_lodData)
StrategyPolicy(KisPaintDevice::Private::KisPaintDeviceStrategy *strategy, KisDataManager *dataManager, qint32 offsetX, qint32 offsetY)
KisHLineIteratorSP createIterator(const QRect &rect)
KisDataManager * m_dataManager
KisHLineConstIteratorSP createConstIterator(const QRect &rect)
KisPaintDeviceStrategy * m_strategy
void generateLodCloneDevice(KisPaintDeviceSP dst, const QRect &originalRect, int lod)
void setFrameDefaultPixel(const KoColor &defPixel, int frameId)
void init(const KoColorSpace *cs, const quint8 *defaultPixel)
KisInterstrokeDataSP interstrokeData() const
void transferFromData(Data *data, KisPaintDeviceSP targetDevice)
int createFrame(bool copy, int copySrc, const QPoint &offset, KUndo2Command *parentCommand)
Data * currentNonLodData() const
bool writeFrame(KisPaintDeviceWriter &store, int frameId)
void uploadLodDataStruct(LodDataStruct *dst)
const KoColorSpace * colorSpace() const
QScopedPointer< KisRasterKeyframeChannel > contentChannel
void deleteFrame(int frameID, KUndo2Command *parentCommand)
DataSP currentFrameData() const
KisDefaultBoundsBaseSP defaultBounds
KisDataManagerSP dataManager() const
bool readFrame(QIODevice *stream, int frameId)
QHash< int, DataSP > FramesHash
KUndo2Command * reincarnateWithDetachedHistory(bool copyContent)
void prepareCloneImpl(KisPaintDeviceSP src, Data *srcData)
bool fastBitBltPossibleImpl(Data *srcData)
int currentFrameId() const
KUndo2Command * createChangeInterstrokeDataCommand(KisInterstrokeDataSP value)
LodDataStruct * createLodDataStruct(int lod)
qint64 estimateDataSize(Data *data) const
QPoint frameOffset(int frameId) const
QScopedPointer< Data > m_externalFrameData
KisIteratorCompleteListener * cacheInvalidator()
QScopedPointer< KisPaintDeviceFramesInterface > framesInterface
static const KisDefaultBoundsSP transitionalDefaultBounds
QScopedPointer< Data > m_lodData
void estimateMemoryStats(qint64 &imageData, qint64 &temporaryData, qint64 &lodData) const
bool fastBitBltPossible(KisPaintDeviceSP src)
bool assignProfile(const KoColorProfile *profile, KUndo2Command *parentCommand)
bool supportsWrapAroundMode
void updateLodDataStruct(LodDataStruct *dst, const QRect &srcRect)
void testingFetchLodDevice(KisPaintDeviceSP targetDevice)
KisSequentialIteratorBase< ReadOnlyIteratorPolicy< StrategyPolicy >, StrategyPolicy > InternalSequentialConstIterator
const QList< int > frameIds() const
QRect frameBounds(int frameId)
void ensureLodDataPresent() const
void uploadFrame(int srcFrameId, int dstFrameId, KisPaintDeviceSP srcDevice)
QMutex m_wrappedStrategyMutex
KisRegion regionForLodSyncing() const
Data * currentData() const
void writeFrameToDevice(int frameId, KisPaintDeviceSP targetDevice)
void cloneAllDataObjects(Private *rhs, bool copyFrames)
Private(KisPaintDevice *paintDevice)
void prepareClone(KisPaintDeviceSP src)
QScopedPointer< KisPaintDeviceStrategy > basicStrategy
void updateLodDataManager(KisDataManager *srcDataManager, KisDataManager *dstDataManager, const QPoint &srcOffset, const QPoint &dstOffset, const QRect &originalRect, int lod)
QScopedPointer< KisPaintDeviceWrappedStrategy > wrappedStrategy
KisDataManagerSP frameDataManager(int frameId) const
void setFrameOffset(int frameId, const QPoint &offset)
KisPaintDeviceCache * cache()
QList< Data * > allDataObjects() const
void convertColorSpace(const KoColorSpace *dstColorSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags, KUndo2Command *parentCommand, KoUpdater *progressUpdater)
void uploadFrameData(DataSP srcData, DataSP dstData)
KisPaintDeviceStrategy * currentStrategy()
KisSequentialIteratorBase< WritableIteratorPolicy< StrategyPolicy >, StrategyPolicy > InternalSequentialIterator
void invalidateFrameCache(int frameId)
QSharedPointer< Data > DataSP
KoColor frameDefaultPixel(int frameId) const
KisPixelSelectionSP projection() const
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()