13 ExtCreatePen(DWORD dwPenStyle
,
19 PVOID lpPackedDIB
= NULL
;
21 PBITMAPINFO pConvertedInfo
= NULL
;
22 UINT ConvertedInfoSize
= 0, lbStyle
;
25 if ((dwPenStyle
& PS_STYLE_MASK
) == PS_USERSTYLE
)
29 SetLastError(ERROR_INVALID_PARAMETER
);
32 } // This is an enhancement and prevents a call to kernel space.
33 else if ((dwPenStyle
& PS_STYLE_MASK
) == PS_INSIDEFRAME
&&
34 (dwPenStyle
& PS_TYPE_MASK
) != PS_GEOMETRIC
)
36 SetLastError(ERROR_INVALID_PARAMETER
);
39 else if ((dwPenStyle
& PS_STYLE_MASK
) == PS_ALTERNATE
&&
40 (dwPenStyle
& PS_TYPE_MASK
) != PS_COSMETIC
)
42 SetLastError(ERROR_INVALID_PARAMETER
);
47 if (dwStyleCount
|| lpStyle
)
49 SetLastError(ERROR_INVALID_PARAMETER
);
54 lbStyle
= lplb
->lbStyle
;
56 if (lplb
->lbStyle
> BS_HATCHED
)
58 if (lplb
->lbStyle
== BS_PATTERN
)
60 pConvertedInfo
= (PBITMAPINFO
)lplb
->lbHatch
;
61 if (!pConvertedInfo
) return 0;
65 if ((lplb
->lbStyle
== BS_DIBPATTERN
) || (lplb
->lbStyle
== BS_DIBPATTERNPT
))
67 if (lplb
->lbStyle
== BS_DIBPATTERN
)
69 lbStyle
= BS_DIBPATTERNPT
;
70 lpPackedDIB
= GlobalLock((HGLOBAL
)lplb
->lbHatch
);
71 if (lpPackedDIB
== NULL
) return 0;
73 pConvertedInfo
= ConvertBitmapInfo((PBITMAPINFO
)lpPackedDIB
,
77 Hit
= TRUE
; // We converted DIB.
80 pConvertedInfo
= (PBITMAPINFO
)lpStyle
;
84 pConvertedInfo
= (PBITMAPINFO
)lplb
->lbHatch
;
87 hPen
= NtGdiExtCreatePen(dwPenStyle
,
92 (ULONG_PTR
)pConvertedInfo
,
100 if (lplb
->lbStyle
== BS_DIBPATTERN
) GlobalUnlock((HGLOBAL
)lplb
->lbHatch
);
104 if ((PBITMAPINFO
)lpPackedDIB
!= pConvertedInfo
)
105 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo
);
114 CreateDIBPatternBrush(
115 HGLOBAL hglbDIBPacked
,
119 HBRUSH hBrush
= NULL
;
120 PBITMAPINFO pConvertedInfo
;
121 UINT ConvertedInfoSize
;
123 lpPackedDIB
= GlobalLock(hglbDIBPacked
);
124 if (lpPackedDIB
== NULL
)
127 pConvertedInfo
= ConvertBitmapInfo((PBITMAPINFO
)lpPackedDIB
, fuColorSpec
,
128 &ConvertedInfoSize
, TRUE
);
131 hBrush
= NtGdiCreateDIBBrush(pConvertedInfo
, fuColorSpec
,
132 ConvertedInfoSize
, FALSE
, FALSE
, lpPackedDIB
);
133 if ((PBITMAPINFO
)lpPackedDIB
!= pConvertedInfo
)
134 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo
);
137 GlobalUnlock(hglbDIBPacked
);
146 CreateDIBPatternBrushPt(
147 CONST VOID
*lpPackedDIB
,
150 HBRUSH hBrush
= NULL
;
151 PBITMAPINFO pConvertedInfo
;
152 UINT ConvertedInfoSize
;
154 if (lpPackedDIB
== NULL
)
157 pConvertedInfo
= ConvertBitmapInfo((PBITMAPINFO
)lpPackedDIB
, fuColorSpec
,
158 &ConvertedInfoSize
, TRUE
);
161 hBrush
= NtGdiCreateDIBBrush(pConvertedInfo
, fuColorSpec
,
162 ConvertedInfoSize
, FALSE
, FALSE
, (PVOID
)lpPackedDIB
);
163 if ((PBITMAPINFO
)lpPackedDIB
!= pConvertedInfo
)
164 RtlFreeHeap(RtlGetProcessHeap(), 0, pConvertedInfo
);
175 CreateHatchBrush(INT fnStyle
,
178 return NtGdiCreateHatchBrushInternal(fnStyle
, clrref
, FALSE
);
186 CreatePatternBrush(HBITMAP hbmp
)
188 return NtGdiCreatePatternBrushInternal(hbmp
, FALSE
, FALSE
);
196 CreateSolidBrush(IN COLORREF crColor
)
198 /* Call Server-Side API */
199 return NtGdiCreateSolidBrush(crColor
, NULL
);
207 CONST LOGBRUSH
*LogBrush
)
211 switch (LogBrush
->lbStyle
)
213 case BS_DIBPATTERN8X8
:
215 hBrush
= CreateDIBPatternBrush((HGLOBAL
)LogBrush
->lbHatch
,
219 case BS_DIBPATTERNPT
:
220 hBrush
= CreateDIBPatternBrushPt((PVOID
)LogBrush
->lbHatch
,
225 hBrush
= NtGdiCreatePatternBrushInternal((HBITMAP
)LogBrush
->lbHatch
,
231 hBrush
= NtGdiCreatePatternBrushInternal((HBITMAP
)LogBrush
->lbHatch
,
237 hBrush
= NtGdiCreateSolidBrush(LogBrush
->lbColor
, 0);
241 hBrush
= NtGdiCreateHatchBrushInternal(LogBrush
->lbHatch
,
247 hBrush
= NtGdiGetStockObject(NULL_BRUSH
);
251 SetLastError(ERROR_INVALID_PARAMETER
);
268 /* FIXME some part need be done in user mode */
269 return NtGdiPatBlt( hdc
, nXLeft
, nYLeft
, nWidth
, nHeight
, dwRop
);
274 PolyPatBlt(IN HDC hdc
,
276 IN PPOLYPATBLT pPoly
,
280 /* FIXME some part need be done in user mode */
281 return NtGdiPolyPatBlt(hdc
, rop4
, pPoly
,Count
,Mode
);
293 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
294 return Dc_Attr
->jROP2
;
309 // Handle something other than a normal dc object.
310 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
312 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
313 return MFDRV_SetROP2( hdc
, fnDrawMode
);
316 PLDC pLDC
= GdiGetLDC(hdc
);
319 SetLastError(ERROR_INVALID_HANDLE
);
322 if (pLDC
->iType
== LDC_EMFLDC
)
324 return EMFDRV_SetROP2(( hdc
, fnDrawMode
);
330 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return FALSE
;
332 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
334 if (Dc_Attr
->ulDirty_
& DC_MODE_DIRTY
)
337 Dc_Attr
->ulDirty_
&= ~DC_MODE_DIRTY
;
341 Old_ROP2
= Dc_Attr
->jROP2
;
342 Dc_Attr
->jROP2
= fnDrawMode
;
353 GetBrushOrgEx(HDC hdc
,LPPOINT pt
)
357 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return FALSE
;
360 pt
->x
= Dc_Attr
->ptlBrushOrigin
.x
;
361 pt
->y
= Dc_Attr
->ptlBrushOrigin
.y
;
371 SetBrushOrgEx(HDC hdc
,
378 // Handle something other than a normal dc object.
379 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
381 PLDC pLDC
= GdiGetLDC(hdc
);
382 if ( (pLDC
== NULL
) || (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
))
384 SetLastError(ERROR_INVALID_HANDLE
);
387 if (pLDC
->iType
== LDC_EMFLDC
)
389 return EMFDRV_SetBrushOrg(hdc
, nXOrg
, nYOrg
); // ReactOS only.
394 if (GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
))
396 PTEB pTeb
= NtCurrentTeb();
399 lppt
->x
= Dc_Attr
->ptlBrushOrigin
.x
;
400 lppt
->y
= Dc_Attr
->ptlBrushOrigin
.y
;
402 if ((nXOrg
== Dc_Attr
->ptlBrushOrigin
.x
) && (nYOrg
== Dc_Attr
->ptlBrushOrigin
.y
))
405 if(((pTeb
->GdiTebBatch
.HDC
== NULL
) || (pTeb
->GdiTebBatch
.HDC
== hdc
)) &&
406 ((pTeb
->GdiTebBatch
.Offset
+ sizeof(GDIBSSETBRHORG
)) <= GDIBATCHBUFSIZE
) &&
407 (!(Dc_Attr
->ulDirty_
& DC_DIBSECTION
)) )
409 PGDIBSSETBRHORG pgSBO
= (PGDIBSSETBRHORG
)(&pTeb
->GdiTebBatch
.Buffer
[0] +
410 pTeb
->GdiTebBatch
.Offset
);
412 Dc_Attr
->ptlBrushOrigin
.x
= nXOrg
;
413 Dc_Attr
->ptlBrushOrigin
.y
= nYOrg
;
415 pgSBO
->gbHdr
.Cmd
= GdiBCSetBrushOrg
;
416 pgSBO
->gbHdr
.Size
= sizeof(GDIBSSETBRHORG
);
417 pgSBO
->ptlBrushOrigin
= Dc_Attr
->ptlBrushOrigin
;
419 pTeb
->GdiTebBatch
.Offset
+= sizeof(GDIBSSETBRHORG
);
420 pTeb
->GdiTebBatch
.HDC
= hdc
;
421 pTeb
->GdiBatchCount
++;
422 DPRINT("Loading the Flush!! COUNT-> %d\n", pTeb
->GdiBatchCount
);
424 if (pTeb
->GdiBatchCount
>= GDI_BatchLimit
)
426 DPRINT("Call GdiFlush!!\n");
428 DPRINT("Exit GdiFlush!!\n");
433 return NtGdiSetBrushOrg(hdc
,nXOrg
,nYOrg
,lppt
);