661c58ea1e218248307187df6485a57dd84cd9e5
[reactos.git] / reactos / lib / cpl / desk / dibitmap.c
1 /* $Id$
2 *
3 * COPYRIGHT: See COPYING in the top level directory
4 * PROJECT: ReactOS Display Control Panel
5 * FILE: lib/cpl/desk/dibitmap.c
6 * PURPOSE: DIB loading
7 *
8 * PROGRAMMERS: Trevor McCort (lycan359@gmail.com)
9 */
10
11 #include "dibitmap.h"
12
13 DIBitmap *DibLoadImage(TCHAR *filename)
14 {
15 BOOL bSuccess;
16 DWORD dwFileSize, dwHighSize, dwBytesRead;
17 HANDLE hFile;
18 DIBitmap *bitmap;
19
20 hFile = CreateFile(filename,
21 GENERIC_READ,
22 FILE_SHARE_READ,
23 NULL,
24 OPEN_EXISTING,
25 FILE_FLAG_SEQUENTIAL_SCAN,
26 NULL);
27
28 if(hFile == INVALID_HANDLE_VALUE)
29 return NULL;
30
31 dwFileSize = GetFileSize(hFile, &dwHighSize);
32
33 if(dwHighSize)
34 {
35 CloseHandle(hFile);
36 return NULL;
37 }
38
39 bitmap = malloc(sizeof(DIBitmap));
40 if(!bitmap)
41 return NULL;
42
43 bitmap->header = malloc(dwFileSize);
44 if(!bitmap->header)
45 {
46 CloseHandle(hFile);
47 return NULL;
48 }
49
50 bSuccess = ReadFile(hFile, bitmap->header, dwFileSize, &dwBytesRead, NULL);
51 CloseHandle(hFile);
52
53 if(!bSuccess || (dwBytesRead != dwFileSize)
54 || (bitmap->header->bfType != * (WORD *) "BM")
55 || (bitmap->header->bfSize != dwFileSize))
56 {
57 free(bitmap->header);
58 return NULL;
59 }
60
61 bitmap->info = (BITMAPINFO *)(bitmap->header + 1);
62 bitmap->bits = (BYTE *)bitmap->header + bitmap->header->bfOffBits;
63
64 /* Get the DIB width and height */
65 if(bitmap->info->bmiHeader.biSize == sizeof(BITMAPCOREHEADER))
66 {
67 bitmap->width = ((BITMAPCOREHEADER *)bitmap->info)->bcWidth;
68 bitmap->height = ((BITMAPCOREHEADER *)bitmap->info)->bcHeight;
69 }
70 else
71 {
72 bitmap->width = bitmap->info->bmiHeader.biWidth;
73 bitmap->height = abs(bitmap->info->bmiHeader.biHeight);
74 }
75
76 return bitmap;
77 }
78
79 void DibFreeImage(DIBitmap *bitmap)
80 {
81 if(bitmap == NULL)
82 return;
83
84 /* Free the header */
85 if(bitmap->header != NULL)
86 free(bitmap->header);
87
88 /* Free the bitmap structure */
89 if(bitmap != NULL)
90 free(bitmap);
91 }
92