summaryrefslogtreecommitdiffstats
path: root/src/Runtime/ogl-runtime/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/Runtime/ogl-runtime/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp')
m---------src/Runtime/ogl-runtime0
-rw-r--r--src/Runtime/ogl-runtime/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp695
2 files changed, 0 insertions, 695 deletions
diff --git a/src/Runtime/ogl-runtime b/src/Runtime/ogl-runtime
new file mode 160000
+Subproject 2025912174c4cf99270b7439ec3b021e1d089ae
diff --git a/src/Runtime/ogl-runtime/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp b/src/Runtime/ogl-runtime/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp
deleted file mode 100644
index 19d41d11..00000000
--- a/src/Runtime/ogl-runtime/src/runtimerender/resourcemanager/Qt3DSRenderLoadedTextureDDS.cpp
+++ /dev/null
@@ -1,695 +0,0 @@
-/****************************************************************************
-**
-** Copyright (C) 2008-2016 NVIDIA Corporation.
-** Copyright (C) 2017 The Qt Company Ltd.
-** Contact: https://www.qt.io/licensing/
-**
-** This file is part of Qt 3D Studio.
-**
-** $QT_BEGIN_LICENSE:GPL$
-** Commercial License Usage
-** Licensees holding valid commercial Qt licenses may use this file in
-** accordance with the commercial license agreement provided with the
-** Software or, alternatively, in accordance with the terms contained in
-** a written agreement between you and The Qt Company. For licensing terms
-** and conditions see https://www.qt.io/terms-conditions. For further
-** information use the contact form at https://www.qt.io/contact-us.
-**
-** GNU General Public License Usage
-** Alternatively, this file may be used under the terms of the GNU
-** General Public License version 3 or (at your option) any later version
-** approved by the KDE Free Qt Foundation. The licenses are as published by
-** the Free Software Foundation and appearing in the file LICENSE.GPL3
-** included in the packaging of this file. Please review the following
-** information to ensure the GNU General Public License requirements will
-** be met: https://www.gnu.org/licenses/gpl-3.0.html.
-**
-** $QT_END_LICENSE$
-**
-****************************************************************************/
-
-#include "Qt3DSRenderLoadedTextureDDS.h"
-#include "Qt3DSRenderLoadedTextureFreeImageCompat.h"
-
-using namespace qt3ds::render;
-
-namespace qt3ds {
-namespace render {
-
- static int s_exception_string;
-
- //================================================================================
- // DXT data-layout structure definitions.
- typedef struct
- {
- QT3DSU16 col0; // 16-bit 565 interpolant endpoints
- QT3DSU16 col1;
- QT3DSU8 row[4]; // 4x4 * 2bpp color-index == 4 bytes.
- } DXTColBlock;
-
- typedef struct
- {
- QT3DSU16 row[4]; // 4x4 * 4bpp alpha == 8 bytes. (pure 4-bit alpha values)
- } DXT3AlphaBlock;
-
- typedef struct
- {
- QT3DSU8 alpha0; // 8-bit alpha interpolant endpoints
- QT3DSU8 alpha1;
- QT3DSU8 row[6]; // 4x4 * 3bpp alpha-index == 48bits == 6 bytes.
- } DXT5AlphaBlock;
-
- typedef struct
- {
- QT3DSU8 red;
- QT3DSU8 green;
- QT3DSU8 blue;
- QT3DSU8 alpha;
- } Color8888;
-
-//================================================================================
-// Various DDS file defines
-
-#define DDSD_CAPS 0x00000001l
-#define DDSD_HEIGHT 0x00000002l
-#define DDSD_WIDTH 0x00000004l
-#define DDSD_PIXELFORMAT 0x00001000l
-#define DDS_ALPHAPIXELS 0x00000001l
-#define DDS_FOURCC 0x00000004l
-#define DDS_PITCH 0x00000008l
-#define DDS_COMPLEX 0x00000008l
-#define DDS_RGB 0x00000040l
-#define DDS_TEXTURE 0x00001000l
-#define DDS_MIPMAPCOUNT 0x00020000l
-#define DDS_LINEARSIZE 0x00080000l
-#define DDS_VOLUME 0x00200000l
-#define DDS_MIPMAP 0x00400000l
-#define DDS_DEPTH 0x00800000l
-
-#define DDS_CUBEMAP 0x00000200L
-#define DDS_CUBEMAP_POSITIVEX 0x00000400L
-#define DDS_CUBEMAP_NEGATIVEX 0x00000800L
-#define DDS_CUBEMAP_POSITIVEY 0x00001000L
-#define DDS_CUBEMAP_NEGATIVEY 0x00002000L
-#define DDS_CUBEMAP_POSITIVEZ 0x00004000L
-#define DDS_CUBEMAP_NEGATIVEZ 0x00008000L
-
-#define FOURCC_DXT1 0x31545844 //(MAKEFOURCC('D','X','T','1'))
-#define FOURCC_DXT3 0x33545844 //(MAKEFOURCC('D','X','T','3'))
-#define FOURCC_DXT5 0x35545844 //(MAKEFOURCC('D','X','T','5'))
-
-#define DDS_MAGIC_FLIPPED 0x0F7166ED
-
- //================================================================================
- // DDS file format structures.
- typedef struct _DDS_PIXELFORMAT
- {
- QT3DSU32 dwSize;
- QT3DSU32 dwFlags;
- QT3DSU32 dwFourCC;
- QT3DSU32 dwRGBBitCount;
- QT3DSU32 dwRBitMask;
- QT3DSU32 dwGBitMask;
- QT3DSU32 dwBBitMask;
- QT3DSU32 dwABitMask;
- } DDS_PIXELFORMAT;
-
- typedef struct _DDS_HEADER
- {
- QT3DSU32 dwSize;
- QT3DSU32 dwFlags;
- QT3DSU32 dwHeight;
- QT3DSU32 dwWidth;
- QT3DSU32 dwPitchOrLinearSize;
- QT3DSU32 dwDepth;
- QT3DSU32 dwMipMapCount;
- QT3DSU32 dwReserved1[11];
- DDS_PIXELFORMAT ddspf;
- QT3DSU32 dwCaps1;
- QT3DSU32 dwCaps2;
- QT3DSU32 dwReserved2[3];
- } DDS_HEADER;
-
- //================================================================================
- // helper functions
- //================================================================================
-
- // helper macros.
- static inline void NvSwapChar(QT3DSU8 &a, QT3DSU8 &b)
- {
- QT3DSU8 tmp;
- tmp = a;
- a = b;
- b = tmp;
- }
-
- static inline void NvSwapShort(QT3DSU16 &a, QT3DSU16 &b)
- {
- QT3DSU16 tmp;
- tmp = a;
- a = b;
- b = tmp;
- }
-
- //================================================================================
- //================================================================================
- static void flip_blocks_dxtc1(DXTColBlock *line, QT3DSI32 numBlocks)
- {
- DXTColBlock *curblock = line;
- QT3DSI32 i;
-
- for (i = 0; i < numBlocks; i++) {
- NvSwapChar(curblock->row[0], curblock->row[3]);
- NvSwapChar(curblock->row[1], curblock->row[2]);
- curblock++;
- }
- }
-
- //================================================================================
- //================================================================================
- static void flip_blocks_dxtc3(DXTColBlock *line, QT3DSI32 numBlocks)
- {
- DXTColBlock *curblock = line;
- DXT3AlphaBlock *alphablock;
- QT3DSI32 i;
-
- for (i = 0; i < numBlocks; i++) {
- alphablock = (DXT3AlphaBlock *)curblock;
-
- NvSwapShort(alphablock->row[0], alphablock->row[3]);
- NvSwapShort(alphablock->row[1], alphablock->row[2]);
- curblock++;
-
- NvSwapChar(curblock->row[0], curblock->row[3]);
- NvSwapChar(curblock->row[1], curblock->row[2]);
- curblock++;
- }
- }
-
- static void flip_dxt5_alpha(DXT5AlphaBlock *block)
- {
- QT3DSI8 gBits[4][4];
-
- const QT3DSU32 mask = 0x00000007; // bits = 00 00 01 11
- QT3DSU32 bits = 0;
- memcpy(&bits, &block->row[0], sizeof(QT3DSI8) * 3);
-
- gBits[0][0] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[0][1] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[0][2] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[0][3] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[1][0] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[1][1] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[1][2] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[1][3] = (QT3DSI8)(bits & mask);
-
- bits = 0;
- memcpy(&bits, &block->row[3], sizeof(QT3DSI8) * 3);
-
- gBits[2][0] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[2][1] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[2][2] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[2][3] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[3][0] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[3][1] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[3][2] = (QT3DSI8)(bits & mask);
- bits >>= 3;
- gBits[3][3] = (QT3DSI8)(bits & mask);
-
- bits = (gBits[3][0] << 0) | (gBits[3][1] << 3) | (gBits[3][2] << 6) | (gBits[3][3] << 9)
- | (gBits[2][0] << 12) | (gBits[2][1] << 15) | (gBits[2][2] << 18) | (gBits[2][3] << 21);
- memcpy(&block->row[0], &bits, 3);
-
- bits = (gBits[1][0] << 0) | (gBits[1][1] << 3) | (gBits[1][2] << 6) | (gBits[1][3] << 9)
- | (gBits[0][0] << 12) | (gBits[0][1] << 15) | (gBits[0][2] << 18) | (gBits[0][3] << 21);
- memcpy(&block->row[3], &bits, 3);
- }
-
- static void flip_blocks_dxtc5(DXTColBlock *line, QT3DSI32 numBlocks)
- {
- DXTColBlock *curblock = line;
- DXT5AlphaBlock *alphablock;
- QT3DSI32 i;
-
- for (i = 0; i < numBlocks; i++) {
- alphablock = (DXT5AlphaBlock *)curblock;
-
- flip_dxt5_alpha(alphablock);
- curblock++;
-
- NvSwapChar(curblock->row[0], curblock->row[3]);
- NvSwapChar(curblock->row[1], curblock->row[2]);
- curblock++;
- }
- }
-
- static void flip_data_vertical(FreeImageIO *io, QT3DSI8 *image, QT3DSI32 width, QT3DSI32 height,
- Qt3DSDDSImage *info)
- {
- if (info->compressed) {
- QT3DSI32 linesize, j;
- DXTColBlock *top;
- DXTColBlock *bottom;
- QT3DSI8 *tmp;
- void (*flipblocks)(DXTColBlock *, QT3DSI32) = NULL;
- QT3DSI32 xblocks = width / 4;
- QT3DSI32 yblocks = height / 4;
- QT3DSI32 blocksize;
-
- switch (info->format) {
- case qt3ds::render::NVRenderTextureFormats::RGBA_DXT1:
- blocksize = 8;
- flipblocks = &flip_blocks_dxtc1;
- break;
- case qt3ds::render::NVRenderTextureFormats::RGBA_DXT3:
- blocksize = 16;
- flipblocks = &flip_blocks_dxtc3;
- break;
- case qt3ds::render::NVRenderTextureFormats::RGBA_DXT5:
- blocksize = 16;
- flipblocks = &flip_blocks_dxtc5;
- break;
- default:
- return;
- }
-
- linesize = xblocks * blocksize;
- tmp = (QT3DSI8 *)QT3DS_ALLOC(io->m_Allocator, linesize, "flip_data_vertical compressed");
-
- for (j = 0; j < (yblocks >> 1); j++) {
- top = (DXTColBlock *)(void *)(image + j * linesize);
- bottom = (DXTColBlock *)(void *)(image + (((yblocks - j) - 1) * linesize));
-
- (*flipblocks)(top, xblocks);
- (*flipblocks)(bottom, xblocks);
-
- memcpy(tmp, bottom, linesize);
- memcpy(bottom, top, linesize);
- memcpy(top, tmp, linesize);
- }
-
- // Catch the middle row of blocks if there is one
- // The loop above will skip the middle row
- if (yblocks & 0x01) {
- DXTColBlock *middle = (DXTColBlock *)(void *)(image + (yblocks >> 1) * linesize);
- (*flipblocks)(middle, xblocks);
- }
-
- QT3DS_FREE(io->m_Allocator, tmp);
- } else {
- QT3DSI32 linesize = width * info->bytesPerPixel;
- QT3DSI32 j;
- QT3DSI8 *top;
- QT3DSI8 *bottom;
- QT3DSI8 *tmp;
-
- // much simpler - just compute the line length and swap each row
- tmp = (QT3DSI8 *)QT3DS_ALLOC(io->m_Allocator, linesize, "flip_data_vertical");
- ;
-
- for (j = 0; j < (height >> 1); j++) {
- top = (QT3DSI8 *)(image + j * linesize);
- bottom = (QT3DSI8 *)(image + (((height - j) - 1) * linesize));
-
- memcpy(tmp, bottom, linesize);
- memcpy(bottom, top, linesize);
- memcpy(top, tmp, linesize);
- }
-
- QT3DS_FREE(io->m_Allocator, tmp);
- }
- }
-
- static QT3DSI32 size_image(QT3DSI32 width, QT3DSI32 height, const Qt3DSDDSImage *image)
- {
- if (image->compressed) {
- return ((width + 3) / 4) * ((height + 3) / 4)
- * (image->format == qt3ds::render::NVRenderTextureFormats::RGBA_DXT1 ? 8 : 16);
- } else {
- return width * height * image->bytesPerPixel;
- }
- }
-
- static QT3DSI32 total_image_data_size(Qt3DSDDSImage *image)
- {
- QT3DSI32 i, j, index = 0, size = 0, w, h;
- QT3DSI32 cubeCount = image->cubemap ? 6 : 1;
-
- for (j = 0; j < cubeCount; j++) {
- w = image->width;
- h = image->height;
-
- for (i = 0; i < image->numMipmaps; i++) // account for base plus each mip
- {
- image->size[index] = size_image(w, h, image);
- image->mipwidth[index] = w;
- image->mipheight[index] = h;
- size += image->size[index];
- if (w != 1) {
- w >>= 1;
- }
- if (h != 1) {
- h >>= 1;
- }
-
- index++;
- }
- }
-
- return (size);
- }
-
- void *Qt3DSDDSAllocDataBlock(FreeImageIO *io, Qt3DSDDSImage *image)
- {
- if (image) {
- QT3DSI32 i;
- QT3DSI32 size = total_image_data_size(image);
- image->dataBlock =
- QT3DS_ALLOC(io->m_Allocator, size,
- "Qt3DSDDSAllocDataBlock"); // no need to calloc, as we fill every bit...
- if (image->dataBlock == NULL) {
- return NULL;
- }
-
- image->data[0] = image->dataBlock;
-
- QT3DSI32 planes = image->numMipmaps * (image->cubemap ? 6 : 1);
-
- for (i = 1; i < planes; i++) // account for base plus each mip
- {
- image->data[i] =
- (void *)(((size_t)(image->data[i - 1])) + (size_t)image->size[i - 1]);
- }
-
- return (image->dataBlock); // in case caller wants to sanity check...
- }
- return (NULL);
- }
-
- static FIBITMAP *DoLoadDDS(FreeImageIO *io, IInStream &inStream, QT3DSI32 flipVertical)
- {
- FIBITMAP *dib = NULL;
- DDS_HEADER ddsh;
- QT3DSI8 filecode[4];
- Qt3DSDDSImage *image = NULL;
- bool needsBGRASwap = false;
- ;
- bool isAllreadyFlipped = false;
-
- try {
- // check file code
- inStream.Read(filecode, 4);
- if (memcmp(filecode, "DDS ", 4)) {
- throw "Invalid DDS file";
- }
-
- image = (Qt3DSDDSImage *)QT3DS_ALLOC(io->m_Allocator, sizeof(Qt3DSDDSImage), "DoLoadDDS");
- if (image == NULL) {
- throw "Qt3DSDDSImage allocation failed";
- }
- memset(image, 0, sizeof(Qt3DSDDSImage));
-
- // read in DDS header
- inStream.Read(&ddsh, 1);
-
- // check if image is a cubempap
- if (ddsh.dwCaps2 & DDS_CUBEMAP) {
- const QT3DSI32 allFaces = DDS_CUBEMAP_POSITIVEX | DDS_CUBEMAP_POSITIVEY
- | DDS_CUBEMAP_POSITIVEZ | DDS_CUBEMAP_NEGATIVEX | DDS_CUBEMAP_NEGATIVEY
- | DDS_CUBEMAP_NEGATIVEZ;
-
- if ((ddsh.dwCaps2 & allFaces) != allFaces) {
- throw "Not all cubemap faces defined - not supported";
- }
-
- image->cubemap = 1;
- } else {
- image->cubemap = 0;
- }
-
- // check if image is a volume texture
- if ((ddsh.dwCaps2 & DDS_VOLUME) && (ddsh.dwDepth > 0)) {
- throw "Volume textures not supported";
- }
-
- // allocated the memory for the structure we return
- dib = QT3DS_NEW(io->m_Allocator, SLoadedTexture)(io->m_Allocator);
- if (dib == NULL) {
- throw "DIB allocation failed";
- }
-
- // figure out what the image format is
- if (ddsh.ddspf.dwFlags & DDS_FOURCC) {
- switch (ddsh.ddspf.dwFourCC) {
- case FOURCC_DXT1:
- image->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT1;
- image->components = 3;
- image->compressed = 1;
- image->alpha = 0; // Ugh - for backwards compatibility
- dib->format = qt3ds::render::NVRenderTextureFormats::RGB_DXT1;
- break;
- case FOURCC_DXT3:
- image->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT3;
- image->components = 4;
- image->compressed = 1;
- image->alpha = 1;
- dib->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT3;
- break;
- case FOURCC_DXT5:
- image->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT5;
- image->components = 4;
- image->compressed = 1;
- image->alpha = 1;
- dib->format = qt3ds::render::NVRenderTextureFormats::RGBA_DXT5;
- break;
- default:
- throw "Unsupported FOURCC code";
- }
- } else {
- // Check for a supported pixel format
- if ((ddsh.ddspf.dwRGBBitCount == 32) && (ddsh.ddspf.dwRBitMask == 0x000000FF)
- && (ddsh.ddspf.dwGBitMask == 0x0000FF00)
- && (ddsh.ddspf.dwBBitMask == 0x00FF0000)
- && (ddsh.ddspf.dwABitMask == 0xFF000000)) {
- // We support D3D's A8B8G8R8, which is actually RGBA in linear
- // memory, equivalent to GL's RGBA
- image->format = qt3ds::render::NVRenderTextureFormats::RGBA8;
- image->components = 4;
- image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
- image->bytesPerPixel = 4;
- image->alpha = 1;
- image->compressed = 0;
- dib->format = qt3ds::render::NVRenderTextureFormats::RGBA8;
- } else if ((ddsh.ddspf.dwRGBBitCount == 32) && (ddsh.ddspf.dwRBitMask == 0x00FF0000)
- && (ddsh.ddspf.dwGBitMask == 0x0000FF00)
- && (ddsh.ddspf.dwBBitMask == 0x000000FF)
- && (ddsh.ddspf.dwABitMask == 0xFF000000)) {
- // We support D3D's A8R8G8B8, which is actually BGRA in linear
- // memory, need to be
- image->format = qt3ds::render::NVRenderTextureFormats::RGBA8;
- image->components = 4;
- image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
- image->bytesPerPixel = 4;
- image->alpha = 1;
- image->compressed = 0;
- needsBGRASwap = true;
- dib->format = qt3ds::render::NVRenderTextureFormats::RGBA8;
- } else if ((ddsh.ddspf.dwRGBBitCount == 16) && (ddsh.ddspf.dwRBitMask == 0x0000F800)
- && (ddsh.ddspf.dwGBitMask == 0x000007E0)
- && (ddsh.ddspf.dwBBitMask == 0x0000001F)
- && (ddsh.ddspf.dwABitMask == 0x00000000)) {
- // We support D3D's R5G6B5, which is actually RGB in linear
- // memory. It is equivalent to GL's GL_UNSIGNED_SHORT_5_6_5
- image->format = qt3ds::render::NVRenderTextureFormats::RGB8;
- image->components = 3;
- image->alpha = 0;
- image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU16;
- image->bytesPerPixel = 2;
- image->compressed = 0;
- dib->format = qt3ds::render::NVRenderTextureFormats::RGB8;
- } else if ((ddsh.ddspf.dwRGBBitCount == 8) && (ddsh.ddspf.dwRBitMask == 0x00000000)
- && (ddsh.ddspf.dwGBitMask == 0x00000000)
- && (ddsh.ddspf.dwBBitMask == 0x00000000)
- && (ddsh.ddspf.dwABitMask == 0x000000FF)) {
- // We support D3D's A8
- image->format = qt3ds::render::NVRenderTextureFormats::Alpha8;
- image->components = 1;
- image->alpha = 1;
- image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
- image->bytesPerPixel = 1;
- image->compressed = 0;
- dib->format = qt3ds::render::NVRenderTextureFormats::Alpha8;
- } else if ((ddsh.ddspf.dwRGBBitCount == 8) && (ddsh.ddspf.dwRBitMask == 0x000000FF)
- && (ddsh.ddspf.dwGBitMask == 0x00000000)
- && (ddsh.ddspf.dwBBitMask == 0x00000000)
- && (ddsh.ddspf.dwABitMask == 0x00000000)) {
- // We support D3D's L8 (flagged as 8 bits of red only)
- image->format = qt3ds::render::NVRenderTextureFormats::Luminance8;
- image->components = 1;
- image->alpha = 0;
- image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
- image->bytesPerPixel = 1;
- image->compressed = 0;
- dib->format = qt3ds::render::NVRenderTextureFormats::Luminance8;
- } else if ((ddsh.ddspf.dwRGBBitCount == 16) && (ddsh.ddspf.dwRBitMask == 0x000000FF)
- && (ddsh.ddspf.dwGBitMask == 0x00000000)
- && (ddsh.ddspf.dwBBitMask == 0x00000000)
- && (ddsh.ddspf.dwABitMask == 0x0000FF00)) {
- // We support D3D's A8L8 (flagged as 8 bits of red and 8 bits of alpha)
- image->format = qt3ds::render::NVRenderTextureFormats::LuminanceAlpha8;
- image->components = 2;
- image->alpha = 1;
- image->componentFormat = qt3ds::render::NVRenderComponentTypes::QT3DSU8;
- image->bytesPerPixel = 2;
- image->compressed = 0;
- dib->format = qt3ds::render::NVRenderTextureFormats::LuminanceAlpha8;
- } else {
- throw "not a DXTC or supported RGB(A) format image";
- }
- }
-
- // detect flagging to indicate this texture was stored in a y-inverted fashion
- if (!(ddsh.dwFlags & DDS_LINEARSIZE)) {
- if (ddsh.dwPitchOrLinearSize == DDS_MAGIC_FLIPPED) {
- isAllreadyFlipped = true;
- }
- }
-
- flipVertical = (isAllreadyFlipped != (flipVertical ? true : false)) ? 1 : 0;
-
- // store primary surface width/height/numMipmaps
- image->width = ddsh.dwWidth;
- image->height = ddsh.dwHeight;
- image->numMipmaps = ddsh.dwFlags & DDS_MIPMAPCOUNT ? ddsh.dwMipMapCount : 1;
-
- if (image->numMipmaps > QT3DS_DDS_MAX_MIPMAPS) {
- throw "Too many mipmaps: max 16";
- }
-
- // allocate the meta datablock for all mip storage.
- Qt3DSDDSAllocDataBlock(io, image);
- if (image->dataBlock == NULL) {
- throw "Failed to allocate memory for image data storage";
- }
-
- dib->width = image->width;
- dib->height = image->height;
- dib->dds = image;
-
- QT3DSI32 faces = image->cubemap ? 6 : 1;
-
- QT3DSI32 index = 0;
- for (QT3DSI32 j = 0; j < faces; j++) {
- // load all surfaces for the image
- QT3DSI32 width = image->width;
- QT3DSI32 height = image->height;
-
- for (QT3DSI32 i = 0; i < image->numMipmaps; i++) {
- // Get the size, read in the data.
- inStream.Read(
- NVDataRef<QT3DSU8>((QT3DSU8 *)image->data[index], (QT3DSU32)image->size[index]));
-
- // Flip in Y for OpenGL if needed
- if (flipVertical)
- flip_data_vertical(io, (QT3DSI8 *)image->data[index], width, height, image);
-
- // shrink to next power of 2
- width >>= 1;
- height >>= 1;
-
- if (!width)
- width = 1;
-
- if (!height)
- height = 1;
-
- // make sure DXT isn't <4 on a side...
- if (image->compressed) {
- if (width < 4)
- width = 4;
- if (height < 4)
- height = 4;
- }
-
- index++;
- }
- }
-
- if (needsBGRASwap) {
- QT3DSI32 index = 0;
- QT3DSI32 k;
-
- for (k = 0; k < faces; k++) {
- QT3DSI32 width = image->width;
- QT3DSI32 height = image->height;
-
- for (QT3DSI32 i = 0; i < image->numMipmaps; i++) {
- QT3DSI8 *data = (QT3DSI8 *)(image->data[index]);
- QT3DSI32 pixels = width * height;
- QT3DSI32 j;
-
- for (j = 0; j < pixels; j++) {
- QT3DSI8 temp = data[0];
- data[0] = data[2];
- data[2] = temp;
-
- data += 4;
- }
-
- // shrink to next power of 2
- width >>= 1;
- height >>= 1;
-
- if (!width)
- width = 1;
-
- if (!height)
- height = 1;
-
- index++;
- }
- }
- }
- } catch (const char *message) {
- if (image) {
- if (image->dataBlock)
- QT3DS_FREE(io->m_Allocator, image->dataBlock);
-
- QT3DS_FREE(io->m_Allocator, image);
- }
- if (dib) {
- FreeImage_Unload(dib);
- }
- if (message) {
- FreeImage_OutputMessageProc(s_exception_string, message, io);
- }
- }
-
- return dib;
- }
-
- SLoadedTexture *SLoadedTexture::LoadDDS(IInStream &inStream, QT3DSI32 flipVertical,
- NVFoundationBase &inFnd,
- qt3ds::render::NVRenderContextType renderContextType)
- {
- Q_UNUSED(renderContextType)
- FreeImageIO theIO(inFnd.getAllocator(), inFnd);
- SLoadedTexture *retval = DoLoadDDS(&theIO, inStream, flipVertical);
-
- return retval;
- }
-}
-}