| @@ -34,9 +34,10 @@ public: | |||
| virtual uint8_t *GetData() const; | |||
| virtual bool RetrieveTiles(Array<ivec2, ivec2>& tiles) | |||
| { | |||
| bool result = m_tiles.Count() > 0; | |||
| tiles += m_tiles; | |||
| m_tiles.Empty(); | |||
| return true; | |||
| return result; | |||
| } | |||
| private: | |||
| @@ -54,33 +55,7 @@ bool ZedImageData::Open(char const *path) | |||
| if (!lol::String(path).EndsWith(".RSC")) | |||
| return false; | |||
| File file; | |||
| file.Open(path, FileAccess::Read, true); | |||
| //Put file in memory | |||
| long file_size = file.GetSize(); | |||
| Array<uint8_t> file_buffer; | |||
| file_buffer.Resize(file_size); | |||
| file.Read((uint8_t*)&file_buffer[0], file_size); | |||
| file.Close(); | |||
| //Get FileCount | |||
| uint32_t file_pos = 0; | |||
| uint16_t file_count = 0; | |||
| file_count = *((uint16_t*)(&file_buffer[file_pos])); | |||
| file_pos += sizeof(uint16_t); | |||
| Array<long int> file_offset; | |||
| file_offset.Resize(file_count); | |||
| //Get all the file offsets | |||
| for (int i = 0; i < file_count; i++) | |||
| { | |||
| file_offset[i] = *((long int*)(&file_buffer[file_pos])); | |||
| file_pos += sizeof(long int); | |||
| } | |||
| file_offset << file_size; | |||
| m_tiles.Reserve(file_count); | |||
| //Compacter definition | |||
| struct CompactSecondary | |||
| { | |||
| CompactSecondary(int32_t size) { m_size = size; } | |||
| @@ -145,6 +120,34 @@ bool ZedImageData::Open(char const *path) | |||
| Array<CompactMain> m_primary; | |||
| }; | |||
| File file; | |||
| file.Open(path, FileAccess::Read, true); | |||
| //Put file in memory | |||
| long file_size = file.GetSize(); | |||
| Array<uint8_t> file_buffer; | |||
| file_buffer.Resize(file_size); | |||
| file.Read((uint8_t*)&file_buffer[0], file_size); | |||
| file.Close(); | |||
| //Get FileCount | |||
| uint32_t file_pos = 0; | |||
| uint16_t file_count = 0; | |||
| file_count = *((uint16_t*)(&file_buffer[file_pos])); | |||
| file_pos += sizeof(uint16_t); | |||
| Array<long int> file_offset; | |||
| file_offset.Resize(file_count); | |||
| //Get all the file offsets | |||
| for (int i = 0; i < file_count; i++) | |||
| { | |||
| file_offset[i] = *((long int*)(&file_buffer[file_pos])); | |||
| file_pos += sizeof(long int); | |||
| } | |||
| file_offset << file_size; | |||
| m_tiles.Reserve(file_count); | |||
| Compacter2d compacter; | |||
| compacter.StepSetup(8, 8, 10); | |||
| @@ -171,45 +174,62 @@ bool ZedImageData::Open(char const *path) | |||
| uint32_t data_length = (file_offset[i+1] - file_offset[i]) - header_length; | |||
| uint32_t data_pos = file_offset[i] + header_length; | |||
| /* Seems useless in the end | |||
| //Retrieve Header & footer | |||
| Array<uint8_t> header_data; | |||
| header_data.Resize(header_length); | |||
| memcpy(&header_data[0], &file_buffer[file_offset[i]], header_length); | |||
| Array<uint8_t> footer_data; | |||
| uint32_t footer_length = lol::min((uint32_t)file_buffer.Count(), data_pos + data_length + header_length) - (data_pos + data_length); | |||
| if (footer_length > 0) | |||
| { | |||
| footer_data.Resize(footer_length); | |||
| memcpy(&footer_data[0], &file_buffer[data_pos + data_length], footer_length); | |||
| } | |||
| */ | |||
| //Prepare buffer and tiles infos | |||
| int32_t convert_pos = file_convert.Count(); | |||
| ivec2 size = ivec2(size_x, size_y); | |||
| compacter.Store(m_tiles.Count(), ivec2(size_x, size_y)); | |||
| m_tiles.Push(ivec2(file_convert.Count(), data_length), ivec2(size_x, size_y)); | |||
| file_convert.Resize(convert_pos + data_length); | |||
| //Retrieve actual datas | |||
| file_pos = data_pos; | |||
| memcpy(&file_convert[convert_pos], &file_buffer[file_pos], data_length); | |||
| file_pos += data_length; | |||
| ivec2 size_16 = size; | |||
| int32_t s_16 = 8; | |||
| while (1) | |||
| //Store size type | |||
| { | |||
| if (size_16.x <= s_16) | |||
| ivec2 size_16 = size; | |||
| int32_t s_16 = 16; | |||
| while (1) | |||
| { | |||
| size_16.x = s_16; | |||
| break; | |||
| if (size_16.x <= s_16) | |||
| { | |||
| size_16.x = s_16; | |||
| break; | |||
| } | |||
| s_16 <<= 1; | |||
| } | |||
| s_16 <<= 1; | |||
| } | |||
| s_16 = 8; | |||
| while (1) | |||
| { | |||
| if (size_16.y <= s_16) | |||
| s_16 = 8; | |||
| while (1) | |||
| { | |||
| size_16.y = s_16; | |||
| break; | |||
| if (size_16.y <= s_16) | |||
| { | |||
| size_16.y = s_16; | |||
| break; | |||
| } | |||
| s_16 <<= 1; | |||
| } | |||
| s_16 <<= 1; | |||
| int j = 0; | |||
| for (; j < available_sizes.Count(); j++) | |||
| if (available_sizes[j] == size_16) | |||
| break; | |||
| if (j >= available_sizes.Count()) | |||
| available_sizes << size_16; | |||
| } | |||
| int j = 0; | |||
| for (; j < available_sizes.Count(); j++) | |||
| if (available_sizes[j] == size_16) | |||
| break; | |||
| if (j >= available_sizes.Count()) | |||
| available_sizes << size_16; | |||
| //Retrieve actual datas | |||
| file_pos = data_pos; | |||
| memcpy(&file_convert[convert_pos], &file_buffer[file_pos], data_length); | |||
| file_pos += data_length; | |||
| } | |||
| int32_t tex_sqrt = (int32_t)lol::sqrt((float)total_size); | |||