2 * PROJECT: PAINT for ReactOS
4 * FILE: base/applications/paint/dib.c
5 * PURPOSE: Some DIB related functions
6 * PROGRAMMERS: Benedikt Freisen
9 /* INCLUDES *********************************************************/
13 /* FUNCTIONS ********************************************************/
16 CreateDIBWithProperties(int width
, int height
)
19 ZeroMemory(&bmi
, sizeof(BITMAPINFO
));
20 bmi
.bmiHeader
.biSize
= sizeof(BITMAPINFOHEADER
);
21 bmi
.bmiHeader
.biWidth
= width
;
22 bmi
.bmiHeader
.biHeight
= height
;
23 bmi
.bmiHeader
.biPlanes
= 1;
24 bmi
.bmiHeader
.biBitCount
= 24;
25 bmi
.bmiHeader
.biCompression
= BI_RGB
;
26 return CreateDIBSection(NULL
, &bmi
, DIB_RGB_COLORS
, NULL
, NULL
, 0);
30 GetDIBWidth(HBITMAP hBitmap
)
33 GetObject(hBitmap
, sizeof(BITMAP
), &bm
);
38 GetDIBHeight(HBITMAP hBitmap
)
41 GetObject(hBitmap
, sizeof(BITMAP
), &bm
);
46 SaveDIBToFile(HBITMAP hBitmap
, LPTSTR FileName
, HDC hDC
, LPSYSTEMTIME time
, int *size
, int hRes
, int vRes
)
56 GetObject(hBitmap
, sizeof(BITMAP
), &bm
);
58 ZeroMemory(&bf
, sizeof(BITMAPFILEHEADER
));
59 ZeroMemory(&bi
, sizeof(BITMAPINFOHEADER
));
61 imgDataSize
= bm
.bmWidthBytes
* bm
.bmHeight
;
62 bf
.bfType
= 0x4d42; /* BM */
63 bf
.bfSize
= imgDataSize
+ 52;
65 bi
.biSize
= sizeof(BITMAPINFOHEADER
);
66 bi
.biWidth
= bm
.bmWidth
;
67 bi
.biHeight
= bm
.bmHeight
;
68 bi
.biPlanes
= bm
.bmPlanes
;
69 bi
.biBitCount
= bm
.bmBitsPixel
;
70 bi
.biCompression
= BI_RGB
;
71 bi
.biXPelsPerMeter
= hRes
;
72 bi
.biYPelsPerMeter
= vRes
;
74 buffer
= HeapAlloc(GetProcessHeap(), 0, imgDataSize
);
78 GetDIBits(hDC
, hBitmap
, 0, bm
.bmHeight
, buffer
, (LPBITMAPINFO
) & bi
, DIB_RGB_COLORS
);
80 hFile
= CreateFile(FileName
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, FILE_FLAG_SEQUENTIAL_SCAN
, NULL
);
81 if (hFile
== INVALID_HANDLE_VALUE
)
83 HeapFree(GetProcessHeap(), 0, buffer
);
87 WriteFile(hFile
, &bf
, sizeof(BITMAPFILEHEADER
), &dwBytesWritten
, NULL
);
88 WriteFile(hFile
, &bi
, sizeof(BITMAPINFOHEADER
), &dwBytesWritten
, NULL
);
89 WriteFile(hFile
, buffer
, imgDataSize
, &dwBytesWritten
, NULL
);
94 GetFileTime(hFile
, NULL
, NULL
, &ft
);
95 FileTimeToSystemTime(&ft
, time
);
98 *size
= GetFileSize(hFile
, NULL
);
101 HeapFree(GetProcessHeap(), 0, buffer
);
104 void ShowFileLoadError(LPTSTR name
)
106 TCHAR programname
[20];
107 TCHAR loaderrortext
[100];
109 LoadString(hProgInstance
, IDS_PROGRAMNAME
, programname
, SIZEOF(programname
));
110 LoadString(hProgInstance
, IDS_LOADERRORTEXT
, loaderrortext
, SIZEOF(loaderrortext
));
111 _stprintf(temptext
, loaderrortext
, name
);
112 MessageBox(hMainWnd
, temptext
, programname
, MB_OK
| MB_ICONEXCLAMATION
);
116 LoadDIBFromFile(HBITMAP
* hBitmap
, LPTSTR name
, LPSYSTEMTIME time
, int *size
, int *hRes
, int *vRes
)
118 BITMAPFILEHEADER bfh
;
126 ShowFileLoadError(name
);
131 CreateFile(name
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, FILE_FLAG_SEQUENTIAL_SCAN
, NULL
);
132 if (hFile
== INVALID_HANDLE_VALUE
)
134 ShowFileLoadError(name
);
138 /* read header and check for 'BM' magic */
139 ReadFile(hFile
, &bfh
, sizeof(BITMAPFILEHEADER
), &dwBytesRead
, NULL
);
140 if (bfh
.bfType
!= 0x4d42)
143 ShowFileLoadError(name
);
150 GetFileTime(hFile
, NULL
, NULL
, &ft
);
151 FileTimeToSystemTime(&ft
, time
);
154 *size
= GetFileSize(hFile
, NULL
);
156 bi
= HeapAlloc(GetProcessHeap(), 0, bfh
.bfOffBits
- sizeof(BITMAPFILEHEADER
));
160 ShowFileLoadError(name
);
164 ReadFile(hFile
, bi
, bfh
.bfOffBits
- sizeof(BITMAPFILEHEADER
), &dwBytesRead
, NULL
);
165 *hBitmap
= CreateDIBSection(NULL
, bi
, DIB_RGB_COLORS
, &pvBits
, NULL
, 0);
166 ReadFile(hFile
, pvBits
, bfh
.bfSize
- bfh
.bfOffBits
, &dwBytesRead
, NULL
);
169 *hRes
= (*bi
).bmiHeader
.biXPelsPerMeter
;
171 *vRes
= (*bi
).bmiHeader
.biYPelsPerMeter
;
174 HeapFree(GetProcessHeap(), 0, bi
);