From c296dcfa29e7f32b623d8ed3e70604a06472fda2 Mon Sep 17 00:00:00 2001 From: Katayama Hirofumi MZ Date: Fri, 10 Jul 2026 16:31:25 +0900 Subject: [PATCH] [MSPAINT] Fix unzooming coordinate conversion (#9251) Always rounding of unzooming coordinate values had caused display glitch (e.g. black line on top edge in zooming). JIRA issue: CORE-19466 - Add bRound parameter to UnZoomed function. If bRound is TRUE, then do round by kernel32!MulDiv function. Otherwise don't round. - Add bRound parameter to CCanvasWindow::CanvasToImage. - Make bRound = FALSE default. - Use bRound = TRUE for CCanvasWindow::OnButtonDown, CCanvasWindow::OnButtonDblClk, CCanvasWindow::OnMouseMove, and CCanvasWindow::OnButtonUp. --- base/applications/mspaint/canvas.cpp | 18 +++++++++--------- base/applications/mspaint/canvas.h | 4 ++-- base/applications/mspaint/toolsmodel.h | 15 +++++++++------ 3 files changed, 20 insertions(+), 17 deletions(-) diff --git a/base/applications/mspaint/canvas.cpp b/base/applications/mspaint/canvas.cpp index d36b16090bd..89ab6eb2422 100644 --- a/base/applications/mspaint/canvas.cpp +++ b/base/applications/mspaint/canvas.cpp @@ -196,17 +196,17 @@ VOID CCanvasWindow::ImageToCanvas(RECT& rc) ::OffsetRect(&rc, GRIP_SIZE - GetScrollPos(SB_HORZ), GRIP_SIZE - GetScrollPos(SB_VERT)); } -VOID CCanvasWindow::CanvasToImage(POINT& pt) +VOID CCanvasWindow::CanvasToImage(POINT& pt, BOOL bRound) { pt.x -= GRIP_SIZE - GetScrollPos(SB_HORZ); pt.y -= GRIP_SIZE - GetScrollPos(SB_VERT); - UnZoomed(pt); + UnZoomed(pt, bRound); } -VOID CCanvasWindow::CanvasToImage(RECT& rc) +VOID CCanvasWindow::CanvasToImage(RECT& rc, BOOL bRound) { ::OffsetRect(&rc, GetScrollPos(SB_HORZ) - GRIP_SIZE, GetScrollPos(SB_VERT) - GRIP_SIZE); - UnZoomed(rc); + UnZoomed(rc, bRound); } VOID CCanvasWindow::GetImageRect(RECT& rc) @@ -475,7 +475,7 @@ LRESULT CCanvasWindow::OnButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO if (hitSelection != HIT_NONE) { m_drawing = TRUE; - CanvasToImage(pt); + CanvasToImage(pt, TRUE); SetCapture(); toolsModel.OnButtonDown(bLeftButton, pt.x, pt.y, FALSE); Invalidate(); @@ -507,7 +507,7 @@ LRESULT CCanvasWindow::OnButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO return 0; } - CanvasToImage(pt); + CanvasToImage(pt, TRUE); if (hit == HIT_INNER) { @@ -531,7 +531,7 @@ LRESULT CCanvasWindow::OnButtonDown(UINT nMsg, WPARAM wParam, LPARAM lParam, BOO LRESULT CCanvasWindow::OnButtonDblClk(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - CanvasToImage(pt); + CanvasToImage(pt, TRUE); m_drawing = FALSE; ::ReleaseCapture(); @@ -557,7 +557,7 @@ LRESULT CCanvasWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL return 0; } - CanvasToImage(pt); + CanvasToImage(pt, TRUE); if (toolsModel.GetActiveTool() == TOOL_ZOOM) Invalidate(); @@ -672,7 +672,7 @@ LRESULT CCanvasWindow::OnMouseMove(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL LRESULT CCanvasWindow::OnButtonUp(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled) { POINT pt = { GET_X_LPARAM(lParam), GET_Y_LPARAM(lParam) }; - CanvasToImage(pt); + CanvasToImage(pt, TRUE); ::ReleaseCapture(); diff --git a/base/applications/mspaint/canvas.h b/base/applications/mspaint/canvas.h index 17982805b04..778d227e44d 100644 --- a/base/applications/mspaint/canvas.h +++ b/base/applications/mspaint/canvas.h @@ -81,8 +81,8 @@ public: VOID ImageToCanvas(POINT& pt); VOID ImageToCanvas(RECT& rc); - VOID CanvasToImage(POINT& pt); - VOID CanvasToImage(RECT& rc); + VOID CanvasToImage(POINT& pt, BOOL bRound = FALSE); + VOID CanvasToImage(RECT& rc, BOOL bRound = FALSE); VOID GetImageRect(RECT& rc); VOID getNewZoomRect(CRect& rcView, INT newZoom, CPoint ptTarget); VOID zoomTo(INT newZoom, LONG left = 0, LONG top = 0); diff --git a/base/applications/mspaint/toolsmodel.h b/base/applications/mspaint/toolsmodel.h index d39f454d83a..4aea60daf3a 100644 --- a/base/applications/mspaint/toolsmodel.h +++ b/base/applications/mspaint/toolsmodel.h @@ -172,9 +172,11 @@ static inline int Zoomed(int xy) return MulDiv(xy, toolsModel.GetZoom(), DEFAULT_ZOOM); } -static inline int UnZoomed(int xy) +static inline int UnZoomed(int xy, BOOL bRound = FALSE) { - return MulDiv(xy, DEFAULT_ZOOM, toolsModel.GetZoom()); + if (bRound) + return MulDiv(xy, DEFAULT_ZOOM, toolsModel.GetZoom()); + return xy * DEFAULT_ZOOM / toolsModel.GetZoom(); } static inline void Zoomed(POINT& pt) @@ -187,12 +189,13 @@ static inline void Zoomed(RECT& rc) rc = { Zoomed(rc.left), Zoomed(rc.top), Zoomed(rc.right), Zoomed(rc.bottom) }; } -static inline void UnZoomed(POINT& pt) +static inline void UnZoomed(POINT& pt, BOOL bRound = FALSE) { - pt = { UnZoomed(pt.x), UnZoomed(pt.y) }; + pt = { UnZoomed(pt.x, bRound), UnZoomed(pt.y, bRound) }; } -static inline void UnZoomed(RECT& rc) +static inline void UnZoomed(RECT& rc, BOOL bRound = FALSE) { - rc = { UnZoomed(rc.left), UnZoomed(rc.top), UnZoomed(rc.right), UnZoomed(rc.bottom) }; + rc = { UnZoomed(rc.left, bRound), UnZoomed(rc.top, bRound), + UnZoomed(rc.right, bRound), UnZoomed(rc.bottom, bRound) }; }