diff --git a/src/company_gui.cpp b/src/company_gui.cpp index 1c10edabcb..e9bf2c045d 100644 --- a/src/company_gui.cpp +++ b/src/company_gui.cpp @@ -37,6 +37,7 @@ #include "station_func.h" #include "zoom_func.h" #include "sortlist_type.h" +#include "core/backup_type.hpp" #include "widgets/company_widget.h" @@ -2087,8 +2088,7 @@ struct CompanyInfrastructureWindow : Window DrawPixelInfo tmp_dpi; if (!FillDrawPixelInfo(&tmp_dpi, r.left, r.top, width + 1, r.bottom - r.top + 1)) return; - DrawPixelInfo *old_dpi = _cur_dpi; - _cur_dpi = &tmp_dpi; + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int y = -this->vscroll->GetPosition(); @@ -2198,9 +2198,6 @@ struct CompanyInfrastructureWindow : Window break; } } - - /* Restore clipping region. */ - _cur_dpi = old_dpi; } virtual void OnResize() override diff --git a/src/departures_gui.cpp b/src/departures_gui.cpp index 563369ec35..b31932d210 100644 --- a/src/departures_gui.cpp +++ b/src/departures_gui.cpp @@ -33,6 +33,7 @@ #include "departures_func.h" #include "cargotype.h" #include "zoom_func.h" +#include "core/backup_type.hpp" #include "table/sprites.h" #include "table/strings.h" @@ -1001,8 +1002,7 @@ void DeparturesWindow::DrawDeparturesListItems(const Rect &r) const y += this->entry_height; continue; } - DrawPixelInfo *old_dpi = _cur_dpi; - _cur_dpi = &tmp_dpi; + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); /* The scrolling text starts out of view at the right of the screen and finishes when it is out of view at the left of the screen. */ int pos = ltr @@ -1011,8 +1011,6 @@ void DeparturesWindow::DrawDeparturesListItems(const Rect &r) const ltr ? DrawString( pos, INT16_MAX, 0, buffer, TC_FROMSTRING, SA_LEFT | SA_FORCE) : DrawString(-INT16_MAX, pos, 0, buffer, TC_FROMSTRING, SA_RIGHT | SA_FORCE); - - _cur_dpi = old_dpi; } y += this->entry_height; diff --git a/src/gfx.cpp b/src/gfx.cpp index 85b59c192b..1db7f632a9 100644 --- a/src/gfx.cpp +++ b/src/gfx.cpp @@ -1752,9 +1752,8 @@ void DrawDirtyBlocks() cleared_overlays = true; }; - DrawPixelInfo *old_dpi = _cur_dpi; DrawPixelInfo bk; - _cur_dpi = &bk; + Backup dpi_backup(_cur_dpi, &bk, FILE_LINE); for (Window *w : Window::IterateFromBack()) { w->flags &= ~WF_DRAG_DIRTIED; @@ -1899,7 +1898,7 @@ void DrawDirtyBlocks() } } - _cur_dpi = old_dpi; + dpi_backup.Restore(); for (const Rect &r : _dirty_blocks) { RedrawScreenRect(r.left, r.top, r.right, r.bottom); diff --git a/src/order_gui.cpp b/src/order_gui.cpp index 4c4045a0ca..55df43b403 100644 --- a/src/order_gui.cpp +++ b/src/order_gui.cpp @@ -34,6 +34,7 @@ #include "error.h" #include "tracerestrict.h" #include "scope.h" +#include "core/backup_type.hpp" #include "widgets/order_widget.h" @@ -1171,12 +1172,9 @@ void DrawOrderString(const Vehicle *v, const Order *order, int order_index, int Dimension lock_d = GetSpriteSize(SPR_LOCK); DrawPixelInfo tmp_dpi; if (FillDrawPixelInfo(&tmp_dpi, rtl ? left : middle, y, rtl ? middle - left : right - middle, lock_d.height)) { - DrawPixelInfo *old_dpi = _cur_dpi; - _cur_dpi = &tmp_dpi; + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); DrawSprite(SPR_LOCK, PAL_NONE, rtl ? edge - 3 - lock_d.width - left : edge + 3 - middle, 0); - - _cur_dpi = old_dpi; } } } diff --git a/src/smallmap_gui.cpp b/src/smallmap_gui.cpp index 38fca6a8d7..63a6a8104c 100644 --- a/src/smallmap_gui.cpp +++ b/src/smallmap_gui.cpp @@ -1699,20 +1699,17 @@ void SmallMapWindow::TakeScreenshot() */ void SmallMapWindow::ScreenshotCallbackHandler(void *buf, uint y, uint pitch, uint n) { - DrawPixelInfo dpi, *old_dpi; + DrawPixelInfo dpi; + AutoRestoreBackup dpi_backup(_cur_dpi, &dpi); /* We are no longer rendering to the screen */ - DrawPixelInfo old_screen = _screen; - bool old_disable_anim = _screen_disable_anim; + AutoRestoreBackup screen_backup(_screen, AutoRestoreBackupNoNewValueTag{}); + AutoRestoreBackup screen_disable_anim_backup(_screen_disable_anim, true); _screen.dst_ptr = buf; _screen.width = pitch; _screen.height = n; _screen.pitch = pitch; - _screen_disable_anim = true; - - old_dpi = _cur_dpi; - _cur_dpi = &dpi; dpi.dst_ptr = buf; dpi.height = n; @@ -1728,12 +1725,6 @@ void SmallMapWindow::ScreenshotCallbackHandler(void *buf, uint y, uint pitch, ui /* make the screenshot */ this->DrawSmallMap(&dpi, false); - - _cur_dpi = old_dpi; - - /* Switch back to rendering to the screen */ - _screen = old_screen; - _screen_disable_anim = old_disable_anim; } SmallMapWindow::SmallMapType SmallMapWindow::map_type = SMT_CONTOUR; diff --git a/src/tbtr_template_gui_create.cpp b/src/tbtr_template_gui_create.cpp index 031eec9368..fd0a8df219 100644 --- a/src/tbtr_template_gui_create.cpp +++ b/src/tbtr_template_gui_create.cpp @@ -40,6 +40,7 @@ #include "company_base.h" #include "train.h" #include "newgrf_debug.h" +#include "core/backup_type.hpp" #include "tbtr_template_gui_create.h" #include "tbtr_template_vehicle.h" @@ -298,12 +299,11 @@ public: } case TCW_INFO_PANEL: { if (this->virtual_train) { - DrawPixelInfo tmp_dpi, *old_dpi; + DrawPixelInfo tmp_dpi; if (!FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.right - r.left, r.bottom - r.top)) break; - old_dpi = _cur_dpi; - _cur_dpi = &tmp_dpi; + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); int y = ScaleGUITrad(4) - this->vscroll->GetPosition(); bool buildable = true; @@ -380,8 +380,6 @@ public: y += FONT_HEIGHT_NORMAL; } } - - _cur_dpi = old_dpi; } break; } diff --git a/src/tbtr_template_gui_main.cpp b/src/tbtr_template_gui_main.cpp index 59d1ee10ac..5922f2f912 100644 --- a/src/tbtr_template_gui_main.cpp +++ b/src/tbtr_template_gui_main.cpp @@ -28,6 +28,7 @@ #include "network/network.h" #include "zoom_func.h" #include "textbuf_gui.h" +#include "core/backup_type.hpp" #include "table/sprites.h" #include "table/strings.h" @@ -769,14 +770,13 @@ public: return; } - DrawPixelInfo tmp_dpi, *old_dpi; + DrawPixelInfo tmp_dpi; if (!FillDrawPixelInfo(&tmp_dpi, r.left, r.top, r.right - r.left, r.bottom - r.top)) { return; } - old_dpi = _cur_dpi; - _cur_dpi = &tmp_dpi; + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); const TemplateVehicle *tmp = this->templates[this->selected_template_index]; @@ -840,8 +840,6 @@ public: } } } - - _cur_dpi = old_dpi; } void UpdateButtonState() diff --git a/src/tbtr_template_vehicle_func.cpp b/src/tbtr_template_vehicle_func.cpp index 1604ecb5a6..3472743df8 100644 --- a/src/tbtr_template_vehicle_func.cpp +++ b/src/tbtr_template_vehicle_func.cpp @@ -124,14 +124,13 @@ void DrawTemplate(const TemplateVehicle *tv, int left, int right, int y, int hei { if (!tv) return; - DrawPixelInfo tmp_dpi, *old_dpi; + DrawPixelInfo tmp_dpi; int max_width = right - left + 1; int veh_height = ScaleSpriteTrad(14); int padding = height - veh_height; if (!FillDrawPixelInfo(&tmp_dpi, left, y + (padding / 2), max_width, height)) return; - old_dpi = _cur_dpi; - _cur_dpi = &tmp_dpi; + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); const TemplateVehicle *t = tv; int offset = 0; @@ -142,8 +141,6 @@ void DrawTemplate(const TemplateVehicle *tv, int left, int right, int y, int hei offset += t->image_dimensions.GetDisplayImageWidth(); t = t->Next(); } - - _cur_dpi = old_dpi; } // copy important stuff from the virtual vehicle to the template diff --git a/src/timetable_gui.cpp b/src/timetable_gui.cpp index ec246bb926..38ab06a0b6 100644 --- a/src/timetable_gui.cpp +++ b/src/timetable_gui.cpp @@ -26,6 +26,7 @@ #include "schdispatch.h" #include "vehiclelist.h" #include "tracerestrict.h" +#include "core/backup_type.hpp" #include "widgets/timetable_widget.h" @@ -723,12 +724,9 @@ struct TimetableWindow : GeneralVehicleWindow { Dimension lock_d = GetSpriteSize(SPR_LOCK); DrawPixelInfo tmp_dpi; if (FillDrawPixelInfo(&tmp_dpi, rtl ? tr.left : middle, tr.top, rtl ? middle : tr.right, lock_d.height)) { - DrawPixelInfo *old_dpi = _cur_dpi; - _cur_dpi = &tmp_dpi; + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); DrawSprite(SPR_LOCK, PAL_NONE, rtl ? edge - 3 - lock_d.width - tr.left : edge + 3 - middle, 0); - - _cur_dpi = old_dpi; } } diff --git a/src/town_cmd.cpp b/src/town_cmd.cpp index e3ea6458dc..478e4767e2 100644 --- a/src/town_cmd.cpp +++ b/src/town_cmd.cpp @@ -367,8 +367,7 @@ void DrawHouseImage(HouseID house_id, int left, int top, int right, int bottom) { DrawPixelInfo tmp_dpi; if (!FillDrawPixelInfo(&tmp_dpi, left, top, right - left + 1, bottom - top + 1)) return; - DrawPixelInfo *old_dpi = _cur_dpi; - _cur_dpi = &tmp_dpi; + AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); const HouseSpec *hs = HouseSpec::Get(house_id); @@ -412,8 +411,6 @@ void DrawHouseImage(HouseID house_id, int left, int top, int right, int bottom) } if (!ground) break; } - - _cur_dpi = old_dpi; } static int GetSlopePixelZ_Town(TileIndex tile, uint x, uint y) diff --git a/src/viewport.cpp b/src/viewport.cpp index f0e055aa08..a0d32b937f 100644 --- a/src/viewport.cpp +++ b/src/viewport.cpp @@ -115,6 +115,7 @@ #include "tracerestrict.h" #include "worker_thread.h" #include "vehiclelist.h" +#include "core/backup_type.hpp" #include #include @@ -2482,10 +2483,9 @@ static inline void DrawRouteStep(const Viewport * const vp, const TileIndex tile DrawSprite(SetBit(s, PALETTE_MODIFIER_TRANSPARENT), PALETTE_TO_TRANSPARENT, _cur_dpi->left + x_bottom_spr, _cur_dpi->top + y2); /* Fill with the data. */ - DrawPixelInfo *old_dpi = _cur_dpi; y2 = y + _vp_route_step_height_top; DrawPixelInfo dpi_for_text = _vdd->MakeDPIForText(); - _cur_dpi = &dpi_for_text; + AutoRestoreBackup dpi_backup(_cur_dpi, &dpi_for_text); const int x_str = x_centre - (str_width / 2); if (list.size() > max_rank_order_type_count) { @@ -2521,7 +2521,6 @@ static inline void DrawRouteStep(const Viewport * const vp, const TileIndex tile } } } - _cur_dpi = old_dpi; } static bool ViewportPrepareVehicleRouteSteps(const Vehicle * const veh) @@ -3325,9 +3324,8 @@ static void ViewportMapDrawScrollingViewportBox(const Viewport * const vp) static void ViewportMapDrawSelection(const Viewport * const vp) { - DrawPixelInfo *old_dpi = _cur_dpi; DrawPixelInfo dpi_for_text = _vdd->MakeDPIForText(); - _cur_dpi = &dpi_for_text; + AutoRestoreBackup dpi_backup(_cur_dpi, &dpi_for_text); auto draw_line = [&](Point from_pt, Point to_pt) { GfxDrawLine(from_pt.x, from_pt.y, to_pt.x, to_pt.y, PC_WHITE, 2, 0); @@ -3368,8 +3366,6 @@ static void ViewportMapDrawSelection(const Viewport * const vp) } else { draw_line(start_pt, end_pt); } - - _cur_dpi = old_dpi; } template @@ -3627,9 +3623,6 @@ void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint _spare_viewport_drawers.pop_back(); } - DrawPixelInfo *old_dpi = _cur_dpi; - _cur_dpi = &_vdd->dpi; - _vdd->display_flags = display_flags; _vdd->transparency_opt = _transparency_opt; _vdd->invisibility_opt = _invisibility_opt; @@ -3643,7 +3636,7 @@ void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint _vdd->dpi.height = (bottom - top) & mask; _vdd->dpi.left = left & mask; _vdd->dpi.top = top & mask; - _vdd->dpi.pitch = old_dpi->pitch; + _vdd->dpi.pitch = _cur_dpi->pitch; _vd.last_child = nullptr; _vdd->offset_x = UnScaleByZoomLower(_vdd->dpi.left - (vp->virtual_left & mask), vp->zoom); @@ -3651,7 +3644,9 @@ void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint int x = _vdd->offset_x + vp->left; int y = _vdd->offset_y + vp->top; - _vdd->dpi.dst_ptr = BlitterFactory::GetCurrentBlitter()->MoveTo(old_dpi->dst_ptr, x - old_dpi->left, y - old_dpi->top); + _vdd->dpi.dst_ptr = BlitterFactory::GetCurrentBlitter()->MoveTo(_cur_dpi->dst_ptr, x - _cur_dpi->left, y - _cur_dpi->top); + + AutoRestoreBackup dpi_backup(_cur_dpi, &_vdd->dpi); if (vp->overlay != nullptr && vp->overlay->GetCargoMask() != 0 && vp->overlay->GetCompanyMask() != 0) { vp->overlay->PrepareDraw(); @@ -3698,8 +3693,6 @@ void ViewportDoDraw(Viewport *vp, int left, int top, int right, int bottom, uint }, vp, _vdd.release()); } } - - _cur_dpi = old_dpi; } /* This is run in a worker thread */ @@ -3776,9 +3769,10 @@ void ViewportDoDrawProcessAllPending() _viewport_drawer_returns.pop_back(); lk.unlock(); - DrawPixelInfo *old_dpi = _cur_dpi; - ViewportDoDrawPhase3(vp); - _cur_dpi = old_dpi; + { + AutoRestoreBackup dpi_backup(_cur_dpi, AutoRestoreBackupNoNewValueTag{}); + ViewportDoDrawPhase3(vp); + } _viewport_drawer_jobs--; if (_viewport_drawer_jobs == 0) return;