From 712a4bb40b1f373f020445bbf9207020fbdd46d4 Mon Sep 17 00:00:00 2001 From: Peter Nelson Date: Wed, 20 Dec 2023 00:15:33 +0000 Subject: [PATCH] Fix: Prevent picker preview sprites from overflowing button bevel. --- src/dock_gui.cpp | 7 ++++--- src/object_gui.cpp | 14 ++++++++------ src/rail_gui.cpp | 41 ++++++++++++++++++++++++----------------- src/road_gui.cpp | 23 +++++++++++++---------- 4 files changed, 49 insertions(+), 36 deletions(-) diff --git a/src/dock_gui.cpp b/src/dock_gui.cpp index ba2d3c3cd5..3997fd74c6 100644 --- a/src/dock_gui.cpp +++ b/src/dock_gui.cpp @@ -549,10 +549,11 @@ public: case WID_BDD_Y: { Axis axis = widget == WID_BDD_X ? AXIS_X : AXIS_Y; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(96)) / 2; - int y = (r.Height() - ScaleSpriteTrad(64)) / 2; + int x = (ir.Width() - ScaleSpriteTrad(96)) / 2; + int y = (ir.Height() - ScaleSpriteTrad(64)) / 2; int x1 = ScaleSpriteTrad(63); int x2 = ScaleSpriteTrad(31); DrawShipDepotSprite(x + (axis == AXIS_X ? x1 : x2), y + ScaleSpriteTrad(17), axis, DEPOT_PART_NORTH); diff --git a/src/object_gui.cpp b/src/object_gui.cpp index facf30e18f..7e84be8c16 100644 --- a/src/object_gui.cpp +++ b/src/object_gui.cpp @@ -337,14 +337,15 @@ public: DrawPixelInfo tmp_dpi; /* Set up a clipping area for the preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); if (spec->grf_prop.grffile == nullptr) { extern const DrawTileSprites _objects[]; const DrawTileSprites *dts = &_objects[spec->grf_prop.local_id]; - DrawOrigTileSeqInGUI(r.Width() / 2 - 1, (r.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); + DrawOrigTileSeqInGUI(ir.Width() / 2 - 1, (ir.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); } else { - DrawNewObjectTileInGUI(r.Width() / 2 - 1, (r.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, GB(widget, 16, 16)); + DrawNewObjectTileInGUI(ir.Width() / 2 - 1, (ir.Height() + matrix_height / 2) / 2 - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, GB(widget, 16, 16)); } } break; @@ -362,14 +363,15 @@ public: } DrawPixelInfo tmp_dpi; /* Set up a clipping area for the preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); if (spec->grf_prop.grffile == nullptr) { extern const DrawTileSprites _objects[]; const DrawTileSprites *dts = &_objects[spec->grf_prop.local_id]; - DrawOrigTileSeqInGUI(r.Width() / 2 - 1, r.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); + DrawOrigTileSeqInGUI(ir.Width() / 2 - 1, ir.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), dts, PAL_NONE); } else { - DrawNewObjectTileInGUI(r.Width() / 2 - 1, r.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, + DrawNewObjectTileInGUI(ir.Width() / 2 - 1, ir.Height() - this->object_margin - ScaleSpriteTrad(TILE_PIXELS), spec, std::min(_selected_object_view, spec->views - 1)); } } diff --git a/src/rail_gui.cpp b/src/rail_gui.cpp index 328e3f0625..82e67da2ca 100644 --- a/src/rail_gui.cpp +++ b/src/rail_gui.cpp @@ -1241,29 +1241,33 @@ public: DrawPixelInfo tmp_dpi; switch (GB(widget, 0, 16)) { - case WID_BRAS_PLATFORM_DIR_X: + case WID_BRAS_PLATFORM_DIR_X: { /* Set up a clipping area for the '/' station preview */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); if (!DrawStationTile(x, y, _cur_railtype, AXIS_X, _railstation.station_class, _railstation.station_type)) { StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 2); } } break; + } - case WID_BRAS_PLATFORM_DIR_Y: + case WID_BRAS_PLATFORM_DIR_Y: { /* Set up a clipping area for the '\' station preview */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); if (!DrawStationTile(x, y, _cur_railtype, AXIS_Y, _railstation.station_class, _railstation.station_type)) { StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 3); } } break; + } case WID_BRAS_NEWST_LIST: { Rect ir = r.Shrink(WidgetDimensions::scaled.matrix); @@ -1290,10 +1294,11 @@ public: } /* Set up a clipping area for the station preview. */ - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); if (!DrawStationTile(x, y, _cur_railtype, _railstation.orientation, _railstation.station_class, type)) { StationPickerDrawSprite(x, y, STATION_RAIL, _cur_railtype, INVALID_ROADTYPE, 2 + _railstation.orientation); } @@ -1905,10 +1910,11 @@ struct BuildRailDepotWindow : public PickerWindowBase { if (!IsInsideMM(widget, WID_BRAD_DEPOT_NE, WID_BRAD_DEPOT_NW + 1)) return; DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); DrawTrainDepotSprite(x, y, widget - WID_BRAD_DEPOT_NE + DIAGDIR_NE, _cur_railtype); } } @@ -2095,10 +2101,11 @@ struct BuildRailWaypointWindow : PickerWindowBase { const StationSpec *statspec = this->waypoints->GetSpec(type); DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(58)) / 2 - ScaleSpriteTrad(31); DrawWaypointSprite(x, y, type, _cur_railtype); } diff --git a/src/road_gui.cpp b/src/road_gui.cpp index 4e53907026..cd00b7ad3e 100644 --- a/src/road_gui.cpp +++ b/src/road_gui.cpp @@ -1029,10 +1029,11 @@ struct BuildRoadDepotWindow : public PickerWindowBase { if (!IsInsideMM(widget, WID_BROD_DEPOT_NE, WID_BROD_DEPOT_NW + 1)) return; DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); DrawRoadDepotSprite(x, y, (DiagDirection)(widget - WID_BROD_DEPOT_NE + DIAGDIR_NE), _cur_roadtype); } } @@ -1417,13 +1418,14 @@ public: const RoadStopSpec *spec = RoadStopClass::Get(_roadstop_gui_settings.roadstop_class)->GetSpec(_roadstop_gui_settings.roadstop_type); bool disabled = (spec != nullptr && widget < WID_BROS_STATION_X && HasBit(spec->flags, RSF_DRIVE_THROUGH_ONLY)); DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); if (spec == nullptr || disabled) { StationPickerDrawSprite(x, y, st, INVALID_RAILTYPE, _cur_roadtype, widget - WID_BROS_STATION_NE); - if (disabled) GfxFillRect(1, 1, r.Width() - 1, r.Height() - 1, PC_BLACK, FILLRECT_CHECKER); + if (disabled) GfxFillRect(0, 0, ir.Width(), ir.Height(), PC_BLACK, FILLRECT_CHECKER); } else { DrawRoadStopTile(x, y, _cur_roadtype, spec, st, widget - WID_BROS_STATION_NE); } @@ -1459,10 +1461,11 @@ public: /* Set up a clipping area for the sprite preview. */ DrawPixelInfo tmp_dpi; - if (FillDrawPixelInfo(&tmp_dpi, r)) { + Rect ir = r.Shrink(WidgetDimensions::scaled.bevel); + if (FillDrawPixelInfo(&tmp_dpi, ir)) { AutoRestoreBackup dpi_backup(_cur_dpi, &tmp_dpi); - int x = (r.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); - int y = (r.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); + int x = (ir.Width() - ScaleSpriteTrad(64)) / 2 + ScaleSpriteTrad(31); + int y = (ir.Height() + ScaleSpriteTrad(48)) / 2 - ScaleSpriteTrad(31); if (spec == nullptr) { StationPickerDrawSprite(x, y, st, INVALID_RAILTYPE, _cur_roadtype, _roadstop_gui_settings.orientation); } else {