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
|
else
|
||||||
{
|
{
|
||||||
T_BMP_Header bmpheader;
|
byte png_header[8];
|
||||||
|
|
||||||
entry = images + i;
|
entry = images + i;
|
||||||
fseek(file, entry->offset, SEEK_SET);
|
fseek(file, entry->offset, SEEK_SET);
|
||||||
// TODO : detect PNG icons
|
|
||||||
if (Read_dword_le(file,&(bmpheader.Size_2)) // 40
|
// detect PNG icons
|
||||||
&& Read_dword_le(file,&(bmpheader.Width))
|
// Load header (8 first bytes)
|
||||||
&& Read_dword_le(file,(dword *)&(bmpheader.Height))
|
if (!Read_bytes(file,png_header,8))
|
||||||
&& 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;
|
File_error = 1;
|
||||||
if (bmpheader.Nb_Clr != 0)
|
}
|
||||||
nb_colors=bmpheader.Nb_Clr;
|
else
|
||||||
else
|
{
|
||||||
nb_colors=1<<bmpheader.Nb_bits;
|
// Do we recognize a png file signature ?
|
||||||
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);
|
#ifndef __no_pnglib__
|
||||||
// bmpheader.Width != entry.width...
|
if (png_sig_cmp(png_header, 0, 8) == 0)
|
||||||
// Image 16/24/32 bits
|
|
||||||
if (bmpheader.Nb_bits == 16)
|
|
||||||
{
|
{
|
||||||
mask[0] = 0x00007C00;
|
Load_PNG_Sub(context, file);
|
||||||
mask[1] = 0x000003E0;
|
|
||||||
mask[2] = 0x0000001F;
|
|
||||||
}
|
}
|
||||||
|
#else
|
||||||
|
if (0 = memcmp(png_header, "\x89PNG", 4))
|
||||||
|
{
|
||||||
|
// NO PNG Support
|
||||||
|
Warning("PNG Signature : Compiled without libpng support");
|
||||||
|
File_error = 2;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
mask[0] = 0x00FF0000;
|
T_BMP_Header bmpheader;
|
||||||
mask[1] = 0x0000FF00;
|
|
||||||
mask[2] = 0x000000FF;
|
fseek(file, -8, SEEK_CUR); // back
|
||||||
}
|
// BMP
|
||||||
Pre_load(context, bmpheader.Width,bmpheader.Height/2,0/*file_size*/,FORMAT_ICO,PIXEL_SIMPLE,(entry->bpp > 8));
|
if (Read_dword_le(file,&(bmpheader.Size_2)) // 40
|
||||||
if (entry->bpp <= 8)
|
&& Read_dword_le(file,&(bmpheader.Width))
|
||||||
Load_BMP_Palette(context, file, nb_colors, 0);
|
&& Read_dword_le(file,(dword *)&(bmpheader.Height))
|
||||||
if (File_error == 0)
|
&& Read_word_le(file,&(bmpheader.Planes))
|
||||||
{
|
&& Read_word_le(file,&(bmpheader.Nb_bits))
|
||||||
Load_BMP_Pixels(context, file, bmpheader.Compression, bmpheader.Nb_bits, (bmpheader.Height < 0) ? 1 : 0, mask);
|
&& 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