Browse Source

Fix off by one error in mipmap data size counting. Image code cleanup. Closes #1072.

Lasse Öörni 10 years ago
parent
commit
bd6845d50e
1 changed files with 15 additions and 14 deletions
  1. 15 14
      Source/Urho3D/Resource/Image.cpp

+ 15 - 14
Source/Urho3D/Resource/Image.cpp

@@ -371,7 +371,7 @@ bool Image::BeginLoad(Deserializer& source)
             unsigned x = ddsd.dwWidth_ / 2;
             unsigned x = ddsd.dwWidth_ / 2;
             unsigned y = ddsd.dwHeight_ / 2;
             unsigned y = ddsd.dwHeight_ / 2;
             unsigned z = ddsd.dwDepth_ / 2;
             unsigned z = ddsd.dwDepth_ / 2;
-            for (unsigned level = ddsd.dwMipMapCount_; level > 0; x /= 2, y /= 2, z /= 2, level -= 1)
+            for (unsigned level = ddsd.dwMipMapCount_; level > 1; x /= 2, y /= 2, z /= 2, --level)
             {
             {
                 blocksWide = (Max(x, 1) + 3) / 4;
                 blocksWide = (Max(x, 1) + 3) / 4;
                 blocksHeight = (Max(y, 1) + 3) / 4;
                 blocksHeight = (Max(y, 1) + 3) / 4;
@@ -385,7 +385,7 @@ bool Image::BeginLoad(Deserializer& source)
             unsigned x = ddsd.dwWidth_ / 2;
             unsigned x = ddsd.dwWidth_ / 2;
             unsigned y = ddsd.dwHeight_ / 2;
             unsigned y = ddsd.dwHeight_ / 2;
             unsigned z = ddsd.dwDepth_ / 2;
             unsigned z = ddsd.dwDepth_ / 2;
-            for (unsigned level = ddsd.dwMipMapCount_; level > 0; x /= 2, y /= 2, z /= 2, level -= 1)
+            for (unsigned level = ddsd.dwMipMapCount_; level > 1; x /= 2, y /= 2, z /= 2, --level)
                 dataSize += (ddsd.ddpfPixelFormat_.dwRGBBitCount_ / 8) * Max(x, 1) * Max(y, 1) * Max(z, 1);
                 dataSize += (ddsd.ddpfPixelFormat_.dwRGBBitCount_ / 8) * Max(x, 1) * Max(y, 1) * Max(z, 1);
         }
         }
 
 
@@ -428,23 +428,24 @@ bool Image::BeginLoad(Deserializer& source)
         {
         {
             URHO3D_PROFILE(ConvertDDSToRGBA);
             URHO3D_PROFILE(ConvertDDSToRGBA);
 
 
-            SharedPtr<Image> currentImage(this);
-            while (currentImage.NotNull())
+            currentImage = this;
+
+            while (currentImage)
             {
             {
                 unsigned sourcePixelByteSize = ddsd.ddpfPixelFormat_.dwRGBBitCount_ >> 3;
                 unsigned sourcePixelByteSize = ddsd.ddpfPixelFormat_.dwRGBBitCount_ >> 3;
                 unsigned numPixels = dataSize / sourcePixelByteSize;
                 unsigned numPixels = dataSize / sourcePixelByteSize;
 
 
 #define ADJUSTSHIFT(mask, l, r) \
 #define ADJUSTSHIFT(mask, l, r) \
                 if (mask && mask >= 0x100) \
                 if (mask && mask >= 0x100) \
-                                { \
-                                                    while ((mask >> r) >= 0x100) \
-                        ++r; \
-                                } \
-                        else if (mask && mask < 0x80) \
-                                { \
-                                                    while ((mask << l) < 0x80) \
-                        ++l; \
-                                }
+                { \
+                    while ((mask >> r) >= 0x100) \
+                    ++r; \
+                } \
+                else if (mask && mask < 0x80) \
+                { \
+                    while ((mask << l) < 0x80) \
+                    ++l; \
+                }
 
 
                 unsigned rShiftL = 0, gShiftL = 0, bShiftL = 0, aShiftL = 0;
                 unsigned rShiftL = 0, gShiftL = 0, bShiftL = 0, aShiftL = 0;
                 unsigned rShiftR = 0, gShiftR = 0, bShiftR = 0, aShiftR = 0;
                 unsigned rShiftR = 0, gShiftR = 0, bShiftR = 0, aShiftR = 0;
@@ -458,7 +459,6 @@ bool Image::BeginLoad(Deserializer& source)
                 ADJUSTSHIFT(aMask, aShiftL, aShiftR)
                 ADJUSTSHIFT(aMask, aShiftL, aShiftR)
                 
                 
                 SharedArrayPtr<unsigned char> rgbaData(new unsigned char[numPixels * 4]);
                 SharedArrayPtr<unsigned char> rgbaData(new unsigned char[numPixels * 4]);
-                SetMemoryUse(numPixels * 4);
 
 
                 switch (sourcePixelByteSize)
                 switch (sourcePixelByteSize)
                 {
                 {
@@ -514,6 +514,7 @@ bool Image::BeginLoad(Deserializer& source)
 
 
                 // Replace with converted data
                 // Replace with converted data
                 currentImage->data_ = rgbaData;
                 currentImage->data_ = rgbaData;
+                currentImage->SetMemoryUse(numPixels * 4);
                 currentImage = currentImage->GetNextSibling();
                 currentImage = currentImage->GetNextSibling();
             }
             }
         }
         }