From d075ef8861da770f90c32037ef5e8bdac2b0a8a1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Benjamin=20=E2=80=98Touky=E2=80=99=20Huet?= Date: Sat, 31 May 2014 23:06:47 +0000 Subject: [PATCH] tweak --- src/image/codec/zed-image.cpp | 128 ++++++++++++++++++++-------------- 1 file changed, 74 insertions(+), 54 deletions(-) diff --git a/src/image/codec/zed-image.cpp b/src/image/codec/zed-image.cpp index f808e394..7b6b9e22 100644 --- a/src/image/codec/zed-image.cpp +++ b/src/image/codec/zed-image.cpp @@ -34,9 +34,10 @@ public: virtual uint8_t *GetData() const; virtual bool RetrieveTiles(Array& 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 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 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 m_primary; }; + File file; + file.Open(path, FileAccess::Read, true); + + //Put file in memory + long file_size = file.GetSize(); + Array 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 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 header_data; + header_data.Resize(header_length); + memcpy(&header_data[0], &file_buffer[file_offset[i]], header_length); + Array 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);