7#ifndef __KIS_PAINT_DEVICE_STRATEGIES_H
8#define __KIS_PAINT_DEVICE_STRATEGIES_H
28 virtual void move(
const QPoint& pt) {
60 virtual void clear(
const QRect & rc) {
64 rc.width(), rc.height(),
69 virtual void fill(
const QRect &rc,
const quint8 *fillPixel) {
207 void move(
const QPoint& pt)
override {
213 QRegion borderRegion(exactBoundsBeforeMove.translated(
offset.x(),
offset.y()));
218 auto rectIter = borderRegion.begin();
219 while (rectIter != borderRegion.end()) {
220 QRect rc = *rectIter;
227 for (
int y = rc.y();
y <= rc.bottom();
y += rows) {
229 rows = qMin(rows, rc.bottom() -
y + 1);
231 for (
int x = rc.x();
x <= rc.right();
x += columns) {
233 columns = qMin(columns, rc.right() -
x + 1);
241 quint8 *dstPtr = dstIt->
rawData();
243 for (
int i = 0; i < rows; i++) {
244 memcpy(dstPtr, srcPtr,
pixelSize * columns);
245 srcPtr += srcRowStride;
246 dstPtr += dstRowStride;
266 if (!clippedRect.isEmpty()) {
267 rects.append(clippedRect);
284 Q_FOREACH (
const QRect &rc, splitRect) {
289 void fill(
const QRect &
rect,
const quint8 *fillPixel)
override {
291 Q_FOREACH (
const QRect &rc, splitRect) {
345 Q_FOREACH (
const QRect &rc, splitRect) {
352 Q_FOREACH (
const QRect &rc, splitRect) {
379 int totalHeight =
rect.height();
380 int totalWidth =
rect.width();
381 int dataRowStride = totalWidth *
pixelSize;
385 while (row < totalHeight) {
389 QPoint leftRectOrigin = splitRect[leftIndex].
topLeft();
390 QPoint rightRectOrigin = splitRect[rightIndex].
topLeft();
392 int height = qMin(splitRect[leftIndex].height(), totalHeight - row);
395 while (col < totalWidth) {
399 width = qMin(leftWidth, totalWidth - col);
400 dataPtr = data +
pixelSize * (col + row * totalWidth);
401 readBytesImpl(dataPtr, QRect(leftRectOrigin, QSize(width, height)), dataRowStride);
404 if (col >= totalWidth)
break;
406 width = qMin(rightWidth, totalWidth - col);
407 dataPtr = data +
pixelSize * (col + row * totalWidth);
408 readBytesImpl(dataPtr, QRect(rightRectOrigin, QSize(width, height)), dataRowStride);
413 bufOffset = (bufOffset + 2) % 4;
426 int totalWidth =
rect.width();
427 int dataRowStride = totalWidth *
pixelSize;
431 const quint8 *dataPtr;
436 dataPtr = data +
pixelSize * (origin.x() + totalWidth * origin.y());
439 origin.rx() = splitRect.
topLeft().width();
442 dataPtr = data +
pixelSize * (origin.x() + totalWidth * origin.y());
446 origin.ry() = splitRect.
topLeft().height();
448 dataPtr = data +
pixelSize * (origin.x() + totalWidth * origin.y());
451 origin.rx() = splitRect.
topLeft().width();
452 origin.ry() = splitRect.
topLeft().height();
454 dataPtr = data +
pixelSize * (origin.x() + totalWidth * origin.y());
const quint8 OPACITY_TRANSPARENT_U8
virtual quint8 * rawData()=0
virtual const quint8 * rawDataConst() const =0
void clear(qint32 x, qint32 y, qint32 w, qint32 h, quint8 def)
void readBytes(quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h, qint32 dataRowStride=-1) const
void setExtent(qint32 x, qint32 y, qint32 w, qint32 h)
void writeBytes(const quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h, qint32 dataRowStride=-1)
void bitBltRough(KisTiledDataManagerSP srcDM, const QRect &rect)
QVector< quint8 * > readPlanarBytes(QVector< qint32 > channelsizes, qint32 x, qint32 y, qint32 w, qint32 h) const
void bitBltOldData(KisTiledDataManagerSP srcDM, const QRect &rect)
void writePlanarBytes(QVector< quint8 * > planes, QVector< qint32 > channelsizes, qint32 x, qint32 y, qint32 w, qint32 h)
void extent(qint32 &x, qint32 &y, qint32 &w, qint32 &h) const
void bitBltRoughOldData(KisTiledDataManagerSP srcDM, const QRect &rect)
void bitBlt(KisTiledDataManagerSP srcDM, const QRect &rect)
const quint8 * defaultPixel() const
virtual WrapAroundAxis wrapAroundModeAxis() const =0
virtual QRect bounds() const =0
KisPaintDevice * m_device
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)
KisPaintDeviceStrategy(KisPaintDevice *device, KisPaintDevice::Private *d)
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 readBytesImpl(quint8 *data, const QRect &rect, int dataRowStride) const
KisPaintDevice::Private *const m_d
virtual void fastBitBltImpl(KisDataManagerSP srcDataManager, const QRect &rect)
virtual void fastBitBltRoughImpl(KisDataManagerSP srcDataManager, const QRect &rect)
virtual void fill(const QRect &rc, const quint8 *fillPixel)
virtual void writeBytesImpl(const quint8 *data, const QRect &rect, int dataRowStride)
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 ~KisPaintDeviceStrategy()
virtual KisVLineIteratorSP createVLineIteratorNG(qint32 x, qint32 y, qint32 w)
virtual void fastBitBltRough(KisDataManagerSP srcDataManager, const QRect &rect)
virtual void clear(const QRect &rc)
virtual void fastBitBltOldData(KisPaintDeviceSP src, const QRect &rect)
QRect extent() const override
KisVLineConstIteratorSP createVLineConstIteratorNG(qint32 x, qint32 y, qint32 h) const override
void fastBitBltImpl(KisDataManagerSP srcDataManager, const QRect &rect) override
const QRect wrapRect() const
void setWrapRect(const QRect &rc)
void readBytes(quint8 *data, const QRect &rect) const override
KisHLineConstIteratorSP createHLineConstIteratorNG(KisDataManager *dataManager, qint32 x, qint32 y, qint32 w, qint32 offsetX, qint32 offsetY) const override
KisRandomAccessorSP createRandomAccessorNG() override
void fastBitBltRoughOldData(KisPaintDeviceSP src, const QRect &rect) override
void clear(const QRect &rect) override
KisRandomConstAccessorSP createRandomConstAccessorNG() const override
KisPaintDeviceWrappedStrategy(const QRect &wrapRect, KisPaintDevice *device, KisPaintDevice::Private *d)
KisHLineIteratorSP createHLineIteratorNG(KisDataManager *dataManager, qint32 x, qint32 y, qint32 w, qint32 offsetX, qint32 offsetY) override
KisVLineIteratorSP createVLineIteratorNG(qint32 x, qint32 y, qint32 h) override
void crop(const QRect &rect) override
void fill(const QRect &rect, const quint8 *fillPixel) override
void writeBytes(const quint8 *data, const QRect &rect) override
void move(const QPoint &pt) override
KisRegion region() const override
void fastBitBltOldData(KisPaintDeviceSP src, const QRect &rect) override
void fastBitBltRoughImpl(KisDataManagerSP srcDataManager, const QRect &rect) override
quint32 pixelSize() const
bool fastBitBltPossible(KisPaintDeviceSP src)
QRect exactBounds() const
QVector< qint32 > channelSizes() const
KoColor defaultPixel() const
KisDefaultBoundsBaseSP defaultBounds() const
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
KisRegion translated(int x, int y) const
QVector< QRect > rects() const
KisWrappedLineIteratorBase< WrappedHLineIteratorStrategy, KisHLineIteratorNG > KisWrappedHLineIterator
KisWrappedLineIteratorBase< WrappedVLineIteratorStrategy, KisVLineIteratorNG > KisWrappedVLineIterator
KisDefaultBoundsBaseSP defaultBounds
KisDataManagerSP dataManager() const
KisIteratorCompleteListener * cacheInvalidator()
KisPaintDeviceCache * cache()
static QRect clipToWrapRect(QRect rc, const QRect &wrapRect, WrapAroundAxis wrapAxis)
QRect bottomRight() const