From 2dcc1cf8bdb285134ebdfb592d30a2885409c203 Mon Sep 17 00:00:00 2001 From: Yves Rizoud Date: Tue, 13 Oct 2009 19:07:58 +0000 Subject: [PATCH] [layers] Stats on memory usage in the Stats screen. Tracks the number and total memory size of the pages (bitmaps) used by layers and their backups. Doesn't count housekeeping costs. git-svn-id: svn://pulkomandy.tk/GrafX2/branches/layers@1074 416bcca6-2ee7-4201-b75f-2eb2f807beb1 --- help.c | 11 +++++++++++ pages.c | 24 +++++++++++++++++++----- pages.h | 9 +++++++++ 3 files changed, 39 insertions(+), 5 deletions(-) diff --git a/help.c b/help.c index f5e75e5b..f476b5a3 100644 --- a/help.c +++ b/help.c @@ -45,6 +45,7 @@ #include "input.h" #include "hotkeys.h" #include "errors.h" +#include "pages.h" // Recherche un raccourci clavier: word * Shortcut(word shortcut_number) @@ -637,6 +638,16 @@ void Button_Stats(void) sprintf(buffer,"%u bytes",(unsigned int)freeRam); Print_in_window(114,51,buffer,STATS_DATA_COLOR,MC_Black); + // Used memory + Print_in_window(10,59,"Used memory pages: ",STATS_TITLE_COLOR,MC_Black); + if(Stats_pages_memory > (100LL*1024*1024*1024)) + sprintf(buffer,"%u (%u Gb)",Stats_pages_number, (unsigned int)(Stats_pages_memory/(1024*1024*1024))); + else if(Stats_pages_memory > (100*1024*1024)) + sprintf(buffer,"%u (%u Mb)",Stats_pages_number, (unsigned int)(Stats_pages_memory/(1024*1024))); + else + sprintf(buffer,"%u (%u Kb)",Stats_pages_number, (unsigned int)(Stats_pages_memory/1024)); + Print_in_window(162,59,buffer,STATS_DATA_COLOR,MC_Black); + // Affichage de l'espace disque libre sprintf(buffer,"Free space on %c:",Main_current_directory[0]); Print_in_window(10,67,buffer,STATS_TITLE_COLOR,MC_Black); diff --git a/pages.c b/pages.c index 03199945..c449815f 100644 --- a/pages.c +++ b/pages.c @@ -38,6 +38,11 @@ /// Bitfield which records which layers are backed up in Page 0. static word Last_backed_up_layers=0; +/// Total number of unique bitmaps (layers, animation frames, backups) +long Stats_pages_number=0; +/// Total memory used by bitmaps (layers, animation frames, backups) +long long Stats_pages_memory=0; + /// Allocate and initialize a new page. T_Page * New_page(byte nb_layers) { @@ -79,22 +84,31 @@ byte * New_layer(long pixel_size) short * ptr = malloc(sizeof(short)+pixel_size); if (ptr==NULL) return NULL; + + // Stats + Stats_pages_number++; + Stats_pages_memory+=pixel_size; *ptr = 1; return (byte *)(ptr+1); } /// Free a layer -void Free_layer(byte * layer) +void Free_layer(T_Page * page, byte layer) { - short * ptr = (short *)(layer); - if (layer==NULL) + short * ptr; + if (page->Image[layer]==NULL) return; + ptr = (short *)(page->Image[layer]); if (-- (*(ptr-1))) // Users-- return; else free(ptr-1); + + // Stats + Stats_pages_number--; + Stats_pages_memory-=page->Width * page->Height; } /// Duplicate a layer (new reference) @@ -321,7 +335,7 @@ void Clear_page(T_Page * page) int i; for (i=0; iNb_layers; i++) { - Free_layer(page->Image[i]); + Free_layer(page, i); page->Image[i]=NULL; } page->Width=0; @@ -1019,7 +1033,7 @@ byte Delete_layer(T_List_of_pages *list, byte layer) // and so it will be cleared anyway. // Smart freeing of the pixel data - Free_layer(list->Pages->Image[layer]); + Free_layer(list->Pages, layer); list->Pages->Nb_layers--; // Move around the pointers. This part is going to be tricky when we diff --git a/pages.h b/pages.h index bc451cb5..51c3c7b2 100644 --- a/pages.h +++ b/pages.h @@ -90,4 +90,13 @@ void Update_depth_buffer(void); void Redraw_layered_image(void); void Redraw_current_layer(void); +/// +/// STATISTICS +/// + +/// Total number of unique bitmaps (layers, animation frames, backups) +extern long Stats_pages_number; +/// Total memory used by bitmaps (layers, animation frames, backups) +extern long long Stats_pages_memory; + #endif