xref: /reactos/win32ss/gdi/gdi32/objects/eng.c (revision d2aeaba5)
1 /*
2  * reactos/lib/gdi32/misc/eng.c
3  *
4  * GDI32.DLL eng part
5  *
6  *
7  */
8 
9 #include <precomp.h>
10 
11 /*
12  * @implemented
13  */
14 VOID
15 WINAPI
16 EngAcquireSemaphore ( IN HSEMAPHORE hsem )
17 {
18     RtlEnterCriticalSection((PRTL_CRITICAL_SECTION)hsem);
19 }
20 
21 
22 /*
23  * @unimplemented
24  */
25 BOOL
26 copy_my_glyphset( FD_GLYPHSET *dst_glyphset , FD_GLYPHSET * src_glyphset, ULONG Size)
27 {
28     BOOL retValue = FALSE;
29 
30     memcpy(src_glyphset, dst_glyphset, Size);
31     if (src_glyphset->cRuns == 0)
32     {
33         retValue = TRUE;
34     }
35 
36     /* FIXME copy wrun */
37     return retValue;
38 }
39 
40 /*
41  * @implemented
42  */
43 FD_GLYPHSET*
44 WINAPI
45 EngComputeGlyphSet(INT nCodePage,INT nFirstChar,INT cChars)
46 {
47     FD_GLYPHSET * ntfd_glyphset;
48     FD_GLYPHSET * myfd_glyphset = NULL;
49 
50     ntfd_glyphset = NtGdiEngComputeGlyphSet(nCodePage,nFirstChar,cChars);
51 
52     if (ntfd_glyphset)
53     {
54         if (ntfd_glyphset->cjThis)
55         {
56             myfd_glyphset = GlobalAlloc(0,ntfd_glyphset->cjThis);
57             if (myfd_glyphset)
58             {
59                 if (copy_my_glyphset(myfd_glyphset,ntfd_glyphset,ntfd_glyphset->cjThis) == FALSE)
60                 {
61                     GlobalFree(myfd_glyphset);
62                     myfd_glyphset = NULL;
63                 }
64             }
65         }
66     }
67     return myfd_glyphset;
68 }
69 
70 /*
71  * @implemented
72  */
73 HSEMAPHORE
74 WINAPI
75 EngCreateSemaphore ( VOID )
76 {
77     PRTL_CRITICAL_SECTION CritSect = RtlAllocateHeap(GetProcessHeap(), 0, sizeof(RTL_CRITICAL_SECTION));
78     if (!CritSect)
79     {
80         return NULL;
81     }
82 
83     RtlInitializeCriticalSection( CritSect );
84     return (HSEMAPHORE)CritSect;
85 }
86 
87 /*
88  * @implemented
89  */
90 VOID
91 WINAPI
92 EngDeleteSemaphore ( IN HSEMAPHORE hsem )
93 {
94     if (hsem)
95     {
96         RtlDeleteCriticalSection( (PRTL_CRITICAL_SECTION) hsem );
97         RtlFreeHeap( GetProcessHeap(), 0, hsem );
98     }
99 }
100 
101 /*
102  * @implemented
103  */
104 PVOID WINAPI
105 EngFindResource(HANDLE h,
106                 int iName,
107                 int iType,
108                 PULONG pulSize)
109 {
110     HRSRC HRSrc;
111     DWORD Size = 0;
112     HGLOBAL Hg;
113     LPVOID Lock = NULL;
114 
115     HRSrc = FindResourceW((HMODULE)h, MAKEINTRESOURCEW(iName), MAKEINTRESOURCEW(iType));
116     if (HRSrc != NULL)
117     {
118         Size = SizeofResource((HMODULE)h, HRSrc);
119         if (Size != 0)
120         {
121             Hg = LoadResource((HMODULE)h, HRSrc);
122             if (Hg != NULL)
123             {
124                 Lock = LockResource( Hg );
125             }
126         }
127     }
128 
129     *pulSize = Size;
130     return (PVOID) Lock;
131 }
132 
133 /*
134  * @implemented
135  */
136 VOID WINAPI
137 EngFreeModule(HANDLE h)
138 {
139     FreeLibrary(h);
140 }
141 
142 /*
143  * @implemented
144  */
145 
146 VOID WINAPI
147 EngGetCurrentCodePage( OUT PUSHORT OemCodePage,
148                        OUT PUSHORT AnsiCodePage)
149 {
150     *OemCodePage  = GetOEMCP();
151     *AnsiCodePage = GetACP();
152 }
153 
154 
155 /*
156  * @implemented
157  */
158 LPWSTR WINAPI
159 EngGetDriverName(HDEV hdev)
160 {
161     // DHPDEV from NtGdiGetDhpdev must be from print driver.
162     PUMPDEV pPDev = (PUMPDEV)NtGdiGetDhpdev(hdev);
163 
164     if (!pPDev) return NULL;
165 
166     if (pPDev->Sig != PDEV_UMPD_ID)
167     {
168         pPDev = (PUMPDEV)pPDev->Sig;
169     }
170     return pPDev->pdi5Info->pDriverPath;
171 }
172 
173 /*
174  * @implemented
175  */
176 LPWSTR WINAPI
177 EngGetPrinterDataFileName(HDEV hdev)
178 {
179     PUMPDEV pPDev = (PUMPDEV)NtGdiGetDhpdev(hdev);
180 
181     if (!pPDev) return NULL;
182 
183     if (pPDev->Sig != PDEV_UMPD_ID)
184     {
185         pPDev = (PUMPDEV)pPDev->Sig;
186     }
187     return pPDev->pdi5Info->pDataFile;
188 }
189 
190 /*
191  * @implemented
192  */
193 HANDLE WINAPI
194 EngLoadModule(LPWSTR pwsz)
195 {
196     return LoadLibraryExW ( pwsz, NULL, LOAD_LIBRARY_AS_DATAFILE);
197 }
198 
199 /*
200  * @implemented
201  */
202 INT WINAPI
203 EngMultiByteToWideChar(UINT CodePage,
204                        LPWSTR WideCharString,
205                        INT BytesInWideCharString,
206                        LPSTR MultiByteString,
207                        INT BytesInMultiByteString)
208 {
209     return MultiByteToWideChar(CodePage,0,MultiByteString,BytesInMultiByteString,WideCharString,BytesInWideCharString / sizeof(WCHAR));
210 }
211 
212 /*
213  * @implemented
214  */
215 VOID WINAPI
216 EngQueryLocalTime(PENG_TIME_FIELDS etf)
217 {
218     SYSTEMTIME SystemTime;
219     GetLocalTime( &SystemTime );
220     etf->usYear    = SystemTime.wYear;
221     etf->usMonth   = SystemTime.wMonth;
222     etf->usWeekday = SystemTime.wDayOfWeek;
223     etf->usDay     = SystemTime.wDay;
224     etf->usHour    = SystemTime.wHour;
225     etf->usMinute  = SystemTime.wMinute;
226     etf->usSecond  = SystemTime.wSecond;
227     etf->usMilliseconds = SystemTime.wMilliseconds;
228 }
229 
230 /*
231  * @implemented
232  */
233 VOID
234 WINAPI
235 EngReleaseSemaphore ( IN HSEMAPHORE hsem )
236 {
237     RtlLeaveCriticalSection( (PRTL_CRITICAL_SECTION) hsem);
238 }
239 
240 /*
241  * @implemented
242  */
243 INT
244 WINAPI
245 EngWideCharToMultiByte( UINT CodePage,
246                         LPWSTR WideCharString,
247                         INT BytesInWideCharString,
248                         LPSTR MultiByteString,
249                         INT BytesInMultiByteString)
250 {
251     return WideCharToMultiByte(CodePage, 0, WideCharString, (BytesInWideCharString/sizeof(WCHAR)),
252                                MultiByteString, BytesInMultiByteString, NULL, NULL);
253 }
254 
255 /*
256  * @unimplemented
257  */
258 ULONG *
259 WINAPI
260 XLATEOBJ_piVector(XLATEOBJ *XlateObj)
261 {
262     return XlateObj->pulXlate;
263 }
264 
265