https://git.reactos.org/?p=reactos.git;a=commitdiff;h=ab199cc147afab56d975d100ebbc5816e5993aed

commit ab199cc147afab56d975d100ebbc5816e5993aed
Author:     Katayama Hirofumi MZ <katayama.hirofumi...@gmail.com>
AuthorDate: Wed Oct 25 02:35:49 2023 +0900
Commit:     GitHub <nore...@github.com>
CommitDate: Wed Oct 25 02:35:49 2023 +0900

    [MSPAINT] Show out-of-memory message (#5817)
    
    - Improve ImageModel::PushImageForUndo.
    - Use FormatMessage in newly added
      ShowOutOfMemory function.
    - Call ShowOutOfMemory() when out of memory.
    CORE-19227, CORE-19094
---
 base/applications/mspaint/common.h    |  1 +
 base/applications/mspaint/dib.cpp     |  3 +++
 base/applications/mspaint/history.cpp | 31 +++++++++++++++++++++++++------
 base/applications/mspaint/history.h   |  3 ++-
 base/applications/mspaint/main.cpp    | 12 ++++++++++++
 5 files changed, 43 insertions(+), 7 deletions(-)

diff --git a/base/applications/mspaint/common.h 
b/base/applications/mspaint/common.h
index 3dda6703441..125a9cb53a6 100644
--- a/base/applications/mspaint/common.h
+++ b/base/applications/mspaint/common.h
@@ -43,6 +43,7 @@ enum HITTEST // hit
 
 /* FUNCTIONS ********************************************************/
 
+void ShowOutOfMemory(void);
 BOOL nearlyEqualPoints(INT x0, INT y0, INT x1, INT y1);
 BOOL OpenMailer(HWND hWnd, LPCWSTR pszPathName);
 
diff --git a/base/applications/mspaint/dib.cpp 
b/base/applications/mspaint/dib.cpp
index eede3325c55..2c13cc2f785 100644
--- a/base/applications/mspaint/dib.cpp
+++ b/base/applications/mspaint/dib.cpp
@@ -228,7 +228,10 @@ HBITMAP InitializeImage(LPCWSTR name, LPWIN32_FIND_DATAW 
pFound, BOOL isFile)
     COLORREF white = RGB(255, 255, 255);
     HBITMAP hBitmap = CreateColorDIB(registrySettings.BMPWidth, 
registrySettings.BMPHeight, white);
     if (hBitmap == NULL)
+    {
+        ShowOutOfMemory();
         return NULL;
+    }
 
     HDC hScreenDC = ::GetDC(NULL);
     g_xDpi = (float)::GetDeviceCaps(hScreenDC, LOGPIXELSX);
diff --git a/base/applications/mspaint/history.cpp 
b/base/applications/mspaint/history.cpp
index 2d28cb5def2..003d0ab5877 100644
--- a/base/applications/mspaint/history.cpp
+++ b/base/applications/mspaint/history.cpp
@@ -116,13 +116,31 @@ void ImageModel::ClearHistory()
     m_redoSteps = 0;
 }
 
+void ImageModel::PushImageForUndo()
+{
+    HBITMAP hbm = CopyBitmap();
+    if (hbm)
+    {
+        ShowOutOfMemory();
+        return;
+    }
+
+    PushImageForUndo(hbm);
+}
+
 void ImageModel::PushImageForUndo(HBITMAP hbm)
 {
     ATLTRACE("%s: %d\n", __FUNCTION__, m_currInd);
 
+    if (hbm == NULL)
+    {
+        ShowOutOfMemory();
+        return;
+    }
+
     // Go to the next item with an HBITMAP or current item
     ::DeleteObject(m_hBms[(m_currInd + 1) % HISTORYSIZE]);
-    m_hBms[(m_currInd + 1) % HISTORYSIZE] = (hbm ? hbm : 
CopyDIBImage(m_hBms[m_currInd]));
+    m_hBms[(m_currInd + 1) % HISTORYSIZE] = hbm;
     m_currInd = (m_currInd + 1) % HISTORYSIZE;
     ::SelectObject(m_hDrawingDC, m_hBms[m_currInd]);
 
@@ -145,7 +163,10 @@ void ImageModel::Crop(int nWidth, int nHeight, int 
nOffsetX, int nOffsetY)
     // Create an HBITMAP
     HBITMAP hbmCropped = CreateDIBWithProperties(nWidth, nHeight);
     if (!hbmCropped)
+    {
+        ShowOutOfMemory();
         return;
+    }
 
     // Select the HBITMAP by memory DC
     HDC hdcMem = ::CreateCompatibleDC(m_hDrawingDC);
@@ -251,8 +272,7 @@ void ImageModel::RotateNTimes90Degrees(int iN)
         case 3:
         {
             HBITMAP hbm = Rotate90DegreeBlt(m_hDrawingDC, GetWidth(), 
GetHeight(), iN == 1, FALSE);
-            if (hbm)
-                PushImageForUndo(hbm);
+            PushImageForUndo(hbm);
             break;
         }
         case 2:
@@ -294,8 +314,7 @@ void ImageModel::PushBlackAndWhite()
     HBITMAP hNewBitmap = ConvertToBlackAndWhite(hBitmap);
     UnlockBitmap(hBitmap);
 
-    if (hNewBitmap)
-        PushImageForUndo(hNewBitmap);
+    PushImageForUndo(hNewBitmap);
 }
 
 HBITMAP ImageModel::LockBitmap()
@@ -319,7 +338,7 @@ void ImageModel::SelectionClone(BOOL bUndoable)
         return;
 
     if (bUndoable)
-        PushImageForUndo(CopyBitmap());
+        PushImageForUndo();
 
     selectionModel.DrawSelection(m_hDrawingDC, paletteModel.GetBgColor(),
                                  toolsModel.IsBackgroundTransparent());
diff --git a/base/applications/mspaint/history.h 
b/base/applications/mspaint/history.h
index 24f1e09cd13..093dd1c34dd 100644
--- a/base/applications/mspaint/history.h
+++ b/base/applications/mspaint/history.h
@@ -19,7 +19,8 @@ public:
     HDC GetDC();
     BOOL CanUndo() const { return m_undoSteps > 0; }
     BOOL CanRedo() const { return m_redoSteps > 0; }
-    void PushImageForUndo(HBITMAP hbm = NULL);
+    void PushImageForUndo();
+    void PushImageForUndo(HBITMAP hbm);
     void ResetToPrevious(void);
     void Undo(BOOL bClearRedo = FALSE);
     void Redo(void);
diff --git a/base/applications/mspaint/main.cpp 
b/base/applications/mspaint/main.cpp
index ac1a037ddae..63db53f02de 100644
--- a/base/applications/mspaint/main.cpp
+++ b/base/applications/mspaint/main.cpp
@@ -22,6 +22,18 @@ CMainWindow mainWindow;
 
 /* FUNCTIONS ********************************************************/
 
+void ShowOutOfMemory(void)
+{
+    WCHAR szText[256];
+    ::FormatMessageW(FORMAT_MESSAGE_IGNORE_INSERTS | 
FORMAT_MESSAGE_FROM_SYSTEM,
+                     NULL,
+                     ERROR_OUTOFMEMORY,
+                     0,
+                     szText, _countof(szText),
+                     NULL);
+    mainWindow.MessageBox(szText, NULL, MB_ICONERROR);
+}
+
 // get file name extension from filter string
 static BOOL
 FileExtFromFilter(LPTSTR pExt, OPENFILENAME *pOFN)

Reply via email to