diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 266e4e577c..e6dd49ffb8 100644 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -454,6 +454,7 @@ add_files( spritecache.cpp spritecache.h spritecache_internal.h + spritecache_type.h station.cpp station_base.h station_cmd.cpp diff --git a/src/spritecache.cpp b/src/spritecache.cpp index ee36794ce4..4387a79a93 100644 --- a/src/spritecache.cpp +++ b/src/spritecache.cpp @@ -535,7 +535,7 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty struct GrfSpriteOffset { size_t file_pos; - uint8_t control_flags; + SpriteCacheCtrlFlags control_flags{}; }; /** Map from sprite numbers to position in the GRF file. */ @@ -565,7 +565,7 @@ void ReadGRFSpriteOffsets(SpriteFile &file) size_t old_pos = file.GetPos(); file.SeekTo(data_offset, SEEK_CUR); - GrfSpriteOffset offset = { 0, 0 }; + GrfSpriteOffset offset{0}; /* Loop over all sprite section entries and store the file * offset for each newly encountered ID. */ @@ -574,7 +574,6 @@ void ReadGRFSpriteOffsets(SpriteFile &file) if (id != prev_id) { _grf_sprite_offsets[prev_id] = offset; offset.file_pos = file.GetPos() - 4; - offset.control_flags = 0; } prev_id = id; uint length = file.ReadDword(); @@ -585,11 +584,11 @@ void ReadGRFSpriteOffsets(SpriteFile &file) uint8_t zoom = file.ReadByte(); length--; if (colour.Any() && zoom == 0) { // ZoomLevel::Normal (normal zoom) - SetBit(offset.control_flags, (colour != SpriteComponent::Palette) ? SCCF_ALLOW_ZOOM_MIN_1X_32BPP : SCCF_ALLOW_ZOOM_MIN_1X_PAL); - SetBit(offset.control_flags, (colour != SpriteComponent::Palette) ? SCCF_ALLOW_ZOOM_MIN_2X_32BPP : SCCF_ALLOW_ZOOM_MIN_2X_PAL); + offset.control_flags.Set((colour != SpriteComponent::Palette) ? SpriteCacheCtrlFlag::AllowZoomMin1x32bpp : SpriteCacheCtrlFlag::AllowZoomMin1xPal); + offset.control_flags.Set((colour != SpriteComponent::Palette) ? SpriteCacheCtrlFlag::AllowZoomMin2x32bpp : SpriteCacheCtrlFlag::AllowZoomMin2xPal); } if (colour.Any() && zoom == 2) { // ZoomLevel::In2x (2x zoomed in) - SetBit(offset.control_flags, (colour != SpriteComponent::Palette) ? SCCF_ALLOW_ZOOM_MIN_2X_32BPP : SCCF_ALLOW_ZOOM_MIN_2X_PAL); + offset.control_flags.Set((colour != SpriteComponent::Palette) ? SpriteCacheCtrlFlag::AllowZoomMin2x32bpp : SpriteCacheCtrlFlag::AllowZoomMin2xPal); } } } @@ -621,7 +620,7 @@ bool LoadNextSprite(SpriteID load_index, SpriteFile &file, uint file_sprite_id) uint8_t grf_type = file.ReadByte(); SpriteType type; - uint8_t control_flags = 0; + SpriteCacheCtrlFlags control_flags; if (grf_type == 0xFF) { /* Some NewGRF files have "empty" pseudo-sprites which are 1 * byte long. Catch these so the sprites won't be displayed. */ diff --git a/src/spritecache.h b/src/spritecache.h index 388e2a64c2..4106622c1c 100644 --- a/src/spritecache.h +++ b/src/spritecache.h @@ -11,24 +11,9 @@ #define SPRITECACHE_H #include "gfx_type.h" +#include "spritecache_type.h" #include "spriteloader/spriteloader.hpp" -/** Data structure describing a sprite. */ -struct Sprite { - uint16_t height; ///< Height of the sprite. - uint16_t width; ///< Width of the sprite. - int16_t x_offs; ///< Number of pixels to shift the sprite to the right. - int16_t y_offs; ///< Number of pixels to shift the sprite downwards. - std::byte data[]; ///< Sprite data. -}; - -enum SpriteCacheCtrlFlags : uint8_t { - SCCF_ALLOW_ZOOM_MIN_1X_PAL = 0, ///< Allow use of sprite min zoom setting at 1x in palette mode. - SCCF_ALLOW_ZOOM_MIN_1X_32BPP = 1, ///< Allow use of sprite min zoom setting at 1x in 32bpp mode. - SCCF_ALLOW_ZOOM_MIN_2X_PAL = 2, ///< Allow use of sprite min zoom setting at 2x in palette mode. - SCCF_ALLOW_ZOOM_MIN_2X_32BPP = 3, ///< Allow use of sprite min zoom setting at 2x in 32bpp mode. -}; - extern uint _sprite_cache_size; /** SpriteAllocator that allocates memory via a unique_ptr array. */ diff --git a/src/spritecache_internal.h b/src/spritecache_internal.h index a003bd3a1c..5d7b02e615 100644 --- a/src/spritecache_internal.h +++ b/src/spritecache_internal.h @@ -12,6 +12,7 @@ #include "core/math_func.hpp" #include "gfx_type.h" +#include "spritecache_type.h" #include "spriteloader/spriteloader.hpp" #include "table/sprites.h" @@ -27,7 +28,7 @@ struct SpriteCache { uint32_t lru = 0; SpriteType type = SpriteType::Invalid; ///< In some cases a single sprite is misused by two NewGRFs. Once as real sprite and once as recolour sprite. If the recolour sprite gets into the cache it might be drawn as real sprite which causes enormous trouble. bool warned = false; ///< True iff the user has been warned about incorrect use of this sprite - uint8_t control_flags = 0; ///< Control flags, see SpriteCacheCtrlFlags + SpriteCacheCtrlFlags control_flags{}; ///< Control flags, see SpriteCacheCtrlFlags void ClearSpriteData(); }; diff --git a/src/spritecache_type.h b/src/spritecache_type.h new file mode 100644 index 0000000000..a6ffbbc6a1 --- /dev/null +++ b/src/spritecache_type.h @@ -0,0 +1,33 @@ +/* + * This file is part of OpenTTD. + * OpenTTD is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation, version 2. + * OpenTTD is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. + * See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with OpenTTD. If not, see . + */ + +/** @file spritecache_type.h Types related to the sprite cache. */ + +#ifndef SPRITECACHE_TYPE_H +#define SPRITECACHE_TYPE_H + +#include "core/enum_type.hpp" + +/** Data structure describing a sprite. */ +struct Sprite { + uint16_t height; ///< Height of the sprite. + uint16_t width; ///< Width of the sprite. + int16_t x_offs; ///< Number of pixels to shift the sprite to the right. + int16_t y_offs; ///< Number of pixels to shift the sprite downwards. + std::byte data[]; ///< Sprite data. +}; + +enum class SpriteCacheCtrlFlag : uint8_t { + AllowZoomMin1xPal, ///< Allow use of sprite min zoom setting at 1x in palette mode. + AllowZoomMin1x32bpp, ///< Allow use of sprite min zoom setting at 1x in 32bpp mode. + AllowZoomMin2xPal, ///< Allow use of sprite min zoom setting at 2x in palette mode. + AllowZoomMin2x32bpp, ///< Allow use of sprite min zoom setting at 2x in 32bpp mode. +}; + +using SpriteCacheCtrlFlags = EnumBitSet; + +#endif /* SPRITECACHE_TYPE_H */ diff --git a/src/spriteloader/grf.cpp b/src/spriteloader/grf.cpp index 57cb86a1a3..121a4c4700 100644 --- a/src/spriteloader/grf.cpp +++ b/src/spriteloader/grf.cpp @@ -256,7 +256,7 @@ static ZoomLevels LoadSpriteV1(SpriteLoader::SpriteCollection &sprite, SpriteFil return {}; } -static ZoomLevels LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, uint8_t control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) +static ZoomLevels LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, SpriteCacheCtrlFlags control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) { static const ZoomLevel zoom_lvl_map[6] = {ZoomLevel::Normal, ZoomLevel::In4x, ZoomLevel::In2x, ZoomLevel::Out2x, ZoomLevel::Out4x, ZoomLevel::Out8x}; @@ -295,11 +295,11 @@ static ZoomLevels LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFil is_wanted_zoom_lvl = true; ZoomLevel zoom_min = sprite_type == SpriteType::Font ? ZoomLevel::Min : _settings_client.gui.sprite_zoom_min; if (zoom_min >= ZoomLevel::In2x && - HasBit(control_flags, load_32bpp ? SCCF_ALLOW_ZOOM_MIN_2X_32BPP : SCCF_ALLOW_ZOOM_MIN_2X_PAL) && zoom_lvl < ZoomLevel::In2x) { + control_flags.Test(load_32bpp ? SpriteCacheCtrlFlag::AllowZoomMin2x32bpp : SpriteCacheCtrlFlag::AllowZoomMin2xPal) && zoom_lvl < ZoomLevel::In2x) { is_wanted_zoom_lvl = false; } if (zoom_min >= ZoomLevel::Normal && - HasBit(control_flags, load_32bpp ? SCCF_ALLOW_ZOOM_MIN_1X_32BPP : SCCF_ALLOW_ZOOM_MIN_1X_PAL) && zoom_lvl < ZoomLevel::Normal) { + control_flags.Test(load_32bpp ? SpriteCacheCtrlFlag::AllowZoomMin1x32bpp : SpriteCacheCtrlFlag::AllowZoomMin1xPal) && zoom_lvl < ZoomLevel::Normal) { is_wanted_zoom_lvl = false; } } else { @@ -359,7 +359,7 @@ static ZoomLevels LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFil return loaded_sprites; } -ZoomLevels SpriteLoaderGrf::LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, uint8_t control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) +ZoomLevels SpriteLoaderGrf::LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, SpriteCacheCtrlFlags control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) { if (this->container_ver >= 2) { return LoadSpriteV2(sprite, file, file_pos, sprite_type, load_32bpp, control_flags, avail_8bpp, avail_32bpp); diff --git a/src/spriteloader/grf.hpp b/src/spriteloader/grf.hpp index 2050a909eb..5721aaf9db 100644 --- a/src/spriteloader/grf.hpp +++ b/src/spriteloader/grf.hpp @@ -17,7 +17,7 @@ class SpriteLoaderGrf : public SpriteLoader { uint8_t container_ver; public: SpriteLoaderGrf(uint8_t container_ver) : container_ver(container_ver) {} - ZoomLevels LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, uint8_t control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) override; + ZoomLevels LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, SpriteCacheCtrlFlags control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) override; }; #endif /* SPRITELOADER_GRF_HPP */ diff --git a/src/spriteloader/makeindexed.cpp b/src/spriteloader/makeindexed.cpp index c54afaa251..9e110f5069 100644 --- a/src/spriteloader/makeindexed.cpp +++ b/src/spriteloader/makeindexed.cpp @@ -48,7 +48,7 @@ static void Convert32bppTo8bpp(SpriteLoader::Sprite &sprite) } } -ZoomLevels SpriteLoaderMakeIndexed::LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool, uint8_t control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) +ZoomLevels SpriteLoaderMakeIndexed::LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool, SpriteCacheCtrlFlags control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) { ZoomLevels avail = this->baseloader.LoadSprite(sprite, file, file_pos, sprite_type, true, control_flags, avail_8bpp, avail_32bpp); diff --git a/src/spriteloader/makeindexed.h b/src/spriteloader/makeindexed.h index 23bdd39d7a..75bc67e22e 100644 --- a/src/spriteloader/makeindexed.h +++ b/src/spriteloader/makeindexed.h @@ -17,7 +17,7 @@ class SpriteLoaderMakeIndexed : public SpriteLoader { SpriteLoader &baseloader; public: SpriteLoaderMakeIndexed(SpriteLoader &baseloader) : baseloader(baseloader) {} - ZoomLevels LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, uint8_t control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) override; + ZoomLevels LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, SpriteCacheCtrlFlags control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) override; }; #endif /* SPRITELOADER_MAKEINDEXED_H */ diff --git a/src/spriteloader/spriteloader.hpp b/src/spriteloader/spriteloader.hpp index cf4673b760..fb36cb0294 100644 --- a/src/spriteloader/spriteloader.hpp +++ b/src/spriteloader/spriteloader.hpp @@ -13,6 +13,7 @@ #include "../core/alloc_type.hpp" #include "../core/enum_type.hpp" #include "../gfx_type.h" +#include "../spritecache_type.h" #include "sprite_file_type.hpp" struct Sprite; @@ -94,7 +95,7 @@ public: * @param[out] avail_32bpp Available 32bpp sprites. * @return Available sprites matching \a load_32bpp. */ - virtual ZoomLevels LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, uint8_t control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) = 0; + virtual ZoomLevels LoadSprite(SpriteLoader::SpriteCollection &sprite, SpriteFile &file, size_t file_pos, SpriteType sprite_type, bool load_32bpp, SpriteCacheCtrlFlags control_flags, ZoomLevels &avail_8bpp, ZoomLevels &avail_32bpp) = 0; virtual ~SpriteLoader() = default; }; diff --git a/src/tests/mock_spritecache.cpp b/src/tests/mock_spritecache.cpp index db1b32e6d4..6d59e9efcb 100644 --- a/src/tests/mock_spritecache.cpp +++ b/src/tests/mock_spritecache.cpp @@ -33,7 +33,7 @@ static bool MockLoadNextSprite(SpriteID load_index) sc->id = 0; sc->type = is_mapgen ? SpriteType::MapGen : SpriteType::Normal; sc->warned = false; - sc->control_flags = 0; + sc->control_flags = {}; /* Fill with empty sprites up until the default sprite count. */ return load_index < SPR_OPENTTD_BASE + OPENTTD_SPRITE_COUNT;