summaryrefslogtreecommitdiffstats
path: root/src/runtime/q3dsimageloaders_p.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/runtime/q3dsimageloaders_p.h')
-rw-r--r--src/runtime/q3dsimageloaders_p.h17
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);
}
}