[MSPAINT] get rid of all _stprintf occurrences and the respective magic number sized...
[reactos.git] / reactos / base / applications / mspaint / dib.cpp
index ff506e8..de98fee 100644 (file)
@@ -1,7 +1,7 @@
 /*
  * PROJECT:     PAINT for ReactOS
  * LICENSE:     LGPL
- * FILE:        base/applications/mspaint_new/dib.cpp
+ * FILE:        base/applications/mspaint/dib.cpp
  * PURPOSE:     Some DIB related functions
  * PROGRAMMERS: Benedikt Freisen
  */
@@ -45,48 +45,17 @@ GetDIBHeight(HBITMAP hBitmap)
 void
 SaveDIBToFile(HBITMAP hBitmap, LPTSTR FileName, HDC hDC, LPSYSTEMTIME time, int *size, int hRes, int vRes)
 {
-    BITMAP bm;
-    HANDLE hFile;
-    BITMAPFILEHEADER bf;
-    BITMAPINFOHEADER bi;
-    int imgDataSize;
-    DWORD dwBytesWritten;
-    char *buffer;
-
-    GetObject(hBitmap, sizeof(BITMAP), &bm);
+    CImage img;
+    img.Attach(hBitmap);
+    img.Save(FileName);  // TODO: error handling
+    img.Detach();
 
-    ZeroMemory(&bf, sizeof(BITMAPFILEHEADER));
-    ZeroMemory(&bi, sizeof(BITMAPINFOHEADER));
-
-    imgDataSize = bm.bmWidthBytes * bm.bmHeight;
-    bf.bfType = 0x4d42;         /* BM */
-    bf.bfSize = imgDataSize + 52;
-    bf.bfOffBits = 54;
-    bi.biSize = sizeof(BITMAPINFOHEADER);
-    bi.biWidth = bm.bmWidth;
-    bi.biHeight = bm.bmHeight;
-    bi.biPlanes = bm.bmPlanes;
-    bi.biBitCount = bm.bmBitsPixel;
-    bi.biCompression = BI_RGB;
-    bi.biXPelsPerMeter = hRes;
-    bi.biYPelsPerMeter = vRes;
-
-    buffer = (char*) HeapAlloc(GetProcessHeap(), 0, imgDataSize);
-    if (!buffer)
-        return;
-
-    GetDIBits(hDC, hBitmap, 0, bm.bmHeight, buffer, (LPBITMAPINFO) & bi, DIB_RGB_COLORS);
+    // update time and size
 
-    hFile = CreateFile(FileName, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
+    HANDLE hFile =
+        CreateFile(FileName, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
     if (hFile == INVALID_HANDLE_VALUE)
-    {
-        HeapFree(GetProcessHeap(), 0, buffer);
         return;
-    }
-
-    WriteFile(hFile, &bf, sizeof(BITMAPFILEHEADER), &dwBytesWritten, NULL);
-    WriteFile(hFile, &bi, sizeof(BITMAPINFOHEADER), &dwBytesWritten, NULL);
-    WriteFile(hFile, buffer, imgDataSize, &dwBytesWritten, NULL);
 
     if (time)
     {
@@ -97,29 +66,25 @@ SaveDIBToFile(HBITMAP hBitmap, LPTSTR FileName, HDC hDC, LPSYSTEMTIME time, int
     if (size)
         *size = GetFileSize(hFile, NULL);
 
+    // TODO: update hRes and vRes
+
     CloseHandle(hFile);
-    HeapFree(GetProcessHeap(), 0, buffer);
 }
 
-void ShowFileLoadError(LPTSTR name)
+void ShowFileLoadError(LPCTSTR name)
 {
-    TCHAR programname[20];
-    TCHAR loaderrortext[100];
-    TCHAR temptext[500];
-    LoadString(hProgInstance, IDS_PROGRAMNAME, programname, SIZEOF(programname));
-    LoadString(hProgInstance, IDS_LOADERRORTEXT, loaderrortext, SIZEOF(loaderrortext));
-    _stprintf(temptext, loaderrortext, name);
-    mainWindow.MessageBox(temptext, programname, MB_OK | MB_ICONEXCLAMATION);
+    CString strText;
+    strText.Format(IDS_LOADERRORTEXT, (LPCTSTR) name);
+    CString strProgramName;
+    strProgramName.LoadString(IDS_PROGRAMNAME);
+    mainWindow.MessageBox(strText, strProgramName, MB_OK | MB_ICONEXCLAMATION);
 }
 
 void
-LoadDIBFromFile(HBITMAP * hBitmap, LPTSTR name, LPSYSTEMTIME time, int *size, int *hRes, int *vRes)
+LoadDIBFromFile(HBITMAP * hBitmap, LPCTSTR name, LPSYSTEMTIME time, int *size, int *hRes, int *vRes)
 {
-    BITMAPFILEHEADER bfh;
-    BITMAPINFO *bi;
-    PVOID pvBits;
-    DWORD dwBytesRead;
-    HANDLE hFile;
+    CImage img;
+    img.Load(name);  // TODO: error handling
 
     if (!hBitmap)
     {
@@ -127,7 +92,10 @@ LoadDIBFromFile(HBITMAP * hBitmap, LPTSTR name, LPSYSTEMTIME time, int *size, in
         return;
     }
 
-    hFile =
+    *hBitmap = img.Detach();
+
+    // update time and size
+    HANDLE hFile =
         CreateFile(name, GENERIC_READ, FILE_SHARE_READ, NULL, OPEN_EXISTING, FILE_FLAG_SEQUENTIAL_SCAN, NULL);
     if (hFile == INVALID_HANDLE_VALUE)
     {
@@ -135,15 +103,6 @@ LoadDIBFromFile(HBITMAP * hBitmap, LPTSTR name, LPSYSTEMTIME time, int *size, in
         return;
     }
 
-    /* read header and check for 'BM' magic */
-    ReadFile(hFile, &bfh, sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL);
-    if (bfh.bfType != 0x4d42)
-    {
-        CloseHandle(hFile);
-        ShowFileLoadError(name);
-        return;
-    }
-
     if (time)
     {
         FILETIME ft;
@@ -153,23 +112,7 @@ LoadDIBFromFile(HBITMAP * hBitmap, LPTSTR name, LPSYSTEMTIME time, int *size, in
     if (size)
         *size = GetFileSize(hFile, NULL);
 
-    bi = (BITMAPINFO*) HeapAlloc(GetProcessHeap(), 0, bfh.bfOffBits - sizeof(BITMAPFILEHEADER));
-    if (!bi)
-    {
-        CloseHandle(hFile);
-        ShowFileLoadError(name);
-        return;
-    }
-
-    ReadFile(hFile, bi, bfh.bfOffBits - sizeof(BITMAPFILEHEADER), &dwBytesRead, NULL);
-    *hBitmap = CreateDIBSection(NULL, bi, DIB_RGB_COLORS, &pvBits, NULL, 0);
-    ReadFile(hFile, pvBits, bfh.bfSize - bfh.bfOffBits, &dwBytesRead, NULL);
-
-    if (hRes)
-        *hRes = (*bi).bmiHeader.biXPelsPerMeter;
-    if (vRes)
-        *vRes = (*bi).bmiHeader.biYPelsPerMeter;
+    // TODO: update hRes and vRes
 
     CloseHandle(hFile);
-    HeapFree(GetProcessHeap(), 0, bi);
 }