Return sum of tile blocks. 0 = error
| 5642 | // Return sum of tile blocks. |
| 5643 | // 0 = error |
| 5644 | static int InitTileOffsets(OffsetData& offset_data, |
| 5645 | const EXRHeader* exr_header, |
| 5646 | const std::vector<int>& num_x_tiles, |
| 5647 | const std::vector<int>& num_y_tiles) { |
| 5648 | int num_tile_blocks = 0; |
| 5649 | offset_data.num_x_levels = static_cast<int>(num_x_tiles.size()); |
| 5650 | offset_data.num_y_levels = static_cast<int>(num_y_tiles.size()); |
| 5651 | switch (exr_header->tile_level_mode) { |
| 5652 | case TINYEXR_TILE_ONE_LEVEL: |
| 5653 | case TINYEXR_TILE_MIPMAP_LEVELS: |
| 5654 | TINYEXR_CHECK_AND_RETURN_C(offset_data.num_x_levels == offset_data.num_y_levels, 0); |
| 5655 | offset_data.offsets.resize(size_t(offset_data.num_x_levels)); |
| 5656 | |
| 5657 | for (unsigned int l = 0; l < offset_data.offsets.size(); ++l) { |
| 5658 | offset_data.offsets[l].resize(size_t(num_y_tiles[l])); |
| 5659 | |
| 5660 | for (unsigned int dy = 0; dy < offset_data.offsets[l].size(); ++dy) { |
| 5661 | offset_data.offsets[l][dy].resize(size_t(num_x_tiles[l])); |
| 5662 | num_tile_blocks += num_x_tiles[l]; |
| 5663 | } |
| 5664 | } |
| 5665 | break; |
| 5666 | |
| 5667 | case TINYEXR_TILE_RIPMAP_LEVELS: |
| 5668 | |
| 5669 | offset_data.offsets.resize(static_cast<size_t>(offset_data.num_x_levels) * static_cast<size_t>(offset_data.num_y_levels)); |
| 5670 | |
| 5671 | for (int ly = 0; ly < offset_data.num_y_levels; ++ly) { |
| 5672 | for (int lx = 0; lx < offset_data.num_x_levels; ++lx) { |
| 5673 | int l = ly * offset_data.num_x_levels + lx; |
| 5674 | offset_data.offsets[size_t(l)].resize(size_t(num_y_tiles[size_t(ly)])); |
| 5675 | |
| 5676 | for (size_t dy = 0; dy < offset_data.offsets[size_t(l)].size(); ++dy) { |
| 5677 | offset_data.offsets[size_t(l)][dy].resize(size_t(num_x_tiles[size_t(lx)])); |
| 5678 | num_tile_blocks += num_x_tiles[size_t(lx)]; |
| 5679 | } |
| 5680 | } |
| 5681 | } |
| 5682 | break; |
| 5683 | |
| 5684 | default: |
| 5685 | return 0; |
| 5686 | } |
| 5687 | return num_tile_blocks; |
| 5688 | } |
| 5689 | |
| 5690 | static bool IsAnyOffsetsAreInvalid(const OffsetData& offset_data) { |
| 5691 | for (unsigned int l = 0; l < offset_data.offsets.size(); ++l) |
no test coverage detected