Fix build
[reactos.git] / reactos / dll / win32 / gdi32 / objects / metafile.c
1 #include "precomp.h"
2
3 /* DEFINES *******************************************************************/
4
5
6 /* PRIVATE DATA **************************************************************/
7
8 PMF_ENTRY hMF_List = NULL;
9 DWORD hMFCount = 0;
10
11 /* INTERNAL FUNCTIONS ********************************************************/
12
13 BOOL
14 MF_CreateMFDC ( HGDIOBJ hMDC,
15 PMETAFILEDC pmfDC )
16 {
17 PMF_ENTRY pMFME;
18
19 pMFME = LocalAlloc(LMEM_ZEROINIT, sizeof(MF_ENTRY));
20 if (!pMFME)
21 {
22 return FALSE;
23 }
24
25 if (hMF_List == NULL)
26 {
27 hMF_List = pMFME;
28 InitializeListHead(&hMF_List->List);
29 }
30 else
31 InsertTailList(&hMF_List->List, &pMFME->List);
32
33 pMFME->hmDC = hMDC;
34 pMFME->pmfDC = pmfDC;
35
36 hMFCount++;
37 return TRUE;
38 }
39
40
41 PMETAFILEDC
42 MF_GetMFDC ( HGDIOBJ hMDC )
43 {
44 PMF_ENTRY pMFME = hMF_List;
45
46 do
47 {
48 if ( pMFME->hmDC == hMDC ) return pMFME->pmfDC;
49 pMFME = (PMF_ENTRY) pMFME->List.Flink;
50 }
51 while ( pMFME != hMF_List );
52
53 return NULL;
54 }
55
56
57 BOOL
58 MF_DeleteMFDC ( HGDIOBJ hMDC )
59 {
60 PMF_ENTRY pMFME = hMF_List;
61
62 do
63 {
64 if ( pMFME->hmDC == hMDC)
65 {
66 RemoveEntryList(&pMFME->List);
67 LocalFree ( pMFME );
68 hMFCount--;
69 if (!hMFCount) hMF_List = NULL;
70 return TRUE;
71 }
72 pMFME = (PMF_ENTRY) pMFME->List.Flink;
73 }
74 while ( pMFME != hMF_List );
75
76 return FALSE;
77 }
78
79 /* FUNCTIONS *****************************************************************/
80
81 /*
82 * @unimplemented
83 */
84 HMETAFILE
85 WINAPI
86 CloseMetaFile(
87 HDC a0
88 )
89 {
90 return 0;
91 }
92
93
94 /*
95 * @implemented
96 */
97 HMETAFILE
98 WINAPI
99 CopyMetaFileW(
100 HMETAFILE hmfSrc,
101 LPCWSTR lpszFile
102 )
103 {
104 return NULL;
105 }
106
107
108 /*
109 * @implemented
110 */
111 HMETAFILE
112 WINAPI
113 CopyMetaFileA(
114 HMETAFILE hmfSrc,
115 LPCSTR lpszFile
116 )
117 {
118 NTSTATUS Status;
119 PWSTR lpszFileW;
120 HMETAFILE rc = 0;
121
122 Status = HEAP_strdupA2W ( &lpszFileW, lpszFile );
123 if (!NT_SUCCESS (Status))
124 SetLastError (RtlNtStatusToDosError(Status));
125 else
126 {
127 rc = CopyMetaFileW( hmfSrc, lpszFileW );
128 HEAP_free ( lpszFileW );
129 }
130
131 return rc;
132 }
133
134
135 /*
136 * @implemented
137 */
138 HDC
139 WINAPI
140 CreateMetaFileW(
141 LPCWSTR lpszFile
142 )
143 {
144 HANDLE hFile;
145 HDC hmDC;
146 PMETAFILEDC pmfDC = LocalAlloc(LMEM_ZEROINIT, sizeof(METAFILEDC));
147 if (!pmfDC) return NULL;
148
149 pmfDC->mh.mtHeaderSize = sizeof(METAHEADER) / sizeof(WORD);
150 pmfDC->mh.mtVersion = 0x0300;
151 pmfDC->mh.mtSize = pmfDC->mh.mtHeaderSize;
152
153 pmfDC->hPen = GetStockObject(BLACK_PEN);
154 pmfDC->hBrush = GetStockObject(WHITE_BRUSH);
155 pmfDC->hFont = GetStockObject(DEVICE_DEFAULT_FONT);
156 pmfDC->hBitmap = GetStockObject(DEFAULT_BITMAP);
157 pmfDC->hPalette = GetStockObject(DEFAULT_PALETTE);
158
159 if (lpszFile) /* disk based metafile */
160 {
161 pmfDC->mh.mtType = METAFILE_DISK;
162
163 if(!GetFullPathName( lpszFile,
164 MAX_PATH,
165 (LPTSTR) &pmfDC->Filename,
166 (LPTSTR*) &lpszFile))
167 {
168 LocalFree(pmfDC);
169 return NULL;
170 }
171
172 if ((hFile = CreateFileW(pmfDC->Filename, GENERIC_WRITE, 0, NULL,
173 CREATE_ALWAYS, 0, 0)) == INVALID_HANDLE_VALUE)
174 {
175 LocalFree(pmfDC);
176 return NULL;
177 }
178
179 if (!WriteFile( hFile, &pmfDC->mh, sizeof(pmfDC->mh), &pmfDC->dwWritten, NULL ))
180 {
181 LocalFree(pmfDC);
182 return NULL;
183 }
184 pmfDC->hFile = hFile;
185 }
186 else /* memory based metafile */
187 pmfDC->mh.mtType = METAFILE_MEMORY;
188
189 hmDC = NtGdiCreateClientObj ( GDI_OBJECT_TYPE_METADC );
190
191 MF_CreateMFDC ( hmDC, pmfDC );
192
193 return hmDC;
194 }
195
196
197 /*
198 * @implemented
199 */
200 HDC
201 WINAPI
202 CreateMetaFileA(
203 LPCSTR lpszFile
204 )
205 {
206 NTSTATUS Status;
207 PWSTR lpszFileW;
208 HDC rc = 0;
209
210 Status = HEAP_strdupA2W ( &lpszFileW, lpszFile );
211 if (!NT_SUCCESS (Status))
212 SetLastError (RtlNtStatusToDosError(Status));
213 else
214 {
215 rc = CreateMetaFileW( lpszFileW );
216 HEAP_free ( lpszFileW );
217 }
218 return rc;
219 }
220
221
222 /*
223 * @unimplemented
224 */
225 BOOL
226 WINAPI
227 DeleteMetaFile(
228 HMETAFILE a0
229 )
230 {
231 return FALSE;
232 }
233
234
235 /*
236 * @implemented
237 */
238 HMETAFILE
239 WINAPI
240 GetMetaFileW(
241 LPCWSTR lpszMetaFile
242 )
243 {
244 return NULL;
245 }
246
247
248 /*
249 * @implemented
250 */
251 HMETAFILE
252 WINAPI
253 GetMetaFileA(
254 LPCSTR lpszMetaFile
255 )
256 {
257 NTSTATUS Status;
258 LPWSTR lpszMetaFileW;
259 HMETAFILE rc = 0;
260
261 Status = HEAP_strdupA2W ( &lpszMetaFileW, lpszMetaFile );
262 if (!NT_SUCCESS (Status))
263 SetLastError (RtlNtStatusToDosError(Status));
264 else
265 {
266 rc = GetMetaFileW( lpszMetaFileW );
267 HEAP_free ( lpszMetaFileW );
268 }
269
270 return rc;
271 }
272
273