diff options
Diffstat (limited to 'src/runtime/q3dsimageloaders_p.h')
-rw-r--r-- | src/runtime/q3dsimageloaders_p.h | 17 |
1 files changed, 12 insertions, 5 deletions
diff --git a/src/runtime/q3dsimageloaders_p.h b/src/runtime/q3dsimageloaders_p.h index f22d8bc..2904300 100644 --- a/src/runtime/q3dsimageloaders_p.h +++ b/src/runtime/q3dsimageloaders_p.h @@ -832,6 +832,7 @@ static inline quint32 q3ds_blockSizeForTextureFormat(QOpenGLTexture::TextureForm case QOpenGLTexture::SRGB8_PunchThrough_Alpha1_ETC2: case QOpenGLTexture::R11_EAC_UNorm: case QOpenGLTexture::R11_EAC_SNorm: + case QOpenGLTexture::RGB_DXT1: return 8; default: @@ -914,18 +915,19 @@ inline QVector<Qt3DRender::QTextureImageDataPtr> q3ds_loadKtx(QIODevice *source) return result; } + const int rawDataSize = rawData.size(); const char *basep = rawData.constData(); const char *p = basep; const int level0Width = decode(header.pixelWidth); const int level0Height = decode(header.pixelHeight); int faceCount = decode(header.numberOfFaces); const int mipMapLevels = decode(header.numberOfMipmapLevels); - auto createImageData = [=](const QByteArray &compressedData) { + auto createImageData = [=](const QByteArray &compressedData, int mipLevel) { Qt3DRender::QTextureImageDataPtr imageData = Qt3DRender::QTextureImageDataPtr::create(); imageData->setTarget(faceCount == 6 ? QOpenGLTexture::TargetCubeMap : QOpenGLTexture::Target2D); imageData->setFormat(QOpenGLTexture::TextureFormat(decode(header.glInternalFormat))); - imageData->setWidth(level0Width); - imageData->setHeight(level0Height); + imageData->setWidth(qMax(level0Width >> mipLevel, 1)); + imageData->setHeight(qMax(level0Height >> mipLevel, 1)); imageData->setLayers(1); imageData->setDepth(1); // separate textureimage per face and per mipmap @@ -944,11 +946,16 @@ inline QVector<Qt3DRender::QTextureImageDataPtr> q3ds_loadKtx(QIODevice *source) } for (int mip = 0; mip < mipMapLevels; ++mip) { + if (p + 4 - basep > rawDataSize) + break; int imageSize = *reinterpret_cast<const quint32 *>(p); p += 4; for (int face = 0; face < faceCount; ++face) { - result << createImageData(QByteArray(p, imageSize)); - p = basep + q3ds_alignedOffset(p + imageSize - basep, 4); + const int nextOffset = p + imageSize - basep; + if (nextOffset > rawDataSize) + break; + result << createImageData(QByteArray(p, imageSize), mip); + p = basep + q3ds_alignedOffset(nextOffset, 4); } } |