diff --git a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs index f1e93886b5..bb69344796 100644 --- a/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs +++ b/src/ImageSharp/Formats/Bmp/BmpDecoderCore.cs @@ -526,64 +526,57 @@ namespace SixLabors.ImageSharp.Formats.Bmp { this.stream = stream; - try + this.ReadFileHeader(); + this.ReadInfoHeader(); + + // see http://www.drdobbs.com/architecture-and-design/the-bmp-file-format-part-1/184409517 + // If the height is negative, then this is a Windows bitmap whose origin + // is the upper-left corner and not the lower-left. The inverted flag + // indicates a lower-left origin.Our code will be outputting an + // upper-left origin pixel array. + inverted = false; + if (this.infoHeader.Height < 0) { - this.ReadFileHeader(); - this.ReadInfoHeader(); - - // see http://www.drdobbs.com/architecture-and-design/the-bmp-file-format-part-1/184409517 - // If the height is negative, then this is a Windows bitmap whose origin - // is the upper-left corner and not the lower-left.The inverted flag - // indicates a lower-left origin.Our code will be outputting an - // upper-left origin pixel array. - inverted = false; - if (this.infoHeader.Height < 0) - { - inverted = true; - this.infoHeader.Height = -this.infoHeader.Height; - } + inverted = true; + this.infoHeader.Height = -this.infoHeader.Height; + } - int colorMapSize = -1; + int colorMapSize = -1; - if (this.infoHeader.ClrUsed == 0) - { - if (this.infoHeader.BitsPerPixel == 1 || - this.infoHeader.BitsPerPixel == 4 || - this.infoHeader.BitsPerPixel == 8) - { - colorMapSize = (int)Math.Pow(2, this.infoHeader.BitsPerPixel) * 4; - } - } - else + if (this.infoHeader.ClrUsed == 0) + { + if (this.infoHeader.BitsPerPixel == 1 || + this.infoHeader.BitsPerPixel == 4 || + this.infoHeader.BitsPerPixel == 8) { - colorMapSize = this.infoHeader.ClrUsed * 4; + colorMapSize = (int)Math.Pow(2, this.infoHeader.BitsPerPixel) * 4; } + } + else + { + colorMapSize = this.infoHeader.ClrUsed * 4; + } - palette = null; + palette = null; - if (colorMapSize > 0) + if (colorMapSize > 0) + { + // 256 * 4 + if (colorMapSize > 1024) { - // 256 * 4 - if (colorMapSize > 1024) - { - throw new ImageFormatException($"Invalid bmp colormap size '{colorMapSize}'"); - } - - palette = new byte[colorMapSize]; - - this.stream.Read(palette, 0, colorMapSize); + throw new ImageFormatException($"Invalid bmp colormap size '{colorMapSize}'"); } - if (this.infoHeader.Width > int.MaxValue || this.infoHeader.Height > int.MaxValue) - { - throw new ArgumentOutOfRangeException( - $"The input bmp '{this.infoHeader.Width}x{this.infoHeader.Height}' is " - + $"bigger then the max allowed size '{int.MaxValue}x{int.MaxValue}'"); - } + palette = new byte[colorMapSize]; + + this.stream.Read(palette, 0, colorMapSize); } - catch (IndexOutOfRangeException e) + + if (this.infoHeader.Width > int.MaxValue || this.infoHeader.Height > int.MaxValue) { - throw new ImageFormatException("Bitmap does not have a valid format.", e); + throw new ArgumentOutOfRangeException( + $"The input bmp '{this.infoHeader.Width}x{this.infoHeader.Height}' is " + + $"bigger then the max allowed size '{int.MaxValue}x{int.MaxValue}'"); } } }