32 QScopedPointer<KoOptimizedPixelDataScalerU8ToU16Base>
scaler;
73 if (forcedOverlayColorSpace) {
121 for (
int i = 0; i < numOverlays; i++) {
138 m_d->externalDestination = device;
143 return m_d->externalDestination;
153 return !
m_d->overlays.isEmpty() ?
m_d->overlays[index] :
m_d->source;
168 if (rects.isEmpty())
return;
169 if (
m_d->overlays.isEmpty())
return;
174 Q_FOREACH (
const QRect &rc, rects) {
175 if (
m_d->source->defaultBounds()->wrapAroundMode()) {
176 const QRect wrapRect =
m_d->source->defaultBounds()->imageBorderRect();
177 KisWrappedRect wrappedRect(rc, wrapRect,
m_d->source->defaultBounds()->wrapAroundModeAxis());
178 Q_FOREACH (
const QRect &wrc, wrappedRect) {
179 rectsToRead +=
m_d->grid.addRect(wrc);
181 cropRect &= wrapRect;
183 rectsToRead +=
m_d->grid.addRect(rc);
193 Q_FOREACH (
const QRect &
rect, rectsToRead) {
194 const QRect croppedRect =
rect & cropRect;
195 if (croppedRect.isEmpty())
continue;
206 auto rectIter = rectsToRead.begin();
207 while (rectIter != rectsToRead.end()) {
208 const QRect croppedRect = *rectIter & cropRect;
210 if (!croppedRect.isEmpty()) {
214 [
this] (
const quint8 *src,
int srcRowStride,
215 quint8 *dst,
int dstRowStride,
216 int numRows,
int numColumns) {
218 m_d->scaler->convertU8ToU16(src, srcRowStride,
220 numRows, numColumns);
223 for (
auto it = std::next(
m_d->overlays.begin()); it !=
m_d->overlays.end(); ++it) {
236 if (rects.isEmpty())
return;
237 if (
m_d->overlays.isEmpty())
return;
240 m_d->externalDestination ?
m_d->externalDestination :
m_d->source;
243 (destinationDevice !=
m_d->source &&
244 *destinationDevice->
colorSpace() != *
m_d->source->colorSpace())) {
246 Q_FOREACH (
const QRect &rc, rects) {
257 Q_FOREACH (
const QRect &rc, rects) {
260 [
this] (
const quint8 *src,
int srcRowStride,
261 quint8 *dst,
int dstRowStride,
262 int numRows,
int numColumns) {
264 m_d->scaler->convertU16ToU8(src, srcRowStride,
266 numRows, numColumns);
274 return !
m_d->overlays.isEmpty() ?
m_d->overlays.first()->colorSpace() :
m_d->source->colorSpace();
286 if (!
m_d->usePreciseMode) {
290 m_d->source->compositionSourceColorSpace();
296 compositionColorSpace->
profile());
309 m_d->rootTransactionData.reset();
312 if (!
m_d->previousGrid) {
320 m_d->changeOverlayCommand->m_oldRectsGrid =
m_d->previousGrid;
322 for (
const auto &overlayDevice :
m_d->overlays) {
323 m_d->overlayTransactions.emplace_back(
new KisTransaction(overlayDevice,
m_d->rootTransactionData.data()));
332 m_d->overlayTransactions.clear();
338 m_d->changeOverlayCommand->m_newRectsGrid =
m_d->previousGrid;
339 result =
m_d->rootTransactionData.take();
341 for (
auto &transactionPtr :
m_d->overlayTransactions) {
343 (
void) transactionPtr->endAndTake();
345 m_d->overlayTransactions.clear();
KisMagneticGraph::vertex_descriptor source(typename KisMagneticGraph::edge_descriptor e, KisMagneticGraph g)
const KoID YCbCrAColorModelID("YCbCrA", ki18n("YCbCr/Alpha"))
const KoID Integer8BitsColorDepthID("U8", ki18n("8-bit integer/channel"))
const KoID Integer16BitsColorDepthID("U16", ki18n("16-bit integer/channel"))
const KoID CMYKAColorModelID("CMYKA", ki18n("CMYK/Alpha"))
const KoID RGBAColorModelID("RGBA", ki18n("RGB/Alpha"))
void beginTransaction(KUndo2Command *parent=0)
KisPaintDeviceSP source() const
void writeRects(const QVector< QRect > &rects, int index=0)
void setExternalDestination(KisPaintDeviceSP device)
KUndo2Command * endTransaction()
friend struct KisChangeOverlayWrapperCommand
void readRect(const QRect &rc)
KisPaintDeviceSP overlay(int index=0) const
KisOverlayPaintDeviceWrapper(KisPaintDeviceSP source, int numOverlays=1, OverlayMode mode=NormalMode, const KoColorSpace *forcedOverlayColorSpace=nullptr)
~KisOverlayPaintDeviceWrapper()
const QScopedPointer< Private > m_d
KisPaintDeviceSP externalDestination() const
void readRects(const QVector< QRect > &rects)
const KoColorSpace * overlayColorSpace() const
void writeRect(const QRect &rc, int index=0)
KisPaintDeviceSP createPreciseCompositionSourceDevice()
bool supportsWraproundMode() const
void setDefaultPixel(const KoColor &defPixel)
void setDefaultBounds(KisDefaultBoundsBaseSP bounds)
KisPaintDeviceSP createCompositionSourceDevice() const
virtual const KoColorSpace * compositionSourceColorSpace() const
KisRandomConstAccessorSP createRandomConstAccessorNG() const
const KoColorSpace * colorSpace() const
void setSupportsWraparoundMode(bool value)
KoColor defaultPixel() const
KisDefaultBoundsBaseSP defaultBounds() const
void moveTo(qint32 x, qint32 y)
KisRandomAccessorSP createRandomAccessorNG()
static void copyAreaOptimized(const QPoint &dstPt, KisPaintDeviceSP src, KisPaintDeviceSP dst, const QRect &originalSrcRect)
A utility class to maintain a sparse grid of loaded/unloaded rects.
static void makeGridLikeRectsUnique(QVector< QRect > &rects)
virtual KoID colorModelId() const =0
virtual KoID colorDepthId() const =0
virtual const KoColorProfile * profile() const =0
KoColor convertedTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
static KoOptimizedPixelDataScalerU8ToU16Base * createCmykaScaler()
static KoOptimizedPixelDataScalerU8ToU16Base * createRgbaScaler()
#define KIS_SAFE_ASSERT_RECOVER(cond)
#define KIS_SAFE_ASSERT_RECOVER_NOOP(cond)
typedef void(QOPENGLF_APIENTRYP PFNGLINVALIDATEBUFFERDATAPROC)(GLuint buffer)
void processTwoDevicesWithStrides(const QRect &rc, KisRandomConstAccessorSP srcIt, KisRandomAccessorSP dstIt, PixelProcessor pixelProcessor)
KisOverlayPaintDeviceWrapper::Private * m_d
QSharedPointer< KisRectsGrid > m_oldRectsGrid
KisChangeOverlayWrapperCommand(KisOverlayPaintDeviceWrapper::Private *d, KUndo2Command *parent=0)
QSharedPointer< KisRectsGrid > m_newRectsGrid
QSharedPointer< KisRectsGrid > previousGrid
KisChangeOverlayWrapperCommand * changeOverlayCommand
QScopedPointer< KoOptimizedPixelDataScalerU8ToU16Base > scaler
QVector< KisPaintDeviceSP > overlays
QScopedPointer< KUndo2Command > rootTransactionData
KisPaintDeviceSP externalDestination
std::vector< std::unique_ptr< KisTransaction > > overlayTransactions
const KoColorSpace * colorSpace(const QString &colorModelId, const QString &colorDepthId, const KoColorProfile *profile)
static KoColorSpaceRegistry * instance()