2 * COPYRIGHT: See COPYING in the top level directory
3 * PROJECT: ReactOS kernel
4 * PURPOSE: GDI Driver Brush Functions
5 * FILE: subsystem/win32/win32k/eng/engbrush.c
6 * PROGRAMER: Jason Filby
15 static const ULONG gaulHatchBrushes
[HS_DDI_MAX
][8] =
17 {0xFF, 0xFF, 0xFF, 0xFF, 0x00, 0xFF, 0xFF, 0xFF}, /* HS_HORIZONTAL */
18 {0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7, 0xF7}, /* HS_VERTICAL */
19 {0xFE, 0xFD, 0xFB, 0xF7, 0xEF, 0xDF, 0xBF, 0x7F}, /* HS_FDIAGONAL */
20 {0x7F, 0xBF, 0xDF, 0xEF, 0xF7, 0xFB, 0xFD, 0xFE}, /* HS_BDIAGONAL */
21 {0xF7, 0xF7, 0xF7, 0xF7, 0x00, 0xF7, 0xF7, 0xF7}, /* HS_CROSS */
22 {0x7E, 0xBD, 0xDB, 0xE7, 0xE7, 0xDB, 0xBD, 0x7E} /* HS_DIAGCROSS */
25 HSURF gahsurfHatch
[HS_DDI_MAX
];
27 /** Internal functions ********************************************************/
37 /* Loop all hatch styles */
38 for (i
= 0; i
< HS_DDI_MAX
; i
++)
40 /* Create a default hatch bitmap */
41 gahsurfHatch
[i
] = (HSURF
)EngCreateBitmap(sizl
,
45 (PVOID
)gaulHatchBrushes
[i
]);
48 return STATUS_SUCCESS
;
53 EBRUSHOBJ_vInit(EBRUSHOBJ
*pebo
,
56 COLORREF crBackgroundClr
,
57 COLORREF crForegroundClr
,
63 pebo
->BrushObject
.flColorType
= 0;
64 pebo
->BrushObject
.pvRbrush
= NULL
;
65 pebo
->pbrush
= pbrush
;
66 pebo
->pengbrush
= NULL
;
67 pebo
->flattrs
= pbrush
->flAttrs
;
69 /* Initialize 1 bpp fore and back colors */
70 pebo
->crCurrentBack
= crBackgroundClr
;
71 pebo
->crCurrentText
= crForegroundClr
;
73 pebo
->psurfTrg
= psurf
;
74 /* We are initializing for a new memory DC */
76 pebo
->psurfTrg
= psurfDefaultBitmap
;
77 ASSERT(pebo
->psurfTrg
);
78 ASSERT(pebo
->psurfTrg
->ppal
);
80 /* Initialize palettes */
81 pebo
->ppalSurf
= pebo
->psurfTrg
->ppal
;
82 GDIOBJ_vReferenceObjectByPointer(&pebo
->ppalSurf
->BaseObject
);
83 pebo
->ppalDC
= ppalDC
;
85 pebo
->ppalDC
= gppalDefault
;
86 GDIOBJ_vReferenceObjectByPointer(&pebo
->ppalDC
->BaseObject
);
89 if (pbrush
->flAttrs
& BR_IS_NULL
)
91 /* NULL brushes don't need a color */
92 pebo
->BrushObject
.iSolidColor
= 0;
94 else if (pbrush
->flAttrs
& BR_IS_SOLID
)
96 /* Set the RGB color */
97 EBRUSHOBJ_vSetSolidRGBColor(pebo
, pbrush
->BrushAttr
.lbColor
);
101 /* This is a pattern brush that needs realization */
102 pebo
->BrushObject
.iSolidColor
= 0xFFFFFFFF;
104 /* Use foreground color of hatch brushes */
105 if (pbrush
->flAttrs
& BR_IS_HATCH
)
106 pebo
->crCurrentText
= pbrush
->BrushAttr
.lbColor
;
112 EBRUSHOBJ_vInitFromDC(EBRUSHOBJ
*pebo
,
113 PBRUSH pbrush
, PDC pdc
)
115 EBRUSHOBJ_vInit(pebo
, pbrush
, pdc
->dclevel
.pSurface
,
116 pdc
->pdcattr
->crBackgroundClr
, pdc
->pdcattr
->crForegroundClr
,
122 EBRUSHOBJ_vSetSolidRGBColor(EBRUSHOBJ
*pebo
, COLORREF crColor
)
127 /* Never use with non-solid brushes */
128 ASSERT(pebo
->flattrs
& BR_IS_SOLID
);
130 /* Set the RGB color */
131 pebo
->crRealize
= crColor
;
132 pebo
->ulRGBColor
= crColor
;
134 /* Initialize an XLATEOBJ RGB -> surface */
135 EXLATEOBJ_vInitialize(&exlo
,
142 /* Translate the brush color to the target format */
143 iSolidColor
= XLATEOBJ_iXlate(&exlo
.xlo
, crColor
);
144 pebo
->BrushObject
.iSolidColor
= iSolidColor
;
146 /* Clean up the XLATEOBJ */
147 EXLATEOBJ_vCleanup(&exlo
);
152 EBRUSHOBJ_vCleanup(EBRUSHOBJ
*pebo
)
154 /* Check if there's a GDI realisation */
157 /* Unlock the bitmap again */
158 SURFACE_ShareUnlockSurface(pebo
->pengbrush
);
159 pebo
->pengbrush
= NULL
;
162 /* Check if there's a driver's realisation */
163 if (pebo
->BrushObject
.pvRbrush
)
165 /* Free allocated driver memory */
166 EngFreeMem(pebo
->BrushObject
.pvRbrush
);
167 pebo
->BrushObject
.pvRbrush
= NULL
;
170 /* Dereference the palettes */
171 PALETTE_ShareUnlockPalette(pebo
->ppalSurf
);
172 PALETTE_ShareUnlockPalette(pebo
->ppalDC
);
173 if (pebo
->ppalDIB
) PALETTE_ShareUnlockPalette(pebo
->ppalDIB
);
178 EBRUSHOBJ_vUpdateFromDC(EBRUSHOBJ
*pebo
,
182 /* Cleanup the brush */
183 EBRUSHOBJ_vCleanup(pebo
);
186 EBRUSHOBJ_vInitFromDC(pebo
, pbrush
, pdc
);
190 * This function is not exported, because it makes no sense for
191 * The driver to punt back to this function */
205 PSURFACE psurfRealize
;
206 POINTL ptlSrc
= {0, 0};
210 /* Calculate width in bytes of the realized brush */
211 lWidth
= WIDTH_BYTES_ALIGN32(psoPattern
->sizlBitmap
.cx
,
212 BitsPerFormat(psoDst
->iBitmapFormat
));
214 /* Allocate a bitmap */
215 hbmpRealize
= EngCreateBitmap(psoPattern
->sizlBitmap
,
217 psoDst
->iBitmapFormat
,
225 /* Lock the bitmap */
226 psurfRealize
= SURFACE_ShareLockSurface(hbmpRealize
);
228 /* Already delete the pattern bitmap (will be kept until dereferenced) */
229 EngDeleteSurface((HSURF
)hbmpRealize
);
236 /* Copy the bits to the new format bitmap */
237 rclDest
.left
= rclDest
.top
= 0;
238 rclDest
.right
= psoPattern
->sizlBitmap
.cx
;
239 rclDest
.bottom
= psoPattern
->sizlBitmap
.cy
;
240 psoRealize
= &psurfRealize
->SurfObj
;
241 EngCopyBits(psoRealize
, psoPattern
, NULL
, pxlo
, &rclDest
, &ptlSrc
);
244 pebo
= CONTAINING_RECORD(pbo
, EBRUSHOBJ
, BrushObject
);
245 pebo
->pengbrush
= (PVOID
)psurfRealize
;
252 FixupDIBBrushPalette(
253 _In_ PPALETTE ppalDIB
,
254 _In_ PPALETTE ppalDC
)
257 ULONG i
, iPalIndex
, crColor
;
259 /* Allocate a new palette */
260 ppalNew
= PALETTE_AllocPalette(PAL_INDEXED
,
267 /* Loop all colors */
268 for (i
= 0; i
< ppalDIB
->NumColors
; i
++)
270 /* Get the RGB color, which is the index into the DC palette */
271 iPalIndex
= PALETTE_ulGetRGBColorFromIndex(ppalDIB
, i
);
273 /* Roll over when index is too big */
274 iPalIndex
%= ppalDC
->NumColors
;
276 /* Set the indexed DC color as the new color */
277 crColor
= PALETTE_ulGetRGBColorFromIndex(ppalDC
, iPalIndex
);
278 PALETTE_vSetRGBColorForIndex(ppalNew
, i
, crColor
);
281 /* Return the new palette */
287 EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ
*pebo
, BOOL bCallDriver
)
290 PFN_DrvRealizeBrush pfnRealizeBrush
= NULL
;
291 PSURFACE psurfPattern
, psurfMask
;
294 PPALETTE ppalPattern
;
295 PBRUSH pbr
= pebo
->pbrush
;
299 /* All EBRUSHOBJs have a surface, see EBRUSHOBJ_vInit */
300 ASSERT(pebo
->psurfTrg
);
302 ppdev
= (PPDEVOBJ
)pebo
->psurfTrg
->SurfObj
.hdev
;
303 if (!ppdev
) ppdev
= gppdevPrimary
;
306 pfnRealizeBrush
= ppdev
->DriverFunctions
.RealizeBrush
;
308 if (!pfnRealizeBrush
)
309 pfnRealizeBrush
= EngRealizeBrush
;
311 /* Check if this is a hatch brush */
312 if (pbr
->flAttrs
& BR_IS_HATCH
)
314 /* Get the hatch brush pattern from the PDEV */
315 hbmPattern
= (HBITMAP
)ppdev
->ahsurf
[pbr
->ulStyle
];
316 iHatch
= pbr
->ulStyle
;
320 /* Use the brushes pattern */
321 hbmPattern
= pbr
->hbmPattern
;
325 psurfPattern
= SURFACE_ShareLockSurface(hbmPattern
);
326 ASSERT(psurfPattern
);
327 ASSERT(psurfPattern
->ppal
);
329 /* FIXME: implement mask */
332 /* DIB brushes with DIB_PAL_COLORS usage need a new palette */
333 if (pbr
->flAttrs
& BR_IS_DIBPALCOLORS
)
335 /* Create a palette with the colors from the DC */
336 ppalPattern
= FixupDIBBrushPalette(psurfPattern
->ppal
, pebo
->ppalDC
);
337 pebo
->ppalDIB
= ppalPattern
;
341 /* The palette is already as it should be */
342 ppalPattern
= psurfPattern
->ppal
;
345 /* Initialize XLATEOBJ for the brush */
346 EXLATEOBJ_vInitialize(&exlo
,
348 pebo
->psurfTrg
->ppal
,
351 pebo
->crCurrentText
);
353 /* Create the realization */
354 bResult
= pfnRealizeBrush(&pebo
->BrushObject
,
355 &pebo
->psurfTrg
->SurfObj
,
356 &psurfPattern
->SurfObj
,
357 psurfMask
? &psurfMask
->SurfObj
: NULL
,
361 /* Cleanup the XLATEOBJ */
362 EXLATEOBJ_vCleanup(&exlo
);
364 /* Unlock surfaces */
366 SURFACE_ShareUnlockSurface(psurfPattern
);
368 SURFACE_ShareUnlockSurface(psurfMask
);
375 EBRUSHOBJ_pvGetEngBrush(EBRUSHOBJ
*pebo
)
379 if (!pebo
->pengbrush
)
381 bResult
= EBRUSHOBJ_bRealizeBrush(pebo
, FALSE
);
385 EngDeleteSurface(pebo
->pengbrush
);
386 pebo
->pengbrush
= NULL
;
390 return pebo
->pengbrush
;
395 EBRUSHOBJ_psoPattern(EBRUSHOBJ
*pebo
)
397 PSURFACE psurfPattern
;
399 psurfPattern
= EBRUSHOBJ_pvGetEngBrush(pebo
);
401 return psurfPattern
? &psurfPattern
->SurfObj
: NULL
;
405 /** Exported DDI functions ****************************************************/
411 BRUSHOBJ_pvAllocRbrush(
415 pbo
->pvRbrush
= EngAllocMem(0, cj
, GDITAG_RBRUSH
);
416 return pbo
->pvRbrush
;
423 BRUSHOBJ_pvGetRbrush(
426 EBRUSHOBJ
*pebo
= CONTAINING_RECORD(pbo
, EBRUSHOBJ
, BrushObject
);
431 bResult
= EBRUSHOBJ_bRealizeBrush(pebo
, TRUE
);
436 EngFreeMem(pbo
->pvRbrush
);
437 pbo
->pvRbrush
= NULL
;
442 return pbo
->pvRbrush
;
449 BRUSHOBJ_ulGetBrushColor(
452 EBRUSHOBJ
*pebo
= CONTAINING_RECORD(pbo
, EBRUSHOBJ
, BrushObject
);
453 return pebo
->ulRGBColor
;