Load .ico files containing PNG images
This commit is contained in:
parent
37a5a0a85c
commit
d9ca2e1092
@ -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<<bmpheader.Nb_bits;
|
||||
printf("size=%d width=%d height=%d planes=%d nbbits=%d nb_colors=%d\n", bmpheader.Size_2, bmpheader.Width, bmpheader.Height, bmpheader.Planes, bmpheader.Nb_bits, nb_colors);
|
||||
// bmpheader.Width != entry.width...
|
||||
// Image 16/24/32 bits
|
||||
if (bmpheader.Nb_bits == 16)
|
||||
File_error = 1;
|
||||
}
|
||||
else
|
||||
{
|
||||
// Do we recognize a png file signature ?
|
||||
#ifndef __no_pnglib__
|
||||
if (png_sig_cmp(png_header, 0, 8) == 0)
|
||||
{
|
||||
mask[0] = 0x00007C00;
|
||||
mask[1] = 0x000003E0;
|
||||
mask[2] = 0x0000001F;
|
||||
Load_PNG_Sub(context, file);
|
||||
}
|
||||
#else
|
||||
if (0 = memcmp(png_header, "\x89PNG", 4))
|
||||
{
|
||||
// NO PNG Support
|
||||
Warning("PNG Signature : Compiled without libpng support");
|
||||
File_error = 2;
|
||||
}
|
||||
#endif
|
||||
else
|
||||
{
|
||||
mask[0] = 0x00FF0000;
|
||||
mask[1] = 0x0000FF00;
|
||||
mask[2] = 0x000000FF;
|
||||
}
|
||||
Pre_load(context, bmpheader.Width,bmpheader.Height/2,0/*file_size*/,FORMAT_ICO,PIXEL_SIMPLE,(entry->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<<bmpheader.Nb_bits;
|
||||
// bmpheader.Width != entry.width...
|
||||
// Image 16/24/32 bits
|
||||
if (bmpheader.Nb_bits == 16)
|
||||
{
|
||||
mask[0] = 0x00007C00;
|
||||
mask[1] = 0x000003E0;
|
||||
mask[2] = 0x0000001F;
|
||||
}
|
||||
else
|
||||
{
|
||||
mask[0] = 0x00FF0000;
|
||||
mask[1] = 0x0000FF00;
|
||||
mask[2] = 0x000000FF;
|
||||
}
|
||||
Pre_load(context, bmpheader.Width,bmpheader.Height/2,0/*file_size*/,FORMAT_ICO,PIXEL_SIMPLE,(entry->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);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user