[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
This commit is contained in:
Stanislav Motylkov 2018-04-14 15:42:34 +03:00 committed by Benedikt Freisen
parent 065e70048d
commit 955048e50a
5 changed files with 31 additions and 9 deletions

View file

@ -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);

View file

@ -16,9 +16,6 @@
/* FUNCTIONS ********************************************************/
extern void
zoomTo(int newZoom, int mouseX, int mouseY);
void
updateCanvasAndScrollbars()
{

View file

@ -21,6 +21,7 @@
#include <shellapi.h>
#include <htmlhelp.h>
#include "common.h"
#include "definitions.h"
#include "drawing.h"
#include "dib.h"

View file

@ -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;
}

View file

@ -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()