Changeset 546


Ignore:
Timestamp:
Apr 28, 2011, 1:56:23 AM (6 years ago)
Author:
Sam Hocevar
Message:

imlib: implement spec_directory::FullyLoad? to force loading all
assets into memory.

Location:
abuse/trunk/src/imlib
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • abuse/trunk/src/imlib/specs.cpp

    r544 r546  
    563563}
    564564
    565 void spec_entry::print()
    566 {
    567   printf("%15s%25s%8ld%8ld\n",spec_types[type],name,size,offset);
     565void spec_directory::FullyLoad(bFILE *fp)
     566{
     567    for (int i = 0; i < total; i++)
     568    {
     569        spec_entry *se = entries[i];
     570        if (se->data)
     571            free(data);
     572
     573        se->data = malloc(se->size);
     574        fp->seek(se->offset, SEEK_SET);
     575        fp->read(se->data, se->size);
     576    }
     577}
     578
     579spec_entry::spec_entry(uint8_t spec_type, char const *object_name,
     580                       char const *link_filename,
     581                       unsigned long data_size, unsigned long data_offset)
     582{
     583    type = spec_type;
     584    name = strdup(object_name);
     585    data = NULL;
     586    size = data_size;
     587    offset = data_offset;
     588}
     589
     590spec_entry::~spec_entry()
     591{
     592    free(name);
     593    free(data);
     594}
     595
     596void spec_entry::Print()
     597{
     598    printf("%15s%25s%8ld%8ld\n", spec_types[type], name, size, offset);
    568599}
    569600
    570601void spec_directory::calc_offsets()
    571602{
    572   spec_entry **e;
    573   int i;
    574   long o=SPEC_SIG_SIZE+2;
    575   if (total)
    576   {
    577     for (i=0,e=entries; i<total; i++,e++)          // calculate the size of directory info
    578     {
    579       o+=1+1+strlen((*e)->name)+1 +1 +8;
    580     }
    581 
    582     for (i=0,e=entries; i<total; i++,e++)          // calculate offset for each entry
    583     {
    584       (*e)->offset=o;
    585       o+=(*e)->size;
    586     }
    587   }
     603    size_t o = SPEC_SIG_SIZE + 2;
     604
     605    // calculate the size of directory info
     606    for (int i = 0; i < total; i++)
     607        o += 1 + 1 + strlen(entries[i]->name) + 1 + 1 + 8;
     608
     609    // calculate offset for each entry
     610    for (int i = 0; i < total; i++)
     611    {
     612        entries[i]->offset = o;
     613        o += entries[i]->size;
     614    }
    588615}
    589616
     
    653680  printf("[   Entry type   ][   Entry name   ][  Size  ][ Offset ]\n");
    654681  for (i=0,se=entries; i<total; i++,se++)
    655     (*se)->print();
     682    (*se)->Print();
    656683}
    657684
  • abuse/trunk/src/imlib/specs.h

    r540 r546  
    158158class spec_entry
    159159{
     160public:
     161    spec_entry(uint8_t spec_type, char const *object_name,
     162               char const *link_filename,
     163               unsigned long data_size, unsigned long data_offset);
     164    ~spec_entry();
     165
     166    void Print();
     167
     168    char *name;
     169    void *data;
     170    unsigned long size, offset;
     171    uint8_t type;
     172};
     173
     174
     175class spec_directory
     176{
    160177public :
    161   char *name;
    162   unsigned long size,offset;
    163   unsigned char type;
    164 
    165   spec_entry(unsigned char spec_type,
    166              char const *object_name,
    167              char const *link_filename,
    168              unsigned long data_size,
    169              unsigned long data_offset)
    170   { type = spec_type;
    171     name = strdup(object_name);
    172     size = data_size;
    173     offset = data_offset;
    174   }
    175   void print();
    176   ~spec_entry() { if (name) free(name); }
    177 } ;
    178 
    179 
    180 class spec_directory
    181 {
    182 public :
    183   void startup(bFILE *fp);
    184 
    185   int total;
    186   spec_entry **entries;
    187   void *data;
    188   long size;
     178    spec_directory(FILE *fp);
     179    spec_directory(bFILE *fp);
     180    spec_directory();
     181    ~spec_directory();
     182
     183    void startup(bFILE *fp);
     184    void FullyLoad(bFILE *fp);
     185
    189186//  spec_directory(char *filename);  ; ; not allowed anymore, user must construct file first!
    190   spec_directory(FILE *fp);
    191   spec_directory(bFILE *fp);
    192   spec_directory();
    193187  spec_entry *find(char const *name);
    194188  spec_entry *find(char const *name, int type);
     
    206200  void print();
    207201  void delete_entries();   // if the directory was created by hand instead of by file
    208   ~spec_directory();
    209 } ;
     202
     203    int total;
     204    spec_entry **entries;
     205    void *data;
     206    size_t size;
     207};
    210208
    211209/*jFILE *add_directory_entry(char *filename,
Note: See TracChangeset for help on using the changeset viewer.