| 5751 | } |
| 5752 | |
| 5753 | static bool ReconstructTileOffsets(OffsetData& offset_data, |
| 5754 | const EXRHeader* exr_header, |
| 5755 | const unsigned char* head, const unsigned char* marker, const size_t size, |
| 5756 | bool isMultiPartFile, |
| 5757 | bool isDeep) { |
| 5758 | int numXLevels = offset_data.num_x_levels; |
| 5759 | for (unsigned int l = 0; l < offset_data.offsets.size(); ++l) { |
| 5760 | for (unsigned int dy = 0; dy < offset_data.offsets[l].size(); ++dy) { |
| 5761 | for (unsigned int dx = 0; dx < offset_data.offsets[l][dy].size(); ++dx) { |
| 5762 | tinyexr::tinyexr_uint64 tileOffset = tinyexr::tinyexr_uint64(marker - head); |
| 5763 | |
| 5764 | |
| 5765 | if (isMultiPartFile) { |
| 5766 | if ((marker + sizeof(int)) >= (head + size)) { |
| 5767 | return false; |
| 5768 | } |
| 5769 | |
| 5770 | //int partNumber; |
| 5771 | marker += sizeof(int); |
| 5772 | } |
| 5773 | |
| 5774 | if ((marker + 4 * sizeof(int)) >= (head + size)) { |
| 5775 | return false; |
| 5776 | } |
| 5777 | |
| 5778 | int tileX; |
| 5779 | memcpy(&tileX, marker, sizeof(int)); |
| 5780 | tinyexr::swap4(&tileX); |
| 5781 | marker += sizeof(int); |
| 5782 | |
| 5783 | int tileY; |
| 5784 | memcpy(&tileY, marker, sizeof(int)); |
| 5785 | tinyexr::swap4(&tileY); |
| 5786 | marker += sizeof(int); |
| 5787 | |
| 5788 | int levelX; |
| 5789 | memcpy(&levelX, marker, sizeof(int)); |
| 5790 | tinyexr::swap4(&levelX); |
| 5791 | marker += sizeof(int); |
| 5792 | |
| 5793 | int levelY; |
| 5794 | memcpy(&levelY, marker, sizeof(int)); |
| 5795 | tinyexr::swap4(&levelY); |
| 5796 | marker += sizeof(int); |
| 5797 | |
| 5798 | if (isDeep) { |
| 5799 | if ((marker + 2 * sizeof(tinyexr::tinyexr_int64)) >= (head + size)) { |
| 5800 | return false; |
| 5801 | } |
| 5802 | tinyexr::tinyexr_int64 packed_offset_table_size; |
| 5803 | memcpy(&packed_offset_table_size, marker, sizeof(tinyexr::tinyexr_int64)); |
| 5804 | tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64*>(&packed_offset_table_size)); |
| 5805 | marker += sizeof(tinyexr::tinyexr_int64); |
| 5806 | |
| 5807 | tinyexr::tinyexr_int64 packed_sample_size; |
| 5808 | memcpy(&packed_sample_size, marker, sizeof(tinyexr::tinyexr_int64)); |
| 5809 | tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64*>(&packed_sample_size)); |
| 5810 | marker += sizeof(tinyexr::tinyexr_int64); |
no test coverage detected