Coverage Report

Created: 2024-05-20 06:11

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