6 HGDIOBJ stock_objects
[NB_STOCK_OBJECTS
]; // temp location.
10 IntCreateDICW ( LPCWSTR lpwszDriver
,
16 UNICODE_STRING Device
, Output
;
18 BOOL Display
= FALSE
, Default
= FALSE
;
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
= TRUE
; // Ask Win32k to set Default device.
35 Display
= TRUE
; // Most likely to be DISPLAY.
39 if ((lpwszDevice
) && (wcslen(lpwszDevice
) != 0)) // 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
? NULL
: &Device
),
64 (PDEVMODEW
) lpInitData
,
65 (lpwszOutput
? &Output
: NULL
),
66 iType
, // DCW 0 and ICW 1.
69 (PVOID
) NULL
, // NULL for now.
72 // Handle something other than a normal dc object.
73 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
78 GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
);
80 pLDC
= LocalAlloc(LMEM_ZEROINIT
, sizeof(LDC
));
82 Dc_Attr
->pvLDC
= pLDC
;
84 pLDC
->iType
= LDC_LDC
; // 1 (init) local DC, 2 EMF LDC
85 DbgPrint("DC_ATTR Allocated -> 0x%x\n",Dc_Attr
);
97 CreateCompatibleDC ( HDC hdc
)
102 rhDC
= NtGdiCreateCompatibleDC(hdc
);
106 if (GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
))
108 if ( Dc_Attr
->pvLIcm
) IcmCompatibleDC(rhDC
, hdc
, Dc_Attr
);
124 CONST DEVMODEA
* lpdvmInit
127 ANSI_STRING DriverA
, DeviceA
, OutputA
;
128 UNICODE_STRING DriverU
, DeviceU
, OutputU
;
129 LPDEVMODEW dvmInitW
= NULL
;
133 * If needed, convert to Unicode
134 * any string parameter.
137 if (NULL
!= lpszDriver
)
139 RtlInitAnsiString(&DriverA
, (LPSTR
)lpszDriver
);
140 RtlAnsiStringToUnicodeString(&DriverU
, &DriverA
, TRUE
);
142 DriverU
.Buffer
= NULL
;
143 if (NULL
!= lpszDevice
)
145 RtlInitAnsiString(&DeviceA
, (LPSTR
)lpszDevice
);
146 RtlAnsiStringToUnicodeString(&DeviceU
, &DeviceA
, TRUE
);
148 DeviceU
.Buffer
= NULL
;
149 if (NULL
!= lpszOutput
)
151 RtlInitAnsiString(&OutputA
, (LPSTR
)lpszOutput
);
152 RtlAnsiStringToUnicodeString(&OutputU
, &OutputA
, TRUE
);
154 OutputU
.Buffer
= NULL
;
157 dvmInitW
= GdiConvertToDevmodeW((LPDEVMODEA
)lpdvmInit
);
159 hDC
= IntCreateDICW ( DriverU
.Buffer
,
162 lpdvmInit
? dvmInitW
: NULL
,
164 HEAP_free (dvmInitW
);
166 * Free Unicode parameters.
168 RtlFreeUnicodeString(&DriverU
);
169 RtlFreeUnicodeString(&DeviceU
);
170 RtlFreeUnicodeString(&OutputU
);
173 * Return the possible DC handle.
188 CONST DEVMODEW
*lpInitData
192 return IntCreateDICW ( lpwszDriver
,
195 (PDEVMODEW
) lpInitData
,
209 CONST DEVMODEW
*lpdvmInit
212 return IntCreateDICW ( lpszDriver
,
215 (PDEVMODEW
) lpdvmInit
,
229 CONST DEVMODEA
*lpdvmInit
233 LPWSTR lpszDriverW
, lpszDeviceW
, lpszOutputW
;
234 LPDEVMODEW dvmInitW
= NULL
;
237 Status
= HEAP_strdupA2W ( &lpszDriverW
, lpszDriver
);
238 if (!NT_SUCCESS (Status
))
239 SetLastError (RtlNtStatusToDosError(Status
));
242 Status
= HEAP_strdupA2W ( &lpszDeviceW
, lpszDevice
);
243 if (!NT_SUCCESS (Status
))
244 SetLastError (RtlNtStatusToDosError(Status
));
247 Status
= HEAP_strdupA2W ( &lpszOutputW
, lpszOutput
);
248 if (!NT_SUCCESS (Status
))
249 SetLastError (RtlNtStatusToDosError(Status
));
253 dvmInitW
= GdiConvertToDevmodeW((LPDEVMODEA
)lpdvmInit
);
255 rc
= IntCreateDICW ( lpszDriverW
,
258 lpdvmInit
? dvmInitW
: NULL
,
260 HEAP_free (dvmInitW
);
261 HEAP_free ( lpszOutputW
);
263 HEAP_free ( lpszDeviceW
);
265 HEAP_free ( lpszDriverW
);
280 HANDLE hPrinter
= NULL
;
281 ULONG hType
= GDI_HANDLE_GET_TYPE(hDC
);
283 pLDC
= GdiGetLDC(hDC
);
285 if (hType
!= GDILoObjType_LO_DC_TYPE
)
288 if ( !pLDC
|| hType
== GDILoObjType_LO_METADC16_TYPE
)
290 SetLastError(ERROR_INVALID_HANDLE
);
293 if (pLDC
->Flags
& LDC_INIT_DOCUMENT
) AbortDoc(hDC
);
296 DocumentEventEx(NULL
, pLDC
->hPrinter
, hDC
, DOCUMENTEVENT_DELETEDC
, 0, NULL
, 0, NULL
);
297 hPrinter
= pLDC
->hPrinter
;
298 pLDC
->hPrinter
= NULL
;
302 Ret
= NtGdiDeleteObjectApp(hDC
);
306 DPRINT1("Delete the Local DC structure\n");
309 if (hPrinter
) fpClosePrinter(hPrinter
);
318 DeleteObject(HGDIOBJ hObject
)
322 /* From Wine: DeleteObject does not SetLastError() on a null object */
323 if(!hObject
) return FALSE
;
325 if (0 != ((DWORD
) hObject
& GDI_HANDLE_STOCK_MASK
))
326 { // Relax! This is a normal return!
327 DPRINT("Trying to delete system object 0x%x\n", hObject
);
330 // If you dont own it?! Get OUT!
331 if(!GdiIsHandleValid(hObject
)) return FALSE
;
333 Type
= GDI_HANDLE_GET_TYPE(hObject
);
335 if ((Type
== GDI_OBJECT_TYPE_METAFILE
) ||
336 (Type
== GDI_OBJECT_TYPE_ENHMETAFILE
))
341 case GDI_OBJECT_TYPE_DC
:
342 return DeleteDC((HDC
) hObject
);
343 case GDI_OBJECT_TYPE_COLORSPACE
:
344 return NtGdiDeleteColorSpace((HCOLORSPACE
) hObject
);
345 case GDI_OBJECT_TYPE_REGION
:
346 return DeleteRegion((HRGN
) hObject
);
348 case GDI_OBJECT_TYPE_METADC
:
349 return MFDRV_DeleteObject( hObject
);
350 case GDI_OBJECT_TYPE_EMF
:
352 PLDC pLDC
= GdiGetLDC(hObject
);
353 if ( !pLDC
) return FALSE
;
354 return EMFDRV_DeleteObject( hObject
);
357 case GDI_OBJECT_TYPE_FONT
:
360 case GDI_OBJECT_TYPE_BRUSH
:
361 case GDI_OBJECT_TYPE_EXTPEN
:
362 case GDI_OBJECT_TYPE_PEN
:
364 PBRUSH_ATTR Brh_Attr
;
367 if ((!GdiGetHandleUserData(hObject
, (DWORD
)Type
, (PVOID
) &Brh_Attr
)) ||
368 (Brh_Attr
== NULL
) ) break;
370 pTeb
= NtCurrentTeb();
372 if (pTeb
->Win32ThreadInfo
== NULL
) break;
374 if ((pTeb
->GdiTebBatch
.Offset
+ sizeof(GDIBSOBJECT
)) <= GDIBATCHBUFSIZE
)
376 PGDIBSOBJECT pgO
= (PGDIBSOBJECT
)(&pTeb
->GdiTebBatch
.Buffer
[0] +
377 pTeb
->GdiTebBatch
.Offset
);
378 pgO
->gbHdr
.Cmd
= GdiBCDelObj
;
379 pgO
->gbHdr
.Size
= sizeof(GDIBSOBJECT
);
380 pgO
->hgdiobj
= hObject
;
382 pTeb
->GdiTebBatch
.Offset
+= sizeof(GDIBSOBJECT
);
383 pTeb
->GdiBatchCount
++;
384 if (pTeb
->GdiBatchCount
>= GDI_BatchLimit
) NtGdiFlush();
389 case GDI_OBJECT_TYPE_BITMAP
:
393 return NtGdiDeleteObjectApp(hObject
);
398 GetArcDirection( HDC hdc
)
400 return GetDCDWord( hdc
, GdiGetArcDirection
, 0);
406 SetArcDirection( HDC hdc
, INT nDirection
)
408 return GetAndSetDCDWord( hdc
, GdiGetSetArcDirection
, nDirection
, 0, 0, 0 );
414 GetDCObject( HDC hDC
, INT iType
)
416 if((iType
== GDI_OBJECT_TYPE_BRUSH
) ||
417 (iType
== GDI_OBJECT_TYPE_EXTPEN
)||
418 (iType
== GDI_OBJECT_TYPE_PEN
) ||
419 (iType
== GDI_OBJECT_TYPE_COLORSPACE
))
424 if (!hDC
) return hGO
;
426 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return NULL
;
430 case GDI_OBJECT_TYPE_BRUSH
:
431 hGO
= Dc_Attr
->hbrush
;
434 case GDI_OBJECT_TYPE_EXTPEN
:
435 case GDI_OBJECT_TYPE_PEN
:
439 case GDI_OBJECT_TYPE_COLORSPACE
:
440 hGO
= Dc_Attr
->hColorSpace
;
445 return NtGdiGetDCObject( hDC
, iType
);
455 GetCurrentObject(HDC hdc
,
462 uObjectType
= GDI_OBJECT_TYPE_PEN
;
465 uObjectType
= GDI_OBJECT_TYPE_BRUSH
;
468 uObjectType
= GDI_OBJECT_TYPE_PALETTE
;
471 uObjectType
= GDI_OBJECT_TYPE_FONT
;
474 uObjectType
= GDI_OBJECT_TYPE_BITMAP
;
477 uObjectType
= GDI_OBJECT_TYPE_COLORSPACE
;
479 /* tests show that OBJ_REGION is explicitly ignored */
482 /* the SDK only mentions those above */
484 SetLastError(ERROR_INVALID_PARAMETER
);
487 return GetDCObject(hdc
, uObjectType
);
496 GetDeviceCaps(HDC hDC
,
501 PDEVCAPS pDevCaps
= GdiDevCaps
; // Primary display device capabilities.
502 DPRINT("Device CAPS1\n");
504 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
506 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
508 if ( i
== TECHNOLOGY
) return DT_METAFILE
;
513 pLDC
= GdiGetLDC(hDC
);
516 SetLastError(ERROR_INVALID_HANDLE
);
519 if (!(pLDC
->Flags
& LDC_DEVCAPS
))
521 if (!NtGdiGetDeviceCapsAll(hDC
, &pLDC
->DevCaps
))
522 SetLastError(ERROR_INVALID_PARAMETER
);
523 pLDC
->Flags
|= LDC_DEVCAPS
;
525 pDevCaps
= &pLDC
->DevCaps
;
530 if (!GdiGetHandleUserData((HGDIOBJ
) hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
))
532 if (!(Dc_Attr
->ulDirty_
& DC_PRIMARY_DISPLAY
) )
533 return NtGdiGetDeviceCaps(hDC
,i
);
535 DPRINT("Device CAPS2\n");
540 return pDevCaps
->ulVersion
;
543 return pDevCaps
->ulTechnology
;
546 return pDevCaps
->ulHorzSize
;
549 return pDevCaps
->ulVertSize
;
552 return pDevCaps
->ulHorzRes
;
555 return pDevCaps
->ulVertRes
;
558 return pDevCaps
->ulLogPixelsX
;
561 return pDevCaps
->ulLogPixelsY
;
564 return pDevCaps
->ulBitsPixel
;
567 return pDevCaps
->ulPlanes
;
573 return pDevCaps
->ulNumPens
;
576 return pDevCaps
->ulNumFonts
;
579 return pDevCaps
->ulNumColors
;
582 return pDevCaps
->ulAspectX
;
585 return pDevCaps
->ulAspectY
;
588 return pDevCaps
->ulAspectXY
;
594 return pDevCaps
->ulSizePalette
;
600 return pDevCaps
->ulColorRes
;
603 return pDevCaps
->ulVertRes
;
606 return pDevCaps
->ulHorzRes
;
609 return pDevCaps
->ulBltAlignment
;
612 return pDevCaps
->ulShadeBlend
;
615 return pDevCaps
->ulColorMgmtCaps
;
618 return pDevCaps
->ulPhysicalWidth
;
621 return pDevCaps
->ulPhysicalHeight
;
623 case PHYSICALOFFSETX
:
624 return pDevCaps
->ulPhysicalOffsetX
;
626 case PHYSICALOFFSETY
:
627 return pDevCaps
->ulPhysicalOffsetY
;
630 return pDevCaps
->ulVRefresh
;
633 return pDevCaps
->ulRasterCaps
;
636 return (CC_CIRCLES
| CC_PIE
| CC_CHORD
| CC_ELLIPSES
| CC_WIDE
|
637 CC_STYLED
| CC_WIDESTYLED
| CC_INTERIORS
| CC_ROUNDRECT
);
640 return (LC_POLYLINE
| LC_MARKER
| LC_POLYMARKER
| LC_WIDE
|
641 LC_STYLED
| LC_WIDESTYLED
| LC_INTERIORS
);
644 return (PC_POLYGON
| PC_RECTANGLE
| PC_WINDPOLYGON
| PC_SCANLINE
|
645 PC_WIDE
| PC_STYLED
| PC_WIDESTYLED
| PC_INTERIORS
);
648 return pDevCaps
->ulTextCaps
;
669 return GetDCDWord( hdc
, GdiGetRelAbs
, 0);
683 return GetAndSetDCDWord( hdc
, GdiGetSetRelAbs
, Mode
, 0, 0, 0 );
692 GetAndSetDCDWord( HDC hDC
, INT u
, DWORD dwIn
, DWORD Unk1
, DWORD Unk2
, DWORD Unk3
)
695 // Handle something other than a normal dc object.
696 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
698 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
699 return 0; //call MFDRV
702 PLDC pLDC
= GdiGetLDC(hDC
);
705 SetLastError(ERROR_INVALID_HANDLE
);
708 if (pLDC
->iType
== LDC_EMFLDC
)
710 Ret
= TRUE
; //call EMFDRV
717 Ret
= NtGdiGetAndSetDCDword( hDC
, u
, dwIn
, (DWORD
*) &u
);
721 SetLastError(ERROR_INVALID_HANDLE
);
731 GetDCDWord( HDC hDC
, INT u
, DWORD Result
)
733 BOOL Ret
= NtGdiGetDCDword( hDC
, u
, (DWORD
*) &u
);
734 if (!Ret
) return Result
;
744 GetAspectRatioFilterEx(
749 return NtGdiGetDCPoint( hdc
, GdiGetAspectRatioFilter
, (LPPOINT
) lpAspectRatio
);
763 return NtGdiGetDCPoint( hdc
, GdiGetDCOrg
, lpPoint
);
776 // Officially obsolete by Microsoft
778 if (!GetDCOrgEx(hdc
, &Pt
))
780 return(MAKELONG(Pt
.x
, Pt
.y
));
785 GetNonFontObject(HGDIOBJ hGdiObj
, int cbSize
, LPVOID lpBuffer
)
789 hGdiObj
= (HANDLE
)GdiFixUpHandle(hGdiObj
);
790 dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
792 if (!lpBuffer
) // Should pass it all to Win32k and let god sort it out. ;^)
796 case GDI_OBJECT_TYPE_PEN
:
797 return sizeof(LOGPEN
);
798 case GDI_OBJECT_TYPE_BRUSH
:
799 return sizeof(LOGBRUSH
);
800 case GDI_OBJECT_TYPE_BITMAP
:
801 return sizeof(BITMAP
);
802 case GDI_OBJECT_TYPE_PALETTE
:
804 case GDI_OBJECT_TYPE_EXTPEN
: /* we don't know the size, ask win32k */
811 case GDI_OBJECT_TYPE_PEN
: //Check the structures and see if A & W are the same.
812 case GDI_OBJECT_TYPE_EXTPEN
:
813 case GDI_OBJECT_TYPE_BRUSH
: // Mixing Apples and Oranges?
814 case GDI_OBJECT_TYPE_BITMAP
:
815 case GDI_OBJECT_TYPE_PALETTE
:
816 return NtGdiExtGetObjectW(hGdiObj
, cbSize
, lpBuffer
);
818 case GDI_OBJECT_TYPE_DC
:
819 case GDI_OBJECT_TYPE_REGION
:
820 case GDI_OBJECT_TYPE_METAFILE
:
821 case GDI_OBJECT_TYPE_ENHMETAFILE
:
822 case GDI_OBJECT_TYPE_EMF
:
823 SetLastError(ERROR_INVALID_HANDLE
);
834 GetObjectA(HGDIOBJ hGdiObj
, int cbSize
, LPVOID lpBuffer
)
836 ENUMLOGFONTEXDVW LogFont
;
840 dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
842 if(dwType
== GDI_OBJECT_TYPE_COLORSPACE
) //Stays here, processes struct A
844 SetLastError(ERROR_NOT_SUPPORTED
);
848 if (dwType
== GDI_OBJECT_TYPE_FONT
)
852 return sizeof(LOGFONTA
);
856 /* Windows does not SetLastError() */
859 // ENUMLOGFONTEXDVW is the default size and should be the structure for
860 // Entry->KernelData for Font objects.
861 Result
= NtGdiExtGetObjectW(hGdiObj
, sizeof(ENUMLOGFONTEXDVW
), &LogFont
);
870 case sizeof(ENUMLOGFONTEXDVA
):
871 // need to move more here.
872 case sizeof(ENUMLOGFONTEXA
):
873 EnumLogFontExW2A( (LPENUMLOGFONTEXA
) lpBuffer
, &LogFont
.elfEnumLogfontEx
);
876 case sizeof(ENUMLOGFONTA
):
877 // Same here, maybe? Check the structures.
878 case sizeof(EXTLOGFONTA
):
880 case sizeof(LOGFONTA
):
881 LogFontW2A((LPLOGFONTA
) lpBuffer
, &LogFont
.elfEnumLogfontEx
.elfLogFont
);
885 SetLastError(ERROR_BUFFER_OVERFLOW
);
891 return GetNonFontObject(hGdiObj
, cbSize
, lpBuffer
);
900 GetObjectW(HGDIOBJ hGdiObj
, int cbSize
, LPVOID lpBuffer
)
902 DWORD dwType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
907 MSDN, "This can be a handle to one of the following: logical bitmap, a brush,
908 a font, a palette, a pen, or a device independent bitmap created by calling
909 the CreateDIBSection function."
911 if(dwType
== GDI_OBJECT_TYPE_COLORSPACE
) //Stays here, processes struct W
913 SetLastError(ERROR_NOT_SUPPORTED
); // Not supported yet.
917 if (dwType
== GDI_OBJECT_TYPE_FONT
)
921 return sizeof(LOGFONTW
);
926 /* Windows does not SetLastError() */
929 // Poorly written apps are not ReactOS problem!
930 // We fix it here if the size is larger than the default size.
931 if( cbSize
> (int)sizeof(ENUMLOGFONTEXDVW
) ) cbSize
= sizeof(ENUMLOGFONTEXDVW
);
933 Result
= NtGdiExtGetObjectW(hGdiObj
, cbSize
, lpBuffer
); // Should handle the copy.
942 return GetNonFontObject(hGdiObj
, cbSize
, lpBuffer
);
957 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return CLR_INVALID
;
958 return (COLORREF
) Dc_Attr
->ulBrushClr
;
972 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return CLR_INVALID
;
973 return (COLORREF
) Dc_Attr
->ulPenClr
;
987 COLORREF OldColor
= CLR_INVALID
;
989 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
992 OldColor
= (COLORREF
) Dc_Attr
->ulBrushClr
;
993 Dc_Attr
->ulBrushClr
= (ULONG
) crColor
;
995 if ( Dc_Attr
->crBrushClr
!= crColor
) // if same, don't force a copy.
997 Dc_Attr
->ulDirty_
|= DIRTY_FILL
;
998 Dc_Attr
->crBrushClr
= crColor
;
1015 COLORREF OldColor
= CLR_INVALID
;
1017 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
1020 OldColor
= (COLORREF
) Dc_Attr
->ulPenClr
;
1021 Dc_Attr
->ulPenClr
= (ULONG
) crColor
;
1023 if ( Dc_Attr
->crPenClr
!= crColor
)
1025 Dc_Attr
->ulDirty_
|= DIRTY_LINE
;
1026 Dc_Attr
->crPenClr
= crColor
;
1041 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1042 return Dc_Attr
->ulBackgroundClr
;
1056 COLORREF OldColor
= CLR_INVALID
;
1058 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldColor
;
1060 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
1062 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
1063 return MFDRV_SetBkColor( hDC
, crColor
);
1066 PLDC pLDC
= Dc_Attr
->pvLDC
;
1069 SetLastError(ERROR_INVALID_HANDLE
);
1072 if (pLDC
->iType
== LDC_EMFLDC
)
1074 return EMFDRV_SetBkColor( hDC
, crColor
);
1079 OldColor
= (COLORREF
) Dc_Attr
->ulBackgroundClr
;
1080 Dc_Attr
->ulBackgroundClr
= (ULONG
) crColor
;
1082 if ( Dc_Attr
->crBackgroundClr
!= crColor
)
1084 Dc_Attr
->ulDirty_
|= (DIRTY_BACKGROUND
|DIRTY_LINE
|DIRTY_FILL
);
1085 Dc_Attr
->crBackgroundClr
= crColor
;
1099 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1100 return Dc_Attr
->lBkMode
;
1115 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return OldMode
;
1117 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
1119 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
1120 return MFDRV_SetBkMode( hdc
, iBkMode
)
1123 PLDC pLDC
= Dc_Attr
->pvLDC
;
1126 SetLastError(ERROR_INVALID_HANDLE
);
1129 if (pLDC
->iType
== LDC_EMFLDC
)
1131 return EMFDRV_SetBkMode( hdc
, iBkMode
)
1136 OldMode
= Dc_Attr
->lBkMode
;
1137 Dc_Attr
->jBkMode
= iBkMode
; // Processed
1138 Dc_Attr
->lBkMode
= iBkMode
; // Raw
1148 GetPolyFillMode(HDC hdc
)
1151 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1152 return Dc_Attr
->lFillMode
;
1160 SetPolyFillMode(HDC hdc
,
1166 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
1168 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
1169 return MFDRV_SetPolyFillMode( hdc
, iPolyFillMode
)
1172 PLDC pLDC
= GdiGetLDC(hdc
);
1175 SetLastError(ERROR_INVALID_HANDLE
);
1178 if (pLDC
->iType
== LDC_EMFLDC
)
1180 return EMFDRV_SetPolyFillMode( hdc
, iPolyFillMode
)
1185 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1187 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
1189 if (Dc_Attr
->ulDirty_
& DC_MODE_DIRTY
)
1191 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
1192 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
1196 fmode
= Dc_Attr
->lFillMode
;
1197 Dc_Attr
->lFillMode
= iPolyFillMode
;
1208 GetGraphicsMode(HDC hdc
)
1211 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1212 return Dc_Attr
->iGraphicsMode
;
1220 SetGraphicsMode(HDC hdc
,
1225 if ((iMode
< GM_COMPATIBLE
) || (iMode
> GM_ADVANCED
))
1227 SetLastError(ERROR_INVALID_PARAMETER
);
1230 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1232 if (iMode
== Dc_Attr
->iGraphicsMode
) return iMode
;
1234 if (NtCurrentTeb()->GdiTebBatch
.HDC
== hdc
)
1236 if (Dc_Attr
->ulDirty_
& DC_MODE_DIRTY
)
1238 NtGdiFlush(); // Sync up Dc_Attr from Kernel space.
1239 Dc_Attr
->ulDirty_
&= ~(DC_MODE_DIRTY
|DC_FONTTEXT_DIRTY
);
1242 /* One would think that setting the graphics mode to GM_COMPATIBLE
1243 * would also reset the world transformation matrix to the unity
1244 * matrix. However, in Windows, this is not the case. This doesn't
1245 * make a lot of sense to me, but that's the way it is.
1247 oMode
= Dc_Attr
->iGraphicsMode
;
1248 Dc_Attr
->iGraphicsMode
= iMode
;
1260 CONST DEVMODEW
*lpInitData
1263 NtGdiResetDC ( hdc
, (PDEVMODEW
)lpInitData
, NULL
, NULL
, NULL
);
1275 CONST DEVMODEA
*lpInitData
1278 LPDEVMODEW InitDataW
;
1280 InitDataW
= GdiConvertToDevmodeW((LPDEVMODEA
)lpInitData
);
1282 NtGdiResetDC ( hdc
, InitDataW
, NULL
, NULL
, NULL
);
1283 HEAP_free(InitDataW
);
1299 if(GdiIsHandleValid(h
))
1301 LONG Type
= GDI_HANDLE_GET_TYPE(h
);
1304 case GDI_OBJECT_TYPE_PEN
:
1307 case GDI_OBJECT_TYPE_BRUSH
:
1310 case GDI_OBJECT_TYPE_BITMAP
:
1313 case GDI_OBJECT_TYPE_FONT
:
1316 case GDI_OBJECT_TYPE_PALETTE
:
1319 case GDI_OBJECT_TYPE_REGION
:
1322 case GDI_OBJECT_TYPE_DC
:
1323 if ( GetDCDWord( h
, GdiGetIsMemDc
, 0))
1330 case GDI_OBJECT_TYPE_COLORSPACE
:
1331 Ret
= OBJ_COLORSPACE
;
1333 case GDI_OBJECT_TYPE_METAFILE
:
1336 case GDI_OBJECT_TYPE_ENHMETAFILE
:
1337 Ret
= OBJ_ENHMETAFILE
;
1339 case GDI_OBJECT_TYPE_METADC
:
1342 case GDI_OBJECT_TYPE_EXTPEN
:
1347 DPRINT1("GetObjectType: Magic 0x%08x not implemented\n", Type
);
1352 /* From Wine: GetObjectType does SetLastError() on a null object */
1353 SetLastError(ERROR_INVALID_HANDLE
);
1368 if ((h
< 0) || (h
>= NB_STOCK_OBJECTS
)) return Ret
;
1369 Ret
= stock_objects
[h
];
1372 HGDIOBJ Obj
= NtGdiGetStockObject( h
);
1374 if (GdiIsHandleValid(Obj
))
1376 stock_objects
[h
] = Obj
;
1378 }// Returns Null anyway.
1383 /* FIXME: include correct header */
1384 HPALETTE WINAPI
NtUserSelectPalette(HDC hDC
,
1386 BOOL ForceBackground
);
1393 BOOL bForceBackground
)
1396 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
1398 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
1399 return MFDRV_SelectPalette( hDC
, hPal
, bForceBackground
);
1402 PLDC pLDC
= GdiGetLDC(hDC
);
1405 SetLastError(ERROR_INVALID_HANDLE
);
1408 if (pLDC
->iType
== LDC_EMFLDC
)
1410 if return EMFDRV_SelectPalette( hDC
, hPal
, bForceBackground
);
1415 return NtUserSelectPalette(hDC
, hPal
, bForceBackground
);
1427 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1428 return Dc_Attr
->iMapMode
;
1442 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1444 if (GDI_HANDLE_GET_TYPE(hDC
) != GDI_OBJECT_TYPE_DC
)
1446 if (GDI_HANDLE_GET_TYPE(hDC
) == GDI_OBJECT_TYPE_METADC
)
1447 return MFDRV_SetMapMode(hdc
, Mode
);
1450 SetLastError(ERROR_INVALID_HANDLE
);
1454 // Force change if Isotropic is set for recompute.
1455 if ((Mode
!= Dc_Attr
->iMapMode
) || (Mode
== MM_ISOTROPIC
))
1457 Dc_Attr
->ulDirty_
&= ~SLOW_WIDTHS
;
1458 return GetAndSetDCDWord( hdc
, GdiGetSetMapMode
, Mode
, 0, 0, 0 );
1460 return Dc_Attr
->iMapMode
;
1469 GetStretchBltMode(HDC hdc
)
1472 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1473 return Dc_Attr
->lStretchBltMode
;
1481 SetStretchBltMode(HDC hdc
, int iStretchMode
)
1486 if (GDI_HANDLE_GET_TYPE(hdc
) != GDI_OBJECT_TYPE_DC
)
1488 if (GDI_HANDLE_GET_TYPE(hdc
) == GDI_OBJECT_TYPE_METADC
)
1489 return MFDRV_SetStretchBltMode( hdc
, iStretchMode
);
1492 PLDC pLDC
= GdiGetLDC(hdc
);
1495 SetLastError(ERROR_INVALID_HANDLE
);
1498 if (pLDC
->iType
== LDC_EMFLDC
)
1500 return EMFDRV_SetStretchBltMode( hdc
, iStretchMode
);
1505 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return 0;
1507 oSMode
= Dc_Attr
->lStretchBltMode
;
1508 Dc_Attr
->lStretchBltMode
= iStretchMode
;
1510 // Wine returns an error here. We set the default.
1511 if ((iStretchMode
<= 0) || (iStretchMode
> MAXSTRETCHBLTMODE
)) iStretchMode
= WHITEONBLACK
;
1513 Dc_Attr
->jStretchBltMode
= iStretchMode
;
1526 if (!GdiGetHandleUserData((HGDIOBJ
) hdc
, GDI_OBJECT_TYPE_DC
, (PVOID
) &Dc_Attr
)) return NULL
;
1527 return Dc_Attr
->hlfntNew
;
1537 SelectObject(HDC hDC
,
1541 HGDIOBJ hOldObj
= NULL
;
1545 if(!GdiGetHandleUserData(hDC
, GDI_OBJECT_TYPE_DC
, (PVOID
)&pDc_Attr
))
1547 SetLastError(ERROR_INVALID_HANDLE
);
1551 hGdiObj
= GdiFixUpHandle(hGdiObj
);
1552 if (!GdiIsHandleValid(hGdiObj
))
1557 uType
= GDI_HANDLE_GET_TYPE(hGdiObj
);
1561 case GDI_OBJECT_TYPE_REGION
:
1562 return (HGDIOBJ
)ExtSelectClipRgn(hDC
, hGdiObj
, RGN_COPY
);
1564 case GDI_OBJECT_TYPE_BITMAP
:
1565 return NtGdiSelectBitmap(hDC
, hGdiObj
);
1567 case GDI_OBJECT_TYPE_BRUSH
:
1568 hOldObj
= pDc_Attr
->hbrush
;
1569 pDc_Attr
->ulDirty_
|= DC_BRUSH_DIRTY
;
1570 pDc_Attr
->hbrush
= hGdiObj
;
1572 // return NtGdiSelectBrush(hDC, hGdiObj);
1574 case GDI_OBJECT_TYPE_PEN
:
1575 case GDI_OBJECT_TYPE_EXTPEN
:
1576 hOldObj
= pDc_Attr
->hpen
;
1577 pDc_Attr
->ulDirty_
|= DC_PEN_DIRTY
;
1578 pDc_Attr
->hpen
= hGdiObj
;
1580 // return NtGdiSelectPen(hDC, hGdiObj);
1582 case GDI_OBJECT_TYPE_FONT
:
1583 hOldObj
= pDc_Attr
->hlfntNew
;
1584 if (hOldObj
== hGdiObj
) return hOldObj
;
1585 pDc_Attr
->ulDirty_
&= ~SLOW_WIDTHS
;
1586 pDc_Attr
->ulDirty_
|= DIRTY_CHARSET
;
1587 pDc_Attr
->hlfntNew
= hGdiObj
;
1588 pTeb
= NtCurrentTeb();
1589 if (((pTeb
->GdiTebBatch
.HDC
== 0) ||
1590 (pTeb
->GdiTebBatch
.HDC
== hDC
)) &&
1591 ((pTeb
->GdiTebBatch
.Offset
+ sizeof(GDIBSOBJECT
)) <= GDIBATCHBUFSIZE
) &&
1592 (!(pDc_Attr
->ulDirty_
& DC_DIBSECTION
)))
1594 PGDIBSOBJECT pgO
= (PGDIBSOBJECT
)(&pTeb
->GdiTebBatch
.Buffer
[0] +
1595 pTeb
->GdiTebBatch
.Offset
);
1596 pgO
->gbHdr
.Cmd
= GdiBCSelObj
;
1597 pgO
->gbHdr
.Size
= sizeof(GDIBSOBJECT
);
1598 pgO
->hgdiobj
= hGdiObj
;
1600 pTeb
->GdiTebBatch
.Offset
+= sizeof(GDIBSOBJECT
);
1601 pTeb
->GdiTebBatch
.HDC
= hDC
;
1602 pTeb
->GdiBatchCount
++;
1603 if (pTeb
->GdiBatchCount
>= GDI_BatchLimit
) NtGdiFlush();
1606 // default for select object font
1607 return NtGdiSelectFont(hDC
, hGdiObj
);
1610 case GDI_OBJECT_TYPE_METADC
:
1611 return MFDRV_SelectObject( hDC
, hGdiObj
);
1612 case GDI_OBJECT_TYPE_EMF
:
1613 PLDC pLDC
= GdiGetLDC(hDC
);
1614 if ( !pLDC
) return NULL
;
1615 return EMFDRV_SelectObject( hDC
, hGdiObj
);
1617 case GDI_OBJECT_TYPE_COLORSPACE
:
1618 SetColorSpace(hDC
, (HCOLORSPACE
) hGdiObj
);
1621 case GDI_OBJECT_TYPE_PALETTE
:
1623 SetLastError(ERROR_INVALID_FUNCTION
);