From 0bbc0da32442d4e0caad9bf1ef68a4814e0ea05c Mon Sep 17 00:00:00 2001 From: Anakin Date: Thu, 5 Jan 2017 11:31:36 +0100 Subject: [PATCH] rle and 24bit support, need to write direct into image for performance --- QtMeshViewer/Header/tga.h | 139 +++++++++++++++++++++++++ QtMeshViewer/Source/GeometryEngine.cpp | 10 +- QtMeshViewer/Source/MainWindow.cpp | 1 + Release/Msh/texture32R.tga | Bin 262188 -> 177268 bytes 4 files changed, 143 insertions(+), 7 deletions(-) create mode 100644 QtMeshViewer/Header/tga.h diff --git a/QtMeshViewer/Header/tga.h b/QtMeshViewer/Header/tga.h new file mode 100644 index 0000000..957f110 --- /dev/null +++ b/QtMeshViewer/Header/tga.h @@ -0,0 +1,139 @@ +#pragma once +#include +#include +#include + +#include + +QImage loadTga(const char* filePath, bool &success) +{ + QImage img; + if (!img.load(filePath)) + { + + // open the file + std::fstream fsPicture(filePath, std::ios::in | std::ios::binary); + + if (!fsPicture.is_open()) + { + img = QImage(1, 1, QImage::Format_RGB32); + img.fill(Qt::red); + success = false; + return img; + } + + // some variables + std::vector* vui8Pixels; + std::uint32_t ui32BpP; + std::uint32_t ui32Width; + std::uint32_t ui32Height; + + // read in the header + std::uint8_t ui8x18Header[19] = { 0 }; + fsPicture.read(reinterpret_cast(&ui8x18Header), sizeof(ui8x18Header) - 1); + + //get variables + vui8Pixels = new std::vector; + bool bCompressed; + std::uint32_t ui32IDLength; + std::uint32_t ui32PicType; + std::uint32_t ui32PaletteLength; + std::uint32_t ui32Size; + + // extract all information from header + ui32IDLength = ui8x18Header[0]; + ui32PicType = ui8x18Header[2]; + ui32PaletteLength = ui8x18Header[6] * 0x100 + ui8x18Header[5]; + ui32Width = ui8x18Header[13] * 0x100 + ui8x18Header[12]; + ui32Height = ui8x18Header[15] * 0x100 + ui8x18Header[14]; + ui32BpP = ui8x18Header[16]; + + // calculate some more information + ui32Size = ui32Width * ui32Height * ui32BpP / 8; + bCompressed = ui32PicType == 9 || ui32PicType == 10; + vui8Pixels->resize(ui32Size); + + // jump to the data block + fsPicture.seekg(ui32IDLength + ui32PaletteLength, std::ios_base::cur); + + if (ui32PicType == 2 && (ui32BpP == 24 || ui32BpP == 32)) + { + fsPicture.read(reinterpret_cast(vui8Pixels->data()), ui32Size); + } + // else if compressed 24 or 32 bit + else if (ui32PicType == 10 && (ui32BpP == 24 || ui32BpP == 32)) // compressed + { + std::uint8_t tempChunkHeader; + std::uint8_t tempData[5]; + unsigned int tempByteIndex = 0; + + do { + fsPicture.read(reinterpret_cast(&tempChunkHeader), sizeof(tempChunkHeader)); + + if (tempChunkHeader >> 7) // repeat count + { + // just use the first 7 bits + tempChunkHeader = (uint8_t(tempChunkHeader << 1) >> 1); + + fsPicture.read(reinterpret_cast(&tempData), ui32BpP / 8); + + for (int i = 0; i <= tempChunkHeader; i++) + { + vui8Pixels->at(tempByteIndex++) = tempData[0]; + vui8Pixels->at(tempByteIndex++) = tempData[1]; + vui8Pixels->at(tempByteIndex++) = tempData[2]; + if (ui32BpP == 32) vui8Pixels->at(tempByteIndex++) = tempData[3]; + } + } + else // data count + { + // just use the first 7 bits + tempChunkHeader = (uint8_t(tempChunkHeader << 1) >> 1); + + for (int i = 0; i <= tempChunkHeader; i++) + { + fsPicture.read(reinterpret_cast(&tempData), ui32BpP / 8); + + vui8Pixels->at(tempByteIndex++) = tempData[0]; + vui8Pixels->at(tempByteIndex++) = tempData[1]; + vui8Pixels->at(tempByteIndex++) = tempData[2]; + if (ui32BpP == 32) vui8Pixels->at(tempByteIndex++) = tempData[3]; + } + } + } while (tempByteIndex < ui32Size); + } + // not useable format + else + { + fsPicture.close(); + img = QImage(1, 1, QImage::Format_RGB32); + img.fill(Qt::red); + success = false; + return img; + } + + fsPicture.close(); + + img = QImage(ui32Width, ui32Height, QImage::Format_RGB888); + + int pixelSize = ui32BpP == 32 ? 4 : 3; + //TODO: write direct into img + for (unsigned int x = 0; x < ui32Width; x++) + { + for (unsigned int y = 0; y < ui32Height; y++) + { + int valr = vui8Pixels->at(y * ui32Width * pixelSize + x * pixelSize + 2); + int valg = vui8Pixels->at(y * ui32Width * pixelSize + x * pixelSize + 1); + int valb = vui8Pixels->at(y * ui32Width * pixelSize + x * pixelSize); + + QColor value(valr, valg, valb); + img.setPixelColor(x, y, value); + } + } + + img = img.mirrored(); + + } + success = true; + return img; +} diff --git a/QtMeshViewer/Source/GeometryEngine.cpp b/QtMeshViewer/Source/GeometryEngine.cpp index 6420288..49ccbbd 100644 --- a/QtMeshViewer/Source/GeometryEngine.cpp +++ b/QtMeshViewer/Source/GeometryEngine.cpp @@ -2,6 +2,7 @@ #include "..\Header\MshFile.h" #include "..\Header\OglViewerWidget.h" #include "..\Header\MainWindow.h" +#include "..\Header\tga.h" #include @@ -110,13 +111,8 @@ void GeometryEngine::loadFile(const char* filePath) void GeometryEngine::loadTexture(const char* filePath) { - - QImage img; - if (!img.load(filePath)) - { - img = QImage(1, 1, QImage::Format_RGB32); - img.fill(Qt::red); - } + bool loadSuccess; + QImage img = loadTga(filePath, loadSuccess); // Load image to OglTexture QOpenGLTexture* new_texture = new QOpenGLTexture(img.mirrored()); diff --git a/QtMeshViewer/Source/MainWindow.cpp b/QtMeshViewer/Source/MainWindow.cpp index d908ed3..cd5afa6 100644 --- a/QtMeshViewer/Source/MainWindow.cpp +++ b/QtMeshViewer/Source/MainWindow.cpp @@ -5,6 +5,7 @@ #include #include #include +#include "..\Header\FileInterface.h" #define WINDOW_NAME "Mesh Viewer" diff --git a/Release/Msh/texture32R.tga b/Release/Msh/texture32R.tga index b54937f9b5239ba5b79bed1215aa23167254f0ee..6b996ed41427a9ec21f4318c7f29e3118af24046 100644 GIT binary patch delta 25373 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 delta 110820 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