Return sum of tile blocks. 0 = error
| 5721 | // Return sum of tile blocks. |
| 5722 | // 0 = error |
| 5723 | static int InitTileOffsets(OffsetData& offset_data, |
| 5724 | const EXRHeader* exr_header, |
| 5725 | const std::vector<int>& num_x_tiles, |
| 5726 | const std::vector<int>& num_y_tiles) { |
| 5727 | int num_tile_blocks = 0; |
| 5728 | offset_data.num_x_levels = static_cast<int>(num_x_tiles.size()); |
| 5729 | offset_data.num_y_levels = static_cast<int>(num_y_tiles.size()); |
| 5730 | switch (exr_header->tile_level_mode) { |
| 5731 | case TINYEXR_TILE_ONE_LEVEL: |
| 5732 | case TINYEXR_TILE_MIPMAP_LEVELS: |
| 5733 | TINYEXR_CHECK_AND_RETURN_C(offset_data.num_x_levels == offset_data.num_y_levels, 0); |
| 5734 | offset_data.offsets.resize(size_t(offset_data.num_x_levels)); |
| 5735 | |
| 5736 | for (unsigned int l = 0; l < offset_data.offsets.size(); ++l) { |
| 5737 | offset_data.offsets[l].resize(size_t(num_y_tiles[l])); |
| 5738 | |
| 5739 | for (unsigned int dy = 0; dy < offset_data.offsets[l].size(); ++dy) { |
| 5740 | offset_data.offsets[l][dy].resize(size_t(num_x_tiles[l])); |
| 5741 | num_tile_blocks += num_x_tiles[l]; |
| 5742 | } |
| 5743 | } |
| 5744 | break; |
| 5745 | |
| 5746 | case TINYEXR_TILE_RIPMAP_LEVELS: |
| 5747 | |
| 5748 | offset_data.offsets.resize(static_cast<size_t>(offset_data.num_x_levels) * static_cast<size_t>(offset_data.num_y_levels)); |
| 5749 | |
| 5750 | for (int ly = 0; ly < offset_data.num_y_levels; ++ly) { |
| 5751 | for (int lx = 0; lx < offset_data.num_x_levels; ++lx) { |
| 5752 | int l = ly * offset_data.num_x_levels + lx; |
| 5753 | offset_data.offsets[size_t(l)].resize(size_t(num_y_tiles[size_t(ly)])); |
| 5754 | |
| 5755 | for (size_t dy = 0; dy < offset_data.offsets[size_t(l)].size(); ++dy) { |
| 5756 | offset_data.offsets[size_t(l)][dy].resize(size_t(num_x_tiles[size_t(lx)])); |
| 5757 | num_tile_blocks += num_x_tiles[size_t(lx)]; |
| 5758 | } |
| 5759 | } |
| 5760 | } |
| 5761 | break; |
| 5762 | |
| 5763 | default: |
| 5764 | return 0; |
| 5765 | } |
| 5766 | return num_tile_blocks; |
| 5767 | } |
| 5768 | |
| 5769 | static bool IsAnyOffsetsAreInvalid(const OffsetData& offset_data) { |
| 5770 | for (unsigned int l = 0; l < offset_data.offsets.size(); ++l) |
no test coverage detected