Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
#1204 の実装です。
BMPDecoder
を 1 bit 、4 bit 、および 16 bit のビット深度を持つ BMP に対応させ、すべてのビット深度に対応するようにしました。それにあたっていくつかの修正、変更を加えました。
各コミットについて、以下で説明します。
バッファの確保に Array を使うよう変更
従来の実装では、バッファの確保に失敗した際に透明な画像を返すようになっています。
これは、よく使われている失敗時に空の
Image
を返すという仕様と一貫性がなく、また、そもそもstd::malloc()
を使用するのはナンセンスです。そのため、バッファの確保に
Array
を使用するよう変更しました。パレット用領域を色数に合わせて動的確保するよう変更
従来の実装では、8-bit BMP を読み込む際にパレットの色数を 256 色(最大)として領域をスタックに用意し、パレットデータを読み込んでいます。
しかし、実際には
BMPHeader::biClrUsed
の値によってパレットの色数は変化するため、常に 256 色読み込もうとすると、色数が 256 色より少ないときに画像データ領域を誤ってパレットデータとして読んでしまうことになります。そのため、パレット用領域を
BMPHeader::biClrUsed
などの関連するヘッダの値によって決まる色数の分だけArray
動的確保し、指定された分だけ読み込むよう修正しました。BMPHeader::bfOffBits を参照するよう変更
従来の実装では、ヘッダ、パレットデータのすぐ後から画像データを読み込んでいます。
しかし、BMP 画像ファイルではヘッダ、パレットデータの後に追加情報や意味のない領域が挟まることがあります。
実際の画像データの開始位置は
BMPHeader::bfOffBits
により示されます。そのため、ヘッダ、パレットデータを読み込んだ後のファイルの読み込み位置が
BMPHeader::bfOffBits
より小さいとき、BMPHeader::bfOffBits
まで読み込み位置を変更するよう修正しました。1-bit, 4-bit BMP に対応
1-bit, 4-bit BMP に対応しました。
16-bit BMP に対応
16-bit BMP に対応しました。
16-bit BMP は R5G5B5 形式と R5G6B5 形式がありますが、R5G5B5 形式にのみ対応しています。
R5G6B5 形式は従来の実装と同様に以下に示す条件分岐によってはじかれます。
OpenSiv3D/Siv3D/src/Siv3D/ImageFormat/BMP/BMPDecoder.cpp
Lines 93 to 97 in 33ec928
不正なビット深度に対して失敗ログを出すよう変更
不正なビット深度の BMP を読み込んだとき、失敗ログを出力して空の
Image
を返すよう変更しました。このコードに到達した際、既に確保した
Image
が無駄になりますが、滅多にないことなので目をつぶりました。末尾の空白を削除
気になったので、末尾の空白を削除しました。