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 /** Internal functions ********************************************************/
19 EBRUSHOBJ_vInit(EBRUSHOBJ
*pebo
, PBRUSH pbrush
, PDC pdc
)
25 pebo
->BrushObject
.flColorType
= 0;
26 pebo
->BrushObject
.pvRbrush
= NULL
;
27 pebo
->pbrush
= pbrush
;
28 pebo
->pengbrush
= NULL
;
29 pebo
->flattrs
= pbrush
->flAttrs
;
31 /* Initialize 1 bpp fore and back colors */
32 pebo
->crCurrentBack
= pdc
->pdcattr
->crBackgroundClr
;
33 pebo
->crCurrentText
= pdc
->pdcattr
->crForegroundClr
;
35 pebo
->psurfTrg
= pdc
->dclevel
.pSurface
;
36 ASSERT(pebo
->psurfTrg
);
38 if (pebo
->psurfTrg
->hDIBPalette
)
40 pebo
->ppalSurf
= PALETTE_ShareLockPalette(pebo
->psurfTrg
->hDIBPalette
);
42 else if (pebo
->psurfTrg
->ppal
)
44 pebo
->ppalSurf
= pebo
->psurfTrg
->ppal
;
45 GDIOBJ_IncrementShareCount(&pebo
->ppalSurf
->BaseObject
);
48 pebo
->ppalSurf
= PALETTE_ShareLockPalette(pdc
->ppdev
->devinfo
.hpalDefault
);
51 pebo
->ppalSurf
= &gpalRGB
;
53 if (pbrush
->flAttrs
& GDIBRUSH_IS_NULL
)
55 /* NULL brushes don't need a color */
56 pebo
->BrushObject
.iSolidColor
= 0;
58 else if (pbrush
->flAttrs
& GDIBRUSH_IS_SOLID
)
60 /* Set the RGB color */
61 EBRUSHOBJ_vSetSolidBrushColor(pebo
, pbrush
->BrushAttr
.lbColor
);
65 /* This is a pattern brush that needs realization */
66 pebo
->BrushObject
.iSolidColor
= 0xFFFFFFFF;
68 /* Use foreground color of hatch brushes */
69 if (pbrush
->flAttrs
& GDIBRUSH_IS_HATCH
)
70 pebo
->crCurrentText
= pbrush
->BrushAttr
.lbColor
;
76 EBRUSHOBJ_vSetSolidBrushColor(EBRUSHOBJ
*pebo
, COLORREF crColor
)
81 /* Never use with non-solid brushes */
82 ASSERT(pebo
->flattrs
& GDIBRUSH_IS_SOLID
);
84 /* Set the RGB color */
85 pebo
->crRealize
= crColor
;
86 pebo
->ulRGBColor
= crColor
;
88 /* Initialize an XLATEOBJ RGB -> surface */
89 EXLATEOBJ_vInitialize(&exlo
, &gpalRGB
, pebo
->ppalSurf
, 0, 0, 0);
91 /* Translate the brush color to the target format */
92 iSolidColor
= XLATEOBJ_iXlate(&exlo
.xlo
, crColor
);
93 pebo
->BrushObject
.iSolidColor
= iSolidColor
;
95 /* Clean up the XLATEOBJ */
96 EXLATEOBJ_vCleanup(&exlo
);
101 EBRUSHOBJ_vCleanup(EBRUSHOBJ
*pebo
)
103 /* Check if there's a GDI realisation */
106 EngDeleteSurface(pebo
->pengbrush
);
107 pebo
->pengbrush
= NULL
;
110 /* Check if there's a driver's realisation */
111 if (pebo
->BrushObject
.pvRbrush
)
113 /* Free allocated driver memory */
114 EngFreeMem(pebo
->BrushObject
.pvRbrush
);
115 pebo
->BrushObject
.pvRbrush
= NULL
;
118 if (pebo
->ppalSurf
!= &gpalRGB
)
119 PALETTE_ShareUnlockPalette(pebo
->ppalSurf
);
124 EBRUSHOBJ_vUpdate(EBRUSHOBJ
*pebo
, PBRUSH pbrush
, PDC pdc
)
126 /* Cleanup the brush */
127 EBRUSHOBJ_vCleanup(pebo
);
130 EBRUSHOBJ_vInit(pebo
, pbrush
, pdc
);
134 * This function is not exported, because it makes no sense for
135 * The driver to punt back to this function */
149 POINTL ptlSrc
= {0, 0};
153 /* Calculate width in bytes of the realized brush */
154 lWidth
= DIB_GetDIBWidthBytes(psoPattern
->sizlBitmap
.cx
,
155 BitsPerFormat(psoDst
->iBitmapFormat
));
157 /* Allocate a bitmap */
158 hbmpRealize
= EngCreateBitmap(psoPattern
->sizlBitmap
,
160 psoDst
->iBitmapFormat
,
168 /* Lock the bitmap */
169 psoRealize
= EngLockSurface(hbmpRealize
);
172 EngDeleteSurface(hbmpRealize
);
176 /* Copy the bits to the new format bitmap */
177 rclDest
.left
= rclDest
.top
= 0;
178 rclDest
.right
= psoPattern
->sizlBitmap
.cx
;
179 rclDest
.bottom
= psoPattern
->sizlBitmap
.cy
;
180 EngCopyBits(psoRealize
, psoPattern
, NULL
, pxlo
, &rclDest
, &ptlSrc
);
182 /* Unlock the bitmap again */
183 EngUnlockSurface(psoRealize
);
185 pebo
= CONTAINING_RECORD(pbo
, EBRUSHOBJ
, BrushObject
);
186 pebo
->pengbrush
= (PVOID
)hbmpRealize
;
193 EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ
*pebo
, BOOL bCallDriver
)
196 PFN_DrvRealizeBrush pfnRealzizeBrush
= NULL
;
197 PSURFACE psurfPattern
, psurfMask
;
198 PPDEVOBJ ppdev
= NULL
;
201 // FIXME: all EBRUSHOBJs need a surface, see EBRUSHOBJ_vInit
204 DPRINT1("Pattern brush has no target surface!\n");
208 ppdev
= (PPDEVOBJ
)pebo
->psurfTrg
->SurfObj
.hdev
;
210 // FIXME: all SURFACEs need a PDEV
211 if (ppdev
&& bCallDriver
)
212 pfnRealzizeBrush
= ppdev
->DriverFunctions
.RealizeBrush
;
214 if (!pfnRealzizeBrush
)
215 pfnRealzizeBrush
= EngRealizeBrush
;
217 psurfPattern
= SURFACE_ShareLockSurface(pebo
->pbrush
->hbmPattern
);
218 ASSERT(psurfPattern
);
220 /* FIXME: implement mask */
223 /* Initialize XLATEOBJ for the brush */
224 EXLATEOBJ_vInitBrushXlate(&exlo
,
228 pebo
->crCurrentBack
);
230 /* Create the realization */
231 bResult
= pfnRealzizeBrush(&pebo
->BrushObject
,
232 &pebo
->psurfTrg
->SurfObj
,
233 &psurfPattern
->SurfObj
,
234 psurfMask
? &psurfMask
->SurfObj
: NULL
,
236 -1); // FIXME: what about hatch brushes?
238 /* Cleanup the XLATEOBJ */
239 EXLATEOBJ_vCleanup(&exlo
);
241 /* Unlock surfaces */
243 SURFACE_ShareUnlockSurface(psurfPattern
);
245 SURFACE_ShareUnlockSurface(psurfMask
);
252 EBRUSHOBJ_pvGetEngBrush(EBRUSHOBJ
*pebo
)
256 if (!pebo
->pengbrush
)
258 bResult
= EBRUSHOBJ_bRealizeBrush(pebo
, FALSE
);
262 EngDeleteSurface(pebo
->pengbrush
);
263 pebo
->pengbrush
= NULL
;
267 return pebo
->pengbrush
;
271 /** Exported DDI functions ****************************************************/
277 BRUSHOBJ_pvAllocRbrush(
281 pbo
->pvRbrush
= EngAllocMem(0, cj
, 'rbdG');
282 return pbo
->pvRbrush
;
289 BRUSHOBJ_pvGetRbrush(
292 EBRUSHOBJ
*pebo
= CONTAINING_RECORD(pbo
, EBRUSHOBJ
, BrushObject
);
297 bResult
= EBRUSHOBJ_bRealizeBrush(pebo
, TRUE
);
302 EngFreeMem(pbo
->pvRbrush
);
303 pbo
->pvRbrush
= NULL
;
308 return pbo
->pvRbrush
;
315 BRUSHOBJ_ulGetBrushColor(
318 EBRUSHOBJ
*pebo
= CONTAINING_RECORD(pbo
, EBRUSHOBJ
, BrushObject
);
319 return pebo
->ulRGBColor
;