Coverage Report

Created: 2025-07-01 06:46

/src/FreeRDP/libfreerdp/gdi/brush.c
Line
Count
Source (jump to first uncovered line)
1
/**
2
 * FreeRDP: A Remote Desktop Protocol Implementation
3
 * GDI Brush Functions
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
/* GDI Brush Functions: http://msdn.microsoft.com/en-us/library/dd183395/ */
23
24
#include <freerdp/config.h>
25
26
#include <stdio.h>
27
#include <stdlib.h>
28
29
#include <freerdp/freerdp.h>
30
#include <freerdp/gdi/gdi.h>
31
#include <freerdp/gdi/region.h>
32
#include <freerdp/log.h>
33
34
#include "brush.h"
35
#include "clipping.h"
36
37
const char* gdi_rop_to_string(UINT32 code)
38
0
{
39
0
  switch (code)
40
0
  {
41
0
    case GDI_BLACKNESS:
42
0
      return "0";
43
44
0
    case GDI_DPSoon:
45
0
      return "DPSoon";
46
47
0
    case GDI_DPSona:
48
0
      return "DPSona";
49
50
0
    case GDI_PSon:
51
0
      return "PSon";
52
53
0
    case GDI_SDPona:
54
0
      return "SDPona";
55
56
0
    case GDI_DPon:
57
0
      return "DPon";
58
59
0
    case GDI_PDSxnon:
60
0
      return "PDSxnon";
61
62
0
    case GDI_PDSaon:
63
0
      return "PDSaon";
64
65
0
    case GDI_SDPnaa:
66
0
      return "SDPnaa";
67
68
0
    case GDI_PDSxon:
69
0
      return "PDSxon";
70
71
0
    case GDI_DPna:
72
0
      return "DPna";
73
74
0
    case GDI_PSDnaon:
75
0
      return "PSDnaon";
76
77
0
    case GDI_SPna:
78
0
      return "SPna";
79
80
0
    case GDI_PDSnaon:
81
0
      return "PDSnaon";
82
83
0
    case GDI_PDSonon:
84
0
      return "PDSonon";
85
86
0
    case GDI_Pn:
87
0
      return "Pn";
88
89
0
    case GDI_PDSona:
90
0
      return "PDSona";
91
92
0
    case GDI_NOTSRCERASE:
93
0
      return "DSon";
94
95
0
    case GDI_SDPxnon:
96
0
      return "SDPxnon";
97
98
0
    case GDI_SDPaon:
99
0
      return "SDPaon";
100
101
0
    case GDI_DPSxnon:
102
0
      return "DPSxnon";
103
104
0
    case GDI_DPSaon:
105
0
      return "DPSaon";
106
107
0
    case GDI_PSDPSanaxx:
108
0
      return "PSDPSanaxx";
109
110
0
    case GDI_SSPxDSxaxn:
111
0
      return "SSPxDSxaxn";
112
113
0
    case GDI_SPxPDxa:
114
0
      return "SPxPDxa";
115
116
0
    case GDI_SDPSanaxn:
117
0
      return "SDPSanaxn";
118
119
0
    case GDI_PDSPaox:
120
0
      return "PDSPaox";
121
122
0
    case GDI_SDPSxaxn:
123
0
      return "SDPSxaxn";
124
125
0
    case GDI_PSDPaox:
126
0
      return "PSDPaox";
127
128
0
    case GDI_DSPDxaxn:
129
0
      return "DSPDxaxn";
130
131
0
    case GDI_PDSox:
132
0
      return "PDSox";
133
134
0
    case GDI_PDSoan:
135
0
      return "PDSoan";
136
137
0
    case GDI_DPSnaa:
138
0
      return "DPSnaa";
139
140
0
    case GDI_SDPxon:
141
0
      return "SDPxon";
142
143
0
    case GDI_DSna:
144
0
      return "DSna";
145
146
0
    case GDI_SPDnaon:
147
0
      return "SPDnaon";
148
149
0
    case GDI_SPxDSxa:
150
0
      return "SPxDSxa";
151
152
0
    case GDI_PDSPanaxn:
153
0
      return "PDSPanaxn";
154
155
0
    case GDI_SDPSaox:
156
0
      return "SDPSaox";
157
158
0
    case GDI_SDPSxnox:
159
0
      return "SDPSxnox";
160
161
0
    case GDI_DPSxa:
162
0
      return "DPSxa";
163
164
0
    case GDI_PSDPSaoxxn:
165
0
      return "PSDPSaoxxn";
166
167
0
    case GDI_DPSana:
168
0
      return "DPSana";
169
170
0
    case GDI_SSPxPDxaxn:
171
0
      return "SSPxPDxaxn";
172
173
0
    case GDI_SPDSoax:
174
0
      return "SPDSoax";
175
176
0
    case GDI_PSDnox:
177
0
      return "PSDnox";
178
179
0
    case GDI_PSDPxox:
180
0
      return "PSDPxox";
181
182
0
    case GDI_PSDnoan:
183
0
      return "PSDnoan";
184
185
0
    case GDI_PSna:
186
0
      return "PSna";
187
188
0
    case GDI_SDPnaon:
189
0
      return "SDPnaon";
190
191
0
    case GDI_SDPSoox:
192
0
      return "SDPSoox";
193
194
0
    case GDI_NOTSRCCOPY:
195
0
      return "Sn";
196
197
0
    case GDI_SPDSaox:
198
0
      return "SPDSaox";
199
200
0
    case GDI_SPDSxnox:
201
0
      return "SPDSxnox";
202
203
0
    case GDI_SDPox:
204
0
      return "SDPox";
205
206
0
    case GDI_SDPoan:
207
0
      return "SDPoan";
208
209
0
    case GDI_PSDPoax:
210
0
      return "PSDPoax";
211
212
0
    case GDI_SPDnox:
213
0
      return "SPDnox";
214
215
0
    case GDI_SPDSxox:
216
0
      return "SPDSxox";
217
218
0
    case GDI_SPDnoan:
219
0
      return "SPDnoan";
220
221
0
    case GDI_PSx:
222
0
      return "PSx";
223
224
0
    case GDI_SPDSonox:
225
0
      return "SPDSonox";
226
227
0
    case GDI_SPDSnaox:
228
0
      return "SPDSnaox";
229
230
0
    case GDI_PSan:
231
0
      return "PSan";
232
233
0
    case GDI_PSDnaa:
234
0
      return "PSDnaa";
235
236
0
    case GDI_DPSxon:
237
0
      return "DPSxon";
238
239
0
    case GDI_SDxPDxa:
240
0
      return "SDxPDxa";
241
242
0
    case GDI_SPDSanaxn:
243
0
      return "SPDSanaxn";
244
245
0
    case GDI_SRCERASE:
246
0
      return "SDna";
247
248
0
    case GDI_DPSnaon:
249
0
      return "DPSnaon";
250
251
0
    case GDI_DSPDaox:
252
0
      return "DSPDaox";
253
254
0
    case GDI_PSDPxaxn:
255
0
      return "PSDPxaxn";
256
257
0
    case GDI_SDPxa:
258
0
      return "SDPxa";
259
260
0
    case GDI_PDSPDaoxxn:
261
0
      return "PDSPDaoxxn";
262
263
0
    case GDI_DPSDoax:
264
0
      return "DPSDoax";
265
266
0
    case GDI_PDSnox:
267
0
      return "PDSnox";
268
269
0
    case GDI_SDPana:
270
0
      return "SDPana";
271
272
0
    case GDI_SSPxDSxoxn:
273
0
      return "SSPxDSxoxn";
274
275
0
    case GDI_PDSPxox:
276
0
      return "PDSPxox";
277
278
0
    case GDI_PDSnoan:
279
0
      return "PDSnoan";
280
281
0
    case GDI_PDna:
282
0
      return "PDna";
283
284
0
    case GDI_DSPnaon:
285
0
      return "DSPnaon";
286
287
0
    case GDI_DPSDaox:
288
0
      return "DPSDaox";
289
290
0
    case GDI_SPDSxaxn:
291
0
      return "SPDSxaxn";
292
293
0
    case GDI_DPSonon:
294
0
      return "DPSonon";
295
296
0
    case GDI_DSTINVERT:
297
0
      return "Dn";
298
299
0
    case GDI_DPSox:
300
0
      return "DPSox";
301
302
0
    case GDI_DPSoan:
303
0
      return "DPSoan";
304
305
0
    case GDI_PDSPoax:
306
0
      return "PDSPoax";
307
308
0
    case GDI_DPSnox:
309
0
      return "DPSnox";
310
311
0
    case GDI_PATINVERT:
312
0
      return "DPx";
313
314
0
    case GDI_DPSDonox:
315
0
      return "DPSDonox";
316
317
0
    case GDI_DPSDxox:
318
0
      return "DPSDxox";
319
320
0
    case GDI_DPSnoan:
321
0
      return "DPSnoan";
322
323
0
    case GDI_DPSDnaox:
324
0
      return "DPSDnaox";
325
326
0
    case GDI_DPan:
327
0
      return "DPan";
328
329
0
    case GDI_PDSxa:
330
0
      return "PDSxa";
331
332
0
    case GDI_DSPDSaoxxn:
333
0
      return "DSPDSaoxxn";
334
335
0
    case GDI_DSPDoax:
336
0
      return "DSPDoax";
337
338
0
    case GDI_SDPnox:
339
0
      return "SDPnox";
340
341
0
    case GDI_SDPSoax:
342
0
      return "SDPSoax";
343
344
0
    case GDI_DSPnox:
345
0
      return "DSPnox";
346
347
0
    case GDI_SRCINVERT:
348
0
      return "DSx";
349
350
0
    case GDI_SDPSonox:
351
0
      return "SDPSonox";
352
353
0
    case GDI_DSPDSonoxxn:
354
0
      return "DSPDSonoxxn";
355
356
0
    case GDI_PDSxxn:
357
0
      return "PDSxxn";
358
359
0
    case GDI_DPSax:
360
0
      return "DPSax";
361
362
0
    case GDI_PSDPSoaxxn:
363
0
      return "PSDPSoaxxn";
364
365
0
    case GDI_SDPax:
366
0
      return "SDPax";
367
368
0
    case GDI_PDSPDoaxxn:
369
0
      return "PDSPDoaxxn";
370
371
0
    case GDI_SDPSnoax:
372
0
      return "SDPSnoax";
373
374
0
    case GDI_PDSxnan:
375
0
      return "PDSxnan";
376
377
0
    case GDI_PDSana:
378
0
      return "PDSana";
379
380
0
    case GDI_SSDxPDxaxn:
381
0
      return "SSDxPDxaxn";
382
383
0
    case GDI_SDPSxox:
384
0
      return "SDPSxox";
385
386
0
    case GDI_SDPnoan:
387
0
      return "SDPnoan";
388
389
0
    case GDI_DSPDxox:
390
0
      return "DSPDxox";
391
392
0
    case GDI_DSPnoan:
393
0
      return "DSPnoan";
394
395
0
    case GDI_SDPSnaox:
396
0
      return "SDPSnaox";
397
398
0
    case GDI_DSan:
399
0
      return "DSan";
400
401
0
    case GDI_PDSax:
402
0
      return "PDSax";
403
404
0
    case GDI_DSPDSoaxxn:
405
0
      return "DSPDSoaxxn";
406
407
0
    case GDI_DPSDnoax:
408
0
      return "DPSDnoax";
409
410
0
    case GDI_SDPxnan:
411
0
      return "SDPxnan";
412
413
0
    case GDI_SPDSnoax:
414
0
      return "SPDSnoax";
415
416
0
    case GDI_DPSxnan:
417
0
      return "DPSxnan";
418
419
0
    case GDI_SPxDSxo:
420
0
      return "SPxDSxo";
421
422
0
    case GDI_DPSaan:
423
0
      return "DPSaan";
424
425
0
    case GDI_DPSaa:
426
0
      return "DPSaa";
427
428
0
    case GDI_SPxDSxon:
429
0
      return "SPxDSxon";
430
431
0
    case GDI_DPSxna:
432
0
      return "DPSxna";
433
434
0
    case GDI_SPDSnoaxn:
435
0
      return "SPDSnoaxn";
436
437
0
    case GDI_SDPxna:
438
0
      return "SDPxna";
439
440
0
    case GDI_PDSPnoaxn:
441
0
      return "PDSPnoaxn";
442
443
0
    case GDI_DSPDSoaxx:
444
0
      return "DSPDSoaxx";
445
446
0
    case GDI_PDSaxn:
447
0
      return "PDSaxn";
448
449
0
    case GDI_SRCAND:
450
0
      return "DSa";
451
452
0
    case GDI_SDPSnaoxn:
453
0
      return "SDPSnaoxn";
454
455
0
    case GDI_DSPnoa:
456
0
      return "DSPnoa";
457
458
0
    case GDI_DSPDxoxn:
459
0
      return "DSPDxoxn";
460
461
0
    case GDI_SDPnoa:
462
0
      return "SDPnoa";
463
464
0
    case GDI_SDPSxoxn:
465
0
      return "SDPSxoxn";
466
467
0
    case GDI_SSDxPDxax:
468
0
      return "SSDxPDxax";
469
470
0
    case GDI_PDSanan:
471
0
      return "PDSanan";
472
473
0
    case GDI_PDSxna:
474
0
      return "PDSxna";
475
476
0
    case GDI_SDPSnoaxn:
477
0
      return "SDPSnoaxn";
478
479
0
    case GDI_DPSDPoaxx:
480
0
      return "DPSDPoaxx";
481
482
0
    case GDI_SPDaxn:
483
0
      return "SPDaxn";
484
485
0
    case GDI_PSDPSoaxx:
486
0
      return "PSDPSoaxx";
487
488
0
    case GDI_DPSaxn:
489
0
      return "DPSaxn";
490
491
0
    case GDI_DPSxx:
492
0
      return "DPSxx";
493
494
0
    case GDI_PSDPSonoxx:
495
0
      return "PSDPSonoxx";
496
497
0
    case GDI_SDPSonoxn:
498
0
      return "SDPSonoxn";
499
500
0
    case GDI_DSxn:
501
0
      return "DSxn";
502
503
0
    case GDI_DPSnax:
504
0
      return "DPSnax";
505
506
0
    case GDI_SDPSoaxn:
507
0
      return "SDPSoaxn";
508
509
0
    case GDI_SPDnax:
510
0
      return "SPDnax";
511
512
0
    case GDI_DSPDoaxn:
513
0
      return "DSPDoaxn";
514
515
0
    case GDI_DSPDSaoxx:
516
0
      return "DSPDSaoxx";
517
518
0
    case GDI_PDSxan:
519
0
      return "PDSxan";
520
521
0
    case GDI_DPa:
522
0
      return "DPa";
523
524
0
    case GDI_PDSPnaoxn:
525
0
      return "PDSPnaoxn";
526
527
0
    case GDI_DPSnoa:
528
0
      return "DPSnoa";
529
530
0
    case GDI_DPSDxoxn:
531
0
      return "DPSDxoxn";
532
533
0
    case GDI_PDSPonoxn:
534
0
      return "PDSPonoxn";
535
536
0
    case GDI_PDxn:
537
0
      return "PDxn";
538
539
0
    case GDI_DSPnax:
540
0
      return "DSPnax";
541
542
0
    case GDI_PDSPoaxn:
543
0
      return "PDSPoaxn";
544
545
0
    case GDI_DPSoa:
546
0
      return "DPSoa";
547
548
0
    case GDI_DPSoxn:
549
0
      return "DPSoxn";
550
551
0
    case GDI_DSTCOPY:
552
0
      return "D";
553
554
0
    case GDI_DPSono:
555
0
      return "DPSono";
556
557
0
    case GDI_SPDSxax:
558
0
      return "SPDSxax";
559
560
0
    case GDI_DPSDaoxn:
561
0
      return "DPSDaoxn";
562
563
0
    case GDI_DSPnao:
564
0
      return "DSPnao";
565
566
0
    case GDI_DPno:
567
0
      return "DPno";
568
569
0
    case GDI_PDSnoa:
570
0
      return "PDSnoa";
571
572
0
    case GDI_PDSPxoxn:
573
0
      return "PDSPxoxn";
574
575
0
    case GDI_SSPxDSxox:
576
0
      return "SSPxDSxox";
577
578
0
    case GDI_SDPanan:
579
0
      return "SDPanan";
580
581
0
    case GDI_PSDnax:
582
0
      return "PSDnax";
583
584
0
    case GDI_DPSDoaxn:
585
0
      return "DPSDoaxn";
586
587
0
    case GDI_DPSDPaoxx:
588
0
      return "DPSDPaoxx";
589
590
0
    case GDI_SDPxan:
591
0
      return "SDPxan";
592
593
0
    case GDI_PSDPxax:
594
0
      return "PSDPxax";
595
596
0
    case GDI_DSPDaoxn:
597
0
      return "DSPDaoxn";
598
599
0
    case GDI_DPSnao:
600
0
      return "DPSnao";
601
602
0
    case GDI_MERGEPAINT:
603
0
      return "DSno";
604
605
0
    case GDI_SPDSanax:
606
0
      return "SPDSanax";
607
608
0
    case GDI_SDxPDxan:
609
0
      return "SDxPDxan";
610
611
0
    case GDI_DPSxo:
612
0
      return "DPSxo";
613
614
0
    case GDI_DPSano:
615
0
      return "DPSano";
616
617
0
    case GDI_MERGECOPY:
618
0
      return "PSa";
619
620
0
    case GDI_SPDSnaoxn:
621
0
      return "SPDSnaoxn";
622
623
0
    case GDI_SPDSonoxn:
624
0
      return "SPDSonoxn";
625
626
0
    case GDI_PSxn:
627
0
      return "PSxn";
628
629
0
    case GDI_SPDnoa:
630
0
      return "SPDnoa";
631
632
0
    case GDI_SPDSxoxn:
633
0
      return "SPDSxoxn";
634
635
0
    case GDI_SDPnax:
636
0
      return "SDPnax";
637
638
0
    case GDI_PSDPoaxn:
639
0
      return "PSDPoaxn";
640
641
0
    case GDI_SDPoa:
642
0
      return "SDPoa";
643
644
0
    case GDI_SPDoxn:
645
0
      return "SPDoxn";
646
647
0
    case GDI_DPSDxax:
648
0
      return "DPSDxax";
649
650
0
    case GDI_SPDSaoxn:
651
0
      return "SPDSaoxn";
652
653
0
    case GDI_SRCCOPY:
654
0
      return "S";
655
656
0
    case GDI_SDPono:
657
0
      return "SDPono";
658
659
0
    case GDI_SDPnao:
660
0
      return "SDPnao";
661
662
0
    case GDI_SPno:
663
0
      return "SPno";
664
665
0
    case GDI_PSDnoa:
666
0
      return "PSDnoa";
667
668
0
    case GDI_PSDPxoxn:
669
0
      return "PSDPxoxn";
670
671
0
    case GDI_PDSnax:
672
0
      return "PDSnax";
673
674
0
    case GDI_SPDSoaxn:
675
0
      return "SPDSoaxn";
676
677
0
    case GDI_SSPxPDxax:
678
0
      return "SSPxPDxax";
679
680
0
    case GDI_DPSanan:
681
0
      return "DPSanan";
682
683
0
    case GDI_PSDPSaoxx:
684
0
      return "PSDPSaoxx";
685
686
0
    case GDI_DPSxan:
687
0
      return "DPSxan";
688
689
0
    case GDI_PDSPxax:
690
0
      return "PDSPxax";
691
692
0
    case GDI_SDPSaoxn:
693
0
      return "SDPSaoxn";
694
695
0
    case GDI_DPSDanax:
696
0
      return "DPSDanax";
697
698
0
    case GDI_SPxDSxan:
699
0
      return "SPxDSxan";
700
701
0
    case GDI_SPDnao:
702
0
      return "SPDnao";
703
704
0
    case GDI_SDno:
705
0
      return "SDno";
706
707
0
    case GDI_SDPxo:
708
0
      return "SDPxo";
709
710
0
    case GDI_SDPano:
711
0
      return "SDPano";
712
713
0
    case GDI_PDSoa:
714
0
      return "PDSoa";
715
716
0
    case GDI_PDSoxn:
717
0
      return "PDSoxn";
718
719
0
    case GDI_DSPDxax:
720
0
      return "DSPDxax";
721
722
0
    case GDI_PSDPaoxn:
723
0
      return "PSDPaoxn";
724
725
0
    case GDI_SDPSxax:
726
0
      return "SDPSxax";
727
728
0
    case GDI_PDSPaoxn:
729
0
      return "PDSPaoxn";
730
731
0
    case GDI_SDPSanax:
732
0
      return "SDPSanax";
733
734
0
    case GDI_SPxPDxan:
735
0
      return "SPxPDxan";
736
737
0
    case GDI_SSPxDSxax:
738
0
      return "SSPxDSxax";
739
740
0
    case GDI_DSPDSanaxxn:
741
0
      return "DSPDSanaxxn";
742
743
0
    case GDI_DPSao:
744
0
      return "DPSao";
745
746
0
    case GDI_DPSxno:
747
0
      return "DPSxno";
748
749
0
    case GDI_SDPao:
750
0
      return "SDPao";
751
752
0
    case GDI_SDPxno:
753
0
      return "SDPxno";
754
755
0
    case GDI_SRCPAINT:
756
0
      return "DSo";
757
758
0
    case GDI_SDPnoo:
759
0
      return "SDPnoo";
760
761
0
    case GDI_PATCOPY:
762
0
      return "P";
763
764
0
    case GDI_PDSono:
765
0
      return "PDSono";
766
767
0
    case GDI_PDSnao:
768
0
      return "PDSnao";
769
770
0
    case GDI_PSno:
771
0
      return "PSno";
772
773
0
    case GDI_PSDnao:
774
0
      return "PSDnao";
775
776
0
    case GDI_PDno:
777
0
      return "PDno";
778
779
0
    case GDI_PDSxo:
780
0
      return "PDSxo";
781
782
0
    case GDI_PDSano:
783
0
      return "PDSano";
784
785
0
    case GDI_PDSao:
786
0
      return "PDSao";
787
788
0
    case GDI_PDSxno:
789
0
      return "PDSxno";
790
791
0
    case GDI_DPo:
792
0
      return "DPo";
793
794
0
    case GDI_PATPAINT:
795
0
      return "DPSnoo";
796
797
0
    case GDI_PSo:
798
0
      return "PSo";
799
800
0
    case GDI_PSDnoo:
801
0
      return "PSDnoo";
802
803
0
    case GDI_DPSoo:
804
0
      return "DPSoo";
805
806
0
    case GDI_WHITENESS:
807
0
      return "1";
808
809
0
    case GDI_GLYPH_ORDER:
810
0
      return "SPaDSnao";
811
812
0
    default:
813
0
      return "";
814
0
  }
815
0
}
816
817
/**
818
 * @brief Create a new solid brush.
819
 * msdn{dd183518}
820
 *
821
 * @param crColor brush color
822
 * @return new brush
823
 */
824
HGDI_BRUSH gdi_CreateSolidBrush(UINT32 crColor)
825
0
{
826
0
  HGDI_BRUSH hBrush = (HGDI_BRUSH)calloc(1, sizeof(GDI_BRUSH));
827
828
0
  if (!hBrush)
829
0
    return NULL;
830
831
0
  hBrush->objectType = GDIOBJECT_BRUSH;
832
0
  hBrush->style = GDI_BS_SOLID;
833
0
  hBrush->color = crColor;
834
0
  return hBrush;
835
0
}
836
/**
837
 * @brief Create a new pattern brush.
838
 * msdn{dd183508}
839
 *
840
 * @param hbmp pattern bitmap
841
 * @return new brush
842
 */
843
HGDI_BRUSH gdi_CreatePatternBrush(HGDI_BITMAP hbmp)
844
0
{
845
0
  HGDI_BRUSH hBrush = (HGDI_BRUSH)calloc(1, sizeof(GDI_BRUSH));
846
847
0
  if (!hBrush)
848
0
    return NULL;
849
850
0
  hBrush->objectType = GDIOBJECT_BRUSH;
851
0
  hBrush->style = GDI_BS_PATTERN;
852
0
  hBrush->pattern = hbmp;
853
0
  return hBrush;
854
0
}
855
856
HGDI_BRUSH gdi_CreateHatchBrush(HGDI_BITMAP hbmp)
857
0
{
858
0
  HGDI_BRUSH hBrush = (HGDI_BRUSH)calloc(1, sizeof(GDI_BRUSH));
859
860
0
  if (!hBrush)
861
0
    return NULL;
862
863
0
  hBrush->objectType = GDIOBJECT_BRUSH;
864
0
  hBrush->style = GDI_BS_HATCHED;
865
0
  hBrush->pattern = hbmp;
866
0
  return hBrush;
867
0
}