mirror of
https://github.com/reactos/reactos.git
synced 2025-01-01 03:54:02 +00:00
7fe7f5e4c1
Show error message if SaveDIBToFile failed. CORE-16982, CORE-16979
210 lines
5.2 KiB
C++
210 lines
5.2 KiB
C++
/*
|
|
* PROJECT: PAINT for ReactOS
|
|
* LICENSE: LGPL
|
|
* FILE: base/applications/mspaint/dib.cpp
|
|
* PURPOSE: Some DIB related functions
|
|
* PROGRAMMERS: Benedikt Freisen
|
|
*/
|
|
|
|
/* INCLUDES *********************************************************/
|
|
|
|
#include "precomp.h"
|
|
|
|
/* FUNCTIONS ********************************************************/
|
|
|
|
HBITMAP
|
|
CreateDIBWithProperties(int width, int height)
|
|
{
|
|
BITMAPINFO bmi;
|
|
ZeroMemory(&bmi, sizeof(BITMAPINFO));
|
|
bmi.bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
|
|
bmi.bmiHeader.biWidth = width;
|
|
bmi.bmiHeader.biHeight = height;
|
|
bmi.bmiHeader.biPlanes = 1;
|
|
bmi.bmiHeader.biBitCount = 24;
|
|
bmi.bmiHeader.biCompression = BI_RGB;
|
|
return CreateDIBSection(NULL, &bmi, DIB_RGB_COLORS, NULL, NULL, 0);
|
|
}
|
|
|
|
HBITMAP
|
|
CreateColorDIB(int width, int height, COLORREF rgb)
|
|
{
|
|
HBITMAP ret = CreateDIBWithProperties(width, height);
|
|
if (!ret)
|
|
return NULL;
|
|
|
|
if (rgb)
|
|
{
|
|
HDC hdc = CreateCompatibleDC(NULL);
|
|
HGDIOBJ hbmOld = SelectObject(hdc, ret);
|
|
RECT rc;
|
|
SetRect(&rc, 0, 0, width, height);
|
|
HBRUSH hbr = CreateSolidBrush(rgb);
|
|
FillRect(hdc, &rc, hbr);
|
|
DeleteObject(hbr);
|
|
SelectObject(hdc, hbmOld);
|
|
DeleteDC(hdc);
|
|
}
|
|
|
|
return ret;
|
|
}
|
|
|
|
int
|
|
GetDIBWidth(HBITMAP hBitmap)
|
|
{
|
|
BITMAP bm;
|
|
GetObject(hBitmap, sizeof(BITMAP), &bm);
|
|
return bm.bmWidth;
|
|
}
|
|
|
|
int
|
|
GetDIBHeight(HBITMAP hBitmap)
|
|
{
|
|
BITMAP bm;
|
|
GetObject(hBitmap, sizeof(BITMAP), &bm);
|
|
return bm.bmHeight;
|
|
}
|
|
|
|
BOOL SaveDIBToFile(HBITMAP hBitmap, LPTSTR FileName, HDC hDC)
|
|
{
|
|
CImage img;
|
|
img.Attach(hBitmap);
|
|
img.Save(FileName); // TODO: error handling
|
|
img.Detach();
|
|
|
|
WIN32_FIND_DATA find;
|
|
HANDLE hFind = FindFirstFile(FileName, &find);
|
|
if (hFind == INVALID_HANDLE_VALUE)
|
|
{
|
|
ShowFileLoadError(FileName);
|
|
return FALSE;
|
|
}
|
|
FindClose(hFind);
|
|
|
|
// update time and size
|
|
FILETIME ft;
|
|
FileTimeToLocalFileTime(&find.ftLastWriteTime, &ft);
|
|
FileTimeToSystemTime(&ft, &fileTime);
|
|
fileSize = find.nFileSizeLow;
|
|
|
|
// TODO: update hRes and vRes
|
|
|
|
registrySettings.SetMostRecentFile(FileName);
|
|
|
|
isAFile = TRUE;
|
|
imageSaved = TRUE;
|
|
return TRUE;
|
|
}
|
|
|
|
void ShowFileLoadError(LPCTSTR name)
|
|
{
|
|
CString strText;
|
|
strText.Format(IDS_LOADERRORTEXT, (LPCTSTR) name);
|
|
CString strProgramName;
|
|
strProgramName.LoadString(IDS_PROGRAMNAME);
|
|
mainWindow.MessageBox(strText, strProgramName, MB_OK | MB_ICONEXCLAMATION);
|
|
}
|
|
|
|
HBITMAP SetBitmapAndInfo(HBITMAP hBitmap, LPCTSTR name, DWORD dwFileSize, BOOL isFile)
|
|
{
|
|
if (hBitmap == NULL)
|
|
{
|
|
COLORREF white = RGB(255, 255, 255);
|
|
hBitmap = CreateColorDIB(registrySettings.BMPWidth,
|
|
registrySettings.BMPHeight, white);
|
|
if (hBitmap == NULL)
|
|
return FALSE;
|
|
|
|
fileHPPM = fileVPPM = 2834;
|
|
ZeroMemory(&fileTime, sizeof(fileTime));
|
|
isFile = FALSE;
|
|
}
|
|
else
|
|
{
|
|
// update PPMs
|
|
HDC hScreenDC = GetDC(NULL);
|
|
fileHPPM = (int)(GetDeviceCaps(hScreenDC, LOGPIXELSX) * 1000 / 25.4);
|
|
fileVPPM = (int)(GetDeviceCaps(hScreenDC, LOGPIXELSY) * 1000 / 25.4);
|
|
ReleaseDC(NULL, hScreenDC);
|
|
}
|
|
|
|
// update image
|
|
imageModel.Insert(hBitmap);
|
|
imageModel.ClearHistory();
|
|
|
|
// update fileSize
|
|
fileSize = dwFileSize;
|
|
|
|
// update filepathname
|
|
if (name && name[0])
|
|
GetFullPathName(name, SIZEOF(filepathname), filepathname, NULL);
|
|
else
|
|
LoadString(hProgInstance, IDS_DEFAULTFILENAME, filepathname, SIZEOF(filepathname));
|
|
|
|
// set title
|
|
CString strTitle;
|
|
strTitle.Format(IDS_WINDOWTITLE, PathFindFileName(filepathname));
|
|
mainWindow.SetWindowText(strTitle);
|
|
|
|
// update file info and recent
|
|
isAFile = isFile;
|
|
if (isAFile)
|
|
registrySettings.SetMostRecentFile(filepathname);
|
|
|
|
imageSaved = TRUE;
|
|
|
|
return hBitmap;
|
|
}
|
|
|
|
HBITMAP DoLoadImageFile(HWND hwnd, LPCTSTR name, BOOL fIsMainFile)
|
|
{
|
|
// find the file
|
|
WIN32_FIND_DATA find;
|
|
HANDLE hFind = FindFirstFile(name, &find);
|
|
if (hFind == INVALID_HANDLE_VALUE)
|
|
{
|
|
// does not exist
|
|
CStringW strText;
|
|
strText.Format(IDS_LOADERRORTEXT, name);
|
|
MessageBoxW(hwnd, strText, NULL, MB_ICONERROR);
|
|
return NULL;
|
|
}
|
|
DWORD dwFileSize = find.nFileSizeLow; // get file size
|
|
FindClose(hFind);
|
|
|
|
// is file empty?
|
|
if (dwFileSize == 0)
|
|
{
|
|
if (fIsMainFile)
|
|
{
|
|
FILETIME ft;
|
|
FileTimeToLocalFileTime(&find.ftLastWriteTime, &ft);
|
|
FileTimeToSystemTime(&ft, &fileTime);
|
|
return SetBitmapAndInfo(NULL, name, dwFileSize, TRUE);
|
|
}
|
|
}
|
|
|
|
// load the image
|
|
CImage img;
|
|
img.Load(name);
|
|
HBITMAP hBitmap = img.Detach();
|
|
|
|
if (hBitmap == NULL)
|
|
{
|
|
// cannot open
|
|
CStringW strText;
|
|
strText.Format(IDS_LOADERRORTEXT, name);
|
|
MessageBoxW(hwnd, strText, NULL, MB_ICONERROR);
|
|
return NULL;
|
|
}
|
|
|
|
if (fIsMainFile)
|
|
{
|
|
FILETIME ft;
|
|
FileTimeToLocalFileTime(&find.ftLastWriteTime, &ft);
|
|
FileTimeToSystemTime(&ft, &fileTime);
|
|
SetBitmapAndInfo(hBitmap, name, dwFileSize, TRUE);
|
|
}
|
|
|
|
return hBitmap;
|
|
}
|