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:
102
src/pages.c
102
src/pages.c
@@ -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);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user