1 /**
2  * FreeRDP: A Remote Desktop Protocol Implementation
3  * GDI Library
4  *
5  * Copyright 2010-2011 Marc-Andre Moreau <marcandre.moreau@gmail.com>
6  * Copyright 2016 Armin Novak <armin.novak@thincast.com>
7  * Copyright 2016 Thincast Technologies GmbH
8  *
9  * Licensed under the Apache License, Version 2.0 (the "License");
10  * you may not use this file except in compliance with the License.
11  * You may obtain a copy of the License at
12  *
13  *     http://www.apache.org/licenses/LICENSE-2.0
14  *
15  * Unless required by applicable law or agreed to in writing, software
16  * distributed under the License is distributed on an "AS IS" BASIS,
17  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
18  * See the License for the specific language governing permissions and
19  * limitations under the License.
20  */
21 
22 #ifndef FREERDP_GDI_H
23 #define FREERDP_GDI_H
24 
25 #include <winpr/wlog.h>
26 
27 #include <freerdp/api.h>
28 #include <freerdp/log.h>
29 #include <freerdp/freerdp.h>
30 #include <freerdp/cache/cache.h>
31 #include <freerdp/codec/color.h>
32 #include <freerdp/codec/region.h>
33 
34 #include <freerdp/client/rdpgfx.h>
35 #include <freerdp/client/geometry.h>
36 #include <freerdp/client/video.h>
37 
38 /* For more information, see [MS-RDPEGDI] */
39 
40 /* Binary Raster Operations (ROP2) */
41 #define GDI_R2_BLACK 0x01       /* D = 0 */
42 #define GDI_R2_NOTMERGEPEN 0x02 /* D = ~(D | P) */
43 #define GDI_R2_MASKNOTPEN 0x03  /* D = D & ~P */
44 #define GDI_R2_NOTCOPYPEN 0x04  /* D = ~P */
45 #define GDI_R2_MASKPENNOT 0x05  /* D = P & ~D */
46 #define GDI_R2_NOT 0x06         /* D = ~D */
47 #define GDI_R2_XORPEN 0x07      /* D = D ^ P */
48 #define GDI_R2_NOTMASKPEN 0x08  /* D = ~(D & P) */
49 #define GDI_R2_MASKPEN 0x09     /* D = D & P */
50 #define GDI_R2_NOTXORPEN 0x0A   /* D = ~(D ^ P) */
51 #define GDI_R2_NOP 0x0B         /* D = D */
52 #define GDI_R2_MERGENOTPEN 0x0C /* D = D | ~P */
53 #define GDI_R2_COPYPEN 0x0D     /* D = P */
54 #define GDI_R2_MERGEPENNOT 0x0E /* D = P | ~D */
55 #define GDI_R2_MERGEPEN 0x0F    /* D = P | D */
56 #define GDI_R2_WHITE 0x10       /* D = 1 */
57 
58 /* Ternary Raster Operations (ROP3) */
59 #define GDI_BLACKNESS 0x00000042
60 #define GDI_DPSoon 0x00010289
61 #define GDI_DPSona 0x00020C89
62 #define GDI_PSon 0x000300AA
63 #define GDI_SDPona 0x00040C88
64 #define GDI_DPon 0x000500A9
65 #define GDI_PDSxnon 0x00060865
66 #define GDI_PDSaon 0x000702C5
67 #define GDI_SDPnaa 0x00080F08
68 #define GDI_PDSxon 0x00090245
69 #define GDI_DPna 0x000A0329
70 #define GDI_PSDnaon 0x000B0B2A
71 #define GDI_SPna 0x000C0324
72 #define GDI_PDSnaon 0x000D0B25
73 #define GDI_PDSonon 0x000E08A5
74 #define GDI_Pn 0x000F0001
75 #define GDI_PDSona 0x00100C85
76 #define GDI_NOTSRCERASE 0x001100A6
77 #define GDI_SDPxnon 0x00120868
78 #define GDI_SDPaon 0x001302C8
79 #define GDI_DPSxnon 0x00140869
80 #define GDI_DPSaon 0x001502C9
81 #define GDI_PSDPSanaxx 0x00165CCA
82 #define GDI_SSPxDSxaxn 0x00171D54
83 #define GDI_SPxPDxa 0x00180D59
84 #define GDI_SDPSanaxn 0x00191CC8
85 #define GDI_PDSPaox 0x001A06C5
86 #define GDI_SDPSxaxn 0x001B0768
87 #define GDI_PSDPaox 0x001C06CA
88 #define GDI_DSPDxaxn 0x001D0766
89 #define GDI_PDSox 0x001E01A5
90 #define GDI_PDSoan 0x001F0385
91 #define GDI_DPSnaa 0x00200F09
92 #define GDI_SDPxon 0x00210248
93 #define GDI_DSna 0x00220326
94 #define GDI_SPDnaon 0x00230B24
95 #define GDI_SPxDSxa 0x00240D55
96 #define GDI_PDSPanaxn 0x00251CC5
97 #define GDI_SDPSaox 0x002606C8
98 #define GDI_SDPSxnox 0x00271868
99 #define GDI_DPSxa 0x00280369
100 #define GDI_PSDPSaoxxn 0x002916CA
101 #define GDI_DPSana 0x002A0CC9
102 #define GDI_SSPxPDxaxn 0x002B1D58
103 #define GDI_SPDSoax 0x002C0784
104 #define GDI_PSDnox 0x002D060A
105 #define GDI_PSDPxox 0x002E064A
106 #define GDI_PSDnoan 0x002F0E2A
107 #define GDI_PSna 0x0030032A
108 #define GDI_SDPnaon 0x00310B28
109 #define GDI_SDPSoox 0x00320688
110 #define GDI_NOTSRCCOPY 0x00330008
111 #define GDI_SPDSaox 0x003406C4
112 #define GDI_SPDSxnox 0x00351864
113 #define GDI_SDPox 0x003601A8
114 #define GDI_SDPoan 0x00370388
115 #define GDI_PSDPoax 0x0038078A
116 #define GDI_SPDnox 0x00390604
117 #define GDI_SPDSxox 0x003A0644
118 #define GDI_SPDnoan 0x003B0E24
119 #define GDI_PSx 0x003C004A
120 #define GDI_SPDSonox 0x003D18A4
121 #define GDI_SPDSnaox 0x003E1B24
122 #define GDI_PSan 0x003F00EA
123 #define GDI_PSDnaa 0x00400F0A
124 #define GDI_DPSxon 0x00410249
125 #define GDI_SDxPDxa 0x00420D5D
126 #define GDI_SPDSanaxn 0x00431CC4
127 #define GDI_SRCERASE 0x00440328
128 #define GDI_DPSnaon 0x00450B29
129 #define GDI_DSPDaox 0x004606C6
130 #define GDI_PSDPxaxn 0x0047076A
131 #define GDI_SDPxa 0x00480368
132 #define GDI_PDSPDaoxxn 0x004916C5
133 #define GDI_DPSDoax 0x004A0789
134 #define GDI_PDSnox 0x004B0605
135 #define GDI_SDPana 0x004C0CC8
136 #define GDI_SSPxDSxoxn 0x004D1954
137 #define GDI_PDSPxox 0x004E0645
138 #define GDI_PDSnoan 0x004F0E25
139 #define GDI_PDna 0x00500325
140 #define GDI_DSPnaon 0x00510B26
141 #define GDI_DPSDaox 0x005206C9
142 #define GDI_SPDSxaxn 0x00530764
143 #define GDI_DPSonon 0x005408A9
144 #define GDI_DSTINVERT 0x00550009
145 #define GDI_DPSox 0x005601A9
146 #define GDI_DPSoan 0x00570389
147 #define GDI_PDSPoax 0x00580785
148 #define GDI_DPSnox 0x00590609
149 #define GDI_PATINVERT 0x005A0049
150 #define GDI_DPSDonox 0x005B18A9
151 #define GDI_DPSDxox 0x005C0649
152 #define GDI_DPSnoan 0x005D0E29
153 #define GDI_DPSDnaox 0x005E1B29
154 #define GDI_DPan 0x005F00E9
155 #define GDI_PDSxa 0x00600365
156 #define GDI_DSPDSaoxxn 0x006116C6
157 #define GDI_DSPDoax 0x00620786
158 #define GDI_SDPnox 0x00630608
159 #define GDI_SDPSoax 0x00640788
160 #define GDI_DSPnox 0x00650606
161 #define GDI_SRCINVERT 0x00660046
162 #define GDI_SDPSonox 0x006718A8
163 #define GDI_DSPDSonoxxn 0x006858A6
164 #define GDI_PDSxxn 0x00690145
165 #define GDI_DPSax 0x006A01E9
166 #define GDI_PSDPSoaxxn 0x006B178A
167 #define GDI_SDPax 0x006C01E8
168 #define GDI_PDSPDoaxxn 0x006D1785
169 #define GDI_SDPSnoax 0x006E1E28
170 #define GDI_PDSxnan 0x006F0C65
171 #define GDI_PDSana 0x00700CC5
172 #define GDI_SSDxPDxaxn 0x00711D5C
173 #define GDI_SDPSxox 0x00720648
174 #define GDI_SDPnoan 0x00730E28
175 #define GDI_DSPDxox 0x00740646
176 #define GDI_DSPnoan 0x00750E26
177 #define GDI_SDPSnaox 0x00761B28
178 #define GDI_DSan 0x007700E6
179 #define GDI_PDSax 0x007801E5
180 #define GDI_DSPDSoaxxn 0x00791786
181 #define GDI_DPSDnoax 0x007A1E29
182 #define GDI_SDPxnan 0x007B0C68
183 #define GDI_SPDSnoax 0x007C1E24
184 #define GDI_DPSxnan 0x007D0C69
185 #define GDI_SPxDSxo 0x007E0955
186 #define GDI_DPSaan 0x007F03C9
187 #define GDI_DPSaa 0x008003E9
188 #define GDI_SPxDSxon 0x00810975
189 #define GDI_DPSxna 0x00820C49
190 #define GDI_SPDSnoaxn 0x00831E04
191 #define GDI_SDPxna 0x00840C48
192 #define GDI_PDSPnoaxn 0x00851E05
193 #define GDI_DSPDSoaxx 0x008617A6
194 #define GDI_PDSaxn 0x008701C5
195 #define GDI_SRCAND 0x008800C6
196 #define GDI_SDPSnaoxn 0x00891B08
197 #define GDI_DSPnoa 0x008A0E06
198 #define GDI_DSPDxoxn 0x008B0666
199 #define GDI_SDPnoa 0x008C0E08
200 #define GDI_SDPSxoxn 0x008D0668
201 #define GDI_SSDxPDxax 0x008E1D7C
202 #define GDI_PDSanan 0x008F0CE5
203 #define GDI_PDSxna 0x00900C45
204 #define GDI_SDPSnoaxn 0x00911E08
205 #define GDI_DPSDPoaxx 0x009217A9
206 #define GDI_SPDaxn 0x009301C4
207 #define GDI_PSDPSoaxx 0x009417AA
208 #define GDI_DPSaxn 0x009501C9
209 #define GDI_DPSxx 0x00960169
210 #define GDI_PSDPSonoxx 0x0097588A
211 #define GDI_SDPSonoxn 0x00981888
212 #define GDI_DSxn 0x00990066
213 #define GDI_DPSnax 0x009A0709
214 #define GDI_SDPSoaxn 0x009B07A8
215 #define GDI_SPDnax 0x009C0704
216 #define GDI_DSPDoaxn 0x009D07A6
217 #define GDI_DSPDSaoxx 0x009E16E6
218 #define GDI_PDSxan 0x009F0345
219 #define GDI_DPa 0x00A000C9
220 #define GDI_PDSPnaoxn 0x00A11B05
221 #define GDI_DPSnoa 0x00A20E09
222 #define GDI_DPSDxoxn 0x00A30669
223 #define GDI_PDSPonoxn 0x00A41885
224 #define GDI_PDxn 0x00A50065
225 #define GDI_DSPnax 0x00A60706
226 #define GDI_PDSPoaxn 0x00A707A5
227 #define GDI_DPSoa 0x00A803A9
228 #define GDI_DPSoxn 0x00A90189
229 #define GDI_DSTCOPY 0x00AA0029
230 #define GDI_DPSono 0x00AB0889
231 #define GDI_SPDSxax 0x00AC0744
232 #define GDI_DPSDaoxn 0x00AD06E9
233 #define GDI_DSPnao 0x00AE0B06
234 #define GDI_DPno 0x00AF0229
235 #define GDI_PDSnoa 0x00B00E05
236 #define GDI_PDSPxoxn 0x00B10665
237 #define GDI_SSPxDSxox 0x00B21974
238 #define GDI_SDPanan 0x00B30CE8
239 #define GDI_PSDnax 0x00B4070A
240 #define GDI_DPSDoaxn 0x00B507A9
241 #define GDI_DPSDPaoxx 0x00B616E9
242 #define GDI_SDPxan 0x00B70348
243 #define GDI_PSDPxax 0x00B8074A
244 #define GDI_DSPDaoxn 0x00B906E6
245 #define GDI_DPSnao 0x00BA0B09
246 #define GDI_MERGEPAINT 0x00BB0226
247 #define GDI_SPDSanax 0x00BC1CE4
248 #define GDI_SDxPDxan 0x00BD0D7D
249 #define GDI_DPSxo 0x00BE0269
250 #define GDI_DPSano 0x00BF08C9
251 #define GDI_MERGECOPY 0x00C000CA
252 #define GDI_SPDSnaoxn 0x00C11B04
253 #define GDI_SPDSonoxn 0x00C21884
254 #define GDI_PSxn 0x00C3006A
255 #define GDI_SPDnoa 0x00C40E04
256 #define GDI_SPDSxoxn 0x00C50664
257 #define GDI_SDPnax 0x00C60708
258 #define GDI_PSDPoaxn 0x00C707AA
259 #define GDI_SDPoa 0x00C803A8
260 #define GDI_SPDoxn 0x00C90184
261 #define GDI_DPSDxax 0x00CA0749
262 #define GDI_SPDSaoxn 0x00CB06E4
263 #define GDI_SRCCOPY 0x00CC0020
264 #define GDI_SDPono 0x00CD0888
265 #define GDI_SDPnao 0x00CE0B08
266 #define GDI_SPno 0x00CF0224
267 #define GDI_PSDnoa 0x00D00E0A
268 #define GDI_PSDPxoxn 0x00D1066A
269 #define GDI_PDSnax 0x00D20705
270 #define GDI_SPDSoaxn 0x00D307A4
271 #define GDI_SSPxPDxax 0x00D41D78
272 #define GDI_DPSanan 0x00D50CE9
273 #define GDI_PSDPSaoxx 0x00D616EA
274 #define GDI_DPSxan 0x00D70349
275 #define GDI_PDSPxax 0x00D80745
276 #define GDI_SDPSaoxn 0x00D906E8
277 #define GDI_DPSDanax 0x00DA1CE9
278 #define GDI_SPxDSxan 0x00DB0D75
279 #define GDI_SPDnao 0x00DC0B04
280 #define GDI_SDno 0x00DD0228
281 #define GDI_SDPxo 0x00DE0268
282 #define GDI_SDPano 0x00DF08C8
283 #define GDI_PDSoa 0x00E003A5
284 #define GDI_PDSoxn 0x00E10185
285 #define GDI_DSPDxax 0x00E20746
286 #define GDI_PSDPaoxn 0x00E306EA
287 #define GDI_SDPSxax 0x00E40748
288 #define GDI_PDSPaoxn 0x00E506E5
289 #define GDI_SDPSanax 0x00E61CE8
290 #define GDI_SPxPDxan 0x00E70D79
291 #define GDI_SSPxDSxax 0x00E81D74
292 #define GDI_DSPDSanaxxn 0x00E95CE6
293 #define GDI_DPSao 0x00EA02E9
294 #define GDI_DPSxno 0x00EB0849
295 #define GDI_SDPao 0x00EC02E8
296 #define GDI_SDPxno 0x00ED0848
297 #define GDI_SRCPAINT 0x00EE0086
298 #define GDI_SDPnoo 0x00EF0A08
299 #define GDI_PATCOPY 0x00F00021
300 #define GDI_PDSono 0x00F10885
301 #define GDI_PDSnao 0x00F20B05
302 #define GDI_PSno 0x00F3022A
303 #define GDI_PSDnao 0x00F40B0A
304 #define GDI_PDno 0x00F50225
305 #define GDI_PDSxo 0x00F60265
306 #define GDI_PDSano 0x00F708C5
307 #define GDI_PDSao 0x00F802E5
308 #define GDI_PDSxno 0x00F90845
309 #define GDI_DPo 0x00FA0089
310 #define GDI_PATPAINT 0x00FB0A09
311 #define GDI_PSo 0x00FC008A
312 #define GDI_PSDnoo 0x00FD0A0A
313 #define GDI_DPSoo 0x00FE02A9
314 #define GDI_WHITENESS 0x00FF0062
315 #define GDI_GLYPH_ORDER 0xFFFFFFFF
316 
317 /* Brush Styles */
318 #define GDI_BS_SOLID 0x00
319 #define GDI_BS_NULL 0x01
320 #define GDI_BS_HATCHED 0x02
321 #define GDI_BS_PATTERN 0x03
322 
323 /* Hatch Patterns */
324 #define GDI_HS_HORIZONTAL 0x00
325 #define GDI_HS_VERTICAL 0x01
326 #define GDI_HS_FDIAGONAL 0x02
327 #define GDI_HS_BDIAGONAL 0x03
328 #define GDI_HS_CROSS 0x04
329 #define GDI_HS_DIAGCROSS 0x05
330 
331 /* Pen Styles */
332 #define GDI_PS_SOLID 0x00
333 #define GDI_PS_DASH 0x01
334 #define GDI_PS_NULL 0x05
335 
336 /* Background Modes */
337 #define GDI_OPAQUE 0x00000001
338 #define GDI_TRANSPARENT 0x00000002
339 
340 /* Fill Modes */
341 #define GDI_FILL_ALTERNATE 0x01
342 #define GDI_FILL_WINDING 0x02
343 
344 /* GDI Object Types */
345 #define GDIOBJECT_BITMAP 0x00
346 #define GDIOBJECT_PEN 0x01
347 #define GDIOBJECT_PALETTE 0x02
348 #define GDIOBJECT_BRUSH 0x03
349 #define GDIOBJECT_RECT 0x04
350 #define GDIOBJECT_REGION 0x05
351 
352 /* Region return values */
353 #ifndef NULLREGION
354 #define NULLREGION 0x01
355 #define SIMPLEREGION 0x02
356 #define COMPLEXREGION 0x03
357 #endif
358 
359 struct _GDIOBJECT
360 {
361 	BYTE objectType;
362 };
363 typedef struct _GDIOBJECT GDIOBJECT;
364 typedef GDIOBJECT* HGDIOBJECT;
365 
366 struct _GDI_RECT
367 {
368 	BYTE objectType;
369 	INT32 left;
370 	INT32 top;
371 	INT32 right;
372 	INT32 bottom;
373 };
374 typedef struct _GDI_RECT GDI_RECT;
375 typedef GDI_RECT* HGDI_RECT;
376 
377 struct _GDI_RGN
378 {
379 	BYTE objectType;
380 	INT32 x;   /* left */
381 	INT32 y;   /* top */
382 	INT32 w;   /* width */
383 	INT32 h;   /* height */
384 	BOOL null; /* null region */
385 };
386 typedef struct _GDI_RGN GDI_RGN;
387 typedef GDI_RGN* HGDI_RGN;
388 
389 struct _GDI_BITMAP
390 {
391 	BYTE objectType;
392 	UINT32 format;
393 	INT32 width;
394 	INT32 height;
395 	UINT32 scanline;
396 	BYTE* data;
397 	void (*free)(void*);
398 };
399 typedef struct _GDI_BITMAP GDI_BITMAP;
400 typedef GDI_BITMAP* HGDI_BITMAP;
401 
402 struct _GDI_PEN
403 {
404 	BYTE objectType;
405 	UINT32 style;
406 	INT32 width;
407 	INT32 posX;
408 	INT32 posY;
409 	UINT32 color;
410 	UINT32 format;
411 	const gdiPalette* palette;
412 };
413 typedef struct _GDI_PEN GDI_PEN;
414 typedef GDI_PEN* HGDI_PEN;
415 
416 struct _GDI_PALETTEENTRY
417 {
418 	BYTE red;
419 	BYTE green;
420 	BYTE blue;
421 };
422 typedef struct _GDI_PALETTEENTRY GDI_PALETTEENTRY;
423 
424 struct _GDI_PALETTE
425 {
426 	UINT16 count;
427 	GDI_PALETTEENTRY* entries;
428 };
429 typedef struct _GDI_PALETTE GDI_PALETTE;
430 typedef GDI_PALETTE* HGDI_PALETTE;
431 
432 struct _GDI_POINT
433 {
434 	INT32 x;
435 	INT32 y;
436 };
437 typedef struct _GDI_POINT GDI_POINT;
438 typedef GDI_POINT* HGDI_POINT;
439 
440 struct _GDI_BRUSH
441 {
442 	BYTE objectType;
443 	int style;
444 	HGDI_BITMAP pattern;
445 	UINT32 color;
446 	INT32 nXOrg;
447 	INT32 nYOrg;
448 };
449 typedef struct _GDI_BRUSH GDI_BRUSH;
450 typedef GDI_BRUSH* HGDI_BRUSH;
451 
452 struct _GDI_WND
453 {
454 	UINT32 count;
455 	INT32 ninvalid;
456 	HGDI_RGN invalid;
457 	HGDI_RGN cinvalid;
458 };
459 typedef struct _GDI_WND GDI_WND;
460 typedef GDI_WND* HGDI_WND;
461 
462 struct _GDI_DC
463 {
464 	HGDIOBJECT selectedObject;
465 	UINT32 format;
466 	UINT32 bkColor;
467 	UINT32 textColor;
468 	HGDI_BRUSH brush;
469 	HGDI_RGN clip;
470 	HGDI_PEN pen;
471 	HGDI_WND hwnd;
472 	INT32 drawMode;
473 	INT32 bkMode;
474 };
475 typedef struct _GDI_DC GDI_DC;
476 typedef GDI_DC* HGDI_DC;
477 
478 struct gdi_bitmap
479 {
480 	rdpBitmap _p;
481 
482 	HGDI_DC hdc;
483 	HGDI_BITMAP bitmap;
484 	HGDI_BITMAP org_bitmap;
485 };
486 typedef struct gdi_bitmap gdiBitmap;
487 
488 struct gdi_glyph
489 {
490 	rdpBitmap _p;
491 
492 	HGDI_DC hdc;
493 	HGDI_BITMAP bitmap;
494 	HGDI_BITMAP org_bitmap;
495 };
496 typedef struct gdi_glyph gdiGlyph;
497 
498 struct rdp_gdi
499 {
500 	rdpContext* context;
501 
502 	INT32 width;
503 	INT32 height;
504 	UINT32 stride;
505 	UINT32 dstFormat;
506 	UINT32 cursor_x;
507 	UINT32 cursor_y;
508 
509 	HGDI_DC hdc;
510 	gdiBitmap* primary;
511 	gdiBitmap* drawing;
512 	UINT32 bitmap_size;
513 	UINT32 bitmap_stride;
514 	BYTE* primary_buffer;
515 	gdiPalette palette;
516 	gdiBitmap* image;
517 	void (*free)(void*);
518 
519 	BOOL inGfxFrame;
520 #if !defined(DEFINE_NO_DEPRECATED)
521 	WINPR_DEPRECATED(BOOL graphicsReset); /* deprecated, remove with FreeRDP v3 */
522 #endif
523 	BOOL suppressOutput;
524 	UINT16 outputSurfaceId;
525 	RdpgfxClientContext* gfx;
526 	VideoClientContext* video;
527 	GeometryClientContext* geometry;
528 
529 	wLog* log;
530 	UINT32 frameId;
531 };
532 
533 #ifdef __cplusplus
534 extern "C"
535 {
536 #endif
537 
538 	FREERDP_API DWORD gdi_rop3_code(BYTE code);
539 	FREERDP_API const char* gdi_rop3_code_string(BYTE code);
540 	FREERDP_API const char* gdi_rop3_string(DWORD rop);
541 
542 	FREERDP_API UINT32 gdi_get_pixel_format(UINT32 bitsPerPixel);
543 	FREERDP_API BOOL gdi_decode_color(rdpGdi* gdi, const UINT32 srcColor, UINT32* color,
544 	                                  UINT32* format);
545 	FREERDP_API BOOL gdi_resize(rdpGdi* gdi, UINT32 width, UINT32 height);
546 	FREERDP_API BOOL gdi_resize_ex(rdpGdi* gdi, UINT32 width, UINT32 height, UINT32 stride,
547 	                               UINT32 format, BYTE* buffer, void (*pfree)(void*));
548 	FREERDP_API BOOL gdi_init(freerdp* instance, UINT32 format);
549 	FREERDP_API BOOL gdi_init_ex(freerdp* instance, UINT32 format, UINT32 stride, BYTE* buffer,
550 	                             void (*pfree)(void*));
551 	FREERDP_API void gdi_free(freerdp* instance);
552 
553 	FREERDP_API BOOL gdi_send_suppress_output(rdpGdi* gdi, BOOL suppress);
554 
555 #ifdef __cplusplus
556 }
557 #endif
558 
559 #endif /* FREERDP_GDI_H */
560