Krita Source Code Documentation
Loading...
Searching...
No Matches
KisOpenGLUpdateInfoBuilder Class Reference

#include <KisOpenGLUpdateInfoBuilder.h>

+ Inheritance diagram for KisOpenGLUpdateInfoBuilder:

Public Member Functions

KisOpenGLUpdateInfoSP buildUpdateInfo (const QRect &rect, KisImageSP srcImage, bool convertColorSpace)
 
KisOpenGLUpdateInfoSP buildUpdateInfo (const QRect &rect, KisPaintDeviceSP projection, const QRect &bounds, int levelOfDetail, bool convertColorSpace)
 
QRect calculateEffectiveTileRect (int col, int row, const QRect &imageBounds) const
 
QRect calculatePhysicalTileRect (int col, int row, const QRect &imageBounds, int levelOfDetail) const
 
const KoColorSpacedestinationColorSpace () const
 
 KisOpenGLUpdateInfoBuilder ()
 
KisProofingConfigurationSP proofingConfig () const
 
void setChannelFlags (const QBitArray &channelFrags, bool onlyOneChannelSelected, int selectedChannelIndex)
 
void setConversionOptions (const ConversionOptions &options)
 
void setEffectiveTextureSize (const QSize &size)
 
void setProofingConfig (KisProofingConfigurationSP config)
 
void setTextureBorder (int value)
 
void setTextureInfoPool (KisTextureTileInfoPoolSP pool)
 
KisTextureTileInfoPoolSP textureInfoPool () const
 
int xToCol (int x) const
 
int yToRow (int y) const
 
 ~KisOpenGLUpdateInfoBuilder ()
 
- Public Member Functions inherited from Private
 Private (KisCanvas2 *c)
 

Public Attributes

QBitArray channelFlags
 
ConversionOptions conversionOptions
 
QSize effectiveTextureSize
 
QReadWriteLock lock
 
bool onlyOneChannelSelected = false
 
KisTextureTileInfoPoolSP pool
 
KisProofingConfigurationSP proofingConfig
 
QScopedPointer< KoColorConversionTransformationproofingTransform
 
int selectedChannelIndex = -1
 
int textureBorder = 0
 
- Public Attributes inherited from Private
KisCanvas2canvas
 
int displayedFrame
 
int intendedFrame
 

Private Attributes

const QScopedPointer< Privatem_d
 

Detailed Description

Definition at line 19 of file KisOpenGLUpdateInfoBuilder.cpp.

Constructor & Destructor Documentation

◆ KisOpenGLUpdateInfoBuilder()

KisOpenGLUpdateInfoBuilder::KisOpenGLUpdateInfoBuilder ( )

Definition at line 38 of file KisOpenGLUpdateInfoBuilder.cpp.

39 : m_d(new Private)
40{
41}
const QScopedPointer< Private > m_d

◆ ~KisOpenGLUpdateInfoBuilder()

KisOpenGLUpdateInfoBuilder::~KisOpenGLUpdateInfoBuilder ( )

Definition at line 43 of file KisOpenGLUpdateInfoBuilder.cpp.

44{
45}

Member Function Documentation

◆ buildUpdateInfo() [1/2]

KisOpenGLUpdateInfoSP KisOpenGLUpdateInfoBuilder::buildUpdateInfo ( const QRect & rect,
KisImageSP srcImage,
bool convertColorSpace )

Definition at line 47 of file KisOpenGLUpdateInfoBuilder.cpp.

48{
49 return buildUpdateInfo(rect, srcImage->projection(), srcImage->bounds(), srcImage->currentLevelOfDetail(), convertColorSpace);
50}
KisPaintDeviceSP projection() const
int currentLevelOfDetail() const
QRect bounds() const override
KisOpenGLUpdateInfoSP buildUpdateInfo(const QRect &rect, KisImageSP srcImage, bool convertColorSpace)

References KisImage::bounds(), buildUpdateInfo(), KisImage::currentLevelOfDetail(), and KisImage::projection().

◆ buildUpdateInfo() [2/2]

KisOpenGLUpdateInfoSP KisOpenGLUpdateInfoBuilder::buildUpdateInfo ( const QRect & rect,
KisPaintDeviceSP projection,
const QRect & bounds,
int levelOfDetail,
bool convertColorSpace )

Why the rect is artificial? That's easy! It does not represent any real piece of the image. It is intentionally stretched to get through the overlapping stripes of neutrality and poke neighbouring tiles. Thanks to the rect we get the coordinates of all the tiles involved into update process

Definition at line 52 of file KisOpenGLUpdateInfoBuilder.cpp.

53{
55
56 QRect updateRect = rect & bounds;
57 if (updateRect.isEmpty()) return info;
58
60 KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(m_d->conversionOptions.m_destinationColorSpace, info);
61
62 auto needCreateProofingTransform =
63 [this] () {
64 return !m_d->proofingTransform &&
65 m_d->proofingConfig &&
66 m_d->proofingConfig->displayFlags.testFlag(KoColorConversionTransformation::SoftProofing);
67 };
68
69 // lazily create transform
70 if (convertColorSpace && needCreateProofingTransform()) {
71
72 QWriteLocker locker(&m_d->lock);
73 if (needCreateProofingTransform()) {
74 const KoColorSpace *proofingSpace = KoColorSpaceRegistry::instance()->colorSpace(m_d->proofingConfig->proofingModel,
75 m_d->proofingConfig->proofingDepth,
76 m_d->proofingConfig->proofingProfile);
77 KoColorConversionTransformation::Intent displayIntent = m_d->proofingConfig->determineDisplayIntent(m_d->conversionOptions.m_renderingIntent);
78 KoColorConversionTransformation::ConversionFlags displayFlags = m_d->proofingConfig->determineDisplayFlags(m_d->conversionOptions.m_conversionFlags);
79
81 projection->colorSpace(),
82 m_d->conversionOptions.m_destinationColorSpace,
83 proofingSpace,
84 m_d->proofingConfig->conversionIntent,
85 displayIntent,
86 m_d->proofingConfig->useBlackPointCompensationFirstTransform,
87 m_d->proofingConfig->warningColor,
88 displayFlags));
89 }
90 }
91
92 QReadLocker locker(&m_d->lock);
93
103 QRect artificialRect = kisGrowRect(updateRect, m_d->textureBorder);
104 artificialRect &= bounds;
105
106 int firstColumn = xToCol(artificialRect.left());
107 int lastColumn = xToCol(artificialRect.right());
108 int firstRow = yToRow(artificialRect.top());
109 int lastRow = yToRow(artificialRect.bottom());
110
111 QBitArray channelFlags; // empty by default
112
113 if (!m_d->channelFlags.isEmpty() &&
114 m_d->channelFlags.size() == projection->colorSpace()->channelCount()) {
115
116 channelFlags = m_d->channelFlags;
117 }
118
119 qint32 numItems = (lastColumn - firstColumn + 1) * (lastRow - firstRow + 1);
120 info->tileList.reserve(numItems);
121
122 QRect alignedUpdateRect = updateRect;
123 QRect alignedBounds = bounds;
124
125 if (levelOfDetail) {
126 alignedUpdateRect = KisLodTransform::alignedRect(alignedUpdateRect, levelOfDetail);
127 alignedBounds = KisLodTransform::alignedRect(alignedBounds, levelOfDetail);
128 }
129
130 for (int col = firstColumn; col <= lastColumn; col++) {
131 for (int row = firstRow; row <= lastRow; row++) {
132
133 const QRect alignedTileTextureRect = calculatePhysicalTileRect(col, row, bounds, levelOfDetail);
134
136 new KisTextureTileUpdateInfo(col, row,
137 alignedTileTextureRect,
138 alignedUpdateRect,
139 alignedBounds,
140 levelOfDetail,
141 m_d->pool));
142 // Don't update empty tiles
143 if (tileInfo->valid()) {
144 tileInfo->retrieveData(projection, channelFlags, m_d->onlyOneChannelSelected, m_d->selectedChannelIndex);
145
146 if (convertColorSpace) {
147 if (m_d->proofingTransform) {
148 tileInfo->proofTo(m_d->conversionOptions.m_destinationColorSpace, m_d->proofingConfig->displayFlags, m_d->proofingTransform.data());
149 } else {
150 tileInfo->convertTo(m_d->conversionOptions.m_destinationColorSpace, m_d->conversionOptions.m_renderingIntent, m_d->conversionOptions.m_conversionFlags);
151 }
152 }
153
154 info->tileList.append(tileInfo);
155 }
156 else {
157 dbgUI << "Trying to create an empty tileinfo record" << col << row << alignedTileTextureRect << updateRect << bounds;
158 }
159 }
160 }
161
163 info->assignLevelOfDetail(levelOfDetail);
164 return info;
165}
static QRect alignedRect(const QRect &srcRect, int lod)
KisTextureTileUpdateInfoSPList tileList
void assignLevelOfDetail(int lod)
void assignDirtyImageRect(const QRect &rect)
const KoColorSpace * colorSpace() const
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)
virtual quint32 channelCount() const =0
#define KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE(cond, val)
Definition kis_assert.h:129
#define bounds(x, a, b)
#define dbgUI
Definition kis_debug.h:52
T kisGrowRect(const T &rect, U offset)
Definition kis_global.h:186
QRect calculatePhysicalTileRect(int col, int row, const QRect &imageBounds, int levelOfDetail) const
const KoColorSpace * colorSpace(const QString &colorModelId, const QString &colorDepthId, const KoColorProfile *profile)
static KoColorSpaceRegistry * instance()

References KisLodTransformBase::alignedRect(), KisOpenGLUpdateInfo::assignDirtyImageRect(), KisOpenGLUpdateInfo::assignLevelOfDetail(), bounds, calculatePhysicalTileRect(), KoColorSpace::channelCount(), channelFlags, KisPaintDevice::colorSpace(), KoColorSpaceRegistry::colorSpace(), dbgUI, KisTextureTileUpdateInfo::generateProofingTransform(), KoColorSpaceRegistry::instance(), KIS_SAFE_ASSERT_RECOVER_RETURN_VALUE, kisGrowRect(), m_d, KoColorConversionTransformation::SoftProofing, KisOpenGLUpdateInfo::tileList, xToCol(), and yToRow().

◆ calculateEffectiveTileRect()

QRect KisOpenGLUpdateInfoBuilder::calculateEffectiveTileRect ( int col,
int row,
const QRect & imageBounds ) const

Definition at line 167 of file KisOpenGLUpdateInfoBuilder.cpp.

168{
169 return imageBounds &
170 QRect(col * m_d->effectiveTextureSize.width(),
171 row * m_d->effectiveTextureSize.height(),
172 m_d->effectiveTextureSize.width(),
173 m_d->effectiveTextureSize.height());
174}

References m_d.

◆ calculatePhysicalTileRect()

QRect KisOpenGLUpdateInfoBuilder::calculatePhysicalTileRect ( int col,
int row,
const QRect & imageBounds,
int levelOfDetail ) const

Definition at line 176 of file KisOpenGLUpdateInfoBuilder.cpp.

177{
178 const QRect tileRect = calculateEffectiveTileRect(col, row, imageBounds);
179 const QRect tileTextureRect = kisGrowRect(tileRect, m_d->textureBorder);
180
181 const QRect alignedTileTextureRect = levelOfDetail ?
182 KisLodTransform::alignedRect(tileTextureRect, levelOfDetail) :
183 tileTextureRect;
184
185 return alignedTileTextureRect;
186}
QRect calculateEffectiveTileRect(int col, int row, const QRect &imageBounds) const

References KisLodTransformBase::alignedRect(), calculateEffectiveTileRect(), kisGrowRect(), and m_d.

◆ destinationColorSpace()

const KoColorSpace * KisOpenGLUpdateInfoBuilder::destinationColorSpace ( ) const

Definition at line 199 of file KisOpenGLUpdateInfoBuilder.cpp.

200{
201 QReadLocker lock(&m_d->lock);
202
203 return m_d->conversionOptions.m_destinationColorSpace;
204}

References lock, and m_d.

◆ proofingConfig()

KisProofingConfigurationSP KisOpenGLUpdateInfoBuilder::proofingConfig ( ) const

◆ setChannelFlags()

void KisOpenGLUpdateInfoBuilder::setChannelFlags ( const QBitArray & channelFrags,
bool onlyOneChannelSelected,
int selectedChannelIndex )

Definition at line 215 of file KisOpenGLUpdateInfoBuilder.cpp.

216{
217 QWriteLocker lock(&m_d->lock);
218
219 m_d->channelFlags = channelFrags;
220 m_d->onlyOneChannelSelected = onlyOneChannelSelected;
221 m_d->selectedChannelIndex = selectedChannelIndex;
222}

References lock, m_d, onlyOneChannelSelected, and selectedChannelIndex.

◆ setConversionOptions()

void KisOpenGLUpdateInfoBuilder::setConversionOptions ( const ConversionOptions & options)

Definition at line 206 of file KisOpenGLUpdateInfoBuilder.cpp.

207{
208 QWriteLocker lock(&m_d->lock);
209
210 m_d->conversionOptions = options;
211 // the proofing transform becomes invalid when the target colorspace changes
212 m_d->proofingTransform.reset();
213}

References lock, and m_d.

◆ setEffectiveTextureSize()

void KisOpenGLUpdateInfoBuilder::setEffectiveTextureSize ( const QSize & size)

Definition at line 231 of file KisOpenGLUpdateInfoBuilder.cpp.

232{
233 QWriteLocker lock(&m_d->lock);
234
235 m_d->effectiveTextureSize = size;
236}
int size(const Forest< T > &forest)
Definition KisForest.h:1232

References lock, and m_d.

◆ setProofingConfig()

void KisOpenGLUpdateInfoBuilder::setProofingConfig ( KisProofingConfigurationSP config)

Definition at line 251 of file KisOpenGLUpdateInfoBuilder.cpp.

252{
253 QWriteLocker lock(&m_d->lock);
254
255 m_d->proofingConfig = config;
256 m_d->proofingTransform.reset();
257}

References lock, and m_d.

◆ setTextureBorder()

void KisOpenGLUpdateInfoBuilder::setTextureBorder ( int value)

Definition at line 224 of file KisOpenGLUpdateInfoBuilder.cpp.

225{
226 QWriteLocker lock(&m_d->lock);
227
228 m_d->textureBorder = value;
229}
float value(const T *src, size_t ch)

References lock, m_d, and value().

◆ setTextureInfoPool()

void KisOpenGLUpdateInfoBuilder::setTextureInfoPool ( KisTextureTileInfoPoolSP pool)

Definition at line 238 of file KisOpenGLUpdateInfoBuilder.cpp.

239{
240 QWriteLocker lock(&m_d->lock);
241
242 m_d->pool = pool;
243}

References lock, m_d, and pool.

◆ textureInfoPool()

KisTextureTileInfoPoolSP KisOpenGLUpdateInfoBuilder::textureInfoPool ( ) const

Definition at line 245 of file KisOpenGLUpdateInfoBuilder.cpp.

246{
247 QReadLocker lock(&m_d->lock);
248 return m_d->pool;
249}

References lock, and m_d.

◆ xToCol()

int KisOpenGLUpdateInfoBuilder::xToCol ( int x) const

Definition at line 189 of file KisOpenGLUpdateInfoBuilder.cpp.

190{
191 return x / m_d->effectiveTextureSize.width();
192}

References m_d.

◆ yToRow()

int KisOpenGLUpdateInfoBuilder::yToRow ( int y) const

Definition at line 194 of file KisOpenGLUpdateInfoBuilder.cpp.

195{
196 return y / m_d->effectiveTextureSize.height();
197}

References m_d.

Member Data Documentation

◆ channelFlags

QBitArray KisOpenGLUpdateInfoBuilder::channelFlags

Definition at line 23 of file KisOpenGLUpdateInfoBuilder.cpp.

◆ conversionOptions

ConversionOptions KisOpenGLUpdateInfoBuilder::conversionOptions

Definition at line 21 of file KisOpenGLUpdateInfoBuilder.cpp.

◆ effectiveTextureSize

QSize KisOpenGLUpdateInfoBuilder::effectiveTextureSize

Definition at line 28 of file KisOpenGLUpdateInfoBuilder.cpp.

◆ lock

QReadWriteLock KisOpenGLUpdateInfoBuilder::lock

Definition at line 34 of file KisOpenGLUpdateInfoBuilder.cpp.

◆ m_d

const QScopedPointer<Private> KisOpenGLUpdateInfoBuilder::m_d
private

Definition at line 65 of file KisOpenGLUpdateInfoBuilder.h.

◆ onlyOneChannelSelected

bool KisOpenGLUpdateInfoBuilder::onlyOneChannelSelected = false

Definition at line 24 of file KisOpenGLUpdateInfoBuilder.cpp.

◆ pool

KisTextureTileInfoPoolSP KisOpenGLUpdateInfoBuilder::pool

Definition at line 33 of file KisOpenGLUpdateInfoBuilder.cpp.

◆ proofingConfig

KisProofingConfigurationSP KisOpenGLUpdateInfoBuilder::proofingConfig

Definition at line 30 of file KisOpenGLUpdateInfoBuilder.cpp.

◆ proofingTransform

QScopedPointer<KoColorConversionTransformation> KisOpenGLUpdateInfoBuilder::proofingTransform

Definition at line 31 of file KisOpenGLUpdateInfoBuilder.cpp.

◆ selectedChannelIndex

int KisOpenGLUpdateInfoBuilder::selectedChannelIndex = -1

Definition at line 25 of file KisOpenGLUpdateInfoBuilder.cpp.

◆ textureBorder

int KisOpenGLUpdateInfoBuilder::textureBorder = 0

Definition at line 27 of file KisOpenGLUpdateInfoBuilder.cpp.


The documentation for this class was generated from the following files: