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