6 HGDIOBJ stock_objects
[NB_STOCK_OBJECTS
]; // temp location.
10 IntCreateDICW ( LPCWSTR lpwszDriver
,
16 UNICODE_STRING Device
, Output
;
18 BOOL Display
= FALSE
, Default
= TRUE
;
23 if ((!lpwszDevice
) && (!lpwszDriver
))
25 Default
= FALSE
; // Ask Win32k to set Default device.
26 Display
= TRUE
; // Most likely to be DISPLAY.
30 if (lpwszDevice
) // First
32 if (!_wcsnicmp(lpwszDevice
, L
"\\\\.\\DISPLAY",11)) Display
= TRUE
;
33 RtlInitUnicodeString(&Device
, lpwszDevice
);
37 if (lpwszDriver
) // Second
39 if ((!_wcsnicmp(lpwszDriver
, L
"DISPLAY",7)) ||
40 (!_wcsnicmp(lpwszDriver
, L
"\\\\.\\DISPLAY",11))) Display
= TRUE
;
41 RtlInitUnicodeString(&Device
, lpwszDriver
);
46 if (lpwszOutput
) RtlInitUnicodeString(&Output
, lpwszOutput
);
50 //Handle Print device or something else.
51 DPRINT1("Not a DISPLAY device! %wZ\n", &Device
);
54 hDC
= NtGdiOpenDCW( (Default
? &Device
: NULL
),
55 (PDEVMODEW
) lpInitData
,
56 (lpwszOutput
? &Output
: NULL
),
57 iType
, // DCW 0 and ICW 1.
59 (PVOID
) NULL
, // NULL for now.
62 // Handle something other than a normal dc object.
63 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
68 GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
);
70 pLDC
= LocalAlloc(LMEM_ZEROINIT
, sizeof(LDC
));
72 Dc_Attr
->pvLDC
= pLDC
;
74 pLDC
->iType
= LDC_LDC
; // 1 (init) local DC, 2 EMF LDC
75 DbgPrint("DC_ATTR Allocated -> 0x%x\n",Dc_Attr
);
87 CreateCompatibleDC ( HDC hdc
)
92 rhDC
= NtGdiCreateCompatibleDC(hdc
);
96 if (GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
))
98 if ( Dc_Attr
->pvLIcm
) IcmCompatibleDC(rhDC
, hdc
, Dc_Attr
);
114 CONST DEVMODEA
* lpdvmInit
117 ANSI_STRING DriverA
, DeviceA
, OutputA
;
118 UNICODE_STRING DriverU
, DeviceU
, OutputU
;
119 LPDEVMODEW dvmInitW
= NULL
;
123 * If needed, convert to Unicode
124 * any string parameter.
127 if (NULL
!= lpszDriver
)
129 RtlInitAnsiString(&DriverA
, (LPSTR
)lpszDriver
);
130 RtlAnsiStringToUnicodeString(&DriverU
, &DriverA
, TRUE
);
132 DriverU
.Buffer
= NULL
;
133 if (NULL
!= lpszDevice
)
135 RtlInitAnsiString(&DeviceA
, (LPSTR
)lpszDevice
);
136 RtlAnsiStringToUnicodeString(&DeviceU
, &DeviceA
, TRUE
);
138 DeviceU
.Buffer
= NULL
;
139 if (NULL
!= lpszOutput
)
141 RtlInitAnsiString(&OutputA
, (LPSTR
)lpszOutput
);
142 RtlAnsiStringToUnicodeString(&OutputU
, &OutputA
, TRUE
);
144 OutputU
.Buffer
= NULL
;
147 dvmInitW
= GdiConvertToDevmodeW((LPDEVMODEA
)lpdvmInit
);
149 hDC
= IntCreateDICW ( DriverU
.Buffer
,
152 lpdvmInit
? dvmInitW
: NULL
,
154 HEAP_free (dvmInitW
);
156 * Free Unicode parameters.
158 RtlFreeUnicodeString(&DriverU
);
159 RtlFreeUnicodeString(&DeviceU
);
160 RtlFreeUnicodeString(&OutputU
);
163 * Return the possible DC handle.
178 CONST DEVMODEW
*lpInitData
182 return IntCreateDICW ( lpwszDriver
,
185 (PDEVMODEW
) lpInitData
,
199 CONST DEVMODEW
*lpdvmInit
202 return IntCreateDICW ( lpszDriver
,
205 (PDEVMODEW
) lpdvmInit
,
219 CONST DEVMODEA
*lpdvmInit
223 LPWSTR lpszDriverW
, lpszDeviceW
, lpszOutputW
;
224 LPDEVMODEW dvmInitW
= NULL
;
227 Status
= HEAP_strdupA2W ( &lpszDriverW
, lpszDriver
);
228 if (!NT_SUCCESS (Status
))
229 SetLastError (RtlNtStatusToDosError(Status
));
232 Status
= HEAP_strdupA2W ( &lpszDeviceW
, lpszDevice
);
233 if (!NT_SUCCESS (Status
))
234 SetLastError (RtlNtStatusToDosError(Status
));
237 Status
= HEAP_strdupA2W ( &lpszOutputW
, lpszOutput
);
238 if (!NT_SUCCESS (Status
))
239 SetLastError (RtlNtStatusToDosError(Status
));
243 dvmInitW
= GdiConvertToDevmodeW((LPDEVMODEA
)lpdvmInit
);
245 rc
= IntCreateDICW ( lpszDriverW
,
248 lpdvmInit
? dvmInitW
: NULL
,
250 HEAP_free (dvmInitW
);
251 HEAP_free ( lpszOutputW
);
253 HEAP_free ( lpszDeviceW
);
255 HEAP_free ( lpszDriverW
);
273 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return FALSE
;
277 pLDC
= Dc_Attr
->pvLDC
;
281 DPRINT1("Delete the Local DC structure\n");
286 Ret
= NtGdiDeleteObjectApp(hDC
);
296 DeleteObject(HGDIOBJ hObject
)
300 /* From Wine: DeleteObject does not SetLastError() on a null object */
301 if(!hObject
) return FALSE
;
303 if (0 != ((DWORD
) hObject
& GDI_HANDLE_STOCK_MASK
))
304 { // Relax! This is a normal return!
305 DPRINT("Trying to delete system object 0x%x\n", hObject
);
308 // If you dont own it?! Get OUT!
309 if(!GdiIsHandleValid(hObject
)) return FALSE
;
311 Type
= GDI_HANDLE_GET_TYPE(hObject
);
313 if ((Type
== GDI_OBJECT_TYPE_METAFILE
) ||
314 (Type
== GDI_OBJECT_TYPE_ENHMETAFILE
))
319 case GDI_OBJECT_TYPE_DC
:
320 return DeleteDC((HDC
) hObject
);
321 case GDI_OBJECT_TYPE_COLORSPACE
:
322 return NtGdiDeleteColorSpace((HCOLORSPACE
) hObject
);
323 case GDI_OBJECT_TYPE_REGION
:
324 return DeleteRegion((HRGN
) hObject
);
326 case GDI_OBJECT_TYPE_METADC
:
327 return MFDRV_DeleteObject( hObject
);
328 case GDI_OBJECT_TYPE_EMF
:
330 PLDC pLDC
= GdiGetLDC(hObject
);
331 if ( !pLDC
) return FALSE
;
332 return EMFDRV_DeleteObject( hObject
);
335 case GDI_OBJECT_TYPE_FONT
:
338 case GDI_OBJECT_TYPE_BRUSH
:
339 case GDI_OBJECT_TYPE_EXTPEN
:
340 case GDI_OBJECT_TYPE_PEN
:
342 PBRUSH_ATTR Brh_Attr
;
345 if ((!GdiGetHandleUserData(hObject
, (DWORD
)Type
, (PVOID
) &Brh_Attr
)) ||
346 (Brh_Attr
== NULL
) ) break;
348 pTeb
= NtCurrentTeb();
350 if (pTeb
->Win32ThreadInfo
== NULL
) break;
352 if ((pTeb
->GdiTebBatch
.Offset
+ sizeof(GDIBSOBJECT
)) <= GDIBATCHBUFSIZE
)
354 PGDIBSOBJECT pgO
= (PGDIBSOBJECT
)(&pTeb
->GdiTebBatch
.Buffer
[0] +
355 pTeb
->GdiTebBatch
.Offset
);
356 pgO
->gbHdr
.Cmd
= GdiBCDelObj
;
357 pgO
->gbHdr
.Size
= sizeof(GDIBSOBJECT
);
358 pgO
->hgdiobj
= hObject
;
360 pTeb
->GdiTebBatch
.Offset
+= sizeof(GDIBSOBJECT
);
361 pTeb
->GdiBatchCount
++;
362 if (pTeb
->GdiBatchCount
>= GDI_BatchLimit
) NtGdiFlush();
367 case GDI_OBJECT_TYPE_BITMAP
:
371 return NtGdiDeleteObjectApp(hObject
);
376 GetArcDirection( HDC hdc
)
378 return GetDCDWord( hdc
, GdiGetArcDirection
, 0);
384 SetArcDirection( HDC hdc
, INT nDirection
)
386 return GetAndSetDCDWord( hdc
, GdiGetSetArcDirection
, nDirection
, 0, 0, 0 );
392 GetDCObject( HDC hDC
, INT iType
)
394 if((iType
== GDI_OBJECT_TYPE_BRUSH
) ||
395 (iType
== GDI_OBJECT_TYPE_EXTPEN
)||
396 (iType
== GDI_OBJECT_TYPE_PEN
) ||
397 (iType
== GDI_OBJECT_TYPE_COLORSPACE
))
402 if (!hDC
) return hGO
;
404 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return NULL
;
408 case GDI_OBJECT_TYPE_BRUSH
:
409 hGO
= Dc_Attr
->hbrush
;
412 case GDI_OBJECT_TYPE_EXTPEN
:
413 case GDI_OBJECT_TYPE_PEN
:
417 case GDI_OBJECT_TYPE_COLORSPACE
:
418 hGO
= Dc_Attr
->hColorSpace
;
423 return NtGdiGetDCObject( hDC
, iType
);
433 GetCurrentObject(HDC hdc
,
440 uObjectType
= GDI_OBJECT_TYPE_PEN
;
443 uObjectType
= GDI_OBJECT_TYPE_BRUSH
;
446 uObjectType
= GDI_OBJECT_TYPE_PALETTE
;
449 uObjectType
= GDI_OBJECT_TYPE_FONT
;
452 uObjectType
= GDI_OBJECT_TYPE_BITMAP
;
455 uObjectType
= GDI_OBJECT_TYPE_COLORSPACE
;
457 /* tests show that OBJ_REGION is explicitly ignored */
460 /* the SDK only mentions those above */
462 SetLastError(ERROR_INVALID_PARAMETER
);
465 return GetDCObject(hdc
, uObjectType
);
474 GetDeviceCaps(HDC hDC
,
479 PDEVCAPS pDevCaps
= GdiDevCaps
; // Primary display device capabilities.
480 DPRINT("Device CAPS1\n");
482 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
484 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
486 if ( i
== TECHNOLOGY
) return DT_METAFILE
;
491 pLDC
= GdiGetLDC(hDC
);
494 SetLastError(ERROR_INVALID_HANDLE
);
497 if (!(pLDC
->Flags
& LDC_DEVCAPS
))
499 if (!NtGdiGetDeviceCapsAll(hDC
, &pLDC
->DevCaps
))
500 SetLastError(ERROR_INVALID_PARAMETER
);
501 pLDC
->Flags
|= LDC_DEVCAPS
;
503 pDevCaps
= &pLDC
->DevCaps
;
508 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
))
510 if (!(Dc_Attr
->ulDirty_
& DC_PRIMARY_DISPLAY
) )
511 return NtGdiGetDeviceCaps(hDC
,i
);
513 DPRINT("Device CAPS2\n");
518 return pDevCaps
->ulVersion
;
521 return pDevCaps
->ulTechnology
;
524 return pDevCaps
->ulHorzSize
;
527 return pDevCaps
->ulVertSize
;
530 return pDevCaps
->ulHorzRes
;
533 return pDevCaps
->ulVertRes
;
536 return pDevCaps
->ulLogPixelsX
;
539 return pDevCaps
->ulLogPixelsY
;
542 return pDevCaps
->ulBitsPixel
;
545 return pDevCaps
->ulPlanes
;
551 return pDevCaps
->ulNumPens
;
554 return pDevCaps
->ulNumFonts
;
557 return pDevCaps
->ulNumColors
;
560 return pDevCaps
->ulAspectX
;
563 return pDevCaps
->ulAspectY
;
566 return pDevCaps
->ulAspectXY
;
572 return pDevCaps
->ulSizePalette
;
578 return pDevCaps
->ulColorRes
;
581 return pDevCaps
->ulVertRes
;
584 return pDevCaps
->ulHorzRes
;
587 return pDevCaps
->ulBltAlignment
;
590 return pDevCaps
->ulShadeBlend
;
593 return pDevCaps
->ulColorMgmtCaps
;
596 return pDevCaps
->ulPhysicalWidth
;
599 return pDevCaps
->ulPhysicalHeight
;
601 case PHYSICALOFFSETX
:
602 return pDevCaps
->ulPhysicalOffsetX
;
604 case PHYSICALOFFSETY
:
605 return pDevCaps
->ulPhysicalOffsetY
;
608 return pDevCaps
->ulVRefresh
;
611 return pDevCaps
->ulRasterCaps
;
614 return (CC_CIRCLES
| CC_PIE
| CC_CHORD
| CC_ELLIPSES
| CC_WIDE
|
615 CC_STYLED
| CC_WIDESTYLED
| CC_INTERIORS
| CC_ROUNDRECT
);
618 return (LC_POLYLINE
| LC_MARKER
| LC_POLYMARKER
| LC_WIDE
|
619 LC_STYLED
| LC_WIDESTYLED
| LC_INTERIORS
);
622 return (PC_POLYGON
| PC_RECTANGLE
| PC_WINDPOLYGON
| PC_SCANLINE
|
623 PC_WIDE
| PC_STYLED
| PC_WIDESTYLED
| PC_INTERIORS
);
626 return pDevCaps
->ulTextCaps
;
647 return GetDCDWord( hdc
, GdiGetRelAbs
, 0);
661 return GetAndSetDCDWord( hdc
, GdiGetSetRelAbs
, Mode
, 0, 0, 0 );
670 GetAndSetDCDWord( HDC hDC
, INT u
, DWORD dwIn
, DWORD Unk1
, DWORD Unk2
, DWORD Unk3
)
673 // Handle something other than a normal dc object.
674 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
676 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
677 return 0; //call MFDRV
680 PLDC pLDC
= GdiGetLDC(hDC
);
683 SetLastError(ERROR_INVALID_HANDLE
);
686 if (pLDC
->iType
== LDC_EMFLDC
)
688 Ret
= TRUE
; //call EMFDRV
695 Ret
= NtGdiGetAndSetDCDword( hDC
, u
, dwIn
, (DWORD
*) &u
);
699 SetLastError(ERROR_INVALID_HANDLE
);
709 GetDCDWord( HDC hDC
, INT u
, DWORD Result
)
711 BOOL Ret
= NtGdiGetDCDword( hDC
, u
, (DWORD
*) &u
);
712 if (!Ret
) return Result
;
722 GetAspectRatioFilterEx(
727 return NtGdiGetDCPoint( hdc
, GdiGetAspectRatioFilter
, (LPPOINT
) lpAspectRatio
);
741 return NtGdiGetDCPoint( hdc
, GdiGetDCOrg
, lpPoint
);
754 // Officially obsolete by Microsoft
756 if (!GetDCOrgEx(hdc
, &Pt
))
758 return(MAKELONG(Pt
.x
, Pt
.y
));
763 GetNonFontObject(HGDIOBJ hGdiObj
, int cbSize
, LPVOID lpBuffer
)
767 hGdiObj
= (HANDLE
)GdiFixUpHandle(hGdiObj
);
768 dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
770 if (!lpBuffer
) // Should pass it all to Win32k and let god sort it out. ;^)
774 case GDI_OBJECT_TYPE_PEN
:
775 return sizeof(LOGPEN
);
776 case GDI_OBJECT_TYPE_BRUSH
:
777 return sizeof(LOGBRUSH
);
778 case GDI_OBJECT_TYPE_BITMAP
:
779 return sizeof(BITMAP
);
780 case GDI_OBJECT_TYPE_PALETTE
:
782 case GDI_OBJECT_TYPE_EXTPEN
: /* we don't know the size, ask win32k */
789 case GDI_OBJECT_TYPE_PEN
: //Check the structures and see if A & W are the same.
790 case GDI_OBJECT_TYPE_EXTPEN
:
791 case GDI_OBJECT_TYPE_BRUSH
: // Mixing Apples and Oranges?
792 case GDI_OBJECT_TYPE_BITMAP
:
793 case GDI_OBJECT_TYPE_PALETTE
:
794 return NtGdiExtGetObjectW(hGdiObj
, cbSize
, lpBuffer
);
796 case GDI_OBJECT_TYPE_DC
:
797 case GDI_OBJECT_TYPE_REGION
:
798 case GDI_OBJECT_TYPE_METAFILE
:
799 case GDI_OBJECT_TYPE_ENHMETAFILE
:
800 case GDI_OBJECT_TYPE_EMF
:
801 SetLastError(ERROR_INVALID_HANDLE
);
812 GetObjectA(HGDIOBJ hGdiObj
, int cbSize
, LPVOID lpBuffer
)
814 ENUMLOGFONTEXDVW LogFont
;
818 dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
820 if(dwType
== GDI_OBJECT_TYPE_COLORSPACE
) //Stays here, processes struct A
822 SetLastError(ERROR_NOT_SUPPORTED
);
826 if (dwType
== GDI_OBJECT_TYPE_FONT
)
830 return sizeof(LOGFONTA
);
834 /* Windows does not SetLastError() */
837 // ENUMLOGFONTEXDVW is the default size and should be the structure for
838 // Entry->KernelData for Font objects.
839 Result
= NtGdiExtGetObjectW(hGdiObj
, sizeof(ENUMLOGFONTEXDVW
), &LogFont
);
848 case sizeof(ENUMLOGFONTEXDVA
):
849 // need to move more here.
850 case sizeof(ENUMLOGFONTEXA
):
851 EnumLogFontExW2A( (LPENUMLOGFONTEXA
) lpBuffer
, &LogFont
.elfEnumLogfontEx
);
854 case sizeof(ENUMLOGFONTA
):
855 // Same here, maybe? Check the structures.
856 case sizeof(EXTLOGFONTA
):
858 case sizeof(LOGFONTA
):
859 LogFontW2A((LPLOGFONTA
) lpBuffer
, &LogFont
.elfEnumLogfontEx
.elfLogFont
);
863 SetLastError(ERROR_BUFFER_OVERFLOW
);
869 return GetNonFontObject(hGdiObj
, cbSize
, lpBuffer
);
878 GetObjectW(HGDIOBJ hGdiObj
, int cbSize
, LPVOID lpBuffer
)
880 DWORD dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
885 MSDN, "This can be a handle to one of the following: logical bitmap, a brush,
886 a font, a palette, a pen, or a device independent bitmap created by calling
887 the CreateDIBSection function."
889 if(dwType
== GDI_OBJECT_TYPE_COLORSPACE
) //Stays here, processes struct W
891 SetLastError(ERROR_NOT_SUPPORTED
); // Not supported yet.
895 if (dwType
== GDI_OBJECT_TYPE_FONT
)
899 return sizeof(LOGFONTW
);
904 /* Windows does not SetLastError() */
907 // Poorly written apps are not ReactOS problem!
908 // We fix it here if the size is larger than the default size.
909 if( cbSize
> (int)sizeof(ENUMLOGFONTEXDVW
) ) cbSize
= sizeof(ENUMLOGFONTEXDVW
);
911 Result
= NtGdiExtGetObjectW(hGdiObj
, cbSize
, lpBuffer
); // Should handle the copy.
920 return GetNonFontObject(hGdiObj
, cbSize
, lpBuffer
);
935 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return CLR_INVALID
;
936 return (COLORREF
) Dc_Attr
->ulPenClr
;
950 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return CLR_INVALID
;
951 return (COLORREF
) Dc_Attr
->ulPenClr
;
965 COLORREF OldColor
= CLR_INVALID
;
967 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
970 OldColor
= (COLORREF
) Dc_Attr
->ulBrushClr
;
971 Dc_Attr
->ulBrushClr
= (ULONG
) crColor
;
973 if ( Dc_Attr
->crBrushClr
!= crColor
) // if same, don't force a copy.
975 Dc_Attr
->ulDirty_
|= DIRTY_FILL
;
976 Dc_Attr
->crBrushClr
= crColor
;
993 COLORREF OldColor
= CLR_INVALID
;
995 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
998 OldColor
= (COLORREF
) Dc_Attr
->ulPenClr
;
999 Dc_Attr
->ulPenClr
= (ULONG
) crColor
;
1001 if ( Dc_Attr
->crPenClr
!= crColor
)
1003 Dc_Attr
->ulDirty_
|= DIRTY_LINE
;
1004 Dc_Attr
->crPenClr
= crColor
;
1019 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1020 return Dc_Attr
->ulBackgroundClr
;
1034 COLORREF OldColor
= CLR_INVALID
;
1036 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
1038 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
1040 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
1041 return MFDRV_SetBkColor( hDC
, crColor
);
1044 PLDC pLDC
= Dc_Attr
->pvLDC
;
1047 SetLastError(ERROR_INVALID_HANDLE
);
1050 if (pLDC
->iType
== LDC_EMFLDC
)
1052 return EMFDRV_SetBkColor( hDC
, crColor
);
1057 OldColor
= (COLORREF
) Dc_Attr
->ulBackgroundClr
;
1058 Dc_Attr
->ulBackgroundClr
= (ULONG
) crColor
;
1060 if ( Dc_Attr
->crBackgroundClr
!= crColor
)
1062 Dc_Attr
->ulDirty_
|= (DIRTY_BACKGROUND
|DIRTY_LINE
|DIRTY_FILL
);
1063 Dc_Attr
->crBackgroundClr
= crColor
;
1077 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1078 return Dc_Attr
->lBkMode
;
1093 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldMode
;
1095 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
1097 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
1098 return MFDRV_SetBkMode( hdc
, iBkMode
)
1101 PLDC pLDC
= Dc_Attr
->pvLDC
;
1104 SetLastError(ERROR_INVALID_HANDLE
);
1107 if (pLDC
->iType
== LDC_EMFLDC
)
1109 return EMFDRV_SetBkMode( hdc
, iBkMode
)
1114 OldMode
= Dc_Attr
->lBkMode
;
1115 Dc_Attr
->jBkMode
= iBkMode
; // Processed
1116 Dc_Attr
->lBkMode
= iBkMode
; // Raw
1126 GetPolyFillMode(HDC hdc
)
1129 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1130 return Dc_Attr
->lFillMode
;
1138 SetPolyFillMode(HDC hdc
,
1144 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
1146 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
1147 return MFDRV_SetPolyFillMode( hdc
, iPolyFillMode
)
1150 PLDC pLDC
= GdiGetLDC(hdc
);
1153 SetLastError(ERROR_INVALID_HANDLE
);
1156 if (pLDC
->iType
== LDC_EMFLDC
)
1158 return EMFDRV_SetPolyFillMode( hdc
, iPolyFillMode
)
1163 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1165 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
1167 if (Dc_Attr
->ulDirty_
& DC_MODE_DIRTY
)
1169 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
1170 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
1174 fmode
= Dc_Attr
->lFillMode
;
1175 Dc_Attr
->lFillMode
= iPolyFillMode
;
1186 GetGraphicsMode(HDC hdc
)
1189 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1190 return Dc_Attr
->iGraphicsMode
;
1198 SetGraphicsMode(HDC hdc
,
1203 if ((iMode
< GM_COMPATIBLE
) || (iMode
> GM_ADVANCED
))
1205 SetLastError(ERROR_INVALID_PARAMETER
);
1208 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1210 if (iMode
== Dc_Attr
->iGraphicsMode
) return iMode
;
1212 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
1214 if (Dc_Attr
->ulDirty_
& DC_MODE_DIRTY
)
1216 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
1217 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
1220 /* One would think that setting the graphics mode to GM_COMPATIBLE
1221 * would also reset the world transformation matrix to the unity
1222 * matrix. However, in Windows, this is not the case. This doesn't
1223 * make a lot of sense to me, but that's the way it is.
1225 oMode
= Dc_Attr
->iGraphicsMode
;
1226 Dc_Attr
->iGraphicsMode
= iMode
;
1238 CONST DEVMODEW
*lpInitData
1241 NtGdiResetDC ( hdc
, (PDEVMODEW
)lpInitData
, NULL
, NULL
, NULL
);
1253 CONST DEVMODEA
*lpInitData
1256 LPDEVMODEW InitDataW
;
1258 InitDataW
= GdiConvertToDevmodeW((LPDEVMODEA
)lpInitData
);
1260 NtGdiResetDC ( hdc
, InitDataW
, NULL
, NULL
, NULL
);
1261 HEAP_free(InitDataW
);
1276 return NtGdiStartDoc ( hdc
, (DOCINFOW
*)a1
, NULL
, 0);
1291 if(GdiIsHandleValid(h
))
1293 LONG Type
= GDI_HANDLE_GET_TYPE(h
);
1296 case GDI_OBJECT_TYPE_PEN
:
1299 case GDI_OBJECT_TYPE_BRUSH
:
1302 case GDI_OBJECT_TYPE_BITMAP
:
1305 case GDI_OBJECT_TYPE_FONT
:
1308 case GDI_OBJECT_TYPE_PALETTE
:
1311 case GDI_OBJECT_TYPE_REGION
:
1314 case GDI_OBJECT_TYPE_DC
:
1315 if ( GetDCDWord( h
, GdiGetIsMemDc
, 0))
1322 case GDI_OBJECT_TYPE_COLORSPACE
:
1323 Ret
= OBJ_COLORSPACE
;
1325 case GDI_OBJECT_TYPE_METAFILE
:
1328 case GDI_OBJECT_TYPE_ENHMETAFILE
:
1329 Ret
= OBJ_ENHMETAFILE
;
1331 case GDI_OBJECT_TYPE_METADC
:
1334 case GDI_OBJECT_TYPE_EXTPEN
:
1339 DPRINT1("GetObjectType: Magic 0x%08x not implemented\n", Type
);
1344 /* From Wine: GetObjectType does SetLastError() on a null object */
1345 SetLastError(ERROR_INVALID_HANDLE
);
1360 if ((h
< 0) || (h
>= NB_STOCK_OBJECTS
)) return Ret
;
1361 Ret
= stock_objects
[h
];
1364 HGDIOBJ Obj
= NtGdiGetStockObject( h
);
1366 if (GdiIsHandleValid(Obj
))
1368 stock_objects
[h
] = Obj
;
1370 }// Returns Null anyway.
1375 /* FIXME: include correct header */
1376 HPALETTE WINAPI
NtUserSelectPalette(HDC hDC
,
1378 BOOL ForceBackground
);
1385 BOOL bForceBackground
)
1388 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
1390 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
1391 return MFDRV_SelectPalette( hDC
, hPal
, bForceBackground
);
1394 PLDC pLDC
= GdiGetLDC(hDC
);
1397 SetLastError(ERROR_INVALID_HANDLE
);
1400 if (pLDC
->iType
== LDC_EMFLDC
)
1402 if return EMFDRV_SelectPalette( hDC
, hPal
, bForceBackground
);
1407 return NtUserSelectPalette(hDC
, hPal
, bForceBackground
);
1419 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1420 return Dc_Attr
->iMapMode
;
1434 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1436 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
1438 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
1439 return MFDRV_SetMapMode(hdc
, Mode
);
1442 SetLastError(ERROR_INVALID_HANDLE
);
1446 // Force change if Isotropic is set for recompute.
1447 if ((Mode
!= Dc_Attr
->iMapMode
) || (Mode
== MM_ISOTROPIC
))
1449 Dc_Attr
->ulDirty_
&= ~SLOW_WIDTHS
;
1450 return GetAndSetDCDWord( hdc
, GdiGetSetMapMode
, Mode
, 0, 0, 0 );
1452 return Dc_Attr
->iMapMode
;
1461 GetStretchBltMode(HDC hdc
)
1464 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1465 return Dc_Attr
->lStretchBltMode
;
1473 SetStretchBltMode(HDC hdc
, int iStretchMode
)
1478 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
1480 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
1481 return MFDRV_SetStretchBltMode( hdc
, iStretchMode
);
1484 PLDC pLDC
= GdiGetLDC(hdc
);
1487 SetLastError(ERROR_INVALID_HANDLE
);
1490 if (pLDC
->iType
== LDC_EMFLDC
)
1492 return EMFDRV_SetStretchBltMode( hdc
, iStretchMode
);
1497 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1499 oSMode
= Dc_Attr
->lStretchBltMode
;
1500 Dc_Attr
->lStretchBltMode
= iStretchMode
;
1502 // Wine returns an error here. We set the default.
1503 if ((iStretchMode
<= 0) || (iStretchMode
> MAXSTRETCHBLTMODE
)) iStretchMode
= WHITEONBLACK
;
1505 Dc_Attr
->jStretchBltMode
= iStretchMode
;
1518 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return NULL
;
1519 return Dc_Attr
->hlfntNew
;
1529 SelectObject(HDC hDC
,
1533 HGDIOBJ hOldObj
= NULL
;
1536 if(!GdiGetHandleUserData(hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
)&pDc_Attr
))
1538 SetLastError(ERROR_INVALID_HANDLE
);
1542 hGdiObj
= GdiFixUpHandle(hGdiObj
);
1543 if (!GdiIsHandleValid(hGdiObj
))
1548 UINT uType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
1552 case GDI_OBJECT_TYPE_REGION
:
1553 return (HGDIOBJ
)ExtSelectClipRgn(hDC
, hGdiObj
, RGN_COPY
);
1555 case GDI_OBJECT_TYPE_BITMAP
:
1556 return NtGdiSelectBitmap(hDC
, hGdiObj
);
1558 case GDI_OBJECT_TYPE_BRUSH
:
1559 hOldObj
= pDc_Attr
->hbrush
;
1560 pDc_Attr
->ulDirty_
|= DC_BRUSH_DIRTY
;
1561 pDc_Attr
->hbrush
= hGdiObj
;
1563 // return NtGdiSelectBrush(hDC, hGdiObj);
1565 case GDI_OBJECT_TYPE_PEN
:
1566 case GDI_OBJECT_TYPE_EXTPEN
:
1567 hOldObj
= pDc_Attr
->hpen
;
1568 pDc_Attr
->ulDirty_
|= DC_PEN_DIRTY
;
1569 pDc_Attr
->hpen
= hGdiObj
;
1571 // return NtGdiSelectPen(hDC, hGdiObj);
1573 case GDI_OBJECT_TYPE_FONT
:
1574 hOldObj
= pDc_Attr
->hlfntNew
;
1575 if (hOldObj
== hGdiObj
) return hOldObj
;
1577 pDc_Attr
->ulDirty_
&= ~SLOW_WIDTHS
;
1578 pDc_Attr
->ulDirty_
|= DIRTY_CHARSET
;
1579 pDc_Attr
->hlfntNew
= hGdiObj
;
1580 pTeb
= NtCurrentTeb();
1581 if (((pTeb
->GdiTebBatch
.HDC
== 0) ||
1582 (pTeb
->GdiTebBatch
.HDC
== hDC
)) &&
1583 ((pTeb
->GdiTebBatch
.Offset
+ sizeof(GDIBSOBJECT
)) <= GDIBATCHBUFSIZE
) &&
1584 (!(pDc_Attr
->ulDirty_
& DC_DIBSECTION
)))
1586 PGDIBSOBJECT pgO
= (PGDIBSOBJECT
)(&pTeb
->GdiTebBatch
.Buffer
[0] +
1587 pTeb
->GdiTebBatch
.Offset
);
1588 pgO
->gbHdr
.Cmd
= GdiBCSelObj
;
1589 pgO
->gbHdr
.Size
= sizeof(GDIBSOBJECT
);
1590 pgO
->hgdiobj
= hGdiObj
;
1592 pTeb
->GdiTebBatch
.Offset
+= sizeof(GDIBSOBJECT
);
1593 pTeb
->GdiTebBatch
.HDC
= hDC
;
1594 pTeb
->GdiBatchCount
++;
1595 if (pTeb
->GdiBatchCount
>= GDI_BatchLimit
) NtGdiFlush();
1599 // default for select object font
1600 return NtGdiSelectFont(hDC
, hGdiObj
);
1603 case GDI_OBJECT_TYPE_METADC
:
1604 return MFDRV_SelectObject( hDC
, hGdiObj
);
1605 case GDI_OBJECT_TYPE_EMF
:
1606 PLDC pLDC
= GdiGetLDC(hDC
);
1607 if ( !pLDC
) return NULL
;
1608 return EMFDRV_SelectObject( hDC
, hGdiObj
);
1610 case GDI_OBJECT_TYPE_COLORSPACE
:
1611 SetColorSpace(hDC
, (HCOLORSPACE
) hGdiObj
);
1614 case GDI_OBJECT_TYPE_PALETTE
:
1616 SetLastError(ERROR_INVALID_FUNCTION
);