31 f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_LOD, 0);
33 f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_BASE_LEVEL, 0);
44 f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_R, GL_BLUE);
45 f->glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_SWIZZLE_B, GL_RED);
48 f->glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
156 f->initializeOpenGLFunctions();
165 const GLvoid *fd = updateInfo.
data();
195 if (!blockMipmapRegeneration &&
196 patchLevelOfDetail > 0 &&
209 f->glTexImage2D(GL_TEXTURE_2D, patchLevelOfDetail,
212 patchSize.height(), 0,
218 const int size = patchSize.width() * patchSize.height() * updateInfo.
pixelSize();
222 f->glTexSubImage2D(GL_TEXTURE_2D, patchLevelOfDetail,
223 patchOffset.x(), patchOffset.y(),
224 patchSize.width(), patchSize.height(),
242 const int pixelSize = updateInfo.
pixelSize();
247 int end = patchOffset.y() - 1;
249 const GLvoid *fd = updateInfo.
data();
250 const int size = patchSize.width() * pixelSize;
254 for (
int i = start; i <= end; i++) {
255 f->glTexSubImage2D(GL_TEXTURE_2D, patchLevelOfDetail,
257 patchSize.width(), 1,
265 int shift = patchSize.width() * (patchSize.height() - 1) *
268 int start = patchOffset.y() + patchSize.height();
269 int end = tileSize.height() - 1;
271 const GLvoid *fd = updateInfo.
data() + shift;
272 const int size = patchSize.width() * pixelSize;
276 for (
int i = start; i < end; i++) {
277 f->glTexSubImage2D(GL_TEXTURE_2D, patchLevelOfDetail,
279 patchSize.width(), 1,
288 QByteArray columnBuffer(patchSize.height() * pixelSize, 0);
290 quint8 *srcPtr = updateInfo.
data();
291 quint8 *dstPtr = (quint8*) columnBuffer.data();
292 for(
int i = 0; i < patchSize.height(); i++) {
293 memcpy(dstPtr, srcPtr, pixelSize);
295 srcPtr += patchSize.width() * pixelSize;
300 int end = patchOffset.x() - 1;
302 const GLvoid *fd = columnBuffer.constData();
303 const int size = columnBuffer.size();
307 for (
int i = start; i <= end; i++) {
308 f->glTexSubImage2D(GL_TEXTURE_2D, patchLevelOfDetail,
310 1, patchSize.height(),
319 QByteArray columnBuffer(patchSize.height() * pixelSize, 0);
321 quint8 *srcPtr = updateInfo.
data() + (patchSize.width() - 1) * pixelSize;
322 quint8 *dstPtr = (quint8*) columnBuffer.data();
323 for(
int i = 0; i < patchSize.height(); i++) {
324 memcpy(dstPtr, srcPtr, pixelSize);
326 srcPtr += patchSize.width() * pixelSize;
330 int start = patchOffset.x() + patchSize.width();
331 int end = tileSize.width() - 1;
333 const GLvoid *fd = columnBuffer.constData();
334 const int size = columnBuffer.size();
338 for (
int i = start; i <= end; i++) {
339 f->glTexSubImage2D(GL_TEXTURE_2D, patchLevelOfDetail,
341 1, patchSize.height(),
359 if (!patchLevelOfDetail) {
bool isEntireTileUpdated() const
QSize realPatchSize() const
int patchLevelOfDetail() const
QPoint realPatchOffset() const
quint32 patchPixelsLength() const
QRect m_textureRectInImagePixels
const KisGLTexturesInfo * m_texturesInfo
void restoreTextureParameters()
QRectF m_tileRectInTexturePixels
void setTextureParameters()
void setPreparedLodPlane(int lod)
bool m_mipmapHasBeenAllocated
KisOpenGL::FilterMode m_filter
KisTextureTile(const QRect &imageRect, const KisGLTexturesInfo *texturesInfo, const QByteArray &fillData, KisOpenGL::FilterMode mode, KisOpenGLBufferCircularStorage *bufferStorage, int numMipmapLevels, QOpenGLFunctions *f)
void update(const KisTextureTileUpdateInfo &updateInfo, bool blockMipmapRegeneration)
bool m_needsMipmapRegeneration
void setNeedsMipmapRegeneration()
int bindToActiveTexture(bool blockMipmapRegeneration)
QRect m_tileRectInImagePixels
KisOpenGLBufferCircularStorage * m_bufferStorage
QRectF imageRectInTexturePixels(const QRect &imageRect) const
QRectF relativeRect(const QRect &br, const QRect &cr, const KisGLTexturesInfo *texturesInfo)