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
);
37 ASSERT(pebo
->psurfTrg
->ppal
);
39 pebo
->ppalSurf
= pebo
->psurfTrg
->ppal
;
40 GDIOBJ_vReferenceObjectByPointer(&pebo
->ppalSurf
->BaseObject
);
42 if (pbrush
->flAttrs
& GDIBRUSH_IS_NULL
)
44 /* NULL brushes don't need a color */
45 pebo
->BrushObject
.iSolidColor
= 0;
47 else if (pbrush
->flAttrs
& GDIBRUSH_IS_SOLID
)
49 /* Set the RGB color */
50 EBRUSHOBJ_vSetSolidBrushColor(pebo
, pbrush
->BrushAttr
.lbColor
);
54 /* This is a pattern brush that needs realization */
55 pebo
->BrushObject
.iSolidColor
= 0xFFFFFFFF;
57 /* Use foreground color of hatch brushes */
58 if (pbrush
->flAttrs
& GDIBRUSH_IS_HATCH
)
59 pebo
->crCurrentText
= pbrush
->BrushAttr
.lbColor
;
65 EBRUSHOBJ_vSetSolidBrushColor(EBRUSHOBJ
*pebo
, COLORREF crColor
)
70 /* Never use with non-solid brushes */
71 ASSERT(pebo
->flattrs
& GDIBRUSH_IS_SOLID
);
73 /* Set the RGB color */
74 pebo
->crRealize
= crColor
;
75 pebo
->ulRGBColor
= crColor
;
77 /* Initialize an XLATEOBJ RGB -> surface */
78 EXLATEOBJ_vInitialize(&exlo
,
85 /* Translate the brush color to the target format */
86 iSolidColor
= XLATEOBJ_iXlate(&exlo
.xlo
, crColor
);
87 pebo
->BrushObject
.iSolidColor
= iSolidColor
;
89 /* Clean up the XLATEOBJ */
90 EXLATEOBJ_vCleanup(&exlo
);
95 EBRUSHOBJ_vCleanup(EBRUSHOBJ
*pebo
)
97 /* Check if there's a GDI realisation */
100 /* Unlock the bitmap again */
101 SURFACE_ShareUnlockSurface(pebo
->pengbrush
);
102 pebo
->pengbrush
= NULL
;
105 /* Check if there's a driver's realisation */
106 if (pebo
->BrushObject
.pvRbrush
)
108 /* Free allocated driver memory */
109 EngFreeMem(pebo
->BrushObject
.pvRbrush
);
110 pebo
->BrushObject
.pvRbrush
= NULL
;
113 PALETTE_ShareUnlockPalette(pebo
->ppalSurf
);
118 EBRUSHOBJ_vUpdate(EBRUSHOBJ
*pebo
, PBRUSH pbrush
, PDC pdc
)
120 /* Cleanup the brush */
121 EBRUSHOBJ_vCleanup(pebo
);
124 EBRUSHOBJ_vInit(pebo
, pbrush
, pdc
);
128 * This function is not exported, because it makes no sense for
129 * The driver to punt back to this function */
143 PSURFACE psurfRealize
;
144 POINTL ptlSrc
= {0, 0};
148 /* Calculate width in bytes of the realized brush */
149 lWidth
= WIDTH_BYTES_ALIGN32(psoPattern
->sizlBitmap
.cx
,
150 BitsPerFormat(psoDst
->iBitmapFormat
));
152 /* Allocate a bitmap */
153 hbmpRealize
= EngCreateBitmap(psoPattern
->sizlBitmap
,
155 psoDst
->iBitmapFormat
,
163 /* Lock the bitmap */
164 psurfRealize
= SURFACE_ShareLockSurface(hbmpRealize
);
166 /* Already delete the pattern bitmap (will be kept until dereferenced) */
167 EngDeleteSurface(hbmpRealize
);
174 /* Copy the bits to the new format bitmap */
175 rclDest
.left
= rclDest
.top
= 0;
176 rclDest
.right
= psoPattern
->sizlBitmap
.cx
;
177 rclDest
.bottom
= psoPattern
->sizlBitmap
.cy
;
178 psoRealize
= &psurfRealize
->SurfObj
;
179 EngCopyBits(psoRealize
, psoPattern
, NULL
, pxlo
, &rclDest
, &ptlSrc
);
182 pebo
= CONTAINING_RECORD(pbo
, EBRUSHOBJ
, BrushObject
);
183 pebo
->pengbrush
= (PVOID
)psurfRealize
;
190 EBRUSHOBJ_bRealizeBrush(EBRUSHOBJ
*pebo
, BOOL bCallDriver
)
193 PFN_DrvRealizeBrush pfnRealzizeBrush
= NULL
;
194 PSURFACE psurfPattern
, psurfMask
;
195 PPDEVOBJ ppdev
= NULL
;
198 /* All EBRUSHOBJs have a surface, see EBRUSHOBJ_vInit */
199 ASSERT(pebo
->psurfTrg
);
201 ppdev
= (PPDEVOBJ
)pebo
->psurfTrg
->SurfObj
.hdev
;
203 // FIXME: all SURFACEs need a PDEV
204 if (ppdev
&& bCallDriver
)
205 pfnRealzizeBrush
= ppdev
->DriverFunctions
.RealizeBrush
;
207 if (!pfnRealzizeBrush
)
208 pfnRealzizeBrush
= EngRealizeBrush
;
210 psurfPattern
= SURFACE_ShareLockSurface(pebo
->pbrush
->hbmPattern
);
211 ASSERT(psurfPattern
);
212 ASSERT(psurfPattern
->ppal
);
214 /* FIXME: implement mask */
217 /* Initialize XLATEOBJ for the brush */
218 EXLATEOBJ_vInitialize(&exlo
,
220 pebo
->psurfTrg
->ppal
,
223 pebo
->crCurrentText
);
225 /* Create the realization */
226 bResult
= pfnRealzizeBrush(&pebo
->BrushObject
,
227 &pebo
->psurfTrg
->SurfObj
,
228 &psurfPattern
->SurfObj
,
229 psurfMask
? &psurfMask
->SurfObj
: NULL
,
231 -1); // FIXME: what about hatch brushes?
233 /* Cleanup the XLATEOBJ */
234 EXLATEOBJ_vCleanup(&exlo
);
236 /* Unlock surfaces */
238 SURFACE_ShareUnlockSurface(psurfPattern
);
240 SURFACE_ShareUnlockSurface(psurfMask
);
247 EBRUSHOBJ_pvGetEngBrush(EBRUSHOBJ
*pebo
)
251 if (!pebo
->pengbrush
)
253 bResult
= EBRUSHOBJ_bRealizeBrush(pebo
, FALSE
);
257 EngDeleteSurface(pebo
->pengbrush
);
258 pebo
->pengbrush
= NULL
;
262 return pebo
->pengbrush
;
267 EBRUSHOBJ_psoPattern(EBRUSHOBJ
*pebo
)
269 PSURFACE psurfPattern
;
271 psurfPattern
= EBRUSHOBJ_pvGetEngBrush(pebo
);
273 return psurfPattern
? &psurfPattern
->SurfObj
: NULL
;
277 /** Exported DDI functions ****************************************************/
283 BRUSHOBJ_pvAllocRbrush(
287 pbo
->pvRbrush
= EngAllocMem(0, cj
, GDITAG_RBRUSH
);
288 return pbo
->pvRbrush
;
295 BRUSHOBJ_pvGetRbrush(
298 EBRUSHOBJ
*pebo
= CONTAINING_RECORD(pbo
, EBRUSHOBJ
, BrushObject
);
303 bResult
= EBRUSHOBJ_bRealizeBrush(pebo
, TRUE
);
308 EngFreeMem(pbo
->pvRbrush
);
309 pbo
->pvRbrush
= NULL
;
314 return pbo
->pvRbrush
;
321 BRUSHOBJ_ulGetBrushColor(
324 EBRUSHOBJ
*pebo
= CONTAINING_RECORD(pbo
, EBRUSHOBJ
, BrushObject
);
325 return pebo
->ulRGBColor
;