ReactOS 0.4.16-dev-2234-gabd201b
engbrush.c File Reference
#include <win32k.h>
Include dependency graph for engbrush.c:

Go to the source code of this file.

Functions

 DBG_DEFAULT_CHANNEL (EngBrush)
 
NTSTATUS NTAPI InitBrushImpl (VOID)
 
VOID NTAPI EBRUSHOBJ_vInit (EBRUSHOBJ *pebo, PBRUSH pbrush, PSURFACE psurf, COLORREF crBackgroundClr, COLORREF crForegroundClr, PPALETTE ppalDC)
 
VOID NTAPI EBRUSHOBJ_vInitFromDC (EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
 
VOID FASTCALL EBRUSHOBJ_vSetSolidRGBColor (EBRUSHOBJ *pebo, COLORREF crColor)
 
VOID NTAPI EBRUSHOBJ_vCleanup (EBRUSHOBJ *pebo)
 
VOID NTAPI EBRUSHOBJ_vUpdateFromDC (EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
 
BOOL APIENTRY EngRealizeBrush (BRUSHOBJ *pbo, SURFOBJ *psoDst, SURFOBJ *psoPattern, SURFOBJ *psoMask, XLATEOBJ *pxlo, ULONG iHatch)
 
static PPALETTE FixupDIBBrushPalette (_In_ PPALETTE ppalDIB, _In_ PPALETTE ppalDC)
 
BOOL NTAPI EBRUSHOBJ_bRealizeBrush (EBRUSHOBJ *pebo, BOOL bCallDriver)
 
PVOID NTAPI EBRUSHOBJ_pvGetEngBrush (EBRUSHOBJ *pebo)
 
SURFOBJ *NTAPI EBRUSHOBJ_psoPattern (EBRUSHOBJ *pebo)
 
SURFOBJ *NTAPI EBRUSHOBJ_psoMask (EBRUSHOBJ *pebo)
 
PVOID APIENTRY BRUSHOBJ_pvAllocRbrush (IN BRUSHOBJ *pbo, IN ULONG cj)
 
PVOID APIENTRY BRUSHOBJ_pvGetRbrush (IN BRUSHOBJ *pbo)
 
ULONG APIENTRY BRUSHOBJ_ulGetBrushColor (IN BRUSHOBJ *pbo)
 

Variables

static const ULONG gaulHatchBrushes [HS_DDI_MAX][8]
 
HSURF gahsurfHatch [HS_DDI_MAX]
 

Function Documentation

◆ BRUSHOBJ_pvAllocRbrush()

PVOID APIENTRY BRUSHOBJ_pvAllocRbrush ( IN BRUSHOBJ pbo,
IN ULONG  cj 
)

Exported DDI functions

Definition at line 509 of file engbrush.c.

512{
513 pbo->pvRbrush = EngAllocMem(0, cj, GDITAG_RBRUSH);
514 return pbo->pvRbrush;
515}
void * EngAllocMem(int zero, unsigned long size, int tag=0)
Definition: polytest.cpp:70
#define GDITAG_RBRUSH
Definition: tags.h:70
_In_ ULONG cj
Definition: winddi.h:3540
_In_opt_ SURFOBJ _In_opt_ SURFOBJ _In_ CLIPOBJ _In_opt_ XLATEOBJ _In_ RECTL _In_opt_ POINTL _In_opt_ POINTL _In_opt_ BRUSHOBJ * pbo
Definition: winddi.h:3440

◆ BRUSHOBJ_pvGetRbrush()

PVOID APIENTRY BRUSHOBJ_pvGetRbrush ( IN BRUSHOBJ pbo)

Definition at line 521 of file engbrush.c.

523{
524 EBRUSHOBJ *pebo = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject);
525 BOOL bResult;
526
527 if (!pbo->pvRbrush)
528 {
529 bResult = EBRUSHOBJ_bRealizeBrush(pebo, TRUE);
530 if (!bResult)
531 {
532 if (pbo->pvRbrush)
533 {
534 EngFreeMem(pbo->pvRbrush);
535 pbo->pvRbrush = NULL;
536 }
537 }
538 }
539
540 return pbo->pvRbrush;
541}
#define NULL
Definition: types.h:112
#define TRUE
Definition: types.h:120
BOOL NTAPI EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ *pebo, BOOL bCallDriver)
Definition: engbrush.c:331
unsigned int BOOL
Definition: ntddk_ex.h:94
#define EngFreeMem
Definition: polytest.cpp:56
#define CONTAINING_RECORD(address, type, field)
Definition: typedefs.h:260

◆ BRUSHOBJ_ulGetBrushColor()

ULONG APIENTRY BRUSHOBJ_ulGetBrushColor ( IN BRUSHOBJ pbo)

Definition at line 547 of file engbrush.c.

549{
550 EBRUSHOBJ *pebo = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject);
551 return pebo->ulRGBColor;
552}
ULONG ulRGBColor
Definition: brush.h:74

◆ DBG_DEFAULT_CHANNEL()

DBG_DEFAULT_CHANNEL ( EngBrush  )

◆ EBRUSHOBJ_bRealizeBrush()

BOOL NTAPI EBRUSHOBJ_bRealizeBrush ( EBRUSHOBJ pebo,
BOOL  bCallDriver 
)

Definition at line 331 of file engbrush.c.

332{
333 BOOL bResult;
334 PFN_DrvRealizeBrush pfnRealizeBrush = NULL;
335 PSURFACE psurfPattern;
337 PPDEVOBJ ppdev;
338 EXLATEOBJ exlo;
339 PPALETTE ppalPattern;
340 PBRUSH pbr = pebo->pbrush;
341 HBITMAP hbmPattern;
343
344 /* All EBRUSHOBJs have a surface, see EBRUSHOBJ_vInit */
345 ASSERT(pebo->psurfTrg);
346
347 ppdev = (PPDEVOBJ)pebo->psurfTrg->SurfObj.hdev;
348 if (!ppdev)
349 ppdev = gpmdev->ppdevGlobal;
350
351 if (bCallDriver)
352 {
353 /* Get the Drv function */
354 pfnRealizeBrush = ppdev->DriverFunctions.RealizeBrush;
355 if (pfnRealizeBrush == NULL)
356 {
357 ERR("No DrvRealizeBrush. Cannot realize brush\n");
358 return FALSE;
359 }
360
361 /* Get the mask */
363 }
364 else
365 {
366 /* Use the Eng function */
367 pfnRealizeBrush = EngRealizeBrush;
368
369 /* We don't handle the mask bitmap here. We do this only on demand */
370 psoMask = NULL;
371 }
372
373 /* Check if this is a hatch brush */
374 if (pbr->flAttrs & BR_IS_HATCH)
375 {
376 /* Get the hatch brush pattern from the PDEV */
377 hbmPattern = (HBITMAP)ppdev->ahsurf[pbr->iHatch];
378 iHatch = pbr->iHatch;
379 }
380 else
381 {
382 /* Use the brushes pattern */
383 hbmPattern = pbr->hbmPattern;
384 iHatch = -1;
385 }
386
387 psurfPattern = SURFACE_ShareLockSurface(hbmPattern);
388 ASSERT(psurfPattern);
389 ASSERT(psurfPattern->ppal);
390
391 /* DIB brushes with DIB_PAL_COLORS usage need a new palette */
392 if (pbr->flAttrs & BR_IS_DIBPALCOLORS)
393 {
394 /* Create a palette with the colors from the DC */
395 ppalPattern = FixupDIBBrushPalette(psurfPattern->ppal, pebo->ppalDC);
396 if (ppalPattern == NULL)
397 {
398 ERR("FixupDIBBrushPalette() failed.\n");
399 return FALSE;
400 }
401
402 pebo->ppalDIB = ppalPattern;
403 }
404 else
405 {
406 /* The palette is already as it should be */
407 ppalPattern = psurfPattern->ppal;
408 }
409
410 /* Initialize XLATEOBJ for the brush */
412 ppalPattern,
413 pebo->psurfTrg->ppal,
414 0,
415 pebo->crCurrentBack,
416 pebo->crCurrentText);
417
418 /* Create the realization */
419 bResult = pfnRealizeBrush(&pebo->BrushObject,
420 &pebo->psurfTrg->SurfObj,
421 &psurfPattern->SurfObj,
422 psoMask,
423 &exlo.xlo,
424 iHatch);
425
426 /* Cleanup the XLATEOBJ */
427 EXLATEOBJ_vCleanup(&exlo);
428
429 /* Unlock surface */
430 SURFACE_ShareUnlockSurface(psurfPattern);
431
432 return bResult;
433}
#define ERR(fmt,...)
Definition: precomp.h:57
#define FALSE
Definition: types.h:117
static PPALETTE FixupDIBBrushPalette(_In_ PPALETTE ppalDIB, _In_ PPALETTE ppalDC)
Definition: engbrush.c:291
BOOL APIENTRY EngRealizeBrush(BRUSHOBJ *pbo, SURFOBJ *psoDst, SURFOBJ *psoPattern, SURFOBJ *psoMask, XLATEOBJ *pxlo, ULONG iHatch)
Definition: engbrush.c:233
SURFOBJ *NTAPI EBRUSHOBJ_psoMask(EBRUSHOBJ *pebo)
Definition: engbrush.c:468
#define BR_IS_HATCH
Definition: brush.h:102
#define BR_IS_DIBPALCOLORS
Definition: brush.h:109
if(dx< 0)
Definition: linetemp.h:194
PMDEVOBJ gpmdev
Definition: mdevobj.c:14
struct _PDEVOBJ * PPDEVOBJ
Definition: mdevobj.h:6
#define ASSERT(a)
Definition: mode.c:44
static HBITMAP
Definition: button.c:44
Definition: types.h:101
PFN_DrvRealizeBrush RealizeBrush
Definition: ntgdityp.h:581
PBRUSH pbrush
Definition: brush.h:88
COLORREF crCurrentText
Definition: brush.h:78
BRUSHOBJ BrushObject
Definition: brush.h:71
struct _PALETTE * ppalDC
Definition: brush.h:85
struct _PALETTE * ppalDIB
Definition: brush.h:86
_Notnull_ SURFACE * psurfTrg
Definition: brush.h:83
COLORREF crCurrentBack
Definition: brush.h:79
XLATEOBJ xlo
Definition: xlateobj.h:21
PPDEVOBJ ppdevGlobal
Definition: mdevobj.h:16
HSURF ahsurf[HS_DDI_MAX]
Definition: pdevobj.h:97
DRIVER_FUNCTIONS DriverFunctions
Definition: pdevobj.h:137
SURFOBJ SurfObj
Definition: surface.h:8
struct _PALETTE *const ppal
Definition: surface.h:11
HDEV hdev
Definition: winddi.h:1208
uint32_t ULONG
Definition: typedefs.h:59
#define SURFACE_ShareUnlockSurface(pBMObj)
Definition: surface.h:102
#define SURFACE_ShareLockSurface(hBMObj)
Definition: surface.h:91
_In_opt_ SURFOBJ _In_opt_ SURFOBJ * psoMask
Definition: winddi.h:3434
FN_DrvRealizeBrush * PFN_DrvRealizeBrush
Definition: winddi.h:3964
_Inout_ SURFOBJ _In_opt_ SURFOBJ _In_opt_ SURFOBJ _In_opt_ XLATEOBJ _In_ ULONG iHatch
Definition: winddi.h:3963
VOID NTAPI EXLATEOBJ_vInitialize(_Out_ PEXLATEOBJ pexlo, _In_opt_ PALETTE *ppalSrc, _In_opt_ PALETTE *ppalDst, _In_ COLORREF crSrcBackColor, _In_ COLORREF crDstBackColor, _In_ COLORREF crDstForeColor)
Definition: xlateobj.c:491
VOID NTAPI EXLATEOBJ_vCleanup(_Inout_ PEXLATEOBJ pexlo)
Definition: xlateobj.c:894

Referenced by BRUSHOBJ_pvGetRbrush(), and EBRUSHOBJ_pvGetEngBrush().

◆ EBRUSHOBJ_psoMask()

SURFOBJ *NTAPI EBRUSHOBJ_psoMask ( EBRUSHOBJ pebo)

Definition at line 468 of file engbrush.c.

469{
470 HBITMAP hbmMask;
471 PSURFACE psurfMask;
472 PPDEVOBJ ppdev;
473
474 /* Check if we don't have a mask yet */
475 if (pebo->psoMask == NULL)
476 {
477 /* Check if this is a hatch brush */
478 if (pebo->flattrs & BR_IS_HATCH)
479 {
480 /* Get the PDEV */
481 ppdev = (PPDEVOBJ)pebo->psurfTrg->SurfObj.hdev;
482 if (!ppdev)
483 ppdev = gpmdev->ppdevGlobal;
484
485 /* Use the hatch bitmap as the mask */
486 hbmMask = (HBITMAP)ppdev->ahsurf[pebo->pbrush->iHatch];
487 psurfMask = SURFACE_ShareLockSurface(hbmMask);
488 if (psurfMask == NULL)
489 {
490 ERR("Failed to lock hatch brush for PDEV %p, iHatch %lu\n",
491 ppdev, pebo->pbrush->iHatch);
492 return NULL;
493 }
494
496 pebo->psoMask = &psurfMask->SurfObj;
497 }
498 }
499
500 return pebo->psoMask;
501}
FLONG flattrs
Definition: brush.h:89
SURFOBJ * psoMask
Definition: brush.h:94
ULONG iBitmapFormat
Definition: winddi.h:1215
#define BMF_1BPP
Definition: winddi.h:355
#define NT_ASSERT
Definition: rtlfuncs.h:3327

Referenced by EBRUSHOBJ_bRealizeBrush().

◆ EBRUSHOBJ_psoPattern()

SURFOBJ *NTAPI EBRUSHOBJ_psoPattern ( EBRUSHOBJ pebo)

Definition at line 457 of file engbrush.c.

458{
459 PSURFACE psurfPattern;
460
461 psurfPattern = EBRUSHOBJ_pvGetEngBrush(pebo);
462
463 return psurfPattern ? &psurfPattern->SurfObj : NULL;
464}
PVOID NTAPI EBRUSHOBJ_pvGetEngBrush(EBRUSHOBJ *pebo)
Definition: engbrush.c:437

◆ EBRUSHOBJ_pvGetEngBrush()

PVOID NTAPI EBRUSHOBJ_pvGetEngBrush ( EBRUSHOBJ pebo)

Definition at line 437 of file engbrush.c.

438{
439 BOOL bResult;
440
441 if (!pebo->pengbrush)
442 {
443 bResult = EBRUSHOBJ_bRealizeBrush(pebo, FALSE);
444 if (!bResult)
445 {
446 if (pebo->pengbrush)
448 pebo->pengbrush = NULL;
449 }
450 }
451
452 return pebo->pengbrush;
453}
PVOID pengbrush
Definition: brush.h:75
ENGAPI BOOL APIENTRY EngDeleteSurface(_In_ _Post_ptr_invalid_ HSURF hsurf)
Definition: surface.c:567

Referenced by EBRUSHOBJ_psoPattern().

◆ EBRUSHOBJ_vCleanup()

VOID NTAPI EBRUSHOBJ_vCleanup ( EBRUSHOBJ pebo)

Definition at line 175 of file engbrush.c.

176{
177 /* Check if there's a GDI realisation */
178 if (pebo->pengbrush)
179 {
180 /* Unlock the bitmap again */
182 pebo->pengbrush = NULL;
183 }
184
185 /* Check if there's a driver's realisation */
186 if (pebo->BrushObject.pvRbrush)
187 {
188 /* Free allocated driver memory */
190 pebo->BrushObject.pvRbrush = NULL;
191 }
192
193 if (pebo->psoMask != NULL)
194 {
196 pebo->psoMask = NULL;
197 }
198
199 /* Dereference the palettes */
200 if (pebo->ppalSurf)
201 {
203 }
204 if (pebo->ppalDC)
205 {
207 }
208 if (pebo->ppalDIB)
209 {
211 }
212}
PVOID pvRbrush
Definition: winddi.h:235
_Notnull_ struct _PALETTE * ppalSurf
Definition: brush.h:84
#define PALETTE_ShareUnlockPalette(ppal)
Definition: palette.h:59

Referenced by DC_vCleanup(), EBRUSHOBJ_vUpdateFromDC(), GdiFlushUserBatch(), IntGdiPolyPatBlt(), and UserDrawIconEx().

◆ EBRUSHOBJ_vInit()

VOID NTAPI EBRUSHOBJ_vInit ( EBRUSHOBJ pebo,
PBRUSH  pbrush,
PSURFACE  psurf,
COLORREF  crBackgroundClr,
COLORREF  crForegroundClr,
PPALETTE  ppalDC 
)

Definition at line 52 of file engbrush.c.

58{
59 ASSERT(pebo);
60 ASSERT(pbrush);
61
62 pebo->BrushObject.flColorType = 0;
64 pebo->pbrush = pbrush;
65 pebo->pengbrush = NULL;
66 pebo->flattrs = pbrush->flAttrs;
67 pebo->psoMask = NULL;
68
69 /* Initialize 1 bpp fore and back colors */
70 pebo->crCurrentBack = crBackgroundClr;
71 pebo->crCurrentText = crForegroundClr;
72
73 pebo->psurfTrg = psurf;
74 /* We are initializing for a new memory DC */
75 if(!pebo->psurfTrg)
77 ASSERT(pebo->psurfTrg);
78 ASSERT(pebo->psurfTrg->ppal);
79
80 /* Initialize palettes */
81 pebo->ppalSurf = pebo->psurfTrg->ppal;
83 pebo->ppalDC = ppalDC;
84 if(!pebo->ppalDC)
85 pebo->ppalDC = gppalDefault;
86 GDIOBJ_vReferenceObjectByPointer(&pebo->ppalDC->BaseObject);
87 pebo->ppalDIB = NULL;
88
89 if (pbrush->flAttrs & BR_IS_NULL)
90 {
91 /* NULL brushes don't need a color */
92 pebo->BrushObject.iSolidColor = 0;
93 }
94 else if (pbrush->flAttrs & BR_IS_SOLID)
95 {
96 /* Set the RGB color */
97 EBRUSHOBJ_vSetSolidRGBColor(pebo, pbrush->BrushAttr.lbColor);
98 }
99 else
100 {
101 /* This is a pattern brush that needs realization */
102 pebo->BrushObject.iSolidColor = 0xFFFFFFFF;
103
104 /* Use foreground color of hatch brushes */
105 if (pbrush->flAttrs & BR_IS_HATCH)
106 pebo->crCurrentText = pbrush->BrushAttr.lbColor;
107 }
108}
_Notnull_ PSURFACE psurfDefaultBitmap
Definition: dclife.c:17
VOID FASTCALL EBRUSHOBJ_vSetSolidRGBColor(EBRUSHOBJ *pebo, COLORREF crColor)
Definition: engbrush.c:122
#define BR_IS_SOLID
Definition: brush.h:101
#define BR_IS_NULL
Definition: brush.h:105
ULONG iSolidColor
Definition: winddi.h:234
FLONG flColorType
Definition: winddi.h:236
VOID NTAPI GDIOBJ_vReferenceObjectByPointer(POBJ pobj)
Definition: gdiobj.c:741
PALETTE * gppalDefault
Definition: palette.c:20

Referenced by EBRUSHOBJ_vInitFromDC(), IntGdiFillRgn(), and UserDrawIconEx().

◆ EBRUSHOBJ_vInitFromDC()

VOID NTAPI EBRUSHOBJ_vInitFromDC ( EBRUSHOBJ pebo,
PBRUSH  pbrush,
PDC  pdc 
)

Definition at line 112 of file engbrush.c.

114{
115 EBRUSHOBJ_vInit(pebo, pbrush, pdc->dclevel.pSurface,
116 pdc->pdcattr->crBackgroundClr, pdc->pdcattr->crForegroundClr,
117 pdc->dclevel.ppal);
118}
VOID NTAPI EBRUSHOBJ_vInit(EBRUSHOBJ *pebo, PBRUSH pbrush, PSURFACE psurf, COLORREF crBackgroundClr, COLORREF crForegroundClr, PPALETTE ppalDC)
Definition: engbrush.c:52

Referenced by DC_vInitDc(), EBRUSHOBJ_vUpdateFromDC(), GdiFlushUserBatch(), and IntGdiPolyPatBlt().

◆ EBRUSHOBJ_vSetSolidRGBColor()

VOID FASTCALL EBRUSHOBJ_vSetSolidRGBColor ( EBRUSHOBJ pebo,
COLORREF  crColor 
)

Definition at line 122 of file engbrush.c.

123{
124 ULONG iSolidColor;
125 EXLATEOBJ exlo;
126
127 /* Never use with non-solid brushes */
128 ASSERT(pebo->flattrs & BR_IS_SOLID);
129
130 /* Set the RGB color */
131 crColor &= 0xFFFFFF;
132 pebo->crRealize = crColor;
133 pebo->ulRGBColor = crColor;
134
135 /* Special handling for mono-surfaces */
136 if (pebo->ppalSurf->flFlags & PAL_MONOCHROME)
137 {
138 /* Determine the indices for back and fore color */
139 ULONG iBackIndex =
141 ULONG iForeIndex = iBackIndex ^ 1;
142
143 /* Get the translated back color */
144 ULONG rgbBack = PALETTE_ulGetRGBColorFromIndex(pebo->ppalSurf, iBackIndex);
145
146 /* Match the pen color against RGB and translated background color */
147 if ((crColor == rgbBack) || (crColor == pebo->crCurrentBack))
148 pebo->BrushObject.iSolidColor = iBackIndex;
149 else
150 pebo->BrushObject.iSolidColor = iForeIndex;
151
152 pebo->flattrs |= BR_NEED_BK_CLR;
153 }
154 else
155 {
156 /* Initialize an XLATEOBJ RGB -> surface */
158 &gpalRGB,
159 pebo->ppalSurf,
160 pebo->crCurrentBack,
161 0,
162 0);
163
164 /* Translate the brush color to the target format */
165 iSolidColor = XLATEOBJ_iXlate(&exlo.xlo, crColor);
166 pebo->BrushObject.iSolidColor = iSolidColor;
167
168 /* Clean up the XLATEOBJ */
169 EXLATEOBJ_vCleanup(&exlo);
170 }
171}
#define BR_NEED_BK_CLR
Definition: brush.h:99
COLORREF crRealize
Definition: brush.h:73
PALETTE gpalRGB
Definition: palette.c:20
ULONG NTAPI PALETTE_ulGetNearestPaletteIndex(PALETTE *ppal, ULONG iColor)
Definition: palette.c:264
@ PAL_MONOCHROME
Definition: palette.h:22
FORCEINLINE ULONG PALETTE_ulGetRGBColorFromIndex(PPALETTE ppal, ULONG ulIndex)
Definition: palette.h:142
ENGAPI ULONG APIENTRY XLATEOBJ_iXlate(_In_ XLATEOBJ *pxlo, _In_ ULONG iColor)
Definition: xlateobj.c:909

Referenced by DC_vUpdateBackgroundBrush(), DC_vUpdateFillBrush(), DC_vUpdateLineBrush(), DC_vUpdateTextBrush(), and EBRUSHOBJ_vInit().

◆ EBRUSHOBJ_vUpdateFromDC()

VOID NTAPI EBRUSHOBJ_vUpdateFromDC ( EBRUSHOBJ pebo,
PBRUSH  pbrush,
PDC  pdc 
)

Definition at line 216 of file engbrush.c.

220{
221 /* Cleanup the brush */
222 EBRUSHOBJ_vCleanup(pebo);
223
224 /* Reinitialize */
225 EBRUSHOBJ_vInitFromDC(pebo, pbrush, pdc);
226}
VOID NTAPI EBRUSHOBJ_vInitFromDC(EBRUSHOBJ *pebo, PBRUSH pbrush, PDC pdc)
Definition: engbrush.c:112
VOID NTAPI EBRUSHOBJ_vCleanup(EBRUSHOBJ *pebo)
Definition: engbrush.c:175

Referenced by DC_vUpdateBackgroundBrush(), DC_vUpdateFillBrush(), DC_vUpdateLineBrush(), and DC_vUpdateTextBrush().

◆ EngRealizeBrush()

BOOL APIENTRY EngRealizeBrush ( BRUSHOBJ pbo,
SURFOBJ psoDst,
SURFOBJ psoPattern,
SURFOBJ psoMask,
XLATEOBJ pxlo,
ULONG  iHatch 
)

This function is not exported, because it makes no sense for The driver to punt back to this function

Definition at line 233 of file engbrush.c.

240{
241 EBRUSHOBJ *pebo;
242 HBITMAP hbmpRealize;
243 SURFOBJ *psoRealize;
244 PSURFACE psurfRealize;
245 POINTL ptlSrc = {0, 0};
246 RECTL rclDest;
247 ULONG lWidth;
248
249 /* Calculate width in bytes of the realized brush */
250 lWidth = WIDTH_BYTES_ALIGN32(psoPattern->sizlBitmap.cx,
252
253 /* Allocate a bitmap */
254 hbmpRealize = EngCreateBitmap(psoPattern->sizlBitmap,
255 lWidth,
256 psoDst->iBitmapFormat,
258 NULL);
259 if (!hbmpRealize)
260 {
261 return FALSE;
262 }
263
264 /* Lock the bitmap */
265 psurfRealize = SURFACE_ShareLockSurface(hbmpRealize);
266
267 /* Already delete the pattern bitmap (will be kept until dereferenced) */
268 EngDeleteSurface((HSURF)hbmpRealize);
269
270 if (!psurfRealize)
271 {
272 return FALSE;
273 }
274
275 /* Copy the bits to the new format bitmap */
276 rclDest.left = rclDest.top = 0;
277 rclDest.right = psoPattern->sizlBitmap.cx;
278 rclDest.bottom = psoPattern->sizlBitmap.cy;
279 psoRealize = &psurfRealize->SurfObj;
280 EngCopyBits(psoRealize, psoPattern, NULL, pxlo, &rclDest, &ptlSrc);
281
282
283 pebo = CONTAINING_RECORD(pbo, EBRUSHOBJ, BrushObject);
284 pebo->pengbrush = (PVOID)psurfRealize;
285
286 return TRUE;
287}
long bottom
Definition: polytest.cpp:53
long right
Definition: polytest.cpp:53
long top
Definition: polytest.cpp:53
long left
Definition: polytest.cpp:53
#define WIDTH_BYTES_ALIGN32(cx, bpp)
Definition: swimpl.c:16
void * PVOID
Definition: typedefs.h:50
#define BitsPerFormat(Format)
Definition: surface.h:109
_Inout_ SURFOBJ _In_opt_ SURFOBJ * psoPattern
Definition: winddi.h:3960
ENGAPI HBITMAP APIENTRY EngCreateBitmap(_In_ SIZEL sizl, _In_ LONG lWidth, _In_ ULONG iFormat, _In_ FLONG fl, _In_opt_ PVOID pvBits)
_In_ SURFOBJ _In_ CLIPOBJ _In_opt_ XLATEOBJ * pxlo
Definition: winddi.h:3416
ENGAPI BOOL APIENTRY EngCopyBits(_In_ SURFOBJ *psoDest, _In_ SURFOBJ *psoSrc, _In_opt_ CLIPOBJ *pco, _In_opt_ XLATEOBJ *pxlo, _In_ __in_data_source(USER_MODE) RECTL *prclDest, _In_ __in_data_source(USER_MODE) POINTL *pptlSrc)
typedef HSURF(APIENTRY FN_DrvEnableSurface)(_In_ DHPDEV dhpdev)
#define BMF_NOZEROINIT
Definition: winddi.h:1181

Referenced by EBRUSHOBJ_bRealizeBrush().

◆ FixupDIBBrushPalette()

static PPALETTE FixupDIBBrushPalette ( _In_ PPALETTE  ppalDIB,
_In_ PPALETTE  ppalDC 
)
static

Definition at line 291 of file engbrush.c.

294{
295 PPALETTE ppalNew;
296 ULONG i, iPalIndex, crColor;
297
298 /* Allocate a new palette */
300 ppalDIB->NumColors,
301 NULL,
302 0,
303 0,
304 0);
305 if (ppalNew == NULL)
306 {
307 ERR("Failed to allcate palette for brush\n");
308 return NULL;
309 }
310
311 /* Loop all colors */
312 for (i = 0; i < ppalDIB->NumColors; i++)
313 {
314 /* Get the RGB color, which is the index into the DC palette */
315 iPalIndex = PALETTE_ulGetRGBColorFromIndex(ppalDIB, i);
316
317 /* Roll over when index is too big */
318 iPalIndex %= ppalDC->NumColors;
319
320 /* Set the indexed DC color as the new color */
321 crColor = PALETTE_ulGetRGBColorFromIndex(ppalDC, iPalIndex);
322 PALETTE_vSetRGBColorForIndex(ppalNew, i, crColor);
323 }
324
325 /* Return the new palette */
326 return ppalNew;
327}
GLsizei GLenum const GLvoid GLsizei GLenum GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLint GLint GLint GLshort GLshort GLshort GLubyte GLubyte GLubyte GLuint GLuint GLuint GLushort GLushort GLushort GLbyte GLbyte GLbyte GLbyte GLdouble GLdouble GLdouble GLdouble GLfloat GLfloat GLfloat GLfloat GLint GLint GLint GLint GLshort GLshort GLshort GLshort GLubyte GLubyte GLubyte GLubyte GLuint GLuint GLuint GLuint GLushort GLushort GLushort GLushort GLboolean const GLdouble const GLfloat const GLint const GLshort const GLbyte const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLdouble const GLfloat const GLfloat const GLint const GLint const GLshort const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort const GLdouble const GLfloat const GLint const GLshort GLenum GLenum GLenum GLfloat GLenum GLint GLenum GLenum GLenum GLfloat GLenum GLenum GLint GLenum GLfloat GLenum GLint GLint GLushort GLenum GLenum GLfloat GLenum GLenum GLint GLfloat const GLubyte GLenum GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLint GLint GLsizei GLsizei GLint GLenum GLenum const GLvoid GLenum GLenum const GLfloat GLenum GLenum const GLint GLenum GLenum const GLdouble GLenum GLenum const GLfloat GLenum GLenum const GLint GLsizei GLuint GLfloat GLuint GLbitfield GLfloat GLint GLuint GLboolean GLenum GLfloat GLenum GLbitfield GLenum GLfloat GLfloat GLint GLint const GLfloat GLenum GLfloat GLfloat GLint GLint GLfloat GLfloat GLint GLint const GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat GLint GLfloat GLfloat const GLdouble const GLfloat const GLdouble const GLfloat GLint i
Definition: glfuncs.h:248
PPALETTE NTAPI PALETTE_AllocPalette(_In_ ULONG iMode, _In_ ULONG cColors, _In_opt_ const PALETTEENTRY *pEntries, _In_ FLONG flRed, _In_ FLONG flGreen, _In_ FLONG flBlue)
Definition: palette.c:135
FORCEINLINE VOID PALETTE_vSetRGBColorForIndex(PPALETTE ppal, ULONG ulIndex, COLORREF crColor)
Definition: palette.h:152
#define PAL_INDEXED
Definition: winddi.h:1561

Referenced by EBRUSHOBJ_bRealizeBrush().

◆ InitBrushImpl()

NTSTATUS NTAPI InitBrushImpl ( VOID  )

Internal functions

Definition at line 31 of file engbrush.c.

32{
33 ULONG i;
34 SIZEL sizl = {8, 8};
35
36 /* Loop all hatch styles */
37 for (i = 0; i < HS_DDI_MAX; i++)
38 {
39 /* Create a default hatch bitmap */
41 0,
43 0,
45 }
46
47 return STATUS_SUCCESS;
48}
static const ULONG gaulHatchBrushes[HS_DDI_MAX][8]
Definition: engbrush.c:14
HSURF gahsurfHatch[HS_DDI_MAX]
Definition: engbrush.c:24
#define STATUS_SUCCESS
Definition: shellext.h:65
#define HS_DDI_MAX
Definition: winddi.h:3954
_In_ SIZEL sizl
Definition: winddi.h:3467

Referenced by DriverEntry().

Variable Documentation

◆ gahsurfHatch

HSURF gahsurfHatch[HS_DDI_MAX]

Definition at line 24 of file engbrush.c.

Referenced by InitBrushImpl(), and PDEVOBJ_bEnablePDEV().

◆ gaulHatchBrushes

const ULONG gaulHatchBrushes[HS_DDI_MAX][8]
static
Initial value:
=
{
{0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF},
{0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7},
{0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F},
{0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE},
{0xF7, 0xF7, 0xF7, 0xF7, 0x00, 0xF7, 0xF7, 0xF7},
{0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E}
}

Definition at line 14 of file engbrush.c.

Referenced by InitBrushImpl().