]> git.saurik.com Git - wxWidgets.git/blobdiff - src/common/imagbmp.cpp
Update version to 2.9.4 in version.bkl too and rebake everything.
[wxWidgets.git] / src / common / imagbmp.cpp
index 71dd36d635106cad5d41ba522f54e9787dd016b6..f3c7f8c0407e52159932787bdc8a69a2972227e0 100644 (file)
@@ -533,6 +533,14 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height,
 
     wxON_BLOCK_EXIT1(&BMPPalette::Free, cmap);
 
+    bool isUpsideDown = true;
+
+    if (height < 0)
+    {
+        isUpsideDown = false;
+        height = -height;
+    }
+
     // destroy existing here instead of:
     image->Destroy();
     image->Create(width, height);
@@ -702,9 +710,10 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height,
     // this case (see #10915)
     bool hasValidAlpha = false;
 
-    /* BMPs are stored upside down */
-    for ( int line = (height - 1); line >= 0; line-- )
+    for ( int row = 0; row < height; row++ )
     {
+        int line = isUpsideDown ? height - 1 - row : row;
+
         int linepos = 0;
         for ( int column = 0; column < width ; )
         {
@@ -734,21 +743,24 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height,
                         {
                             if ( aByte == 0 )
                             {
-                                if ( column > 0 )
-                                    column = width;
+                                // end of scanline marker
+                                column = width;
+                                row--;
                             }
                             else if ( aByte == 1 )
                             {
+                                // end of RLE data marker, stop decoding
                                 column = width;
-                                line = -1;
+                                row = height;
                             }
                             else if ( aByte == 2 )
                             {
+                                // delta marker, move in image
                                 aByte = stream.GetC();
                                 column += aByte;
                                 linepos = column * bpp / 4;
                                 aByte = stream.GetC();
-                                line -= aByte; // upside down
+                                row += aByte; // upside down
                             }
                             else
                             {
@@ -817,20 +829,24 @@ bool wxBMPHandler::DoLoadDib(wxImage * image, int width, int height,
                         {
                             if ( aByte == 0 )
                             {
-                                /* column = width; */
+                                // end of scanline marker
+                                column = width;
+                                row--;
                             }
                             else if ( aByte == 1 )
                             {
+                                // end of RLE data marker, stop decoding
                                 column = width;
-                                line = -1;
+                                row = height;
                             }
                             else if ( aByte == 2 )
                             {
+                                // delta marker, move in image
                                 aByte = stream.GetC();
                                 column += aByte;
                                 linepos = column * bpp / 8;
                                 aByte = stream.GetC();
-                                line += aByte;
+                                row -= aByte;
                             }
                             else
                             {
@@ -1335,7 +1351,7 @@ bool wxICOHandler::SaveFile(wxImage *image,
 bool wxICOHandler::LoadFile(wxImage *image, wxInputStream& stream,
                             bool verbose, int index)
 {
-    if (stream.SeekI(0) == wxInvalidOffset)
+    if ( stream.IsSeekable() && stream.SeekI(0) == wxInvalidOffset )
     {
         return false;
     }
@@ -1430,7 +1446,7 @@ int wxICOHandler::DoGetImageCount(wxInputStream& stream)
 {
     // It's ok to modify the stream position in this function.
 
-    if (stream.SeekI(0) == wxInvalidOffset)
+    if ( stream.IsSeekable() && stream.SeekI(0) == wxInvalidOffset )
     {
         return 0;
     }
@@ -1505,7 +1521,7 @@ static bool CanReadICOOrCUR(wxInputStream *stream, wxUint16 resourceType)
 {
     // It's ok to modify the stream position in this function.
 
-    if ( stream->SeekI(0) == wxInvalidOffset)
+    if ( stream->IsSeekable() && stream->SeekI(0) == wxInvalidOffset )
     {
         return false;
     }