1
0
Fork 0

Codechange: Turn ZoomLevel into enum class.

pull/14203/head
frosch 2025-05-03 20:21:05 +02:00 committed by frosch
parent c0d4ab69d0
commit 8571af9833
39 changed files with 176 additions and 177 deletions

View File

@ -308,12 +308,12 @@ Sprite *Blitter_32bppOptimized::EncodeInternal(SpriteType sprite_type, const Spr
ZoomLevel zoom_max;
if (sprite_type == SpriteType::Font) {
zoom_min = ZOOM_LVL_MIN;
zoom_max = ZOOM_LVL_MIN;
zoom_min = ZoomLevel::Min;
zoom_max = ZoomLevel::Min;
} else {
zoom_min = _settings_client.gui.zoom_min;
zoom_max = _settings_client.gui.zoom_max;
if (zoom_max == zoom_min) zoom_max = ZOOM_LVL_MAX;
if (zoom_max == zoom_min) zoom_max = ZoomLevel::Max;
}
for (ZoomLevel z = zoom_min; z <= zoom_max; z++) {

View File

@ -26,12 +26,12 @@ Sprite *Blitter_32bppSSE_Base::Encode(SpriteType sprite_type, const SpriteLoader
* Second uint32_t of a line = the number of transparent pixels from the right.
* Then all RGBA then all MV.
*/
ZoomLevel zoom_min = ZOOM_LVL_MIN;
ZoomLevel zoom_max = ZOOM_LVL_MIN;
ZoomLevel zoom_min = ZoomLevel::Min;
ZoomLevel zoom_max = ZoomLevel::Min;
if (sprite_type != SpriteType::Font) {
zoom_min = _settings_client.gui.zoom_min;
zoom_max = _settings_client.gui.zoom_max;
if (zoom_max == zoom_min) zoom_max = ZOOM_LVL_MAX;
if (zoom_max == zoom_min) zoom_max = ZoomLevel::Max;
}
/* Calculate sizes and allocate. */

View File

@ -28,7 +28,7 @@
#endif
#define META_LENGTH 2 ///< Number of uint32_t inserted before each line of pixels in a sprite.
#define MARGIN_NORMAL_THRESHOLD (zoom == ZOOM_LVL_OUT_8X ? 8 : 4) ///< Minimum width to use margins with BlitterMode::Normal.
#define MARGIN_NORMAL_THRESHOLD (zoom == ZoomLevel::Out8x ? 8 : 4) ///< Minimum width to use margins with BlitterMode::Normal.
#define MARGIN_REMAP_THRESHOLD 4 ///< Minimum width to use margins with BlitterMode::ColourRemap.
typedef union alignas(16) um128i {

View File

@ -129,12 +129,12 @@ Sprite *Blitter_8bppOptimized::Encode(SpriteType sprite_type, const SpriteLoader
ZoomLevel zoom_max;
if (sprite_type == SpriteType::Font) {
zoom_min = ZOOM_LVL_MIN;
zoom_max = ZOOM_LVL_MIN;
zoom_min = ZoomLevel::Min;
zoom_max = ZoomLevel::Min;
} else {
zoom_min = _settings_client.gui.zoom_min;
zoom_max = _settings_client.gui.zoom_max;
if (zoom_max == zoom_min) zoom_max = ZOOM_LVL_MAX;
if (zoom_max == zoom_min) zoom_max = ZoomLevel::Max;
}
for (ZoomLevel i = zoom_min; i <= zoom_max; i++) {

View File

@ -313,16 +313,16 @@ static bool ConZoomToLevel(std::span<std::string_view> argv)
IConsolePrint(CC_HELP, "Set the current zoom level of the main viewport.");
IConsolePrint(CC_HELP, "Usage: 'zoomto <level>'.");
if (ZOOM_LVL_MIN < _settings_client.gui.zoom_min) {
IConsolePrint(CC_HELP, "The lowest zoom-in level allowed by current client settings is {}.", std::max(ZOOM_LVL_MIN, _settings_client.gui.zoom_min));
if (ZoomLevel::Min < _settings_client.gui.zoom_min) {
IConsolePrint(CC_HELP, "The lowest zoom-in level allowed by current client settings is {}.", std::max(ZoomLevel::Min, _settings_client.gui.zoom_min));
} else {
IConsolePrint(CC_HELP, "The lowest supported zoom-in level is {}.", std::max(ZOOM_LVL_MIN, _settings_client.gui.zoom_min));
IConsolePrint(CC_HELP, "The lowest supported zoom-in level is {}.", std::max(ZoomLevel::Min, _settings_client.gui.zoom_min));
}
if (_settings_client.gui.zoom_max < ZOOM_LVL_MAX) {
IConsolePrint(CC_HELP, "The highest zoom-out level allowed by current client settings is {}.", std::min(_settings_client.gui.zoom_max, ZOOM_LVL_MAX));
if (_settings_client.gui.zoom_max < ZoomLevel::Max) {
IConsolePrint(CC_HELP, "The highest zoom-out level allowed by current client settings is {}.", std::min(_settings_client.gui.zoom_max, ZoomLevel::Max));
} else {
IConsolePrint(CC_HELP, "The highest supported zoom-out level is {}.", std::min(_settings_client.gui.zoom_max, ZOOM_LVL_MAX));
IConsolePrint(CC_HELP, "The highest supported zoom-out level is {}.", std::min(_settings_client.gui.zoom_max, ZoomLevel::Max));
}
return true;
@ -330,8 +330,8 @@ static bool ConZoomToLevel(std::span<std::string_view> argv)
auto level = ParseInteger<std::underlying_type_t<ZoomLevel>>(argv[1]);
if (level.has_value()) {
auto zoom_lvl = static_cast<ZoomLevel>(*level);
if (!IsInsideMM(zoom_lvl, ZOOM_LVL_BEGIN, ZOOM_LVL_END)) {
IConsolePrint(CC_ERROR, "Invalid zoom level. Valid range is {} to {}.", ZOOM_LVL_MIN, ZOOM_LVL_MAX);
if (!IsInsideMM(zoom_lvl, ZoomLevel::Begin, ZoomLevel::End)) {
IConsolePrint(CC_ERROR, "Invalid zoom level. Valid range is {} to {}.", ZoomLevel::Min, ZoomLevel::Max);
} else if (!IsInsideMM(zoom_lvl, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max + 1)) {
IConsolePrint(CC_ERROR, "Current client settings limit zoom levels to range {} to {}.", _settings_client.gui.zoom_min, _settings_client.gui.zoom_max);
} else {

View File

@ -242,8 +242,8 @@ const Sprite *FreeTypeFontCache::InternalGetGlyph(GlyphID key, bool aa)
/* FreeType has rendered the glyph, now we allocate a sprite and copy the image into it */
SpriteLoader::SpriteCollection spritecollection;
SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_MIN];
sprite.AllocateData(ZOOM_LVL_MIN, static_cast<size_t>(width) * height);
SpriteLoader::Sprite &sprite = spritecollection[ZoomLevel::Min];
sprite.AllocateData(ZoomLevel::Min, static_cast<size_t>(width) * height);
sprite.colours = SpriteComponent::Palette;
if (aa) sprite.colours.Set(SpriteComponent::Alpha);
sprite.width = width;

View File

@ -54,11 +54,11 @@ static uint8_t _stringwidth_table[FS_END][224]; ///< Cache containing width of o
DrawPixelInfo *_cur_dpi;
static void GfxMainBlitterViewport(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = nullptr, SpriteID sprite_id = SPR_CURSOR_MOUSE);
static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = nullptr, SpriteID sprite_id = SPR_CURSOR_MOUSE, ZoomLevel zoom = ZOOM_LVL_MIN);
static void GfxMainBlitter(const Sprite *sprite, int x, int y, BlitterMode mode, const SubSprite *sub = nullptr, SpriteID sprite_id = SPR_CURSOR_MOUSE, ZoomLevel zoom = ZoomLevel::Min);
static ReusableBuffer<uint8_t> _cursor_backup;
ZoomLevel _gui_zoom = ZOOM_LVL_NORMAL; ///< GUI Zoom level
ZoomLevel _gui_zoom = ZoomLevel::Normal; ///< GUI Zoom level
ZoomLevel _font_zoom = _gui_zoom; ///< Sprite font Zoom level (not clamped)
int _gui_scale = MIN_INTERFACE_SCALE; ///< GUI scale, 100 is 100%.
int _gui_scale_cfg; ///< GUI scale in config.
@ -101,7 +101,7 @@ void GfxScroll(int left, int top, int width, int height, int xo, int yo)
/**
* Applies a certain FillRectMode-operation to a rectangle [left, right] x [top, bottom] on the screen.
*
* @pre dpi->zoom == ZOOM_LVL_MIN, right >= left, bottom >= top
* @pre dpi->zoom == ZoomLevel::Min, right >= left, bottom >= top
* @param left Minimum X (inclusive)
* @param top Minimum Y (inclusive)
* @param right Maximum X (inclusive)
@ -120,7 +120,7 @@ void GfxFillRect(int left, int top, int right, int bottom, int colour, FillRectM
const int otop = top;
const int oleft = left;
if (dpi->zoom != ZOOM_LVL_MIN) return;
if (dpi->zoom != ZoomLevel::Min) return;
if (left > right || top > bottom) return;
if (right < dpi->left || left >= dpi->left + dpi->width) return;
if (bottom < dpi->top || top >= dpi->top + dpi->height) return;
@ -200,7 +200,7 @@ static std::vector<LineSegment> MakePolygonSegments(std::span<const Point> shape
* The odd-even winding rule is used, i.e. self-intersecting polygons will have holes in them.
* Left and top edges are inclusive, right and bottom edges are exclusive.
* @note For rectangles the GfxFillRect function will be faster.
* @pre dpi->zoom == ZOOM_LVL_MIN
* @pre dpi->zoom == ZoomLevel::Min
* @param shape List of points on the polygon.
* @param colour An 8 bit palette index (FILLRECT_OPAQUE and FILLRECT_CHECKER) or a recolour spritenumber (FILLRECT_RECOLOUR).
* @param mode
@ -212,7 +212,7 @@ void GfxFillPolygon(std::span<const Point> shape, int colour, FillRectMode mode)
{
Blitter *blitter = BlitterFactory::GetCurrentBlitter();
const DrawPixelInfo *dpi = _cur_dpi;
if (dpi->zoom != ZOOM_LVL_MIN) return;
if (dpi->zoom != ZoomLevel::Min) return;
std::vector<LineSegment> segments = MakePolygonSegments(shape, Point{ dpi->left, dpi->top });
@ -1556,7 +1556,7 @@ bool FillDrawPixelInfo(DrawPixelInfo *n, int left, int top, int width, int heigh
Blitter *blitter = BlitterFactory::GetCurrentBlitter();
const DrawPixelInfo *o = _cur_dpi;
n->zoom = ZOOM_LVL_MIN;
n->zoom = ZoomLevel::Min;
assert(width > 0);
assert(height > 0);
@ -1782,12 +1782,12 @@ void UpdateGUIZoom()
_gui_scale = Clamp(_gui_scale_cfg, MIN_INTERFACE_SCALE, MAX_INTERFACE_SCALE);
}
int8_t new_zoom = ScaleGUITrad(1) <= 1 ? ZOOM_LVL_NORMAL : ScaleGUITrad(1) >= 4 ? ZOOM_LVL_IN_4X : ZOOM_LVL_IN_2X;
ZoomLevel new_zoom = ScaleGUITrad(1) <= 1 ? ZoomLevel::Normal : ScaleGUITrad(1) >= 4 ? ZoomLevel::In4x : ZoomLevel::In2x;
/* Font glyphs should not be clamped to min/max zoom. */
_font_zoom = static_cast<ZoomLevel>(new_zoom);
_font_zoom = new_zoom;
/* Ensure the gui_zoom is clamped between min/max. */
new_zoom = Clamp(new_zoom, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max);
_gui_zoom = static_cast<ZoomLevel>(new_zoom);
_gui_zoom = new_zoom;
}
/**

View File

@ -116,7 +116,7 @@ static std::unique_ptr<NWidgetBase> MakeNWidgetCompanyLines()
{
auto vert = std::make_unique<NWidgetVertical>(NWidContainerFlag::EqualSize);
vert->SetPadding(2, 2, 2, 2);
uint sprite_height = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZOOM_LVL_NORMAL).height;
uint sprite_height = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZoomLevel::Normal).height;
for (WidgetID widnum = WID_GL_FIRST_COMPANY; widnum <= WID_GL_LAST_COMPANY; widnum++) {
auto panel = std::make_unique<NWidgetBackground>(WWT_PANEL, COLOUR_BROWN, widnum);

View File

@ -825,7 +825,7 @@ public:
this->InitNested(window_number);
NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_IV_VIEWPORT);
nvp->InitializeViewport(this, Industry::Get(window_number)->location.GetCenterTile(), ScaleZoomGUI(ZOOM_LVL_INDUSTRY));
nvp->InitializeViewport(this, Industry::Get(window_number)->location.GetCenterTile(), ScaleZoomGUI(ZoomLevel::Industry));
const Industry *i = Industry::Get(window_number);
if (!i->IsCargoProduced()) this->DisableWidget(WID_IV_GRAPH);

View File

@ -219,7 +219,7 @@ struct MainWindow : Window
ResizeWindow(this, _screen.width, _screen.height);
NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_M_VIEWPORT);
nvp->InitializeViewport(this, TileXY(32, 32), ScaleZoomGUI(ZOOM_LVL_VIEWPORT));
nvp->InitializeViewport(this, TileXY(32, 32), ScaleZoomGUI(ZoomLevel::Viewport));
this->viewport->overlay = std::make_shared<LinkGraphOverlay>(this, WID_M_VIEWPORT, 0, CompanyMask{}, 2);
this->refresh_timeout.Reset();

View File

@ -44,7 +44,7 @@ static Dimension GetBadgeMaximalDimension(BadgeClassID class_index, GrfSpecFeatu
PalSpriteID ps = GetBadgeSprite(badge, feature, std::nullopt, PAL_NONE);
if (ps.sprite == 0) continue;
d.width = std::max(d.width, GetSpriteSize(ps.sprite, nullptr, ZOOM_LVL_NORMAL).width);
d.width = std::max(d.width, GetSpriteSize(ps.sprite, nullptr, ZoomLevel::Normal).width);
if (d.width > MAX_BADGE_WIDTH) break;
}

View File

@ -822,7 +822,7 @@ struct SpriteAlignerWindow : Window {
Scrollbar *vscroll = nullptr;
std::map<SpriteID, XyOffs> offs_start_map{}; ///< Mapping of starting offsets for the sprites which have been aligned in the sprite aligner window.
static inline ZoomLevel zoom = ZOOM_LVL_END;
static inline ZoomLevel zoom = ZoomLevel::End;
static bool centre;
static bool crosshair;
const Action5Type *act5_type = nullptr; ///< Sprite Area of current selected sprite.
@ -830,7 +830,7 @@ struct SpriteAlignerWindow : Window {
SpriteAlignerWindow(WindowDesc &desc, WindowNumber wno) : Window(desc)
{
/* On first opening, set initial zoom to current zoom level. */
if (SpriteAlignerWindow::zoom == ZOOM_LVL_END) SpriteAlignerWindow::zoom = _gui_zoom;
if (SpriteAlignerWindow::zoom == ZoomLevel::End) SpriteAlignerWindow::zoom = _gui_zoom;
SpriteAlignerWindow::zoom = Clamp(SpriteAlignerWindow::zoom, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max);
/* Oh yes, we assume there is at least one normal sprite! */
@ -1071,8 +1071,8 @@ struct SpriteAlignerWindow : Window {
break;
default:
if (IsInsideBS(widget, WID_SA_ZOOM, ZOOM_LVL_END)) {
SpriteAlignerWindow::zoom = ZoomLevel(widget - WID_SA_ZOOM);
if (IsInsideBS(widget, WID_SA_ZOOM, to_underlying(ZoomLevel::End))) {
SpriteAlignerWindow::zoom = static_cast<ZoomLevel>(widget - WID_SA_ZOOM);
this->InvalidateData(0, true);
}
break;
@ -1109,7 +1109,7 @@ struct SpriteAlignerWindow : Window {
}
SpriteAlignerWindow::zoom = Clamp(SpriteAlignerWindow::zoom, _settings_client.gui.zoom_min, _settings_client.gui.zoom_max);
for (ZoomLevel z = ZOOM_LVL_BEGIN; z < ZOOM_LVL_END; z++) {
for (ZoomLevel z = ZoomLevel::Begin; z < ZoomLevel::End; z++) {
this->SetWidgetsDisabledState(z < _settings_client.gui.zoom_min || z > _settings_client.gui.zoom_max, WID_SA_ZOOM + to_underlying(z));
this->SetWidgetsLoweredState(SpriteAlignerWindow::zoom == z, WID_SA_ZOOM + to_underlying(z));
}
@ -1191,12 +1191,12 @@ static constexpr NWidgetPart _nested_sprite_aligner_widgets[] = {
NWidget(NWID_VSCROLLBAR, COLOUR_GREY, WID_SA_SCROLLBAR),
EndContainer(),
NWidget(NWID_VERTICAL),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZOOM_LVL_IN_4X)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_MIN), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZOOM_LVL_IN_2X)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_IN_2X), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZOOM_LVL_NORMAL)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_NORMAL), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZOOM_LVL_OUT_2X)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZOOM_LVL_OUT_4X)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZOOM_LVL_OUT_8X)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZoomLevel::In4x)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_MIN), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZoomLevel::In2x)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_IN_2X), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZoomLevel::Normal)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_NORMAL), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZoomLevel::Out2x)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZoomLevel::Out4x)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_4X), SetFill(1, 0),
NWidget(WWT_TEXTBTN, COLOUR_GREY, WID_SA_ZOOM + to_underlying(ZoomLevel::Out8x)), SetStringTip(STR_CONFIG_SETTING_ZOOM_LVL_OUT_8X), SetFill(1, 0),
EndContainer(),
EndContainer(),
EndContainer(),

View File

@ -395,9 +395,9 @@ struct NewsWindow : Window {
NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_N_VIEWPORT);
if (nvp != nullptr) {
if (std::holds_alternative<VehicleID>(ni->ref1)) {
nvp->InitializeViewport(this, std::get<VehicleID>(ni->ref1), ScaleZoomGUI(ZOOM_LVL_NEWS));
nvp->InitializeViewport(this, std::get<VehicleID>(ni->ref1), ScaleZoomGUI(ZoomLevel::News));
} else {
nvp->InitializeViewport(this, GetReferenceTile(ni->ref1), ScaleZoomGUI(ZOOM_LVL_NEWS));
nvp->InitializeViewport(this, GetReferenceTile(ni->ref1), ScaleZoomGUI(ZoomLevel::News));
}
if (this->ni->flags.Test(NewsFlag::NoTransparency)) nvp->disp_flags.Set(NWidgetDisplayFlag::NoTransparency);
if (!this->ni->flags.Test(NewsFlag::InColour)) {

View File

@ -760,7 +760,7 @@ int openttd_main(std::span<std::string_view> arguments)
InitializeSpriteSorter();
/* Initialize the zoom level of the screen to normal */
_screen.zoom = ZOOM_LVL_MIN;
_screen.zoom = ZoomLevel::Min;
/* The video driver is now selected, now initialise GUI zoom */
UpdateGUIZoom();

View File

@ -229,8 +229,8 @@ const Sprite *CoreTextFontCache::InternalGetGlyph(GlyphID key, bool use_aa)
if (width > MAX_GLYPH_DIM || height > MAX_GLYPH_DIM) UserError("Font glyph is too large");
SpriteLoader::SpriteCollection spritecollection;
SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_MIN];
sprite.AllocateData(ZOOM_LVL_MIN, width * height);
SpriteLoader::Sprite &sprite = spritecollection[ZoomLevel::Min];
sprite.AllocateData(ZoomLevel::Min, width * height);
sprite.colours = SpriteComponent::Palette;
if (use_aa) sprite.colours.Set(SpriteComponent::Alpha);
sprite.width = width;

View File

@ -225,8 +225,8 @@ void Win32FontCache::ClearFontCache()
/* GDI has rendered the glyph, now we allocate a sprite and copy the image into it. */
SpriteLoader::SpriteCollection spritecollection;
SpriteLoader::Sprite &sprite = spritecollection[ZOOM_LVL_MIN];
sprite.AllocateData(ZOOM_LVL_MIN, width * height);
SpriteLoader::Sprite &sprite = spritecollection[ZoomLevel::Min];
sprite.AllocateData(ZoomLevel::Min, width * height);
sprite.colours = SpriteComponent::Palette;
if (aa) sprite.colours.Set(SpriteComponent::Alpha);
sprite.width = width;

View File

@ -1658,7 +1658,7 @@ static void DrawRoadBits(TileInfo *ti)
DrawRoadCatenary(ti);
/* Return if full detail is disabled, or we are zoomed fully out. */
if (!HasBit(_display_opt, DO_FULL_DETAIL) || _cur_dpi->zoom > ZOOM_LVL_DETAIL) return;
if (!HasBit(_display_opt, DO_FULL_DETAIL) || _cur_dpi->zoom > ZoomLevel::Detail) return;
/* Do not draw details (street lights, trees) under low bridge */
Roadside roadside = GetRoadside(ti->tile);

View File

@ -43,7 +43,7 @@ void SaveViewportBeforeSaveGame()
/* Ensure saved position is clearly invalid. */
_saved_scrollpos_x = INT_MAX;
_saved_scrollpos_y = INT_MAX;
_saved_scrollpos_zoom = ZOOM_LVL_END;
_saved_scrollpos_zoom = ZoomLevel::End;
} else {
_saved_scrollpos_x = w->viewport->scrollpos_x;
_saved_scrollpos_y = w->viewport->scrollpos_y;
@ -61,12 +61,12 @@ void ResetViewportAfterLoadGame()
w->viewport->dest_scrollpos_y = _saved_scrollpos_y;
Viewport &vp = *w->viewport;
vp.zoom = std::min(_saved_scrollpos_zoom, ZOOM_LVL_MAX);
vp.zoom = std::min(_saved_scrollpos_zoom, ZoomLevel::Max);
vp.virtual_width = ScaleByZoom(vp.width, vp.zoom);
vp.virtual_height = ScaleByZoom(vp.height, vp.zoom);
/* If zoom_max is ZOOM_LVL_MIN then the setting has not been loaded yet, therefore all levels are allowed. */
if (_settings_client.gui.zoom_max != ZOOM_LVL_MIN) {
/* If zoom_max is ZoomLevel::Min then the setting has not been loaded yet, therefore all levels are allowed. */
if (_settings_client.gui.zoom_max != ZoomLevel::Min) {
/* Ensure zoom level is allowed */
while (vp.zoom < _settings_client.gui.zoom_min) DoZoomInOutWindow(ZOOM_OUT, w);
while (vp.zoom > _settings_client.gui.zoom_max) DoZoomInOutWindow(ZOOM_IN, w);

View File

@ -94,7 +94,7 @@ static void LargeWorldCallback(Viewport &vp, void *buf, uint y, uint pitch, uint
.width = vp.width,
.height = static_cast<int>(n),
.pitch = static_cast<int>(pitch),
.zoom = ZOOM_LVL_WORLD_SCREENSHOT
.zoom = ZoomLevel::WorldScreenshot
};
/* We are no longer rendering to the screen */
@ -105,7 +105,7 @@ static void LargeWorldCallback(Viewport &vp, void *buf, uint y, uint pitch, uint
.width = static_cast<int>(pitch),
.height = static_cast<int>(n),
.pitch = static_cast<int>(pitch),
.zoom = ZOOM_LVL_MIN
.zoom = ZoomLevel::Min
});
AutoRestoreBackup disable_anim_backup(_screen_disable_anim, true);
AutoRestoreBackup dpi_backup(_cur_dpi, &dpi);
@ -213,7 +213,7 @@ static Viewport SetupScreenshotViewport(ScreenshotType t, uint32_t width = 0, ui
assert(width == 0 && height == 0);
/* Determine world coordinates of screenshot */
vp.zoom = ZOOM_LVL_WORLD_SCREENSHOT;
vp.zoom = ZoomLevel::WorldScreenshot;
TileIndex north_tile = _settings_game.construction.freeform_edges ? TileXY(1, 1) : TileXY(0, 0);
TileIndex south_tile{Map::Size() - 1};
@ -237,7 +237,7 @@ static Viewport SetupScreenshotViewport(ScreenshotType t, uint32_t width = 0, ui
break;
}
default: {
vp.zoom = (t == SC_ZOOMEDIN) ? _settings_client.gui.zoom_min : ZOOM_LVL_VIEWPORT;
vp.zoom = (t == SC_ZOOMEDIN) ? _settings_client.gui.zoom_min : ZoomLevel::Viewport;
Window *w = GetMainWindow();
vp.virtual_left = w->viewport->virtual_left;
@ -247,8 +247,8 @@ static Viewport SetupScreenshotViewport(ScreenshotType t, uint32_t width = 0, ui
vp.virtual_width = w->viewport->virtual_width;
vp.virtual_height = w->viewport->virtual_height;
} else {
vp.virtual_width = width << vp.zoom;
vp.virtual_height = height << vp.zoom;
vp.virtual_width = width << to_underlying(vp.zoom);
vp.virtual_height = height << to_underlying(vp.zoom);
}
/* Compute pixel coordinates */

View File

@ -122,7 +122,7 @@ static void StartSound(SoundID sound_id, float pan, uint volume)
static const uint8_t _vol_factor_by_zoom[] = {255, 255, 255, 190, 134, 87};
static_assert(lengthof(_vol_factor_by_zoom) == ZOOM_LVL_END);
static_assert(lengthof(_vol_factor_by_zoom) == to_underlying(ZoomLevel::End));
static const uint8_t _sound_base_vol[] = {
128, 90, 128, 128, 128, 128, 128, 128,
@ -215,7 +215,7 @@ static void SndPlayScreenCoordFx(SoundID sound, int left, int right, int top, in
StartSound(
sound,
panning,
_vol_factor_by_zoom[vp.zoom]
_vol_factor_by_zoom[to_underlying(vp.zoom)]
);
return;
}

View File

@ -338,7 +338,7 @@ static bool PadSprites(SpriteLoader::SpriteCollection &sprite, ZoomLevels sprite
/* Get minimum top left corner coordinates. */
int min_xoffs = INT32_MAX;
int min_yoffs = INT32_MAX;
for (ZoomLevel zoom = ZOOM_LVL_BEGIN; zoom != ZOOM_LVL_END; zoom++) {
for (ZoomLevel zoom = ZoomLevel::Begin; zoom != ZoomLevel::End; zoom++) {
if (sprite_avail.Test(zoom)) {
min_xoffs = std::min(min_xoffs, ScaleByZoom(sprite[zoom].x_offs, zoom));
min_yoffs = std::min(min_yoffs, ScaleByZoom(sprite[zoom].y_offs, zoom));
@ -348,7 +348,7 @@ static bool PadSprites(SpriteLoader::SpriteCollection &sprite, ZoomLevels sprite
/* Get maximum dimensions taking necessary padding at the top left into account. */
int max_width = INT32_MIN;
int max_height = INT32_MIN;
for (ZoomLevel zoom = ZOOM_LVL_BEGIN; zoom != ZOOM_LVL_END; zoom++) {
for (ZoomLevel zoom = ZoomLevel::Begin; zoom != ZoomLevel::End; zoom++) {
if (sprite_avail.Test(zoom)) {
max_width = std::max(max_width, ScaleByZoom(sprite[zoom].width + sprite[zoom].x_offs - UnScaleByZoom(min_xoffs, zoom), zoom));
max_height = std::max(max_height, ScaleByZoom(sprite[zoom].height + sprite[zoom].y_offs - UnScaleByZoom(min_yoffs, zoom), zoom));
@ -363,7 +363,7 @@ static bool PadSprites(SpriteLoader::SpriteCollection &sprite, ZoomLevels sprite
}
/* Pad sprites where needed. */
for (ZoomLevel zoom = ZOOM_LVL_BEGIN; zoom != ZOOM_LVL_END; zoom++) {
for (ZoomLevel zoom = ZoomLevel::Begin; zoom != ZoomLevel::End; zoom++) {
if (sprite_avail.Test(zoom)) {
auto &cur_sprite = sprite[zoom];
/* Scaling the sprite dimensions in the blitter is done with rounding up,
@ -386,12 +386,12 @@ static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, ZoomLevels spr
{
/* Create a fully zoomed image if it does not exist */
ZoomLevel first_avail;
for (ZoomLevel zoom = ZOOM_LVL_MIN; zoom <= ZOOM_LVL_MAX; ++zoom) {
for (ZoomLevel zoom = ZoomLevel::Min; zoom <= ZoomLevel::Max; ++zoom) {
if (!sprite_avail.Test(zoom)) continue;
first_avail = zoom;
if (zoom != ZOOM_LVL_MIN) {
if (!ResizeSpriteIn(sprite, zoom, ZOOM_LVL_MIN)) return false;
sprite_avail.Set(ZOOM_LVL_MIN);
if (zoom != ZoomLevel::Min) {
if (!ResizeSpriteIn(sprite, zoom, ZoomLevel::Min)) return false;
sprite_avail.Set(ZoomLevel::Min);
}
break;
}
@ -400,12 +400,12 @@ static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, ZoomLevels spr
if (!PadSprites(sprite, sprite_avail, encoder)) return false;
/* Create other missing zoom levels */
for (ZoomLevel zoom = ZOOM_LVL_BEGIN; zoom != ZOOM_LVL_END; zoom++) {
if (zoom == ZOOM_LVL_MIN) continue;
for (ZoomLevel zoom = ZoomLevel::Begin; zoom != ZoomLevel::End; zoom++) {
if (zoom == ZoomLevel::Min) continue;
if (sprite_avail.Test(zoom)) {
/* Check that size and offsets match the fully zoomed image. */
[[maybe_unused]] const auto &root_sprite = sprite[ZOOM_LVL_MIN];
[[maybe_unused]] const auto &root_sprite = sprite[ZoomLevel::Min];
[[maybe_unused]] const auto &dest_sprite = sprite[zoom];
assert(dest_sprite.width == UnScaleByZoom(root_sprite.width, zoom));
assert(dest_sprite.height == UnScaleByZoom(root_sprite.height, zoom));
@ -419,7 +419,7 @@ static bool ResizeSprites(SpriteLoader::SpriteCollection &sprite, ZoomLevels spr
/* Replace sprites with higher resolution than the desired maximum source resolution with scaled up sprites, if not already done. */
if (first_avail < _settings_client.gui.sprite_zoom_min) {
for (ZoomLevel zoom = std::min(ZOOM_LVL_NORMAL, _settings_client.gui.sprite_zoom_min); zoom > ZOOM_LVL_MIN; --zoom) {
for (ZoomLevel zoom = std::min(ZoomLevel::Normal, _settings_client.gui.sprite_zoom_min); zoom > ZoomLevel::Min; --zoom) {
ResizeSpriteIn(sprite, zoom, zoom - 1);
}
}
@ -546,9 +546,9 @@ static void *ReadSprite(const SpriteCache *sc, SpriteID id, SpriteType sprite_ty
return (void*)GetRawSprite(SPR_IMG_QUERY, SpriteType::Normal, &allocator, encoder);
}
if (sprite_type == SpriteType::Font && _font_zoom != ZOOM_LVL_MIN) {
/* Make ZOOM_LVL_MIN be ZOOM_LVL_GUI */
sprite[ZOOM_LVL_MIN] = sprite[_font_zoom];
if (sprite_type == SpriteType::Font && _font_zoom != ZoomLevel::Min) {
/* Make ZoomLevel::Min be ZOOM_LVL_GUI */
sprite[ZoomLevel::Min] = sprite[_font_zoom];
}
return encoder->Encode(sprite_type, sprite, allocator);
@ -605,11 +605,11 @@ void ReadGRFSpriteOffsets(SpriteFile &file)
if (length > 0) {
uint8_t zoom = file.ReadByte();
length--;
if (colour != SpriteComponents{} && zoom == 0) { // ZOOM_LVL_NORMAL (normal zoom)
if (colour != SpriteComponents{} && 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);
}
if (colour != SpriteComponents{} && zoom == 2) { // ZOOM_LVL_IN_2X (2x zoomed in)
if (colour != SpriteComponents{} && 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);
}
}

View File

@ -230,7 +230,7 @@ static ZoomLevels LoadSpriteV1(SpriteLoader::SpriteCollection &sprite, SpriteFil
/* Type 0xFF indicates either a colourmap or some other non-sprite info; we do not handle them here */
if (type == 0xFF) return {};
ZoomLevel zoom_lvl = (sprite_type != SpriteType::MapGen) ? ZOOM_LVL_NORMAL : ZOOM_LVL_MIN;
ZoomLevel zoom_lvl = (sprite_type != SpriteType::MapGen) ? ZoomLevel::Normal : ZoomLevel::Min;
auto &dest_sprite = sprite[zoom_lvl];
dest_sprite.height = file.ReadByte();
@ -258,7 +258,7 @@ static ZoomLevels LoadSpriteV1(SpriteLoader::SpriteCollection &sprite, SpriteFil
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 const ZoomLevel zoom_lvl_map[6] = {ZOOM_LVL_NORMAL, ZOOM_LVL_IN_4X, ZOOM_LVL_IN_2X, ZOOM_LVL_OUT_2X, ZOOM_LVL_OUT_4X, ZOOM_LVL_OUT_8X};
static const ZoomLevel zoom_lvl_map[6] = {ZoomLevel::Normal, ZoomLevel::In4x, ZoomLevel::In2x, ZoomLevel::Out2x, ZoomLevel::Out4x, ZoomLevel::Out8x};
/* Is the sprite not present/stripped in the GRF? */
if (file_pos == SIZE_MAX) return {};
@ -293,13 +293,13 @@ static ZoomLevels LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFil
if (colour != SpriteComponent::Palette) avail_32bpp.Set(zoom_lvl);
is_wanted_zoom_lvl = true;
ZoomLevel zoom_min = sprite_type == SpriteType::Font ? ZOOM_LVL_MIN : _settings_client.gui.sprite_zoom_min;
if (zoom_min >= ZOOM_LVL_IN_2X &&
HasBit(control_flags, load_32bpp ? SCCF_ALLOW_ZOOM_MIN_2X_32BPP : SCCF_ALLOW_ZOOM_MIN_2X_PAL) && zoom_lvl < ZOOM_LVL_IN_2X) {
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) {
is_wanted_zoom_lvl = false;
}
if (zoom_min >= ZOOM_LVL_NORMAL &&
HasBit(control_flags, load_32bpp ? SCCF_ALLOW_ZOOM_MIN_1X_32BPP : SCCF_ALLOW_ZOOM_MIN_1X_PAL) && zoom_lvl < ZOOM_LVL_NORMAL) {
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) {
is_wanted_zoom_lvl = false;
}
} else {
@ -310,7 +310,7 @@ static ZoomLevels LoadSpriteV2(SpriteLoader::SpriteCollection &sprite, SpriteFil
}
if (is_wanted_colour_depth && is_wanted_zoom_lvl) {
ZoomLevel zoom_lvl = (sprite_type != SpriteType::MapGen) ? zoom_lvl_map[zoom] : ZOOM_LVL_MIN;
ZoomLevel zoom_lvl = (sprite_type != SpriteType::MapGen) ? zoom_lvl_map[zoom] : ZoomLevel::Min;
if (loaded_sprites.Test(zoom_lvl)) {
/* We already have this zoom level, skip sprite. */

View File

@ -52,7 +52,7 @@ ZoomLevels SpriteLoaderMakeIndexed::LoadSprite(SpriteLoader::SpriteCollection &s
{
ZoomLevels avail = this->baseloader.LoadSprite(sprite, file, file_pos, sprite_type, true, control_flags, avail_8bpp, avail_32bpp);
for (ZoomLevel zoom = ZOOM_LVL_BEGIN; zoom != ZOOM_LVL_END; zoom++) {
for (ZoomLevel zoom = ZoomLevel::Begin; zoom != ZoomLevel::End; zoom++) {
if (avail.Test(zoom)) Convert32bppTo8bpp(sprite[zoom]);
}

View File

@ -31,13 +31,13 @@ using SpriteComponents = EnumBitSet<SpriteComponent, uint8_t, SpriteComponent::E
*/
template <class T>
class SpriteCollMap {
std::array<T, ZOOM_LVL_END> data;
std::array<T, to_underlying(ZoomLevel::End)> data;
public:
inline constexpr T &operator[](const ZoomLevel &zoom) { return this->data[zoom]; }
inline constexpr const T &operator[](const ZoomLevel &zoom) const { return this->data[zoom]; }
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)]; }
T &Root() { return this->data[ZOOM_LVL_MIN]; }
const T &Root() const { return this->data[ZOOM_LVL_MIN]; }
T &Root() { return this->data[to_underlying(ZoomLevel::Min)]; }
const T &Root() const { return this->data[to_underlying(ZoomLevel::Min)]; }
};
/** Interface for the loader of our sprites. */

View File

@ -260,9 +260,9 @@ cat = SC_EXPERT
var = gui.zoom_min
type = SLE_UINT8
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown
def = ZOOM_LVL_MIN
min = ZOOM_LVL_MIN
max = ZOOM_LVL_NORMAL
def = to_underlying(ZoomLevel::Min)
min = to_underlying(ZoomLevel::Min)
max = to_underlying(ZoomLevel::Normal)
str = STR_CONFIG_SETTING_ZOOM_MIN
strhelp = STR_CONFIG_SETTING_ZOOM_MIN_HELPTEXT
strval = STR_CONFIG_SETTING_ZOOM_LVL_MIN
@ -273,9 +273,9 @@ startup = true
var = gui.zoom_max
type = SLE_UINT8
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown
def = ZOOM_LVL_MAX
min = ZOOM_LVL_OUT_2X
max = ZOOM_LVL_MAX
def = to_underlying(ZoomLevel::Max)
min = to_underlying(ZoomLevel::Out2x)
max = to_underlying(ZoomLevel::Max)
str = STR_CONFIG_SETTING_ZOOM_MAX
strhelp = STR_CONFIG_SETTING_ZOOM_MAX_HELPTEXT
strval = STR_CONFIG_SETTING_ZOOM_LVL_OUT_2X
@ -286,9 +286,9 @@ startup = true
var = gui.sprite_zoom_min
type = SLE_UINT8
flags = SettingFlag::NotInSave, SettingFlag::NoNetworkSync, SettingFlag::GuiDropdown
def = ZOOM_LVL_MIN
min = ZOOM_LVL_MIN
max = ZOOM_LVL_NORMAL
def = to_underlying(ZoomLevel::Min)
min = to_underlying(ZoomLevel::Min)
max = to_underlying(ZoomLevel::Normal)
str = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN
strhelp = STR_CONFIG_SETTING_SPRITE_ZOOM_MIN_HELPTEXT
strval = STR_CONFIG_SETTING_SPRITE_ZOOM_LVL_MIN

View File

@ -101,10 +101,10 @@ IntervalTimer<TimerWindow> move_all_text_effects_interval = {std::chrono::millis
continue;
}
te.MarkDirty(ZOOM_LVL_TEXT_EFFECT);
te.MarkDirty(ZoomLevel::TextEffect);
te.duration -= count;
te.top -= count * ZOOM_BASE;
te.MarkDirty(ZOOM_LVL_TEXT_EFFECT);
te.MarkDirty(ZoomLevel::TextEffect);
}
}};
@ -117,11 +117,11 @@ void InitTextEffects()
void DrawTextEffects(DrawPixelInfo *dpi)
{
/* Don't draw the text effects when zoomed out a lot */
if (dpi->zoom > ZOOM_LVL_TEXT_EFFECT) return;
if (dpi->zoom > ZoomLevel::TextEffect) return;
if (IsTransparencySet(TO_TEXT)) return;
ViewportStringFlags flags{};
if (dpi->zoom >= ZOOM_LVL_TEXT_EFFECT) flags.Set(ViewportStringFlag::Small);
if (dpi->zoom >= ZoomLevel::TextEffect) flags.Set(ViewportStringFlag::Small);
for (const TextEffect &te : _text_effects) {
if (!te.IsValid()) continue;

View File

@ -378,7 +378,7 @@ public:
this->flags.Set(WindowFlag::DisableVpScroll);
NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_TV_VIEWPORT);
nvp->InitializeViewport(this, this->town->xy, ScaleZoomGUI(ZOOM_LVL_TOWN));
nvp->InitializeViewport(this, this->town->xy, ScaleZoomGUI(ZoomLevel::Town));
/* disable renaming town in network games if you are not the server */
this->SetWidgetDisabledState(WID_TV_CHANGE_NAME, _networking && !_network_server);

View File

@ -2873,10 +2873,10 @@ static_assert(VEH_AIRCRAFT == 3);
/** Zoom levels for vehicle views indexed by vehicle type. */
static const ZoomLevel _vehicle_view_zoom_levels[] = {
ZOOM_LVL_TRAIN,
ZOOM_LVL_ROADVEH,
ZOOM_LVL_SHIP,
ZOOM_LVL_AIRCRAFT,
ZoomLevel::Train,
ZoomLevel::RoadVehicle,
ZoomLevel::Ship,
ZoomLevel::Aircraft,
};
/* Constants for geometry of vehicle view viewport */

View File

@ -1405,7 +1405,7 @@ OpenGLSprite::OpenGLSprite(SpriteType sprite_type, const SpriteLoader::SpriteCol
this->x_offs = root_sprite.x_offs;
this->y_offs = root_sprite.y_offs;
int levels = sprite_type == SpriteType::Font ? 1 : ZOOM_LVL_END;
int levels = sprite_type == SpriteType::Font ? 1 : to_underlying(ZoomLevel::End);
assert(levels > 0);
(void)_glGetError();
@ -1440,9 +1440,9 @@ OpenGLSprite::OpenGLSprite(SpriteType sprite_type, const SpriteLoader::SpriteCol
}
/* Upload texture data. */
for (ZoomLevel zoom = ZOOM_LVL_MIN; zoom <= (sprite_type == SpriteType::Font ? ZOOM_LVL_MIN : ZOOM_LVL_MAX); ++zoom) {
for (ZoomLevel zoom = ZoomLevel::Min; zoom <= (sprite_type == SpriteType::Font ? ZoomLevel::Min : ZoomLevel::Max); ++zoom) {
const auto &src_sprite = sprite[zoom];
this->Update(src_sprite.width, src_sprite.height, zoom, src_sprite.data);
this->Update(src_sprite.width, src_sprite.height, to_underlying(zoom), src_sprite.data);
}
assert(_glGetError() == GL_NO_ERROR);

View File

@ -105,7 +105,7 @@ public:
/* SpriteEncoder */
bool Is32BppSupported() override { return true; }
uint GetSpriteAlignment() override { return 1u << ZOOM_LVL_MAX; }
uint GetSpriteAlignment() override { return 1u << to_underlying(ZoomLevel::Max); }
Sprite *Encode(SpriteType sprite_type, const SpriteLoader::SpriteCollection &sprite, SpriteAllocator &allocator) override;
};

View File

@ -1481,7 +1481,7 @@ static void ViewportAddKdtreeSigns(DrawPixelInfo *dpi)
});
/* Small versions of signs are used zoom level 4X and higher. */
bool small = dpi->zoom >= ZOOM_LVL_OUT_4X;
bool small = dpi->zoom >= ZoomLevel::Out4x;
/* Layering order (bottom to top): Town names, signs, stations */
ViewportAddTownStrings(dpi, towns, small);
@ -1525,17 +1525,17 @@ void ViewportSign::UpdatePosition(int center, int top, std::string_view str, std
*/
void ViewportSign::MarkDirty(ZoomLevel maxzoom) const
{
Rect zoomlevels[ZOOM_LVL_END];
Rect zoomlevels[to_underlying(ZoomLevel::End)];
/* 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(FS_NORMAL), GetCharacterHeight(FS_SMALL)) + WidgetDimensions::scaled.fullbevel.bottom + 1;
for (ZoomLevel zoom = ZOOM_LVL_BEGIN; zoom != ZOOM_LVL_END; 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 (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);
}
for (const Window *w : Window::Iterate()) {
@ -1544,7 +1544,7 @@ void ViewportSign::MarkDirty(ZoomLevel maxzoom) const
Viewport &vp = *w->viewport;
if (vp.zoom <= maxzoom) {
assert(vp.width != 0);
Rect &zl = zoomlevels[vp.zoom];
Rect &zl = zoomlevels[to_underlying(vp.zoom)];
MarkViewportDirty(vp, zl.left, zl.top, zl.right, zl.bottom);
}
}
@ -1820,7 +1820,7 @@ void ViewportDoDraw(const Viewport &vp, int left, int top, int right, int bottom
DrawPixelInfo dp = _vd.dpi;
ZoomLevel zoom = _vd.dpi.zoom;
dp.zoom = ZOOM_LVL_MIN;
dp.zoom = ZoomLevel::Min;
dp.width = UnScaleByZoom(dp.width, zoom);
dp.height = UnScaleByZoom(dp.height, zoom);
AutoRestoreBackup cur_dpi(_cur_dpi, &dp);
@ -2026,8 +2026,8 @@ void UpdateViewportPosition(Window *w, uint32_t delta_ms)
static bool MarkViewportDirty(const Viewport &vp, int left, int top, int right, int bottom)
{
/* Rounding wrt. zoom-out level */
right += (1 << vp.zoom) - 1;
bottom += (1 << vp.zoom) - 1;
right += (1 << to_underlying(vp.zoom)) - 1;
bottom += (1 << to_underlying(vp.zoom)) - 1;
right -= vp.virtual_left;
if (right <= 0) return false;
@ -2055,10 +2055,10 @@ static bool MarkViewportDirty(const Viewport &vp, int left, int top, int right,
/**
* Mark all viewports that display an area as dirty (in need of repaint).
* @param left Left edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_MIN)
* @param top Top edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_MIN)
* @param right Right edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_MIN)
* @param bottom Bottom edge of area to repaint. (viewport coordinates, that is wrt. #ZOOM_LVL_MIN)
* @param left Left edge of area to repaint. (viewport coordinates, that is wrt. #ZoomLevel::Min)
* @param top Top edge of area to repaint. (viewport coordinates, that is wrt. #ZoomLevel::Min)
* @param right Right edge of area to repaint. (viewport coordinates, that is wrt. #ZoomLevel::Min)
* @param bottom Bottom edge of area to repaint. (viewport coordinates, that is wrt. #ZoomLevel::Min)
* @return true if at least one viewport has a dirty block
* @ingroup dirty
*/
@ -2240,7 +2240,7 @@ void SetSelectionRed(bool b)
*/
static bool CheckClickOnViewportSign(const Viewport &vp, int x, int y, const ViewportSign *sign)
{
bool small = (vp.zoom >= ZOOM_LVL_OUT_4X);
bool small = (vp.zoom >= ZoomLevel::Out4x);
int sign_half_width = ScaleByZoom((small ? sign->width_small : sign->width_normal) / 2, vp.zoom);
int sign_height = ScaleByZoom(WidgetDimensions::scaled.fullbevel.top + GetCharacterHeight(small ? FS_SMALL : FS_NORMAL) + WidgetDimensions::scaled.fullbevel.bottom, vp.zoom);

View File

@ -57,7 +57,7 @@ public:
this->InitNested(window_number);
NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_EV_VIEWPORT);
nvp->InitializeViewport(this, tile, ScaleZoomGUI(ZOOM_LVL_VIEWPORT));
nvp->InitializeViewport(this, tile, ScaleZoomGUI(ZoomLevel::Viewport));
if (_settings_client.gui.zoom_min == viewport->zoom) this->DisableWidget(WID_EV_ZOOM_IN);
}

View File

@ -53,7 +53,7 @@ struct ViewportSign {
auto operator<=>(const ViewportSign &) const = default;
void UpdatePosition(int center, int top, std::string_view str, std::string_view str_small = {});
void MarkDirty(ZoomLevel maxzoom = ZOOM_LVL_MAX) const;
void MarkDirty(ZoomLevel maxzoom = ZoomLevel::Max) const;
};
/** Specialised ViewportSign that tracks whether it is valid for entering into a Kdtree */

View File

@ -97,7 +97,7 @@ public:
this->flags.Set(WindowFlag::DisableVpScroll);
NWidgetViewport *nvp = this->GetWidget<NWidgetViewport>(WID_W_VIEWPORT);
nvp->InitializeViewport(this, this->GetCenterTile(), ScaleZoomGUI(ZOOM_LVL_VIEWPORT));
nvp->InitializeViewport(this, this->GetCenterTile(), ScaleZoomGUI(ZoomLevel::Viewport));
this->OnInvalidateData(0);
}

View File

@ -68,7 +68,7 @@ static inline Dimension ScaleGUITrad(const Dimension &dim)
Dimension GetScaledSpriteSize(SpriteID sprid)
{
Point offset;
Dimension d = GetSpriteSize(sprid, &offset, ZOOM_LVL_NORMAL);
Dimension d = GetSpriteSize(sprid, &offset, ZoomLevel::Normal);
d.width -= offset.x;
d.height -= offset.y;
return ScaleGUITrad(d);
@ -3443,7 +3443,7 @@ std::unique_ptr<NWidgetBase> MakeCompanyButtonRows(WidgetID widget_first, Widget
std::unique_ptr<NWidgetHorizontal> hor = nullptr; // Storage for buttons in one row.
int hor_length = 0;
Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZOOM_LVL_NORMAL);
Dimension sprite_size = GetSpriteSize(SPR_COMPANY_ICON, nullptr, ZoomLevel::Normal);
sprite_size.width += WidgetDimensions::unscaled.matrix.Horizontal();
sprite_size.height += WidgetDimensions::unscaled.matrix.Vertical();

View File

@ -37,8 +37,8 @@ enum SpriteAlignerWidgets : WidgetID {
WID_SA_PICKER, ///< Sprite picker.
WID_SA_LIST, ///< Queried sprite list.
WID_SA_SCROLLBAR, ///< Scrollbar for sprite list.
WID_SA_ZOOM, ///< Zoom level buttons (from ZOOM_LVL_BEGIN to ZOOM_LVL_END).
WID_SA_ZOOM_LAST = WID_SA_ZOOM + ZOOM_LVL_END - 1, ///< Marker for last zoom level button.
WID_SA_ZOOM, ///< Zoom level buttons (from ZoomLevel::Begin to ZoomLevel::Max).
WID_SA_ZOOM_LAST = WID_SA_ZOOM + to_underlying(ZoomLevel::Max), ///< Marker for last zoom level button.
WID_SA_RESET_REL, ///< Reset relative sprite offset
WID_SA_CENTRE, ///< Toggle centre sprite.
WID_SA_CROSSHAIR, ///< Toggle crosshair.

View File

@ -913,7 +913,7 @@ static void DrawOverlappedWindow(Window *w, int left, int top, int right, int bo
dp->top = top - w->top;
dp->pitch = _screen.pitch;
dp->dst_ptr = BlitterFactory::GetCurrentBlitter()->MoveTo(_screen.dst_ptr, left, top);
dp->zoom = ZOOM_LVL_MIN;
dp->zoom = ZoomLevel::Min;
w->OnPaint();
}

View File

@ -13,7 +13,7 @@
#include "zoom_type.h"
/**
* Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_MIN)
* Scale by zoom level, usually shift left (when zoom > ZoomLevel::Min)
* When shifting right, value is rounded up
* @param value value to shift
* @param zoom zoom level to shift to
@ -21,11 +21,11 @@
*/
inline int ScaleByZoom(int value, ZoomLevel zoom)
{
return value << zoom;
return value << to_underlying(zoom);
}
/**
* Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_MIN)
* Scale by zoom level, usually shift right (when zoom > ZoomLevel::Min)
* When shifting right, value is rounded up
* @param value value to shift
* @param zoom zoom level to shift to
@ -33,7 +33,7 @@ inline int ScaleByZoom(int value, ZoomLevel zoom)
*/
inline int UnScaleByZoom(int value, ZoomLevel zoom)
{
return (value + (1 << zoom) - 1) >> zoom;
return (value + (1 << to_underlying(zoom)) - 1) >> to_underlying(zoom);
}
/**
@ -44,34 +44,34 @@ inline int UnScaleByZoom(int value, ZoomLevel zoom)
*/
inline int AdjustByZoom(int value, int zoom)
{
return zoom < 0 ? UnScaleByZoom(value, ZoomLevel(-zoom)) : ScaleByZoom(value, ZoomLevel(zoom));
return zoom < 0 ? UnScaleByZoom(value, static_cast<ZoomLevel>(-zoom)) : ScaleByZoom(value, static_cast<ZoomLevel>(zoom));
}
/**
* Scale by zoom level, usually shift left (when zoom > ZOOM_LVL_MIN)
* Scale by zoom level, usually shift left (when zoom > ZoomLevel::Min)
* @param value value to shift
* @param zoom zoom level to shift to
* @return shifted value
*/
inline int ScaleByZoomLower(int value, ZoomLevel zoom)
{
return value << zoom;
return value << to_underlying(zoom);
}
/**
* Scale by zoom level, usually shift right (when zoom > ZOOM_LVL_MIN)
* Scale by zoom level, usually shift right (when zoom > ZoomLevel::Min)
* @param value value to shift
* @param zoom zoom level to shift to
* @return shifted value
*/
inline int UnScaleByZoomLower(int value, ZoomLevel zoom)
{
return value >> zoom;
return value >> to_underlying(zoom);
}
/**
* Short-hand to apply GUI zoom level.
* @param value Pixel amount at #ZOOM_LVL_MIN (full zoom in).
* @param value Pixel amount at #ZoomLevel::Min (full zoom in).
* @return Pixel amount at #ZOOM_LVL_GUI (current interface size).
*/
inline int UnScaleGUI(int value)
@ -86,7 +86,7 @@ inline int UnScaleGUI(int value)
*/
inline ZoomLevel ScaleZoomGUI(ZoomLevel value)
{
return std::clamp(value + (ZOOM_LVL_GUI - ZOOM_LVL_NORMAL), ZOOM_LVL_MIN, ZOOM_LVL_MAX);
return std::clamp(value + (ZOOM_LVL_GUI - ZoomLevel::Normal), ZoomLevel::Min, ZoomLevel::Max);
}
/**
@ -96,7 +96,7 @@ inline ZoomLevel ScaleZoomGUI(ZoomLevel value)
*/
inline ZoomLevel UnScaleZoomGUI(ZoomLevel value)
{
return std::clamp(value - (ZOOM_LVL_GUI - ZOOM_LVL_NORMAL), ZOOM_LVL_MIN, ZOOM_LVL_MAX);
return std::clamp(value - (ZOOM_LVL_GUI - ZoomLevel::Normal), ZoomLevel::Min, ZoomLevel::Max);
}
/**

View File

@ -13,39 +13,38 @@
#include "core/enum_type.hpp"
/** All zoom levels we know. */
enum ZoomLevel : uint8_t {
enum class ZoomLevel : uint8_t {
/* Our possible zoom-levels */
ZOOM_LVL_BEGIN = 0, ///< Begin for iteration.
ZOOM_LVL_IN_4X = 0, ///< Zoomed 4 times in.
ZOOM_LVL_IN_2X, ///< Zoomed 2 times in.
ZOOM_LVL_NORMAL, ///< The normal zoom level.
ZOOM_LVL_OUT_2X, ///< Zoomed 2 times out.
ZOOM_LVL_OUT_4X, ///< Zoomed 4 times out.
ZOOM_LVL_OUT_8X, ///< Zoomed 8 times out.
ZOOM_LVL_END, ///< End for iteration.
Begin = 0, ///< Begin for iteration.
Min = Begin, ///< Minimum zoom level.
In4x = Begin, ///< Zoomed 4 times in.
In2x, ///< Zoomed 2 times in.
Normal, ///< The normal zoom level.
Out2x, ///< Zoomed 2 times out.
Out4x, ///< Zoomed 4 times out.
Out8x, ///< Zoomed 8 times out.
Max = Out8x, ///< Maximum zoom level.
End, ///< End for iteration.
/* Here we define in which zoom viewports are */
ZOOM_LVL_VIEWPORT = ZOOM_LVL_NORMAL, ///< Default zoom level for viewports.
ZOOM_LVL_NEWS = ZOOM_LVL_NORMAL, ///< Default zoom level for the news messages.
ZOOM_LVL_INDUSTRY = ZOOM_LVL_OUT_2X, ///< Default zoom level for the industry view.
ZOOM_LVL_TOWN = ZOOM_LVL_NORMAL, ///< Default zoom level for the town view.
ZOOM_LVL_AIRCRAFT = ZOOM_LVL_NORMAL, ///< Default zoom level for the aircraft view.
ZOOM_LVL_SHIP = ZOOM_LVL_NORMAL, ///< Default zoom level for the ship view.
ZOOM_LVL_TRAIN = ZOOM_LVL_NORMAL, ///< Default zoom level for the train view.
ZOOM_LVL_ROADVEH = ZOOM_LVL_NORMAL, ///< Default zoom level for the road vehicle view.
ZOOM_LVL_WORLD_SCREENSHOT = ZOOM_LVL_NORMAL, ///< Default zoom level for the world screen shot.
Viewport = Normal, ///< Default zoom level for viewports.
News = Normal, ///< Default zoom level for the news messages.
Industry = Out2x, ///< Default zoom level for the industry view.
Town = Normal, ///< Default zoom level for the town view.
Aircraft = Normal, ///< Default zoom level for the aircraft view.
Ship = Normal, ///< Default zoom level for the ship view.
Train = Normal, ///< Default zoom level for the train view.
RoadVehicle = Normal, ///< Default zoom level for the road vehicle view.
WorldScreenshot = Normal, ///< Default zoom level for the world screen shot.
ZOOM_LVL_DETAIL = ZOOM_LVL_OUT_2X, ///< All zoom levels below or equal to this will result in details on the screen, like road-work, ...
ZOOM_LVL_TEXT_EFFECT = ZOOM_LVL_OUT_2X, ///< All zoom levels above this will not show text effects.
ZOOM_LVL_MIN = ZOOM_LVL_IN_4X, ///< Minimum zoom level.
ZOOM_LVL_MAX = ZOOM_LVL_OUT_8X, ///< Maximum zoom level.
Detail = Out2x, ///< All zoom levels below or equal to this will result in details on the screen, like road-work, ...
TextEffect = Out2x, ///< All zoom levels above this will not show text effects.
};
DECLARE_INCREMENT_DECREMENT_OPERATORS(ZoomLevel)
DECLARE_ENUM_AS_SEQUENTIAL(ZoomLevel)
using ZoomLevels = EnumBitSet<ZoomLevel, uint8_t>;
static uint const ZOOM_BASE_SHIFT = static_cast<uint>(ZOOM_LVL_NORMAL);
static const uint ZOOM_BASE_SHIFT = to_underlying(ZoomLevel::Normal);
static uint const ZOOM_BASE = 1U << ZOOM_BASE_SHIFT;
extern int _gui_scale;