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 ( !ghSpooler
&& !LoadTheSpoolerDrv())
25 DPRINT1("WinSpooler.Drv Did not load!\n");
29 DPRINT("WinSpooler.Drv Loaded! hMod -> 0x%x\n", ghSpooler
);
32 if ((!lpwszDevice
) && (!lpwszDriver
))
34 Default
= FALSE
; // Ask Win32k to set Default device.
35 Display
= TRUE
; // Most likely to be DISPLAY.
39 if (lpwszDevice
) // First
41 if (!_wcsnicmp(lpwszDevice
, L
"\\\\.\\DISPLAY",11)) Display
= TRUE
;
42 RtlInitUnicodeString(&Device
, lpwszDevice
);
46 if (lpwszDriver
) // Second
48 if ((!_wcsnicmp(lpwszDriver
, L
"DISPLAY",7)) ||
49 (!_wcsnicmp(lpwszDriver
, L
"\\\\.\\DISPLAY",11))) Display
= TRUE
;
50 RtlInitUnicodeString(&Device
, lpwszDriver
);
55 if (lpwszOutput
) RtlInitUnicodeString(&Output
, lpwszOutput
);
59 //Handle Print device or something else.
60 DPRINT1("Not a DISPLAY device! %wZ\n", &Device
);
63 hDC
= NtGdiOpenDCW( (Default
? &Device
: NULL
),
64 (PDEVMODEW
) lpInitData
,
65 (lpwszOutput
? &Output
: NULL
),
66 iType
, // DCW 0 and ICW 1.
68 (PVOID
) NULL
, // NULL for now.
71 // Handle something other than a normal dc object.
72 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
77 GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
);
79 pLDC
= LocalAlloc(LMEM_ZEROINIT
, sizeof(LDC
));
81 Dc_Attr
->pvLDC
= pLDC
;
83 pLDC
->iType
= LDC_LDC
; // 1 (init) local DC, 2 EMF LDC
84 DbgPrint("DC_ATTR Allocated -> 0x%x\n",Dc_Attr
);
96 CreateCompatibleDC ( HDC hdc
)
101 rhDC
= NtGdiCreateCompatibleDC(hdc
);
105 if (GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
))
107 if ( Dc_Attr
->pvLIcm
) IcmCompatibleDC(rhDC
, hdc
, Dc_Attr
);
123 CONST DEVMODEA
* lpdvmInit
126 ANSI_STRING DriverA
, DeviceA
, OutputA
;
127 UNICODE_STRING DriverU
, DeviceU
, OutputU
;
128 LPDEVMODEW dvmInitW
= NULL
;
132 * If needed, convert to Unicode
133 * any string parameter.
136 if (NULL
!= lpszDriver
)
138 RtlInitAnsiString(&DriverA
, (LPSTR
)lpszDriver
);
139 RtlAnsiStringToUnicodeString(&DriverU
, &DriverA
, TRUE
);
141 DriverU
.Buffer
= NULL
;
142 if (NULL
!= lpszDevice
)
144 RtlInitAnsiString(&DeviceA
, (LPSTR
)lpszDevice
);
145 RtlAnsiStringToUnicodeString(&DeviceU
, &DeviceA
, TRUE
);
147 DeviceU
.Buffer
= NULL
;
148 if (NULL
!= lpszOutput
)
150 RtlInitAnsiString(&OutputA
, (LPSTR
)lpszOutput
);
151 RtlAnsiStringToUnicodeString(&OutputU
, &OutputA
, TRUE
);
153 OutputU
.Buffer
= NULL
;
156 dvmInitW
= GdiConvertToDevmodeW((LPDEVMODEA
)lpdvmInit
);
158 hDC
= IntCreateDICW ( DriverU
.Buffer
,
161 lpdvmInit
? dvmInitW
: NULL
,
163 HEAP_free (dvmInitW
);
165 * Free Unicode parameters.
167 RtlFreeUnicodeString(&DriverU
);
168 RtlFreeUnicodeString(&DeviceU
);
169 RtlFreeUnicodeString(&OutputU
);
172 * Return the possible DC handle.
187 CONST DEVMODEW
*lpInitData
191 return IntCreateDICW ( lpwszDriver
,
194 (PDEVMODEW
) lpInitData
,
208 CONST DEVMODEW
*lpdvmInit
211 return IntCreateDICW ( lpszDriver
,
214 (PDEVMODEW
) lpdvmInit
,
228 CONST DEVMODEA
*lpdvmInit
232 LPWSTR lpszDriverW
, lpszDeviceW
, lpszOutputW
;
233 LPDEVMODEW dvmInitW
= NULL
;
236 Status
= HEAP_strdupA2W ( &lpszDriverW
, lpszDriver
);
237 if (!NT_SUCCESS (Status
))
238 SetLastError (RtlNtStatusToDosError(Status
));
241 Status
= HEAP_strdupA2W ( &lpszDeviceW
, lpszDevice
);
242 if (!NT_SUCCESS (Status
))
243 SetLastError (RtlNtStatusToDosError(Status
));
246 Status
= HEAP_strdupA2W ( &lpszOutputW
, lpszOutput
);
247 if (!NT_SUCCESS (Status
))
248 SetLastError (RtlNtStatusToDosError(Status
));
252 dvmInitW
= GdiConvertToDevmodeW((LPDEVMODEA
)lpdvmInit
);
254 rc
= IntCreateDICW ( lpszDriverW
,
257 lpdvmInit
? dvmInitW
: NULL
,
259 HEAP_free (dvmInitW
);
260 HEAP_free ( lpszOutputW
);
262 HEAP_free ( lpszDeviceW
);
264 HEAP_free ( lpszDriverW
);
282 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return FALSE
;
286 pLDC
= Dc_Attr
->pvLDC
;
290 DPRINT1("Delete the Local DC structure\n");
295 Ret
= NtGdiDeleteObjectApp(hDC
);
305 DeleteObject(HGDIOBJ hObject
)
309 /* From Wine: DeleteObject does not SetLastError() on a null object */
310 if(!hObject
) return FALSE
;
312 if (0 != ((DWORD
) hObject
& GDI_HANDLE_STOCK_MASK
))
313 { // Relax! This is a normal return!
314 DPRINT("Trying to delete system object 0x%x\n", hObject
);
317 // If you dont own it?! Get OUT!
318 if(!GdiIsHandleValid(hObject
)) return FALSE
;
320 Type
= GDI_HANDLE_GET_TYPE(hObject
);
322 if ((Type
== GDI_OBJECT_TYPE_METAFILE
) ||
323 (Type
== GDI_OBJECT_TYPE_ENHMETAFILE
))
328 case GDI_OBJECT_TYPE_DC
:
329 return DeleteDC((HDC
) hObject
);
330 case GDI_OBJECT_TYPE_COLORSPACE
:
331 return NtGdiDeleteColorSpace((HCOLORSPACE
) hObject
);
332 case GDI_OBJECT_TYPE_REGION
:
333 return DeleteRegion((HRGN
) hObject
);
335 case GDI_OBJECT_TYPE_METADC
:
336 return MFDRV_DeleteObject( hObject
);
337 case GDI_OBJECT_TYPE_EMF
:
339 PLDC pLDC
= GdiGetLDC(hObject
);
340 if ( !pLDC
) return FALSE
;
341 return EMFDRV_DeleteObject( hObject
);
344 case GDI_OBJECT_TYPE_FONT
:
347 case GDI_OBJECT_TYPE_BRUSH
:
348 case GDI_OBJECT_TYPE_EXTPEN
:
349 case GDI_OBJECT_TYPE_PEN
:
351 PBRUSH_ATTR Brh_Attr
;
354 if ((!GdiGetHandleUserData(hObject
, (DWORD
)Type
, (PVOID
) &Brh_Attr
)) ||
355 (Brh_Attr
== NULL
) ) break;
357 pTeb
= NtCurrentTeb();
359 if (pTeb
->Win32ThreadInfo
== NULL
) break;
361 if ((pTeb
->GdiTebBatch
.Offset
+ sizeof(GDIBSOBJECT
)) <= GDIBATCHBUFSIZE
)
363 PGDIBSOBJECT pgO
= (PGDIBSOBJECT
)(&pTeb
->GdiTebBatch
.Buffer
[0] +
364 pTeb
->GdiTebBatch
.Offset
);
365 pgO
->gbHdr
.Cmd
= GdiBCDelObj
;
366 pgO
->gbHdr
.Size
= sizeof(GDIBSOBJECT
);
367 pgO
->hgdiobj
= hObject
;
369 pTeb
->GdiTebBatch
.Offset
+= sizeof(GDIBSOBJECT
);
370 pTeb
->GdiBatchCount
++;
371 if (pTeb
->GdiBatchCount
>= GDI_BatchLimit
) NtGdiFlush();
376 case GDI_OBJECT_TYPE_BITMAP
:
380 return NtGdiDeleteObjectApp(hObject
);
385 GetArcDirection( HDC hdc
)
387 return GetDCDWord( hdc
, GdiGetArcDirection
, 0);
393 SetArcDirection( HDC hdc
, INT nDirection
)
395 return GetAndSetDCDWord( hdc
, GdiGetSetArcDirection
, nDirection
, 0, 0, 0 );
401 GetDCObject( HDC hDC
, INT iType
)
403 if((iType
== GDI_OBJECT_TYPE_BRUSH
) ||
404 (iType
== GDI_OBJECT_TYPE_EXTPEN
)||
405 (iType
== GDI_OBJECT_TYPE_PEN
) ||
406 (iType
== GDI_OBJECT_TYPE_COLORSPACE
))
411 if (!hDC
) return hGO
;
413 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return NULL
;
417 case GDI_OBJECT_TYPE_BRUSH
:
418 hGO
= Dc_Attr
->hbrush
;
421 case GDI_OBJECT_TYPE_EXTPEN
:
422 case GDI_OBJECT_TYPE_PEN
:
426 case GDI_OBJECT_TYPE_COLORSPACE
:
427 hGO
= Dc_Attr
->hColorSpace
;
432 return NtGdiGetDCObject( hDC
, iType
);
442 GetCurrentObject(HDC hdc
,
449 uObjectType
= GDI_OBJECT_TYPE_PEN
;
452 uObjectType
= GDI_OBJECT_TYPE_BRUSH
;
455 uObjectType
= GDI_OBJECT_TYPE_PALETTE
;
458 uObjectType
= GDI_OBJECT_TYPE_FONT
;
461 uObjectType
= GDI_OBJECT_TYPE_BITMAP
;
464 uObjectType
= GDI_OBJECT_TYPE_COLORSPACE
;
466 /* tests show that OBJ_REGION is explicitly ignored */
469 /* the SDK only mentions those above */
471 SetLastError(ERROR_INVALID_PARAMETER
);
474 return GetDCObject(hdc
, uObjectType
);
483 GetDeviceCaps(HDC hDC
,
488 PDEVCAPS pDevCaps
= GdiDevCaps
; // Primary display device capabilities.
489 DPRINT("Device CAPS1\n");
491 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
493 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
495 if ( i
== TECHNOLOGY
) return DT_METAFILE
;
500 pLDC
= GdiGetLDC(hDC
);
503 SetLastError(ERROR_INVALID_HANDLE
);
506 if (!(pLDC
->Flags
& LDC_DEVCAPS
))
508 if (!NtGdiGetDeviceCapsAll(hDC
, &pLDC
->DevCaps
))
509 SetLastError(ERROR_INVALID_PARAMETER
);
510 pLDC
->Flags
|= LDC_DEVCAPS
;
512 pDevCaps
= &pLDC
->DevCaps
;
517 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
))
519 if (!(Dc_Attr
->ulDirty_
& DC_PRIMARY_DISPLAY
) )
520 return NtGdiGetDeviceCaps(hDC
,i
);
522 DPRINT("Device CAPS2\n");
527 return pDevCaps
->ulVersion
;
530 return pDevCaps
->ulTechnology
;
533 return pDevCaps
->ulHorzSize
;
536 return pDevCaps
->ulVertSize
;
539 return pDevCaps
->ulHorzRes
;
542 return pDevCaps
->ulVertRes
;
545 return pDevCaps
->ulLogPixelsX
;
548 return pDevCaps
->ulLogPixelsY
;
551 return pDevCaps
->ulBitsPixel
;
554 return pDevCaps
->ulPlanes
;
560 return pDevCaps
->ulNumPens
;
563 return pDevCaps
->ulNumFonts
;
566 return pDevCaps
->ulNumColors
;
569 return pDevCaps
->ulAspectX
;
572 return pDevCaps
->ulAspectY
;
575 return pDevCaps
->ulAspectXY
;
581 return pDevCaps
->ulSizePalette
;
587 return pDevCaps
->ulColorRes
;
590 return pDevCaps
->ulVertRes
;
593 return pDevCaps
->ulHorzRes
;
596 return pDevCaps
->ulBltAlignment
;
599 return pDevCaps
->ulShadeBlend
;
602 return pDevCaps
->ulColorMgmtCaps
;
605 return pDevCaps
->ulPhysicalWidth
;
608 return pDevCaps
->ulPhysicalHeight
;
610 case PHYSICALOFFSETX
:
611 return pDevCaps
->ulPhysicalOffsetX
;
613 case PHYSICALOFFSETY
:
614 return pDevCaps
->ulPhysicalOffsetY
;
617 return pDevCaps
->ulVRefresh
;
620 return pDevCaps
->ulRasterCaps
;
623 return (CC_CIRCLES
| CC_PIE
| CC_CHORD
| CC_ELLIPSES
| CC_WIDE
|
624 CC_STYLED
| CC_WIDESTYLED
| CC_INTERIORS
| CC_ROUNDRECT
);
627 return (LC_POLYLINE
| LC_MARKER
| LC_POLYMARKER
| LC_WIDE
|
628 LC_STYLED
| LC_WIDESTYLED
| LC_INTERIORS
);
631 return (PC_POLYGON
| PC_RECTANGLE
| PC_WINDPOLYGON
| PC_SCANLINE
|
632 PC_WIDE
| PC_STYLED
| PC_WIDESTYLED
| PC_INTERIORS
);
635 return pDevCaps
->ulTextCaps
;
656 return GetDCDWord( hdc
, GdiGetRelAbs
, 0);
670 return GetAndSetDCDWord( hdc
, GdiGetSetRelAbs
, Mode
, 0, 0, 0 );
679 GetAndSetDCDWord( HDC hDC
, INT u
, DWORD dwIn
, DWORD Unk1
, DWORD Unk2
, DWORD Unk3
)
682 // Handle something other than a normal dc object.
683 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
685 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
686 return 0; //call MFDRV
689 PLDC pLDC
= GdiGetLDC(hDC
);
692 SetLastError(ERROR_INVALID_HANDLE
);
695 if (pLDC
->iType
== LDC_EMFLDC
)
697 Ret
= TRUE
; //call EMFDRV
704 Ret
= NtGdiGetAndSetDCDword( hDC
, u
, dwIn
, (DWORD
*) &u
);
708 SetLastError(ERROR_INVALID_HANDLE
);
718 GetDCDWord( HDC hDC
, INT u
, DWORD Result
)
720 BOOL Ret
= NtGdiGetDCDword( hDC
, u
, (DWORD
*) &u
);
721 if (!Ret
) return Result
;
731 GetAspectRatioFilterEx(
736 return NtGdiGetDCPoint( hdc
, GdiGetAspectRatioFilter
, (LPPOINT
) lpAspectRatio
);
750 return NtGdiGetDCPoint( hdc
, GdiGetDCOrg
, lpPoint
);
763 // Officially obsolete by Microsoft
765 if (!GetDCOrgEx(hdc
, &Pt
))
767 return(MAKELONG(Pt
.x
, Pt
.y
));
772 GetNonFontObject(HGDIOBJ hGdiObj
, int cbSize
, LPVOID lpBuffer
)
776 hGdiObj
= (HANDLE
)GdiFixUpHandle(hGdiObj
);
777 dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
779 if (!lpBuffer
) // Should pass it all to Win32k and let god sort it out. ;^)
783 case GDI_OBJECT_TYPE_PEN
:
784 return sizeof(LOGPEN
);
785 case GDI_OBJECT_TYPE_BRUSH
:
786 return sizeof(LOGBRUSH
);
787 case GDI_OBJECT_TYPE_BITMAP
:
788 return sizeof(BITMAP
);
789 case GDI_OBJECT_TYPE_PALETTE
:
791 case GDI_OBJECT_TYPE_EXTPEN
: /* we don't know the size, ask win32k */
798 case GDI_OBJECT_TYPE_PEN
: //Check the structures and see if A & W are the same.
799 case GDI_OBJECT_TYPE_EXTPEN
:
800 case GDI_OBJECT_TYPE_BRUSH
: // Mixing Apples and Oranges?
801 case GDI_OBJECT_TYPE_BITMAP
:
802 case GDI_OBJECT_TYPE_PALETTE
:
803 return NtGdiExtGetObjectW(hGdiObj
, cbSize
, lpBuffer
);
805 case GDI_OBJECT_TYPE_DC
:
806 case GDI_OBJECT_TYPE_REGION
:
807 case GDI_OBJECT_TYPE_METAFILE
:
808 case GDI_OBJECT_TYPE_ENHMETAFILE
:
809 case GDI_OBJECT_TYPE_EMF
:
810 SetLastError(ERROR_INVALID_HANDLE
);
821 GetObjectA(HGDIOBJ hGdiObj
, int cbSize
, LPVOID lpBuffer
)
823 ENUMLOGFONTEXDVW LogFont
;
827 dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
829 if(dwType
== GDI_OBJECT_TYPE_COLORSPACE
) //Stays here, processes struct A
831 SetLastError(ERROR_NOT_SUPPORTED
);
835 if (dwType
== GDI_OBJECT_TYPE_FONT
)
839 return sizeof(LOGFONTA
);
843 /* Windows does not SetLastError() */
846 // ENUMLOGFONTEXDVW is the default size and should be the structure for
847 // Entry->KernelData for Font objects.
848 Result
= NtGdiExtGetObjectW(hGdiObj
, sizeof(ENUMLOGFONTEXDVW
), &LogFont
);
857 case sizeof(ENUMLOGFONTEXDVA
):
858 // need to move more here.
859 case sizeof(ENUMLOGFONTEXA
):
860 EnumLogFontExW2A( (LPENUMLOGFONTEXA
) lpBuffer
, &LogFont
.elfEnumLogfontEx
);
863 case sizeof(ENUMLOGFONTA
):
864 // Same here, maybe? Check the structures.
865 case sizeof(EXTLOGFONTA
):
867 case sizeof(LOGFONTA
):
868 LogFontW2A((LPLOGFONTA
) lpBuffer
, &LogFont
.elfEnumLogfontEx
.elfLogFont
);
872 SetLastError(ERROR_BUFFER_OVERFLOW
);
878 return GetNonFontObject(hGdiObj
, cbSize
, lpBuffer
);
887 GetObjectW(HGDIOBJ hGdiObj
, int cbSize
, LPVOID lpBuffer
)
889 DWORD dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
894 MSDN, "This can be a handle to one of the following: logical bitmap, a brush,
895 a font, a palette, a pen, or a device independent bitmap created by calling
896 the CreateDIBSection function."
898 if(dwType
== GDI_OBJECT_TYPE_COLORSPACE
) //Stays here, processes struct W
900 SetLastError(ERROR_NOT_SUPPORTED
); // Not supported yet.
904 if (dwType
== GDI_OBJECT_TYPE_FONT
)
908 return sizeof(LOGFONTW
);
913 /* Windows does not SetLastError() */
916 // Poorly written apps are not ReactOS problem!
917 // We fix it here if the size is larger than the default size.
918 if( cbSize
> (int)sizeof(ENUMLOGFONTEXDVW
) ) cbSize
= sizeof(ENUMLOGFONTEXDVW
);
920 Result
= NtGdiExtGetObjectW(hGdiObj
, cbSize
, lpBuffer
); // Should handle the copy.
929 return GetNonFontObject(hGdiObj
, cbSize
, lpBuffer
);
944 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return CLR_INVALID
;
945 return (COLORREF
) Dc_Attr
->ulBrushClr
;
959 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return CLR_INVALID
;
960 return (COLORREF
) Dc_Attr
->ulPenClr
;
974 COLORREF OldColor
= CLR_INVALID
;
976 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
979 OldColor
= (COLORREF
) Dc_Attr
->ulBrushClr
;
980 Dc_Attr
->ulBrushClr
= (ULONG
) crColor
;
982 if ( Dc_Attr
->crBrushClr
!= crColor
) // if same, don't force a copy.
984 Dc_Attr
->ulDirty_
|= DIRTY_FILL
;
985 Dc_Attr
->crBrushClr
= crColor
;
1002 COLORREF OldColor
= CLR_INVALID
;
1004 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
1007 OldColor
= (COLORREF
) Dc_Attr
->ulPenClr
;
1008 Dc_Attr
->ulPenClr
= (ULONG
) crColor
;
1010 if ( Dc_Attr
->crPenClr
!= crColor
)
1012 Dc_Attr
->ulDirty_
|= DIRTY_LINE
;
1013 Dc_Attr
->crPenClr
= crColor
;
1028 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1029 return Dc_Attr
->ulBackgroundClr
;
1043 COLORREF OldColor
= CLR_INVALID
;
1045 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
1047 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
1049 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
1050 return MFDRV_SetBkColor( hDC
, crColor
);
1053 PLDC pLDC
= Dc_Attr
->pvLDC
;
1056 SetLastError(ERROR_INVALID_HANDLE
);
1059 if (pLDC
->iType
== LDC_EMFLDC
)
1061 return EMFDRV_SetBkColor( hDC
, crColor
);
1066 OldColor
= (COLORREF
) Dc_Attr
->ulBackgroundClr
;
1067 Dc_Attr
->ulBackgroundClr
= (ULONG
) crColor
;
1069 if ( Dc_Attr
->crBackgroundClr
!= crColor
)
1071 Dc_Attr
->ulDirty_
|= (DIRTY_BACKGROUND
|DIRTY_LINE
|DIRTY_FILL
);
1072 Dc_Attr
->crBackgroundClr
= crColor
;
1086 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1087 return Dc_Attr
->lBkMode
;
1102 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldMode
;
1104 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
1106 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
1107 return MFDRV_SetBkMode( hdc
, iBkMode
)
1110 PLDC pLDC
= Dc_Attr
->pvLDC
;
1113 SetLastError(ERROR_INVALID_HANDLE
);
1116 if (pLDC
->iType
== LDC_EMFLDC
)
1118 return EMFDRV_SetBkMode( hdc
, iBkMode
)
1123 OldMode
= Dc_Attr
->lBkMode
;
1124 Dc_Attr
->jBkMode
= iBkMode
; // Processed
1125 Dc_Attr
->lBkMode
= iBkMode
; // Raw
1135 GetPolyFillMode(HDC hdc
)
1138 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1139 return Dc_Attr
->lFillMode
;
1147 SetPolyFillMode(HDC hdc
,
1153 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
1155 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
1156 return MFDRV_SetPolyFillMode( hdc
, iPolyFillMode
)
1159 PLDC pLDC
= GdiGetLDC(hdc
);
1162 SetLastError(ERROR_INVALID_HANDLE
);
1165 if (pLDC
->iType
== LDC_EMFLDC
)
1167 return EMFDRV_SetPolyFillMode( hdc
, iPolyFillMode
)
1172 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1174 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
1176 if (Dc_Attr
->ulDirty_
& DC_MODE_DIRTY
)
1178 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
1179 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
1183 fmode
= Dc_Attr
->lFillMode
;
1184 Dc_Attr
->lFillMode
= iPolyFillMode
;
1195 GetGraphicsMode(HDC hdc
)
1198 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1199 return Dc_Attr
->iGraphicsMode
;
1207 SetGraphicsMode(HDC hdc
,
1212 if ((iMode
< GM_COMPATIBLE
) || (iMode
> GM_ADVANCED
))
1214 SetLastError(ERROR_INVALID_PARAMETER
);
1217 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1219 if (iMode
== Dc_Attr
->iGraphicsMode
) return iMode
;
1221 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
1223 if (Dc_Attr
->ulDirty_
& DC_MODE_DIRTY
)
1225 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
1226 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
1229 /* One would think that setting the graphics mode to GM_COMPATIBLE
1230 * would also reset the world transformation matrix to the unity
1231 * matrix. However, in Windows, this is not the case. This doesn't
1232 * make a lot of sense to me, but that's the way it is.
1234 oMode
= Dc_Attr
->iGraphicsMode
;
1235 Dc_Attr
->iGraphicsMode
= iMode
;
1247 CONST DEVMODEW
*lpInitData
1250 NtGdiResetDC ( hdc
, (PDEVMODEW
)lpInitData
, NULL
, NULL
, NULL
);
1262 CONST DEVMODEA
*lpInitData
1265 LPDEVMODEW InitDataW
;
1267 InitDataW
= GdiConvertToDevmodeW((LPDEVMODEA
)lpInitData
);
1269 NtGdiResetDC ( hdc
, InitDataW
, NULL
, NULL
, NULL
);
1270 HEAP_free(InitDataW
);
1286 if(GdiIsHandleValid(h
))
1288 LONG Type
= GDI_HANDLE_GET_TYPE(h
);
1291 case GDI_OBJECT_TYPE_PEN
:
1294 case GDI_OBJECT_TYPE_BRUSH
:
1297 case GDI_OBJECT_TYPE_BITMAP
:
1300 case GDI_OBJECT_TYPE_FONT
:
1303 case GDI_OBJECT_TYPE_PALETTE
:
1306 case GDI_OBJECT_TYPE_REGION
:
1309 case GDI_OBJECT_TYPE_DC
:
1310 if ( GetDCDWord( h
, GdiGetIsMemDc
, 0))
1317 case GDI_OBJECT_TYPE_COLORSPACE
:
1318 Ret
= OBJ_COLORSPACE
;
1320 case GDI_OBJECT_TYPE_METAFILE
:
1323 case GDI_OBJECT_TYPE_ENHMETAFILE
:
1324 Ret
= OBJ_ENHMETAFILE
;
1326 case GDI_OBJECT_TYPE_METADC
:
1329 case GDI_OBJECT_TYPE_EXTPEN
:
1334 DPRINT1("GetObjectType: Magic 0x%08x not implemented\n", Type
);
1339 /* From Wine: GetObjectType does SetLastError() on a null object */
1340 SetLastError(ERROR_INVALID_HANDLE
);
1355 if ((h
< 0) || (h
>= NB_STOCK_OBJECTS
)) return Ret
;
1356 Ret
= stock_objects
[h
];
1359 HGDIOBJ Obj
= NtGdiGetStockObject( h
);
1361 if (GdiIsHandleValid(Obj
))
1363 stock_objects
[h
] = Obj
;
1365 }// Returns Null anyway.
1370 /* FIXME: include correct header */
1371 HPALETTE WINAPI
NtUserSelectPalette(HDC hDC
,
1373 BOOL ForceBackground
);
1380 BOOL bForceBackground
)
1383 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
1385 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
1386 return MFDRV_SelectPalette( hDC
, hPal
, bForceBackground
);
1389 PLDC pLDC
= GdiGetLDC(hDC
);
1392 SetLastError(ERROR_INVALID_HANDLE
);
1395 if (pLDC
->iType
== LDC_EMFLDC
)
1397 if return EMFDRV_SelectPalette( hDC
, hPal
, bForceBackground
);
1402 return NtUserSelectPalette(hDC
, hPal
, bForceBackground
);
1414 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1415 return Dc_Attr
->iMapMode
;
1429 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1431 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
1433 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
1434 return MFDRV_SetMapMode(hdc
, Mode
);
1437 SetLastError(ERROR_INVALID_HANDLE
);
1441 // Force change if Isotropic is set for recompute.
1442 if ((Mode
!= Dc_Attr
->iMapMode
) || (Mode
== MM_ISOTROPIC
))
1444 Dc_Attr
->ulDirty_
&= ~SLOW_WIDTHS
;
1445 return GetAndSetDCDWord( hdc
, GdiGetSetMapMode
, Mode
, 0, 0, 0 );
1447 return Dc_Attr
->iMapMode
;
1456 GetStretchBltMode(HDC hdc
)
1459 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1460 return Dc_Attr
->lStretchBltMode
;
1468 SetStretchBltMode(HDC hdc
, int iStretchMode
)
1473 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
1475 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
1476 return MFDRV_SetStretchBltMode( hdc
, iStretchMode
);
1479 PLDC pLDC
= GdiGetLDC(hdc
);
1482 SetLastError(ERROR_INVALID_HANDLE
);
1485 if (pLDC
->iType
== LDC_EMFLDC
)
1487 return EMFDRV_SetStretchBltMode( hdc
, iStretchMode
);
1492 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1494 oSMode
= Dc_Attr
->lStretchBltMode
;
1495 Dc_Attr
->lStretchBltMode
= iStretchMode
;
1497 // Wine returns an error here. We set the default.
1498 if ((iStretchMode
<= 0) || (iStretchMode
> MAXSTRETCHBLTMODE
)) iStretchMode
= WHITEONBLACK
;
1500 Dc_Attr
->jStretchBltMode
= iStretchMode
;
1513 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return NULL
;
1514 return Dc_Attr
->hlfntNew
;
1524 SelectObject(HDC hDC
,
1528 HGDIOBJ hOldObj
= NULL
;
1531 if(!GdiGetHandleUserData(hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
)&pDc_Attr
))
1533 SetLastError(ERROR_INVALID_HANDLE
);
1537 hGdiObj
= GdiFixUpHandle(hGdiObj
);
1538 if (!GdiIsHandleValid(hGdiObj
))
1543 UINT uType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
1547 case GDI_OBJECT_TYPE_REGION
:
1548 return (HGDIOBJ
)ExtSelectClipRgn(hDC
, hGdiObj
, RGN_COPY
);
1550 case GDI_OBJECT_TYPE_BITMAP
:
1551 return NtGdiSelectBitmap(hDC
, hGdiObj
);
1553 case GDI_OBJECT_TYPE_BRUSH
:
1554 hOldObj
= pDc_Attr
->hbrush
;
1555 pDc_Attr
->ulDirty_
|= DC_BRUSH_DIRTY
;
1556 pDc_Attr
->hbrush
= hGdiObj
;
1558 // return NtGdiSelectBrush(hDC, hGdiObj);
1560 case GDI_OBJECT_TYPE_PEN
:
1561 case GDI_OBJECT_TYPE_EXTPEN
:
1562 hOldObj
= pDc_Attr
->hpen
;
1563 pDc_Attr
->ulDirty_
|= DC_PEN_DIRTY
;
1564 pDc_Attr
->hpen
= hGdiObj
;
1566 // return NtGdiSelectPen(hDC, hGdiObj);
1568 case GDI_OBJECT_TYPE_FONT
:
1569 hOldObj
= pDc_Attr
->hlfntNew
;
1570 if (hOldObj
== hGdiObj
) return hOldObj
;
1572 pDc_Attr
->ulDirty_
&= ~SLOW_WIDTHS
;
1573 pDc_Attr
->ulDirty_
|= DIRTY_CHARSET
;
1574 pDc_Attr
->hlfntNew
= hGdiObj
;
1575 pTeb
= NtCurrentTeb();
1576 if (((pTeb
->GdiTebBatch
.HDC
== 0) ||
1577 (pTeb
->GdiTebBatch
.HDC
== hDC
)) &&
1578 ((pTeb
->GdiTebBatch
.Offset
+ sizeof(GDIBSOBJECT
)) <= GDIBATCHBUFSIZE
) &&
1579 (!(pDc_Attr
->ulDirty_
& DC_DIBSECTION
)))
1581 PGDIBSOBJECT pgO
= (PGDIBSOBJECT
)(&pTeb
->GdiTebBatch
.Buffer
[0] +
1582 pTeb
->GdiTebBatch
.Offset
);
1583 pgO
->gbHdr
.Cmd
= GdiBCSelObj
;
1584 pgO
->gbHdr
.Size
= sizeof(GDIBSOBJECT
);
1585 pgO
->hgdiobj
= hGdiObj
;
1587 pTeb
->GdiTebBatch
.Offset
+= sizeof(GDIBSOBJECT
);
1588 pTeb
->GdiTebBatch
.HDC
= hDC
;
1589 pTeb
->GdiBatchCount
++;
1590 if (pTeb
->GdiBatchCount
>= GDI_BatchLimit
) NtGdiFlush();
1594 // default for select object font
1595 return NtGdiSelectFont(hDC
, hGdiObj
);
1598 case GDI_OBJECT_TYPE_METADC
:
1599 return MFDRV_SelectObject( hDC
, hGdiObj
);
1600 case GDI_OBJECT_TYPE_EMF
:
1601 PLDC pLDC
= GdiGetLDC(hDC
);
1602 if ( !pLDC
) return NULL
;
1603 return EMFDRV_SelectObject( hDC
, hGdiObj
);
1605 case GDI_OBJECT_TYPE_COLORSPACE
:
1606 SetColorSpace(hDC
, (HCOLORSPACE
) hGdiObj
);
1609 case GDI_OBJECT_TYPE_PALETTE
:
1611 SetLastError(ERROR_INVALID_FUNCTION
);