MCPcopy Create free account
hub / github.com/OpenTTD/OpenTTD / ReadGRFSpriteOffsets

Function ReadGRFSpriteOffsets

src/spritecache.cpp:558–603  ·  view source on GitHub ↗

* Parse the sprite section of GRFs. * @param container_version Container version of the GRF we're currently processing. */

Source from the content-addressed store, hash-verified

556 * @param container_version Container version of the GRF we're currently processing.
557 */
558void 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/**

Callers 3

LoadNewGRFFileFromFileFunction · 0.85
LoadGrfFileFunction · 0.85
LoadGrfFileIndexedFunction · 0.85

Calls 10

GetContainerVersionMethod · 0.80
ReadDwordMethod · 0.80
GetPosMethod · 0.80
SeekToMethod · 0.80
AnyMethod · 0.80
SkipBytesMethod · 0.80
clearMethod · 0.45
ResetMethod · 0.45
ReadByteMethod · 0.45
SetMethod · 0.45

Tested by

no test coverage detected