Fix code to optimize sub-picture saving in GIF code
This commit is contained in:
parent
0f098d8b84
commit
003fbcfc1b
@ -4903,25 +4903,33 @@ void Save_GIF(T_IO_Context * context)
|
|||||||
// find bounding box of changes for Animated GIFs
|
// find bounding box of changes for Animated GIFs
|
||||||
min_X = min_Y = 0xffff;
|
min_X = min_Y = 0xffff;
|
||||||
max_X = max_Y = 0;
|
max_X = max_Y = 0;
|
||||||
temp = LSDB.Backcol;//=context->Transparent_color;
|
|
||||||
for(GIF_pos_Y = 0; GIF_pos_Y < context->Height; GIF_pos_Y++) {
|
for(GIF_pos_Y = 0; GIF_pos_Y < context->Height; GIF_pos_Y++) {
|
||||||
for(GIF_pos_X = 0; GIF_pos_X < context->Width; GIF_pos_X++) {
|
for(GIF_pos_X = 0; GIF_pos_X < context->Width; GIF_pos_X++) {
|
||||||
if (GIF_pos_X >= min_X && GIF_pos_X <= max_X && GIF_pos_Y >= min_Y && GIF_pos_Y <= max_Y)
|
if (GIF_pos_X >= min_X && GIF_pos_X <= max_X && GIF_pos_Y >= min_Y && GIF_pos_Y <= max_Y)
|
||||||
continue; // already in the box
|
continue; // already in the box
|
||||||
// compare Pixel from previous layer or from background depending on disposal method
|
if(disposal_method == DISPOSAL_METHOD_DO_NOT_DISPOSE)
|
||||||
if(disposal_method == DISPOSAL_METHOD_DO_NOT_DISPOSE) {
|
{
|
||||||
|
// if that pixel has same value in previous layer, no need to save it
|
||||||
Set_saving_layer(context, current_layer - 1);
|
Set_saving_layer(context, current_layer - 1);
|
||||||
temp = Get_pixel(context, GIF_pos_X, GIF_pos_Y);
|
temp = Get_pixel(context, GIF_pos_X, GIF_pos_Y);
|
||||||
Set_saving_layer(context, current_layer);
|
Set_saving_layer(context, current_layer);
|
||||||
|
if(temp == Get_pixel(context, GIF_pos_X, GIF_pos_Y))
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (disposal_method == DISPOSAL_METHOD_RESTORE_BGCOLOR
|
||||||
|
|| context->Background_transparent
|
||||||
|
|| Main.backups->Pages->Image_mode != IMAGE_MODE_ANIMATION)
|
||||||
|
{
|
||||||
|
// if that pixel is Backcol, no need to save it
|
||||||
|
if (LSDB.Backcol == Get_pixel(context, GIF_pos_X, GIF_pos_Y))
|
||||||
|
continue;
|
||||||
}
|
}
|
||||||
if(temp != Get_pixel(context, GIF_pos_X, GIF_pos_Y)) {
|
|
||||||
if(GIF_pos_X < min_X) min_X = GIF_pos_X;
|
if(GIF_pos_X < min_X) min_X = GIF_pos_X;
|
||||||
if(GIF_pos_X > max_X) max_X = GIF_pos_X;
|
if(GIF_pos_X > max_X) max_X = GIF_pos_X;
|
||||||
if(GIF_pos_Y < min_Y) min_Y = GIF_pos_Y;
|
if(GIF_pos_Y < min_Y) min_Y = GIF_pos_Y;
|
||||||
if(GIF_pos_Y > max_Y) max_Y = GIF_pos_Y;
|
if(GIF_pos_Y > max_Y) max_Y = GIF_pos_Y;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
|
||||||
if((min_X <= max_X) && (min_Y <= max_Y))
|
if((min_X <= max_X) && (min_Y <= max_Y))
|
||||||
{
|
{
|
||||||
IDB.Pos_X = min_X;
|
IDB.Pos_X = min_X;
|
||||||
@ -4949,6 +4957,9 @@ void Save_GIF(T_IO_Context * context)
|
|||||||
while((int)max >= (1 << IDB.Nb_bits_pixel)) {
|
while((int)max >= (1 << IDB.Nb_bits_pixel)) {
|
||||||
IDB.Nb_bits_pixel++;
|
IDB.Nb_bits_pixel++;
|
||||||
}
|
}
|
||||||
|
GFX2_Log(GFX2_DEBUG, "GIF image #%d %ubits (%u,%u) %ux%u\n",
|
||||||
|
current_layer, IDB.Nb_bits_pixel, IDB.Pos_X, IDB.Pos_Y,
|
||||||
|
IDB.Image_width, IDB.Image_height);
|
||||||
|
|
||||||
// On va écrire un block indicateur d'IDB et l'IDB du fichier
|
// On va écrire un block indicateur d'IDB et l'IDB du fichier
|
||||||
block_identifier=0x2C;
|
block_identifier=0x2C;
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user