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
);
75 GetDIBits(hDC
, hBitmap
, 0, bm
.bmHeight
, buffer
, (LPBITMAPINFO
) & bi
, DIB_RGB_COLORS
);
77 hFile
= CreateFile(FileName
, GENERIC_WRITE
, 0, NULL
, CREATE_ALWAYS
, FILE_FLAG_SEQUENTIAL_SCAN
, NULL
);
78 if (hFile
== INVALID_HANDLE_VALUE
)
81 WriteFile(hFile
, &bf
, sizeof(BITMAPFILEHEADER
), &dwBytesWritten
, NULL
);
82 WriteFile(hFile
, &bi
, sizeof(BITMAPINFOHEADER
), &dwBytesWritten
, NULL
);
83 WriteFile(hFile
, buffer
, imgDataSize
, &dwBytesWritten
, NULL
);
88 GetFileTime(hFile
, NULL
, NULL
, &ft
);
89 FileTimeToSystemTime(&ft
, time
);
92 *size
= GetFileSize(hFile
, NULL
);
95 HeapFree(GetProcessHeap(), 0, buffer
);
99 LoadDIBFromFile(HBITMAP
* hBitmap
, LPTSTR name
, LPSYSTEMTIME time
, int *size
, int *hRes
, int *vRes
)
101 BITMAPFILEHEADER bfh
;
111 CreateFile(name
, GENERIC_READ
, FILE_SHARE_READ
, NULL
, OPEN_EXISTING
, FILE_FLAG_SEQUENTIAL_SCAN
, NULL
);
112 if (hFile
== INVALID_HANDLE_VALUE
)
115 /* read header and check for 'BM' magic */
116 ReadFile(hFile
, &bfh
, sizeof(BITMAPFILEHEADER
), &dwBytesRead
, NULL
);
117 if (bfh
.bfType
!= 0x4d42)
126 GetFileTime(hFile
, NULL
, NULL
, &ft
);
127 FileTimeToSystemTime(&ft
, time
);
130 *size
= GetFileSize(hFile
, NULL
);
132 bi
= HeapAlloc(GetProcessHeap(), 0, bfh
.bfOffBits
- sizeof(BITMAPFILEHEADER
));
139 ReadFile(hFile
, bi
, bfh
.bfOffBits
- sizeof(BITMAPFILEHEADER
), &dwBytesRead
, NULL
);
140 *hBitmap
= CreateDIBSection(NULL
, bi
, DIB_RGB_COLORS
, &pvBits
, NULL
, 0);
141 ReadFile(hFile
, pvBits
, bfh
.bfSize
- bfh
.bfOffBits
, &dwBytesRead
, NULL
);
144 *hRes
= (*bi
).bmiHeader
.biXPelsPerMeter
;
146 *vRes
= (*bi
).bmiHeader
.biYPelsPerMeter
;
149 HeapFree(GetProcessHeap(), 0, bi
);