Re-integrated anim in trunk, fixing the 999-layer limit at the same time

git-svn-id: svn://pulkomandy.tk/GrafX2/trunk@1841 416bcca6-2ee7-4201-b75f-2eb2f807beb1
This commit is contained in:
Yves Rizoud
2011-10-19 23:35:56 +00:00
parent 775ee56ed0
commit 8fb16e7089
28 changed files with 753 additions and 174 deletions

View File

@@ -57,16 +57,19 @@ long Stats_pages_number=0;
long long Stats_pages_memory=0;
/// Allocate and initialize a new page.
T_Page * New_page(byte nb_layers)
T_Page * New_page(int nb_layers)
{
T_Page * page;
page = (T_Page *)malloc(sizeof(T_Page)+nb_layers*sizeof(byte *));
page = (T_Page *)malloc(sizeof(T_Page)+nb_layers*sizeof(T_Image));
if (page!=NULL)
{
int i;
for (i=0; i<nb_layers; i++)
page->Image[i]=NULL;
{
page->Image[i].Pixels=NULL;
page->Image[i].Duration=1;
}
page->Width=0;
page->Height=0;
memset(page->Palette,0,sizeof(T_Palette));
@@ -110,13 +113,13 @@ byte * New_layer(long pixel_size)
}
/// Free a layer
void Free_layer(T_Page * page, byte layer)
void Free_layer(T_Page * page, int layer)
{
short * ptr;
if (page->Image[layer]==NULL)
if (page->Image[layer].Pixels==NULL)
return;
ptr = (short *)(page->Image[layer]);
ptr = (short *)(page->Image[layer].Pixels);
if (-- (*(ptr-1))) // Users--
return;
else {
@@ -189,7 +192,7 @@ void Download_infos_page_main(T_Page * page)
}
//Update_buffers( page->Width, page->Height);
//memcpy(Main_screen, page->Image[Main_current_layer], page->Width*page->Height);
//memcpy(Main_screen, page->Image[Main_current_layer].Pixels, page->Width*page->Height);
}
@@ -206,13 +209,13 @@ void Redraw_layered_image(void)
int i;
for (i=0; i< Main_image_width*Main_image_height; i++)
{
layer = *(Main_backups->Pages->Image[4]+i);
Main_visible_image.Image[i]=*(Main_backups->Pages->Image[layer]+i);
layer = *(Main_backups->Pages->Image[4].Pixels+i);
Main_visible_image.Image[i]=*(Main_backups->Pages->Image[layer].Pixels+i);
}
// Copy it to the depth buffer
memcpy(Main_visible_image_depth_buffer.Image,
Main_backups->Pages->Image[4],
Main_backups->Pages->Image[4].Pixels,
Main_image_width*Main_image_height);
// Next
@@ -226,7 +229,7 @@ void Redraw_layered_image(void)
{
// Copy it in Main_visible_image
memcpy(Main_visible_image.Image,
Main_backups->Pages->Image[layer],
Main_backups->Pages->Image[layer].Pixels,
Main_image_width*Main_image_height);
// Initialize the depth buffer
@@ -248,7 +251,7 @@ void Redraw_layered_image(void)
int i;
for (i=0; i<Main_image_width*Main_image_height; i++)
{
byte color = *(Main_backups->Pages->Image[layer]+i);
byte color = *(Main_backups->Pages->Image[layer].Pixels+i);
if (color != Main_backups->Pages->Transparent_color) // transparent color
{
*(Main_visible_image.Image+i) = color;
@@ -299,7 +302,7 @@ void Update_depth_buffer(void)
int i;
for (i=0; i<Main_image_width*Main_image_height; i++)
{
byte color = *(Main_backups->Pages->Image[layer]+i);
byte color = *(Main_backups->Pages->Image[layer].Pixels+i);
if (color != Main_backups->Pages->Transparent_color) // transparent color
{
*(Main_visible_image_depth_buffer.Image+i) = layer;
@@ -323,7 +326,7 @@ void Redraw_spare_image(void)
{
// Copy it in Spare_visible_image
memcpy(Spare_visible_image.Image,
Spare_backups->Pages->Image[layer],
Spare_backups->Pages->Image[layer].Pixels,
Spare_image_width*Spare_image_height);
// No depth buffer in the spare
@@ -344,7 +347,7 @@ void Redraw_spare_image(void)
int i;
for (i=0; i<Spare_image_width*Spare_image_height; i++)
{
byte color = *(Spare_backups->Pages->Image[layer]+i);
byte color = *(Spare_backups->Pages->Image[layer].Pixels+i);
if (color != Spare_backups->Pages->Transparent_color) // transparent color
{
*(Spare_visible_image.Image+i) = color;
@@ -366,14 +369,14 @@ void Redraw_current_layer(void)
byte depth = *(Main_visible_image_depth_buffer.Image+i);
if (depth<=Main_current_layer)
{
byte color = *(Main_backups->Pages->Image[Main_current_layer]+i);
byte color = *(Main_backups->Pages->Image[Main_current_layer].Pixels+i);
if (color != Main_backups->Pages->Transparent_color) // transparent color
{
*(Main_visible_image.Image+i) = color;
}
else
{
*(Main_visible_image.Image+i) = *(Main_backups->Pages->Image[depth]+i);
*(Main_visible_image.Image+i) = *(Main_backups->Pages->Image[depth].Pixels+i);
}
}
}
@@ -385,7 +388,7 @@ void Upload_infos_page_main(T_Page * page)
{
if (page!=NULL)
{
//page->Image[Main_current_layer]=Main_screen;
//page->Image[Main_current_layer].Pixels=Main_screen;
page->Width=Main_image_width;
page->Height=Main_image_height;
memcpy(page->Palette,Main_palette,sizeof(T_Palette));
@@ -409,7 +412,7 @@ void Upload_infos_page_spare(T_Page * page)
{
if (page!=NULL)
{
//page->Image[Spare_current_layer]=Spare_screen;
//page->Image[Spare_current_layer].Pixels=Spare_screen;
page->Width=Spare_image_width;
page->Height=Spare_image_height;
memcpy(page->Palette,Spare_palette,sizeof(T_Palette));
@@ -423,9 +426,9 @@ void Update_FX_feedback(byte with_feedback)
{
if (with_feedback)
FX_feedback_screen=Main_backups->Pages->Image[Main_current_layer];
FX_feedback_screen=Main_backups->Pages->Image[Main_current_layer].Pixels;
else
FX_feedback_screen=Main_backups->Pages->Next->Image[Main_current_layer];
FX_feedback_screen=Main_backups->Pages->Next->Image[Main_current_layer].Pixels;
}
void Clear_page(T_Page * page)
@@ -435,7 +438,8 @@ void Clear_page(T_Page * page)
for (i=0; i<page->Nb_layers; i++)
{
Free_layer(page, i);
page->Image[i]=NULL;
page->Image[i].Pixels=NULL;
page->Image[i].Duration=1;
}
// Free_gradient() : This data is reference-counted
@@ -621,9 +625,10 @@ int Create_new_page(T_Page * new_page, T_List_of_pages * list, dword layer_mask)
for (i=0; i<new_page->Nb_layers; i++)
{
if ((1<<i) & layer_mask)
new_page->Image[i]=New_layer(new_page->Height*new_page->Width);
new_page->Image[i].Pixels=New_layer(new_page->Height*new_page->Width);
else
new_page->Image[i]=Dup_layer(list->Pages->Image[i]);
new_page->Image[i].Pixels=Dup_layer(list->Pages->Image[i].Pixels);
new_page->Image[i].Duration=list->Pages->Image[i].Duration;
}
}
@@ -669,8 +674,8 @@ void Update_screen_targets(void)
Main_screen=Main_visible_image.Image;
Screen_backup=Main_visible_image_backup.Image;
#else
Main_screen=Main_backups->Pages->Image[Main_current_layer];
Screen_backup=Main_backups->Pages->Next->Image[Main_current_layer];
Main_screen=Main_backups->Pages->Image[Main_current_layer].Pixels;
Screen_backup=Main_backups->Pages->Next->Image[Main_current_layer].Pixels;
#endif
}
@@ -762,10 +767,10 @@ int Init_all_backup_lists(int width,int height)
for (i=0; i<Main_backups->Pages->Nb_layers; i++)
{
Main_backups->Pages->Image[i]=New_layer(width*height);
if (! Main_backups->Pages->Image[i])
Main_backups->Pages->Image[i].Pixels=New_layer(width*height);
if (! Main_backups->Pages->Image[i].Pixels)
return 0;
memset(Main_backups->Pages->Image[i], 0, width*height);
memset(Main_backups->Pages->Image[i].Pixels, 0, width*height);
}
#ifndef NOLAYERS
Main_visible_image.Width = 0;
@@ -811,10 +816,10 @@ int Init_all_backup_lists(int width,int height)
// Spare
for (i=0; i<NB_LAYERS; i++)
{
Spare_backups->Pages->Image[i]=New_layer(width*height);
if (! Spare_backups->Pages->Image[i])
Spare_backups->Pages->Image[i].Pixels=New_layer(width*height);
if (! Spare_backups->Pages->Image[i].Pixels)
return 0;
memset(Spare_backups->Pages->Image[i], 0, width*height);
memset(Spare_backups->Pages->Image[i].Pixels, 0, width*height);
}
//memset(Spare_screen,0,Spare_image_width*Spare_image_height);
@@ -833,7 +838,7 @@ void Set_number_of_backups(int nb_backups)
// (nb_backups = Nombre de backups, sans compter les pages courantes)
}
int Backup_new_image(byte layers,int width,int height)
int Backup_new_image(int layers,int width,int height)
{
// Retourne 1 si une nouvelle page est disponible et 0 sinon
T_Page * new_page;
@@ -900,7 +905,7 @@ int Backup_with_new_dimensions(int width,int height)
// Fill with transparent color
for (i=0; i<Main_backups->Pages->Nb_layers;i++)
{
memset(Main_backups->Pages->Image[i], Main_backups->Pages->Transparent_color, width*height);
memset(Main_backups->Pages->Image[i].Pixels, Main_backups->Pages->Transparent_color, width*height);
}
Update_buffers(width, height);
@@ -959,10 +964,10 @@ int Backup_in_place(int width,int height)
{
// Replace layers
Free_layer(Main_backups->Pages,i);
Main_backups->Pages->Image[i]=new_layer[i];
Main_backups->Pages->Image[i].Pixels=new_layer[i];
// Fill with transparency
memset(Main_backups->Pages->Image[i], Main_backups->Pages->Transparent_color, width*height);
memset(Main_backups->Pages->Image[i].Pixels, Main_backups->Pages->Transparent_color, width*height);
}
Main_backups->Pages->Width=width;
@@ -1009,7 +1014,7 @@ int Backup_and_resize_the_spare(int width,int height)
T_Page * new_page;
int return_code=0;
byte nb_layers;
int nb_layers;
nb_layers=Spare_backups->Pages->Nb_layers;
// On crée un descripteur pour la nouvelle page de brouillon
@@ -1032,7 +1037,7 @@ int Backup_and_resize_the_spare(int width,int height)
for (i=0; i<nb_layers;i++)
{
memset(Spare_backups->Pages->Image[i], Spare_backups->Pages->Transparent_color, width*height);
memset(Spare_backups->Pages->Image[i].Pixels, Spare_backups->Pages->Transparent_color, width*height);
}
// Update_buffers(width, height); // Not for spare
@@ -1088,8 +1093,8 @@ void Backup_layers(dword layer_mask)
for (i=0; i<Main_backups->Pages->Nb_layers;i++)
{
if ((1<<i) & layer_mask)
memcpy(Main_backups->Pages->Image[i],
Main_backups->Pages->Next->Image[i],
memcpy(Main_backups->Pages->Image[i].Pixels,
Main_backups->Pages->Next->Image[i].Pixels,
Main_image_width*Main_image_height);
}
// Light up the 'has unsaved changes' indicator
@@ -1122,8 +1127,8 @@ void Backup_the_spare(dword layer_mask)
for (i=0; i<Spare_backups->Pages->Nb_layers;i++)
{
if ((1<<i) & layer_mask)
memcpy(Spare_backups->Pages->Image[i],
Spare_backups->Pages->Next->Image[i],
memcpy(Spare_backups->Pages->Image[i].Pixels,
Spare_backups->Pages->Next->Image[i].Pixels,
Spare_image_width*Spare_image_height);
}
// Light up the 'has unsaved changes' indicator
@@ -1277,7 +1282,7 @@ void End_of_modification(void)
}
/// Add a new layer to latest page of a list. Returns 0 on success.
byte Add_layer(T_List_of_pages *list, byte layer)
byte Add_layer(T_List_of_pages *list, int layer)
{
T_Page * source_page;
T_Page * new_page;
@@ -1301,7 +1306,7 @@ byte Add_layer(T_List_of_pages *list, byte layer)
return 1;
}
// Re-allocate the page itself, with room for one more pointer
new_page = realloc(source_page, sizeof(T_Page)+(list->Pages->Nb_layers+1)*sizeof(byte *));
new_page = realloc(source_page, sizeof(T_Page)+(list->Pages->Nb_layers+1)*sizeof(T_Image));
if (!new_page)
{
Error(0);
@@ -1322,7 +1327,8 @@ byte Add_layer(T_List_of_pages *list, byte layer)
{
new_page->Image[i]=new_page->Image[i-1];
}
new_page->Image[layer]=new_image;
new_page->Image[layer].Pixels=new_image;
new_page->Image[layer].Duration=1;
// Fill with transparency, initially
memset(new_image, Main_backups->Pages->Transparent_color, list->Pages->Height*list->Pages->Width); // transparent color
@@ -1359,7 +1365,7 @@ byte Add_layer(T_List_of_pages *list, byte layer)
}
/// Delete a layer from the latest page of a list. Returns 0 on success.
byte Delete_layer(T_List_of_pages *list, byte layer)
byte Delete_layer(T_List_of_pages *list, int layer)
{
T_Page * page;
int i;
@@ -1432,9 +1438,9 @@ byte Merge_layer()
int i;
for (i=0; i<Main_image_width*Main_image_height; i++)
{
byte color = *(Main_backups->Pages->Image[Main_current_layer]+i);
byte color = *(Main_backups->Pages->Image[Main_current_layer].Pixels+i);
if (color != Main_backups->Pages->Transparent_color) // transparent color
*(Main_backups->Pages->Image[Main_current_layer-1]+i) = color;
*(Main_backups->Pages->Image[Main_current_layer-1].Pixels+i) = color;
}
return Delete_layer(Main_backups,Main_current_layer);
}