| 7218 | } |
| 7219 | |
| 7220 | static bool isValidTile(const EXRHeader* exr_header, |
| 7221 | const OffsetData& offset_data, |
| 7222 | int dx, int dy, int lx, int ly) { |
| 7223 | if (lx < 0 || ly < 0 || dx < 0 || dy < 0) return false; |
| 7224 | int num_x_levels = offset_data.num_x_levels; |
| 7225 | int num_y_levels = offset_data.num_y_levels; |
| 7226 | switch (exr_header->tile_level_mode) { |
| 7227 | case TINYEXR_TILE_ONE_LEVEL: |
| 7228 | |
| 7229 | if (lx == 0 && |
| 7230 | ly == 0 && |
| 7231 | offset_data.offsets.size() > 0 && |
| 7232 | offset_data.offsets[0].size() > static_cast<size_t>(dy) && |
| 7233 | offset_data.offsets[0][size_t(dy)].size() > static_cast<size_t>(dx)) { |
| 7234 | return true; |
| 7235 | } |
| 7236 | |
| 7237 | break; |
| 7238 | |
| 7239 | case TINYEXR_TILE_MIPMAP_LEVELS: |
| 7240 | |
| 7241 | if (lx < num_x_levels && |
| 7242 | ly < num_y_levels && |
| 7243 | offset_data.offsets.size() > static_cast<size_t>(lx) && |
| 7244 | offset_data.offsets[size_t(lx)].size() > static_cast<size_t>(dy) && |
| 7245 | offset_data.offsets[size_t(lx)][size_t(dy)].size() > static_cast<size_t>(dx)) { |
| 7246 | return true; |
| 7247 | } |
| 7248 | |
| 7249 | break; |
| 7250 | |
| 7251 | case TINYEXR_TILE_RIPMAP_LEVELS: |
| 7252 | { |
| 7253 | size_t idx = static_cast<size_t>(lx) + static_cast<size_t>(ly)* static_cast<size_t>(num_x_levels); |
| 7254 | if (lx < num_x_levels && |
| 7255 | ly < num_y_levels && |
| 7256 | (offset_data.offsets.size() > idx) && |
| 7257 | offset_data.offsets[idx].size() > static_cast<size_t>(dy) && |
| 7258 | offset_data.offsets[idx][size_t(dy)].size() > static_cast<size_t>(dx)) { |
| 7259 | return true; |
| 7260 | } |
| 7261 | } |
| 7262 | |
| 7263 | break; |
| 7264 | |
| 7265 | default: |
| 7266 | |
| 7267 | return false; |
| 7268 | } |
| 7269 | |
| 7270 | return false; |
| 7271 | } |
| 7272 | |
| 7273 | static bool ReconstructTileOffsets(OffsetData& offset_data, |
| 7274 | const EXRHeader* exr_header, |
no outgoing calls
no test coverage detected