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