* Parse the sprite section of GRFs. * @param container_version Container version of the GRF we're currently processing. */
| 556 | * @param container_version Container version of the GRF we're currently processing. |
| 557 | */ |
| 558 | void ReadGRFSpriteOffsets(SpriteFile &file) |
| 559 | { |
| 560 | _grf_sprite_offsets.clear(); |
| 561 | |
| 562 | if (file.GetContainerVersion() >= 2) { |
| 563 | /* Seek to sprite section of the GRF. */ |
| 564 | size_t data_offset = file.ReadDword(); |
| 565 | size_t old_pos = file.GetPos(); |
| 566 | file.SeekTo(data_offset, SEEK_CUR); |
| 567 | |
| 568 | GrfSpriteOffset offset{}; |
| 569 | |
| 570 | /* Loop over all sprite section entries and store the file |
| 571 | * offset for each newly encountered ID. */ |
| 572 | SpriteID id, prev_id = 0; |
| 573 | while ((id = file.ReadDword()) != 0) { |
| 574 | if (id != prev_id) { |
| 575 | _grf_sprite_offsets[prev_id] = offset; |
| 576 | offset.file_pos = file.GetPos() - 4; |
| 577 | offset.control_flags.Reset(); |
| 578 | } |
| 579 | prev_id = id; |
| 580 | uint length = file.ReadDword(); |
| 581 | if (length > 0) { |
| 582 | SpriteComponents colour{file.ReadByte()}; |
| 583 | length--; |
| 584 | if (length > 0) { |
| 585 | uint8_t zoom = file.ReadByte(); |
| 586 | length--; |
| 587 | if (colour.Any() && zoom == 0) { // ZoomLevel::Normal (normal zoom) |
| 588 | offset.control_flags.Set((colour != SpriteComponent::Palette) ? SpriteCacheCtrlFlag::AllowZoomMin1x32bpp : SpriteCacheCtrlFlag::AllowZoomMin1xPal); |
| 589 | offset.control_flags.Set((colour != SpriteComponent::Palette) ? SpriteCacheCtrlFlag::AllowZoomMin2x32bpp : SpriteCacheCtrlFlag::AllowZoomMin2xPal); |
| 590 | } |
| 591 | if (colour.Any() && zoom == 2) { // ZoomLevel::In2x (2x zoomed in) |
| 592 | offset.control_flags.Set((colour != SpriteComponent::Palette) ? SpriteCacheCtrlFlag::AllowZoomMin2x32bpp : SpriteCacheCtrlFlag::AllowZoomMin2xPal); |
| 593 | } |
| 594 | } |
| 595 | } |
| 596 | file.SkipBytes(length); |
| 597 | } |
| 598 | if (prev_id != 0) _grf_sprite_offsets[prev_id] = offset; |
| 599 | |
| 600 | /* Continue processing the data section. */ |
| 601 | file.SeekTo(old_pos, SEEK_SET); |
| 602 | } |
| 603 | } |
| 604 | |
| 605 | |
| 606 | /** |
no test coverage detected