xref: /reactos/win32ss/gdi/gdi32/objects/enhmfile.c (revision 171a9206)
1 #include <precomp.h>
2 
3 #define NDEBUG
4 #include <debug.h>
5 
6 /*
7  * @unimplemented
8  */
9 BOOL
10 WINAPI
11 IsValidEnhMetaRecord(
12     PVOID pv0,
13     PVOID pv1)
14 {
15     UNIMPLEMENTED;
16     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
17     return FALSE;
18 }
19 
20 /*
21  * @unimplemented
22  */
23 BOOL
24 WINAPI
25 IsValidEnhMetaRecordOffExt(
26     PVOID pv0,
27     PVOID pv1,
28     DWORD dwOffset,
29     DWORD dwExtends )
30 {
31     UNIMPLEMENTED;
32     SetLastError(ERROR_CALL_NOT_IMPLEMENTED);
33     return FALSE;
34 }
35 
36 /*
37  * @implemented
38  */
39 HANDLE
40 WINAPI
41 GdiConvertEnhMetaFile(HENHMETAFILE hemf)
42 {
43     HANDLE hmo = NULL;
44     BYTE * Buffer = NULL;
45     UINT nSize;
46 
47     nSize = GetEnhMetaFileBits( hemf, 0, NULL );
48     if (nSize == 0)
49         goto Exit;
50 
51     // allocate buffer
52     Buffer = (BYTE *)LocalAlloc(LPTR, nSize);
53     if (Buffer == NULL)
54         goto Exit;
55 
56     nSize = GetEnhMetaFileBits( hemf, nSize, Buffer );
57     if (nSize == 0)
58         goto Exit;
59 
60     hmo = NtGdiCreateServerMetaFile( GDITAG_TYPE_EMF, nSize, Buffer, 0, 0, 0 );
61 
62 Exit:
63     // clean up
64     if (Buffer)
65         LocalFree(Buffer);
66     return hmo;
67 }
68 
69 /*
70  * @implemented
71  */
72 HENHMETAFILE
73 WINAPI
74 GdiCreateLocalEnhMetaFile(HANDLE hmo)
75 {
76     HENHMETAFILE hEMF;
77     BYTE *       Buffer = NULL;
78     UINT         nSize;
79     DWORD        iType, mm, xExt, yExt;
80 
81     nSize = NtGdiGetServerMetaFileBits( hmo, 0, NULL, NULL, NULL, NULL, NULL);
82     if (nSize == 0)
83         goto Exit;
84 
85     // allocate buffer
86     Buffer = (BYTE *)LocalAlloc(LPTR, nSize);
87     if (Buffer == NULL)
88         goto Exit;
89 
90     // store to buffer
91     nSize = NtGdiGetServerMetaFileBits( hmo, nSize, Buffer, &iType, &mm, &xExt, &yExt);
92     if (nSize == 0)
93         goto Exit;
94 
95     if ( iType == GDITAG_TYPE_MFP ) // handle conversion to EMF
96     {
97         METAFILEPICT Info;
98 
99         Info.hMF  = NULL;
100         Info.mm   = mm;
101         Info.xExt = xExt;
102         Info.yExt = yExt;
103 
104         hEMF = SetWinMetaFileBits( nSize, Buffer, NULL, &Info ); // Translate from old style to new style.
105         if (hEMF == NULL)
106             goto Exit;
107     }
108     else
109     {
110         hEMF = SetEnhMetaFileBits(nSize, Buffer);
111         if (hEMF == NULL)
112             goto Exit;
113     }
114 
115 Exit:
116     // clean up
117     if (Buffer)
118         LocalFree(Buffer);
119     return hEMF;
120 }
121 
122 /*
123  * @implemented
124  */
125 BOOL
126 WINAPI
127 GdiComment(
128     _In_ HDC hdc,
129     _In_ UINT cbSize,
130     _In_ const BYTE *lpData)
131 {
132     if (GDI_HANDLE_GET_TYPE(hdc) != GDILoObjType_LO_ALTDC_TYPE)
133         return TRUE;
134 
135     return EMFDC_GdiComment( hdc, cbSize, lpData );
136 }
137 
138 /*
139  * @implemented
140  */
141 UINT
142 WINAPI
143 GetEnhMetaFilePixelFormat(
144     HENHMETAFILE hemf,
145     UINT cbBuffer,
146     PIXELFORMATDESCRIPTOR *ppfd )
147 {
148     ENHMETAHEADER pemh;
149 
150     if(GetEnhMetaFileHeader(hemf, sizeof(ENHMETAHEADER), &pemh))
151     {
152         if(pemh.bOpenGL)
153         {
154             if(pemh.cbPixelFormat)
155             {
156                 memcpy((void*)ppfd, UlongToPtr(pemh.offPixelFormat), cbBuffer );
157                 return(pemh.cbPixelFormat);
158             }
159         }
160     }
161     return(0);
162 }
163