Krita Source Code Documentation
Loading...
Searching...
No Matches
kis_texture_tile_update_info.h
Go to the documentation of this file.
1/*
2 * SPDX-FileCopyrightText: 2010 Dmitry Kazakov <dimula73@gmail.com>
3 *
4 * SPDX-License-Identifier: GPL-2.0-or-later
5 */
6#ifndef KIS_TEXTURE_TILE_UPDATE_INFO_H_
7#define KIS_TEXTURE_TILE_UPDATE_INFO_H_
8
9#include <QMessageBox>
10#include <QThreadStorage>
11#include <QScopedArrayPointer>
12
13#include "kis_config.h"
14#include "kis_image.h"
15#include "kis_paint_device.h"
17#include <KoChannelInfo.h>
20#include <KoColorSpace.h>
21#include <kis_lod_transform.h>
22#include <KisPortingUtils.h>
23#include <KisDisplayConfig.h>
24
28
40{
41public:
48
56
58 : m_data(rhs.m_data),
60 m_pool(rhs.m_pool)
61 {
62 rhs.m_data = 0;
63 }
64
66 swap(rhs);
67 return *this;
68 }
69
71 if (m_data) {
73 }
74 }
75
76 void allocate(int pixelSize) {
77 Q_ASSERT(!m_data);
78
80 m_data = m_pool->malloc(m_pixelSize);
81 }
82
83 inline quint8* data() const {
84 return m_data;
85 }
86
87 void swap(DataBuffer &other) {
88 std::swap(other.m_pixelSize, m_pixelSize);
89 std::swap(other.m_data, m_data);
90 std::swap(other.m_pool, m_pool);
91 }
92
93 int size() const {
94 return m_data ? m_pool->chunkSize(m_pixelSize) : 0;
95 }
96
98 return m_pool;
99 }
100
101 int pixelSize() const {
102 return m_pixelSize;
103 }
104
105private:
106 Q_DISABLE_COPY(DataBuffer)
107
108 quint8 *m_data {nullptr};
111};
112
114{
115public:
121
122 KisTextureTileUpdateInfo(qint32 col, qint32 row,
123 const QRect &tileRect, const QRect &updateRect, const QRect &currentImageRect,
124 int levelOfDetail,
126 : m_patchPixels(pool),
127 m_pool(pool)
128 {
129 m_tileCol = col;
130 m_tileRow = row;
131 m_tileRect = tileRect;
133 m_patchRect = m_tileRect & updateRect;
135 m_currentImageRect = currentImageRect;
136
137 m_patchLevelOfDetail = levelOfDetail;
138
140 // TODO: check if isBottommost() works correctly when m_originalPatchRect gets aligned
141 // and m_currentImageRect has non-aligned size
145 }
146 }
147
150
151 void retrieveData(KisPaintDeviceSP projectionDevice, const QBitArray &channelFlags, bool onlyOneChannelSelected, int selectedChannelIndex)
152 {
153 m_patchColorSpace = projectionDevice->colorSpace();
155
156 projectionDevice->readBytes(m_patchPixels.data(),
157 m_patchRect.x(), m_patchRect.y(),
158 m_patchRect.width(), m_patchRect.height());
159
160 // XXX: if the paint colorspace is rgb, we should do the channel swizzling in
161 // the display shader
162 if (!channelFlags.isEmpty() && selectedChannelIndex >= 0 && selectedChannelIndex < m_patchColorSpace->channelCount()) {
163 DataBuffer conversionCache(m_patchColorSpace->pixelSize(), m_pool);
164
165 quint32 numPixels = m_patchRect.width() * m_patchRect.height();
166
167 KisConfig cfg(true);
168
169 if (onlyOneChannelSelected && !cfg.showSingleChannelAsColor()) {
170 m_patchColorSpace->convertChannelToVisualRepresentation(m_patchPixels.data(), conversionCache.data(), numPixels, selectedChannelIndex);
171 } else {
172 m_patchColorSpace->convertChannelToVisualRepresentation(m_patchPixels.data(), conversionCache.data(), numPixels, channelFlags);
173 }
174
175 conversionCache.swap(m_patchPixels);
176 }
177
178 }
179
180 void convertTo(const KoColorSpace* dstCS,
182 KoColorConversionTransformation::ConversionFlags conversionFlags)
183 {
184 // we use two-stage check of the color space equivalence:
185 // first check pointers, and if not, check the spaces themselves
186 if ((dstCS == m_patchColorSpace || *dstCS == *m_patchColorSpace) &&
187 conversionFlags == KoColorConversionTransformation::Empty) {
188
189 return;
190 }
191
192 if (m_patchRect.isValid()) {
193 const qint32 numPixels = m_patchRect.width() * m_patchRect.height();
194 DataBuffer conversionCache(dstCS->pixelSize(), m_pool);
195
196 m_patchColorSpace->convertPixelsTo(m_patchPixels.data(), conversionCache.data(), dstCS, numPixels, renderingIntent, conversionFlags);
197
198 m_patchColorSpace = dstCS;
199 conversionCache.swap(m_patchPixels);
200 }
201 }
202
203 void proofTo(const KoColorSpace* dstCS,
204 KoColorConversionTransformation::ConversionFlags displayFlags,
205 KoColorConversionTransformation *proofingTransform)
206 {
207 if (dstCS == m_patchColorSpace && displayFlags == KoColorConversionTransformation::Empty) return;
208
209 if (m_patchRect.isValid()) {
210 const qint32 numPixels = m_patchRect.width() * m_patchRect.height();
211 DataBuffer conversionCache(dstCS->pixelSize(), m_pool);
212
213 m_patchColorSpace->proofPixelsTo(m_patchPixels.data(), conversionCache.data(), numPixels, proofingTransform);
214
215 m_patchColorSpace = dstCS;
216 conversionCache.swap(m_patchPixels);
217 }
218 }
219
221 const KoColorSpace* dstCS, const KoColorSpace* proofingSpace,
224 bool bpcFirstTransform,
225 KoColor gamutWarning,
226 KoColorConversionTransformation::ConversionFlags displayConversionFlags)
227 {
228 KoColor properGamutWarning = gamutWarning.convertedTo(dstCS);
229 return srcCS->createProofingTransform(dstCS, proofingSpace, renderingIntent, proofingIntent, bpcFirstTransform, properGamutWarning.data(), displayConversionFlags);
230 }
231
232 inline quint8* data() const {
233 return m_patchPixels.data();
234 }
235
236 inline int patchLevelOfDetail() const {
238 }
239
240 inline QPoint realPatchOffset() const {
241 return QPoint(m_patchRect.x() - m_tileRect.x(),
242 m_patchRect.y() - m_tileRect.y());
243 }
244
245 inline QSize realPatchSize() const {
246 return m_patchRect.size();
247 }
248
249 inline QRect realPatchRect() const {
250 return m_patchRect;
251 }
252
253 inline QSize realTileSize() const {
254 return m_tileRect.size();
255 }
256
257 inline bool isTopmost() const {
258 return m_originalPatchRect.top() == m_currentImageRect.top();
259 }
260
261 inline bool isLeftmost() const {
262 return m_originalPatchRect.left() == m_currentImageRect.left();
263 }
264
265 inline bool isRightmost() const {
266 return m_originalPatchRect.right() == m_currentImageRect.right();
267 }
268
269 inline bool isBottommost() const {
270 return m_originalPatchRect.bottom() == m_currentImageRect.bottom();
271 }
272
273 inline bool isEntireTileUpdated() const {
274 return m_patchRect == m_tileRect;
275 }
276
277 inline qint32 tileCol() const {
278 return m_tileCol;
279 }
280
281 inline qint32 tileRow() const {
282 return m_tileRow;
283 }
284
285 inline int pixelSize() const {
287 }
288
289 inline const KoColorSpace* patchColorSpace() const {
290 return m_patchColorSpace;
291 }
292
293 inline quint32 patchPixelsLength() const {
294 return m_patchPixels.size();
295 }
296
297 inline bool valid() const {
298 return m_patchRect.isValid();
299 }
300
302 return std::move(m_patchPixels);
303 }
304
305 inline void putPixelData(DataBuffer &&buffer, const KoColorSpace *colorSpace) {
306 m_patchPixels = std::move(buffer);
307 m_patchColorSpace = colorSpace;
308 }
309
310private:
311 Q_DISABLE_COPY(KisTextureTileUpdateInfo)
312
313private:
314 qint32 m_tileCol {0};
315 qint32 m_tileRow {0};
320
325
328
331};
332
333
334#endif /* KIS_TEXTURE_TILE_UPDATE_INFO_H_ */
335
KisTextureTileInfoPoolSP pool() const
void allocate(int pixelSize)
DataBuffer & operator=(DataBuffer &&rhs)
DataBuffer(DataBuffer &&rhs)
void swap(DataBuffer &other)
KisTextureTileInfoPoolSP m_pool
DataBuffer(KisTextureTileInfoPoolSP pool)
DataBuffer(int pixelSize, KisTextureTileInfoPoolSP pool)
bool showSingleChannelAsColor(bool defaultValue=false) const
static QRect alignedRect(const QRect &srcRect, int lod)
static QRect scaledRect(const QRect &srcRect, int lod)
const KoColorSpace * colorSpace() const
void readBytes(quint8 *data, qint32 x, qint32 y, qint32 w, qint32 h) const
void proofTo(const KoColorSpace *dstCS, KoColorConversionTransformation::ConversionFlags displayFlags, KoColorConversionTransformation *proofingTransform)
static KoColorConversionTransformation * generateProofingTransform(const KoColorSpace *srcCS, const KoColorSpace *dstCS, const KoColorSpace *proofingSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::Intent proofingIntent, bool bpcFirstTransform, KoColor gamutWarning, KoColorConversionTransformation::ConversionFlags displayConversionFlags)
KisTextureTileUpdateInfo(qint32 col, qint32 row, const QRect &tileRect, const QRect &updateRect, const QRect &currentImageRect, int levelOfDetail, KisTextureTileInfoPoolSP pool)
void retrieveData(KisPaintDeviceSP projectionDevice, const QBitArray &channelFlags, bool onlyOneChannelSelected, int selectedChannelIndex)
void putPixelData(DataBuffer &&buffer, const KoColorSpace *colorSpace)
KisTextureTileUpdateInfo(KisTextureTileInfoPoolSP pool)
const KoColorSpace * patchColorSpace() const
void convertTo(const KoColorSpace *dstCS, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags)
virtual quint32 pixelSize() const =0
virtual void convertChannelToVisualRepresentation(const quint8 *src, quint8 *dst, quint32 nPixels, const qint32 selectedChannelIndex) const =0
virtual KoColorConversionTransformation * createProofingTransform(const KoColorSpace *dstColorSpace, const KoColorSpace *proofingSpace, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::Intent proofingIntent, bool bpcFirstTransform, quint8 *gamutWarning, KoColorConversionTransformation::ConversionFlags displayConversionFlags) const
createProofingTransform Create a proofing transform. This is a two part transform that can also do ga...
virtual bool proofPixelsTo(const quint8 *src, quint8 *dst, quint32 numPixels, KoColorConversionTransformation *proofingTransform) const
proofPixelsTo
virtual bool convertPixelsTo(const quint8 *src, quint8 *dst, const KoColorSpace *dstColorSpace, quint32 numPixels, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
KoColor convertedTo(const KoColorSpace *cs, KoColorConversionTransformation::Intent renderingIntent, KoColorConversionTransformation::ConversionFlags conversionFlags) const
Definition KoColor.cpp:163
quint8 * data()
Definition KoColor.h:144
QVector< KisTextureTileUpdateInfoSP > KisTextureTileUpdateInfoSPList
QSharedPointer< KisTextureTileUpdateInfo > KisTextureTileUpdateInfoSP