https://git.reactos.org/?p=reactos.git;a=commitdiff;h=955048e50a79996e69baec...
commit 955048e50a79996e69baec6c6b9c495e5155db24 Author: Stanislav Motylkov x86corez@gmail.com AuthorDate: Sat Apr 14 15:42:34 2018 +0300 Commit: Benedikt Freisen b.freisen@gmx.net CommitDate: Mon Apr 23 20:11:43 2018 +0200
[MSPAINT] Fix crash on zoom out
- Check the denominator for zero for both zoomed width and height. - Do not allow to move zoom slider above possible position. - Move commonly used `zoomTo` function into new header file.
CORE-14539 --- base/applications/mspaint/common.h | 14 ++++++++++++++ base/applications/mspaint/imgarea.cpp | 3 --- base/applications/mspaint/precomp.h | 1 + base/applications/mspaint/toolsettings.cpp | 8 +++++--- base/applications/mspaint/winproc.cpp | 14 +++++++++++--- 5 files changed, 31 insertions(+), 9 deletions(-)
diff --git a/base/applications/mspaint/common.h b/base/applications/mspaint/common.h new file mode 100644 index 0000000000..45cde747b8 --- /dev/null +++ b/base/applications/mspaint/common.h @@ -0,0 +1,14 @@ +/* + * PROJECT: PAINT for ReactOS + * LICENSE: LGPL + * FILE: base/applications/mspaint/common.h + * PURPOSE: Commonly used functions + * PROGRAMMERS: Benedikt Freisen + * Stanislav Motylkov + */ + +#pragma once + +/* FUNCTIONS ********************************************************/ + +extern BOOL zoomTo(int, int, int); diff --git a/base/applications/mspaint/imgarea.cpp b/base/applications/mspaint/imgarea.cpp index dbf2035b2c..c9b1b3f49e 100644 --- a/base/applications/mspaint/imgarea.cpp +++ b/base/applications/mspaint/imgarea.cpp @@ -16,9 +16,6 @@
/* FUNCTIONS ********************************************************/
-extern void -zoomTo(int newZoom, int mouseX, int mouseY); - void updateCanvasAndScrollbars() { diff --git a/base/applications/mspaint/precomp.h b/base/applications/mspaint/precomp.h index 706da42349..f4720837ff 100644 --- a/base/applications/mspaint/precomp.h +++ b/base/applications/mspaint/precomp.h @@ -21,6 +21,7 @@ #include <shellapi.h> #include <htmlhelp.h>
+#include "common.h" #include "definitions.h" #include "drawing.h" #include "dib.h" diff --git a/base/applications/mspaint/toolsettings.cpp b/base/applications/mspaint/toolsettings.cpp index efc2a329dd..11cce8386d 100644 --- a/base/applications/mspaint/toolsettings.cpp +++ b/base/applications/mspaint/toolsettings.cpp @@ -4,6 +4,7 @@ * FILE: base/applications/mspaint/toolsettings.cpp * PURPOSE: Window procedure of the tool settings window * PROGRAMMERS: Benedikt Freisen + * Stanislav Motylkov */
/* INCLUDES *********************************************************/ @@ -12,8 +13,6 @@
/* FUNCTIONS ********************************************************/
-extern void zoomTo(int, int, int); - LRESULT CToolSettingsWindow::OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, WINBOOL& bHandled) { RECT trackbarZoomPos = {1, 1, 1 + 40, 1 + 64}; @@ -25,7 +24,10 @@ LRESULT CToolSettingsWindow::OnCreate(UINT nMsg, WPARAM wParam, LPARAM lParam, W
LRESULT CToolSettingsWindow::OnVScroll(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { - zoomTo(125 << trackbarZoom.SendMessage(TBM_GETPOS, 0, 0), 0, 0); + if (!zoomTo(125 << trackbarZoom.SendMessage(TBM_GETPOS, 0, 0), 0, 0)) + { + OnToolsModelZoomChanged(nMsg, wParam, lParam, bHandled); + } return 0; }
diff --git a/base/applications/mspaint/winproc.cpp b/base/applications/mspaint/winproc.cpp index f0b64c69a3..76d7e4e67f 100644 --- a/base/applications/mspaint/winproc.cpp +++ b/base/applications/mspaint/winproc.cpp @@ -6,6 +6,7 @@ * hPalWin, hToolSettings and hSelection * PROGRAMMERS: Benedikt Freisen * Katayama Hirofumi MZ + * Stanislav Motylkov */
/* INCLUDES *********************************************************/ @@ -16,7 +17,7 @@
/* FUNCTIONS ********************************************************/
-void +BOOL zoomTo(int newZoom, int mouseX, int mouseY) { RECT clientRectScrollbox; @@ -24,8 +25,14 @@ zoomTo(int newZoom, int mouseX, int mouseY) int x, y, w, h; scrollboxWindow.GetClientRect(&clientRectScrollbox); imageArea.GetClientRect(&clientRectImageArea); - w = clientRectImageArea.right * clientRectScrollbox.right / (clientRectImageArea.right * newZoom / toolsModel.GetZoom()); - h = clientRectImageArea.bottom * clientRectScrollbox.bottom / (clientRectImageArea.bottom * newZoom / toolsModel.GetZoom()); + w = clientRectImageArea.right * newZoom / toolsModel.GetZoom(); + h = clientRectImageArea.bottom * newZoom / toolsModel.GetZoom(); + if (!w || !h) + { + return FALSE; + } + w = clientRectImageArea.right * clientRectScrollbox.right / w; + h = clientRectImageArea.bottom * clientRectScrollbox.bottom / h; x = max(0, min(clientRectImageArea.right - w, mouseX - w / 2)) * newZoom / toolsModel.GetZoom(); y = max(0, min(clientRectImageArea.bottom - h, mouseY - h / 2)) * newZoom / toolsModel.GetZoom();
@@ -38,6 +45,7 @@ zoomTo(int newZoom, int mouseX, int mouseY)
scrollboxWindow.SendMessage(WM_HSCROLL, MAKEWPARAM(SB_THUMBPOSITION, x), 0); scrollboxWindow.SendMessage(WM_VSCROLL, MAKEWPARAM(SB_THUMBPOSITION, y), 0); + return TRUE; }
void CMainWindow::alignChildrenToMainWindow()