[MSPAINT] Don't show error message twice (#5715)
authorKatayama Hirofumi MZ <katayama.hirofumi.mz@gmail.com>
Fri, 22 Sep 2023 01:48:13 +0000 (10:48 +0900)
committerGitHub <noreply@github.com>
Fri, 22 Sep 2023 01:48:13 +0000 (10:48 +0900)
- Reduce display of error message on IDM_EDITCOPYTO and IDM_EDITPASTEFROM.
- Introduce LockBitmap/UnlockBitmap mechanism for ImageModel and SelectionModel.
CORE-19181, CORE-19182

base/applications/mspaint/history.cpp
base/applications/mspaint/history.h
base/applications/mspaint/main.cpp
base/applications/mspaint/selectionmodel.cpp
base/applications/mspaint/selectionmodel.h
base/applications/mspaint/winproc.cpp

index 4451b06..e44eca7 100644 (file)
@@ -261,27 +261,41 @@ void ImageModel::Clamp(POINT& pt) const
 
 HBITMAP ImageModel::CopyBitmap()
 {
-    // NOTE: An app cannot select a bitmap into more than one device context at a time.
-    ::SelectObject(m_hDrawingDC, m_hbmOld); // De-select
-    HBITMAP ret = CopyDIBImage(m_hBms[m_currInd]);
-    m_hbmOld = ::SelectObject(m_hDrawingDC, m_hBms[m_currInd]); // Re-select
+    HBITMAP hBitmap = LockBitmap();
+    HBITMAP ret = CopyDIBImage(hBitmap);
+    UnlockBitmap(hBitmap);
     return ret;
 }
 
 BOOL ImageModel::IsBlackAndWhite()
 {
-    ::SelectObject(m_hDrawingDC, m_hbmOld); // De-select
-    BOOL bBlackAndWhite = IsBitmapBlackAndWhite(m_hBms[m_currInd]);
-    m_hbmOld = ::SelectObject(m_hDrawingDC, m_hBms[m_currInd]); // Re-select
+    HBITMAP hBitmap = LockBitmap();
+    BOOL bBlackAndWhite = IsBitmapBlackAndWhite(hBitmap);
+    UnlockBitmap(hBitmap);
     return bBlackAndWhite;
 }
 
 void ImageModel::PushBlackAndWhite()
 {
-    ::SelectObject(m_hDrawingDC, m_hbmOld); // De-select
-    HBITMAP hNewBitmap = ConvertToBlackAndWhite(m_hBms[m_currInd]);
-    m_hbmOld = ::SelectObject(m_hDrawingDC, m_hBms[m_currInd]); // Re-select
+    HBITMAP hBitmap = LockBitmap();
+    HBITMAP hNewBitmap = ConvertToBlackAndWhite(hBitmap);
+    UnlockBitmap(hBitmap);
 
     if (hNewBitmap)
         PushImageForUndo(hNewBitmap);
 }
+
+HBITMAP ImageModel::LockBitmap()
+{
+    // NOTE: An app cannot select a bitmap into more than one device context at a time.
+    ::SelectObject(m_hDrawingDC, m_hbmOld); // De-select
+    HBITMAP hbmLocked = m_hBms[m_currInd];
+    m_hBms[m_currInd] = NULL;
+    return hbmLocked;
+}
+
+void ImageModel::UnlockBitmap(HBITMAP hbmLocked)
+{
+    m_hBms[m_currInd] = hbmLocked;
+    m_hbmOld = ::SelectObject(m_hDrawingDC, hbmLocked); // Re-select
+}
index 5bee410..fb369df 100644 (file)
@@ -31,6 +31,8 @@ public:
     int GetWidth() const;
     int GetHeight() const;
     HBITMAP CopyBitmap();
+    HBITMAP LockBitmap();
+    void UnlockBitmap(HBITMAP hbmLocked);
     void InvertColors();
     void FlipHorizontally();
     void FlipVertically();
index ba7ad18..dda9db7 100644 (file)
@@ -117,9 +117,9 @@ BOOL OpenMailer(HWND hWnd, LPCWSTR pszPathName)
             strFileTitle += L".png";
 
             // Save it to the temporary file
-            HBITMAP hbm = imageModel.CopyBitmap();
-            BOOL ret = SaveDIBToFile(hbm, g_szMailTempFile, FALSE, Gdiplus::ImageFormatPNG);
-            ::DeleteObject(hbm);
+            HBITMAP hbmLocked = imageModel.LockBitmap();
+            BOOL ret = SaveDIBToFile(hbmLocked, g_szMailTempFile, FALSE, Gdiplus::ImageFormatPNG);
+            imageModel.UnlockBitmap(hbmLocked);
             if (!ret)
             {
                 g_szMailTempFile[0] = UNICODE_NULL;
index a5e81d5..b46a722 100644 (file)
@@ -528,3 +528,15 @@ void SelectionModel::SwapWidthAndHeight()
     m_rc.right = m_rc.left + cy;
     m_rc.bottom = m_rc.top + cx;
 }
+
+HBITMAP SelectionModel::LockBitmap()
+{
+    HBITMAP hbm = m_hbmColor;
+    m_hbmColor = NULL;
+    return hbm;
+}
+
+void SelectionModel::UnlockBitmap(HBITMAP hbmLocked)
+{
+    m_hbmColor = hbmLocked;
+}
index b47a0d4..febc607 100644 (file)
@@ -40,6 +40,8 @@ public:
     void DeleteSelection();
 
     HBITMAP CopyBitmap();
+    HBITMAP LockBitmap();
+    void UnlockBitmap(HBITMAP hbmLocked);
     void GetSelectionContents(HDC hDCImage);
     void DrawFramePoly(HDC hDCImage);
     void DrawBackground(HDC hDCImage);
index 8f9e0ca..130c81e 100644 (file)
@@ -741,13 +741,13 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
             selectionModel.TakeOff();
 
             {
-                HBITMAP hbm = selectionModel.CopyBitmap();
-                if (hbm)
+                HBITMAP hbmLocked = selectionModel.LockBitmap();
+                if (hbmLocked)
                 {
-                    HGLOBAL hGlobal = BitmapToClipboardDIB(hbm);
+                    HGLOBAL hGlobal = BitmapToClipboardDIB(hbmLocked);
                     if (hGlobal)
                         ::SetClipboardData(CF_DIB, hGlobal);
-                    ::DeleteObject(hbm);
+                    selectionModel.UnlockBitmap(hbmLocked);
                 }
             }
 
@@ -865,10 +865,9 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
             WCHAR szFileName[MAX_LONG_PATH] = L"*.png";
             if (GetSaveFileName(szFileName, _countof(szFileName)))
             {
-                HBITMAP hbm = selectionModel.CopyBitmap();
-                if (!SaveDIBToFile(hbm, szFileName, FALSE))
-                    ShowError(IDS_SAVEERROR, szFileName);
-                ::DeleteObject(hbm);
+                HBITMAP hbmLocked = selectionModel.LockBitmap();
+                SaveDIBToFile(hbmLocked, szFileName, FALSE);
+                selectionModel.UnlockBitmap(hbmLocked);
             }
             break;
         }
@@ -880,8 +879,6 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
                 HBITMAP hbmNew = DoLoadImageFile(m_hWnd, szFileName, FALSE);
                 if (hbmNew)
                     InsertSelectionFromHBITMAP(hbmNew, m_hWnd);
-                else
-                    ShowError(IDS_LOADERRORTEXT, szFileName);
             }
             break;
         }
@@ -1008,7 +1005,6 @@ LRESULT CMainWindow::OnCommand(UINT nMsg, WPARAM wParam, LPARAM lParam, BOOL& bH
             imageModel.PushImageForUndo(selectionModel.CopyBitmap());
             selectionModel.HideSelection();
             break;
-
         case IDM_VIEWTOOLBOX:
             registrySettings.ShowToolBox = !toolBoxContainer.IsWindowVisible();
             toolBoxContainer.ShowWindow(registrySettings.ShowToolBox ? SW_SHOWNOACTIVATE : SW_HIDE);