/*
* 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
*/
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)
{
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)
{
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)
{
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;
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);
}