From 712d84e44e08a2d6d214427a83333e612813a523 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mart=C3=ADn=20Capello?= Date: Mon, 19 Aug 2024 18:07:40 -0300 Subject: [PATCH] Avoid div by zero by preventing entering/returning a grid bounds w/zero width/height (fix #4146, #4597) --- src/app/commands/cmd_grid.cpp | 10 ++++++++++ src/app/commands/cmd_options.cpp | 12 ++++++++++++ src/app/ui/expr_entry.cpp | 2 ++ src/app/ui/expr_entry.h | 3 +++ src/doc/sprite.cpp | 5 +++++ src/doc/sprite.h | 9 ++++++++- 6 files changed, 40 insertions(+), 1 deletion(-) diff --git a/src/app/commands/cmd_grid.cpp b/src/app/commands/cmd_grid.cpp index fad8eeaa8..bbe5a7754 100644 --- a/src/app/commands/cmd_grid.cpp +++ b/src/app/commands/cmd_grid.cpp @@ -114,6 +114,16 @@ void GridSettingsCommand::onExecute(Context* context) window.gridY()->setTextf("%d", bounds.y); window.gridW()->setTextf("%d", bounds.w); window.gridH()->setTextf("%d", bounds.h); + window.gridW()->Leave.connect([&window]{ + // Prevent entering a width lesser than 1 + if (window.gridW()->textInt() <= 0) + window.gridW()->setText("1"); + }); + window.gridH()->Leave.connect([&window]{ + // Prevent entering a height lesser than 1 + if (window.gridH()->textInt() <= 0) + window.gridH()->setText("1"); + }); window.openWindowInForeground(); if (window.closer() == window.ok()) { diff --git a/src/app/commands/cmd_options.cpp b/src/app/commands/cmd_options.cpp index 8db84fecf..90d07121e 100644 --- a/src/app/commands/cmd_options.cpp +++ b/src/app/commands/cmd_options.cpp @@ -320,6 +320,18 @@ public: } cursorColorType()->Change.connect([this]{ onCursorColorType(); }); + // Grid + gridW()->Leave.connect([this] { + // Prevent entering a width lesser than 1 + if (gridW()->textInt() <= 0) + gridW()->setText("1"); + }); + gridH()->Leave.connect([this] { + // Prevent entering a height lesser than 1 + if (gridH()->textInt() <= 0) + gridH()->setText("1"); + }); + // Brush preview brushPreview()->setSelectedItemIndex( (int)m_pref.cursor.brushPreview()); diff --git a/src/app/ui/expr_entry.cpp b/src/app/ui/expr_entry.cpp index 1889e252c..87652a128 100644 --- a/src/app/ui/expr_entry.cpp +++ b/src/app/ui/expr_entry.cpp @@ -35,6 +35,8 @@ bool ExprEntry::onProcessMessage(ui::Message* msg) onFormatExprFocusLeave(buf); if (text() != buf) setText(buf); + + Leave(); break; } } diff --git a/src/app/ui/expr_entry.h b/src/app/ui/expr_entry.h index 75e6219b3..38c58d644 100644 --- a/src/app/ui/expr_entry.h +++ b/src/app/ui/expr_entry.h @@ -20,6 +20,9 @@ namespace app { int decimals() const { return m_decimals; } void setDecimals(int decimals) { m_decimals = decimals; } + // Signals + obs::signal Leave; + protected: bool onProcessMessage(ui::Message* msg) override; void onChange() override; diff --git a/src/doc/sprite.cpp b/src/doc/sprite.cpp index 8ec340651..81842e2ea 100644 --- a/src/doc/sprite.cpp +++ b/src/doc/sprite.cpp @@ -49,6 +49,11 @@ gfx::Rect Sprite::DefaultGridBounds() void Sprite::SetDefaultGridBounds(const gfx::Rect& defGridBounds) { g_defaultGridBounds = defGridBounds; + // Prevent setting an empty grid bounds + if (g_defaultGridBounds.w <= 0) + g_defaultGridBounds.w = 1; + if (g_defaultGridBounds.h <= 0) + g_defaultGridBounds.h = 1; } // static diff --git a/src/doc/sprite.h b/src/doc/sprite.h index 6c7ea9de3..039cb833f 100644 --- a/src/doc/sprite.h +++ b/src/doc/sprite.h @@ -127,7 +127,14 @@ namespace doc { static void SetDefaultRgbMapAlgorithm(const RgbMapAlgorithm mapAlgo); const gfx::Rect& gridBounds() const { return m_gridBounds; } - void setGridBounds(const gfx::Rect& rc) { m_gridBounds = rc; } + void setGridBounds(const gfx::Rect& rc) { + m_gridBounds = rc; + // Prevent setting an empty grid bounds + if (m_gridBounds.w <= 0) + m_gridBounds.w = 1; + if (m_gridBounds.h <= 0) + m_gridBounds.h = 1; + } virtual int getMemSize() const override;