92babbf3494137b16be2db8083078eb88cef8d22
[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 if (lpszFile) /* disk based metafile */
154 {
155 pmfDC->mh.mtType = METAFILE_DISK;
156
157 if(!GetFullPathName( lpszFile,
158 MAX_PATH,
159 (LPTSTR) &pmfDC->Filename,
160 (LPTSTR*) &lpszFile))
161 {
162 // MFDRV_DeleteDC( dc->physDev );
163 return NULL;
164 }
165
166 if ((hFile = CreateFileW(pmfDC->Filename, GENERIC_WRITE, 0, NULL,
167 CREATE_ALWAYS, 0, 0)) == INVALID_HANDLE_VALUE)
168 {
169 // MFDRV_DeleteDC( dc->physDev );
170 return NULL;
171 }
172
173 if (!WriteFile( hFile, &pmfDC->mh, sizeof(pmfDC->mh), NULL, NULL ))
174 {
175 // MFDRV_DeleteDC( dc->physDev );
176 return NULL;
177 }
178 pmfDC->hFile = hFile;
179 }
180 else /* memory based metafile */
181 pmfDC->mh.mtType = METAFILE_MEMORY;
182
183 hmDC = NtGdiCreateClientObj ( GDI_OBJECT_TYPE_METADC );
184
185 MF_CreateMFDC ( hmDC, pmfDC );
186
187 return hmDC;
188 }
189
190
191 /*
192 * @implemented
193 */
194 HDC
195 WINAPI
196 CreateMetaFileA(
197 LPCSTR lpszFile
198 )
199 {
200 NTSTATUS Status;
201 PWSTR lpszFileW;
202 HDC rc = 0;
203
204 Status = HEAP_strdupA2W ( &lpszFileW, lpszFile );
205 if (!NT_SUCCESS (Status))
206 SetLastError (RtlNtStatusToDosError(Status));
207 else
208 {
209 rc = CreateMetaFileW( lpszFileW );
210 HEAP_free ( lpszFileW );
211 }
212 return rc;
213 }
214
215
216 /*
217 * @unimplemented
218 */
219 BOOL
220 WINAPI
221 DeleteMetaFile(
222 HMETAFILE a0
223 )
224 {
225 return FALSE;
226 }
227
228
229 /*
230 * @implemented
231 */
232 HMETAFILE
233 WINAPI
234 GetMetaFileW(
235 LPCWSTR lpszMetaFile
236 )
237 {
238 return NULL;
239 }
240
241
242 /*
243 * @implemented
244 */
245 HMETAFILE
246 WINAPI
247 GetMetaFileA(
248 LPCSTR lpszMetaFile
249 )
250 {
251 NTSTATUS Status;
252 LPWSTR lpszMetaFileW;
253 HMETAFILE rc = 0;
254
255 Status = HEAP_strdupA2W ( &lpszMetaFileW, lpszMetaFile );
256 if (!NT_SUCCESS (Status))
257 SetLastError (RtlNtStatusToDosError(Status));
258 else
259 {
260 rc = GetMetaFileW( lpszMetaFileW );
261 HEAP_free ( lpszMetaFileW );
262 }
263
264 return rc;
265 }
266
267