Load_INFO() right colors for 2nd image of NewIcons
This commit is contained in:
parent
d57c6dd4ba
commit
856ba45839
@ -2624,16 +2624,22 @@ void Load_INFO(T_IO_Context * context)
|
|||||||
}
|
}
|
||||||
if (File_error == 0 && header.ToolTypes)
|
if (File_error == 0 && header.ToolTypes)
|
||||||
{
|
{
|
||||||
|
int i;
|
||||||
int current_img = -1;
|
int current_img = -1;
|
||||||
int width = 0;
|
int width = 0;
|
||||||
int height = 0;
|
int height = 0;
|
||||||
int color_count;
|
int color_count;
|
||||||
|
int palette_color_count = 0; // used colors in global palette
|
||||||
int bpp = 0;
|
int bpp = 0;
|
||||||
|
byte palette_conv[256]; // to translate sub icon specific palette to global palette
|
||||||
|
|
||||||
dword count;
|
dword count;
|
||||||
char * ToolType;
|
char * ToolType;
|
||||||
if (Read_dword_be(file, &count))
|
if (Read_dword_be(file, &count))
|
||||||
{
|
{
|
||||||
|
for (i = 0; i < 256; i++)
|
||||||
|
palette_conv[i] = (byte)i;
|
||||||
|
|
||||||
while(count > 0)
|
while(count > 0)
|
||||||
{
|
{
|
||||||
ToolType = Read_INFO_String(file);
|
ToolType = Read_INFO_String(file);
|
||||||
@ -2644,13 +2650,13 @@ void Load_INFO(T_IO_Context * context)
|
|||||||
// NewIcons
|
// NewIcons
|
||||||
if (strlen(ToolType) > 4 && ToolType[0] == 'I' && ToolType[1] == 'M' && ToolType[3] == '=')
|
if (strlen(ToolType) > 4 && ToolType[0] == 'I' && ToolType[1] == 'M' && ToolType[3] == '=')
|
||||||
{
|
{
|
||||||
byte * p;
|
const byte * p;
|
||||||
int img_index = ToolType[2] - '0';
|
int img_index = ToolType[2] - '0';
|
||||||
p = (byte *)ToolType + 4;
|
p = (byte *)ToolType + 4;
|
||||||
if (img_index != current_img)
|
if (img_index != current_img)
|
||||||
{
|
{
|
||||||
// image info + palette
|
// image info + palette
|
||||||
byte * palette;
|
T_Components * palette;
|
||||||
int palette_len;
|
int palette_len;
|
||||||
|
|
||||||
current_img = img_index;
|
current_img = img_index;
|
||||||
@ -2668,12 +2674,40 @@ void Load_INFO(T_IO_Context * context)
|
|||||||
color_count = *p++ - 0x21;
|
color_count = *p++ - 0x21;
|
||||||
color_count = (color_count << 6) + *p++ - 0x21;
|
color_count = (color_count << 6) + *p++ - 0x21;
|
||||||
for (bpp = 1; color_count > (1 << bpp); bpp++) { }
|
for (bpp = 1; color_count > (1 << bpp); bpp++) { }
|
||||||
palette = Decode_NewIcons(p, 8, &palette_len);
|
palette = (T_Components *)Decode_NewIcons(p, 8, &palette_len);
|
||||||
if (palette)
|
if (palette)
|
||||||
{
|
{
|
||||||
if (Config.Clear_palette && img_index == 1)
|
if (img_index == 1)
|
||||||
memset(context->Palette,0,sizeof(T_Palette));
|
{ // Set palette
|
||||||
memcpy(context->Palette, palette, palette_len);
|
if (Config.Clear_palette)
|
||||||
|
memset(context->Palette,0,sizeof(T_Palette));
|
||||||
|
memcpy(context->Palette, palette, palette_len);
|
||||||
|
palette_color_count = color_count;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
// merge palette with the existing one
|
||||||
|
for (i = 0; i < color_count; i++)
|
||||||
|
{
|
||||||
|
int j;
|
||||||
|
for (j = 0; j < palette_color_count; j++)
|
||||||
|
{
|
||||||
|
if (0 == memcmp(context->Palette + j, palette + i, sizeof(T_Components)))
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
if (j == palette_color_count)
|
||||||
|
{
|
||||||
|
if (palette_color_count < 256)
|
||||||
|
{ // Add color to palette
|
||||||
|
memcpy(context->Palette + palette_color_count, palette + i, sizeof(T_Components));
|
||||||
|
palette_color_count++;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
Warning("Too much colors in new icons");
|
||||||
|
}
|
||||||
|
palette_conv[i] = (byte)j;
|
||||||
|
}
|
||||||
|
}
|
||||||
free(palette);
|
free(palette);
|
||||||
}
|
}
|
||||||
if (img_index == 1)
|
if (img_index == 1)
|
||||||
@ -2698,10 +2732,9 @@ void Load_INFO(T_IO_Context * context)
|
|||||||
pixels = Decode_NewIcons(p, bpp, &pixel_count);
|
pixels = Decode_NewIcons(p, bpp, &pixel_count);
|
||||||
if (pixels)
|
if (pixels)
|
||||||
{
|
{
|
||||||
int i;
|
|
||||||
for (i = 0; i < pixel_count; i++)
|
for (i = 0; i < pixel_count; i++)
|
||||||
{
|
{
|
||||||
Set_pixel(context, x_pos++, y_pos, pixels[i]);
|
Set_pixel(context, x_pos++, y_pos, palette_conv[pixels[i]]);
|
||||||
if (x_pos >= width)
|
if (x_pos >= width)
|
||||||
{
|
{
|
||||||
x_pos = 0;
|
x_pos = 0;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user