From 6c39def2870460b3321711cb8981bb20d549b696 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 20 May 2026 21:38:26 +0100 Subject: [PATCH] Codechange: use EnumIndexArray for ZoomLevel-indexed arrays --- src/sound.cpp | 9 +++++---- src/spriteloader/spriteloader.hpp | 10 +++++----- src/viewport.cpp | 12 ++++++------ 3 files changed, 16 insertions(+), 15 deletions(-) diff --git a/src/sound.cpp b/src/sound.cpp index 2a2556b50b..b9c7908f9e 100644 --- a/src/sound.cpp +++ b/src/sound.cpp @@ -120,9 +120,10 @@ static void StartSound(SoundID sound_id, float pan, uint volume) MxActivateChannel(mc); } - -static const uint8_t _vol_factor_by_zoom[] = {255, 255, 255, 190, 134, 87}; -static_assert(lengthof(_vol_factor_by_zoom) == to_underlying(ZoomLevel::End)); +/** Volume scaling for each zoom level. */ +static constexpr EnumIndexArray _vol_factor_by_zoom{ + 255, 255, 255, 190, 134, 8 +}; static const uint8_t _sound_base_vol[] = { 128, 90, 128, 128, 128, 128, 128, 128, @@ -215,7 +216,7 @@ static void SndPlayScreenCoordFx(SoundID sound, int left, int right, int top, in StartSound( sound, panning, - _vol_factor_by_zoom[to_underlying(vp.zoom)] + _vol_factor_by_zoom[vp.zoom] ); return; } diff --git a/src/spriteloader/spriteloader.hpp b/src/spriteloader/spriteloader.hpp index a6a0de255f..4034064cfe 100644 --- a/src/spriteloader/spriteloader.hpp +++ b/src/spriteloader/spriteloader.hpp @@ -32,13 +32,13 @@ using SpriteComponents = EnumBitSet class SpriteCollMap { - std::array data{}; + EnumIndexArray data{}; public: - inline constexpr T &operator[](const ZoomLevel &zoom) { return this->data[to_underlying(zoom)]; } - inline constexpr const T &operator[](const ZoomLevel &zoom) const { return this->data[to_underlying(zoom)]; } + inline constexpr T &operator[](const ZoomLevel &zoom) { return this->data[zoom]; } + inline constexpr const T &operator[](const ZoomLevel &zoom) const { return this->data[zoom]; } - T &Root() { return this->data[to_underlying(ZoomLevel::Min)]; } - const T &Root() const { return this->data[to_underlying(ZoomLevel::Min)]; } + T &Root() { return this->data[ZoomLevel::Min]; } + const T &Root() const { return this->data[ZoomLevel::Min]; } }; /** Interface for the loader of our sprites. */ diff --git a/src/viewport.cpp b/src/viewport.cpp index 79c4540f21..2c5ae31761 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -1556,17 +1556,17 @@ void ViewportSign::UpdatePosition(int center, int top, std::string_view str, std */ void ViewportSign::MarkDirty(ZoomLevel maxzoom) const { - Rect zoomlevels[to_underlying(ZoomLevel::End)]; + EnumIndexArray zoomlevels; /* We don't know which size will be drawn, so mark the largest area dirty. */ const uint half_width = std::max(this->width_normal, this->width_small) / 2 + 1; const uint height = WidgetDimensions::scaled.fullbevel.top + std::max(GetCharacterHeight(FontSize::Normal), GetCharacterHeight(FontSize::Small)) + WidgetDimensions::scaled.fullbevel.bottom + 1; for (ZoomLevel zoom = ZoomLevel::Begin; zoom != ZoomLevel::End; zoom++) { - zoomlevels[to_underlying(zoom)].left = this->center - ScaleByZoom(half_width, zoom); - zoomlevels[to_underlying(zoom)].top = this->top - ScaleByZoom(1, zoom); - zoomlevels[to_underlying(zoom)].right = this->center + ScaleByZoom(half_width, zoom); - zoomlevels[to_underlying(zoom)].bottom = this->top + ScaleByZoom(height, zoom); + zoomlevels[zoom].left = this->center - ScaleByZoom(half_width, zoom); + zoomlevels[zoom].top = this->top - ScaleByZoom(1, zoom); + zoomlevels[zoom].right = this->center + ScaleByZoom(half_width, zoom); + zoomlevels[zoom].bottom = this->top + ScaleByZoom(height, zoom); } for (const Window *w : Window::Iterate()) { @@ -1575,7 +1575,7 @@ void ViewportSign::MarkDirty(ZoomLevel maxzoom) const Viewport &vp = *w->viewport; if (vp.zoom <= maxzoom) { assert(vp.width != 0); - Rect &zl = zoomlevels[to_underlying(vp.zoom)]; + Rect &zl = zoomlevels[vp.zoom]; MarkViewportDirty(vp, zl.left, zl.top, zl.right, zl.bottom); } }