From f5c58682ca45dc6b596bc73fc6fb45620e3b142e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaakko=20Ker=C3=A4nen?= Date: Wed, 2 Apr 2014 15:45:22 +0300 Subject: [PATCH] Fixed|libgui|Image: Loading a TGA image Swapping red and blue channels not needed. --- doomsday/libgui/src/graphics/image.cpp | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/doomsday/libgui/src/graphics/image.cpp b/doomsday/libgui/src/graphics/image.cpp index 0583ee6057..fa29b6515b 100644 --- a/doomsday/libgui/src/graphics/image.cpp +++ b/doomsday/libgui/src/graphics/image.cpp @@ -254,24 +254,27 @@ static QImage load(Block const &data) pixelSize == 4? QImage::Format_ARGB32 : QImage::Format_RGB888); dbyte *base = img.bits(); + bool const isUpperOrigin = header.flags.testFlag(Header::ScreenOriginUpper); + // RGB can be read line by line. if(header.imageType == Header::RGB) { for(int y = 0; y < header.size.y; y++) { - int inY = (header.flags.testFlag(Header::ScreenOriginUpper)? y : (header.size.y - y - 1)); - + int inY = (isUpperOrigin? y : (header.size.y - y - 1)); ByteRefArray line(base + (inY * header.size.x * pixelSize), header.size.x * pixelSize); input.readPresetSize(line); } } else if(header.imageType == Header::RleRGB) { + img.fill(0); + // RLE packets may cross over to the next line. int x = 0; - int y = (header.flags.testFlag(Header::ScreenOriginUpper)? 0 : (header.size.y - 1)); + int y = (isUpperOrigin? 0 : (header.size.y - 1)); int endY = header.size.y - y - 1; - int stepY = (header.flags.testFlag(Header::ScreenOriginUpper)? 1 : -1); + int stepY = (isUpperOrigin? 1 : -1); while(y != endY && x < header.size.x) { @@ -301,6 +304,8 @@ static QImage load(Block const &data) std::memcpy(base + (x + y * header.size.x) * pixelSize, pixel.constData(), pixelSize); + + // Advance the position. if(++x == header.size.x) { x = 0; @@ -310,8 +315,7 @@ static QImage load(Block const &data) } } - // Pixels were stored in ABGR format. - return img.rgbSwapped(); + return img; } } // namespace tga