diff --git a/src/fileformats.c b/src/fileformats.c index 1f8f7405..e07bc5f7 100644 --- a/src/fileformats.c +++ b/src/fileformats.c @@ -2033,49 +2033,88 @@ void Load_ICO(T_IO_Context * context) } else { - T_BMP_Header bmpheader; + byte png_header[8]; entry = images + i; fseek(file, entry->offset, SEEK_SET); - // TODO : detect PNG icons - if (Read_dword_le(file,&(bmpheader.Size_2)) // 40 - && Read_dword_le(file,&(bmpheader.Width)) - && Read_dword_le(file,(dword *)&(bmpheader.Height)) - && Read_word_le(file,&(bmpheader.Planes)) - && Read_word_le(file,&(bmpheader.Nb_bits)) - && Read_dword_le(file,&(bmpheader.Compression)) - && Read_dword_le(file,&(bmpheader.Size_3)) - && Read_dword_le(file,&(bmpheader.XPM)) - && Read_dword_le(file,&(bmpheader.YPM)) - && Read_dword_le(file,&(bmpheader.Nb_Clr)) - && Read_dword_le(file,&(bmpheader.Clr_Imprt)) ) + + // detect PNG icons + // Load header (8 first bytes) + if (!Read_bytes(file,png_header,8)) { - word nb_colors = 0; - if (bmpheader.Nb_Clr != 0) - nb_colors=bmpheader.Nb_Clr; - else - nb_colors=1<bpp > 8)); - if (entry->bpp <= 8) - Load_BMP_Palette(context, file, nb_colors, 0); - if (File_error == 0) - { - Load_BMP_Pixels(context, file, bmpheader.Compression, bmpheader.Nb_bits, (bmpheader.Height < 0) ? 1 : 0, mask); + T_BMP_Header bmpheader; + + fseek(file, -8, SEEK_CUR); // back + // BMP + if (Read_dword_le(file,&(bmpheader.Size_2)) // 40 + && Read_dword_le(file,&(bmpheader.Width)) + && Read_dword_le(file,(dword *)&(bmpheader.Height)) + && Read_word_le(file,&(bmpheader.Planes)) + && Read_word_le(file,&(bmpheader.Nb_bits)) + && Read_dword_le(file,&(bmpheader.Compression)) + && Read_dword_le(file,&(bmpheader.Size_3)) + && Read_dword_le(file,&(bmpheader.XPM)) + && Read_dword_le(file,&(bmpheader.YPM)) + && Read_dword_le(file,&(bmpheader.Nb_Clr)) + && Read_dword_le(file,&(bmpheader.Clr_Imprt)) ) + { + word nb_colors = 0; + if (bmpheader.Nb_Clr != 0) + nb_colors=bmpheader.Nb_Clr; + else + nb_colors=1<bpp > 8)); + if (entry->bpp <= 8) + Load_BMP_Palette(context, file, nb_colors, 0); + else + { + if (bmpheader.Compression == 3) // BI_BITFIELDS + { + if (!Read_dword_le(file,&mask[0]) || + !Read_dword_le(file,&mask[1]) || + !Read_dword_le(file,&mask[2])) + File_error=2; + } + } + if (File_error == 0) + { + Load_BMP_Pixels(context, file, bmpheader.Compression, bmpheader.Nb_bits, (bmpheader.Height < 0) ? 1 : 0, mask); + } + } } } }