| 5777 | } |
| 5778 | |
| 5779 | static bool isValidTile(const EXRHeader* exr_header, |
| 5780 | const OffsetData& offset_data, |
| 5781 | int dx, int dy, int lx, int ly) { |
| 5782 | if (lx < 0 || ly < 0 || dx < 0 || dy < 0) return false; |
| 5783 | int num_x_levels = offset_data.num_x_levels; |
| 5784 | int num_y_levels = offset_data.num_y_levels; |
| 5785 | switch (exr_header->tile_level_mode) { |
| 5786 | case TINYEXR_TILE_ONE_LEVEL: |
| 5787 | |
| 5788 | if (lx == 0 && |
| 5789 | ly == 0 && |
| 5790 | offset_data.offsets.size() > 0 && |
| 5791 | offset_data.offsets[0].size() > static_cast<size_t>(dy) && |
| 5792 | offset_data.offsets[0][size_t(dy)].size() > static_cast<size_t>(dx)) { |
| 5793 | return true; |
| 5794 | } |
| 5795 | |
| 5796 | break; |
| 5797 | |
| 5798 | case TINYEXR_TILE_MIPMAP_LEVELS: |
| 5799 | |
| 5800 | if (lx < num_x_levels && |
| 5801 | ly < num_y_levels && |
| 5802 | offset_data.offsets.size() > static_cast<size_t>(lx) && |
| 5803 | offset_data.offsets[size_t(lx)].size() > static_cast<size_t>(dy) && |
| 5804 | offset_data.offsets[size_t(lx)][size_t(dy)].size() > static_cast<size_t>(dx)) { |
| 5805 | return true; |
| 5806 | } |
| 5807 | |
| 5808 | break; |
| 5809 | |
| 5810 | case TINYEXR_TILE_RIPMAP_LEVELS: |
| 5811 | { |
| 5812 | size_t idx = static_cast<size_t>(lx) + static_cast<size_t>(ly)* static_cast<size_t>(num_x_levels); |
| 5813 | if (lx < num_x_levels && |
| 5814 | ly < num_y_levels && |
| 5815 | (offset_data.offsets.size() > idx) && |
| 5816 | offset_data.offsets[idx].size() > static_cast<size_t>(dy) && |
| 5817 | offset_data.offsets[idx][size_t(dy)].size() > static_cast<size_t>(dx)) { |
| 5818 | return true; |
| 5819 | } |
| 5820 | } |
| 5821 | |
| 5822 | break; |
| 5823 | |
| 5824 | default: |
| 5825 | |
| 5826 | return false; |
| 5827 | } |
| 5828 | |
| 5829 | return false; |
| 5830 | } |
| 5831 | |
| 5832 | static bool ReconstructTileOffsets(OffsetData& offset_data, |
| 5833 | const EXRHeader* exr_header, |
no test coverage detected