Parse EXR version header using Reader class
| 10383 | |
| 10384 | // Parse EXR version header using Reader class |
| 10385 | static int ParseEXRVersionWithReader(EXRVersion *version, tinyexr::Reader& reader) { |
| 10386 | if (version == NULL) { |
| 10387 | return TINYEXR_ERROR_INVALID_ARGUMENT; |
| 10388 | } |
| 10389 | |
| 10390 | if (reader.length() < tinyexr::kEXRVersionSize) { |
| 10391 | reader.add_error("Insufficient data size for EXR version header"); |
| 10392 | return TINYEXR_ERROR_INVALID_DATA; |
| 10393 | } |
| 10394 | |
| 10395 | // Check magic number: 0x76, 0x2f, 0x31, 0x01 |
| 10396 | uint8_t header[4]; |
| 10397 | if (!reader.read(4, header)) { |
| 10398 | return TINYEXR_ERROR_INVALID_DATA; |
| 10399 | } |
| 10400 | |
| 10401 | const uint8_t expected_header[] = {0x76, 0x2f, 0x31, 0x01}; |
| 10402 | if (header[0] != expected_header[0] || header[1] != expected_header[1] || |
| 10403 | header[2] != expected_header[2] || header[3] != expected_header[3]) { |
| 10404 | reader.add_error("Invalid EXR magic number"); |
| 10405 | return TINYEXR_ERROR_INVALID_MAGIC_NUMBER; |
| 10406 | } |
| 10407 | |
| 10408 | // Parse version byte (must be 2) |
| 10409 | uint8_t version_byte; |
| 10410 | if (!reader.read1(&version_byte)) { |
| 10411 | return TINYEXR_ERROR_INVALID_DATA; |
| 10412 | } |
| 10413 | |
| 10414 | if (version_byte != 2) { |
| 10415 | reader.add_error("Invalid EXR version"); |
| 10416 | return TINYEXR_ERROR_INVALID_EXR_VERSION; |
| 10417 | } |
| 10418 | |
| 10419 | version->version = 2; |
| 10420 | |
| 10421 | // Parse flags byte |
| 10422 | uint8_t flags; |
| 10423 | if (!reader.read1(&flags)) { |
| 10424 | return TINYEXR_ERROR_INVALID_DATA; |
| 10425 | } |
| 10426 | |
| 10427 | version->tiled = (flags & 0x2) ? true : false; // 9th bit |
| 10428 | version->long_name = (flags & 0x4) ? true : false; // 10th bit |
| 10429 | version->non_image = (flags & 0x8) ? true : false; // 11th bit (deep image) |
| 10430 | version->multipart = (flags & 0x10) ? true : false; // 12th bit |
| 10431 | |
| 10432 | // Skip remaining 2 bytes to complete the 8-byte version header |
| 10433 | uint8_t dummy[2]; |
| 10434 | if (!reader.read(2, dummy)) { |
| 10435 | return TINYEXR_ERROR_INVALID_DATA; |
| 10436 | } |
| 10437 | |
| 10438 | return TINYEXR_SUCCESS; |
| 10439 | } |
| 10440 | |
| 10441 | } // anonymous namespace |
| 10442 |
no test coverage detected