| 5830 | } |
| 5831 | |
| 5832 | static bool ReconstructTileOffsets(OffsetData& offset_data, |
| 5833 | const EXRHeader* exr_header, |
| 5834 | const unsigned char* head, const unsigned char* marker, const size_t size, |
| 5835 | bool isMultiPartFile, |
| 5836 | bool isDeep) { |
| 5837 | int numXLevels = offset_data.num_x_levels; |
| 5838 | for (unsigned int l = 0; l < offset_data.offsets.size(); ++l) { |
| 5839 | for (unsigned int dy = 0; dy < offset_data.offsets[l].size(); ++dy) { |
| 5840 | for (unsigned int dx = 0; dx < offset_data.offsets[l][dy].size(); ++dx) { |
| 5841 | tinyexr::tinyexr_uint64 tileOffset = tinyexr::tinyexr_uint64(marker - head); |
| 5842 | |
| 5843 | |
| 5844 | if (isMultiPartFile) { |
| 5845 | if ((marker + sizeof(int)) >= (head + size)) { |
| 5846 | return false; |
| 5847 | } |
| 5848 | |
| 5849 | //int partNumber; |
| 5850 | marker += sizeof(int); |
| 5851 | } |
| 5852 | |
| 5853 | if ((marker + 4 * sizeof(int)) >= (head + size)) { |
| 5854 | return false; |
| 5855 | } |
| 5856 | |
| 5857 | int tileX; |
| 5858 | memcpy(&tileX, marker, sizeof(int)); |
| 5859 | tinyexr::swap4(&tileX); |
| 5860 | marker += sizeof(int); |
| 5861 | |
| 5862 | int tileY; |
| 5863 | memcpy(&tileY, marker, sizeof(int)); |
| 5864 | tinyexr::swap4(&tileY); |
| 5865 | marker += sizeof(int); |
| 5866 | |
| 5867 | int levelX; |
| 5868 | memcpy(&levelX, marker, sizeof(int)); |
| 5869 | tinyexr::swap4(&levelX); |
| 5870 | marker += sizeof(int); |
| 5871 | |
| 5872 | int levelY; |
| 5873 | memcpy(&levelY, marker, sizeof(int)); |
| 5874 | tinyexr::swap4(&levelY); |
| 5875 | marker += sizeof(int); |
| 5876 | |
| 5877 | if (isDeep) { |
| 5878 | if ((marker + 2 * sizeof(tinyexr::tinyexr_int64)) >= (head + size)) { |
| 5879 | return false; |
| 5880 | } |
| 5881 | tinyexr::tinyexr_int64 packed_offset_table_size; |
| 5882 | memcpy(&packed_offset_table_size, marker, sizeof(tinyexr::tinyexr_int64)); |
| 5883 | tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64*>(&packed_offset_table_size)); |
| 5884 | marker += sizeof(tinyexr::tinyexr_int64); |
| 5885 | |
| 5886 | tinyexr::tinyexr_int64 packed_sample_size; |
| 5887 | memcpy(&packed_sample_size, marker, sizeof(tinyexr::tinyexr_int64)); |
| 5888 | tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64*>(&packed_sample_size)); |
| 5889 | marker += sizeof(tinyexr::tinyexr_int64); |
no test coverage detected