--- qtbase/src/gui/kernel/qplatformgraphicsbufferhelper.cpp.orig 2020-04-30 17:11:30.000000000 +0300 +++ qtbase/src/gui/kernel/qplatformgraphicsbufferhelper.cpp 2020-04-30 17:18:10.000000000 +0300 @@ -157,12 +157,32 @@ GLuint pixelType = GL_UNSIGNED_BYTE; bool needsConversion = false; + bool needsResize = false; bool swizzle = false; bool premultiplied = false; QImage::Format imageformat = QImage::toImageFormat(graphicsBuffer->format()); QImage image(graphicsBuffer->data(), size.width(), size.height(), graphicsBuffer->bytesPerLine(), imageformat); if (graphicsBuffer->bytesPerLine() != (size.width() * 4)) { - needsConversion = true; + switch (imageformat) { + case QImage::Format_ARGB32_Premultiplied: + premultiplied = true; + Q_FALLTHROUGH(); + case QImage::Format_RGB32: + case QImage::Format_ARGB32: + swizzle = true; + needsResize = true; + break; + case QImage::Format_RGBA8888_Premultiplied: + premultiplied = true; + Q_FALLTHROUGH(); + case QImage::Format_RGBX8888: + case QImage::Format_RGBA8888: + needsResize = true; + break; + default: + needsConversion = true; + break; + } } else { switch (imageformat) { case QImage::Format_ARGB32_Premultiplied: @@ -204,6 +224,10 @@ break; } } + if (ctx->isOpenGLES() && needsResize) { + needsConversion = true; + needsResize = false; + } if (needsConversion) image = image.convertToFormat(QImage::Format_RGBA8888); @@ -211,7 +235,11 @@ QRect rect = subRect; if (rect.isNull() || rect == QRect(QPoint(0,0),size)) { + if(needsResize) + funcs->glPixelStorei(GL_UNPACK_ROW_LENGTH, graphicsBuffer->bytesPerLine()/4); funcs->glTexImage2D(GL_TEXTURE_2D, 0, internalFormat, size.width(), size.height(), 0, GL_RGBA, pixelType, image.constBits()); + if(needsResize) + funcs->glPixelStorei(GL_UNPACK_ROW_LENGTH, 0); } else { #ifndef QT_OPENGL_ES_2 if (!ctx->isOpenGLES()) {